LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfSkFQQU5FU0UsIFNVQkxBTkdfREVGQVVMVAoKTUVOVV8wMDEgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJTUVOVUlURU0gIpHlgquCyLGyut0oJkcpIiwJRkNJRE1fU0hWSUVXX0JJR0lDT04KCU1FTlVJVEVNICKPrIKzgsixsrrdKCZNKSIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCU1FTlVJVEVNICKI6peXKCZMKSIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKCU1FTlVJVEVNICKP2o3XKCZEKSIsCQlGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwpFTkQKCk1FTlVfMDAyIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCVBPUFVQIiIKCUJFR0lOCgkgIFBPUFVQICKVXFyOpigmVikiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIpHlgquCooNBg0ODUoOTKCZHKSIsCUZDSURNX1NIVklFV19CSUdJQ09OCgkgICAgTUVOVUlURU0gIo+sgrOCooNBg0ODUoOTKCZNKSIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCSAgICBNRU5VSVRFTSAiiOqXlygmTCkiLAkJRkNJRE1fU0hWSUVXX0xJU1RWSUVXCgkgICAgTUVOVUlURU0gIo/ajdcoJkQpIiwJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBQT1BVUCAig0GDQ4NSg5OCzJCul/EoJkkpIgoJICBCRUdJTgoJICAgIE1FTlVJVEVNICKWvJFPj4coJk4pIiwJMHgzMAkvKiBjb2x1bW4gMCAqLwoJICAgIE1FTlVJVEVNICKO7Zfej4coJlQpIiwJMHgzMgkvKiBjb2x1bW4gMiAqLwoJICAgIE1FTlVJVEVNICKDVINDg1mPhygmUykiLAkweDMxCS8qIC4uLiAqLwoJICAgIE1FTlVJVEVNICKT+pV0j4coJkQpIiwJMHgzMwoJICAgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICAgIE1FTlVJVEVNICKDQYNDg1KDk4LMjqmTrpCul/EoJkEpIiwJRkNJRE1fU0hWSUVXX0FVVE9BUlJBTkdFCgkgIEVORAoJICBNRU5VSVRFTSAik5mK1Ip1gsmQrpfxIiwJRkNJRE1fU0hWSUVXX1NOQVBUT0dSSUQKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICKTXFyC6JV0gq8iLAkJRkNJRE1fU0hWSUVXX0lOU0VSVAoJICBNRU5VSVRFTSAig1aDh4Fbg2eDSoNig2eCzJNcXILolXSCryIsCUZDSURNX1NIVklFV19JTlNFUlRMSU5LCgkgIFBPUFVQICKQVotLjeyQrCIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAikFaLS4N0g0iDi4NfKCZGKSIsCTB4NzA1MwoJICAgIE1FTlVJVEVNICKQVotLg1aDh4Fbg2eDSoNig2coJkwpIiwJMHg3MDUyCgkgICAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIEVORAoJICBNRU5VSVRFTSAig3aDjYNwg2WDQiIsCQlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKTUVOVV9TSFZfRklMRSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCIiCglCRUdJTgoJICBNRU5VSVRFTSAikNiC6I7mgugoJlUpIiwJCUZDSURNX1NIVklFV19DVVQKCSAgTUVOVUlURU0gIoNSg3OBWygmQykiLAlGQ0lETV9TSFZJRVdfQ09QWQoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIoNWg4eBW4Nng0qDYoNngsyN7JCsKCZMKSIsCTB4NzA1MQoJICBNRU5VSVRFTSAije2PnCgmRCkiLAlGQ0lETV9TSFZJRVdfREVMRVRFCgkgIE1FTlVJVEVNICKWvJFPgsyVz41YKCZSKSIsCTB4NzA1MAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIoN2g42DcINlg0IoJlApIiwJRkNJRE1fU0hWSUVXX1BST1BFUlRJRVMKCUVORApFTkQKCi8qCglzcGVjaWFsIGZvbGRlcnMKKi8KU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewoJSURTX0RFU0tUT1AJCSLD3r24xK/M3yIKCUlEU19NWUNPTVBVVEVSCQkiz7K63cvfrbDAIgp9CgovKgoJY29udGV4dCBtZW51cwoqLwpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CglJRFNfVklFV19MQVJHRQkJIpHlgquCooNBg0ODUoOTKCZHKSIKCUlEU19WSUVXX1NNQUxMCQkij6yCs4Kig0GDQ4NSg5MoJk0pIgoJSURTX1ZJRVdfTElTVAkJIojql5coJkwpIgoJSURTX1ZJRVdfREVUQUlMUwkij9qN1ygmRCkiCglJRFNfU0VMRUNUCQkikUmR8CIKCUlEU19PUEVOCQkiikqCrSIKfQoKU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMjEwLCAxNTIKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiVzIILJgsKCooLEIgpGT05UIDEwLCAiTVMgU2hlbGwgRGxnIgp7CiBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDE1MywgMTMwLCA1MCwgMTIKIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgogSUNPTiAiIiwgMTA4OCwgMTg5LCAxMCwgMTQsIDE2CiBMVEVYVCAiIiwgMTAwLCA4LCAxMCwgMTM3LCAzMwogTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAp9CgpTSEVMTF9SVU5fRExHIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDAsIDAsIDIyNywgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiBJQ09OICIiLCAxMjI5NywgNywgMTEsIDE4LCAyMCwgV1NfVklTSUJMRQogTFRFWFQgIlR5cGUgdGhlIG5hbWUgb2YgYSBwcm9ncmFtLCBmb2xkZXIsIGRvY3VtZW50LCBvciBJbnRlcm5ldCByZXNvdXJjZSwgYW5kIFdpbmUgd2lsbCBvcGVuIGl0IGZvciB5b3UuIiwgMTIyODksIDM2LCAxMSwgMTgyLCAxOAogTFRFWFQgIiZPcGVuOiIsIDEyMzA1LCA3LCAzOSwgMjQsIDEwCiBDT05UUk9MICIiLCAxMjI5OCwgIkNPTUJPQk9YIiwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVlNDUk9MTCB8IFdTX1ZJU0lCTEUgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX0RST1BET1dOLCAzNiwgMzcsIDE4MywgMTAwCiBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDYyLCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICJDYW5jZWwiLCBJRENBTkNFTCwgMTE2LCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICImQnJvd3NlLi4uIiwgMTIyODgsIDE3MCwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAp9CgovKgljb2x1bW5zIGluIHRoZSBzaGVsbHZpZXcJKi8KU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKQkVHSU4KCUlEU19TSFZfQ09MVU1OMQkJIpa8kU8iCglJRFNfU0hWX0NPTFVNTjIJCSKDVINDg1kiCglJRFNfU0hWX0NPTFVNTjMJCSKDdINAg0ODi4LMju2X3iIKCUlEU19TSFZfQ09MVU1ONAkJIo1YkFaT+o6eIgoJSURTX1NIVl9DT0xVTU41CQkika6QqyIKCUlEU19TSFZfQ09MVU1ONgkJIo2HjHaDVINDg1kiCglJRFNfU0hWX0NPTFVNTjcJCSKL84Krl2WXyiIKCUlEU19TSFZfQ09MVU1OOAkJIk5hbWUiIC8qRklYTUUqLwoJSURTX1NIVl9DT0xVTU45CQkiQ29tbWVudHMiIC8qRklYTUUqLwpFTkQK