LyoKICogQ29weXJpZ2h0IDIwMDUsMjAwNyBZdW5Tb25nIEh3YW5nCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX05FVVRSQUwKClVJSU5TRVJUT0JKRUNUIERJQUxPRyBESVNDQVJEQUJMRSAgMCwgMCwgMjk0LCAxNTEKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAisLTDvCC78MDUIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgICBMSVNUQk9YICAgICAgICAgSURDX09CSlRZUEVMSVNULDgyLDE5LDEzMSw2NixMQlNfU09SVCB8CiAgICAgICAgICAgICAgICAgICAgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WSVNJQkxFIHwgV1NfVlNDUk9MTCB8CiAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUAogICAgTFRFWFQgICAgICAgICAgICKwtMO8IMW4wNQ6IixJRENfT0JKVFlQRUxCTCw4Miw3LDUzLDgsV1NfVklTSUJMRQogICAgREVGUFVTSEJVVFRPTiAgICLIrsDOIixJRE9LLDIyMSw3LDY2LDE0CiAgICBQVVNIQlVUVE9OICAgICAgIsPrvNIiLElEQ0FOQ0VMLDIyMSwyNCw2NiwxNAogICAgR1JPVVBCT1ggICAgICAgICKw4bD6IixJRENfUkVTVUxULDcsMTAzLDIwOCw0MQogICAgQ09OVFJPTCAgICAgICAgICK79bfOILi4temx4iIsSURDX0NSRUFURU5FVywiQnV0dG9uIixCU19BVVRPUkFESU9CVVRUT04gfCAKICAgICAgICAgICAgICAgICAgICBXU19HUk9VUCw3LDIwLDYyLDEwCiAgICBDT05UUk9MICAgICAgICAgIsTBxq630SC4uLXpseIiLElEQ19DUkVBVEVDT05UUk9MLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiB8IE5PVCBXU19WSVNJQkxFLDcsNTQsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAixsTAz7fOus7FzSC4uLXpseIiLElEQ19DUkVBVEVGUk9NRklMRSwiQnV0dG9uIiwKICAgICAgICAgICAgICAgICAgICBCU19BVVRPUkFESU9CVVRUT04sNywzNyw2NywxMAogICAgTFRFWFQgICAgICAgICAgICIiLElEQ19SRVNVTFRERVNDLDQ5LDExMiwxNTksMjMKICAgIFBVU0hCVVRUT04gICAgICAixMHGrrfRIMPfsKEoJkEpLi4uIixJRENfQUREQ09OVFJPTCw4MSw4OCw2MywxNCxOT1QgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAgICK+xsDMxNzAuLfOILq4seIiLElEQ19BU0lDT04sIkJ1dHRvbiIsQlNfQVVUT0NIRUNLQk9YIHwgCiAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUCB8IE5PVCBXU19WSVNJQkxFLDIyMyw1OCw2NCwxMAogICAgUFVTSEJVVFRPTiAgICAgICLDo7HiLi4uIixJRENfQlJPV1NFLDE1NSw4OCw1MCwxNCxOT1QgV1NfVklTSUJMRQogICAgTFRFWFQgICAgICAgICAgICLGxMDPOiIsSURDX0ZJTEVMQkwsNTgsMjEsMjAsOCwgTk9UIFdTX1ZJU0lCTEUKICAgIEVESVRURVhUICAgICAgICBJRENfRklMRSw4MywzNywxMzIsMTMsRVNfQVVUT0hTQ1JPTEwgfCBOT1QgV1NfVklTSUJMRQpFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICBJRFNfUkVTVUxUT0JKREVTQwkiu/UgICVzILC0w7y4piC5rrytv6Egu/DA1CIKICBJRFNfUkVTVUxURklMRU9CSkRFU0MJIsDbvLrH0SDHrrHXuLLAuyC757/rx8+/qSDIsLy6yK29w8WzvPYgwNa0wiCwtMO8uKYgua68rcbEwM8gs7u/68C4t84gu/DA1MfPvcO/wC4iCiAgSURTX0JST1dTRSAgICAgICAgICAgICLDo7HiIgogIElEU19OT1RPTEVNT0QgICAgICAgICAiwMwgxsTAz8C6IL/Dudm4pSBPTEW48LXiwMwgvsa00bDFt84gurjA1LTPtNkuIE9MRcTBxq630cC7ILXut8/H0rz2IL74vcC0z7TZLiIKICBJRFNfTk9UT0xFTU9EQ0FQVElPTiAgIsTBxq630SC09cfPseIiCn0KCklERF9QQVNURVNQRUNJQUw0IERJQUxPRyBESVNDQVJEQUJMRSAzLCAxNSwgMjkzLCAxNDAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIsavurDHz7DUICC62b+ps9ax4iIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTFRFWFQgICAgICAgICAiv/i6uzoiLCAtMSwgNiwgOSwgMzAsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgQ09OVFJPTCAgICAgICAiutm/qbPWseIoJlApIiwgSURDX1BTX1BBU1RFLCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgMSwgNDQsIDU1LCAxMAogICAgQ09OVFJPTCAgICAgICAiuLXFqbfOILrZv6mz1rHiKCZMKSIsIElEQ19QU19QQVNURUxJTkssICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICAxLCA2MSwgNjksIDEwCiAgICBMVEVYVCAgICAgICAgICK02bilIMDMuKfAuLfOKCZBKToiLCAtMSwgNjcsIDI1LCA1MywgOCwgV1NfVklTSUJMRSB8IFdTX0dST1VQCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19QQVNURUxJU1QsICAgICA2NiwgMzYsIDE1MCwgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgTk9UIFdTX1ZJU0lCTEUKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElOS0xJU1QsIDY2LCAzNiwgMTUwLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfRElTUExBWUxJU1QsICAgNjYsIDM2LCAxNTAsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUKICAgIENPTlRST0wgICAgICAgIsiuwM4iLCBJRE9LLCAiQnV0dG9uIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICLD67zSIiwgSURDQU5DRUwsICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAitbW/8ri7KCZIKSIsIElEQ19PTEVVSUhFTFAsICJCdXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNDIsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAivsbAzMTcwLi3ziC6uLHiKCZEKSIsIElEQ19QU19ESVNQTEFZQVNJQ09OLCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUCB8IFdTX1ZJU0lCTEUsIDIyNCwgNTksIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX0lDT05ESVNQTEFZLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDIyNCwgNzUsIDY2LCA0NAogICAgQ09OVFJPTCAgICAgICAivsbAzMTcILnZstmx4igmSSkuLi4iLCBJRENfUFNfQ0hBTkdFSUNPTiwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAxMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1JFU1VMVElNQUdFLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDgsIDEwMSwgNDIsIDM0CiAgICBDT05UUk9MICAgICAgICI8PCCw4bD6IMXYvbrGrrTCIL+pseK02bChID4+IiwgSURDX1BTX1JFU1VMVFRFWFQsICJTdGF0aWMiLCBTU19OT1BSRUZJWCB8IFdTX1ZJU0lCTEUsIDU0LCAxMDAsIDE1OSwgMzUKICAgIENPTlRST0wgICAgICAgIrDhsPoiLCAtMSwgIkJ1dHRvbiIsIEJTX0dST1VQQk9YIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCA2LCA5MCwgMjEyLCA0OAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1NPVVJDRVRFWFQsICJFZGl0IiwgRVNfUkVBRE9OTFkgfCBFU19BVVRPSFNDUk9MTCB8IFdTX1ZJU0lCTEUsIDM3LCA5LCAxODAsIDgKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfUFNfUEFTVEVfREFUQSAgICAgICAgICAgICAgICAgICAgICK0573FwMcgua68rSAlc7+hIMWsuLO6uLXlwMcgs7u/6yC78MDUx8+x4i4iCiAgICBJRFNfUFNfUEFTVEVfT0JKRUNUICAgICAgICAgICAgICAgICAgICK0573FwMcgua68rb+hIMWsuLO6uLXlwMcgs7u/67XpwLsgw7e6zsfPuOkgICVzuKYgu+e/68fYvK0gwMywzcC7IL3Hx+DH0iC89iDA1r3AtM+02S4iCiAgICBJRFNfUFNfUEFTVEVfT0JKRUNUX0FTX0lDT04gICAgICAgICAgICK0573FwMcgua68rb+hIMWsuLO6uLXlwMcgs7u/67XpwLsgw7e6zsfPuOkgICVzuKYgu+e/68fYvK0gwMywzcC7IL3Hx+DH0iC89iDA1r3AtM+02S4gwMywzcC6IL7GwMzE3MC4t84gs6rFuLO7wfogsMy0z7TZLiIKICAgIElEU19QU19QQVNURV9MSU5LX0RBVEEgICAgICAgICAgICAgICAgIrTnvcXAxyC5rrytICVzv6Egxay4s7q4teXAxyCzu7/rILvwwNTHz7HiLiAgwMwgtaXAzMXNtMIgv/i6uyDGxMDPv6Egv6yw4bXHvu4gwNa+7rytIMbEwM/AzCC52bLuuOkgtOe9xcDHILmuvK21tSC52bLwsMy0z7TZLiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVCAgICAgICAgICAgICAgIrTnvcXAxyC5rrytv6Egxay4s7q4teW/oSDA1rTCILHXuLLAuyDB/b7us9a9wLTPtNkuICDAzCCx17iywLogv/i6uyDGxMDPv6Egv6yw4bXHvu4gwNa+7rytIMbEwM/AzCC52bLuuOkgtOe9xcDHILmuvK21tSC52bLwsMy0z7TZLiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVF9BU19JQ09OICAgICAgIrTnvcXAxyC5rrytv6Egxay4s7q4teW/oSDA1rTCILTcw+C+xsDMxNzAuyDB/b7us9a9wLTPtNkuICDAzCC03MPgvsbAzMTcwLogv/i6uyDGxMDPv6Egv6yw4bXHvu4gwNa+7rytIMbEwM/AzCC52bLuuOkgtOe9xcDHILmuvK21tSC52bLwsMy0z7TZdC4iCiAgICBJRFNfUFNfTk9OX09MRSAgICAgICAgICAgICAgICAgICAgICAgICK0573FwMcgua68rb+hIMWsuLO6uLXlwMcgs7u/6yC78MDUx8+x4i4iCiAgICBJRFNfUFNfVU5LTk9XTl9UWVBFICAgICAgICAgICAgICAgICAgICK+y7z2IL74tMIgx/y9xCIKICAgIElEU19QU19VTktOT1dOX1NSQyAgICAgICAgICAgICAgICAgICAgIr7LvPYgvvi0wiC/+Lq7IgogICAgSURTX1BTX1VOS05PV05fQVBQICAgICAgICAgICAgICAgICAgICAiwMwgx8G3zrHXt6XAuiC+yyC89iC++LTCIMfBt86x17elwLi3ziC4uLXpvu7Bs73AtM+02SIKfQo=