LyoKICogb2xlZGxnIGRsbCByZXNvdXJjZXMKICogRnJlbmNoIGxhbmd1YWdlIHN1cHBvcnQKICoKICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgSm9uYXRoYW4gRXJuc3QKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgInJlc291cmNlLmgiCgpMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCgpVSUlOU0VSVE9CSkVDVCBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDI5NCwgMTUxClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkluc+lyZXIgT2JqZXQiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBJRENfT0JKVFlQRUxJU1QsODIsMTksMTMxLDY2LExCU19TT1JUIHwKICAgICAgICAgICAgICAgICAgICBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMIHwKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QCiAgICBMVEVYVCAgICAgICAgICAgIlR5cGUgZCdvYmpldCA6IixJRENfT0JKVFlQRUxCTCw4Miw3LDUzLDgsV1NfVklTSUJMRQogICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywyMjEsNyw2NiwxNAogICAgUFVTSEJVVFRPTiAgICAgICJBbm51bGVyIixJRENBTkNFTCwyMjEsMjQsNjYsMTQKICAgIEdST1VQQk9YICAgICAgICAiUulzdWx0YXQiLElEQ19SRVNVTFQsNywxMDMsMjA4LDQxCiAgICBDT05UUk9MICAgICAgICAgIkNy6WVyIG5vdXZlYXUiLElEQ19DUkVBVEVORVcsIkJ1dHRvbiIsQlNfQVVUT1JBRElPQlVUVE9OIHwgCiAgICAgICAgICAgICAgICAgICAgV1NfR1JPVVAsNywyMCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJDcullciBsZSBjb250cvRsZSIsSURDX0NSRUFURUNPTlRST0wsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgTk9UIFdTX1ZJU0lCTEUsNyw1NCw2MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJDcullciBkZXB1aXMgbGUgZmljaGllciIsSURDX0NSRUFURUZST01GSUxFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiw3LDM3LDY3LDEwCiAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX1JFU1VMVERFU0MsNDksMTEyLDE1OSwyMwogICAgUFVTSEJVVFRPTiAgICAgICImQWpvdXRlIENvbnRy9GxlLi4uIixJRENfQUREQ09OVFJPTCw4MSw4OCw2MywxNCxOT1QgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAgICJBZmZpY2hlciBjb21tZSBpY/RuZSIsSURDX0FTSUNPTiwiQnV0dG9uIixCU19BVVRPQ0hFQ0tCT1ggfCAKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QIHwgTk9UIFdTX1ZJU0lCTEUsMjIzLDU4LDY0LDEwCiAgICBQVVNIQlVUVE9OICAgICAgIlBhcmNvdXJpci4uLiIsSURDX0JST1dTRSw4Myw1Myw1MCwxNCxOT1QgV1NfVklTSUJMRQogICAgTFRFWFQgICAgICAgICAgICJGaWNoaWVyIDoiLElEQ19GSUxFTEJMLDgzLDI3LDIwLDgsIE5PVCBXU19WSVNJQkxFCiAgICBFRElUVEVYVCAgICAgICAgSURDX0ZJTEUsODMsMzcsMTMyLDEzLEVTX0FVVE9IU0NST0xMIHwgTk9UIFdTX1ZJU0lCTEUKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgSURTX1JFU1VMVE9CSkRFU0MJIkluc+lyZXIgdW4gbm91dmVsIG9iamVjdCAlcyBkYW5zIHZvdHJlIGRvY3VtZW50IgogIElEU19SRVNVTFRGSUxFT0JKREVTQwkiSW5z6HJlIGxlIGNvbnRlbnUgZHUgZmljaGllciBjb21tZSB1biBvYmpldCBkYW5zIHZvdHJlIGRvY3VtZW50IGFmaW4gcXVlIHZvdXMgcHVpc3NpZXogbCdhY3RpdmVyIGVuIHV0aWxpc2FudCBsZSBwcm9ncmFtbWUgYXZlYyBsZXF1ZWwgaWwgYSDpdOkgY3Lp6S4iCiAgSURTX0JST1dTRSAgICAgICAgICAgICJQYXJjb3VyaXIiCiAgSURTX05PVE9MRU1PRCAgICAgICAgICJMZSBmaWNoaWVyIG5lIHNlbWJsZSBwYXMg6nRyZSB1biBtb2R1bGUgT0xFIHZhbGlkZS4gSW1wb3NzaWJsZSBkJ2VucmVnaXN0cmVyIGxlIGNvbnRy9GxlIE9MRS4iCiAgSURTX05PVE9MRU1PRENBUFRJT04gICJBam91dGVyIHVuIGNvbnRy9GxlIgp9CgpJRERfUEFTVEVTUEVDSUFMNCBESUFMT0cgRElTQ0FSREFCTEUgMywgMTUsIDI5MywgMTQwClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19TRVRGT05UIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJDb2xsYWdlIHNw6WNpYWwiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExURVhUICAgICAgICAgIlNvdXJjZSA6IiwgLTEsIDYsIDksIDMwLCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIENPTlRST0wgICAgICAgIkMmb2xsZXIiLCBJRENfUFNfUEFTVEUsICJCdXR0b24iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICA2LCAzOCwgNTUsIDEwCiAgICBDT05UUk9MICAgICAgICJDb2xsZXIgbGUgJmxpZW4iLCBJRENfUFNfUEFTVEVMSU5LLCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgNiwgNjMsIDU1LCAxMAogICAgTFRFWFQgICAgICAgICAiJkNvbW1lIDoiLCAtMSwgNjUsIDI1LCAxNiwgOCwgV1NfVklTSUJMRSB8IFdTX0dST1VQCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19QQVNURUxJU1QsICAgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgTk9UIFdTX1ZJU0lCTEUKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElOS0xJU1QsIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfRElTUExBWUxJU1QsICAgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUKICAgIENPTlRST0wgICAgICAgIk9LIiwgSURPSywgIkJ1dHRvbiIsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCAyMjQsIDYsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiQW5udWxlciIsIElEQ0FOQ0VMLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDIzLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIkFpZCZlIiwgSURDX09MRVVJSEVMUCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCA0MiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICImQWZmaWNoZXIgY29tbWUgaWP0bmUiLCBJRENfUFNfRElTUExBWUFTSUNPTiwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDU5LCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19JQ09ORElTUExBWSwgIlN0YXRpYyIsIFNTX0lDT04gfCBXU19WSVNJQkxFLCAyMjQsIDc1LCA2NiwgNDQKICAgIENPTlRST0wgICAgICAgIkNoYW5nZXIgbCcmaWP0bmUuLi4iLCBJRENfUFNfQ0hBTkdFSUNPTiwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjI0LCAxMjMsIDY2LCAxNAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1JFU1VMVElNQUdFLCAiU3RhdGljIiwgU1NfSUNPTiB8IFdTX1ZJU0lCTEUsIDgsIDEwMSwgNDIsIDM0CiAgICBDT05UUk9MICAgICAgICI8PCBsZSBy6XN1bHRhdCB2aWVudCBpY2kgPj4iLCBJRENfUFNfUkVTVUxUVEVYVCwgIlN0YXRpYyIsIFNTX05PUFJFRklYIHwgV1NfVklTSUJMRSwgNTQsIDEwMCwgMTU5LCAzNQogICAgQ09OVFJPTCAgICAgICAiUulzdWx0YXQiLCAtMSwgIkJ1dHRvbiIsIEJTX0dST1VQQk9YIHwgV1NfR1JPVVAgfCBXU19WSVNJQkxFLCA2LCA5MCwgMjEyLCA0OAogICAgQ09OVFJPTCAgICAgICAiIiwgSURDX1BTX1NPVVJDRVRFWFQsICJFZGl0IiwgRVNfUkVBRE9OTFkgfCBFU19BVVRPSFNDUk9MTCB8IFdTX1ZJU0lCTEUsIDM3LCA5LCAxODAsIDgKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBJRFNfUFNfUEFTVEVfREFUQSAgICAgICAgICAgICAgICAgICAgICJJbnPocmUgbGUgY29udGVudSBkdSBwcmVzc2UtcGFwaWVycyBkYW5zIHZvdHJlIGRvY3VtZW50IGNvbW1lICVzLiIKICAgIElEU19QU19QQVNURV9PQkpFQ1QgICAgICAgICAgICAgICAgICAgIkluc+hyZSBsZSBjb250ZW51IGR1IHByZXNzZS1wYXBpZXJzIGRhbnMgdm90cmUgZG9jdW1lbnQgZGUgc29ydGUgcXVlIHZvdXMgcHVpc3NpZXogbCdhY3RpdmVyIGVuIHV0aWxpc2FudCAlcy4iCiAgICBJRFNfUFNfUEFTVEVfT0JKRUNUX0FTX0lDT04gICAgICAgICAgICJJbnPocmUgbGUgY29udGVudSBkdSBwcmVzc2UtcGFwaWVycyBkYW5zIHZvdHJlIGRvY3VtZW50IGRlIHNvcnRlIHF1ZSB2b3VzIHB1aXNzaWV6IGwnYWN0aXZlciBlbiB1dGlsaXNhbnQgJXMuIElsIHNlcmEgYWZmaWNo6SBjb21tZSB1bmUgaWP0bmUuIgogICAgSURTX1BTX1BBU1RFX0xJTktfREFUQSAgICAgICAgICAgICAgICAiSW5z6HJlIGxlIGNvbnRlbnUgZHUgcHJlc3NlLXBhcGllcnMgZGFucyB2b3RyZSBkb2N1bWVudCBjb21tZSAlcy4gTGVzIGRvbm7pZXMgc29udCBsaellcyBhdSBmaWNoaWVyIHNvdXJjZSBkZSBzb3J0ZSBxdWUgbGVzIG1vZGlmaWNhdGlvbnMgZGUgY2VsbGVzLWNpIHNlcm9udCBy6XBlcmN1dOllcyBkYW5zIHZvdHJlIGRvY3VtZW50LiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVCAgICAgICAgICAgICAgIkluc+hyZSBsZSBjb250ZW51IGR1IHByZXNzZS1wYXBpZXJzIGRhbnMgdm90cmUgZG9jdW1lbnQuIEwnaW1hZ2UgZXN0IGxp6WUgYXUgZmljaGllciBzb3VyY2UgZGUgc29ydGUgcXVlIGxlcyBtb2RpZmljYXRpb25zIGRlIGNlbGxlLWNpIHNlcm9udCBy6XBlcmN1dOllcyBkYW5zIHZvdHJlIGRvY3VtZW50LiIKICAgIElEU19QU19QQVNURV9MSU5LX09CSkVDVF9BU19JQ09OICAgICAgIkluc+hyZSB1biByYWNjb3VyY2kgcXVpIHBvaW50ZSB2ZXJzIGwnZW1wbGFjZW1lbnQgZHUgY29udGVudSBkdSBwcmVzc2UtcGFwaWVycy4gTGUgcmFjY291cmNpIGVzdCBsaekgYXUgZmljaGllciBzb3VyY2UgZGUgc29ydGUgcXVlIGxlcyBtb2RpZmljYXRpb25zIGRlIGNlbHVpLWNpIHNlcm9udCBy6XBlcmN1dOllcyBkYW5zIHZvdHJlIGRvY3VtZW50LiIKICAgIElEU19QU19OT05fT0xFICAgICAgICAgICAgICAgICAgICAgICAgIkluc+hyZSBsZSBjb250ZW51IGR1IHByZXNzZS1wYXBpZXJzIGRhbnMgdm90cmUgZG9jdW1lbnQuIgogICAgSURTX1BTX1VOS05PV05fVFlQRSAgICAgICAgICAgICAgICAgICAiVHlwZSBpbmNvbm51IgogICAgSURTX1BTX1VOS05PV05fU1JDICAgICAgICAgICAgICAgICAgICAiU291cmNlIGluY29ubnVlIgogICAgSURTX1BTX1VOS05PV05fQVBQICAgICAgICAgICAgICAgICAgICAibGUgcHJvZ3JhbW1lIGF2ZWMgbGVxdWVsIGlsIGEg6XTpIGNy6ekiCn0K