LyoKICogQ29weXJpZ2h0IDIwMDYgQW5kcmFzIEtvdmFjcwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUCgovKgogc2hlbGx2aWV3IGl0ZW0gbWVudQoqLwpNRU5VX1NIVl9GSUxFIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJICBNRU5VSVRFTSAiJlNlbGVjdCIJCUZDSURNX1NIVklFV19PUEVOCgkgIE1FTlVJVEVNICJFJnhwbG9yZSIsCQlGQ0lETV9TSFZJRVdfRVhQTE9SRQoJICBNRU5VSVRFTSAiJk9wZW4iLAkJRkNJRE1fU0hWSUVXX09QRU4KCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICJDJnV0IiwJCUZDSURNX1NIVklFV19DVVQKCSAgTUVOVUlURU0gIiZDb3B5IiwJCUZDSURNX1NIVklFV19DT1BZCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiQ3JlYXRlICZMaW5rIiwJRkNJRE1fU0hWSUVXX0NSRUFURUxJTksKCSAgTUVOVUlURU0gIiZEZWxldGUiLAkJRkNJRE1fU0hWSUVXX0RFTEVURQoJICBNRU5VSVRFTSAiJlJlbmFtZSIsCQlGQ0lETV9TSFZJRVdfUkVOQU1FCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiJlByb3BlcnRpZXMiLAlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKTUVOVV9DUEFORUwgTUVOVQpCRUdJTgogICAgUE9QVVAgIiZGaWxlIgogICAgQkVHSU4KICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiRSZ4aXQiLCBJRE1fQ1BBTkVMX0VYSVQKICAgIEVORAoKICAgIFBPUFVQICImVmlldyIKICAgIEJFR0lOCiAgICAgICAgTUVOVUlURU0gIkxhciZnZSBJY29ucyIsIEZDSURNX1NIVklFV19CSUdJQ09OCiAgICAgICAgTUVOVUlURU0gIlMmbWFsbCBJY29ucyIsIEZDSURNX1NIVklFV19TTUFMTElDT04KICAgICAgICBNRU5VSVRFTSAiJkxpc3QiLCBGQ0lETV9TSFZJRVdfTElTVFZJRVcKICAgICAgICBNRU5VSVRFTSAiJkRldGFpbHMiLCBGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwogICAgRU5ECgogICAgUE9QVVAgIiZIZWxwIgogICAgQkVHSU4KICAgICAgICBNRU5VSVRFTSAiJkFib3V0IENvbnRyb2wgUGFuZWwuLi4iLCBJRE1fQ1BBTkVMX0FCT1VUCiAgICBFTkQKRU5ECgpTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAyMjAsIDE1MgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiTul2amVneTogJXMiCkZPTlQgMTAsICJNUyBTaGVsbCBEbGciCnsKIERFRlBVU0hCVVRUT04gIk9LIiwgSURPSywgMTUzLCAxMzMsIDYwLCAxMiwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAiV2luZSAmbGljZW5zZS4uLiIsIElEQ19BQk9VVF9MSUNFTlNFLCAxNTMsIDExMywgNjAsIDEyLCBXU19UQUJTVE9QCiBMSVNUQk9YIElEQ19BQk9VVF9MSVNUQk9YLCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKIElDT04gIiIsIHN0YzEsIDEwLCAxMCwgMzAsIDMwCiBMVEVYVCAiIiwgSURDX0FCT1VUX1NUQVRJQ19URVhUMSwgNDAsIDEwLCAxNzAsIDEwCiBMVEVYVCAiIiwgSURDX0FCT1VUX1NUQVRJQ19URVhUMiwgNDAsIDIyLCAxNzAsIDEwCiBMVEVYVCAiUnVubmluZyBvbiAlcyIsIElEQ19BQk9VVF9TVEFUSUNfVEVYVDMsIDQyLCAzNCwgMTcwLCAxMAogTFRFWFQgIkEgV0lORS10IO1ydOFrOiIsIElEQ19BQk9VVF9XSU5FX1RFWFQsIDgsIDU0LCAyMDQsIDEwCn0KClNIRUxMX1JVTl9ETEcgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMCwgMCwgMjI3LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKIElDT04gIiIsIDEyMjk3LCA3LCAxMSwgMTgsIDIwLCBXU19WSVNJQkxFCiBMVEVYVCAizXJqYSBiZSBhIHByb2dyYW0sIG1hcHBhLCBkb3VtZW50dW0gY+1t6XQsIHZhZ3kgaW50ZXJuZXQgZXL1Zm9ycuFzdCwgYSBXaW5lIG1lZyBmb2dqYSDWbm5layBueWl0bmkuIiwgMTIyODksIDM2LCAxMSwgMTgyLCAxOAogTFRFWFQgIiZNZWdueWl04XM6IiwgMTIzMDUsIDcsIDM5LCAyNCwgMTAKIENPTlRST0wgIiIsIDEyMjk4LCAiQ09NQk9CT1giLCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WU0NST0xMIHwgV1NfVklTSUJMRSB8IENCU19ESVNBQkxFTk9TQ1JPTEwgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfRFJPUERPV04sIDM2LCAzNywgMTgzLCAxMDAKIERFRlBVU0hCVVRUT04gIk9LIiwgSURPSywgNjIsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIk3pZ3NlIiwgSURDQU5DRUwsIDExNiwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAiJlRhbGzzeuFzLi4uIiwgMTIyODgsIDE3MCwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRQp7CiAgICBJRFNfQ1BBTkVMX05BTUUgICAgICAgICAgICAgIk5hbWUiCiAgICBJRFNfQ1BBTkVMX0RFU0NSSVBUSU9OICAgICAgIkRlc2NyaXB0aW9uIgp9Cg==