LyoKICogIE5vdGVwYWQgKFN3ZWRpc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTcsOTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogKiAgUHJvb2ZyZWFkIDE5OTggYnkgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgogKiAgQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqICBDb3B5cmlnaHQgMjAwNywgMjAwOCBEYW5pZWwgTnlsYW5kZXIgPHBvQGRhbmllbG55bGFuZGVyLnNlPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1NXRURJU0gsIFNVQkxBTkdfTkVVVFJBTAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZBcmtpdiIgewogIE1FTlVJVEVNICImTnlcdEN0cmwrTiIsICAgICAgICAgICAgQ01EX05FVwogIE1FTlVJVEVNICLWJnBwbmEuLi5cdEN0cmwrTyIsICAgICAgICAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAiJlNwYXJhXHRDdHJsK1MiLCAgICAgICAgICAgIENNRF9TQVZFCiAgTUVOVUlURU0gIlNwYXJhIHMmb20uLi4iLCAgICAgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlNrcml2IHV0Li4uXHRDdHJsK1AiLCAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICJTaWRsYSZ5b3V0Li4uIiwgICAgQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiU2tyaXZhciZrb25maWd1cmF0aW9uLi4uIiwgQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkF2c2x1dGEiLCAgICAgICAgICBDTURfRVhJVAogfQpQT1BVUCAiJlJlZGlnZXJhIiB7CiAgTUVOVUlURU0gIibFbmdyYVx0Q3RybCtaIiwgICAgIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIktsaXBwICZ1dFx0Q3RybCtYIiwgICAgQ01EX0NVVAogIE1FTlVJVEVNICImS29waWVyYVx0Q3RybCtDIiwgIENNRF9DT1BZCiAgTUVOVUlURU0gIktsaXN0cmEgJmluXHRDdHJsK1YiLCAgICAgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiJlRhIGJvcnRcdERlbCIsICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIk1hcmtlcmEgJmFsbHQiLCAgICAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiJlRpZC9EYXR1bVx0RjUiLCAgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZEZWxhIGzlbmdhIG1lbmluZ2FyIiwgICAgICBDTURfV1JBUAogIE1FTlVJVEVNICImRm9udC4uLiIsICAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImU/ZrIiB7CiAgTUVOVUlURU0gIlP2ay4uLiIsICAgICAgICAgICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICImU/ZrIG7kc3RhXHRGMyIsICAgIENNRF9TRUFSQ0hfTkVYVAogfQpQT1BVUCAiJkhq5GxwIiB7CiAgTUVOVUlURU0gIiZJbm5laOVsbCIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJlP2ay4uLiIsICAgICAgICAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiQW525G5kbmluZyAmYXYgaGrkbHAiLCAgICBDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZPbSBBbnRlY2tuaW5nYXIiLCBDTURfSEVMUF9BQk9VVF9OT1RFUEFECiB9Cn0KCi8qIERpYWxvZyBgUGFnZSBzZXR1cCcgKi8KCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiU2lkbGF5b3V0Igp7CkxURVhUICAgICImU2lkaHV2dWQ6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZTaWRmb3Q6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICJLYW50ZXI6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImVuRuc3RlcjoiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfTEVGVFZBTFVFLCAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJtZ2ZXI6IiwgICAgICAgICAweDE0OCwgICAgMjAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfVE9QVkFMVUUsICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkj2Z2VyOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlVuZGVyOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiQXZicnl0IiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImSGrkbHAiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgIiZmIgpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgICJTaWRhICZwIgoKU1RSSU5HX05PVEVQQUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFudGVja25pbmdhciIKU1RSSU5HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZFTCIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZBUk5JTkciClNUUklOR19JTkZPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvcm1hdGlvbiIKClNUUklOR19VTlRJVExFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIobmFtbmz2cykiCgpTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsYSBmaWxlciAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICAgICAgICAgIAkiVGV4dGZpbGVyICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW4gJyVzJyDkciBm9nIgc3RvciBm9nIgQW50ZWNrbmluZ2FyLlxuIFwKQW525G5kIGVuIGFubmFuIHJlZGlnZXJhcmUuIgpTVFJJTkdfTk9URVhULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHUgc2tyZXYgaW50ZSBpbiBu5WdvbiB0ZXh0LiBcClxuU2tyaXYgbuVnb3Qgb2NoIGb2cnP2ayBzZWRhbiBpZ2VuIgpTVFJJTkdfRE9FU05PVEVYSVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW4gJyVzJ1xuZmlubnMgaW50ZVxuXG4gXApWaWxsIGR1IHNrYXBhIGVuIG55IGZpbD8iClNUUklOR19OT1RTQVZFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlbiAnJXMnXG5oYXIg5G5kcmF0c1xuXG4gXApWaWxsIGR1IHNwYXJhIORuZHJpbmdhcm5hPyIKU1RSSU5HX05PVEZPVU5ELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgaGl0dGFkZXMgaW50ZS4iClNUUklOR19PVVRfT0ZfTUVNT1JZLCAgICAgICAgICAgICAgICAgICAiRGV0IGZpbm5zIGludGUgdGlsbHLkY2tsaWd0IG1lZCBtaW5uZSBm9nIgYXR0IHNsdXRm9nJhIFwKZGVuIGjkciB1cHBnaWZ0ZW4uXG5BdnNsdXRhIGV0dCBlbGxlciBmbGVyYSBwcm9ncmFtIGb2ciBhdHQg9mthIG3kbmdkZW5cbmxlZGlndCBcCm1pbm5lLiIKCn0K