LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqIENvcHlyaWdodCAyMDA2IEFudG9uaW8gQ29kYXp6aQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0VTUEVSQU5UTywgU1VCTEFOR19ERUZBVUxUCgovKiBDeGFwZWxpdGFqIGxpdGVyb2ogZXN0YXMgZW4gTGF0aW4tMyBpc284ODk1LTMgKi8KCk1FTlVfMDAxIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCU1FTlVJVEVNICImR3JhbmRhaiBJa29ub2oiLAlGQ0lETV9TSFZJRVdfQklHSUNPTgoJTUVOVUlURU0gIk1hbGdyYW5kYWogSWtvbm9qIiwJRkNJRE1fU0hWSUVXX1NNQUxMSUNPTgoJTUVOVUlURU0gIiZMaXN0byIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKCU1FTlVJVEVNICImRGV0YWxlIiwJCUZDSURNX1NIVklFV19SRVBPUlRWSUVXCkVORAoKLyoKIHNoZWxsdmlldyBiYWNrZ3JvdW5kIG1lbnUKKi8KTUVOVV8wMDIgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJUE9QVVAgIiIKCUJFR0lOCgkgIFBPUFVQICImVmlkbyIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiJkdyYW5kYWogSWtvbm9qIiwJRkNJRE1fU0hWSUVXX0JJR0lDT04KCSAgICBNRU5VSVRFTSAiTWFsZ3JhbmRhaiBJa29ub2oiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCgkgICAgTUVOVUlURU0gIiZMaXN0byIsCQlGQ0lETV9TSFZJRVdfTElTVFZJRVcKCSAgICBNRU5VSVRFTSAiJkRldGFsZSIsCUZDSURNX1NIVklFV19SRVBPUlRWSUVXCgkgIEVORAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgUE9QVVAgIkFyYW74dSAmSWtvbm9qbiIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiTGH9rSAmTm9tbyIsCTB4MzAJLyogY29sdW1uIDAgKi8KCSAgICBNRU5VSVRFTSAiTGH9rSAmVGlwbyIsCTB4MzIJLyogY29sdW1uIDIgKi8KCSAgICBNRU5VSVRFTSAiTGH9rSBHcmFuZGVjbyIsCTB4MzEJLyogLi4uICovCgkgICAgTUVOVUlURU0gIkxh/a0gJkRhdG8iLAkweDMzCgkgICAgTUVOVUlURU0gU0VQQVJBVE9SCgkgICAgTUVOVUlURU0gIiZBcmFu+HUgQf10b21hdGUiLAlGQ0lETV9TSFZJRVdfQVVUT0FSUkFOR0UKCSAgRU5ECgkgIE1FTlVJVEVNICJWaWNpZ3UgSWtvbm9qbiIsCUZDSURNX1NIVklFV19TTkFQVE9HUklECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiUmVsZWd1IiwJCUZDSURNX1NIVklFV19SRUZSRVNICgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiRW5tZXR1IiwJCUZDSURNX1NIVklFV19JTlNFUlQKCSAgTUVOVUlURU0gIkVubWV0dSBraWVsIExpZ28iLAlGQ0lETV9TSFZJRVdfSU5TRVJUTElOSwoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgUE9QVVAgIk5vdmEiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIk5vdmEgJkRvc2llcnVqbyIsCUZDSURNX1NIVklFV19ORVdGT0xERVIKCSAgICBNRU5VSVRFTSAiTm92YSAmTGlnbyIsCUZDSURNX1NIVklFV19ORVdMSU5LCgkgICAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIEVORAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIkVjb2oiLAlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKLyoKIHNoZWxsdmlldyBpdGVtIG1lbnUKKi8KTUVOVV9TSFZfRklMRSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgTUVOVUlURU0gIiZTZWxlY3QiCQlGQ0lETV9TSFZJRVdfT1BFTgoJICBNRU5VSVRFTSAiRSZzcGxvcnUiLAkJRkNJRE1fU0hWSUVXX0VYUExPUkUKCSAgTUVOVUlURU0gIk1hbGZlcm11IiwJCUZDSURNX1NIVklFV19PUEVOCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiRW5tZXR1IiwJCUZDSURNX1NIVklFV19DVVQKCSAgTUVOVUlURU0gIktvcGl1IiwJCUZDSURNX1NIVklFV19DT1BZCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiS3JldSBMaWdvbiIsCUZDSURNX1NIVklFV19DUkVBVEVMSU5LCgkgIE1FTlVJVEVNICJGb3JpZ3UiLAkJRkNJRE1fU0hWSUVXX0RFTEVURQoJICBNRU5VSVRFTSAiQWxpbm9tdSIsCQlGQ0lETV9TSFZJRVdfUkVOQU1FCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiRWNvaiIsCUZDSURNX1NIVklFV19QUk9QRVJUSUVTCglFTkQKRU5ECgpTSEJSU0ZPUkZPTERFUl9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAxODgsIDE5MgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBEU19NT0RBTEZSQU1FIHwgRFNfU0VURk9OVCB8IERTXzNETE9PSwpDQVBUSU9OICJGb2xpdSBEb3NpZXJ1am9uIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKIERFRlBVU0hCVVRUT04gIkJvbmUiLCAxLCA4MCwgMTc2LCA1MCwgMTIsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIlJlemlnbmkiLCAyLCAxMzQsIDE3NiwgNTAsIDEyLCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIExURVhUICIiLCBJRERfVElUTEUsIDQsIDQsIDE4MCwgMTIKIExURVhUICIiLCBJRERfU1RBVFVTLCA0LCAyNSwgMTgwLCAxMgogQ09OVFJPTCAiIiwgSUREX1RSRUVWSUVXLCAiU3lzVHJlZVZpZXczMiIsCiAJVFZTX0hBU0JVVFRPTlMgfCBUVlNfSEFTTElORVMgfCBUVlNfTElORVNBVFJPT1QgfAoJV1NfQk9SREVSIHwgV1NfVEFCU1RPUCwKCTQsIDQwLCAxODAsIDEyMAp9CgpTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAyMTAsIDE1MgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiUHJpICVzIgpGT05UIDEwLCAiTVMgU2hlbGwgRGxnIgp7CiBERUZQVVNIQlVUVE9OICJCb25lIiwgMSwgMTUzLCAxMzAsIDUwLCAxMgogTElTVEJPWCBJRENfQUJPVVRfTElTVEJPWCwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCiBJQ09OICIiLCBzdGMxLCAxMCwgMTAsIDMwLCAzMAogTFRFWFQgIiIsIElEQ19BQk9VVF9TVEFUSUNfVEVYVDEsIDQwLCAxMCwgMTM3LCAxMAogTFRFWFQgIiIsIElEQ19BQk9VVF9TVEFUSUNfVEVYVDIsIDQwLCAyMiwgMTM3LCAxMAogTFRFWFQgIldpbmUgZXN0YXMgZGlzcG9uZWJsYSBkYW5rJ2FsOiIsIElEQ19BQk9VVF9XSU5FX1RFWFQsIDgsIDU1LCAxMzcsIDEwCn0KClNIRUxMX1JVTl9ETEcgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMCwgMCwgMjI3LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKIElDT04gIiIsIDEyMjk3LCA3LCAxMSwgMTgsIDIwLCBXU19WSVNJQkxFCiBMVEVYVCAiU2tyaWJ1IG5vbW9uIGRlIHByb2dyYW1vLCBkZSBkb3NpZXJ1am8sIGRlIGRvY3VtZW50byBh/SBkZSBJbnRlcnJldGEgZm9udG8sIGthaiBXaW5lIG1hbGZlcm1vcyD4aW4uIiwgMTIyODksIDM2LCAxMSwgMTgyLCAxOAogTFRFWFQgIk1hbGZlcm11OiIsIDEyMzA1LCA3LCAzOSwgMjQsIDEwCiBDT05UUk9MICIiLCAxMjI5OCwgIkNPTUJPQk9YIiwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVlNDUk9MTCB8IFdTX1ZJU0lCTEUgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX0RST1BET1dOLCAzNiwgMzcsIDE4MywgMTAwCiBERUZQVVNIQlVUVE9OICJCb25lIiwgSURPSywgNjIsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIlJlemlnbmkiLCBJRENBTkNFTCwgMTE2LCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICJGb2xpdS4uLiIsIDEyMjg4LCAxNzAsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKfQoKLyoKCXNwZWNpYWwgZm9sZGVycwoqLwpTVFJJTkdUQUJMRQp7CglJRFNfREVTS1RPUAkJIkRlc2t0b3AiCglJRFNfTVlDT01QVVRFUgkJIk1lYSBLb21wdXRlcm8iCn0KCi8qCgljb250ZXh0IG1lbnVzCiovClNUUklOR1RBQkxFCnsKCUlEU19WSUVXX0xBUkdFCQkiJkdyYW5kYWogSWtvbm9qIgoJSURTX1ZJRVdfU01BTEwJCSJNYWxncmFuZGFqIElrb25vaiIKCUlEU19WSUVXX0xJU1QJCSImTGlzdG8iCglJRFNfVklFV19ERVRBSUxTCSImRGV0YWxlIgoJSURTX1NFTEVDVAkJIkVsZWt0dSIKCUlEU19PUEVOCQkiTWFsZmVybXUiCn0KClNUUklOR1RBQkxFCnsKCUlEU19DUkVBVEVGT0xERVJfREVOSUVEICJNaSBuZSBwb3ZhcyBjcmVpIG5vdmFuIERvc2llcnVqb246IEFsaXJvIHJpZnV6aXRhLiIKCUlEU19DUkVBVEVGT0xERVJfQ0FQVElPTiAiRXJhcm8gZHVtIGtyZWn4byBkZSBkb3NpZXJ1am8iCglJRFNfREVMRVRFSVRFTV9DQVBUSU9OICJLb25maXJtdSBmb3JpZ29uIGRlIGRvc2llcm8iCglJRFNfREVMRVRFRk9MREVSX0NBUFRJT04gIktvbmZpcm11IGZvcmlnb24gZGUgZG9zaWVydWpvIgoJSURTX0RFTEVURUlURU1fVEVYVCAixnUgdmkgZXN0YXMgY2VydGEgcHJpIGZvcmlnbyBkZSAnJTEnPyIKCUlEU19ERUxFVEVNVUxUSVBMRV9URVhUICLGdSB2aSBlc3RhcyBjZXJ0YSBwcmkgZm9yaWdvIGRlIOZpIHRpdWogJTEga29tcG9uYW50b2o/IgoJSURTX09WRVJXUklURUZJTEVfVEVYVCAiVGhpcyBmb2xkZXIgYWxyZWFkeSBjb250YWlucyBhIGZpbGUgY2FsbGVkICclMScuXG5cbkRvIHlvdSB3YW50IHRvIHJlcGxhY2UgaXQ/IgoJSURTX09WRVJXUklURUZJTEVfQ0FQVElPTiAiS29uZmlybXUgc3VwcmVza3JpYml0b24gZGUgZG9zaWVyb24iCglJRFNfT1ZFUldSSVRFRk9MREVSX1RFWFQgIlRoaXMgZm9sZGVyIGFscmVhZHkgY29udGFpbnMgYSBmb2xkZXIgbmFtZWQgJyUxJy5cblxuIlwKCSAgICAiSWYgdGhlIGZpbGVzIGluIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyBmaWxlcyBpbiB0aGVcbiJcCgkgICAgInNlbGVjdGVkIGZvbGRlciB0aGV5IHdpbGwgYmUgcmVwbGFjZWQuIERvIHlvdSBzdGlsbCB3YW50IHRvIG1vdmUgb3IgY29weVxuIlwKCSAgICAidGhlIGZvbGRlcj8iCn0KCi8qCWNvbHVtbnMgaW4gdGhlIHNoZWxsdmlldwkqLwpTVFJJTkdUQUJMRQpCRUdJTgoJSURTX1NIVl9DT0xVTU4xCQkiRG9zaWVybyIKCUlEU19TSFZfQ09MVU1OMgkJIkdhbmRlY28iCglJRFNfU0hWX0NPTFVNTjMJCSJUaXBvIgoJSURTX1NIVl9DT0xVTU40CQkiTW9kaWZpdGEiCglJRFNfU0hWX0NPTFVNTjUJCSJBdHJpYnV0b2oiCglJRFNfU0hWX0NPTFVNTjYJCSJTcGFjbyIKCUlEU19TSFZfQ09MVU1ONwkJIkRpc3BvbmVibGEgU3BhY28iCglJRFNfU0hWX0NPTFVNTjgJCSJOb21vIgoJSURTX1NIVl9DT0xVTU45CQkiS29tZW50YXJpbyIKRU5ECgoKLyogbWVzc2FnZSBib3ggc3RyaW5ncyAqLwpTVFJJTkdUQUJMRQp7CiAgICAgICBJRFNfUkVTVEFSVF9USVRMRSAgICAgICAiUmVzdGFydGlndSIKICAgICAgIElEU19SRVNUQVJUX1BST01QVCAgICAgICLGdSB2aSB2b2xhcyBzaW11bGkgVmluZG96YW4gcmVzdGFydGlnb24/IgogICAgICAgSURTX1NIVVRET1dOX1RJVExFICAgICAgIkFkaWH9dSIKICAgICAgIElEU19TSFVURE9XTl9QUk9NUFQgICAgICLGdSB2aSB2b2xhcyBhZGlh/WkgV2luZT8iCn0KCi8qIHNoZWxsIGZvbGRlciBwYXRoIGRlZmF1bHQgdmFsdWVzICovClNUUklOR1RBQkxFCnsKCUlEU19QUk9HUkFNUyAgICAgICAgICAgICAgICAiU3RhcnQgTWVudVxcUHJvZ3JhbXMiCglJRFNfUEVSU09OQUwgICAgICAgICAgICAgICAgIk1pYWogRG9rdW1lbnRvaiIKCUlEU19GQVZPUklURVMgICAgICAgICAgICAgICAiRmF2b3JpdGVzIgoJSURTX1NUQVJUVVAgICAgICAgICAgICAgICAgICJTdGFydCBNZW51XFxQcm9ncmFtc1xcU3RhcnRVcCIKCUlEU19SRUNFTlQgICAgICAgICAgICAgICAgICAiUmVjZW50IgoJSURTX1NFTkRUTyAgICAgICAgICAgICAgICAgICJTZW5kVG8iCglJRFNfU1RBUlRNRU5VICAgICAgICAgICAgICAgIlN0YXJ0IE1lbnUiCglJRFNfTVlNVVNJQyAgICAgICAgICAgICAgICAgIk1pYWogRG9rdW1lbnRvalxcTXV6aWtvIgoJSURTX01ZVklERU8gICAgICAgICAgICAgICAgICJNaWFpIERva3VtZW50b2pcXFZpZGVvIgoJSURTX0RFU0tUT1BESVJFQ1RPUlkgICAgICAgICJEZXNrdG9wIgoJSURTX05FVEhPT0QgICAgICAgICAgICAgICAgICJOZXRIb29kIgoJSURTX1RFTVBMQVRFUyAgICAgICAgICAgICAgICJUZW1wbGF0ZXMiCglJRFNfQVBQREFUQSAgICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIERhdGEiCglJRFNfUFJJTlRIT09EICAgICAgICAgICAgICAgIlByaW50SG9vZCIKCUlEU19MT0NBTF9BUFBEQVRBICAgICAgICAgICAiTG9jYWwgU2V0dGluZ3NcXEFwcGxpY2F0aW9uIERhdGEiCglJRFNfSU5URVJORVRfQ0FDSEUgICAgICAgICAgIlRlbXBvcmFyeSBJbnRlcm5ldCBGaWxlcyIKCUlEU19DT09LSUVTICAgICAgICAgICAgICAgICAiQ29va2llcyIKCUlEU19ISVNUT1JZICAgICAgICAgICAgICAgICAiSGlzdG9yeSIKCUlEU19QUk9HUkFNX0ZJTEVTICAgICAgICAgICAiUHJvZ3JhbSBGaWxlcyIKCUlEU19NWVBJQ1RVUkVTICAgICAgICAgICAgICAiTWFqIERvY3VtZW50b2pcXEJpbGRvaiIKCUlEU19QUk9HUkFNX0ZJTEVTX0NPTU1PTiAgICAiUHJvZ3JhbSBGaWxlc1xcQ29tbW9uIEZpbGVzIgoJSURTX0NPTU1PTl9ET0NVTUVOVFMgICAgICAgICJEb2N1bWVudHMiCglJRFNfQURNSU5UT09MUyAgICAgICAgICAgICAgIlN0YXJ0IE1lbnVcXFByb2dyYW1zXFxBZG1pbmlzdHJhdGl2ZSBUb29scyIKCUlEU19DT01NT05fTVVTSUMgICAgICAgICAgICAiRG9jdW1lbnRzXFxNdXNpa28iCglJRFNfQ09NTU9OX1BJQ1RVUkVTICAgICAgICAgIkRvY3VtZW50c1xcQmlsZG9qIgoJSURTX0NPTU1PTl9WSURFTyAgICAgICAgICAgICJEb2N1bWVudHNcXFZpZGVvIgoJSURTX0NEQlVSTl9BUkVBICAgICAgICAgICAgICJMb2NhbCBTZXR0aW5nc1xcQXBwbGljYXRpb24gRGF0YVxcTWljcm9zb2Z0XFxDRCBCdXJuaW5nIgoKCUlEU19ORVdGT0xERVIJCSJOZXcgRm9sZGVyIgp9Cg==