LyoKICogIE5vdGVwYWQgKEZyZW5jaCByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMTk5Nyw5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAqICBUcmFuc2xhdGlvbiBieSBMYXVyZW50IEJ1ZmZsZXIgPGxhdXJlbnRAYmx1ZXdpbi5jaD4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkZpY2hpZXIiIHsKICBNRU5VSVRFTSAiJk5vdXZlYXVcdEN0cmwrTiIsICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAiJk91dnJpci4uLlx0Q3RybCtPIiwgICBDTURfT1BFTgogIE1FTlVJVEVNICImRW5yZWdpc3RyZXJcdEN0cmwrUyIsIENNRF9TQVZFCiAgTUVOVUlURU0gIkVucmVnaXN0cmVyICZzb3VzLi4uIiwgQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiSW0mcHJpbWVyLi4uXHRDdHJsK1AiLCAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICImTWlzZSBlbiBwYWdlLi4uIiwgIENNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIiZDb25maWd1cmF0aW9uIGRlIGwnaW1wcmltYW50ZS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZRdWl0dGVyIiwgICAgICAgICAgQ01EX0VYSVQKIH0KUE9QVVAgIskmZGl0aW9uIiB7CiAgTUVOVUlURU0gIiZBbm51bGVyXHRDdHJsK1oiLCAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQ28mdXBlclx0Q3RybCtYIiwgICBDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpZXJcdEN0cmwrQyIsICAgQ01EX0NPUFkKICBNRU5VSVRFTSAiQyZvbGxlclx0Q3RybCtWIiwgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiJkVmZmFjZXJcdERlbCIsICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlRvdXQgJnPpbGVjdGlvbm5lclx0Q3RybCtBIiwgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiJkhldXJlL0RhdGVcdEY1IiwgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZSZXRvdXIg4CBsYSBsaWduZSIsIENNRF9XUkFQCiAgTUVOVUlURU0gIiZQb2xpY2UuLi4iLCAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZSZWNoZXJjaGVyIiB7CiAgTUVOVUlURU0gIiZSZWNoZXJjaGVyLi4uXHRDdHJsK0YiLCBDTURfU0VBUkNICiAgTUVOVUlURU0gIiZTdWl2YW50XHRGMyIsICAgICAgQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICJBaWQmZSIgewogIE1FTlVJVEVNICImU29tbWFpcmUiLCAgICAgICAgIENNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIiZSZWNoZXJjaGVyLi4uIiwgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIiZVdGlsaXNlciBsJ2FpZGUiLCAgQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICJJbmYmbyIgewogICBNRU5VSVRFTSAiJkxpY2VuY2UuLi4iLCAgICAgICAgIENNRF9MSUNFTlNFCiAgIE1FTlVJVEVNICImQVVDVU5FIEdBUkFOVElFLi4uIiwgQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICLAICZwcm9wb3MgZGUgV2luZS4uLiIsICAgICAgICBDTURfQUJPVVRfV0lORQogIH0KIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJNaXNlIGVuIHBhZ2UiCnsKTFRFWFQgICAgIiZFbi106nRloDoiLCAgMHgxNDAsICAgMTAsIDA3LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDEsICAgICAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUGllZCBkZSBwYWdloDoiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDMsICAgICAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk1hcmdlc6A6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImR2F1Y2hloDoiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsKi8gICAweDE0NywgICAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkhhdXSgOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRHJvaXRloDoiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwqLyAgMHgxNEQsICAgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkJhc6A6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwqLyAweDE1MCwgICAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiQW5udWxlciIsICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiQWlkJmUiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgIiZuIiAgICAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICAiUGFnZSAmcyIgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwgICAgICIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAgIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICAiMjUgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgICIyNSBtbSIgICAgIC8qIEZJWE1FICovCgpTVFJJTkdfTk9URVBBRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmxvYy1ub3RlcyIKU1RSSU5HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUkVVUiIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFUVEVOVElPTiIKU1RSSU5HX0lORk8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZm9ybWF0aW9uIgoKU1RSSU5HX1VOVElUTEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzYW5zLXRpdHJlKSIKClNUUklOR19BTExfRklMRVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3VzIGZpY2hpZXJzICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAiRmljaGllcnMgdGV4dGUgKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMZSBmaWNoaWVyICclcycgZXN0IHRyb3AgZ3JhbmQgcG91ciBsZSBibG9jLW5vdGVzLlxuIFwKVmV1aWxsZXogdXRpbGlzZXIgdW4gYXV0cmUg6WRpdGV1ci4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWb3VzIG4nYXZleiBwYXMgZW50cukgZGUgdGV4dGUuIFwKVmV1aWxsZXogdGFwZXIgcXVlbHF1ZSBjaG9zZSBldCByZWNvbW1lbmNlciIKU1RSSU5HX0RPRVNOT1RFWElTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJ1xubidleGlzdGUgcGFzLlxuXG4gXApWb3VsZXotdm91cyBjcullciB1biBub3V2ZWF1IGZpY2hpZXKgPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJ1xuYSDpdOkgbW9kaWZp6VxuXG4gXApWb3VsZXotdm91cyBlbnJlZ2lzdHJlciB2b3MgbW9kaWZpY2F0aW9uc6A/IgpTVFJJTkdfTk9URk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBub24gdHJvdXbpLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcyBhc3NleiBkZSBt6W1vaXJlIHBvdXIgY29tcGzpdGVyIGNldHRlIFwKdOJjaGUuIFxuRmVybWV6IHVuZSBvdSBwbHVzaWV1cnMgYXBwbGljYXRpb25zIHBvdXIgbGli6XJlclxuXApkZSBsYSBt6W1vaXJlLiIKCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKewpJRFNfTElDRU5TRV9DQVBUSU9OLCAgICAgICAgICAgICJMSUNFTkNFIgpJRFNfTElDRU5TRSwKIkNldHRlIGJpYmxpb3Ro6HF1ZSBlc3QgbGlicmUsIHZvdXMgcG91dmV6IGxhIHJlZGlzdHJpYnVlciBldC9vdSBcCmxhIG1vZGlmaWVyIHNlbG9uIGxlcyB0ZXJtZXMgZGUgbGEgTGljZW5jZSBQdWJsaXF1ZSBH6W7pcmFsZSBHTlUgXApMaW1pdOllIHB1Ymxp6WUgcGFyIGxhIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAodmVyc2lvbiAyLjEgb3UgXApiaWVuIHRvdXRlIGF1dHJlIHZlcnNpb24gdWx06XJpZXVyZSBjaG9pc2llIHBhciB2b3VzKS5cblwKQ2V0dGUgYmlibGlvdGjocXVlIGVzdCBkaXN0cmlidellIGNhciBwb3RlbnRpZWxsZW1lbnQgdXRpbGUsIFwKbWFpcyBTQU5TIEFVQ1VORSBHQVJBTlRJRSwgbmkgZXhwbGljaXRlIG5pIGltcGxpY2l0ZSwgeSBjb21wcmlzIFwKbGVzIGdhcmFudGllcyBkZSBjb21tZXJjaWFsaXNhdGlvbiBvdSBkJ2FkYXB0YXRpb24gZGFucyB1biBidXQgXApzcOljaWZpcXVlLiBSZXBvcnRlei12b3VzIOAgbGEgTGljZW5jZSBQdWJsaXF1ZSBH6W7pcmFsZSBHTlUgXApMaW1pdOllIHBvdXIgcGx1cyBkZSBk6XRhaWxzLlxuXApWb3VzIGRldmV6IGF2b2lyIHJl53UgdW5lIGNvcGllIGRlIGxhIExpY2VuY2UgUHVibGlxdWUgR+lu6XJhbGUgXApHTlUgTGltaXTpZSBlbiBt6m1lIHRlbXBzIHF1ZSBjZXR0ZSBiaWJsaW90aOhxdWWgOyBzaSBjZSBuJ2VzdCBwYXMgXApsZSBjYXMsIOljcml2ZXog4CBsYSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBcCkZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTExLTEzMDEsIMl0YXRzLVVuaXMuIgoKSURTX1dBUlJBTlRZX0NBUFRJT04sICJBVUNVTkUgR0FSQU5USUUiCklEU19XQVJSQU5UWSwKIkNldHRlIGJpYmxpb3Ro6HF1ZSBlc3QgZGlzdHJpYnXpZSBjYXIgcG90ZW50aWVsbGVtZW50IHV0aWxlLCBcCm1haXMgU0FOUyBBVUNVTkUgR0FSQU5USUUsIG5pIGV4cGxpY2l0ZSBuaSBpbXBsaWNpdGUsIHkgY29tcHJpcyBcCmxlcyBnYXJhbnRpZXMgZGUgY29tbWVyY2lhbGlzYXRpb24gb3UgZCdhZGFwdGF0aW9uIGRhbnMgdW4gYnV0IFwKc3DpY2lmaXF1ZS4gUmVwb3J0ZXotdm91cyDgIGxhIExpY2VuY2UgUHVibGlxdWUgR+lu6XJhbGUgR05VIFwKTGltaXTpZSBwb3VyIHBsdXMgZGUgZOl0YWlscy4iCn0K