LyoKICogV2luZSBjb21tYW5kIHByb21wdAogKiBQb2xpc2ggTGFuZ3VhZ2UgU3VwcG9ydAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTkgRCBBIFBpY2tsZXMKICogQ29weXJpZ2h0IChDKSAyMDA0IFBpb3RyIENhYmFuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQKClNUUklOR1RBQkxFCnsKICBXQ01EX0FUVFJJQiwgIlBvbW9jIG8gQVRUUklCXG4iCiAgV0NNRF9DQUxMLAoiQ0FMTCA8bmF6d2EgcGxpa3UgYmF0PiBqZXN0IHW/eXdhbmUgdyBwbGlrdSB0eXB1IGJhdCBkbyB1cnVjaGFtaWFuaWFcblwKa29tZW5kIHogaW5uZWdvIHBsaWt1IGJhdC4gTmFzdOpwbmllIHBvd3JhY2EgZG8gcGxpa3UsIHoga3TzcmVnbyB6b3N0YbNhXG5cCnd5d2+zYW5hIChqZb9lbGkgaXN0bmllamUpLiBLb21lbmRhIENBTEwgbW+/ZSBwcnpla2F6eXdh5iBwYXJhbWV0cnkgZG9cblwKd3l3b7N5d2FuZWogcHJvY2VkdXJ5LlxuXApcblwKWm1pYW55IGRvbXmcbG5lZ28ga2F0YWxvZ3UsIHptaWVubnljaCCccm9kb3dpc2tvd3ljaCBpdGQuIHd5a29uYW5lIHByemV6XG5cCnd5d2+zYW65IHByb2NlZHVyZSBzuSBkemllZHppY3pvbmUgcHJ6ZXogc2tyeXB0IHd5d2+zdWq5Y3kgQ0FMTC5cbiIKCiAgV0NNRF9DRCwgICAgICJQb21vYyBvIENEXG4iCiAgV0NNRF9DSERJUiwgICJQb21vYyBvIENIRElSXG4iCgogIFdDTURfQ0xTLCAgICAiQ0xTIGN6eZxjaSBla3JhbiBrb25zb2xpXG4iCgogIFdDTURfQ09QWSwgICAiUG9tb2MgbyBDT1BZXG4iCiAgV0NNRF9DVFRZLCAgICJQb21vYyBvICBDVFRZXG4iCiAgV0NNRF9EQVRFLCAgICJQb21vYyBvICBEQVRFXG4iCiAgV0NNRF9ERUwsICAgICJQb21vYyBvICBERUxcbiIKICBXQ01EX0RJUiwgICAgIlBvbW9jIG8gIERJUlxuIgoKICBXQ01EX0VDSE8sCiJFQ0hPIDxjablnIHpuYWvzdz4gZHJ1a3VqZSA8Y2m5ZyB6bmvzdz4gZG8gYWt0dWFsbmVnbyB1v7lkemVuaWEuXG5cClxuXApFQ0hPIE9OIHBvd29kdWplLCC/ZSB3c3p5c3RraWUga29tZW5keSB6IHBsaWt1IGJhdCBzuSBkcnVrb3dhbmVcblwKZG8gYWt0dWFsbmVnbyB1cnq5ZHplbmlhIHByemVkIHd5d2+zYW5pZW0uXG5cClxuXApFQ0hPIE9GRiBvZHdyYWNhIGVmZWt0IGtvbWVuZHkgRUNITyBPTiAoRUNITyBqZXN0IHd5s7ljem9uZSAoT0ZGKVxuXApzdGFuZGFyZG93bykuIEtvbWVuZGEgRUNITyBPRkYgbW+/ZSB6b3N0YeYgbmllIHd5nHdpZXRsb25hIGplv2VsaVxuXAp6b3N0YW5pZSBwb3ByemVkem9uYSB6bmFraWVtIEAuXG4iCgogIFdDTURfRVJBU0UsICAiUG9tb2MgbyAgRVJBU0VcbiIKCiAgV0NNRF9GT1IsCiJLb21lbmRhIEZPUiBzs3W/eSBkbyB1cnVjaG9taWVuaWEga29tZW5keSBkbGEga2G/ZGVnbyB6IHBsaWvzdyB6ZVxuXAp6YmlvcnUuXG5cClNrs2FkbmlhOiBGT1IgJXptaWVubmEgSU4gKHpiafNyKSBETyBwb2xlY2VuaWVcblwKXG5cCld5bfNnIHBvd3RhcnphbmlhIHpuYWt1ICUsIGdkeSB1v3l3YW15IGtvbWVuZHkgRk9SIHcgcGxpa3UgYmF0IG5pZVxuXAppc3RuaWplIHcgd2NtZFxuIgoKICBXQ01EX0dPVE8sCiJLb21lbmRhIEdPVE8gcHJ6ZW5vc2kga3Vyc29yIGRvIGlubmVnbyBtaWVqc2NhIHcgcGxpa3UgYmF0LlxuXApcblwKRXR5a2lldGEsIGt083JhIGplc3QgY2VsZW0gc2tva3UgKGtvbWVuZHkgR09UTykgbW+/ZSBtaWXmIG1ha3N5bWFsbmllXG5cCjI1NSB6bmFr83cgZLN1Z2+cY2ksIG5pZSBtb79lIHphd2llcmHmIHNwYWNqaS4gSmW/ZWxpIHO5IGR3aWUgKGx1YlxuXAp3aepjZWopIGV0eWtpZXR5IG8gdGFraWNoIHNhbXljaCBuYXp3YWNoIHNrb2sgem9zdGFuaWUgd3lrb25hbnkgZG9cblwKcGllcndzemVqIHogbmljaC4gSmW/ZWxpIGV0eWtpZXRhIG5pZSBpc3RuaWplIHd5a29ueXdhbmllIHBsaWt1IHpvc3RhamVcblwKcHJ6ZXJ3YW5lLlxuIgoKICBXQ01EX0hFTFAsICAgIlBvbW9jIG8gSEVMUFxuIgoKICBXQ01EX0lGLAoiSUYgamVzdCB1v3l3YW5lIGRvIHdhcnVua293ZWdvIHd5a29ueXdhbmlhIHBvbGVjZfFcblwKXG5cClNrs2FkbmlhOglJRiBbTk9UXSBFWElTVCBuYXp3YV9wbGlrdSBrb21lbmRhXG5cCglJRiBbTk9UXSBjablnX3puYWvzdzE9PWNpuWdfem5ha/N3MiBrb21lbmRhXG5cCglJRiBbTk9UXSBFUlJPUkxFVkVMIG51bWVyIGtvbWVuZGFcblwKXG5cClcgZHJ1Z2llaiBmb3JtaWUgKGNpuWdfem5ha/N3MT09Y2m5Z196bmFr83cyKSBjablnIHpuYWvzdyBtdXNpIGJ55iB6YXdhcnR5IHdcblwKY3Vkenlzs293aWUuUHJ6eSBwb3Lzd255d2FuaXUgcG9taWphbmEgamVzdCB3aWVsa2+c5iB6bmFr83cuXG4iCgogIFdDTURfTEFCRUwsICAiTEFCRUwgamVzdCB1v3l3YW5lIGRvIHVzdGF3aWVuaWEgZXR5a2lldHkgZHlza3UuXG5cClxuXApTa7NhZG5pYTogTEFCRUwgW2R5c2s6XVxuXApLb21lbmRhIHBvcHJvc2kgbyBwb2RhbmllIG5vd2VqIGV0eWtpZXR5IGR5c2t1LlxuXApNb79lc3ogd3mcd2lldGxp5iBha3R1YWxuuSBldHlraWV06iBrb21lbmS5IFZPTC5cbiIKCiAgV0NNRF9NRCwgICAgICJQb21vYyBvIE1EXG4iCiAgV0NNRF9NS0RJUiwgICJQb21vYyBvIE1LRElSXG4iCiAgV0NNRF9NT1ZFLAoiTU9WRSB6bWllbmlhIHBvs2+/ZW5pZSB3eWJyYW5lZ28gcGxpa3UgbHViIGthdGFsb2d1LlxuXApcblwKSmW/ZWxpIHByemVtaWVzemN6YW55IGplc3Qga2F0YWxvZyB3c3p5c3RraWUgcG9ka2F0YWxvZ2lcblwKaSBwbGlraSBzuSB0YWu/ZSBwcnplc/N3YW5lLlxuXApcblwKTU9WRSBkemlhs2EgdHlsa28gdyBvYnLqYmllIGplZG5lZ28gZHlza3UuXG4iCgogIFdDTURfUEFUSCwKIlBBVEggd3mcd2l0bGEgbHViIHptaWVuaWEgnGNpZb9rZSB3IGt083JlaiB3eXN6dWt1amUgd2NtZC5cblwKXG5cCktvbWVuZGEgUEFUSCBiZXogcGFyYW1ldHLzdyB3eZx3aWV0bGEgYWt0dWFsbrkgnGNpZb9r6i4gQWJ5IGq5XG5cCnptaWVuaeYgbmFsZb95IHd5d2+zYeYgUEFUSCB6YSBrdPNyeW0gd3lzdOpwdWplIG5vd2EgnGNpZb9rYS5cblwKXG5cClVtaWVzemN6ZW5pZSB3eXJhv2VuaWEgJVBBVEglIHByenkgcG9hd2FuaXUgbm93ZWognGNpZb9raVxuXApwb3dvZHVqZSB3c3Rhd2llbmllIHN0YXJlaiCcY2llv2tpLCBuYSBwcnp5a7NhZDpcblwKCQlQQVRIICVQQVRIJTtjOlxcdGVtcCBcbiIKCiAgV0NNRF9QQVVTRSwKIlBBVVNFIHd5nHdpZXRsYSBpbmZvcm1hY2plICdOYWNpnG5paiBFbnRlciBhYnkga29udHludW93YeYnIGkgY3pla2EsXG5cCmG/IHW/eXRrb3duaWsgbmFjaZxuaWUga2xhd2lzeiBFbnRlci4gRnVua2NqYSB0YSBqZXN0IHW/eXRlY3puYSB3IHBsaWthY2hcblwKdHlwdSBiYXQsIGFieSB1bW+/bGl3aeYgdb95dGtvd25pa293aSBwcnplY3p5dGFuaWUgaW5mb3JtYWNqaSB3eZx3aWV0bG9ueWNoXG5cCm5hIGVrcmFuaWUuXG4iCgogIFdDTURfUFJPTVBULAoiUFJPTVBUIHVzdGF3aWEgdGVrc3Qgemezb3N6ZW5pYSBrb25zb2xpLlxuXApcblwKVGVrc3Qgd3lzdOpwdWq5Y3kgemEga29tZW5kuSAoaSBzcGFjamUgd3lzdOpwdWq5Y2UgemEgbmltKVxuXApwb2phd2lharkgc2nqIG5hIHBvY3q5dGt1IGxpbmkgZ2R5IHdjbWQgY3pla2EgbmEga29tZW5k6i5cblwKXG5cCk5hc3TqcHVquWNlIGNpuWdpIHpuYWvzdyBtYWq5IHNwZWNqYWxuZSB6bmFjemVuaWU6XG5cClxuXAokJCAgICBabmFrIGRvbGFyYSAoJCkgICAgICRfICAgIFpuYWsgXyAgICAgICAgICAgICAgJGIgICAgWm5hayB8XG5cCiRkICAgIERhdGEgICAgICAgICAgICAgICAgJGUgICAgRXNjYXBlICAgICAgICAgICAgICAkZyAgICBabmFrID5cblwKJGwgICAgWm5hayA8ICAgICAgICAgICAgICAkbiAgICBEeXNrICAgICAgICAgICAgICAgICRwICAgIIxjaWW/a2FcblwKJHEgICAgWm5hayA9ICAgICAgICAgICAgICAkdCAgICBDemFzICAgICAgICAgICAgICAgICR2ICAgIFdlcnNqYSB3Y21kXG5cClxuXApXcGlzYW5pZSBQUk9NUFQgYmV6IG9wY2ppIHJlc2V0dWplIHVzdGF3aWVuaWEga29uc29saSB6d2m5emFuZSB6IGtvbWVuZLlcblwKUFJPTVBULCB1c3Rhd2lhIHd5nHdpZXRsYW55IHRla3N0IG5hIJxjaWW/a2UgaSB6bmFrID4uXG5cCihUYWsgc2FtbyBqYWsgcG9sZWNlbmllIFBST01QVCAkcCRnKS5cblwKXG5cClBvbGVjZW5pZSAnU0VUIFBST01QVD10ZWtzdCcgbWEgdGFraSBzYW0gZWZla3QgamFrICdQUk9NUFQgdGVrc3QnXG4iCgogIFdDTURfUkVNLAoiUG9sZWNlbmllIHBvcHJ6ZWR6b25lIGtvbWVuZLkgUkVNIG5pZSBqZXN0IHd5a29ueXdhbmUsIG1vv2UgYnnmXG5cCnN0b3Nvd2FuZSBqYWtvIGtvbWVudGG/IHcgcGxpa3UgdHlwdSBiYXQuXG4iCgogIFdDTURfUkVOLCAgICAiUG9tb2MgbyBSRU5cbiIKICBXQ01EX1JFTkFNRSwgIlBvbW9jIG8gUkVOQU1FXG4iCiAgV0NNRF9SRCwgICAgICJQb21vYyBvIFJEXG4iCiAgV0NNRF9STURJUiwgICJQb21vYyBvIFJNRElSXG4iCgogIFdDTURfU0VULAoiU0VUIHd5nHdpZXRsYSBsdWIgdXN0YXdpYSB6bWllbm5lIJxyb2Rvd2lza293ZSB3Y21kLlxuXApcblwKU0VUIGJleiBwYXJhbWV0cvN3IHd5nHdpdGxhIHdzenlzdGtpZSB1c3Rhd2lvbmUgem1pZW5uZS5cblwKXG5cClNrs2FkbmlhIHBvbGVjZW5pYSAoYnkgdXR3b3J6eeYgbHViIHptb2R5Zmlrb3dh5iB6bWllbm65OlxuXApcblwKICAgICAgU0VUIDx6bWllbm5hPj08d2FydG+c5j5cblwKXG5cCmdkemllIDx6bWllbm5hPiBpIDx3YXJ0b5zmPiBzuSBjablnYW1pIHpuYWvzdy4gU3BhY2phIG5pZSBtb79lXG5cCnd5c3TqcG93YeYgcHJ6ZWQgem5ha2llbSBy83dub5xjaSwgbmF6d2Egem1pZW5uZWogbmllIG1vv2UgemF3aWVyYeZcblwKc3BhY2ppLlxuXApcblwKUG9kIFdpbmUnZW0gem1pZW5uZSCccm9kb3dpc2tvd2Ugc3lzdGVtdSBvcGVyYWN5am5lZ28gc7kgZG9kYXdhbmUgZG9cblwKem1pZW5ueWNoIJxyb2Rvd2lza293eWNoIFdpbjMyLCB6dGVnbyBwb3dvZHUgamVzdCB3aepjZWogem1pZW5ueWNoIG5pv1xuXAp3IGltcGxlbWVudGFjamkgV2luMzIuIFdpbmUgbmllIG1vZHlmaWt1amUgem1pZW5ueWNoIJxyb2Rvd2lza293eWNoXG5cCnN5c3RlbXUuXG4iCgogIFdDTURfU0hJRlQsCiJTSElGVCBqZXN0IHW/eXdhbmUgdyBwbGlrYWNoIGJhdCBkbyB1c3VuaepjaWEgcGllcndzemVnbyBwYXJhbWV0cnUgeiBsaXN0eVxuXApwYXJhbWV0cvN3LCBwYXJhbWV0ciAyIHN0YWplIHNpZSAxIGl0ZC4gUG9sZWNlbmllIHRvIG5pZSBtYSBlZmVrdHUgZ2R5IGplc3RcblwKd3l3b7N5d2FuZSB6IGxpbmkga29tZW5kLlxuIgoKICBXQ01EX1RJTUUsICAgIlBvbW9jIG8gVElNRVxuIgoKICBXQ01EX1RJVExFLCAgIlVzdGF3aWEgbmF6d+ogb2tuYSB3Y21kLCBza7NhZG5pYSBUSVRMRSBbY2m5ZyB6bmFr83ddXG4iCgogIFdDTURfVFlQRSwKIlRZUEUgPG5hendhIHBsaWt1PiB3eZx3aWV0bGEgemF3YXJ0b5xjIHBsaWt1LCBuaWUgamVzdCBzcHJhd2R6YW5lLCBjenlcblwKamVzdCBvbiBwbGlraWVtIHRla3N0b3d5bS5cbiIKCiAgV0NNRF9WRVJJRlksCiJWRVJJRlkgamVzdCB1v3l3YW5lIGRvIHVzdGF3aWVuaWEgd2FydG+cY2kgZmxhZ2kgdmVyaWZ5LiBQcmF3aWSzb3dhIHNrs2FkbmlhOlxuXApcblwKVkVSSUZZIE9OCVVzdGF3aWEgZmxhZ+pcblwKVkVSSUZZIE9GRglVc3V3YSBmbGFn6lxuXApWRVJJRlkJCVd5nHdpZXRsYSBPTiBsdWIgT0ZGIHcgemFsZb9ub5xjaSBvZCBzdGFudSBmbGFnaS5cblwKXG5cClVzdGF3aWVuaWEgZmxhZ2kgbmljIG5pZSB6bWllbmlharkgcG9kIFdpbmUnZW0uXG4iCgogIFdDTURfVkVSLAoiVkVSIHd5nHdpZXRsYSB3ZXJzauogd2NtZC5cbiIKCiAgV0NNRF9WT0wsICAgICJQb21vYyBvIFZPTFxuIgoKICBXQ01EX0VYSVQsCiJFWElUIGtv8WN6eSBiaWVyerljuSBzZXNq6iB3Y21kIGkgcG93cmFjYSBkbyBzeXN0ZW11IG9wZXJhY3lqbmVnb1xuXApsdWIgcG93s29raSwgdyBrdPNyZWogdXJ1Y2hvbWlvbm8gd2NtZC5cbiIKCiAgMTAwMCwgIldDTUQgLSB3YnVkb3dhbmUga29tZW5keTpcblwKQVRUUklCXHRcdFBva2F6dWplIGx1YiB6bWllbmlhIGF0cnlidXR5IHBsaWt1XG5cCkNBTExcdFx0V3l3b7N1amUgcGxpayBiYXQgeiBpbm5lZ28gcGxpa3VcblwKQ0QgKENIRElSKVx0Wm1pZW5pYSBiaWVyerljeSBrYXRhbG9nXG5cCkNMU1x0XHRDenmcY2kgZWtyYW4ga29uc29saVxuXApDT1BZXHRcdEtvcGl1amUgcGxpa1xuXApDVFRZXHRcdFptaWVuaWEgdXJ6uWR6ZW5pZSB3eWqcY2lhL3dlapxjaWFcblwKREFURVx0XHRQb2thenVqZSBsdWIgem1pZW5pYSBkYXRlIHN5c3RlbW93uVxuXApERUwgKEVSQVNFKVx0VXN1d2EgcGxpayBsdWIgcGxpa2lcblwKRElSXHRcdFd5nHdpZXRsYSB6YXdhcnRvnOYga2F0YWxvZ3VcblwKRUNIT1x0XHRLb3BpdWplIHRla3N0IG5hIHd5apxjaWUga29uc29saVxuXApIRUxQXHRcdFd5nHdpZXRsYSBkb2uzYWRuaWVqc3q5IHBvbW9jIG8ga29tZW5kemllXG5cCk1EIChNS0RJUilcdFR3b3J6eSBrYXRhbG9nXG5cCk1PVkVcdFx0UHJ6ZW5vc2kga2F0YWxvZyBsdWIgcGxpa2lcblwKUEFUSFx0XHRVc3Rhd2lhIGx1YiB3eZx3aWV0bGEgnGNpZb9r6iBwcnplc3p1a2l3YW5pYVxuXApQUk9NUFRcdFx0Wm1pZW5pYSB0ZWtzdCB6Z7Nvc3plbmlhXG5cClJFTiAoUkVOQU1FKVx0Wm1pZW5pYSBuYXp36iBwbGlrdVxuXApSRCAoUk1ESVIpXHRVc3V3YSBrYXRhbG9nXG5cClNFVFx0XHRVc3Rhd2lhIGx1YiB3eZx3aWV0bGEgem1pZW5uZSCccm9kb3dpc2tvd2VcblwKVElNRVx0XHRVc3Rhd2lhIGx1YiB3eZx3aWV0bGEgY3phc1xuXApUSVRMRVx0XHRVc3Rhd2lhIHR5dHWzIG9rbmEgV0NNRFxuXApUWVBFXHRcdFd5nHdpZXRsYSB6YXdhcnRvnOYgcGxpa3VcblwKVkVSXHRcdFd5nHdpZXRsYSB3ZXJzauogV0NNRFxuXApWT0xcdFx0V3mcd2lldGxhIGV0eWtpZXTqIGR5c2t1XG5cCkVYSVRcdFx0V3mzuWN6YSBXQ01EXG5cblwKV3Bpc3ogSEVMUCA8a29tZW5kYT4gZGxhIGRva7NhZG5pZWpzenljaCBpbmZvcm1hY2ppIG8ga29tZW5kemllXG4iCn0K