LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfSkFQQU5FU0UsIFNVQkxBTkdfREVGQVVMVAoKTUVOVV8wMDEgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJTUVOVUlURU0gIpHlgquCyLGyut0oJkcpIiwJRkNJRE1fU0hWSUVXX0JJR0lDT04KCU1FTlVJVEVNICKPrIKzgsixsrrdKCZNKSIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCU1FTlVJVEVNICKI6peXKCZMKSIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKCU1FTlVJVEVNICKP2o3XKCZEKSIsCQlGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwpFTkQKCk1FTlVfMDAyIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJICBQT1BVUCAilVxcjqYoJlYpIgoJICBCRUdJTgoJICAgIE1FTlVJVEVNICKR5YKrgqKDQYNDg1KDkygmRykiLAlGQ0lETV9TSFZJRVdfQklHSUNPTgoJICAgIE1FTlVJVEVNICKPrIKzgqKDQYNDg1KDkygmTSkiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCgkgICAgTUVOVUlURU0gIojql5coJkwpIiwJCUZDSURNX1NIVklFV19MSVNUVklFVwoJICAgIE1FTlVJVEVNICKP2o3XKCZEKSIsCUZDSURNX1NIVklFV19SRVBPUlRWSUVXCgkgIEVORAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgUE9QVVAgIoNBg0ODUoOTgsyQrpfxKCZJKSIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAilryRT4+HKCZOKSIsCTB4MzAJLyogY29sdW1uIDAgKi8KCSAgICBNRU5VSVRFTSAiju2X3o+HKCZUKSIsCTB4MzIJLyogY29sdW1uIDIgKi8KCSAgICBNRU5VSVRFTSAig1SDQ4NZj4coJlMpIiwJMHgzMQkvKiAuLi4gKi8KCSAgICBNRU5VSVRFTSAik/qVdI+HKCZEKSIsCTB4MzMKCSAgICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgICBNRU5VSVRFTSAig0GDQ4NSg5OCzI6pk66QrpfxKCZBKSIsCUZDSURNX1NIVklFV19BVVRPQVJSQU5HRQoJICBFTkQKCSAgTUVOVUlURU0gIpOZitSKdYLJkK6X8SIsCUZDSURNX1NIVklFV19TTkFQVE9HUklECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAik1xcguiVdIKvIiwJCUZDSURNX1NIVklFV19JTlNFUlQKCSAgTUVOVUlURU0gIoNWg4eBW4Nng0qDYoNngsyTXFyC6JV0gq8iLAlGQ0lETV9TSFZJRVdfSU5TRVJUTElOSwoJICBQT1BVUCAikFaLS43skKwiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIpBWi0uDdINIg4uDXygmRikiLAkweDcwNTMKCSAgICBNRU5VSVRFTSAikFaLS4NWg4eBW4Nng0qDYoNnKCZMKSIsCTB4NzA1MgoJICAgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBFTkQKCSAgTUVOVUlURU0gIoN2g42DcINlg0IiLAkJRkNJRE1fU0hWSUVXX1BST1BFUlRJRVMKCUVORApFTkQKCk1FTlVfU0hWX0ZJTEUgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJUE9QVVAgIiIKCUJFR0lOCgkgIE1FTlVJVEVNICImU2VsZWN0IgkJRkNJRE1fU0hWSUVXX09QRU4KCSAgTUVOVUlURU0gIpDYguiO5oLoKCZVKSIsCQlGQ0lETV9TSFZJRVdfQ1VUCgkgIE1FTlVJVEVNICKDUoNzgVsoJkMpIiwJRkNJRE1fU0hWSUVXX0NPUFkKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICKDVoOHgVuDZ4NKg2KDZ4LMjeyQrCgmTCkiLAkweDcwNTEKCSAgTUVOVUlURU0gIo3tj5woJkQpIiwJRkNJRE1fU0hWSUVXX0RFTEVURQoJICBNRU5VSVRFTSAilryRT4LMlc+NWCgmUikiLAkweDcwNTAKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICKDdoONg3CDZYNCKCZQKSIsCUZDSURNX1NIVklFV19QUk9QRVJUSUVTCglFTkQKRU5ECgovKgoJc3BlY2lhbCBmb2xkZXJzCiovClNUUklOR1RBQkxFCnsKCUlEU19ERVNLVE9QCQkiw969uMSvzN8iCglJRFNfTVlDT01QVVRFUgkJIs+yut3L362wwCIKfQoKLyoKCWNvbnRleHQgbWVudXMKKi8KU1RSSU5HVEFCTEUKewoJSURTX1ZJRVdfTEFSR0UJCSKR5YKrgqKDQYNDg1KDkygmRykiCglJRFNfVklFV19TTUFMTAkJIo+sgrOCooNBg0ODUoOTKCZNKSIKCUlEU19WSUVXX0xJU1QJCSKI6peXKCZMKSIKCUlEU19WSUVXX0RFVEFJTFMJIo/ajdcoJkQpIgoJSURTX1NFTEVDVAkJIpFJkfAiCglJRFNfT1BFTgkJIopKgq0iCn0KClNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIlcyCCyYLCgqKCxCIKRk9OVCAxMCwgIk1TIFNoZWxsIERsZyIKewogREVGUFVTSEJVVFRPTiAiT0siLCBJRE9LLCAxNTMsIDEzMywgNTAsIDEyLCBXU19UQUJTVE9QCiBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKIElDT04gIiIsIDEwODgsIDEwLCAxMCwgMTQsIDE2CiBMVEVYVCAiIiwgMTAwLCAzMCwgMTAsIDEzNywgMTAKIExURVhUICIiLCAxMDEsIDMwLCAyMiwgMTM3LCAxMAogTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAp9CgpTSEVMTF9SVU5fRExHIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDAsIDAsIDIyNywgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiBJQ09OICIiLCAxMjI5NywgNywgMTEsIDE4LCAyMCwgV1NfVklTSUJMRQogTFRFWFQgIlR5cGUgdGhlIG5hbWUgb2YgYSBwcm9ncmFtLCBmb2xkZXIsIGRvY3VtZW50LCBvciBJbnRlcm5ldCByZXNvdXJjZSwgYW5kIFdpbmUgd2lsbCBvcGVuIGl0IGZvciB5b3UuIiwgMTIyODksIDM2LCAxMSwgMTgyLCAxOAogTFRFWFQgIiZPcGVuOiIsIDEyMzA1LCA3LCAzOSwgMjQsIDEwCiBDT05UUk9MICIiLCAxMjI5OCwgIkNPTUJPQk9YIiwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVlNDUk9MTCB8IFdTX1ZJU0lCTEUgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX0RST1BET1dOLCAzNiwgMzcsIDE4MywgMTAwCiBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDYyLCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICJDYW5jZWwiLCBJRENBTkNFTCwgMTE2LCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICImQnJvd3NlLi4uIiwgMTIyODgsIDE3MCwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAp9CgovKgljb2x1bW5zIGluIHRoZSBzaGVsbHZpZXcJKi8KU1RSSU5HVEFCTEUKQkVHSU4KCUlEU19TSFZfQ09MVU1OMQkJIpa8kU8iCglJRFNfU0hWX0NPTFVNTjIJCSKDVINDg1kiCglJRFNfU0hWX0NPTFVNTjMJCSKDdINAg0ODi4LMju2X3iIKCUlEU19TSFZfQ09MVU1ONAkJIo1YkFaT+o6eIgoJSURTX1NIVl9DT0xVTU41CQkika6QqyIKCUlEU19TSFZfQ09MVU1ONgkJIo2HjHaDVINDg1kiCglJRFNfU0hWX0NPTFVNTjcJCSKL84Krl2WXyiIKCUlEU19TSFZfQ09MVU1OOAkJIk5hbWUiIC8qRklYTUUqLwoJSURTX1NIVl9DT0xVTU45CQkiQ29tbWVudHMiIC8qRklYTUUqLwoKCUlEU19ORVdGT0xERVIJCSJOZXcgRm9sZGVyIgpFTkQK