LyoKICogIE5vdGVwYWQgKEZyZW5jaCByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMTk5Nyw5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAqICBUcmFuc2xhdGlvbiBieSBMYXVyZW50IEJ1ZmZsZXIgPGxhdXJlbnRAYmx1ZXdpbi5jaD4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ERUZBVUxUCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkZpY2hpZXIiIHsKICBNRU5VSVRFTSAiJk5vdXZlYXUuLi4iLCAgICAgICBDTURfTkVXCiAgTUVOVUlURU0gIiZPdXZyaXIiLCAgICAgICAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAiJkVucmVnaXN0cmVyIiwgICAgICBDTURfU0FWRQogIE1FTlVJVEVNICJFbnJlZ2lzdHJlciAmc291cy4uLiIsICAgICAgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSAiSW0mcHJpbWVyIiwgICAgICAgICBDTURfUFJJTlQKICBNRU5VSVRFTSAiJk1pc2UgZW4gcGFnZS4uLiIsICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICImQ29uZmlndXJhdGlvbiBkZSBsJ2ltcHJpbWFudGUuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUXVpdHRlciIsICAgICAgICAgIENNRF9FWElUCiB9ClBPUFVQICImRWRpdGlvbiIgewogIE1FTlVJVEVNICImQW5udWxlclx0Q3RybCtaIiwgIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkNvJnVwZXJcdEN0cmwrWCIsICAgQ01EX0NVVAogIE1FTlVJVEVNICImQ29waWVyXHRDdHJsK0MiLCAgIENNRF9DT1BZCiAgTUVOVUlURU0gIiZDb2xsZXJcdEN0cmwrViIsICAgQ01EX1BBU1RFCiAgTUVOVUlURU0gIiZFZmZhY2VyXHREZWwiLCAgICAgQ01EX0RFTEVURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJUb3V0ICZz6WxlY3Rpb25uZXIiLCAgICAgICAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiJkhldXJlL0RhdGVcdEY1IiwgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZSZXRvdXIg4CBsYSBsaWduZSIsICAgICAgICBDTURfV1JBUAogfQpQT1BVUCAiJlJlY2hlcmNoZXIiIHsKICBNRU5VSVRFTSAiJlJlY2hlcmNoZXIiLCAgICAgICBDTURfU0VBUkNICiAgTUVOVUlURU0gIiZTdWl2YW50XHRGMyIsICAgICAgQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImQWlkZSIgewogIE1FTlVJVEVNICImU29tbWFpcmUiLCAgICAgICAgIENNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIiZSZWNoZXJjaGVyLi4uIiwgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIiZBaWRlIHN1ciBsJ2FpZGUiLCAgQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICJJbmYmby4uLiIgewogICBNRU5VSVRFTSAiJkxpY2VuY2UiLCAgICAgICAgIENNRF9MSUNFTlNFCiAgIE1FTlVJVEVNICImQVVDVU5FIEdBUkFOVElFIiwgQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICImQSBwcm9wb3MgZGUgV2luZSIsICAgICAgICBDTURfQUJPVVRfV0lORQogIH0KIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiSGVsdiIKQ0FQVElPTiAiUGFnZSBTZXR1cCIKewpMVEVYVCAgICAiJkVuLXTqdGU6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQxLCAgICAgICA2MCwgMDUsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlBpZWQgZGUgcGFnZToiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDMsICAgICAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk1hcmdlczoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZHYXVjaGU6IiwgICAgICAgIDB4MTQ1LCAgIDIwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLCovICAgMHgxNDcsICAgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZIYXV0OiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRHJvaXRlOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCovICAweDE0RCwgICAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImQmFzOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsKi8gMHgxNTAsICAgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJPSyIsICAgICAgICAgMHgxNTEsICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJBbm51bGVyIiwgICAgIDB4MTUyLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQWlkZSIsICAgICAgIDB4MTUzLCAgICAgICAgICAgICAgICAxODAsIDM5LCA0MCwgMTUsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgICImbiIgICAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIlBhZ2UgJnMiICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICAgICAgICAgICIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAgIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICAgICAgICAgICIyNSBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsICAgIjI1IG1tIiAgICAgLyogRklYTUUgKi8KClNUUklOR19OT1RFUEFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3RlcGFkIgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJSRVVSIgpTVFJJTkdfV0FSTklORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRURU5USU9OIgpTVFJJTkdfSU5GTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5mb3JtYXRpb24iCgpTVFJJTkdfVU5USVRMRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNhbnMtdGl0cmUpIgoKU1RSSU5HX0FMTF9GSUxFUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvdXMgZmljaGllcnMgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwgICAgICAgICAgICAgICAgICAiRmljaGllcnMgdGV4dGUgKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZSBmaWNoaWVyICclcycgZXN0IHRyb3AgZ3JhbmQgcG91ciBsZSBibG9jLW5vdGVzLlxuIFwKVmV1aWxsZXogdXRpbGlzZXIgdW4gYXV0cmUg6WRpdGV1ci4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWb3VzIG4nYXZleiBwYXMgZW50cukgZGUgdGV4dGUuIFZldWlsbGV6IHRhcGVyIHF1ZWxxdWUgY2hvc2UgZXQgcmVjb21tZW5jZXJcClxuIgpTVFJJTkdfRE9FU05PVEVYSVNULCAgICAgICAgICAgICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJ1xuXCdleGlzdGUgcGFzLlxuXG4gXApWb3VsZXogdm91cyBjcullciB1biBub3V2ZWF1IGZpY2hpZXIgPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJ1xuYSDpdOkgbW9kaWZp6VxuXG4gXApWb3VsZXogdm91cyBlbnJlZ2lzdHJlciB2b3MgbW9kaWZpY2F0aW9ucyA/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBub24gdHJvdXbpLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgICAgICAgICJQYXMgYXNzZXogZGUgbeltb2lyZSBwb3VyIGZpbmlyIGNldHRlIFwKdOJjaGUuIFxuIEZlcm1leiB1bmUgb3UgcGx1c2llciBhcHBsaWNhdGlvbnMgcG91ciBsaWLpcmVyXG5cCmRlIGxhIG3pbW9pcmUuIgoKfQo=