IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICAgICAgICAgICAgICAgICAgICBDQURFTkNFIENPUFlSSUdIVCBOT1RJQ0UKIyAgICAgICAgIKkgMjAwOC0yMDEzIENhZGVuY2UgRGVzaWduIFN5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBGb3VuZGF0aW9uIEZsb3cgaXMgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcGVyZm9ybSBzcGVjaWFsaXplZAojIHRhc2tzLgojCiMgVGhpcyB3b3JrIG1heSBub3QgYmUgY29waWVkLCByZS1wdWJsaXNoZWQsIHVwbG9hZGVkLCBvciBkaXN0cmlidXRlZCBpbiBhbnkgd2F5LAojIGluIGFueSBtZWRpdW0sIHdoZXRoZXIgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KIyBmcm9tIENhZGVuY2UuIE5vdHdpdGhzdGFuZGluZyBhbnkgcmVzdHJpY3Rpb25zIGhlcmVpbiwgc3ViamVjdCB0byBjb21wbGlhbmNlCiMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENhZGVuY2Ugc29mdHdhcmUgbGljZW5zZSBhZ3JlZW1lbnQgdW5kZXIKIyB3aGljaCB0aGlzIG1hdGVyaWFsIHdhcyBwcm92aWRlZCwgdGhpcyBtYXRlcmlhbCBtYXkgYmUgY29waWVkIGFuZCBpbnRlcm5hbGx5CiMgZGlzdHJpYnV0ZWQgc29sZWx5IGZvciBpbnRlcm5hbCBwdXJwb3NlcyBmb3IgdXNlIHdpdGggQ2FkZW5jZSB0b29scy4KIwojIFRoaXMgd29yayBpcyBDYWRlbmNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgbWF5IHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYmUKIyBnaXZlbiB0byB0aGlyZCBwYXJ0aWVzLCBuZWl0aGVyIGluIG9yaWdpbmFsIG5vciBpbiBtb2RpZmllZCB2ZXJzaW9ucywgd2l0aG91dAojIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIENhZGVuY2UuIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzCiMgdGhlIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gb2YgQ2FkZW5jZSBvciBpdHMgbGljZW5zb3JzLCBhbmQKIyBpcyBzdXBwbGllZCBzdWJqZWN0IHRvLCBhbmQgbWF5IGJlIHVzZWQgb25seSBieSBDYWRlbmNlJ3MgY3VycmVudCBjdXN0b21lcnMKIyBpbiBhY2NvcmRhbmNlIHdpdGgsIGEgcHJldmlvdXNseSBleGVjdXRlZCBsaWNlbnNlIGFncmVlbWVudCBiZXR3ZWVuIENhZGVuY2UKIyBhbmQgaXRzIGN1c3RvbWVyLgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEJZIENBREVOQ0UgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAojIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBDQURFTkNFIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwKIyBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAojIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgojIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgIE1BVEVSSUFMLCBFVkVOIElGCiMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKaWYge1tpbmZvIGV4aXN0cyB2YXJzKG5ldGxpc3QpXX0gewogICBzZXQgaW5pdCh2ZXJpbG9nKSAgICAgICAgICAgICAgICAgICR2YXJzKG5ldGxpc3QpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKHNldF90b3BfbW9kdWxlKV19IHsKICAgc2V0IGluaXQoZGVzaWduX3NldHRvcCkgICAgICAgICAgICAkdmFycyhzZXRfdG9wX21vZHVsZSkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVzaWduKV19IHsKICAgc2V0IGluaXQodG9wX2NlbGwpICAgICAgICAgICAgICAgICAkdmFycyhkZXNpZ24pCiMgICBzZXQgaW5pdCh0b3BjZWxsKSAgICAgICAgICAgICAgICAgICR2YXJzKGRlc2lnbikKfQojc2V0IGluaXQobmV0bGlzdF90eXBlKSAgICAgICAgICAgICAgICAkdmFycyhuZXRsaXN0X3R5cGUpCmlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fbGliKV19IHsKICAgc2V0IGluaXQob2FfbGliKSAgICAgICAgICAgICAgICAgICAkdmFycyhvYV9kZXNpZ25fbGliKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fY2VsbCldfSB7CiAgIHNldCBpbml0KG9hX2NlbGwpICAgICAgICAgICAgICAgICAgJHZhcnMob2FfZGVzaWduX2NlbGwpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKG9hX2Rlc2lnbl92aWV3KV19IHsKICAgc2V0IGluaXQob2FfdmlldykgICAgICAgICAgICAgICAgICAkdmFycyhvYV9kZXNpZ25fdmlldykKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMob2FfcmVmX2xpYildfSB7CiAgIHNldCBpbml0KG9hX3JlZl9saWIpICAgICAgICAgICAgICAgJHZhcnMob2FfcmVmX2xpYikKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMob2FfYWJzdHJhY3RfbmFtZSldfSB7CiAgIHNldCBpbml0KGFic3RyYWN0X3ZpZXcpICAgICAgICAgICAgJHZhcnMob2FfYWJzdHJhY3RfbmFtZSkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMob2FfYWJzdHJhY3RfdmlldyldfSB7CiAgIHNldCBpbml0KGFic3RyYWN0X3ZpZXcpICAgICAgICAgICAgJHZhcnMob2FfYWJzdHJhY3RfdmlldykKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMob2FfbGF5b3V0X25hbWUpXX0gewogICBzZXQgaW5pdChsYXlvdXRfdmlldykgICAgICAgICAgICAgICR2YXJzKG9hX2xheW91dF9uYW1lKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9sYXlvdXRfdmlldyldfSB7CiAgIHNldCBpbml0KGxheW91dF92aWV3KSAgICAgICAgICAgICAgJHZhcnMob2FfbGF5b3V0X3ZpZXcpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKHBvd2VyX25ldHMpXX0gewogICBzZXQgaW5pdChwd3JfbmV0KSAgICAgICAgICAgICAgICAgICR2YXJzKHBvd2VyX25ldHMpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGdyb3VuZF9uZXRzKV19IHsKICAgc2V0IGluaXQoZ25kX25ldCkgICAgICAgICAgICAgICAgICAkdmFycyhncm91bmRfbmV0cykKfQpzZXQgaW5pdChtbW1jX2ZpbGUpICAgICAgICAgICAgICAgICAgICR2YXJzKHNjcmlwdF9kaXIpL3ZpZXdfZGVmaW5pdGlvbi50Y2wKaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNwZl9maWxlKV19IHsKICAgc2V0IGluaXQoY3BmX2ZpbGUpICAgICAgICAgICAgICAgICAkdmFycyhjcGZfZmlsZSkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoaW9fZmlsZSldfSB7CiAgIHNldCBpbml0KGlvX2ZpbGUpICAgICAgICAgICAgICAgICAgJHZhcnMoaW9fZmlsZSkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMobGVmX2ZpbGVzKV0gJiYgJHZhcnMobGVmX2ZpbGVzKSAhPSAiTk9ORSJ9IHsKICAgc2V0IGluaXQobGVmX2ZpbGUpICAgICAgICAgICAgICAgICAkdmFycyhsZWZfZmlsZXMpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNhcF91bml0KV19IHsKICAgc2V0IGluaXQoY2FwX3VuaXQpICAgICAgICAgICAgICAgICAkdmFycyhjYXBfdW5pdCkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnModGltZV91bml0KV19IHsKICAgc2V0IGluaXQodGltZV91bml0KSAgICAgICAgICAgICAgICAkdmFycyh0aW1lX3VuaXQpCn0KaWYge1tsaW5kZXggW3NwbGl0ICR2YXJzKHZlcnNpb24pICIuIl0gIDBdIDw9IDE0fSB7CiAgIGlmIHtbaW5mbyBleGlzdHMgdmFycyhhc3NpZ25fYnVmZmVyKV19IHsKICAgICAgaWYgeygkdmFycyhhc3NpZ25fYnVmZmVyKSAhPSAxKSAmJiAoW3N0cmluZyB0b2xvd2VyICR2YXJzKGFzc2lnbl9idWZmZXIpXSAhPSAidHJ1ZSIpICYmIFwKICAgICAgICAgIChbc3RyaW5nIHRvbG93ZXIgJHZhcnMoYXNzaWduX2J1ZmZlcildICE9ICJmYWxzZSIpICYmICgkdmFycyhhc3NpZ25fYnVmZmVyKSAhPSAwKX0gewogICAgICAgICBpZiB7W2xsZW5ndGggJHZhcnMoYXNzaWduX2J1ZmZlcildID09IDF9IHsKICAgICAgICAgICAgICAgc2V0IGluaXQoYXNzaWduX2J1ZmZlcikgICAgICAgICAgICAiMSAtYnVmZmVyICR2YXJzKGFzc2lnbl9idWZmZXIpIgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgaW5pdChhc3NpZ25fYnVmZmVyKSAgICAgICAgICAgICR2YXJzKGFzc2lnbl9idWZmZXIpCiAgICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0IGluaXQoYXNzaWduX2J1ZmZlcikgICAgICAgICAgICAkdmFycyhhc3NpZ25fYnVmZmVyKQogICAgICB9CiAgIH0KfQoKaWYge1tpbmZvIGV4aXN0cyB2YXJzKGJ1Zl9mb290cHJpbnQpXX0gewogICBzZXQgb3B0KGJ1Zl9mb290cHJpbnQpICAgICAgICAgICAgICAkdmFycyhidWZfZm9vdHByaW50KQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhpbnZfZm9vdHByaW50KV19IHsKICAgc2V0IG9wdChpbnZfZm9vdHByaW50KSAgICAgICAgICAgICAgJHZhcnMoaW52X2Zvb3RwcmludCkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVsX2Zvb3RwcmludCldfSB7CiAgIHNldCBvcHQoZGVsYXlfZm9vdHByaW50KSAgICAgICAgICAgICR2YXJzKGRlbF9mb290cHJpbnQpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c19jZWxsX2Zvb3RwcmludCldfSB7CiAgIHNldCBjdHMoY3RzX2NlbGxfZm9vdHByaW50KSAgICAgICAgICR2YXJzKGN0c19jZWxsX2Zvb3RwcmludCkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX2NlbGxfbGlzdCldfSB7CiAgIHNldCBjdHMoY2VsbF9saXN0KSAgICAgICAgICAgICAgICAgICR2YXJzKGN0c19jZWxsX2xpc3QpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlbGF5X2xpbWl0KV19IHsKICAgc2V0IGRlbGF5Y2FsKGRlbGF5X2xpbWl0KSAgICAgICAgICAgICAgICAgJHZhcnMoZGVsYXlfbGltaXQpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZmF1bHRfbmV0X2RlbGF5KV19IHsKICAgc2V0IGRlbGF5Y2FsKG5ldF9kZWxheSkgICAgICAgICAgICAgICAgICAgJHZhcnMoZGVmYXVsdF9uZXRfZGVsYXkpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZmF1bHRfbmV0X2xvYWQpXX0gewogICBzZXQgZGVsYXljYWwobmV0X2xvYWQpICAgICAgICAgICAgICAgICAgICAkdmFycyhkZWZhdWx0X25ldF9sb2FkKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWZhdWx0X3NsZXcpXX0gewogICBzZXQgZGVsYXljYWwoaW5fdHJhbl9kZWxheSkgICAgICAgICAgICAgICAkdmFycyhkZWZhdWx0X3NsZXcpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGV4Y2x1ZGVfbmV0cyldfSB7CiAgIHNldCBkZWxheWNhbChleGNsdWRlX25ldCkgJHZhcnMoZXhjbHVkZV9uZXRzKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWxheV9saW1pdCldfSB7CiAgIHNldCBkZWxheWNhbCh1c2VfZGVmYXVsdF9kZWxheV9saW1pdCkgJHZhcnMoZGVsYXlfbGltaXQpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZmF1bHRfbmV0X2RlbGF5KV19IHsKICAgc2V0IGRlbGF5Y2FsKGRlZmF1bHRfbmV0X2RlbGF5KSAkdmFycyhkZWZhdWx0X25ldF9kZWxheSkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVmYXVsdF9uZXRfbG9hZCldfSB7CiAgIHNldCBkZWxheWNhbChkZWZhdWx0X25ldF9sb2FkKSAkdmFycyhkZWZhdWx0X25ldF9sb2FkKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhpbnB1dF90cmFuc2l0aW9uX2RlbGF5KV19IHsKICAgc2V0IGRlbGF5Y2FsKGlucHV0X3RyYW5zaXRpb25fZGVsYXkpICR2YXJzKGlucHV0X3RyYW5zaXRpb25fZGVsYXkpCn0KCmlmIHtbaW5mbyBleGlzdHMgdmFycyhzaHJpbmtfZmFjdG9yKV19IHsKICAgc2V0IGV4dHJhY3Qoc2hyaW5rX2ZhY3RvcikgJHZhcnMoc2hyaW5rX2ZhY3RvcikKfQoKIyBpbml0X29hX3NlYXJjaF9saWIKCiMgY29uZiB2YXJpYWJsZXM/CiNyZGFfSW5wdXQodWlfaWxtZGlyKQlTcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIElMTSBmaWxlcy4JCiNyZGFfSW5wdXQodWlfZm1kaXIpCVNwZWNpZmllZCB0aGUgZmxleCBtb2RlbCBkaXIJCiNyZGFfSW5wdXQodWlfY29uZl9vYV9vYTJsZWZ2ZXJzaW9uKQlGb3IgbmF0aXZlIG9hMmxlZiB0cmFuc2xhdG9yLgkKI2tlZXBfZmlsZXMJa2VlcHMgdGVtcCBmaWxlcwkKI1JUTCBDb21waWxlciBSZWxhdGVkIChpbiB1c2UpCQkKI3NldCByZGFfSW5wdXQodWlfbmV0bGlzdHR5cGUpIHtSVEx9CQkKI3JkYV9JbnB1dCh1aV9ydGxfdmVyaWxvZ19saXN0KSAJCQojc2V0IHJkYV9JbnB1dCh1aV9ydGxfdmVyaWxvZ192ZXJzaW9uKQkJCiNzZXQgcmRhX0lucHV0KHVpX3J0bF92ZXJpbG9nX2Nhc2UpIHtvcmlnfQkJCiNzZXQgcmRhX0lucHV0KHVpX3J0bF92aGRsX2xpc3QpIHt9CQkKI3NldCByZGFfSW5wdXQodWlfcnRsX3ZoZGxfdmVyc2lvbikJCQojc2V0IHJkYV9JbnB1dCh1aV9ydGxfdmhkbF9jYXNlKSB7b3JpZ30JCQojcmRhX0lucHV0KHVpX3J0bGxpc3QpCQkKI3JkYV9JbnB1dCh1aV9ydGxfcGF0aCkJCQo=