LyoKICogV2luZUZpbGUKICogUG9saXNoIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDAgTWFydGluIEZ1Y2hzCiAqIENvcHlyaWdodCAyMDAyIFN0ZXZlbiBFZHdhcmRzCiAqIENvcHlyaWdodCAyMDAyIEFsZXhhbmRyZSBKdWxsaWFyZAogKiBDb3B5cmlnaHQgMjAwNCBQaW90ciBDYWJhbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1BPTElTSCwgU1VCTEFOR19ERUZBVUxUCgovKiBNZW51ICovCgpJRE1fV0lORUZJTEUgTUVOVSBGSVhFRCBJTVBVUkUKewoJUE9QVVAgIiZQbGlrIiAgewoJCU1FTlVJVEVNICImT3R383J6XHRFbnRlciIgLAkJCTEwMQoJCU1FTlVJVEVNICImUHJ6ZW5pZZwuLi5cdEY3IiAsIAkJCUlEX0ZJTEVfTU9WRQoJCU1FTlVJVEVNICImS29waXVqLi4uXHRGOCIgLAkJCTEwNwoJCU1FTlVJVEVNICJXIHMmY2hvd2t1Li4uXHRGOSIgLAkJMTE4CgkJTUVOVUlURU0gIiZVc3XxXHREZWwiICwJCQkxMDgKCQlNRU5VSVRFTSAiJlptaWXxIG5henfqLi4uIiAsCQkJMTA5CgkJTUVOVUlURU0gIlVzdGF3aWUmbmlhLi4uXHRBbHQrRW50ZXIiICwgSURfRURJVF9QUk9QRVJUSUVTCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZLb21wcmVzamEuLi4iICwJCTExOQoJCU1FTlVJVEVNICImRGVrb21wcmVzamEuLi4iICwJCTEyMAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImVXJ1Y2hvbS4uLiIgLAkJCUlEX0VYRUNVVEUKCQlNRU5VSVRFTSAiJkRydWt1ai4uLiIgLCAJCQkxMDIKCQlNRU5VSVRFTSAiU2tvamFyei4uLiIgLAkJMTAzCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlUmdHfzcnogZm9sZGVyLi4uIiAsCQkJMTExCgkJTUVOVUlURU0gIiZTenVrYWouLi4iICwJCQkxMDQKCQlNRU5VSVRFTSAiJlphem5hY3ogcGxpa2kuLi4iICwJCQkxMTYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKI2lmbmRlZiBfTk9fRVhURU5TSU9OUwoJCU1FTlVJVEVNICImV3lqnGNpZVx0QWx0K1giICwgCQkJSURfRklMRV9FWElUCiNlbHNlCgkJTUVOVUlURU0gIiZXeWqcY2llIiwgCQkJCUlEX0ZJTEVfRVhJVAojZW5kaWYKCX0KCglQT1BVUCAiJkR5c2siICB7CgkJTUVOVUlURU0gIiZLb3BpdWogZHVzay4uLiIgLAkJCTIwMQoJCU1FTlVJVEVNICImRXR5a2lldGEgZHlza3UuLi4iICwJCQkyMDIKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkZvcm1hdHVqIGR5c2suLi4iICwJCQkyMDMKI2lmZGVmIF9XSU45NQoJCU1FTlVJVEVNICImU3R383J6IGR5c2sgc3lzdGVtb3d5Li4uIiwgLTEJLypAQCAqLwojZW5kaWYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJlBvZLO5Y3ogRHlzayBTaWVjaW93eSIgLAkJCTI1MgoJCU1FTlVJVEVNICImT2SzuWN6IER5c2sgU2llY2lvd3kiICwJCTI1MwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJVZG9zdOpwbmlqIGpha28uLi4iICwJCQkyNTQKCQlNRU5VSVRFTSAiJk5pZSB1ZG9zdOpwbmlhai4uLiIgLAkJCTI1NQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJXeWLzciAmZHlza3UuLi4iICwJCQkyNTEKCX0KCglQT1BVUCAiJkthdGFsb2dpIiAgewoJCU1FTlVJVEVNICImTmFzdOpwbnkgcG96aW9tXHQrIiAsCQkJMzAxCgkJTUVOVUlURU0gIiZSb3p3afEgZHJ6ZXdvXHQqIiAsCQkzMDIKCQlNRU5VSVRFTSAiUm96d2nxICZ3c3p5c3Rrb1x0U3RyZysqIiAsCQkzMDMKCQlNRU5VSVRFTSAiJlp3afEgZHJ6ZXdvXHQtIiAsCQkJMzA0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlphem5hY3ogJnBvZGthdGFsb2dpIiAsCQkJCTUwNQoJfQoKCVBPUFVQICImV2lkb2siICB7CgkJTUVOVUlURU0gIiZEcnpld28gaSBrYXRhbG9naSIgLAkJCTQxMwoJCU1FTlVJVEVNICJEJnJ6ZXdvIiAsCQkJNDExCgkJTUVOVUlURU0gIiZLYXRhbG9naSIgLAkJCTQxMgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICImUG+zuWN6IiAsCQkJNDE0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZOYXp3YSIgLAkJCUlEX1ZJRVdfTkFNRQoJCU1FTlVJVEVNICImV3N6eXN0a2llIGF0cnlidXR5IHBsaWt1IiAsCQkJCUlEX1ZJRVdfQUxMX0FUVFJJQlVURVMsIENIRUNLRUQKCQlNRU5VSVRFTSAiV3licmFuZSAmYXRyeWJ1dHkgcGxpa3UuLi4iICwJCQlJRF9WSUVXX1NFTEVDVEVEX0FUVFJJQlVURVMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiUCZvc29ydHVqIGFsZmFiZXR5Y3puaWUiICwJCTQwNAoJCU1FTlVJVEVNICJQb3NvcnR1aiBwbyAmdHlwaWUiICwJCTQwNQoJCU1FTlVJVEVNICJSb3ptaWWc5iAmcG8gd2llbGtvnGNpIiAsIAkJNDA2CgkJTUVOVUlURU0gIiZTb3J0dWogcG8gZGFjaWUiICwgCQk0MDcKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiU29ydHVqIHBvICYuLi4iICwJCQk0MDkKCX0KCglQT1BVUCAiJk9wY2plIiAgewoJCU1FTlVJVEVNICImUG90d2llcmR6ZW5pZS4uLiIgLAkJLTEKCQlNRU5VSVRFTSAiJkN6Y2lvbmthLi4uIiAsCQkJSURfU0VMRUNUX0ZPTlQKCQlNRU5VSVRFTSAiJlVzdGF3aWVuaWEgcGFza2EgbmFyeupkemkuLi4iICwgLTEKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiUGFzZWsgJm5hcnrqZHppIiAsCQlJRF9WSUVXX1RPT0xfQkFSLCBDSEVDS0VECgkJTUVOVUlURU0gIlBhc2VrICZkeXNr83ciICwJCUlEX1ZJRVdfRFJJVkVfQkFSLCBDSEVDS0VECgkJTUVOVUlURU0gIlBhc2VrICZzdGF0dXN1IiAsCUlEX1ZJRVdfU1RBVFVTQkFSLCBDSEVDS0VECiNpZm5kZWYgX05PX0VYVEVOU0lPTlMKCQlNRU5VSVRFTSAiUGWzbnkgJmVrcmFuXHRDdHJsK1NoaWZ0K1MiICwgCUlEX1ZJRVdfRlVMTFNDUkVFTgojZW5kaWYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJlptaW5pbWFsaXp1aiBwcnp5IHN0YXJjaWUiICwJCS0xCgkJTUVOVUlURU0gIlomYXBpc3ogdXN0YXdpZW5pYSBwcnplZCB6YWtv8WN6ZW5pZW0iICwJCQk1MTEKCX0KCgoJUE9QVVAgIiZCZXpwaWVjemXxc3R3byIgIHsKCQlNRU5VSVRFTSAiJkRvc3TqcC4uLiIgLAkJNjA1CgkJTUVOVUlURU0gIiZMb2dvd2FuaWUuLi4iICwJCQk2MDYKCQlNRU5VSVRFTSAiJlezYZxjaWNpZWwuLi4iICwJCTYwNwoJfQoKCVBPUFVQICImT2tubyIgIHsKCQlNRU5VSVRFTSAiJk5vd2Ugb2tubyIgLAkJCUlEX1dJTkRPV19ORVcKCQlNRU5VSVRFTSAiJkthc2thZHVquWNvXHRDdHJsK0Y1IiAsCQlJRF9XSU5ET1dfQ0FTQ0FERQoJCU1FTlVJVEVNICImVHl0dbMgcGlvbm93byIgLAkJSURfV0lORE9XX1RJTEVfSE9SWgoJCU1FTlVJVEVNICJUeXR1syAmcG96aW9tb1x0Q3RybCtGNCIgLAkJSURfV0lORE9XX1RJTEVfVkVSVAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIlJvem1pZZzmIGF1dG9tYXR5Y3puaWUiICwJCUlEX1dJTkRPV19BVVRPU09SVAojZW5kaWYKCQlNRU5VSVRFTSAiUm96bWllnOYgJnN5bWJvbGUiICwJCUlEX1dJTkRPV19BUlJBTkdFCgkJTUVOVUlURU0gIiZPZJx3aWVyelx0RjUiICwJCUlEX1JFRlJFU0gKCX0KCglQT1BVUCAiJj8iICB7CgkJTUVOVUlURU0gIiZUZW1hdHUgcG9tb2N5XHRGMSIgLAkJCUlEX0hFTFAKCQlNRU5VSVRFTSAiJlN6dWthai4uLiIgLAkJCUlEX0hFTFAKCQlNRU5VSVRFTSAiJlW/eXdhbmllIHBvbW9jeSIgLAkJCUlEX0hFTFBfVVNJTkcKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlQT1BVUCAiTyBwcm9ncmFtaWUuLi4iICB7CgkJICBNRU5VSVRFTSAiJldpbmUuLi4iICwJCQlJRF9BQk9VVF9XSU5FCi8qCiAqCQkgIE1FTlVJVEVNICImTGljZW5jamEuLi4iCQlJRF9MSUNFTlNFCiAqCQkgIE1FTlVJVEVNICImTk8gV0FSUkFOVFkiCQlJRF9OT19XQVJSQU5UWQogKi8KCQl9Cgl9Cn0KCgpJRERfRVhFQ1VURSBESUFMT0cgRklYRUQgSU1QVVJFIDE1LCAxMywgMjEwLCA2MwpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJVcnVjaG9tIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKCUNPTlRST0wgCQkiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCglDT05UUk9MIAkJIiZQb2xlY2VuaWU6IiAsIC0xLCAiU3RhdGljIiwgU1NfTEVGVE5PV09SRFdSQVB8V1NfR1JPVVAsIDMsIDE4LCA2MCwgMTAKCUVESVRURVhUCQkyMDEsIDMsIDI5LCAxMzQsIDEyLCBFU19BVVRPSFNDUk9MTAoJQ09OVFJPTCAJCSJKYWtvICZzeW1ib2wiICwgMjE0LCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YfFdTX1RBQlNUT1AsMywgNDUsIDcxLCAxMgoJREVGUFVTSEJVVFRPTgkiT0siICwgMSwgMTU4LCA2LCA0NywgMTQKCVBVU0hCVVRUT04JCSJBbnVsdWoiICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkiJlBvbW9jIiAsIDI1NCwgMTU4LCA0MywgNDcsIDE0Cn0KCklERF9TRUxFQ1RfREVTVElOQVRJT04gRElBTE9HIEZJWEVEIElNUFVSRSAxNSwgMTMsIDIxMCwgNjMKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiV3li83IgY2VsdSIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglDT05UUk9MIAkJIiIsIDEwMSwgIlN0YXRpYyIsIFNTX1NJTVBMRXxTU19OT1BSRUZJWCwgMywgNiwgMTYyLCAxMAoJQ09OVFJPTCAJCSImjGNpZb9rYToiICwgLTEsICJTdGF0aWMiLCBTU19MRUZUTk9XT1JEV1JBUHxXU19HUk9VUCwgMywgMTgsIDYwLCAxMAoJRURJVFRFWFQJCTIwMSwgMywgMjksIDEzNCwgMTIsIEVTX0FVVE9IU0NST0xMCglERUZQVVNIQlVUVE9OCQkiT0siICwgMSwgMTU4LCA2LCA0NywgMTQKCVBVU0hCVVRUT04JCSJBbnVsdWoiICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkiJlByemVnbLlkYWoiICwgMjU0LCAxNTgsIDQzLCA0NywgMTQKfQoKU1RSSU5HVEFCTEUKewoJSURTX0ZPTlRfU0VMX0RMR19OQU1FCSJXcHJvd2FkemFuaWUgdXN0YXdpZfEgY3pjaW9ua2kiCglJRFNfRk9OVF9TRUxfRVJST1IJIkKzuWQgcHJ6eSB3eWJpZXJhbml1IGN6Y2lvbmtpIgp9Cg==