LyoKICogIE5vdGVwYWQgKFNwYW5pc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTcsOTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogKiAgUHJvb2ZyZWFkIDE5OTggYnkgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgogKiAgUHJvb2ZyZWFkIDE5OTkgYnkgSm9zZSBNYXJjb3MgTG9wZXogPGpvc2UubG9wZXpAdXBjbmV0LnVwYy5lcz4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpNQUlOX01FTlUgTUVOVSBMQU5HVUFHRSBMQU5HX1NQQU5JU0gsIFNVQkxBTkdfTkVVVFJBTAp7CiBQT1BVUCAiJkFyY2hpdm8iIHsKICBNRU5VSVRFTSAiJk51ZXZvIiwgMHgxMDAKICBNRU5VSVRFTSAiJkFicmlyIiwgMHgxMDEKICBNRU5VSVRFTSAiJkd1YXJkYXIiLCAweDEwMgogIE1FTlVJVEVNICJHdWFyZGFyIGNvJm1vLi4uIiwgMHgxMDMKICBNRU5VSVRFTSAiJkltcHJpbWlyIiwgMHgxMDQKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYXIgcOFnaW5hLi4uIiwgMHgxMDUKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYWNp824gaW1wcmVzb3JhLi4uIiwgMHgxMDYKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlNhbGlyIiwgMHgxMDgKIH0KUE9QVVAgIiZFZGl0YXIiIHsKICBNRU5VSVRFTSAiJkRlc2hhY2VyXHRDdHJsK1oiLCAweDExMAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJDb3ImdGFyXHRDdHJsK1giLCAweDExMQogIE1FTlVJVEVNICImQ29waWFyXHRDdHJsK0MiLCAweDExMgogIE1FTlVJVEVNICImUGVnYXJcdEN0cmwrViIsIDB4MTEzCiAgTUVOVUlURU0gIiZCb3JyYXJcdERlbCIsIDB4MTE0CiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNlbGVjY2lvbmFyIHQmb2RvIiwgMHgxMTYKICBNRU5VSVRFTSAiJkhvcmEgeSBGZWNoYVx0RjUiLCAweDExNwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQWp1c3RlIGRlIGztbmVhIGF1dG9t4XRpY28iLCAweDExOQogfQpQT1BVUCAiJkJ1c2NhciIgewogIE1FTlVJVEVNICImQnVzY2FyLi4uIiwgMHgxMjAKICBNRU5VSVRFTSAiQnVzY2FyICZzaWd1aWVudGVcdEYzIiwgMHgxMjEKIH0KUE9QVVAgIiZBeXVkYSIgewogIE1FTlVJVEVNICImSW5kaWNlIiwgMHgxMzAKICBNRU5VSVRFTSAiJkJ1c2Nhci4uLiIsIDB4MTMxCiAgTUVOVUlURU0gIkF5dWRhIHNvYnJlIGxhIGF5dWRhIiwgMHgxMzIKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBQT1BVUCAiSW5mJm9ybWFjafNuLi4uIiB7CiAgIE1FTlVJVEVNICImTGljZW5jaWEiLCAweDEzNQogICBNRU5VSVRFTSAiU0lOICZHQVJBTlTNQSIsIDB4MTM2CiAgIE1FTlVJVEVNICImQWNlcmNhIGRlIFdpbmUiLCAweDEzNwogIH0KIH0KfSAKCi8qIERpYWxvZyBgUGFnZSBzZXR1cCcgKi8KCkRJQUxPR19QQUdFU0VUVVBfIERJQUxPRyAwLCAwLCAyMjUsIDk1CkxBTkdVQUdFIExBTkdfU1BBTklTSCwgU1VCTEFOR19ORVVUUkFMClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJIZWx2IgpDQVBUSU9OICImQWp1c3RlIGRlIHDhZ2luYSIKewpMVEVYVCAgICAiJkNhYmVjZXJhOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MSwgICAgICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZQaek6IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQzLCAgICAgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIiZNYXJnZW5lczoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZJenF1aWVyZGE6IiwgICAgICAgIDB4MTQ1LCAgIDIwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLCovICAgMHgxNDcsICAgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIkEmcnJpYmE6IiwgICAgICAgICAweDE0OCwgICAgMjAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9UT1BWQUxVRSwqLyAgICAweDE0QSwgICAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZEZXJlY2hhOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCovICAweDE0RCwgICAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICJBYmEmam86IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwqLyAweDE1MCwgICAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICAweDE1MSwgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkNhbmNlbGFyIiwgICAgIDB4MTUyLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQXl1ZGEiLCAgICAgICAweDE1MywgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfU1BBTklTSCwgU1VCTEFOR19ORVVUUkFMCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwJIiZuIiAgICAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwJIlDhZ2luYSAmcyIgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwJCSIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwJIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9UT1BWQUxVRSwJCSIyNSBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsCSIyNSBtbSIgICAgIC8qIEZJWE1FICovCgpTVFJJTkdfTk9URVBBRCwJCQkJCSJCbG9jIGRlIE5vdGFzIgpTVFJJTkdfRVJST1IsCQkJCQkiRVJST1IiClNUUklOR19XQVJOSU5HLAkJCQkJIkNVSURBRE8iClNUUklOR19JTkZPLAkJCQkJIkluZm9ybWFjafNuIgoKU1RSSU5HX1VOVElUTEVELAkJCQkiKHNpbiB07XR1bG8pIgoKU1RSSU5HX0FMTF9GSUxFUywJCQkJIlRvZG9zIGxvcyBhcmNoaXZvcyAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULAkJCSJEb2N1bWVudG9zIGRlIHRleHRvICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsCQkJCSJFbCBhcmNoaXZvICclcycgZXMgZGVtYXNpYWRvIGdyYW5kZSBwYXJhIGVsIGJsb2MgZGUgbm90YXMuXG4gXApVc2Ugb3RybyBlZGl0b3IuIgpTVFJJTkdfTk9URVhULAkJCQkJIlVkLiBubyBlc2NyaWJp8yBuYWRhLiBcClxuUG9yIGZhdm9yIGVzY3JpYmEgYWxnbyB5IHBydWViZSBkZSBudWV2byIKU1RSSU5HX0RPRVNOT1RFWElTVCwJCQkJIkZpbGUgJyVzJ1xuZG9lcyBub3QgZXhpc3RcblxuIFwKRG8geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGZpbGUgPyIKU1RSSU5HX05PVFNBVkVELAkJCQkiRWwgdGV4dG8gZW4gZWwgYXJjaGl2byAnJXMnIGhhIGNhbWJpYWRvXG5cbiBcCr9EZXNlYSBndWFyZGFyIGxvcyBjYW1iaW9zPyIKU1RSSU5HX05PVEZPVU5ELAkJCQkJIm5vIHNlIGVuY29udHLzICclcycuIgpTVFJJTkdfT1VUX09GX01FTU9SWSwJCQkiTm8gaGF5IHN1ZmljaWVudGUgbWVtb3JpYSBwYXJhIHRlcm1pbmFyIFwKZXN0YSB0YXJlYS4gXG5DaWVycmUgdW5hIG8gbeFzIGFwbGljYWNpb25lcyBwYXJhIGF1bWVudGFyIGxhIGNhbnRpZGFkIFxuZGUgXAptZW1vcmlhIGxpYnJlLiIKCgp9Cgo=