LyoKICogV2luZUZpbGUKICogSHVuZ2FyaWFuIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDAgTWFydGluIEZ1Y2hzCiAqIENvcHlyaWdodCAyMDAyIFN0ZXZlbiBFZHdhcmRzCiAqIENvcHlyaWdodCAyMDAyIEFsZXhhbmRyZSBKdWxsaWFyZAogKiBDb3B5cmlnaHQgMjAwMiBab2x5IE5hZ3kKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgInJlc291cmNlLmgiCgpMQU5HVUFHRSBMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUCgovKiBNZW51ICovCgpJRE1fV0lORUZJTEUgTUVOVSBGSVhFRCBJTVBVUkUKewogICAgUE9QVVAgIiZG4WpsIiAgewogICAgICAgIE1FTlVJVEVNICImTWVneW5pdOFzXHRFbnRlciIsICAgICAgICAgICBJRF9BQ1RJVkFURQogICAgICAgIE1FTlVJVEVNICLBdCZoZWx5ZXrpcy4uLlx0RjciLCAgICAgICAgICBJRF9GSUxFX01PVkUKICAgICAgICBNRU5VSVRFTSAiJk3hc29s4XMuLi5cdEY4IiwgICAgICAgICAgICAgSURfRklMRV9DT1BZCiAgICAgICAgTUVOVUlURU0gIiZW4WfzbGFwb24uLi5cdEY5IiwgICAgICAgICAgIDExOAogICAgICAgIE1FTlVJVEVNICImVPZybOlzXHREZWwiLCAgICAgICAgICAgICAgICBJRF9GSUxFX0RFTEVURQogICAgICAgIE1FTlVJVEVNICLBdCZuZXZleulzLi4uIiwgICAgICAgICAgICAgICAxMDkKICAgICAgICBNRU5VSVRFTSAiVCZ1bGFqZG9uc+Fnb2suLi5cdEFsdCtFbnRlciIsIElEX0VESVRfUFJPUEVSVElFUwogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImQmVjc29tYWdvbOFzLi4uIiwgICAgICAgICAgICAxMTkKICAgICAgICBNRU5VSVRFTSAiSyZpY3NvbWFnb2zhcy4uLiIsICAgICAgICAgICAgMTIwCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIiZGdXR0YXThcy4uLiIsICAgICAgICAgICAgICAgIElEX0VYRUNVVEUKICAgICAgICBNRU5VSVRFTSAiJk55b210YXThcy4uLiIsICAgICAgICAgICAgICAgMTAyCiAgICAgICAgTUVOVUlURU0gIlThcnPtdOFzLi4uIiwgICAgICAgICAgICAgICAgIDEwMwogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICLaaiAmbWFwcGEuLi4iLCAgICAgICAgICAgICAgICAxMTEKICAgICAgICBNRU5VSVRFTSAiS2VyZSZz6XMuLi4iLCAgICAgICAgICAgICAgICAgMTA0CiAgICAgICAgTUVOVUlURU0gIkbhamxvayBraSZ24Wxhc3p04XNhLi4uIiwgICAgIDExNgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgojaWZuZGVmIF9OT19FWFRFTlNJT05TCiAgICAgICAgTUVOVUlURU0gIiZLaWzpcOlzXHRBbHQrWCIsICAgICAgICAgICAgIElEX0ZJTEVfRVhJVAojZWxzZQogICAgICAgIE1FTlVJVEVNICImS2ls6XDpcyIsICAgICAgICAgICAgICAgICAgICBJRF9GSUxFX0VYSVQKI2VuZGlmCiAgICB9CgogICAgUE9QVVAgIiZMZW1leiIgIHsKICAgICAgICBNRU5VSVRFTSAiTGVtZXogJm3hc29s4XNhLi4uIiwgICAgICAgICAgMjAxCiAgICAgICAgTUVOVUlURU0gIiZMZW1lemNpbWtlLi4uIiwgICAgICAgICAgICAgIDIwMgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImRm9ybWF04Wzhcy4uLiIsICAgICAgICAgICAgICBJRF9GT1JNQVRfRElTSwojaWZkZWYgX1dJTjk1CiAgICAgICAgTUVOVUlURU0gIiZSZW5kc3plcmxlbWV6IGvpc3rtdOlzZS4uLiIsIC0xICAvKlRPRE8qLwojZW5kaWYKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiJkjhbPN6YXRpIG1lZ2hhanTzIGNzYXRsYWtvenRhdOFzYSIsSURfQ09OTkVDVF9ORVRXT1JLX0RSSVZFCiAgICAgICAgTUVOVUlURU0gIkjhbPN6YXRpIG1lZ2hhanTzIGxlduFsYXN6dOFzYSIsSURfRElTQ09OTkVDVF9ORVRXT1JLX0RSSVZFCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIk1lZ29zenThcy4uLiIsICAgICAgICAgICAgICAgIDI1NAogICAgICAgIE1FTlVJVEVNICJNZWdvc3p04XMgJm1lZ3N6/G50ZXTpc2UuLi4iLCAyNTUKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiTWVnaGFqdPMga2kmduFsYXN6dOFzYS4uLiIsICAgMjUxCiAgICB9CgogICAgUE9QVVAgIiZNYXBw4WsiICB7CiAgICAgICAgTUVOVUlURU0gIiZL9nZldGtlevUgc3ppbnRcdCsiLCAgICAgICAgIDMwMQogICAgICAgIE1FTlVJVEVNICImRmEga2lueWl04XNhXHQqIiwgICAgICAgICAgICAzMDIKICAgICAgICBNRU5VSVRFTSAiJk1pbmRlbiBraW55aXThc2FcdFN0cmcrKiIsICAgMzAzCiAgICAgICAgTUVOVUlURU0gIkZhICZiZWNzdWvhc2FcdC0iLCAgICAgICAgICAgIDMwNAogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImR3llcm1la2VrIGtpamVs9mzpc2UiLCAgICAgICA1MDUKICAgIH0KCiAgICBQT1BVUCAiJk7pemV0IiAgewogICAgICAgIE1FTlVJVEVNICImVGVsamVzIiwgICAgICAgICAgICAgICAgICAgICA0MTMKICAgICAgICBNRU5VSVRFTSAiJkv2bnl2dOFyZmEiLCAgICAgICAgICAgICAgICAgNDExCiAgICAgICAgTUVOVUlURU0gIiZDc2FrIG1hcHDhayIsICAgICAgICAgICAgICAgIDQxMgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImRmVsb3N6dOFzIiwgICAgICAgICAgICAgICAgICBJRF9WSUVXX1NQTElUCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIiZO6XYiLCAgICAgICAgICAgICAgICAgICAgICAgIElEX1ZJRVdfTkFNRQogICAgICAgIE1FTlVJVEVNICImTWluZGVuIHLpc3psZXQiLCAgICAgICAgICAgICBJRF9WSUVXX0FMTF9BVFRSSUJVVEVTLCBDSEVDS0VECiAgICAgICAgTUVOVUlURU0gIiZFZ3llZGkuLi4iLCAgICAgICAgICAgICAgICAgIElEX1ZJRVdfU0VMRUNURURfQVRUUklCVVRFUwogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImUmVuZGV66XMgbul2IHN6ZXJpbnQiLCAgICAgICBJRF9WSUVXX1NPUlRfTkFNRQogICAgICAgIE1FTlVJVEVNICJSZW5kZXrpcyBrJml0ZXJqZXN6dOlzIHN6ZXJpbnQiLElEX1ZJRVdfU09SVF9UWVBFCiAgICAgICAgTUVOVUlURU0gIlJlbmRleulzICZt6XJldCBzemVyaW50IiwgICAgIElEX1ZJRVdfU09SVF9TSVpFCiAgICAgICAgTUVOVUlURU0gIlJlbmRleulzICZk4XR1bSBzemVyaW50IiwgICAgIElEX1ZJRVdfU09SVF9EQVRFCiAgICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICAgTUVOVUlURU0gIkVneWVkaSByZW5kZXrpcyAmLi4uIiwgICAgICAgIElEX1ZJRVdfRklMVEVSCiAgICB9CgogICAgUE9QVVAgIiZCZeFsbO104XNvayIgIHsKICAgICAgICBNRU5VSVRFTSAiJk1lZ2Vy9XPtdOlzLi4uIiwgICAgICAgICAgICAgNTAxCiAgICAgICAgTUVOVUlURU0gIiZCZXT7a+lzemxldC4uLiIsICAgICAgICAgICAgIElEX1NFTEVDVF9GT05UCiAgICAgICAgTUVOVUlURU0gIkUmZ3llZGkgZXN6a/Z6dOFyLi4uIiwgICAgICAgIDUxMgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICImRXN6a/Z6dOFyIiwgICAgICAgICAgICAgICAgICBJRF9WSUVXX1RPT0xfQkFSLCBDSEVDS0VECiAgICAgICAgTUVOVUlURU0gIiZMZW1lenThciIsICAgICAgICAgICAgICAgICAgIElEX1ZJRVdfRFJJVkVfQkFSLCBDSEVDS0VECiAgICAgICAgTUVOVUlURU0gIibBbGxhcG90c29yIiwgICAgICAgICAgICAgICAgIElEX1ZJRVdfU1RBVFVTQkFSLCBDSEVDS0VECiNpZm5kZWYgX05PX0VYVEVOU0lPTlMKICAgICAgICBNRU5VSVRFTSAiJlRlbGplcyBr6XBlcm559XNcdEN0cmwrU2hpZnQrUyIsSURfVklFV19GVUxMU0NSRUVOCiNlbmRpZgogICAgICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICAgICAgIE1FTlVJVEVNICJQcm9ncmFtZnV0dGF04XMgdXThbmkgJnN6aW1i82x1bSIsNTA0CiAgICAgICAgTUVOVUlURU0gIk1lZ3N6/G50ZXTpcyBhIHThcm9s4XMgduln6W4iLDUxMQogICAgfQoKCiAgICBQT1BVUCAiJkJpenRvbnPhZyIgIHsKICAgICAgICBNRU5VSVRFTSAiJkhvenrhZuly6XMuLi4iLCAgICAgICAgICAgICAgNjA1CiAgICAgICAgTUVOVUlURU0gIiZOYXBs83rhcy4uLiIsICAgICAgICAgICAgICAgIDYwNgogICAgICAgIE1FTlVJVEVNICImVHVsYWpkb25vcy4uLiIsICAgICAgICAgICAgICA2MDcKICAgIH0KCiAgICBQT1BVUCAiJkFibGFrb2siICB7CiAgICAgICAgTUVOVUlURU0gItpqIGEmYmxhayIsICAgICAgICAgICAgICAgICAgIElEX1dJTkRPV19ORVcKICAgICAgICBNRU5VSVRFTSAiTOlwY3P1emV0ZXMgZWxyZW5kZXrpc1x0Q3RybCtGNSIsSURfV0lORE9XX0NBU0NBREUKICAgICAgICBNRU5VSVRFTSAiTW96YWlrc3plcvsgZWxyZW5kZXrpcyAmdu16c3ppbnRlc2VuIixJRF9XSU5ET1dfVElMRV9IT1JaCiAgICAgICAgTUVOVUlURU0gIk1vemFpa3N6ZXL7IGVscmVuZGV66XMgZvwmZ2f1bGVnZXNlblx0Q3RybCtGNCIsSURfV0lORE9XX1RJTEVfVkVSVAojaWZuZGVmIF9OT19FWFRFTlNJT05TCiAgICAgICAgTUVOVUlURU0gIkF1dG9tYXRpa3VzIGVscmVuZGV66XMiLCAgICAgIElEX1dJTkRPV19BVVRPU09SVAojZW5kaWYKICAgICAgICBNRU5VSVRFTSAiJlN6aW1i82x1bSBlbHJlbmRleulzIiwgICAgICAgSURfV0lORE9XX0FSUkFOR0UKICAgICAgICBNRU5VSVRFTSAiJkZyaXNz7XTpc1x0RjUiLCAgICAgICAgICAgICAgSURfUkVGUkVTSAogICAgfQoKICAgIFBPUFVQICImPyIgIHsKICAgICAgICBNRU5VSVRFTSAiJlP6Z/MgdOltYWv2cvZrXHRGMSIsICAgICAgICAgSURfSEVMUAogICAgICAgIE1FTlVJVEVNICJT+mfzICZrZXJlc+lzLi4uXHRGMSIsICAgICAgICBJRF9IRUxQCiAgICAgICAgTUVOVUlURU0gIiZIYXN6buFsYXRcdEYxIiwgICAgICAgICAgICAgIElEX0hFTFBfVVNJTkcKICAgICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgICAgICBNRU5VSVRFTSAiJldpbmVmaWxlLXLzbC4uLiIsICAgICAgICAgICAgSURfQUJPVVQKICAgIH0KfQoKCklERF9FWEVDVVRFIERJQUxPRyBGSVhFRCBJTVBVUkUgMTUsIDEzLCAyMTAsIDYzClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkZ1dHRhdOFzIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKICAgIENPTlRST0wgICAgICAgICAiIiwgMTAxLCAiU3RhdGljIiwgU1NfU0lNUExFfFNTX05PUFJFRklYLCAzLCA2LCAxNjIsIDEwCiAgICBDT05UUk9MICAgICAgICAgIiZQYXJhbmNzOiIsIC0xLCAiU3RhdGljIiwgU1NfTEVGVE5PV09SRFdSQVB8V1NfR1JPVVAsIDMsIDE4LCA2MCwgMTAKICAgIEVESVRURVhUICAgICAgICAyMDEsIDMsIDI5LCAxMzQsIDEyLCBFU19BVVRPSFNDUk9MTAogICAgQ09OVFJPTCAgICAgICAgICImU3ppbWLzbHVta+ludCIsIDIxNCwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWHxXU19UQUJTVE9QLDMsIDQ1LCA3MSwgMTIKICAgIERFRlBVU0hCVVRUT04gICAiT0siLCAxLCAxNTgsIDYsIDQ3LCAxNAogICAgUFVTSEJVVFRPTiAgICAgICJN6WdzZSIsIDIsIDE1OCwgMjMsIDQ3LCAxNAogICAgUFVTSEJVVFRPTiAgICAgICImU/pn8yIsIDI1NCwgMTU4LCA0MywgNDcsIDE0Cn0K