IyBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQuICBTZWUKIyB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwojIHRoYXQgbWF5IGFwcGx5OgojCiMgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQojIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiMKCiMKIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgojCkFDX0lOSVQoW05ldC1TTk1QXSwgWzUuNC40XSwgW25ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXRdKQpBQ19QUkVSRVEoWzIuNTldKQpBQ19DT05GSUdfU1JDRElSKFthZ2VudC9taWJncm91cC91Y2Qtc25tcC9leHRlbnNpYmxlLmNdKQpBQ19SRVZJU0lPTihbJFJldmlzaW9uJF0pCgpBQ19DT05GSUdfSEVBREVSKGluY2x1ZGUvbmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmgpCgpBQ19NU0dfQ0FDSEVfSU5JVCgpCgojCiMgc2F2ZSB0aGUgY29uZmlndXJlIGFyZ3VtZW50cwojCkFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0NPTkZJR1VSRV9PUFRJT05TLCIkYWNfY29uZmlndXJlX2FyZ3MiKQpDT05GSUdVUkVfT1BUSU9OUz0iXCIkYWNfY29uZmlndXJlX2FyZ3MiXCIKQUNfU1VCU1QoQ09ORklHVVJFX09QVElPTlMpCgojCiMgQ29tcGlsYXRpb24gc2V0dXAKIwpBQ19BUkdfV0lUSChjYywgWwpDb21waWxlciBPcHRpb25zOgogIC0td2l0aC1jYz1DQyAgICAgICAgICAgICAgICAgICAgdXNlIENDIHRvIGNvbXBpbGUgKGRlZmF1bHQ9Z2NjKS5dLAogICAgW0NDPSR3aXRoX2NjO2V4cG9ydCBDQ10pCgpBQ19BUkdfV0lUSChsaW5rY2MsIFsKICAtLXdpdGgtbGlua2NjPUNDICAgICAgICAgICAgICAgIHVzZSBDQyB0byBsaW5rIChkZWZhdWx0PWdjYykuXSwKICAgIFtMSU5LQ0M9JHdpdGhfbGlua2NjO2V4cG9ydCBMSU5LQ0NdKQoKQUNfQVJHX1dJVEgoYXIsClsgIC0td2l0aC1hcj1BUiAgICAgICAgICAgICAgICAgICAgdXNlIEFSIGFzIHRoZSBhcmNoaXZlci5dLAogICAgW0FSPSR3aXRoX2FyOyBleHBvcnQgQVJdKQoKQUNfQVJHX1dJVEgoZW5kaWFubmVzcywKWyAgLS13aXRoLWVuZGlhbm5lc3M9YmlnfGxpdHRsZSAgICBkZWZpbmUgZW5kaWFubmVzcyBvZiB0YXJnZXQgcGxhdGZvcm0gd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3MtY29tcGlsaW5nLl0sCiAgICBbaWYgdGVzdCAkd2l0aF9lbmRpYW5uZXNzICE9ICJiaWciIC1hICR3aXRoX2VuZGlhbm5lc3MgIT0gImxpdHRsZSIgOyB0aGVuCiAgICAgICBBQ19NU0dfRVJST1IoW0VuZGlhbm5lc3MgbXVzdCBiZSBiaWcgb3IgbGl0dGxlLCBub3QgIiR3aXRoX2VuZGlhbm5lc3MiLl0pOwogICAgIGZpCl0pCgpBQ19BUkdfV0lUSChjZmxhZ3MsClsgIC0td2l0aC1jZmxhZ3M9Q0ZMQUdTICAgICAgICAgICAgdXNlIENGTEFHUyBhcyBjb21waWxlIHRpbWUgYXJndW1lbnRzLl0sCiAgICBbQ0ZMQUdTPSR3aXRoX2NmbGFnczsgZXhwb3J0IENGTEFHU10pCgpBQ19BUkdfV0lUSChsZGZsYWdzLApbICAtLXdpdGgtbGRmbGFncz1MREZMQUdTICAgICAgICAgIHVzZSBMREZMQUdTIGFzIGxpbmsgdGltZSBhcmd1bWVudHMgdG8gbGQuXSwKICAgIFtMREZMQUdTPSR3aXRoX2xkZmxhZ3M7IGV4cG9ydCBMREZMQUdTXSkKCkFDX0FSR19FTkFCTEUoYXMtbmVlZGVkLApbICAtLWVuYWJsZS1hcy1uZWVkZWQgICAgICAgICAgICAgIExpbmsgbGlicGVybCBhZ2FpbnN0IE5ldC1TTk1QIGxpYnJhcmllcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGFwcGxpY2F0aW9ucy4gV2UgcmVjb21tZW5kIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhpcyBvcHRpb24gaWYgaXQgd29ya3MuXSkKCkFDX0FSR19XSVRIKGxpYnMsClsgIC0td2l0aC1saWJzPUxJQlMgICAgICAgICAgICAgICAgdXNlIExJQlMgYXMgbGluayB0aW1lIGFyZ3VtZW50cyB0byBsZC5dLAogICAgW0xJQlM9JHdpdGhfbGliczsgZXhwb3J0IExJQlNdKQoKQUNfQVJHX0VOQUJMRShzaWxlbnQtbGlidG9vbCwKWyAgLS1lbmFibGUtc2lsZW50LWxpYnRvb2wgICAgICAgICBQYXNzIC0tc2lsZW50IHRvIGxpYnRvb2wuXSwKCUxJQlRPT0xGTEFHUz0tLXNpbGVudCkKQUNfU1VCU1QoTElCVE9PTEZMQUdTKQoKQUNfQVJHX1dJVEgoaW5zdGFsbC1wcmVmaXgsClsgIC0td2l0aC1pbnN0YWxsLXByZWZpeD1QQVRIICAgICAgSnVzdCBmb3IgaW5zdGFsbGluZywgcHJlZml4IGFsbCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIHdpdGggUEFUSC4gIFRoaXMgaXMga25vd24gbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB3b3JrIG9uIHNvbWUgc3lzdGVtcyB3aXRoIHNoYXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzIChlZywgSFBVWCldLAogICAgICBJTlNUQUxMX1BSRUZJWD0iJHdpdGh2YWwiKQoKaWYgdGVzdCAieCRJTlNUQUxMX1BSRUZJWCIgPSAieHllcyIgOyB0aGVuCiAgQUNfTVNHX0VSUk9SKFstLXdpdGgtaW5zdGFsbC1wcmVmaXggcmVxdWlyZXMgYW4gYXJndW1lbnRdKQpmaQppZiB0ZXN0ICJ4JElOU1RBTExfUFJFRklYIiA9ICJ4bm8iIDsgdGhlbgogIElOU1RBTExfUFJFRklYPSIiCmZpCkFDX1NVQlNUKElOU1RBTExfUFJFRklYKQoKIyBjaGVjayBmb3IgZXJyb3JzIGluIGFyZ3MgdGhhdCBydW4gYWZ0ZXIgbW9kdWxlIHByb2Nlc3NpbmcgaGVyZSwgc28KIyB0aGV5IGZhaWwgYmVmb3JlIG1vZHVsZSBwcm9jZXNzaW5nLi4uCkFDX0FSR19FTkFCTEUobGlid3JhcCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1saWJ3cmFwLy0td2l0aG91dC1saWJ3cmFwIGluc3RlYWQgXSkgKQogIEFDX0FSR19FTkFCTEUoemxpYiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC16bGliLy0td2l0aG91dC16bGliIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShtaW5pX2FnZW50LApbICAtLWVuYWJsZS1taW5pLWFnZW50ICAgICAgICAgICAgIEJ1aWxkIGEgbWluaW1hbCBhZ2VudC5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9taW5pX2FnZW50IiA9ICJ4eWVzIjsgdGhlbgogICAgbWluaV9hZ2VudD0ieWVzIgplbHNlCiAgICBtaW5pX2FnZW50PSJubyIKZmkKQUNfQVJHX1dJVEgobWluaV9hZ2VudCwsCiAgICAgICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtbWluaS1hZ2VudC8tLWRpc2FibGUtbWluaS1hZ2VudCBpbnN0ZWFkIF0pICkKQUNfQVJHX1dJVEgobWluaWFnZW50LCwKICAgICAgICAgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1taW5pLWFnZW50Ly0tZGlzYWJsZS1taW5pLWFnZW50IGluc3RlYWQgXSkgKQpBQ19BUkdfRU5BQkxFKG1pbmlhZ2VudCwsCiAgICAgICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtbWluaS1hZ2VudC8tLWRpc2FibGUtbWluaS1hZ2VudCBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUoYWdlbnQsClsgIC0tZGlzYWJsZS1hZ2VudCAgICAgICAgICAgICAgICAgRG8gbm90IGJ1aWxkIHRoZSBhZ2VudCAoc25tcGQpLl0pCmlmIHRlc3QgIngkZW5hYmxlX2FnZW50IiAhPSAieG5vIjsgdGhlbgogICBTTk1QRD0nc25tcGQkKEVYRUVYVCknCiAgIE1BSU5TVUJTPSIkTUFJTlNVQlMgYWdlbnQiCiAgIFRSQVBMSUJTPSckKFRSQVBEV0lUSEFHRU5UKScKICAgVVNFVFJBUExJQlM9JyQoVVNFQUdFTlRMSUJTKScKZWxzZQogICBTTk1QRD0iIgogICAjIHdlIHN0aWxsIG5lZWQvd2FudCB0aGUgYWdlbnRsaWJzIChmb3Igc3ViYWdlbnRzLCBlLmcuIHNubXB0cmFwZCkKICAgTUFJTlNVQlM9IiRNQUlOU1VCUyBhZ2VudCIKICAgIyBidWlsZGluZyBzbm1wdHJhcGQgdy9vIGFnZW50bGlicyBkb2Vzbid0IHdvcmsgYXRtCiAgICNUUkFQTElCUz0nJChUUkFQRFdJVEhPVVRBR0VOVCknCiAgICNVU0VUUkFQTElCUz0nJChVU0VMSUJTKScKICAgVFJBUExJQlM9JyQoVFJBUERXSVRIQUdFTlQpJwogICBVU0VUUkFQTElCUz0nJChVU0VBR0VOVExJQlMpJwpmaQpBQ19TVUJTVChTTk1QRCkKQUNfU1VCU1QoVFJBUExJQlMpCkFDX1NVQlNUKFVTRVRSQVBMSUJTKQpBQ19BUkdfV0lUSChhZ2VudCwsCiAgICAgICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtYWdlbnQvLS1kaXNhYmxlLWFnZW50IGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShhcHBsaWNhdGlvbnMsClsgIC0tZGlzYWJsZS1hcHBsaWNhdGlvbnMgICAgICAgICAgRG8gbm90IGJ1aWxkIHRoZSBhcHBzIChzbm1wZ2V0LCAuLi4pLl0pCmlmIHRlc3QgIngkZW5hYmxlX2FwcGxpY2F0aW9ucyIgIT0gInhubyI7IHRoZW4KICAgTUFJTlNVQlM9IiRNQUlOU1VCUyBhcHBzIgpmaQojIENvbW1vbiBtaXN0YWtlcwpBQ19BUkdfV0lUSChhcHBsaWNhdGlvbnMsLAogICAgICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtYXBwbGljYXRpb25zLy0tZGlzYWJsZS1hcHBsaWNhdGlvbnMgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKG1hbnVhbHMsClsgIC0tZGlzYWJsZS1tYW51YWxzICAgICAgICAgICAgICAgRG8gbm90IGluc3RhbGwgdGhlIG1hbnVhbHMuXSkKaWYgdGVzdCAieCRlbmFibGVfbWFudWFscyIgIT0gInhubyI7IHRoZW4KICAgTUFJTlNVQlM9IiRNQUlOU1VCUyBtYW4iCmZpCkFDX0FSR19XSVRIKG1hbnVhbHMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1tYW51YWxzLy0tZGlzYWJsZS1tYW51YWxzIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShzY3JpcHRzLApbICAtLWRpc2FibGUtc2NyaXB0cyAgICAgICAgICAgICAgIERvIG5vdCBpbnN0YWxsIHRoZSBzY3JpcHRzIChtaWIyYywgLi4uKS5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9zY3JpcHRzIiAhPSAieG5vIjsgdGhlbgogICBNQUlOU1VCUz0iJE1BSU5TVUJTIGxvY2FsIgpmaQpBQ19BUkdfV0lUSChzY3JpcHRzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtc2NyaXB0cy8tLWRpc2FibGUtc2NyaXB0cyBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUobWlicywKWyAgLS1kaXNhYmxlLW1pYnMgICAgICAgICAgICAgICAgICBEbyBub3QgaW5zdGFsbCB0aGUgbWliIGZpbGVzLl0pCmlmIHRlc3QgIngkZW5hYmxlX21pYnMiICE9ICJ4bm8iOyB0aGVuCiAgIE1BSU5TVUJTPSIkTUFJTlNVQlMgbWlicyIKZmkKIyB3aXRoLW1pYnMgaXMgdmFsaWQgdG9vLCBidXQgbWVhbnMgc29tZXRoaW5nIGVsc2UKCkFDX1NVQlNUKE1BSU5TVUJTKQpBQ19NU0dfQ0hFQ0tJTkcoW3doYXQgdG8gYnVpbGQgYW5kIGluc3RhbGxdKQpBQ19NU0dfUkVTVUxUKFskTUFJTlNVQlNdKQoKQUNfQVJHX0VOQUJMRShtaWItbG9hZGluZywKWyAgLS1kaXNhYmxlLW1pYi1sb2FkaW5nICAgICAgICAgICBEbyBub3QgaW5jbHVkZSBjb2RlIHRoYXQgcGFyc2VzIGFuZCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlwdWxhdGVzIHRoZSBtaWIgZmlsZXMuXSkKaWYgdGVzdCAieCRlbmFibGVfbWliX2xvYWRpbmciID0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoW05FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElOR10sIDEsIAogICAgICAgICAgICBbRGVmaW5lIGlmIG1pYiBsb2FkaW5nIGFuZCBwYXJzaW5nIGNvZGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZF0pCmZpCkFDX0FSR19XSVRIKG1pYi1sb2FkaW5nLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtbWliLWxvYWRpbmcvLS1kaXNhYmxlLW1pYi1sb2FkaW5nIGluc3RlYWQgXSkgKQoKIwpTTk1QX1ZFUlNJT05TPSIiCkFDX0FSR19FTkFCTEUoc25tcHYxLApbICAtLWRpc2FibGUtc25tcHYxICAgICAgICAgICAgICAgIERvIG5vdCBpbmNsdWRlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIFNOTVB2MS5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9zbm1wdjEiID0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoW05FVFNOTVBfRElTQUJMRV9TTk1QVjFdLCAxLCAKICAgICAgICAgICAgW0RlZmluZSBpZiBTTk1QdjEgY29kZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkXSkKZWxzZQogIFNOTVBfVkVSU0lPTlM9IiRTTk1QX1ZFUlNJT05TIDEiCmZpCkFDX0FSR19XSVRIKHNubXB2MSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLXNubXB2MS8tLWRpc2FibGUtc25tcHYxIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShzbm1wdjJjLApbICAtLWRpc2FibGUtc25tcHYyYyAgICAgICAgICAgICAgIERvIG5vdCBpbmNsdWRlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIFNOTVB2MmMuXSkKaWYgdGVzdCAieCRlbmFibGVfc25tcHYyYyIgPSAieG5vIjsgdGhlbgogIEFDX0RFRklORShbTkVUU05NUF9ESVNBQkxFX1NOTVBWMkNdLCAxLCAKICAgICAgICAgICAgW0RlZmluZSBpZiBTTk1QdjJjIGNvZGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZF0pCmVsc2UKICBTTk1QX1ZFUlNJT05TPSIkU05NUF9WRVJTSU9OUyAyYyIKZmkKQUNfQVJHX1dJVEgoc25tcHYyYywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLXNubXB2MmMvLS1kaXNhYmxlLXNubXB2MmMgaW5zdGVhZCBdKSApCgpTTk1QX1ZFUlNJT05TPSIkU05NUF9WRVJTSU9OUyAzIgpBQ19NU0dfQ0FDSEVfQUREKFNOTVAgVmVyc2lvbnMgU3VwcG9ydGVkOiAgICRTTk1QX1ZFUlNJT05TKQoKQUNfQVJHX0VOQUJMRShzZXQtc3VwcG9ydCwKWyAgLS1kaXNhYmxlLXNldC1zdXBwb3J0ICAgICAgICAgICBEbyBub3QgYWxsb3cgU05NUCBzZXQgcmVxdWVzdHMgdG8gdGhlIGFnZW50Ll0pCmlmIHRlc3QgIngkZW5hYmxlX3NldF9zdXBwb3J0IiA9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKFtORVRTTk1QX0RJU0FCTEVfU0VUX1NVUFBPUlRdLCAxLCAKICAgICAgICAgICAgW0RlZmluZSBpZiBTTk1QIFNFVCBzdXBwb3J0IHNob3VsZCBiZSBkaXNhYmxlZF0pCmZpCkFDX0FSR19XSVRIKHNldC1zdXBwb3J0LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtc2V0LXN1cHBvcnQvLS1kaXNhYmxlLXNldC1zdXBwb3J0IGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShkZXMsClsgIC0tZGlzYWJsZS1kZXMgICAgICAgICAgICAgICAgICAgRG8gbm90IHN1cHBvcnQgREVTIGVuY3J5cHRpb24uXSkKaWYgdGVzdCAieCRlbmFibGVfZGVzIiA9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKFtORVRTTk1QX0RJU0FCTEVfREVTXSwgMSwgCiAgICAgICAgICAgIFtEZWZpbmUgaWYgREVTIGVuY3J5cHRpb24gc2hvdWxkIG5vdCBiZSBzdXBwb3J0ZWRdKQpmaQpBQ19BUkdfV0lUSChkZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1kZXMvLS1kaXNhYmxlLWRlcyBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUocHJpdmFjeSwKWyAgLS1kaXNhYmxlLXByaXZhY3kgICAgICAgICAgICAgICBEb24ndCBjb21waWxlIGluIHN1cHBvcnQgZm9yIHByaXZhY3kgKGVuY3J5cHRpb24pLl0pCmlmIHRlc3QgIngkZW5hYmxlX3ByaXZhY3kiICE9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKE5FVFNOTVBfRU5BQkxFX1NDQVBJX0FVVEhQUklWKQpmaQpBQ19BUkdfV0lUSChwcml2YWN5LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtcHJpdmFjeS8tLWRpc2FibGUtcHJpdmFjeSBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUobWQ1LApbICAtLWRpc2FibGUtbWQ1ICAgICAgICAgICAgICAgICAgIERvIG5vdCBzdXBwb3J0IE1ENSBhdXRoZW50aWNhdGlvbi5dKQppZiB0ZXN0ICJ4JGVuYWJsZV9tZDUiID0gInhubyI7IHRoZW4KICBBQ19ERUZJTkUoW05FVFNOTVBfRElTQUJMRV9NRDVdLCAxLCAKICAgICAgICAgICAgW0RlZmluZSBpZiBNRDUgYXV0aGVudGljYXRpb24gc2hvdWxkIG5vdCBiZSBzdXBwb3J0ZWRdKQpmaQpBQ19BUkdfV0lUSChtZDUsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1tZDUvLS1kaXNhYmxlLW1kNSBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUoaW50ZXJuYWwtbWQ1LApbICAtLWVuYWJsZS1pbnRlcm5hbC1tZDUgICAgICAgICAgIFVzZSB0aGUgaW50ZXJuYWwgTUQ1IHN1cHBvcnQuXSkKaWYgdGVzdCAieCRlbmFibGVfaW50ZXJuYWxfbWQ1IiA9ICJ4eWVzIjsgdGhlbgogIGlmIHRlc3QgIngkZW5hYmxlX21kNSIgPSAieG5vIjsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFlvdSBjYW4gbm90IHNwZWNpZnkgYm90aCAtLWVuYWJsZS1pbnRlcm5hbC1tZDUgYW5kIC0tZGlzYWJsZS1tZDUpCiAgZWxzZQogICAgQUNfREVGSU5FKE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSkKICBmaQpmaQpBQ19BUkdfV0lUSChpbnRlcm5hbC1tZDUsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1pbnRlcm5hbC1tZDUvLS1kaXNhYmxlLWludGVybmFsLW1kNSBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUoaXB2NiwKWyAgLS1lbmFibGUtaXB2NiAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBJUHY2IHJlYWR5IHZlcnNpb24uXSwKICAgIFtpZiB0ZXN0ICJ4JGVuYWJsZV9pcHY2IiA9ICJ4eWVzIjsgdGhlbgogICAgICBBQ19ERUZJTkUoTkVUU05NUF9FTkFCTEVfSVBWNikKICAgIGZpXSkKQUNfQVJHX1dJVEgoaXB2NiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLWlwdjYvLS1kaXNhYmxlLWlwdjYgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKGxvY2FsLXNtdXgsClsgIC0tZW5hYmxlLWxvY2FsLXNtdXggICAgICAgICAgICAgUmVzdHJpY3QgU01VWCBjb25uZWN0aW9ucyB0byBsb2NhbGhvc3QgKGJ5IGRlZmF1bHQpLl0sCiAgICBbaWYgdGVzdCAieCRlbmFibGVfbG9jYWxfc211eCIgPSAieHllcyI7IHRoZW4KICAgICAgQUNfREVGSU5FKE5FVFNOTVBfRU5BQkxFX0xPQ0FMX1NNVVgpCiAgICBmaV0pCkFDX0FSR19XSVRIKGxvY2FsLXNtdXgsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1sb2NhbC1zbXV4Ly0tZGlzYWJsZS1sb2NhbC1zbXV4IGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShkZWJ1Z2dpbmcsClsgIC0tZW5hYmxlLWRlYnVnZ2luZyAgICAgICAgICAgICAgT3V0cHV0cyBleHRyYSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYXQgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcy4gIE5vcm1hbGx5LCB5b3Ugc2hvdWxkIG5vdCBlbmFibGUgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgLUQgZmxhZyBvZiB0aGUgY29tbWFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0b2dnbGVzIGRlYnVnaW5nIG91dHB1dCBhdCBydW50aW1lLgogIC0tZGlzYWJsZS1kZWJ1Z2dpbmcgICAgICAgICAgICAgRGlzYWxsb3dzIGRlYnVnZ2luZyBjb2RlIHRvIGJlIGJ1aWx0IGluLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtaWdodCBwcm92aWRlIHNvbWUgc3BlZWQgYmVuZWZpdHMuXSwKICAgIEFDX0RFRklORShORVRTTk1QX0FMV0FZU19ERUJVRykpCkFDX0FSR19XSVRIKGRlYnVnZ2luZywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLWRlYnVnZ2luZy8tLWRpc2FibGUtZGVidWdnaW5nIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShkZXZlbG9wZXIsClsgIC0tZW5hYmxlLWRldmVsb3BlciAgICAgICAgICAgICAgVHVybnMgb24gc3VwZXItZHVwZXItZXh0cmEtY29tcGlsZS13YXJuaW5ncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB1c2luZyBnY2MuXSwKICAgIGRldmVsb3Blcj15ZXMpCkFDX0FSR19XSVRIKGRldmVsb3BlciwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLWRldmVsb3Blci8tLWRpc2FibGUtZGV2ZWxvcGVyIGluc3RlYWQgXSkgKQoKaWYgdGVzdCAieCRlbmFibGVfZGVidWdnaW5nIiA9ICJ4bm8iOyB0aGVuCiAgICBBQ19ERUZJTkUoTkVUU05NUF9OT19ERUJVR0dJTkcpCmZpCgpBQ19BUkdfV0lUSChkbWFsbG9jLApbICAtLXdpdGgtZG1hbGxvYz1QQVRIICAgICAgICAgICAgIFVzZSBkbWFsbG9jIGxpYnJhcnkgKHd3dy5kbWFsbG9jLmNvbSldLAogICAgaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4eWVzIjsgdGhlbgogICAgICBMSUJTPSIkTElCUyAtbGRtYWxsb2MiCiAgICAgIEFDX0RFRklORShIQVZFX0RNQUxMT0NfSCkKICAgIGVsaWYgdGVzdCAtZCAiJHdpdGh2YWwiOyB0aGVuCiAgICAgIEFDX0FERF9TRUFSQ0hfUEFUSCgkd2l0aHZhbCkKICAgICAgTElCUz0iJExJQlMgLWxkbWFsbG9jIgogICAgICBBQ19ERUZJTkUoSEFWRV9ETUFMTE9DX0gpCiAgICBmaQopCkFDX1NVQlNUKEhBVkVfRE1BTExPQ19IKQpBQ19BUkdfRU5BQkxFKGRtYWxsb2MsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtZG1hbGxvYy8tLXdpdGhvdXQtZG1hbGxvYyBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKGVmZW5jZSwKWyAgLS13aXRoLWVmZW5jZSAgICAgICAgICAgICAgICAgICBMb29rIGZvciBhbmQgdXNlIGxpYmVmZW5jZSAobWFsbG9jKS5dLAogICAgICB1c2VfZWZlbmNlPSIkd2l0aHZhbCIpCkFDX0FSR19FTkFCTEUoZWZlbmNlLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWVmZW5jZS8tLXdpdGhvdXQtZWZlbmNlIGluc3RlYWQgXSkgKQoKdHJ5cnNhcmVmPW5vCkFDX0FSR19XSVRIKHJzYXJlZiwKWyAgLS13aXRoLXJzYXJlZj1QQVRIICAgICAgICAgICAgICBMb29rIGZvciBsaWJyc2FyZWYgaW4gUEFUSC9saWIuXSwKICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyI7IHRoZW4KICAgICAgdHJ5cnNhcmVmPXllcwogICAgZWxpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KICAgICAgdHJ5cnNhcmVmPW5vCiAgICBlbGlmIHRlc3QgLWQgIiR3aXRodmFsIjsgdGhlbgogICAgICBBQ19BRERfU0VBUkNIX1BBVEgoJHdpdGh2YWwpCiAgICAgIHRyeXJzYXJlZj15ZXMKICAgIGZpLAopCkFDX0FSR19FTkFCTEUocnNhcmVmLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXJzYXJlZi8tLXdpdGhvdXQtcnNhcmVmIGluc3RlYWQgXSkgKQoKdHJ5b3BlbnNzbD1kZWZhdWx0eWVzCmFza2Vkb3BlbnNzbD1ubwpBQ19BUkdfV0lUSChvcGVuc3NsLApbICAtLXdpdGgtb3BlbnNzbD1QQVRIICAgICAgICAgICAgIExvb2sgZm9yIG9wZW5zc2wgaW4gUEFUSC9saWIuXSwKICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyI7IHRoZW4KICAgICAgdHJ5b3BlbnNzbD15ZXMKICAgICAgYXNrZWRvcGVuc3NsPXllcwogICAgZWxpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KICAgICAgdHJ5b3BlbnNzbD1ubwogICAgZWxpZiB0ZXN0IC1kICIkd2l0aHZhbCI7IHRoZW4KICAgICAgQUNfQUREX1NFQVJDSF9QQVRIKCR3aXRodmFsKQogICAgICB0cnlvcGVuc3NsPXllcwogICAgICBhc2tlZG9wZW5zc2w9eWVzCiAgICBmaSwKKQppZiB0ZXN0ICJ4JHRyeW9wZW5zc2wiID0gInhkZWZhdWx0eWVzIjsgdGhlbgogICAgICBBQ19BRERfU0VBUkNIX1BBVEgoL3Vzci9sb2NhbC9zc2wpCiAgICAgIHRyeW9wZW5zc2w9eWVzCmZpCkFDX0FSR19FTkFCTEUob3BlbnNzbCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1vcGVuc3NsLy0td2l0aG91dC1vcGVuc3NsIGluc3RlYWQgXSkgKQpBQ19BUkdfV0lUSChzc2wsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtb3BlbnNzbC8tLXdpdGhvdXQtb3BlbnNzbCBpbnN0ZWFkIF0pICkKQUNfQVJHX0VOQUJMRShzc2wsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtb3BlbnNzbC8tLXdpdGhvdXQtb3BlbnNzbCBpbnN0ZWFkIF0pICkKCnRyeWtyYjU9ZGVmYXVsdHllcwphc2tlZGtyYjU9bm8KQUNfQVJHX1dJVEgoa3JiNSwKWyAgLS13aXRoLWtyYjU9UEFUSCAgICAgICAgICAgICAgICBMb29rIGZvciBrcmI1IGluIFBBVEgvbGliLl0sCiAgICBpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInh5ZXMiOyB0aGVuCiAgICAgIHRyeWtyYjU9eWVzCiAgICAgIGFza2Vka3JiNT15ZXMKICAgICAga3JiNXBhdGg9dW5kZWYKICAgIGVsaWYgdGVzdCAieCR3aXRodmFsIiA9ICJ4bm8iOyB0aGVuCiAgICAgIHRyeWtyYjU9bm8KICAgICAga3JiNXBhdGg9dW5kZWYKICAgIGVsaWYgdGVzdCAtZCAiJHdpdGh2YWwiOyB0aGVuCiAgICAgIHRyeWtyYjU9eWVzCiAgICAgIGFza2Vka3JiNT15ZXMKICAgICAga3JiNXBhdGg9JHdpdGh2YWwKICAgIGZpLAopCmlmIHRlc3QgIngkdHJ5a3JiNSIgPSAieGRlZmF1bHR5ZXMiOyB0aGVuCiAgICAgIHRyeWtyYjU9eWVzCiAgICAgIGtyYjVwYXRoPS91c3Iva2VyYmVyb3MKZmkKQUNfQVJHX0VOQUJMRShrcmI1LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWtyYjUvLS13aXRob3V0LWtyYjUgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChycG0sClsgIC0td2l0aG91dC1ycG0gICAgICAgICAgICAgICAgICAgRG9uJ3QgaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUlBNIHBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQgc3lzdGVtIHdoZW4gYnVpbGRpbmcgdGhlIGhvc3QgTUlCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuXSkKQUNfQVJHX0VOQUJMRShycG0sLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtcnBtLy0td2l0aG91dC1ycG0gaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKGFnZW50eC1kb20tc29jay1vbmx5LApbICAtLWVuYWJsZS1hZ2VudHgtZG9tLXNvY2stb25seSAgIERpc2FibGUgVURQL1RDUCB0cmFuc3BvcnRzIGZvciBhZ2VudHguXSwKQUNfREVGSU5FKE5FVFNOTVBfQUdFTlRYX0RPTV9TT0NLX09OTFkpKQpBQ19BUkdfV0lUSChhZ2VudHgtZG9tLXNvY2stb25seSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLWFnZW50eC1kb20tc29jay1vbmx5Ly0tZGlzYWJsZS1hZ2VudHgtZG9tLXNvY2stb25seSBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUoc25tcHRyYXBkLXN1YmFnZW50LApbICAtLWRpc2FibGUtc25tcHRyYXBkLXN1YmFnZW50ICAgIERpc2FibGUgYWdlbnR4IHN1YmFnZW50IGNvZGUgaW4gc25tcHRyYXBkLl0pCmlmIHRlc3QgIngkZW5hYmxlX3NubXB0cmFwZF9zdWJhZ2VudCIgPSAieG5vIjsgdGhlbgogIEFDX0RFRklORShORVRTTk1QX1NOTVBUUkFQRF9ESVNBQkxFX0FHRU5UWCkKZmkKQUNfQVJHX1dJVEgoc25tcHRyYXBkLXN1YmFnZW50LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtc25tcHRyYXBkLXN1YmFnZW50Ly0tZGlzYWJsZS1zbm1wdHJhcGQtc3ViYWdlbnQgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChvcGFxdWUtc3BlY2lhbC10eXBlcywKWyAgLS13aXRob3V0LW9wYXF1ZS1zcGVjaWFsLXR5cGVzICBEb24ndCB1c2Ugc3BlY2lhbCBvcGFxdWUgZW5jb2RpbmdzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUCBub3JtYWxseSBjYW5ub3QgaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdGluZyBudW1iZXJzLCBub3IgbGFyZ2UgNjQgYml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VycyB3ZWxsLiAgQnkgZGVmYXVsdCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXQtc25tcCBwYWNrYWdlIGNvbXBpbGVzIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciB0aGVzZSBleHRyYSBkYXRhdHlwZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiBhIGxlZ2FsIHdheSldKQpBQ19BUkdfRU5BQkxFKG9wYXF1ZS1zcGVjaWFsLXR5cGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLW9wYXF1ZS1zcGVjaWFsLXR5cGVzLy0td2l0aG91dC1vcGFxdWUtc3BlY2lhbC10eXBlcyBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKG1pYmRpcnMsClsgIC0td2l0aC1taWJkaXJzPSJkaXIxOmRpcjI6IiAgIERlZmF1bHQgZGlyZWN0b3JpZXMgdG8gbG9vayBmb3IgbWlicy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiBcJEhPTUUvLnNubXAvbWliczpEQVRBRElSL3NubXAvbWlicyldLAogICAgW05FVFNOTVBfREVGQVVMVF9NSUJESVJTPSIkd2l0aF9taWJkaXJzIgogICAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfREVGQVVMVF9NSUJESVJTLCIkd2l0aF9taWJkaXJzIildKQpBQ19BUkdfRU5BQkxFKG1pYmRpcnMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtbWliZGlycy8tLXdpdGhvdXQtbWliZGlycyBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKG1pYnMsClsgIC0td2l0aC1taWJzPSJpdGVtMTppdGVtMjoiICAgIERlZmF1bHQgbWliIElEcyB0byByZWFkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRoZSBkZWZhdWx0IGxpc3QgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTTk1QdjItTUlCOklGLU1JQjpJUC1NSUI6VENQLU1JQjpVRFAtTUlCIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgYWRkaXRpb24gb2YgYW55IG1pYnMgdXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIG1pYiBtb2R1bGVzIHRoZSBhZ2VudCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB3aXRoKV0sCiAgICBORVRTTk1QX0RFRkFVTFRfTUlCUz0iJHdpdGhfbWlicyIpCiMgZW5hYmxlLW1pYnMgaXMgdmFsaWQgdG9vLCBidXQgbWVhbnMgc29tZXRoaW5nIGVsc2UKCkFDX0FSR19XSVRIKG1pYmZpbGVzLApbICAtLXdpdGgtbWliZmlsZXM9ImZpbGUxOmZpbGUyIiBEZWZhdWx0IG1pYiBmaWxlcyB0byBsb2FkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERlZmF1bHQ6ICBub25lLiAgdXNlcyBJRHMgYWJvdmUgaW5zdGVhZC4pXSwKICAgIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0RFRkFVTFRfTUlCRklMRVMsIiR3aXRoX21pYmZpbGVzIikpCkFDX0FSR19FTkFCTEUobWliZmlsZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtbWliZmlsZXMvLS13aXRob3V0LW1pYmZpbGVzIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShtaWItY29uZmlnLWNoZWNraW5nLApbICAtLWVuYWJsZS1taWItY29uZmlnLWNoZWNraW5nICAgIFR1cm5zIG9uIGV4dHJhIGNoZWNrcyBkdXJpbmcgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbWliIG1vZHVsZXMuIEFueSBjb25mbGljdHMgd2lsbCBjYXVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlIHRvIGFib3J0IChkZWZhdWx0IGlzIHRvIGlzc3VlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgYW5kIGNvbnRpbnVlLildLAogICAgd2l0aF9taWJfY2ZnX2NoZWNrcz0ieWVzIix3aXRoX21pYl9jZmdfY2hlY2tzPSJubyIpCkFDX0FSR19XSVRIKG1pYi1jb25maWctY2hlY2tpbmcsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1taWItY29uZmlnLWNoZWNraW5nLy0tZGlzYWJsZS1taWItY29uZmlnLWNoZWNraW5nIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRShtaWItY29uZmlnLWRlYnVnLApbICAtLWVuYWJsZS1taWItY29uZmlnLWRlYnVnICAgICAgIFR1cm5zIG9uIHZlcmJvc2Ugb3V0cHV0IGR1cmluZyBtaWIgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgcHJvY2Vzc2luZy4pXSwKICAgIHdpdGhfbWliX2NmZ19kZWJ1Zz0ieWVzIix3aXRoX21pYl9jZmdfZGVidWc9Im5vIikKQUNfQVJHX1dJVEgobWliLWNvbmZpZy1jaGVja2luZywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLW1pYi1jb25maWctY2hlY2tpbmcvLS1kaXNhYmxlLW1pYi1jb25maWctY2hlY2tpbmcgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKG1mZC1yZXdyaXRlcywKWyAgLS1lbmFibGUtbWZkLXJld3JpdGVzICAgICAgICAgICBVc2UgbmV3IE1GRCByZXdyaXRlcyBvZiBtaWIgbW9kdWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGF2YWlsYWJsZS4gKGRlZmF1bHQgaXMgdG8gdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCBtaWIgbW9kdWxlIGNvZGUpLl0pCmlmIHRlc3QgIngkZW5hYmxlX21mZF9yZXdyaXRlcyIgPSAieHllcyI7IHRoZW4KICAgQUNfREVGSU5FKE5FVFNOTVBfRU5BQkxFX01GRF9SRVdSSVRFUykKZmkKQUNfQVJHX1dJVEgobWZkLXJld3JpdGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtbWZkLXJld3JpdGVzLy0tZGlzYWJsZS1tZmQtcmV3cml0ZXMgaW5zdGVhZCBdKSApCgphc2tlZHBrY3M9bm8KQUNfQVJHX1dJVEgocGtjcywKWyAgLS13aXRoLXBrY3M9UEFUSCAgICAgICAgICAgICAgICBMb29rIGZvciBwa2NzMTEgaW4gUEFUSC9saWIuXSwKICAgIGlmIHRlc3QgIngkd2l0aHZhbCIgPSAieHllcyI7IHRoZW4KICAgICAgYXNrZWRwa2NzPXllcwogICAgZWxpZiB0ZXN0ICJ4JHdpdGh2YWwiID0gInhubyI7IHRoZW4KICAgICAgYXNrZWRwa2NzPW5vCiAgICBlbGlmIHRlc3QgLWQgIiR3aXRodmFsIjsgdGhlbgogICAgICBBQ19BRERfU0VBUkNIX1BBVEgoJHdpdGh2YWwpCiAgICAgIGFza2VkcGtjcz15ZXMKICAgIGZpLAopCkFDX0FSR19FTkFCTEUocGtjcywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1wa2NzLy0td2l0aG91dC1wa2NzIGluc3RlYWQgXSkgKQoKQUNfQVJHX0VOQUJMRSh0ZXN0aW5nLWNvZGUsClsgIC0tZW5hYmxlLXRlc3RpbmctY29kZSAgICAgICAgICAgRW5hYmxlcyBzb21lIGNvZGUgc2VjdGlvbnMgdGhhdCBzaG91bGQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgZm9yIHRlc3Rpbmcgb2YgY2VydGFpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUCBmdW5jdGlvbmFsaXRpZXMuICBUaGlzIHNob3VsZCAqbm90KiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHR1cm5lZCBvbiBmb3IgcHJvZHVjdGlvbiB1c2UuICBFdmVyLl0sCiAgICBBQ19ERUZJTkUoTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFKSkKQUNfQVJHX1dJVEgodGVzdGluZy1jb2RlLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtdGVzdGluZy1jb2RlLy0tZGlzYWJsZS10ZXN0aW5nLWNvZGUgaW5zdGVhZCBdKSApCgpBQ19BUkdfRU5BQkxFKHJlZW50cmFudCwKWyAgLS1lbmFibGUtcmVlbnRyYW50ICAgICAgICAgICAgICBFbmFibGVzIGxvY2tpbmcgZnVuY3Rpb25zIHRoYXQgcHJvdGVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSByZXNvdXJjZXMgaW4gc29tZSBtdWx0aS10aHJlYWRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50cy4gIFRoaXMgZG9lcyBub3QgZ3VhcmFudGVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtc2FmZSBvcGVyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgYW4gZXhwZXJpbWVudGFsIHNldHRpbmcuXSwKICAgIHdpdGhfcmVzX2xvY2tzPSJ5ZXMiLHdpdGhfcmVzX2xvY2tzPSJubyIpCkFDX0FSR19XSVRIKHJlZW50cmFudCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLXJlZW50cmFudC8tLWRpc2FibGUtcmVlbnRyYW50IGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgocm9vdC1hY2Nlc3MsClsKQ29uZmlndXJpbmcgdGhlIGFnZW50OgogIC0td2l0aG91dC1yb290LWFjY2VzcyAgICAgICAgICAgVGhlIHNubXBkIGFnZW50IHdvbid0IHJlcXVpcmUgcm9vdCBhY2Nlc3MgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBpdC4gIFRoZSBpbmZvcm1hdGlvbiBpdCByZXR1cm5zIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWliLUlJIHRyZWUgbWF5IG5vdCBiZSBjb3JyZWN0LCBob3dldmVyLl0pCkFDX0FSR19FTkFCTEUocm9vdC1hY2Nlc3MsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtcm9vdC1hY2Nlc3MvLS13aXRob3V0LXJvb3QtYWNjZXNzIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgoa21lbS11c2FnZSwKWyAgLS13aXRob3V0LWttZW0tdXNhZ2UgICAgICAgICAgICBEbyBub3QgaW5jbHVkZSBhbnkgY29kZSByZWxhdGVkIHRvIHRoZSB1c2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGttZW0uXSkKQUNfQVJHX0VOQUJMRShrbWVtLXVzYWdlLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWttZW0tdXNhZ2UvLS13aXRob3V0LWttZW0tdXNhZ2UgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChkdW1teS12YWx1ZXMsClsgIC0td2l0aC1kdW1teS12YWx1ZXMgICAgICAgICAgICAgUHJvdmlkZSAncGxhY2Vob2xkZXInIGR1bW15IHZhbHVlcyB3aGVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0ZWNobmljYWxseSBub3QgY29tcGxpYW50IHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QIHNwZWNpZmljYXRpb25zLCBidXQgd2FzIGhvdyB0aGUgYWdlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGVkIGZvciB2ZXJzaW9ucyA8IDQuMC5dKQpBQ19BUkdfRU5BQkxFKGR1bW15LXZhbHVlcywsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1kdW1teS12YWx1ZXMvLS13aXRob3V0LWR1bW15LXZhbHVlcyBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKHBlcnNpc3RlbnQtZGlyZWN0b3J5LApbICAtLXdpdGgtcGVyc2lzdGVudC1kaXJlY3Rvcnk9ImRpcmVjdG9yeSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZGlyZWN0b3J5IGZvciBwZXJzaXN0ZW50IGRhdGEgc3RvcmFnZS5dLGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfUEVSU0lTVEVOVF9ESVJFQ1RPUlk9IiR3aXRoX3BlcnNpc3RlbnRfZGlyZWN0b3J5IikKQUNfQVJHX0VOQUJMRShwZXJzaXN0ZW50LWRpcmVjdG9yeSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1wZXJzaXN0ZW50LWRpcmVjdG9yeS8tLXdpdGhvdXQtcGVyc2lzdGVudC1kaXJlY3RvcnkgaW5zdGVhZCBdKSApCgpkZWZhdWx0X3BlcnNpc3RlbnRfbWFzaz0wNzcKQUNfQVJHX1dJVEgocGVyc2lzdGVudC1tYXNrLApbICAtLXdpdGgtcGVyc2lzdGVudC1tYXNrPSJtYXNrIiAgRGVmYXVsdCBtYXNrIGZvciBwZXJzaXN0ZW50IGRhdGEgc3RvcmFnZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiAwNzcpXSxbCiAgaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWyBQbGVhc2UgcHJvdmlkZSBhIG1hc2sgdmFsdWUgXSk7CiAgZmkKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGRlZmF1bHQgcGVyc2lzdGVudCBtYXNrICR3aXRodmFsKQogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX1BFUlNJU1RFTlRfTUFTSywkd2l0aHZhbCkKXSxbCiAgQUNfTVNHX1JFU1VMVCh1c2luZyBkZWZhdWx0IHBlcnNpc3RlbnQgbWFzayAkZGVmYXVsdF9wZXJzaXN0ZW50X21hc2spCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfUEVSU0lTVEVOVF9NQVNLLCRkZWZhdWx0X3BlcnNpc3RlbnRfbWFzaykKXSkKQUNfQVJHX0VOQUJMRShwZXJzaXN0ZW50LW1hc2ssLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtcGVyc2lzdGVudC1tYXNrIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgoY29weV9wZXJzaXN0ZW50X2ZpbGVzLApbICAtLXdpdGgtY29weS1wZXJzaXN0ZW50LWZpbGVzPSJubyIgRG9uJ3QgY29weSBwZXJzaXN0ZW50IGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgdXNlICJ5ZXMiIHRvIGNvcHkgdGhlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVmYXVsdDogeWVzKV0sCiAgICBhY19jdl91c2VyX3Byb21wdF9DT1BZX1BFUlNJU1RFTlRfRklMRVM9IiR3aXRoX2NvcHlfcGVyc2lzdGVudF9maWxlcyIpCkFDX0FSR19FTkFCTEUoY29weV9wZXJzaXN0ZW50X2ZpbGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWNvcHlfcGVyc2lzdGVudF9maWxlcy8tLXdpdGhvdXQtY29weV9wZXJzaXN0ZW50X2ZpbGVzIGluc3RlYWQgXSkgKQoKZGVmYXVsdF90ZW1wX2ZpbGVfcGF0dGVybj0iL3RtcC9zbm1wZFhYWFhYWCIKQUNfQVJHX1dJVEgodGVtcC1maWxlLXBhdHRlcm4sClsgIC0td2l0aC10ZW1wLWZpbGUtcGF0dGVybj1QQVRURVJOICBQYXR0ZXJuIG9mIHRlbXBvcmFyeSBmaWxlcyAoRGVmYXVsdDogL3RtcC9zbm1wZFhYWFhYWCldLFsKICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KICAgIEFDX01TR19FUlJPUihbIFBsZWFzZSBwcm92aWRlIGEgcGF0dGVybiBdKTsKICBmaQogIEFDX01TR19SRVNVTFQodXNpbmcgdGVtcG9yYXJ5IGZpbGUgcGF0dGVybiAkd2l0aHZhbCkKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9URU1QX0ZJTEVfUEFUVEVSTiwiJHdpdGh2YWwiLFtQYXR0ZXJuIG9mIHRlbXBvcmFyeSBmaWxlc10pCl0sWwogIEFDX01TR19SRVNVTFQodXNpbmcgZGVmYXVsdCB0ZW1wb3JhcnkgZmlsZSBwYXR0ZXJuICRkZWZhdWx0X3RlbXBfZmlsZV9wYXR0ZXJuKQogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX1RFTVBfRklMRV9QQVRURVJOLCIkZGVmYXVsdF90ZW1wX2ZpbGVfcGF0dGVybiIsW1BhdHRlcm4gb2YgdGVtcG9yYXJ5IGZpbGVzXSkKXSkKQUNfQVJHX0VOQUJMRSh0ZW1wLWZpbGUtcGF0dGVybiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC10ZW1wLWZpbGUtcGF0dGVybiBpbnN0ZWFkIF0pICkKCmRlZmF1bHRfYWdlbnR4X3NvY2tldD0iL3Zhci9hZ2VudHgvbWFzdGVyIgpBQ19BUkdfV0lUSChhZ2VudHgtc29ja2V0LApbICAtLXdpdGgtYWdlbnR4LXNvY2tldD1GSUxFICAgICAgICAgQWdlbnRYIHNvY2tldCAoRGVmYXVsdDogL3Zhci9hZ2VudHgvbWFzdGVyIGFzIHNwZWNpZmllZCBpbiBSRkMyNzQxKV0sWwogIGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFsgUGxlYXNlIHByb3ZpZGUgYSBmdWxsIHBhdGggXSk7CiAgZmkKICBBQ19NU0dfUkVTVUxUKHVzaW5nIEFnZW50WCBzb2NrZXQgJHdpdGh2YWwpCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfQUdFTlRYX1NPQ0tFVCwiJHdpdGh2YWwiLFtVbml4IGRvbWFpbiBzb2NrZXQgZm9yIEFnZW50WCBtYXN0ZXItc3ViYWdlbnQgY29tbXVuaWNhdGlvbl0pCl0sWwogIEFDX01TR19SRVNVTFQodXNpbmcgZGVmYXVsdCBBZ2VudFggc29ja2V0ICRkZWZhdWx0X2FnZW50eF9zb2NrZXQpCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfQUdFTlRYX1NPQ0tFVCwiJGRlZmF1bHRfYWdlbnR4X3NvY2tldCIsW1VuaXggZG9tYWluIHNvY2tldCBmb3IgQWdlbnRYIG1hc3Rlci1zdWJhZ2VudCBjb21tdW5pY2F0aW9uXSkKXSkKQUNfQVJHX0VOQUJMRShhZ2VudHgtc29ja2V0LCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWFnZW50eC1zb2NrZXQgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChkZWZhdWx0LXNubXAtdmVyc2lvbiwKWyAgLS13aXRoLWRlZmF1bHQtc25tcC12ZXJzaW9uPSIzIiBEZWZhdWx0IHZlcnNpb24gb2YgU05NUCB0byB1c2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiAzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbCB2YWx1ZXM6IDEsIDIgKGZvciBTTk1QdjJjKSBvciAzLl0sCiAgICBhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OPSIkd2l0aF9kZWZhdWx0X3NubXBfdmVyc2lvbiIpCkFDX0FSR19FTkFCTEUoZGVmYXVsdC1zbm1wLXZlcnNpb24sLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtZGVmYXVsdC1zbm1wLXZlcnNpb24vLS13aXRob3V0LWRlZmF1bHQtc25tcC12ZXJzaW9uIGluc3RlYWQgXSkgKQoKIyB3ZSB0ZXN0IHRoaXMgbm93IGFuZCBsYXRlciBhcyB3ZWxsLiAgd2UgdGVzdCBpdCBub3cgc28gY29uZmlndXJlIGNhbiBkaWUKIyBlYXJseSBvbiB3aXRoIGFuIGVycm9yIHJhdGhlciB0aGFuIHdhaXRpbmcgdGlsbCB0aGUgZW5kIG9mIHRoZSBzY3JpcHQuCmlmIHRlc3QgIngkYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9ERUZBVUxUX1NOTVBfVkVSU0lPTiIgIT0gIngiOyB0aGVuCiAgaWYgdGVzdCAiJGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfREVGQVVMVF9TTk1QX1ZFUlNJT04iID0gIjJjIjsgdGhlbgogICAgYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9ERUZBVUxUX1NOTVBfVkVSU0lPTj0iMiIKICBmaQogIGlmIHRlc3QgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMSIgLWEgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMiIgLWEgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMyI7IHRoZW4KICAgIEFDX01TR19FUlJPUihJbGxlZ2FsIHZlcnNpb24gbnVtYmVyIHBhc3NlZCB0byAtLXdpdGgtZGVmYXVsdC1zbm1wLXZlcnNpb24pCiAgZmkKZmkKCkFDX0FSR19XSVRIKHN5c19jb250YWN0LApbICAtLXdpdGgtc3lzLWNvbnRhY3Q9Indob0B3aGVyZSIgIERlZmF1bHQgc3lzdGVtIGNvbnRhY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEZWZhdWx0OiBMT0dJTkBET01BSU5OQU1FKV0sCiAgICBhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX1NZU19DT05UQUNUPSIkd2l0aF9zeXNfY29udGFjdCIpCkFDX0FSR19FTkFCTEUoc3lzX2NvbnRhY3QsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtc3lzLWNvbnRhY3QvLS13aXRob3V0LXN5cy1jb250YWN0IGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgoc3lzX2xvY2F0aW9uLApbICAtLXdpdGgtc3lzLWxvY2F0aW9uPSJsb2NhdGlvbiIgIERlZmF1bHQgc3lzdGVtIGxvY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGVmYXVsdDogVW5rbm93bildLAogICAgYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9TWVNfTE9DPSIkd2l0aF9zeXNfbG9jYXRpb24iKQpBQ19BUkdfRU5BQkxFKHN5c19sb2NhdGlvbiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1zeXMtbG9jYXRpb24vLS13aXRob3V0LXN5cy1sb2NhdGlvbiBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKGxvZ2ZpbGUsClsgIC0td2l0aC1sb2dmaWxlPSJsb2NhdGlvbiIgICAgICAgRGVmYXVsdCBsb2cgZmlsZSBsb2NhdGlvbiBmb3Igc25tcGQuXSwKICAgIGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfTE9HRklMRT0iJHdpdGhfbG9nZmlsZSIpCkFDX0FSR19FTkFCTEUobG9nZmlsZSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1sb2dmaWxlLy0td2l0aG91dC1sb2dmaWxlIGluc3RlYWQgXSkgKQppZiB0ZXN0ICIkYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9MT0dGSUxFIiA9ICJubyI7IHRoZW4KICAgIGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfTE9HRklMRT0ibm9uZSIKZmkKCkFDX0FSR19XSVRIKHRyYW5zcG9ydHMsClsgIC0td2l0aC10cmFuc3BvcnRzPSJ0MSB0MiAuLi4iICAgQ29tcGlsZSBpbiB0aGUgZ2l2ZW4gU05NUCB0cmFuc3BvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyAoc3BhY2Ugc2VwYXJhdGVkIGxpc3QpLl0pCkFDX0FSR19XSVRIKG91dF90cmFuc3BvcnRzLApbICAtLXdpdGgtb3V0LXRyYW5zcG9ydHM9InQxIC4uLiIgIEV4Y2x1ZGUgbGlzdGVkIFNOTVAgdHJhbnNwb3J0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BhY2Ugc2VwYXJhdGVkIGxpc3QpLgoKICBBdmFpbGFibGUgU05NUCB0cmFuc3BvcnQgbW9kdWxlcyBhcmU6CgogICAgVURQICAgICAgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIFVEUC9JUC4KICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNwb3J0IGlzIGFsd2F5cyBjb21waWxlZCBpbi4KICAgIFVEUElQdjYgICAgIHN1cHBvcnQgZm9yIFNOTVAgb3ZlciBVRFAvSVB2Ni4KICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZSBmb3IgTGludXgsIFNvbGFyaXMgYW5kCiAgICAgICAgICAgICAgICBGcmVlQlNEIGF0IGxlYXN0LgogICAgICAgICAgICAgICAgSXQgaXMgbmV2ZXIgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4KICAgIFRDUElQdjYgICAgIHN1cHBvcnQgZm9yIFNOTVAgb3ZlciBVRFAvSVB2Ni4KICAgICAgICAgICAgICAgIFRoaXMgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZSBmb3IgTGludXgsIFNvbGFyaXMgYW5kCiAgICAgICAgICAgICAgICBGcmVlQlNEIGF0IGxlYXN0LgogICAgICAgICAgICAgICAgSXQgaXMgbmV2ZXIgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4KICAgIFRDUCAgICAgICAgIHN1cHBvcnQgZm9yIFNOTVAgb3ZlciBUQ1AvSVAuCiAgICAgICAgICAgICAgICBUaGlzIHRyYW5zcG9ydCBpcyBjb21waWxlZCBpbiBieSBkZWZhdWx0LCBidXQgbWF5IGJlIG9taXR0ZWQuCiAgICBVbml4ICAgICAgICBzdXBwb3J0IGZvciBTTk1QIG92ZXIgVW5peCBkb21haW4gcHJvdG9jb2xzLgogICAgICAgICAgICAgICAgVGhpcyB0cmFuc3BvcnQgaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdCBleGNlcHQgb24gV2luMzIKICAgICAgICAgICAgICAgIHBsYXRmb3JtcywgYW5kIG1heSBiZSBvbWl0dGVkLgogICAgQ2FsbGJhY2sgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIGFuIGludGVybmFsIGxvY2FsbHkgY29ubmVjdGVkIHBhaXIKICAgICAgICAgICAgICAgIG9mIHNubXBfc2Vzc2lvbnMuCiAgICBBQUw1UFZDICAgICBzdXBwb3J0IGZvciBTTk1QIG92ZXIgQUFMNSBQVkNzLgogICAgICAgICAgICAgICAgVGhpcyB0cmFuc3BvcnQgaXMgcHJlc2VudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBMaW51eCwKICAgICAgICAgICAgICAgIGlzIG5ldmVyIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQgYW5kIG1heSBiZSBvbWl0dGVkLgogICAgSVBYICAgICAgICAgc3VwcG9ydCBmb3IgU05NUCBvdmVyIElQWCBwZXIgUkZDIDE0MjAuCiAgICAgICAgICAgICAgICBUaGlzIHRyYW5zcG9ydCBpcyBwcmVzZW50bHkgb25seSBhdmFpbGFibGUgZm9yIExpbnV4LAogICAgICAgICAgICAgICAgaXMgbmV2ZXIgY29tcGlsZWQgaW4gYnkgZGVmYXVsdCBhbmQgbWF5IGJlIG9taXR0ZWQuCl0pCgojCiMgQ2F0Y2ggY29tbW9uIG1pc3Rha2VzIGluIHRyYW5zcG9ydCBvcHRpb25zCiMKQUNfQVJHX1dJVEgodHJhbnNwb3J0LCwgICAgQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtdHJhbnNwb3J0cy8tLXdpdGhvdXQtdHJhbnNwb3J0cyBpbnN0ZWFkIF0pICAgICApCkFDX0FSR19XSVRIKG91dC10cmFuc3BvcnQsLEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLW91dC10cmFuc3BvcnRzLy0td2l0aG91dC1vdXQtdHJhbnNwb3J0cyBpbnN0ZWFkIF0pICkKCiMKIyBzZWN1cml0eSBtb2R1bGVzCiMKCkFDX0FSR19XSVRIKHNlY3VyaXR5LW1vZHVsZXMsClsgIC0td2l0aC1zZWN1cml0eS1tb2R1bGVzPSJzMSBzMiAuLi4iICAgQ29tcGlsZSBpbiB0aGUgZ2l2ZW4gU05NUCBzZWN1cml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgc2VydmljZXMgKHNwYWNlIHNlcGFyYXRlZCBsaXN0KS4KCiAgQXZhaWxhYmxlIFNOTVAgc2VjdXJpdHkgc2VydmljZXM6CgogICAgICAgIHVzbSAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciB1c2VyIGJhc2VkIFNOTVAgc2VjdXJpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVpcmVkIGFuZCBhbHdheXMgY29tcGlsZWQgaW4pCiAgICAgICAga3NtICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIGtlcmJlcm9zIGJhc2VkIFNOTVAgc2VjdXJpdHkKXSkKQUNfQVJHX0VOQUJMRShzZWN1cml0eS1tb2R1bGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXNlY3VyaXR5LW1vZHVsZXMvLS13aXRob3V0LXNlY3VyaXR5LW1vZHVsZXMgaW5zdGVhZCBdKSApCgojCiMgbWliIG1vZHVsZXMKIwoKQUNfQVJHX1dJVEgobWliX21vZHVsZXMsClsgIC0td2l0aC1taWItbW9kdWxlcz0iaXRlbTEgLi4uIiAgQ29tcGlsZSB3aXRoIGFkZGl0aW9uYWwgbWliIG1vZHVsZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNwYWNlIHNlcGFyYXRlZCBsaXN0KS5dKQpBQ19BUkdfRU5BQkxFKG1pYl9tb2R1bGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLW1pYi1tb2R1bGVzLy0td2l0aG91dC1taWItbW9kdWxlcyBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKG91dF9taWJfbW9kdWxlcywKWyAgLS13aXRoLW91dC1taWItbW9kdWxlcz0ibGlzdCIgICBDb21waWxlIHdpdGhvdXQgdGhlc2UgbWliIG1vZHVsZXMuCgogIERlZmF1bHQgbWliIG1vZHVsZXMgY29tcGlsZWQgaW50byB0aGUgYWdlbnQgKHdoaWNoIGNhbiBiZSByZW1vdmVkKToKICAKICAgIG1pYklJICAgICAgICAgICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIG1pYi1JSSB0cmVlLgogICAgc25tcHYzbWlicyAgICAgICAgICAgICBzdXBwb3J0IGZvciB0aGUgc25tcHYzIG1pYiBtb2R1bGVzLgogICAgdWNkX3NubXAgICAgICAgICAgICAgICBVQ0QtU05NUC1NSUIgc3BlY2lmaWMgZXh0ZW5zaW9ucy4KICAgIGFnZW50X21pYnMgICAgICAgICAgICAgTkVULVNOTVAtQUdFTlQtTUlCIGV4dGVuc2lvbnMKICAgIGFnZW50eCAgICAgICAgICAgICAgICAgQWdlbnRYIHN1cHBvcnQgKHNlZSBiZWxvdykKICAgIG5vdGlmaWNhdGlvbiAgICAgICAgICAgbWlicyBzdXBwb3J0aW5nIHNwZWNpZmljYXRpb24gb2YgdHJhcCBkZXN0aW5hdGlvbnMuCiAgICB0YXJnZXQgICAgICAgICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBTTk1QIFdHcyBUQVJHRVQtTUlCLgogICAgdXRpbGl0aWVzICAgICAgICAgICAgICBnZW5lcmFsIGFnZW50IGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzLgogICAgZGlzbWFuL2V2ZW50ICAgICAgICAgICBzdXBwb3J0IGZvciB0aGUgRElTTUFOLUVWRU5ULU1JQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdXBwb3J0cyBzZWxmIG1vbml0b3JpbmcgYW5kIG5vdGlmaWNhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnkgd2hlbiBlcnJvciBjb25kaXRpb25zIGFyZSBmb3VuZCkKICAgIGRpc21hbi9zY2hlZHVsZSAgICAgICAgc3VwcG9ydCBmb3IgdGhlIERJU01BTi1TQ0hFRFVMRS1NSUIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlciBTRVQgcmVxdWVzdHMgYXQgc3BlY2lmaWVkIHRpbWVzKQogICAgaG9zdCAgICAgICAgICAgICAgICAgICBob3N0IHJlc291cmNlcyBtaWIgc3VwcG9ydC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSBvbiBtYWpvciBzdXBwb3J0ZWQgcGxhdGZvcm1zKQoKICBPcHRpb25hbCBtaWIgbW9kdWxlcyB0aGF0IGNhbiBiZSBidWlsdCBpbnRvIHRoZSBhZ2VudCBpbmNsdWRlOgogICAgc211eCAgICAgICAgICAgICAgICAgICBzbXV4IHN1cHBvcnQgdG8gYWxsb3cgc3ViYWdlbnRzIHRvIGF0dGFjaCB0byBzbm1wZC4KICAgIG1pYklJL210YV9zZW5kbWFpbCAgICAgU2VuZG1haWwgc3RhdGlzdGljcyBtb25pdG9yaW5nIChNVEEtTUlCKQogICAgdWNkLXNubXAvZGlza2lvICAgICAgICBUYWJsZSBvZiBpby1kZXZpY2VzIGFuZCBob3cgbXVjaCBkYXRhIHRoZXkgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkL3dyaXR0ZW4uICAob25seSB0ZXN0ZWQgb24gU29sYXJpcywgTGludXgpCiAgICBkaXNtYW4vb2xkLWV2ZW50LW1pYiAgIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBESVNNQU4tRVZFTlQtTUlCCgogIE9wdGlvbmFsIG1vZHVsZXMgZm9yIHNwZWNpZmljIHBsYXRmb3JtcwogICAgTGludXgKICAgICAgdWNkLXNubXAvbG1TZW5zb3JzICAgaGFyZHdhcmUgbW9uaXRvcmluZyAoTE0tU0VOU09SUy1NSUIpCiAgICAgIGlwLW1pYi9pcHY0SW50ZXJmYWNlVGFibGUgIChleHBlcmltZW50YWwpCiAgICAgIGlwLW1pYi9pcHY2SW50ZXJmYWNlVGFibGUgIChleHBlcmltZW50YWwpCiAgICAgIHR1bm5lbCAgICAgICAgICAgICAgIExpbnV4IFRVTk5FTC1NSUIgc3VwcG9ydCAoaWZUYWJsZSBleHRlbnNpb24pCiAgICAgIG1pYklJL2ludGVyZmFjZXMgICAgIChvbGQgaWZUYWJsZSBpbXBsZW1lbnRhdGlvbikKICAgICAgbWlzYy9pcGZ3YWNjICAgICAgICAgYWNjb3VudGluZyBydWxlcyBJUCBmaXJld2FsbCBpbmZvcm1hdGlvbgogICAgICBpcGZ3Y2hhaW5zL2lwZndjaGFpbnMgIGZpcmV3YWxsIGNoYWlucyB1bmRlciBpcGZ3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNlZSBhZ2VudC9taWJncm91cC9pcGZ3Y2hhaW5zL1JFQURNRSkKICAgICAgc2N0cC1taWIgICAgICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIFNDVFAtTUlCCgogICAgU29sYXJpcwogICAgICB1Y2Qtc25tcC9sbVNlbnNvcnMgICBoYXJkd2FyZSBtb25pdG9yaW5nIChMTS1TRU5TT1JTLU1JQikKICAgICAgaWYtbWliICAgICAgICAgICAgICAgSUYtTUlCIHJld3JpdGUgKGFkZCAtLWVuYWJsZS1tZmQtcmV3cml0ZXMpCiAgICAgIHRjcC1taWIgICAgICAgICAgICAgIFRDUC1NSUIgcmV3cml0ZSAodGNwQ29ubmVjdGlvblRhYmxlIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcExpc3RlbmVyVGFibGU7IGFkZCAtLWVuYWJsZS1tZmQtcmV3cml0ZXMpCiAgICAgIHVkcC1taWIgICAgICAgICAgICAgIFVEUC1NSUIgcmV3cml0ZSAodWRwRW5kcG9pbnRUYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgLS1lbmFibGUtbWZkLXJld3JpdGVzKQoKICAgIEZyZWVCU0QvT3BlbkJTRAogICAgICBpZi1taWIgICAgICAgICAgICAgICBJRi1NSUIgcmV3cml0ZSAoYWRkIC0tZW5hYmxlLW1mZC1yZXdyaXRlcykKCiAgQWdlbnRYIHN1cHBvcnQ6CiAgICBhZ2VudHgvc3ViYWdlbnQgICAgICAgIGFsbG93cyB0aGUgYWdlbnQgdG8gcnVuIGFzIGVpdGhlciBhIHNubXAgYWdlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXMgYW4gYWdlbnRYIHN1Yi1hZ2VudC4KICAgIGFnZW50eC9tYXN0ZXIgICAgICAgICAgbWFrZXMgdGhlIGFnZW50IHJ1biBhcyBhbiBhZ2VudFggbWFzdGVyIGFnZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHdlbGwgYXMgYSBub3JtYWwgc25tcCBhZ2VudC4KICAgIGFnZW50eCAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYm90aCBhZ2VudHgvbWFzdGVyIGFuZCBhZ2VudHgvY2xpZW50LgoKICBPcHRpb25hbCBtb2R1bGVzIGZvciBDIGNvZGVycyB0byBsb29rIGF0IGFuZC9vciBpbmNsdWRlIGFzIGV4dGVuc2lvbiBleGFtcGxlczoKICAKICAgIGV4YW1wbGVzL3VjZERlbW9QdWJsaWMgIFNOTVB2MyBpbnRlcm9wZXJhYmlsaXR5IHRlc3RpbmcgbWliLgogICAgZXhhbXBsZXMvZXhhbXBsZSAgICAgICAgZXhhbXBsZSBDIGNvZGUgZXh0ZW5zaW9uLl0pCkFDX0FSR19FTkFCTEUob3V0X21pYl9tb2R1bGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLW91dC1taWItbW9kdWxlcy8tLXdpdGhvdXQtb3V0LW1pYi1tb2R1bGVzIGluc3RlYWQgXSkgKQoKCiMKQUNfQVJHX1dJVEgoZW50ZXJwcmlzZS1vaWQsCltFbnRlcnByaXNlIE9JRHM6ICAod2FybmluZzogdGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIGNhdXRpb24uKQoKICAtLXdpdGgtZW50ZXJwcmlzZS1vaWQgICAgICAgICAgICAgIFRoZSBlbnRlcnByaXNlIG51bWJlciBhc3NpZ25lZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvciBieSBJQU5BLiAgU2VlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmlhbmEub3JnL2NnaS1iaW4vZW50ZXJwcmlzZS5wbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZ2V0IG9uZSwgdGhvdWdoIHVzaW5nIHRoZSBkZWZhdWx0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iYWJseSB0aGUgcmlnaHQgY2hvaWNlIGlzIG1vc3QgY2FzZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA4MDcyID0gImVudGVycHJpc2UubmV0LXNubXAiKV0sWwogIGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFsgUGxlYXNlIHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIGVudGVycHJpc2UgbnVtYmVyIF0pOwogIGZpCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfRU5URVJQUklTRV9PSUQsICR3aXRodmFsKQogIGVudF9vaWQ9IjEsMyw2LDEsNCwxLCR3aXRodmFsIgogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0VOVEVSUFJJU0VfTUlCLCAkZW50X29pZCkKICBlbnRfZG90X29pZD0iMS4zLjYuMS40LjEuJHdpdGh2YWwiCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfRU5URVJQUklTRV9ET1RfTUlCLCAkZW50X2RvdF9vaWQpCiAgQUNfTVNHX1JFU1VMVCh1c2luZyBlbnRlcnByaXNlIG51bWJlciAkd2l0aHZhbCkKXSxbCiAgQUNfTVNHX1JFU1VMVCh1c2luZyBkZWZhdWx0ICJlbnRlcnByaXNlLm5ldC1zbm1wIikKXSkKQUNfQVJHX0VOQUJMRShlbnRlcnByaXNlLW9pZCwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1lbnRlcnByaXNlLW9pZC8tLXdpdGhvdXQtZW50ZXJwcmlzZS1vaWQgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChlbnRlcnByaXNlLXN5c29pZCwKWwogIC0td2l0aC1lbnRlcnByaXNlLXN5c29pZCAgICAgICAgICAgVGhlIGJhc2UgT0lEIGZvciB0aGUgc3lzT2JqZWN0SUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzeXN0ZW0gZ3JvdXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IC4xLjMuNi4xLjQuMS44MDcyLjMuMi4uLiA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXRTbm1wQWdlbnRPSURzLi4uIildLFsKICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KICAgIEFDX01TR19FUlJPUihbIFBsZWFzZSBwcm92aWRlIGEgYmFzZSBPSUQgdmFsdWUgXSk7CiAgZmkKICBzeXNfb2lkPWBlY2hvICIkd2l0aHZhbCIgfCBzZWQgJ3MvXlwuLy8nIHwgc2VkICdzL1wuL1wsL2cnYAogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX1NZU1RFTV9NSUIsICRzeXNfb2lkKQogIHN5c19kb3Rfb2lkPWBlY2hvICIkd2l0aHZhbCIgfCBzZWQgJ3MvXlwuLy8nYAogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX1NZU1RFTV9ET1RfTUlCLCAkc3lzX2RvdF9vaWQpCiAgc3lzb2lkX2xlbj1gZWNobyAiJHdpdGh2YWwiIHwgc2VkICdzL1teXC5dLy9nJyB8IGF3ayAtRlwuICd7IHByaW50IE5GIH0nYAogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX1NZU1RFTV9ET1RfTUlCX0xFTkdUSCwgJHN5c29pZF9sZW4pCiAgQUNfTVNHX1JFU1VMVCh1c2luZyBlbnRlcnByaXNlIHN5c09JRCAkd2l0aHZhbCAuLi4uKQpdLFsKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGRlZmF1bHQgZW50ZXJwcmlzZSBzeXNPSUQgIk5FVC1TTk1QLU1JQjo6bmV0U25tcEFnZW50T0lEcy4uLiIpCl0pCkFDX0FSR19FTkFCTEUoZW50ZXJwcmlzZS1zeXNvaWQsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtZW50ZXJwcmlzZS1zeXNvaWQvLS13aXRob3V0LWVudGVycHJpc2Utc3lzb2lkIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgoZW50ZXJwcmlzZS1ub3RpZmljYXRpb24tb2lkLApbCiAgLS13aXRoLWVudGVycHJpc2Utbm90aWZpY2F0aW9uLW9pZCBUaGUgT0lEIHVzZWQgZm9yIHRoZSByb290IG9mCgkJCQkgICAgIGVudGVycHJpc2Ugc3BlY2lmaWMgbm90aWZpY2F0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IC4xLjMuNi4xLjQuMS44MDcyLjQgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV0U25tcE5vdGlmaWNhdGlvblByZWZpeCIpXSxbCiAgaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWyBQbGVhc2UgcHJvdmlkZSBhIGJhc2UgT0lEIHZhbHVlIF0pOwogIGZpCiAgbm90aWZpY2F0aW9uX29pZD1gZWNobyAiJHdpdGh2YWwiIHwgc2VkICdzL15cLi8vJyB8IHNlZCAncy9cLi9cLC9nJ2AKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9OT1RJRklDQVRJT05fTUlCLCAkbm90aWZpY2F0aW9uX29pZCkKICBub3RpZmljYXRpb25fZG90X29pZD1gZWNobyAiJHdpdGh2YWwiIHwgc2VkICdzL15cLi8vJ2AKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9OT1RJRklDQVRJT05fRE9UX01JQiwgJG5vdGlmaWNhdGlvbl9kb3Rfb2lkKQogIG5vdGlmaWNhdGlvbm9pZF9sZW49YGVjaG8gIiR3aXRodmFsIiB8IHNlZCAncy9bXlwuXS8vZycgfCBhd2sgLUZcLiAneyBwcmludCBORiB9J2AKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9OT1RJRklDQVRJT05fRE9UX01JQl9MRU5HVEgsICRub3RpZmljYXRpb25vaWRfbGVuKQogIEFDX01TR19SRVNVTFQodXNpbmcgZW50ZXJwcmlzZSBub3RpZmljYXRpb25zICR3aXRodmFsKQpdLFsKICBBQ19NU0dfUkVTVUxUKHVzaW5nIGRlZmF1bHQgbm90aWZpY2F0aW9ucyAiTkVULVNOTVAtTUlCOjpuZXRTbm1wTm90aWZpY2F0aW9ucyIpCl0pCkFDX0FSR19FTkFCTEUoZW50ZXJwcmlzZS1ub3RpZmljYXRpb24tb2lkLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWVudGVycHJpc2Utbm90aWZpY2F0aW9uLW9pZC8tLXdpdGhvdXQtZW50ZXJwcmlzZS1ub3RpZmljYXRpb24tb2lkIGluc3RlYWQgXSkgKQojCiMgQ2F0Y2ggY29tbW9uIG1pc3Rha2VzIGluIGNvbmZpZ3VyZSBvcHRpb25zCiMKQUNfQVJHX1dJVEgobWliLW1vZHVsZSwsICAgIEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uMS4gVXNlIC0td2l0aC1taWItbW9kdWxlcyBpbnN0ZWFkIF0pICAgICApCkFDX0FSR19XSVRIKG1vZHVsZSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbjMuIFVzZSAtLXdpdGgtbWliLW1vZHVsZXMgaW5zdGVhZCBdKSApCkFDX0FSR19XSVRIKG1vZHVsZXMsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb240LiBVc2UgLS13aXRoLW1pYi1tb2R1bGVzIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgob3V0LW1pYi1tb2R1bGUsLEFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uNS4gVXNlIC0td2l0aC1vdXQtbWliLW1vZHVsZXMgaW5zdGVhZCBdKSApCkFDX0FSR19XSVRIKG91dC1tb2R1bGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uNy4gVXNlIC0td2l0aC1vdXQtbWliLW1vZHVsZXMgaW5zdGVhZCBdKSApCkFDX0FSR19XSVRIKG91dC1tb2R1bGUsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb244LiBVc2UgLS13aXRoLW91dC1taWItbW9kdWxlcyBpbnN0ZWFkIF0pICkKCiMKIyBQZXJsIHNwZWNpZmljCiMKQUNfQVJHX1dJVEgocGVybC1tb2R1bGVzLApbClBlcmw6CiAgLS13aXRoLXBlcmwtbW9kdWxlc1s9QVJHU10gICAgICBJbnN0YWxsIHRoZSBQZXJsIG1vZHVsZXMgYWxvbmcgd2l0aCB0aGUgcmVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG5ldC1zbm1wIHRvb2xraXQuICBJZiBBUkdTIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQsIHRoZXkncmUgcGFzc2VkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZWZpbGUuUEwgc2NyaXB0Ll0sWwogICAgaWYgdGVzdCAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgogICAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgZWxzZQogICAgICBpbnN0YWxsX3Blcmw9InllcyIKICAgICAgaWYgdGVzdCAiJHdpdGh2YWwiICE9ICJ5ZXMiOyB0aGVuCiAgICAgICAgUEVSTEFSR1M9IiR3aXRodmFsIgogICAgICBmaQogICAgZmkKXSwgaW5zdGFsbF9wZXJsPSJ0cnkiKQoKQUNfQVJHX0VOQUJMRShlbWJlZGRlZC1wZXJsLApbICAtLWRpc2FibGUtZW1iZWRkZWQtcGVybCAgICAgICAgIERpc2FibGUgZW1iZWRkZWQgUGVybCBpbiB0aGUgU05NUCBhZ2VudCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNubXB0cmFwZC4gW2VuYWJsZWQgYnkgZGVmYXVsdF1dLAogICAgZW1iZWRfcGVybD0iJGVuYWJsZXZhbCIsIGVtYmVkX3Blcmw9InRyeSIpCgpBQ19BUkdfRU5BQkxFKHBlcmwtY2MtY2hlY2tzLApbICAtLWRpc2FibGUtcGVybC1jYy1jaGVja3MgICAgICAgIERpc2FibGUgY29uZmlndXJlIGNoZWNrcyBmb3Igd2hldGhlciBQZXJsJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMgQ29tcGlsZXIgaXMgY29tcGF0aWJsZSB3aXRoIG91cnMgd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWQgUGVybCBpcyBlbmFibGVkLl0pCgojIENvbW1vbiBwZXJsIG1pc3Rha2VzCkFDX0FSR19FTkFCTEUocGVybC1tb2R1bGVzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLXBlcmwtbW9kdWxlcy8tLXdpdGhvdXQtcGVybC1tb2R1bGVzIGluc3RlYWQgXSkgKQpBQ19BUkdfV0lUSChlbWJlZGRlZC1wZXJsLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS1lbmFibGUtZW1iZWRkZWQtcGVybC8tLWRpc2FibGUtZW1iZWRkZWQtcGVybCBpbnN0ZWFkIF0pICkKQUNfQVJHX1dJVEgocGVybC1jYy1jaGVja3MsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLWVuYWJsZS1wZXJsLWNjLWNoZWNrcy8tLWRpc2FibGUtcGVybC1jYy1jaGVja3MgaW5zdGVhZCBdKSApCgoKIwojIFB5dGhvbiBzcGVjaWZpYwojCkFDX0FSR19XSVRIKHB5dGhvbi1tb2R1bGVzLApbClB5dGhvbjoKICAtLXdpdGgtcHl0aG9uLW1vZHVsZXNbPUFSR1NdICAgIEluc3RhbGwgdGhlIHB5dGhvbiBiaW5kaW5ncyBhbG9uZyB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCBvZiB0aGUgbmV0LXNubXAgdG9vbGtpdC4gIElmIEFSR1MgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhleSdyZSBwYXNzZWQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cC5weSBzY3JpcHQgYXMgYXJndW1lbnRzLl0sWwogICAgaW5zdGFsbF9weXRob249InllcyIKICAgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJ5ZXMiOyB0aGVuCiAgICAgIFBZVEhPTkFSR1M9IiIKICAgIGVsaWYgdGVzdCAiJHdpdGh2YWwiID0gIm5vIjsgdGhlbgogICAgICBQWVRIT05BUkdTPSIiCiAgICAgIGluc3RhbGxfcHl0aG9uPSJubyIKICAgIGVsc2UKICAgICAgUFlUSE9OQVJHUz0iJHdpdGh2YWwiCiAgICBmaQpdLCBpbnN0YWxsX3B5dGhvbj0ibm8iKQoKIyBvdGhlciBmbGFncwoKQUNfQVJHX1dJVEgoc2VydmVyLXNlbmQtYnVmLApbCk5ldHdvcmsgQnVmZmVyczoKICAtLXdpdGgtc2VydmVyLXNlbmQtYnVmWz1BUkddICAgIFVzZSBBUkcgZm9yIHRoZSBkZWZhdWx0IFVEUC9UQ1Agc2VuZCBidWZmZXIgaW5zdGVhZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIE9TIGJ1ZmZlciBmb3Igc2VydmVyIHNvY2tldHMgdGhhdCBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgKHNubXBkLCBzbm1wdHJhcGQpLiAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIHJ1bnRpbWUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIEFSRyBzaG91bGQgYmUgdGhlIHNpemUgaW4gYnl0ZXNdLFsKICAgaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoWyBQbGVhc2UgcHJvdmlkZSBhIHBvc2l0aXZlIG51bWJlciBmb3IgdGhlIHNlcnZlciBzZW5kIGJ1ZmZlciBdKQogICBmaQogICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9ERUZBVUxUX1NFUlZFUl9TRU5EX0JVRiwgJHdpdGh2YWwpXSwKICAgQUNfTVNHX1JFU1VMVChbdXNpbmcgT1MgZGVmYXVsdCBzZW5kIGJ1ZmZlciBzaXplIGZvciBzZXJ2ZXIgc29ja2V0c10pICkKQUNfQVJHX0VOQUJMRShzZXJ2ZXItc2VuZC1idWYsLAoJQUNfTVNHX0VSUk9SKFsgSW52YWxpZCBvcHRpb24uIFVzZSAtLXdpdGgtc2VydmVyLXNlbmQtYnVmLy0td2l0aG91dC1zZXJ2ZXItc2VuZC1idWYgaW5zdGVhZCBdKSApCgpBQ19BUkdfV0lUSChzZXJ2ZXItcmVjdi1idWYsClsgIC0td2l0aC1zZXJ2ZXItcmVjdi1idWZbPUFSR10gICAgU2ltaWxhciBhcyBwcmV2aW91cyBvcHRpb24sIGJ1dCBmb3IgcmVjZWl2ZSBidWZmZXJdLFsKICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KICAgIEFDX01TR19FUlJPUihbIFBsZWFzZSBwcm92aWRlIGEgcG9zaXRpdmUgbnVtYmVyIGZvciB0aGUgc2VydmVyIHJlY3YgYnVmZmVyIF0pCiAgZmkKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9ERUZBVUxUX1NFUlZFUl9SRUNWX0JVRiwgJHdpdGh2YWwpXSwKICBBQ19NU0dfUkVTVUxUKFt1c2luZyBPUyBkZWZhdWx0IHJlY3YgYnVmZmVyIHNpemUgZm9yIHNlcnZlciBzb2NrZXRzXSkgKQpBQ19BUkdfRU5BQkxFKHNlcnZlci1yZWN2LWJ1ZiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1zZXJ2ZXItcmVjdi1idWYvLS13aXRob3V0LXNlcnZlci1yZWN2LWJ1ZiBpbnN0ZWFkIF0pICkKCkFDX0FSR19XSVRIKGNsaWVudC1zZW5kLWJ1ZiwKWyAgLS13aXRoLWNsaWVudC1zZW5kLWJ1Zls9QVJHXSAgICBTaW1pbGFyIGFzIHByZXZpb3VzIG9wdGlvbnMsIGJ1dCBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlIGJ1ZmZlciBvZiBjbGllbnQgc29ja2V0c10sWwogIGlmIHRlc3QgIiR3aXRodmFsIiA9IHllczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFsgUGxlYXNlIHByb3ZpZGUgYSBwb3NpdGl2ZSBudW1iZXIgZm9yIHRoZSBjbGllbnQgc2VuZCBidWZmZXIgXSkKICBmaQogIEFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX0RFRkFVTFRfQ0xJRU5UX1NFTkRfQlVGLCAkd2l0aHZhbCldLAogIEFDX01TR19SRVNVTFQoW3VzaW5nIE9TIGRlZmF1bHQgc2VuZCBidWZmZXIgc2l6ZSBmb3IgY2xpZW50IHNvY2tldHNdKSApCkFDX0FSR19FTkFCTEUoY2xpZW50LXNlbmQtYnVmLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWNsaWVudC1zZW5kLWJ1Zi8tLXdpdGhvdXQtY2xpZW50LXNlbmQtYnVmIGluc3RlYWQgXSkgKQoKQUNfQVJHX1dJVEgoY2xpZW50LXJlY3YtYnVmLApbICAtLXdpdGgtY2xpZW50LXJlY3YtYnVmWz1BUkddICAgIFNpbWlsYXIgYXMgcHJldmlvdXMgb3B0aW9ucywgYnV0IGZvciB0aGUgc2VuZCBidWZmZXJdLFsKICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXM7IHRoZW4KICAgIEFDX01TR19FUlJPUihbIFBsZWFzZSBwcm92aWRlIGEgcG9zaXRpdmUgbnVtYmVyIGZvciB0aGUgY2xpZW50IHJlY3YgYnVmZmVyIF0pCiAgZmkKICBBQ19ERUZJTkVfVU5RVU9URUQoTkVUU05NUF9ERUZBVUxUX0NMSUVOVF9SRUNWX0JVRiwgJHdpdGh2YWwpXSwKICBBQ19NU0dfUkVTVUxUKFt1c2luZyBPUyBkZWZhdWx0IHJlY3YgYnVmZmVyIHNpemUgZm9yIGNsaWVudCBzb2NrZXRzXSkgKQpBQ19BUkdfRU5BQkxFKGNsaWVudC1yZWN2LWJ1ZiwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0td2l0aC1jbGllbnQtcmVjdi1idWYvLS13aXRob3V0LWNsaWVudC1yZWN2LWJ1ZiBpbnN0ZWFkIF0pICkKCiMKIyBvdGhlcndpc2UgcHJvbXB0ZWQgaW5mb3JtYXRpb24KIwpBQ19BUkdfV0lUSChkZWZhdWx0cywKWwpNaXNjZWxsYW5lb3VzOgogIC0td2l0aC1kZWZhdWx0cyAgICAgICAgIFVzZSBkZWZhdWx0cyBmb3IgcHJvbXB0ZWQgdmFsdWVzLl0sCiAgICBkZWZhdWx0cz0ieWVzIixkZWZhdWx0cz0ibm8iKQpBQ19BUkdfRU5BQkxFKGRlZmF1bHRzLCwKCUFDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWRlZmF1bHRzLy0td2l0aG91dC1kZWZhdWx0cyBpbnN0ZWFkIF0pICkKCkFDX0FSR19FTkFCTEUodWNkLXNubXAtY29tcGF0aWJpbGl0eSwKWyAgLS1lbmFibGUtdWNkLXNubXAtY29tcGF0aWJpbGl0eSBJbnN0YWxsIHVjZC1zbm1wIGxvb2stYWxpa2UgaGVhZGVycyBhbmQgbGlicy4KXSkKQUNfQVJHX1dJVEgodWNkLXNubXAtY29tcGF0aWJpbGl0eSwsCglBQ19NU0dfRVJST1IoWyBJbnZhbGlkIG9wdGlvbi4gVXNlIC0tZW5hYmxlLXVjZC1zbm1wLWNvbXBhdGliaWxpdHkvLS1kaXNhYmxlLXVjZC1zbm1wLWNvbXBhdGliaWxpdHkgaW5zdGVhZCBdKSApCgojCiMgc2V0dXAgaW5zdGFsbCB0YXJnZXRzCiMKaWYgdGVzdCAieCRlbmFibGVfdWNkX3NubXBfY29tcGF0aWJpbGl0eSIgPSAieHllcyIgOyB0aGVuCQogIGluc3RhbGx1Y2RoZWFkZXJzPWluc3RhbGx1Y2RoZWFkZXJzCiAgaW5zdGFsbHVjZGxpYnM9aW5zdGFsbHVjZGxpYnMKICBBQ19NU0dfQ0FDSEVfQUREKFVDRC1TTk1QIGNvbXBhdGFiaWxpdHk6ICAgICBlbmFibGVkKQpmaQpBQ19TVUJTVChpbnN0YWxsdWNkaGVhZGVycykKQUNfU1VCU1QoaW5zdGFsbHVjZGxpYnMpCgojIE9ubHkgZGVmaW5lIGlmIHNwZWNpZmljYWxseSBjaG9zZW4gYXMgLS13aXRob3V0IChpLmUuLCBkZWZhdWx0IHRvIHRydWUpLiAKaWYgdGVzdCAieCR3aXRoX3Jvb3RfYWNjZXNzIiA9ICJ4bm8iOyB0aGVuCiAgQUNfREVGSU5FKE5FVFNOTVBfTk9fUk9PVF9BQ0NFU1MpCmZpCgojIE9ubHkgZGVmaW5lIGlmIHNwZWNpZmljYWxseSBjaG9zZW4gYXMgLS13aXRob3V0IChpLmUuLCBkZWZhdWx0IHRvIHRydWUpLgppZiB0ZXN0ICJ4JHdpdGhfa21lbV91c2FnZSIgPSAieG5vIjsgdGhlbgogIEFDX0RFRklORShORVRTTk1QX05PX0tNRU1fVVNBR0UpCmZpCgojIERlZmluZSB1bmxlc3Mgc3BlY2lmaWNhbGx5IHN1cHByZXNzZWQgKGkuZS4sIG9wdGlvbiBkZWZhdWx0cyB0byBmYWxzZSkuIAppZiB0ZXN0ICJ4JHdpdGhfZHVtbXlfdmFsdWVzIiAhPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoTkVUU05NUF9OT19EVU1NWV9WQUxVRVMpCmZpCgojIE9ubHkgZGVmaW5lIGlmIHNwZWNpZmljYWxseSBjaG9zZW4gYXMgLS13aXRob3V0IChpLmUuLCBkZWZhdWx0IHRvIHRydWUpLiAKaWYgdGVzdCAieCR3aXRoX29wYXF1ZV9zcGVjaWFsX3R5cGVzIiAhPSAieG5vIjsgdGhlbgogIEFDX0RFRklORShORVRTTk1QX1dJVEhfT1BBUVVFX1NQRUNJQUxfVFlQRVMpCmZpCgoKIyBvdmVyZmxvdyBwcm9ibGVtcyB3aXRoIGhwdXgncyBzaAojIHRha2VuIGZyb20gUGVybCdzIENvbmZpZ3VyZSBzY3JpcHQgCgpBQ19NU0dfQ0hFQ0tJTkcoW2lmIEkgbmVlZCB0byBmZWVkIG15c2VsZiB0byBrc2hdKQppZiB0ZXN0IC1mIC9ocC11eCAtYSAtZiAvYmluL2tzaDsgdGhlbgogIGlmIChQQVRIPS47IGFsaWFzIC14KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIEFDX01TR19SRVNVTFQobm8pCiAgZWxzZQogICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICBpZiB0ZXN0ICJ4JDEiID0gIngiOyB0aGVuCiAgICAgIGV4ZWMgL2Jpbi9rc2ggJDAKICAgIGVsc2UKICAgICAgZXhlYyAvYmluL2tzaCAkMCAiJEAiCiAgICBmaQogIGZpCmVsc2UKICBBQ19NU0dfUkVTVUxUKG5vKQpmaQoKaWYgdGVzdCAieCRkZXZlbG9wZXIiICE9ICJ4bm8iIC1hIC1mICRzcmNkaXIvcmVtb3ZlLWZpbGVzOyB0aGVuCiAgIyB0dXJuIG9uIHRoZSBkZXZlbG9wZXIgZmxhZyB3aGVuIHRha2VuIGZyb20gYSBTVk4gY2hlY2tvdXQgKG5vdCBhIHJlbGVhc2UpCiAgZGV2ZWxvcGVyPSJ5ZXMiCmZpCgpBQ19MQU5HKFtDXSkKQUNfUFJPR19DQwpBQ19QUk9HX0NQUApMSU5LQ0M9JHtMSU5LQ0MtIiRDQyJ9CkFDX1NVQlNUKExJTktDQykKQUNfQUlYCgojIHN5c3RlbSBjaGVjawpBQ19DQU5PTklDQUxfVEFSR0VUCmNoYW5nZXF1b3RlKCwgKQpQQVJUSUFMVEFSR0VUT1M9YGVjaG8gJHRhcmdldF9vcyB8IHNlZCAncy9bLS5fXS4qLy8nYApjaGFuZ2VxdW90ZShbLCBdKQoKIyBwbGF0Zm9ybS1zcGVjaWZpYyBjb21waWxlciBmbGFncwppZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIjsgdGhlbgoJQ0ZMQUdTPSIkQ0ZMQUdTIC1EbWluZ3czMiIKZmkKCiMgcGxhdGZvcm0tc3BlY2lmaWMgbGlua2VyIGZsYWdzCmNhc2UgJHRhcmdldF9vcyBpbgogICAgYWl4NC4yKnxhaXg0LjMqfGFpeDUqfGFpeDYqKQogICAgICAgIEFDX01TR19DSEVDS0lORyhbd2hhdCBsaW5rZXIgZmxhZ3MgdG8gYWRkIHRvIGVuYWJsZSBydW50aW1lIGxpbmtpbmcgb24gQUlYXSkKICAgICAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KICAgICAgICAgICAgaWYgKHRlc3QgJGxkX2ZsYWcgPSAiLWJydGwiIHx8IHRlc3QgJGxkX2ZsYWcgPSAiLVdsLC1icnRsIik7IHRoZW4KICAgICAgICAgICAgICAgIG5ldHNubXBfYWl4X3J1bnRpbWVsaW5raW5nX2ZsYWdzX29rPXllcwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZmkKICAgICAgICBkb25lCiAgICAgICAgaWYgdGVzdCAiWCRuZXRzbm1wX2FpeF9ydW50aW1lbGlua2luZ19mbGFnc19vayIgIT0gIlh5ZXMiOyB0aGVuCgkgICAgaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiOyB0aGVuCgkgICAgICAgIG5ldHNubXBfYWl4X2xkZmxhZ3M9Ii1XbCwtYnJ0bCIKCSAgICBlbHNlCiAgICAgICAgICAgICAgICBuZXRzbm1wX2FpeF9sZGZsYWdzPSItYnJ0bCIKCSAgICBmaQogICAgICAgICAgICBMREZMQUdTPSIkbmV0c25tcF9haXhfbGRmbGFncyAkTERGTEFHUyIKCSAgICBBQ19NU0dfUkVTVUxUKCRuZXRzbm1wX2FpeF9sZGZsYWdzKQoJZWxzZQoJICAgIEFDX01TR19SRVNVTFQoW25vbmVdKQoJZmkKCTs7CiAgICBkYXJ3aW44KnxkYXJ3aW45KikKICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgZGFyd2luIGxkIG1pZ2h0IG5lZWQgLWZsYXRfbmFtZXNwYWNlXSkKCWlmIHRlc3QgLXogIiRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQiOyB0aGVuCgkJTERGTEFHUz0iLWZsYXRfbmFtZXNwYWNlICRMREZMQUdTIgoJCUFDX01TR19SRVNVTFQoW3llc10pCgllbHNlCgkJQUNfTVNHX1JFU1VMVChbbm9dKQoJZmkKCTs7CiAgICAqKQogICAgICAgIDs7CmVzYWMKCiMgbGlidG9vbCBzdHVmZiBmb3Igc2hhcmVkL3N0YXRpYyBsaWJyYXJpZXMuCkFDX0xJQlRPT0xfRExPUEVOCkFDX0xJQlRPT0xfV0lOMzJfRExMCkFDX1BST0dfTElCVE9PTApBQ19TVUJTVChMSUJUT09MX0RFUFMpCgojIENoZWNrcyBmb3IgcHJvZ3JhbXMuCkFDX1BST0dfSU5TVEFMTApBQ19QUk9HX0xOX1MKQUNfUFJPR19NQUtFX1NFVApBQ19QUk9HX0VHUkVQCkFDX1BBVEhfUFJPRyhbUFNQUk9HXSxwcykKQUNfUEFUSF9QUk9HKFtQRVJMUFJPR10scGVybCkKQUNfUEFUSF9QUk9HKFtQWVRIT05QUk9HXSxweXRob24pCkFDX0NIRUNLX1BST0dTKFdIT0FNSSwgd2hvYW1pIGxvZ25hbWUsIHdob2FtaSkKQUNfQ0hFQ0tfUFJPR1MoU0VELHNlZCBnc2VkKQpBQ19DSEVDS19QUk9HUyhGSU5ELGZpbmQpCkFDX1BBVEhfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCkFDX1BBVEhfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQppZiB0ZXN0ICJ4JGFjX2N2X3Byb2dfQVVUT0NPTkYiID0gIngiOyB0aGVuCglBVVRPQ09ORj0iOiIKCUFDX1NVQlNUKEFVVE9DT05GKQpmaQppZiB0ZXN0ICJ4JGFjX2N2X3Byb2dfQVVUT0hFQURFUiIgPSAieCI7IHRoZW4KCUFVVE9IRUFERVI9IjoiCglBQ19TVUJTVChBVVRPSEVBREVSKQpmaQoKQUNfUEFUSF9QUk9HKFtVTkFNRVBST0ddLHVuYW1lKQpBQ19ERUZJTkVfVU5RVU9URUQoVU5BTUVQUk9HLCIkVU5BTUVQUk9HIikKCkFDX0NfQ09OU1QKQUNfQ19JTkxJTkUKCgojIGdldCB2ZXJzaW9uIG51bWJlci4KQUNfTVNHX0NIRUNLSU5HKFtmb3IgbmV0LXNubXAgdmVyc2lvbiBudW1iZXJdKQpWRVJTSU9OPSRQQUNLQUdFX1ZFUlNJT04KCiMgY3JlYXRlIHRoZSByZWxlYXNlIHZlcnNpb24gbnVtYmVyLi4uLiAgSSdtIG5vdCBzdXJlIHRoaXMgaXMgdXNlZAojIGFueXdoZXJlIGFueSBsb25nZXIuCl9yZWxlYXNlX3ZlcnNpb249YGVjaG8gJFZFUlNJT04gfCBzZWQgJ3MvIjsuKi8vO3MvLioiLy87cy9wcmUvMC4vOydgCmNoYW5nZXF1b3RlKCwgKQpSRUxFQVNFVkVSU0lPTj1gZWNobyAkX3JlbGVhc2VfdmVyc2lvbiB8IHNlZCAncy9eXChbMC05XVwpXC5cKFswLTldXCkvXDE6XDI6MC8nYApjaGFuZ2VxdW90ZShbLCBdKQoKQUNfU1VCU1QoVkVSU0lPTikKQUNfU1VCU1QoUkVMRUFTRVZFUlNJT04pCkFDX01TR19SRVNVTFQoJFZFUlNJT04pCkFDX01TR19DQUNIRV9BREQoTmV0LVNOTVAgVmVyc2lvbjogICAgICAgICAgICRWRVJTSU9OKQoKIyBzdXBlciB0eXBlIGNoZWNraW5nCiMgV1dXWFhYCkFDX01TR19DSEVDS0lORyhbZm9yIGRldmVsb3BlciBnY2MgZmxhZ3NdKQppZiB0ZXN0ICJ4JGRldmVsb3BlciIgPSAieHllcyIgLWEgIngkR0NDIiA9ICJ4eWVzIjsgdGhlbgogIERFVkZMQUdTPSItV2FsbCAtV2lubGluZSAtV3N0cmljdC1wcm90b3R5cGVzIC1Xd3JpdGUtc3RyaW5ncyAtV2Nhc3QtcXVhbCAtV25vLWNoYXItc3Vic2NyaXB0cyIKZWxzZQogIERFVkZMQUdTPSIiCmZpCkFDX01TR19SRVNVTFQoJERFVkZMQUdTKQpBQ19TVUJTVChERVZGTEFHUykKCiMKIyBoYWNrcyBmb3IgYnVpbGRpbmcgb3V0c2lkZSBvZiB0aGUgc291cmNlIGRpcmVjdG9yeQojCiMgMSkgbWFrZSBzdXJlIGJ1aWxkIGluY2x1ZGUgcGF0aHMgYXJlIGJlZm9yZSBzb3VyY2UKIyAyKSBjaGVjayBmb3IgR05VIG1ha2UgdG8gdXNlIHZwYXRoIGluc3RlYWQgb2YgVlBBVEgKIwpOT05fR05VX1ZQQVRIPSJWUEFUSCA9IgpHTlVfdnBhdGg9IiN2cGF0aCIKIwojIGRlZmluZSBpbmNsdWRlIHBhdGhzIHJlbGF0aXZlIHRvIHRvcF9zcmNkaXIKIyB0d2VhayBpbmNsdWRlcyBpZiB3ZSdyZSBidWlsZGluZyBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgZGlyCmlmIHRlc3QgIngkc3JjZGlyIiA9ICJ4LiI7IHRoZW4KVE9QX0lOQ0xVREVTPVNSQ19UT1BfSU5DTFVERVMKU05NUExJQl9JTkNMVURFUz1TUkNfU05NUExJQl9JTkNMVURFUwpBR0VOVF9JTkNMVURFUz1TUkNfQUdFTlRfSU5DTFVERVMKSEVMUEVSX0lOQ0xVREVTPVNSQ19IRUxQRVJfSU5DTFVERVMKTUlCR1JPVVBfSU5DTFVERVM9U1JDX01JQkdST1VQX0lOQ0xVREVTCmVsc2UKVE9QX0lOQ0xVREVTPUJMRF9UT1BfSU5DTFVERVMKU05NUExJQl9JTkNMVURFUz1CTERfU05NUExJQl9JTkNMVURFUwpBR0VOVF9JTkNMVURFUz1CTERfQUdFTlRfSU5DTFVERVMKSEVMUEVSX0lOQ0xVREVTPUJMRF9IRUxQRVJfSU5DTFVERVMKTUlCR1JPVVBfSU5DTFVERVM9QkxEX01JQkdST1VQX0lOQ0xVREVTCm1ha2UgLXYgLWYgL2Rldi9udWxsIDI+L2Rldi9udWxsIHwgZ3JlcCBHTlUgPi9kZXYvbnVsbApoYXZlX2dudV9tYWtlPSQ/CmlmIHRlc3QgJGhhdmVfZ251X21ha2UgLWVxIDAgOyB0aGVuCiAgICBOT05fR05VX1ZQQVRIPSIjVlBBVEggPSIKICAgIEdOVV92cGF0aD0idnBhdGgiCmZpCmZpCkFDX1NVQlNUKFRPUF9JTkNMVURFUykKQUNfU1VCU1QoU05NUExJQl9JTkNMVURFUykKQUNfU1VCU1QoQUdFTlRfSU5DTFVERVMpCkFDX1NVQlNUKEhFTFBFUl9JTkNMVURFUykKQUNfU1VCU1QoTUlCR1JPVVBfSU5DTFVERVMpCkFDX1NVQlNUKEdOVV92cGF0aCkKQUNfU1VCU1QoTk9OX0dOVV9WUEFUSCkKCgojCiMgQ2hlY2sgd2hldGhlciB3ZSBjYW4gdXNlIC1VeCAtRHg9eCB3aXRoIHRoZSBleHBlY3RlZCBiZWhhdmlvdXIKIwpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gdW4tZGVmaW5lIHRhcmdldCBzeXN0ZW0gdG9rZW4gKGJlZm9yZSByZWRlZmluaW5nKV0pCk9MRF9DUFBGTEFHUz0iJENQUEZMQUdTIgpDUFBGTEFHUz0iLVUkUEFSVElBTFRBUkdFVE9TIC1EJFBBUlRJQUxUQVJHRVRPUz0kUEFSVElBTFRBUkdFVE9TIgoKQUNfRUdSRVBfQ1BQKHllcyxbWwojaWZkZWYgJFBBUlRJQUxUQVJHRVRPUwp5ZXMKI2VuZGlmCl1dLApbUEFSVElBTFRBUkdFVEZMQUdTPSItVSRQQVJUSUFMVEFSR0VUT1MgLUQkUEFSVElBTFRBUkdFVE9TPSRQQVJUSUFMVEFSR0VUT1MiCiBBQ19NU0dfUkVTVUxUKFt5ZXNdKV0sCltQQVJUSUFMVEFSR0VURkxBR1M9Ii1EJFBBUlRJQUxUQVJHRVRPUz0kUEFSVElBTFRBUkdFVE9TIgogQUNfTVNHX1JFU1VMVChbbm9dKV0pCkNGTEFHUz0iJENGTEFHUyAkUEFSVElBTFRBUkdFVEZMQUdTIgpDUFBGTEFHUz0iJE9MRF9DUFBGTEFHUyIKQUNfTVNHX0NBQ0hFX0FERChCdWlsZGluZyBmb3I6ICAgICAgICAgICAgICAgJFBBUlRJQUxUQVJHRVRPUykKCgojCiMgY2hlY2sgZm9yIHNwZWNpYWwgaW5jbHVkZXMgYW5kIHBpY2sgb25lCiMKCkFDX01TR19DSEVDS0lORyhbZm9yIHN5c3RlbSBpbmNsdWRlIGZpbGVdKQpjaGFuZ2VxdW90ZSgsICkKZmlsZWJhc2U9JHRhcmdldF9vcwojIGlnbm9yZSBiaW5hcnkgZm9ybWF0IGluZGljYXRpb24KZmlsZWJhc2U9YGVjaG8gJGZpbGViYXNlIHwgc2VkICdzL2VsZi8vJ2AKZmlsZWJhc2U9YGVjaG8gJGZpbGViYXNlIHwgc2VkICdzL2FvdXQvLydgCmZpbGViYXNlPWBlY2hvICRmaWxlYmFzZSB8IHNlZCAncy9lY29mZi8vJ2AKZmlsZWJhc2U9YGVjaG8gJGZpbGViYXNlIHwgc2VkICdzL2NvZmYvLydgCndoaWxlIHRlc3QgIngkZmlsZWJhc2UiICE9ICJ4JGxhc3QiIC1hICEgLWYgJHNyY2Rpci9pbmNsdWRlL25ldC1zbm1wL3N5c3RlbS8kZmlsZWJhc2UuaApkbwogICAgbGFzdD0kZmlsZWJhc2UKICAgIGZpbGViYXNlPWBlY2hvICRmaWxlYmFzZSB8IHNlZCAncy9bLS5fXVteLS5fXSokLy8nYAogICAgaWYgdGVzdCAieCRmaWxlYmFzZSIgPSAieCRsYXN0IjsgdGhlbgoJZmlsZWJhc2U9YGVjaG8gJGZpbGViYXNlIHwgc2VkICdzL1swLTldKiQvLydgCiAgICBmaQpkb25lCgppZiB0ZXN0ICJ4JGZpbGViYXNlIiA9ICJ4JGxhc3QiOyB0aGVuCiAgICBmaWxlYmFzZT0iZ2VuZXJpYyIKZmkKYWNfY3ZfTkVUU05NUF9TWVNURU1fSU5DTFVERV9GSUxFPSJuZXQtc25tcC9zeXN0ZW0vJGZpbGViYXNlLmgiCgpjaGFuZ2VxdW90ZShbLCBdKQpBQ19NU0dfUkVTVUxUKCRhY19jdl9ORVRTTk1QX1NZU1RFTV9JTkNMVURFX0ZJTEUpCkFDX0RFRklORV9VTlFVT1RFRChORVRTTk1QX1NZU1RFTV9JTkNMVURFX0ZJTEUsICIkYWNfY3ZfTkVUU05NUF9TWVNURU1fSU5DTFVERV9GSUxFIikKCiMgc2Vjb25kIHBhcnQsIHRoZSBDUFUgdHlwZS4KCkFDX01TR19DSEVDS0lORyhbZm9yIG1hY2hpbmUtdHlwZSBpbmNsdWRlIGZpbGVdKQpjaGFuZ2VxdW90ZSgsICkKZmlsZWJhc2U9JHRhcmdldF9jcHUKd2hpbGUgdGVzdCAieCRmaWxlYmFzZSIgIT0gIngkbGFzdCIgLWEgISAtZiAkc3JjZGlyL2luY2x1ZGUvbmV0LXNubXAvbWFjaGluZS8kZmlsZWJhc2UuaApkbwogICAgbGFzdD0kZmlsZWJhc2UKICAgIGZpbGViYXNlPWBlY2hvICRmaWxlYmFzZSB8IHNlZCAncy9bLS5fXVteLS5fXSokLy8nYApkb25lCgppZiB0ZXN0ICJ4JGZpbGViYXNlIiA9ICJ4JGxhc3QiOyB0aGVuCiAgICBmaWxlYmFzZT0iZ2VuZXJpYyIKZmkKYWNfY3ZfTkVUU05NUF9NQUNISU5FX0lOQ0xVREVfRklMRT0ibmV0LXNubXAvbWFjaGluZS8kZmlsZWJhc2UuaCIKY2hhbmdlcXVvdGUoWywgXSkKQUNfTVNHX1JFU1VMVChbJGFjX2N2X05FVFNOTVBfTUFDSElORV9JTkNMVURFX0ZJTEVdKQoKQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfTUFDSElORV9JTkNMVURFX0ZJTEUsICIkYWNfY3ZfTkVUU05NUF9NQUNISU5FX0lOQ0xVREVfRklMRSIpCgpBQ19QQVRIX1BST0coW0NDUEFUSF0sJENDKQojIHdhdGNoIG91dCBmb3IgL3Vzci91Y2IvY2Mgb24gc29sYXJpcywgaXQgZG9lc24ndCB3b3JrIHdpdGggdGhpcyBwYWNrYWdlLgpjYXNlICR0YXJnZXRfb3MgaW4KICAgIGJzZGkqKQoJaWYgdGVzdCAieCRDQ1BBVEgiID0gIngvdXNyL3VjYi9jYyIgLW8gIngkQ0NQQVRIIiA9ICJ4L3Vzci9iaW4vY2MiOyB0aGVuCgkgICAgQUNfTVNHX0VSUk9SKFsKCioqKiBUaGUgQlNESSAvdXNyL3VjYi9jYyBjb21waWxlciBkb2VzIG5vdCB3b3JrIHdpdGggdGhpcyBwYWNrYWdlLiAgCioqKiBQbGVhc2UgcnVuIGNvbmZpZ3VyZSB3aXRoIC0td2l0aC1jYz1nY2MKXSkKCWZpCiAgICA7OwogICAgc29sYXJpcyopCglpZiB0ZXN0ICJ4JENDUEFUSCIgPSAieC91c3IvdWNiL2NjIjsgdGhlbgoJICAgIEFDX01TR19FUlJPUihbCgoqKiogVGhlIHNvbGFyaXMgL3Vzci91Y2IvY2MgY29tcGlsZXIgZG9lcyBub3Qgd29yayB3aXRoIHRoaXMgcGFja2FnZS4gIAoqKiogUGxlYXNlIHB1dCBhIGRpZmZlcmVudCBjb21waWxlciBpbiB5b3VyIHBhdGggZmlyc3Qgb3IgcnVuCioqKiBjb25maWd1cmUgd2l0aCAtLXdpdGgtY2M9WFgsIHdoZXJlIFhYIGlzIHRoZSBjb21waWxlciB5b3Ugd2FudCB0byB1c2UuCl0pCglmaQogICAgOzsKZXNhYwogICAgCkFDX01TR19DSEVDS0lORyhbZm9yIGFkZGl0aW9uYWwgY3BwIGZsYWdzXSkKIyBnY2MgZXh0cmEgQ1BQRkxBR1MKaWYgdGVzdCAieCRHQ0MiID0gInh5ZXMiIC1hICJ4JENQUCIgPSAieCRDQyAtRSI7IHRoZW4KICAjIGV4dHJhIGNwcCBmbGFncyBmb3IgZ251IGMgY29tcGlsZXIgdG8gYWxsb3cgLmluIGZpbGUgZXh0ZW5zaW9ucy4KICBFWFRSQUNQUEZMQUdTPSIteCBjIgplbHNlCiAgRVhUUkFDUFBGTEFHUz0iIgpmaQoKIyBTb2xhcmlzIGV4dHJhIGNwcCBmbGFncy4KaWYgdGVzdCAieCRHQ0MiICE9ICJ4eWVzIjsgdGhlbgogIGNhc2UgJHRhcmdldF9vcyBpbgogICAgc29sYXJpcyopIEVYVFJBQ1BQRkxBR1M9IiRFWFRSQUNQUEZMQUdTIC1YcyIgOzsKICBlc2FjCmZpCgpBQ19TVUJTVChFWFRSQUNQUEZMQUdTKQpBQ19NU0dfUkVTVUxUKCRFWFRSQUNQUEZMQUdTKQoKIyAgIENvbXBpbGVyIGZsYWdzOgojCgojIFRoZSBOZXQtU05NUCBzb3VyY2UgY29kZSBpcyBub3Qgc3RyaWN0LWFsaWFzaW5nIHNhZmUsIHNvIGFkZAojIC1mbm8tc3RyaWN0LWFsaWFzaW5nIHRvICRDRkxBR1MgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGl0LgpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIC1mbm8tc3RyaWN0LWFsaWFzaW5nXSkKbmV0c25tcF9zYXZlX0NGTEFHUz0iJENGTEFHUyIKQ0ZMQUdTPSItZm5vLXN0cmljdC1hbGlhc2luZyAkQ0ZMQUdTIgpBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbXSldLCBbQUNfTVNHX1JFU1VMVChbeWVzXSldLCBbCiAgQUNfTVNHX1JFU1VMVChbbm9dKQogIENGTEFHUz0iJG5ldHNubXBfc2F2ZV9DRkxBR1MiCl0pCgojIFByZWZpeGVzIG11c3QgYmVnaW4gd2l0aCAiLyIgb3IgW0EtWl0gZm9sbG93ZWQgYnkgY29sb24uCgppZiB0ZXN0ICJ4JHByZWZpeCIgPSAieE5PTkUiOyB0aGVuCiAgcHJlZml4PS91c3IvbG9jYWwKZmkKCmZjaD1gZWNobyAkcHJlZml4IHwgc2VkICdzL1woLlwpLiovXDEvJ2AKaWYgdGVzdCAieCRmY2giICE9ICJ4LyIgOyB0aGVuCiAgIHNjaD1gZWNobyAkcHJlZml4IHwgc2VkICdzLy5cKC5cKS4qL1wxLydgCiAgIGlmIHRlc3QgIngkc2NoIiAhPSAieDoiIDsgdGhlbgogICAgICBwcmVmaXg9YHB3ZGAvJHByZWZpeAogICAgICBlY2hvICJhZGp1c3RpbmcgcHJlZml4IHRvICRwcmVmaXgiCiAgIGZpCmZpCgppZiB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9ICJ4Tk9ORSI7IHRoZW4KICBleGVjX3ByZWZpeD0kcHJlZml4CmZpCgpmY2g9YGVjaG8gJGV4ZWNfcHJlZml4IHwgc2VkICdzL1woLlwpLiovXDEvJ2AKaWYgdGVzdCAieCRmY2giICE9ICJ4LyIgOyB0aGVuCiAgIHNjaD1gZWNobyAkZXhlY19wcmVmaXggfCBzZWQgJ3MvLlwoLlwpLiovXDEvJ2AKICAgaWYgdGVzdCAieCRzY2giICE9ICJ4OiIgOyB0aGVuCiAgICAgIGV4ZWNfcHJlZml4PWBwd2RgLyRleGVjX3ByZWZpeAogICAgICBlY2hvICJhZGp1c3RpbmcgZXhlY19wcmVmaXggdG8gJGV4ZWNfcHJlZml4IgogICBmaQpmaQoKIyBTZXQgU05NUExJQlBBVEggJiBTTk1QU0hBUkVQQVRICgpTTk1QTElCUEFUSD0iIgp0bXBzZXQ9IiRsaWJkaXIvc25tcCIKd2hpbGUgdGVzdCAieCR0bXBzZXQiICE9ICJ4JFNOTVBMSUJQQVRIIjsgZG8KICBTTk1QTElCUEFUSD0iJHRtcHNldCIKICBldmFsIHRtcHNldD0iJHRtcHNldCIKZG9uZQpBQ19ERUZJTkVfVU5RVU9URUQoU05NUExJQlBBVEgsIiRTTk1QTElCUEFUSCIpCkFDX1NVQlNUKFNOTVBMSUJQQVRIKQpBQ19ERUZJTkVfVU5RVU9URUQoU05NUERMTU9EUEFUSCwiJFNOTVBMSUJQQVRIL2RsbW9kIikKClNOTVBTSEFSRVBBVEg9IiIKdG1wc2V0PSIkZGF0YWRpci9zbm1wIgp3aGlsZSB0ZXN0ICJ4JHRtcHNldCIgIT0gIngkU05NUFNIQVJFUEFUSCI7IGRvCiAgU05NUFNIQVJFUEFUSD0iJHRtcHNldCIKICBldmFsIHRtcHNldD0iJHRtcHNldCIKZG9uZQpBQ19ERUZJTkVfVU5RVU9URUQoU05NUFNIQVJFUEFUSCwiJFNOTVBTSEFSRVBBVEgiKQpBQ19TVUJTVChTTk1QU0hBUkVQQVRIKQoKaWYgdGVzdCAieCRORVRTTk1QX0RFRkFVTFRfTUlCRElSUyIgPSAieCI7IHRoZW4KICBORVRTTk1QX0RFRkFVTFRfTUlCRElSUz0iXCRIT01FLy5zbm1wL21pYnM6JFNOTVBTSEFSRVBBVEgvbWlicyIKICBpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIiAtbyAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhjeWd3aW4iOyB0aGVuCiAgICBORVRTTk1QX0RFRkFVTFRfTUlCRElSUz1gZWNobyAiJE5FVFNOTVBfREVGQVVMVF9NSUJESVJTIiB8ICRTRUQgJ3MvOi87L2cnYAogIGZpCiAgQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfREVGQVVMVF9NSUJESVJTLCIkTkVUU05NUF9ERUZBVUxUX01JQkRJUlMiKQpmaQpBQ19TVUJTVChORVRTTk1QX0RFRkFVTFRfTUlCRElSUykKClNOTVBDT05GUEFUSD0iIgp0bXBzZXQ9IiRzeXNjb25mZGlyL3NubXAiCndoaWxlIHRlc3QgIngkdG1wc2V0IiAhPSAieCRTTk1QQ09ORlBBVEgiOyBkbwogIFNOTVBDT05GUEFUSD0iJHRtcHNldCIKICBldmFsIHRtcHNldD0iJHRtcHNldCIKZG9uZQpBQ19ERUZJTkVfVU5RVU9URUQoU05NUENPTkZQQVRILCIkU05NUENPTkZQQVRIIikKQUNfU1VCU1QoU05NUENPTkZQQVRIKQoKQUNfQ0hFQ0tfU0laRU9GKHNob3J0KQpBQ19DSEVDS19TSVpFT0YoaW50KQpBQ19DSEVDS19TSVpFT0YobG9uZykKQUNfQ0hFQ0tfU0laRU9GKGxvbmcgbG9uZykKQUNfQ0hFQ0tfU0laRU9GKGludG1heF90KQpBQ19DSEVDS19UWVBFUyhbaW50OF90LCAgdWludDhfdCwgIHVfaW50OF90XSkKQUNfQ0hFQ0tfVFlQRVMoW2ludDE2X3QsIHVpbnQxNl90LCB1X2ludDE2X3RdKQpBQ19DSEVDS19UWVBFUyhbaW50MzJfdCwgdWludDMyX3QsIHVfaW50MzJfdF0pCkFDX0NIRUNLX1RZUEVTKFtpbnQ2NF90LCB1aW50NjRfdCwgdV9pbnQ2NF90XSkKQUNfQ0hFQ0tfVFlQRVMoW2ludG1heF90LCB1aW50bWF4X3RdKQpBQ19DSEVDS19UWVBFUyhbb2ZmNjRfdF0pCkFDX0NIRUNLX1RZUEVTKFt1aW50cHRyX3QsIGludHB0cl90XSkKCiMgc29sYXJpcyBzcGVjaWZpYyB0eXBlCkFDX0NIRUNLX1RZUEVTKFtDb3VudGVyNjRdLCwsWyNpbmNsdWRlIDxpbmV0L21pYjIuaD5dKQoKIyBndWVzcyBJUHY2IHN0YWNrIHR5cGUuCmlmIHRlc3QgIngkZW5hYmxlX2lwdjYiID0gInh5ZXMiOyB0aGVuCgl2NnR5cGU9dW5rbm93bgoJdjZsaWI9bm9uZQoJdjZ0cnlsaWJjPW5vCgoJQUNfTVNHX0NIRUNLSU5HKFtbaXB2NiBzdGFjayB0eXBlXV0pCglmb3IgaSBpbiB2NmQgdG9zaGliYSBrYW1lIGlucmlhIHpldGEgbGludXgtZ2xpYmMgbGludXgtaW5ldDYgZ2VuZXJpYzsgZG8KCQljYXNlICRpIGluCgkJdjZkKQoJCQlBQ19FR1JFUF9DUFAoeWVzLCBbCiNpbmNsdWRlIDwvdXNyL2xvY2FsL3Y2L2luY2x1ZGUvc3lzL3R5cGVzLmg+CiNpZmRlZiBfX1Y2RF9fCnllcwojZW5kaWZdLAoJCQkJW3Y2dHlwZT0kaTsgdjZsaWI9djY7CgkJCQl2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKCQkJCUNGTEFHUz0iLUkvdXNyL2xvY2FsL3Y2L2luY2x1ZGUgJENGTEFHUyJdKQoJCQk7OwoJCXRvc2hpYmEpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaWZkZWYgX1RPU0hJQkFfSU5FVDYKeWVzCiNlbmRpZl0sCgkJCQlbdjZ0eXBlPSRpOyB2NmxpYj1pbmV0NjsKCQkJCXY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyJdKQoJCQk7OwoJCWthbWUpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2lmZGVmIF9fS0FNRV9fCnllcwojZW5kaWZdLAoJCQkJW3Y2dHlwZT0kaTsgdjZsaWI9aW5ldDY7CgkJCQl2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKCQkJCXY2dHJ5bGliYz15ZXM7CgkJCQlDRkxBR1M9Ii1ETkVUU05NUF9FTkFCTEVfSVBWNiAkQ0ZMQUdTIl0pCgkJCTs7CgkJaW5yaWEpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2lmZGVmIElQVjZfSU5SSUFfVkVSU0lPTgp5ZXMKI2VuZGlmXSwKCQkJCVt2NnR5cGU9JGk7CgkJCQl2NmxpYj1kdW1teTsKCQkJCXY2bGliZGlyPW5vbmU7CgkJCQl2NnRyeWxpYmM9eWVzOwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyJdKQoJCQk7OwoJCXpldGEpCgkJCUFDX0VHUkVQX0NQUCh5ZXMsIFsKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaWZkZWYgX1pFVEFfTUlOQU1JX0lORVQ2CkEKeWVzCiNlbmRpZl0sCgkJCQlbdjZ0eXBlPSRpOyB2NmxpYj1pbmV0NjsKCQkJCXY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyJdKQoJCQk7OwoJCWxpbnV4LWdsaWJjKQoJCQlBQ19FR1JFUF9DUFAoeWVzLCBbCiNpbmNsdWRlIDxmZWF0dXJlcy5oPgojaWYgZGVmaW5lZChfX0dMSUJDX18pICYmICgoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEpIHx8IChfX0dMSUJDXyA+IDIpKQp5ZXMKI2VuZGlmXSwKCQkJCVt2NnR5cGU9JGk7CgkJCQl2NmxpYj1kdW1teTsKCQkJCXY2bGliZGlyPW5vbmU7CgkJCQl2NnRyeWxpYmM9eWVzOwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyJdKQoJCQk7OwoJCWxpbnV4LWluZXQ2KQoJCQlpZiB0ZXN0IC1kIC91c3IvaW5ldDY7IHRoZW4KCQkJCXY2dHlwZT0kaQoJCQkJdjZsaWI9aW5ldDYKCQkJCXY2bGliZGlyPS91c3IvaW5ldDYvbGliCgkJCQlDRkxBR1M9Ii1ETkVUU05NUF9FTkFCTEVfSVBWNiAkQ0ZMQUdTIgoJCQlmaQoJCQk7OwoJCWdlbmVyaWMpCiAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW1twb3N0cG9uZWRdXSkKCQkJQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgpdLCBzb2NrYWRkcl9pbjYsIHNpbjZfYWRkciwgbm8pCgkgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtbaXB2NiBzdGFjayB0eXBlXV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkYWNfY3Zfc3RydWN0X3NvY2thZGRyX2luNl9oYXNfc2luNl9hZGRyIiA9ICJ4eWVzIjsgdGhlbgoJCQkJdjZ0eXBlPSRpCgkJCQl2NmxpYj1kdW1teQoJCQkJdjZsaWJkaXI9bm9uZQoJCQkJdjZ0cnlsaWJjPXllcwoJCQkJQ0ZMQUdTPSItRE5FVFNOTVBfRU5BQkxFX0lQVjYgJENGTEFHUyIKICAgICAgICAgICAgICAgICAgICAgICAgZmkKCQkJOzsKCQllc2FjCgkJaWYgdGVzdCAiJHY2dHlwZSIgIT0gInVua25vd24iOyB0aGVuCgkJCWJyZWFrCgkJZmkKCWRvbmUKCglpZiB0ZXN0ICIkdjZsaWIiICE9ICJub25lIjsgdGhlbgoJCWlmIHRlc3QgLWQgJHY2bGliZGlyIC1hIC1mICR2NmxpYmRpci9saWIkdjZsaWIuYTsgdGhlbgoJCQlMSUJTPSItTCR2NmxpYmRpciAtbCR2NmxpYiAkTElCUyIKCQkJZW5hYmxlX2lwdjY9InllcyIKCQkJQUNfTVNHX1JFU1VMVChbIiR2NnR5cGUsICRlbmFibGVfaXB2NiwgdXNpbmcgbGliJHY2bGliIl0pCgkJZWxpZiB0ZXN0ICIkdjZ0cnlsaWJjIiA9ICJ5ZXMiOyB0aGVuCgkJCWVuYWJsZV9pcHY2PSJ5ZXMiCgkJCUFDX01TR19SRVNVTFQoWyIkdjZ0eXBlLCAkZW5hYmxlX2lwdjYsIHVzaW5nIGxpYmMiXSkKCQllbHNlCgkJCUFDX01TR19FUlJPUihubyBJUHY2IGxpYnJhcnkgbGliJHY2bGliLmEgZm91bmQuKQoJCQlleGl0IDEKCQlmaQoJZWxzZQoJCWVuYWJsZV9pcHY2PSJubyIKCQlBQ19NU0dfUkVTVUxUKFsiJHY2dHlwZSwgJGVuYWJsZV9pcHY2Il0pCglmaQpmaQoKIwojIE1heWJlIGFkZCBsaWJyYXJ5IGV4dGVuc2lvbnMgZm9yIHRocmVhZCBtdXRleCBsb2NraW5nLgojCgppZiB0ZXN0ICJ4JHdpdGhfcmVzX2xvY2tzIiA9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShORVRTTk1QX1JFRU5UUkFOVCkKCiAgICBjYXNlICR0YXJnZXRfb3MgaW4KCiAgICBhaXgqKQoJQ0NfUlVOVElNRV9BUkc9IiRDQ19SVU5USU1FX0FSRyAtbHB0aHJlYWRzIgoJOzsKCiAgICAqKQoJOzsKCiAgICBlc2FjCmZpCgojCiMgQWRkIHBsYXRmb3JtLXNwZWNpZmljIHNvdXJjZSBmaWxlcy4KIwpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwbGF0Zm9ybS1zcGVjaWZpYyBzb3VyY2VdKQpvdGhlcl9zcmNfbGlzdD0iIgpvdGhlcl9vYmpzX2xpc3Q9IiIKb3RoZXJfbG9ianNfbGlzdD0iIgpvdGhlcl9hZ2VudG9ianM9IiIKb3RoZXJfbGFnZW50b2Jqcz0iIgpvdGhlcl90cmFwZF9vYmplY3RzPSIiCgojIFdpbjMyIHNlcnZpY2UgY29kZQppZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIjsgdGhlbgogIG90aGVyX3NyY19saXN0PSIkb3RoZXJfc3JjX2xpc3Qgd2luc2VydmljZS5jIHdpbnNlcnZpY2VyYy5yYyIKICBvdGhlcl9vYmpzX2xpc3Q9IiRvdGhlcl9vYmpzX2xpc3Qgd2luc2VydmljZS5vIHdpbnNlcnZpY2VyYy5vIgogIG90aGVyX2xvYmpzX2xpc3Q9IiRvdGhlcl9sb2Jqc19saXN0IHdpbnNlcnZpY2UubG8gd2luc2VydmljZXJjLmxvIgogIG90aGVyX2FnZW50b2Jqcz0iLi4vc25tcGxpYi93aW5zZXJ2aWNlcmMubyIKICBvdGhlcl9sYWdlbnRvYmpzPSIuLi9zbm1wbGliL3dpbnNlcnZpY2VyYy5sbyIKICBvdGhlcl90cmFwZF9vYmplY3RzPSIuLi9zbm1wbGliL3dpbnNlcnZpY2VyYy5vIiAKZmkKICAKIyBXaW4zMiBwaXBlcwppZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIiAtbyAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhjeWd3aW4iOyB0aGVuCiAgb3RoZXJfc3JjX2xpc3Q9IiRvdGhlcl9zcmNfbGlzdCB3aW5waXBlLmMiCiAgb3RoZXJfb2Jqc19saXN0PSIkb3RoZXJfb2Jqc19saXN0IHdpbnBpcGUubyIKICBvdGhlcl9sb2Jqc19saXN0PSIkb3RoZXJfbG9ianNfbGlzdCB3aW5waXBlLmxvIgpmaQoKQUNfU1VCU1Qob3RoZXJfc3JjX2xpc3QpCkFDX1NVQlNUKG90aGVyX29ianNfbGlzdCkKQUNfU1VCU1Qob3RoZXJfbG9ianNfbGlzdCkKQUNfU1VCU1Qob3RoZXJfYWdlbnRvYmpzKQpBQ19TVUJTVChvdGhlcl9sYWdlbnRvYmpzKQpBQ19TVUJTVChvdGhlcl90cmFwZF9vYmplY3RzKQoKQUNfTVNHX1JFU1VMVChbJG90aGVyX3NyY19saXN0ICRvdGhlcl9vYmpzX2xpc3QgJG90aGVyX2xvYmpzX2xpc3RdKQpBQ19NU0dfUkVTVUxUKFskb3RoZXJfYWdlbnRvYmpzICRvdGhlcl9sYWdlbnRvYmpzICRvdGhlcl90cmFwZF9vYmplY3RzXSkKICAKIwojIERvIHRyYW5zcG9ydCBtb2R1bGUgcHJvY2Vzc2luZy4KIwpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhbmQgY29uZmlndXJpbmcgdHJhbnNwb3J0IG1vZHVsZXMgdG8gdXNlXSkKdHJhbnNwb3J0X3NyY19saXN0PSIiCnRyYW5zcG9ydF9oZHJfbGlzdD0iIgp0cmFuc3BvcnRfZGVmX2xpc3Q9IiIKdHJhbnNwb3J0X3Jlc3VsdF9saXN0PSIiCnRyYW5zcG9ydF9hZGRfbGlzdD0iIgp0cmFuc3BvcnRfY2FsbGJhY2tfZGlzYWJsZWQ9IiIKbmV3X3dpdGhfdHJhbnNwb3J0X2xpc3Q9YGVjaG8gJHdpdGhfdHJhbnNwb3J0cyB8IHNlZCAncy8sLyAvZzsnYApuZXdfd2l0aF9vdXRfdHJhbnNwb3J0X2xpc3Q9YGVjaG8gJHdpdGhfb3V0X3RyYW5zcG9ydHMgfCBzZWQgJ3MvLC8gL2c7J2AKCiMKIyBBZGQgdGhlIGRlZmF1bHQgdHJhbnNwb3J0cyB0byB0aGUgbGlzdAojCmlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4Y3lnd2luIjsgdGhlbgogIHRyYW5zcG9ydF9kZWZhdWx0X2xpc3Q9IlVEUCBUQ1AgQ2FsbGJhY2siCmVsaWYgdGVzdCAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhtaW5ndzMyIiAtbyAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhtaW5ndzMybXN2YyI7IHRoZW4gCiAgdHJhbnNwb3J0X2RlZmF1bHRfbGlzdD0iVURQIFRDUCBDYWxsYmFjayIKZWxzZQogIHRyYW5zcG9ydF9kZWZhdWx0X2xpc3Q9IlVEUCBUQ1AgVW5peCBDYWxsYmFjayIKZmkKaWYgdGVzdCAieCRlbmFibGVfaXB2NiIgPSAieHllcyI7IHRoZW4KICB0cmFuc3BvcnRfZGVmYXVsdF9saXN0PSJVRFBJUHY2IFRDUElQdjYgJHRyYW5zcG9ydF9kZWZhdWx0X2xpc3QiCmZpCmZvciBpIGluICR0cmFuc3BvcnRfZGVmYXVsdF9saXN0OyBkbwogIGlmIGVjaG8gIiAkbmV3X3dpdGhfdHJhbnNwb3J0X2xpc3QgIiB8IGdyZXAgIiAkaSAiID4vZGV2L251bGw7IHRoZW4KICAgIDoKICBlbHNlCiAgICB0cmFuc3BvcnRfYWRkX2xpc3Q9IiRpICR0cmFuc3BvcnRfYWRkX2xpc3QiCiAgZmkKZG9uZQpuZXdfdHJhbnNwb3J0X2xpc3Q9IiR0cmFuc3BvcnRfYWRkX2xpc3QgJG5ld193aXRoX3RyYW5zcG9ydF9saXN0IgoKZm9yIGkgaW4gJG5ld190cmFuc3BvcnRfbGlzdDsgZG8KICBpZiBlY2hvICIgJG5ld193aXRoX291dF90cmFuc3BvcnRfbGlzdCAiIHwgZ3JlcCAiICRpICIgPi9kZXYvbnVsbDsgdGhlbgogICAgaWYgdGVzdCAieCRpIiA9ICJ4VURQIjsgdGhlbgogICAgICBlY2hvCiAgICAgIEFDX01TR19FUlJPUihJdCBpcyBub3QgcG9zc2libGUgdG8gY29tcGlsZSB3aXRob3V0IFVEUC9JUCBzdXBwb3J0LikKICAgIGVsaWYgdGVzdCAieCRpIiA9ICJ4Q2FsbGJhY2siOyB0aGVuCiAgICAgIGVjaG8KICAgICAgdHJhbnNwb3J0X2NhbGxiYWNrX2Rpc2FibGVkPSJ5ZXMiCiAgICBmaQogIGVsc2UKICAgIGlmIHRlc3QgIngkaSIgPSAieEFBTDVQVkMiOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiAhPSAieGxpbnV4IjsgdGhlbgogICAgICAgIGVjaG8KICAgICAgICBBQ19NU0dfRVJST1IoQUFMNSBQVkMgc3VwcG9ydCB1bmF2YWlsYWJsZSBmb3IgdGhpcyBwbGF0Zm9ybSAoTGludXggb25seSkpCiAgICAgIGZpCiAgICBmaQogICAgaWYgdGVzdCAieCRpIiA9ICJ4SVBYIjsgdGhlbgogICAgICBpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgIT0gInhsaW51eCI7IHRoZW4KICAgICAgICBlY2hvCiAgICAgICAgQUNfTVNHX0VSUk9SKElQWCBzdXBwb3J0IHVuYXZhaWxhYmxlIGZvciB0aGlzIHBsYXRmb3JtIChMaW51eCBvbmx5KSkKICAgICAgZmkKICAgIGZpCiAgICBpZiB0ZXN0ICJ4JGkiID0gInhVbml4IjsgdGhlbgogICAgICBpZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieGN5Z3dpbiI7IHRoZW4KICAgICAgICBlY2hvCiAgICAgICAgQUNfTVNHX0VSUk9SKFVuaXggZG9tYWluIHByb3RvY29sIHN1cHBvcnQgdW5hdmFpbGFibGUgZm9yIHRoaXMgcGxhdGZvcm0pCiAgICAgIGVsaWYgdGVzdCAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhtaW5ndzMyIiAtbyAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhtaW5ndzMybXN2YyI7IHRoZW4KICAgICAgICBlY2hvCiAgICAgICAgQUNfTVNHX0VSUk9SKFVuaXggZG9tYWluIHByb3RvY29sIHN1cHBvcnQgdW5hdmFpbGFibGUgZm9yIHRoaXMgcGxhdGZvcm0pCiAgICAgIGZpCiAgICBmaQogICAgaWYgdGVzdCAhICJ4JGVuYWJsZV9pcHY2IiA9ICJ4eWVzIjsgdGhlbgogICAgICAgIGlmIHRlc3QgIngkaSIgPSAieFVEUElQdjYiIC1vICJ4JGkiID0gInhUQ1BJUHY2IjsgdGhlbgogICAgICAgICAgICBlY2hvCiAgICAgICAgICAgIEFDX01TR19FUlJPUihJUHY2IHRyYW5zcG9ydHMgbm90IGF2YWlsYWJsZSBpZiBJUHY2IHN1cHBvcnQgaXMgbm90IGVuYWJsZWQpCiAgICAgICAgZmkKICAgIGZpCiAgICB0cmFuc3BvcnRfc3JjPSJzbm1wIiRpIkRvbWFpbi5jIgogICAgdHJhbnNwb3J0X2hkcj0ic25tcCIkaSJEb21haW4uaCIKICAgIHJlbF90cmFuc3BvcnRfc3JjPSJzbm1wbGliLyIkdHJhbnNwb3J0X3NyYwogICAgcmVsX3RyYW5zcG9ydF9oZHI9ImluY2x1ZGUvbmV0LXNubXAvbGlicmFyeS8iJHRyYW5zcG9ydF9oZHIKICAgIGlmIHRlc3QgLWYgIiRzcmNkaXIvJHJlbF90cmFuc3BvcnRfc3JjIjsgdGhlbgogICAgICB0cmFuc3BvcnRfcmVzdWx0X2xpc3Q9IiR0cmFuc3BvcnRfcmVzdWx0X2xpc3QgJGkiCiAgICAgIHRyYW5zcG9ydF9zcmNfbGlzdD0iJHRyYW5zcG9ydF9zcmMgJHRyYW5zcG9ydF9zcmNfbGlzdCIKICAgICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kcmVsX3RyYW5zcG9ydF9oZHIiOyB0aGVuCiAgICAgICAgdHJhbnNwb3J0X2hkcl9saXN0PSIkdHJhbnNwb3J0X2hkciAkdHJhbnNwb3J0X2hkcl9saXN0IgogICAgICBmaQogICAgICB0cmFuc3BvcnRfZGVmPWBlY2hvICRpIHwgc2VkICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCiAgICAgIHRyYW5zcG9ydF9kZWZfbGlzdD0iTkVUU05NUF9UUkFOU1BPUlRfIiR0cmFuc3BvcnRfZGVmIl9ET01BSU4gJHRyYW5zcG9ydF9kZWZfbGlzdCIKICAgIGVsc2UKICAgICAgZWNobwogICAgICBBQ19NU0dfRVJST1IoQ2Fubm90IGZpbmQgZmlsZSAkc3JjZGlyLyRyZWxfdHJhbnNwb3J0X3NyYyB0byBzdXBwb3J0IFNOTVAgdHJhbnNwb3J0IGRvbWFpbiAkaS4pCiAgICBmaQogIGZpCmRvbmUKdHJhbnNwb3J0X29ial9saXN0PWBlY2hvICIgJHRyYW5zcG9ydF9zcmNfbGlzdCAiIHwgc2VkICdzL1wuYy9cLm8vZydgIAkgCnRyYW5zcG9ydF9sb2JqX2xpc3Q9YGVjaG8gIiAkdHJhbnNwb3J0X3NyY19saXN0ICIgfCBzZWQgJ3MvXC5jL1wubG8vZydgCgojIyB3aW4zMiBwbGF0Zm9ybXMgcmVxdWlyZSBpbmV0X250b3AgZXRjLgppZiB0ZXN0ICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzIiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieG1pbmd3MzJtc3ZjIjsgdGhlbgogIGlmIGVjaG8gIiR0cmFuc3BvcnRfZGVmX2xpc3QiIHwgZ3JlcCAiSVBWNiIgPi9kZXYvbnVsbDsgdGhlbgogICAgdHJhbnNwb3J0X29ial9saXN0PSIkdHJhbnNwb3J0X29ial9saXN0IGluZXRfbnRvcC5vIGluZXRfcHRvbi5vIgogICAgdHJhbnNwb3J0X2xvYmpfbGlzdD0iJHRyYW5zcG9ydF9sb2JqX2xpc3QgaW5ldF9udG9wLmxvIGluZXRfcHRvbi5sbyIKICBmaQpmaQoKQUNfU1VCU1QodHJhbnNwb3J0X2hkcl9saXN0KQpBQ19TVUJTVCh0cmFuc3BvcnRfc3JjX2xpc3QpCkFDX1NVQlNUKHRyYW5zcG9ydF9vYmpfbGlzdCkKQUNfU1VCU1QodHJhbnNwb3J0X2xvYmpfbGlzdCkKZm9yIGkgaW4gJHRyYW5zcG9ydF9kZWZfbGlzdDsgZG8KICBBQ19ERUZJTkVfVU5RVU9URUQoJGkpCmRvbmUKQUNfTVNHX1JFU1VMVCgkdHJhbnNwb3J0X3Jlc3VsdF9saXN0LikKQUNfTVNHX0NBQ0hFX0FERChOZXR3b3JrIHRyYW5zcG9ydCBzdXBwb3J0OiAkdHJhbnNwb3J0X3Jlc3VsdF9saXN0KQoKIwojIFNlY3VyaXR5IG1vZHVsZXMgdG8gdXNlCiMgCgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzZWN1cml0eSBtb2R1bGVzIHRvIHVzZV0pCnNlY3VyaXR5X2RlZl9saXN0PSJ1c20iCnNlY3VyaXR5X3NyY19saXN0PSIiCnNlY3VyaXR5X29ial9saXN0PSIiIAkgCnNlY3VyaXR5X2xvYmpfbGlzdD0iIgpzZWN1cml0eV9pbml0X2ZpbGU9InNubXBsaWIvc25tcHNtX2luaXQuaCIKc2VjdXJpdHlfaW5jbF9maWxlPSJpbmNsdWRlL25ldC1zbm1wL2xpYnJhcnkvc25tcHYzLXNlY3VyaXR5LWluY2x1ZGVzLmgiCm5ld193aXRoX3NlY3VyaXR5PWBlY2hvICR3aXRoX3NlY3VyaXR5X21vZHVsZXMgfCBzZWQgJ3MvLC8gL2c7J2AKbmV3X3dpdGhfb3V0X3NlY3VyaXR5PWBlY2hvICR3aXRoX291dF9zZWN1cml0eV9tb2R1bGVzIHwgc2VkICdzLywvIC9nOydgCgppZiB0ZXN0ICEgLWQgaW5jbHVkZTsgdGhlbgogIG1rZGlyIGluY2x1ZGUKZmkKaWYgdGVzdCAhIC1kIGluY2x1ZGUvbmV0LXNubXA7IHRoZW4KICBta2RpciBpbmNsdWRlL25ldC1zbm1wCmZpCmlmIHRlc3QgISAtZCBpbmNsdWRlL25ldC1zbm1wL2FnZW50OyB0aGVuCiAgbWtkaXIgaW5jbHVkZS9uZXQtc25tcC9hZ2VudApmaQppZiB0ZXN0ICEgLWQgaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5OyB0aGVuCiAgbWtkaXIgaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5CmZpCmlmIHRlc3QgISAtZCBpbmNsdWRlL3VjZC1zbm1wOyB0aGVuCiAgbWtkaXIgaW5jbHVkZS91Y2Qtc25tcApmaQoKaWYgdGVzdCAhIC1kIHNubXBsaWI7IHRoZW4KICBta2RpciBzbm1wbGliCmZpCmVjaG8gIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUuICBEbyBub3QgbW9kaWZ5IGJ5IGhhbmQuICovIiA+ICRzZWN1cml0eV9pbml0X2ZpbGUKZWNobyAiLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gIERvIG5vdCBtb2RpZnkgYnkgaGFuZC4gKi8iID4gJHNlY3VyaXR5X2luY2xfZmlsZQoKZm9yIGkgaW4gJHNlY3VyaXR5X2RlZl9saXN0OyBkbwogIGlmIGVjaG8gIiAkbmV3X3dpdGhfb3V0X3NlY3VyaXR5ICIgfCBncmVwICIgJGkgIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgaWYgdGVzdCAieCRpIiA9ICJ4dXNtIjsgdGhlbgoJZWNobwogICAgICAgIEFDX01TR19FUlJPUihUaGUgVVNNIHNlY3VyaXR5IG1vZHVsZSBpcyBtYW5kYXRvcnkpCiAgICBmaQogIGVsc2UKICAgIG5ld193aXRoX3NlY3VyaXR5PSIkbmV3X3dpdGhfc2VjdXJpdHkgJGkiCiAgZmkKZG9uZQoKZm9yIGkgaW4gJG5ld193aXRoX3NlY3VyaXR5OyBkbwogIGNmaWxlPSJzbm1wIiRpIi5jIgogIGhmaWxlPSJzbm1wIiRpIi5oIgoKICAjIG1ha2Ugc3VyZSBzdXBwb3J0IGV4aXN0cyBmb3IgaXQKICBpZiB0ZXN0IC1mICRzcmNkaXIiL3NubXBsaWIvIiRjZmlsZSAtYSAtZiAkc3JjZGlyIi9pbmNsdWRlL25ldC1zbm1wL2xpYnJhcnkvIiRoZmlsZTsgdGhlbgogICAgOgogIGVsc2UKICAgIGVjaG8KICAgIEFDX01TR19FUlJPUihObyBzdWNoIHNlY3VyaXR5IG1vZHVsZTogJGkgLyAkY2ZpbGUgLyAkaGZpbGUpCiAgZmkKCiAgIyBkZWZpbmUgYSBidW5jaCBvZiBzdHVmZiB0byBlbmFibGUgaXQKICBzZWN1cml0eV9zcmNfbGlzdD0iJHNlY3VyaXR5X3NyY19saXN0ICRjZmlsZSIKICBzZWN1cml0eV9oZHJfbGlzdD0iJHNlY3VyaXR5X2hkcl9saXN0ICRoZmlsZSIKICBzZWN1cml0eV9vYmpfbGlzdD0iJHNlY3VyaXR5X29ial9saXN0IHNubXAiJGkiLm8iIAkgCiAgc2VjdXJpdHlfbG9ial9saXN0PSIkc2VjdXJpdHlfbG9ial9saXN0IHNubXAiJGkiLmxvIgogIGRlZl9uYW1lPSJORVRTTk1QX1NFQ01PRF8iYGVjaG8gJGkgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCiAgZWNobyAiaW5pdF8iJGkiKCk7IiA+PiAkc2VjdXJpdHlfaW5pdF9maWxlCiAgZWNobyAiI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvJGhmaWxlPiIgPj4gJHNlY3VyaXR5X2luY2xfZmlsZQogIEFDX0RFRklORV9VTlFVT1RFRCgkZGVmX25hbWUpCmRvbmUKCkFDX1NVQlNUKHNlY3VyaXR5X3NyY19saXN0KQpBQ19TVUJTVChzZWN1cml0eV9oZHJfbGlzdCkKQUNfU1VCU1Qoc2VjdXJpdHlfb2JqX2xpc3QpIAkgCkFDX1NVQlNUKHNlY3VyaXR5X2xvYmpfbGlzdCkKQUNfTVNHX1JFU1VMVCgkbmV3X3dpdGhfc2VjdXJpdHkpCkFDX01TR19DQUNIRV9BREQoU05NUHYzIFNlY3VyaXR5IE1vZHVsZXM6ICAgICRuZXdfd2l0aF9zZWN1cml0eSkKCiMKIyBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBLU00gdG8gc2VlIHdoaWNoIGNyeXB0byBBUEkgd2Ugc3VwcG9ydAojCgphY19jdl9ORVRTTk1QX1VTRV9LRVJCRVJPU19NSVQ9bm8KcmVidWlsdF9uZXdfd2l0aF9zZWN1cml0eT0KYWxyZWFkeV9jaGVja2VkX2tyYjU9bm8KCmZvciBzZWMgaW4gJG5ld193aXRoX3NlY3VyaXR5CmRvCiAgaWYgdGVzdCAieCRzZWMiID0gInhrc20iIC1hICJ4eWVzIiA9ICJ4JGFscmVhZHlfY2hlY2tlZF9rcmI1IjsgdGhlbgogICAgY29udGludWUKICBmaQogIGFscmVhZHlfY2hlY2tlZF9rcmI1PXllcwoKICBpZiB0ZXN0IHgkc2VjICE9IHhrc207IHRoZW4KICAgIHJlYnVpbHRfbmV3X3dpdGhfc2VjdXJpdHk9IiRyZWJ1aWx0X25ld193aXRoX3NlY3VyaXR5ICRzZWMiCiAgZWxzZQogICAgaWYgdGVzdCBubyA9ICR0cnlrcmI1OyB0aGVuCiAgICAgIEFDX01TR19OT1RJQ0UoW2NvbmZpZ3VyZWQgbm90IHRvIHVzZSBrcmI1LiBkaXNhYmxpbmcga3NtXSkKICAgICAgY29udGludWUKICAgIGZpCgogICAgQUNfUEFUSF9QUk9HKFtrcmI1X2NvbmZpZ10sa3JiNS1jb25maWcsW25vXSwka3JiNXBhdGgvYmluOiRQQVRIKQoKICAgIGlmIHRlc3Qgbm8gIT0gJGtyYjVfY29uZmlnOyB0aGVuCiAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgYCRrcmI1X2NvbmZpZyAtLWNmbGFnc2AiCiAgICAgIExJQlM9IiRMSUJTIGAka3JiNV9jb25maWcgLS1saWJzYCIKICAgIGVsaWYgdGVzdCAka3JiNXBhdGggIT0gbm87IHRoZW4KICAgICAgQUNfQUREX1NFQVJDSF9QQVRIKCRrcmI1cGF0aCkKICAgIGVsc2UKICAgICAgQUNfQUREX1NFQVJDSF9QQVRIKC91c3Iva2VyYmVyb3MpCiAgICBmaQoKICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGtyYjVdKQogICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2hhdmVfa3JiNSwKICAgICAgQUNfQ0hFQ0tfTElCKGtyYjUsIGtyYjVfaW5pdF9jb250ZXh0LAoJYWNfY3ZfaGF2ZV9rcmI1PXllcywgYWNfY3ZfaGF2ZV9rcmI1PW5vCiAgICAgICkKICAgICkKCiAgICBpZiB0ZXN0ICRhY19jdl9oYXZlX2tyYjUgPSBubzsgdGhlbgogICAgICBpZiB0ZXN0ICJ4JGFza2Vka3JiNSIgPSAieHllcyI7IHRoZW4KCUFDX01TR19FUlJPUihBc2tlZCB0byB1c2Uga3JiNSBidXQgSSBjb3VsZG4ndCBmaW5kIGl0LikKICAgICAgZmkKICAgICAgQUNfTVNHX1JFU1VMVChuby4gZGlzYWJsaW5nIGtzbSkKICAgICAgY29udGludWUKICAgIGZpCiAgICAgIAogICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICByZWJ1aWx0X25ld193aXRoX3NlY3VyaXR5PSIkcmVidWlsdF9uZXdfd2l0aF9zZWN1cml0eSBrc20iCgogICAgQUNfTVNHX0NIRUNLSU5HKFtbZm9yIGhlaW1kYWxdXSkKICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9oZWltZGFsLAogICAgW0FDX1RSWV9DT01QSUxFKAogICAgICBbI2luY2x1ZGUgPGtyYjUuaD5dLAogICAgICBbY29uc3QgY2hhciAqdiA9IGhlaW1kYWxfdmVyc2lvbjtdLAogICAgICBhY19jdl9oZWltZGFsPXllcywKICAgICAgYWNfY3ZfaGVpbWRhbD1ubwogICAgKV0pCiAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9oZWltZGFsKQogICAgaWYgdGVzdCAkYWNfY3ZfaGVpbWRhbCA9IHllczsgdGhlbgogICAgICBBQ19ERUZJTkUoTkVUU05NUF9VU0VfS0VSQkVST1NfSEVJTURBTCkKICAgICAgaWYgdGVzdCBubyA9ICRrcmI1X2NvbmZpZzsgdGhlbgoJTElCUz0iJExJQlMgLWxrcmI1IC1sYXNuMSAtbGNvbV9lcnIgLWxyb2tlbiIKICAgICAgZmkKICAgIGVsaWYgdGVzdCBubyA9ICRrcmI1X2NvbmZpZzsgdGhlbgoJTElCUz0iJExJQlMgLWxrcmI1IC1sY29tX2VyciIKICAgIGZpCgogICAgQUNfTVNHX0NIRUNLSU5HKFt0byBzZWUgd2hpY2ggY3J5cHRvIEFQSSB3ZSBuZWVkIHRvIHVzZV0pCiAgICBBQ19DSEVDS19GVU5DKGtyYjVfY19lbmNyeXB0LFsKICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9ORVRTTk1QX1VTRV9LRVJCRVJPU19NSVQsCiAgICAgIEFDX0NIRUNLX0xJQihrNWNyeXB0bywga3JiNV9pbml0X2NvbnRleHQsCglhY19jdl9ORVRTTk1QX1VTRV9LRVJCRVJPU19NSVQ9eWVzLCBhY19jdl9NSVRfTkVXX0NSWVBUbz1ubwogICAgICApCiAgICApCgogICAgaWYgdGVzdCB5ZXMgPSAkYWNfY3ZfTkVUU05NUF9VU0VfS0VSQkVST1NfTUlUOyB0aGVuCiAgICAgIEFDX01TR19SRVNVTFQobmV3IE1JVCBjcnlwdG8gQVBJKQogICAgICBBQ19ERUZJTkUoTkVUU05NUF9VU0VfS0VSQkVST1NfTUlUKQogICAgICBpZiB0ZXN0IG5vID0gJGtyYjVfY29uZmlnOyB0aGVuCglMSUJTPSIkTElCUyAtbGs1Y3J5cHRvIgogICAgICBmaQogICAgZWxzZQogICAgICBBQ19NU0dfUkVTVUxUKG9sZCBNSVQgY3J5cHRvIEFQSSldKQogICAgZmkKICBmaQpkb25lCgpuZXdfd2l0aF9zZWN1cml0eT0kcmVidWlsdF9uZXdfd2l0aF9zZWN1cml0eQoKIwojIGdlbmVyYXRlIGVtcHR5IGZpbGVzCiMKIyBDcmVhdGUgaW5jbHVkZSBmaWxlIGxpc3QgZm9yIHNubXBfdmFycy5oIHRvIHVzZS4KbWliZGlyPSJhZ2VudC9taWJncm91cCIKaWYgdGVzdCAhIC1kIGFnZW50OyB0aGVuCiAgbWtkaXIgYWdlbnQKZmkKaWYgdGVzdCAhIC1kIGFnZW50L21pYmdyb3VwOyB0aGVuCiAgbWtkaXIgYWdlbnQvbWliZ3JvdXAKZmkKaj0iJG1pYmRpci9taWJfbW9kdWxlX2luY2x1ZGVzLmggICRtaWJkaXIvYWdlbnRfbW9kdWxlX2luY2x1ZGVzLmggXAogICAkbWliZGlyL21pYl9tb2R1bGVfaW5pdHMuaCAgICAgJG1pYmRpci9hZ2VudF9tb2R1bGVfaW5pdHMuaCAgICBcCiAgICRtaWJkaXIvbWliX21vZHVsZV9zaHV0ZG93bi5oICAkbWliZGlyL2FnZW50X21vZHVsZV9zaHV0ZG93bi5oIFwKICAgaW5jbHVkZS9uZXQtc25tcC9hZ2VudC9taWJfbW9kdWxlX2NvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgaW5jbHVkZS9uZXQtc25tcC9hZ2VudC9hZ2VudF9tb2R1bGVfY29uZmlnLmggICBcCiAgICRtaWJkaXIvbWliX21vZHVsZV9kb3RfY29uZi5oICAkbWliZGlyL2FnZW50X21vZHVsZV9kb3RfY29uZi5oIgoKZm9yIGkgaW4gJGo7IGRvCiAgcm0gLWYgJGkKICBlY2hvICIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgRG8gbm90IG1vZGlmeSBieSBoYW5kLiAqLyIgPiAkaQpkb25lCgojCiMgRG8gaGFpcnkgYWdlbnQgbW9kdWxlIHByb2Nlc3NpbmcuCiMKQUNfTVNHX0NIRUNLSU5HKFtmb3IgYW5kIGNvbmZpZ3VyaW5nIG1pYiBtb2R1bGVzIHRvIHVzZV0pCgojIHNldCB1cCB0aGUgQ1BQIGNvbW1hbmQKTU9EVUxFQ1BQPSIkQ1BQICRQQVJUSUFMVEFSR0VURkxBR1MgLUkke3NyY2Rpcn0vaW5jbHVkZSAtSSR7c3JjZGlyfS9hZ2VudC9taWJncm91cCIKaWYgdGVzdCAieCRlbmFibGVfbWZkX3Jld3JpdGVzIiA9ICJ4eWVzIjsgdGhlbgogIE1PRFVMRUNQUD0iJE1PRFVMRUNQUCAtRE5FVFNOTVBfRU5BQkxFX01GRF9SRVdSSVRFUyIKZmkKCm1vZHVsZV9saXN0PSIiCm1pYl9tb2R1bGVfbGlzdD0iIgphZ2VudF9tb2R1bGVfbGlzdD0iIgpuZXdfd2l0aF9taWJfbW9kdWxlcz1gZWNobyAkd2l0aF9taWJfbW9kdWxlcyB8IHNlZCAncy8sLyAvZzsnYApuZXdfd2l0aF9vdXRfbWliX21vZHVsZXM9YGVjaG8gJHdpdGhfb3V0X21pYl9tb2R1bGVzIHwgc2VkICdzLywvIC9nOydgCgojIHNldCB1cCBpbml0aWFsIG1vZHVsZSBsaXN0Cm5ld19tb2R1bGVfbGlzdD0iJG5ld193aXRoX21pYl9tb2R1bGVzIGRlZmF1bHRfbW9kdWxlcyIKCiMgbWlub3IgbW9kaWZpY2F0aW9ucwppZiB0ZXN0ICJ4JGVuYWJsZV9hZ2VudCIgPSAieG5vIjsgdGhlbgogICAjIG1pbmltdW0gbWliIG1vZHVsZSBsaXN0IGZvciBzbm1wdHJhcGQKICAgbmV3X21vZHVsZV9saXN0PSJtaWJJSS92YWNtX3ZhcnMgbWliSUkvdmFjbV9jb25mIHV0aWxpdGllcy9leGVjdXRlICRuZXdfd2l0aF9taWJfbW9kdWxlcyIKICAgZGVmYXVsdF9taWJzPVNOTVB2Mi1NSUI6SUYtTUlCOklQLU1JQjpUQ1AtTUlCOlVEUC1NSUIKICAgZGVmYXVsdF9taWJzX2luc3RhbGw9IiAiCmVsaWYgdGVzdCAieCRtaW5pX2FnZW50IiA9ICJ4eWVzIjsgdGhlbgogICAjIGRlZmluZSB0aGUgbWluaSBhZ2VudCBmbGFnIHRvIHJlZHVjZSBvdXIgbG9hZCBsaXN0IGZyb20gZGVmYXVsdF9taWJzLmgKICAgTU9EVUxFQ1BQPSIkTU9EVUxFQ1BQIC1ETkVUU05NUF9NSU5JX0FHRU5UIgpmaQoKdGVzdF9tb2R1bGVzPSIkbmV3X21vZHVsZV9saXN0IgpuZXdfbW9kdWxlX2xpc3Q9IiIKCiMgcmVtb3ZlIG1vZHVsZXMgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgZXhjbHVkZWQKZm9yIGkgaW4gJHRlc3RfbW9kdWxlcwogZG8KICBpZiBlY2hvICIgJG5ld193aXRoX291dF9taWJfbW9kdWxlcyAiIHwgZ3JlcCAiICRpICIgPiAvZGV2L251bGw7IHRoZW4KICAgIG1pYl9jZmdfbXNnPSJtaWIgbW9kdWxlICckaScgaXMgYm90aCBpbmNsdWRlZCBhbmQgZXhjbHVkZWQuIgogICAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgY29uZmxpY3RdKQogICAgaWYgdGVzdCAieCR3aXRoX21pYl9jZmdfY2hlY2tzIiA9ICJ4eWVzIjsgdGhlbgogICAgICBBQ19NU0dfV0FSTihbdXNlciB3aXRoICAgIDogJHdpdGhfbWliX21vZHVsZXNdKQogICAgICBBQ19NU0dfV0FSTihbZmluYWwgd2l0aCAgIDogJG5ld19tb2R1bGVfbGlzdF0pCiAgICAgIEFDX01TR19XQVJOKFt1c2VyIHdpdGhvdXQgOiAkd2l0aF9vdXRfbWliX21vZHVsZXNdKQogICAgICBBQ19NU0dfV0FSTihbZmluYWwgd2l0aG91dDogJG5ld193aXRoX291dF9taWJfbW9kdWxlc10pCiAgICAgIEFDX01TR19FUlJPUihbJG1pYl9jZmdfbXNnXSkKICAgIGVsc2UKICAgICAgQUNfTVNHX1dBUk4oWyRtaWJfY2ZnX21zZyBJdCB3aWxsIGJlIGV4Y2x1ZGVkXSkKICAgICAgQUNfTVNHX0NBQ0hFX0FERChbKioqIE1JQiBNb2R1bGUgd2FybmluZyAqKiogJG1pYl9jZmdfbXNnIEl0IGhhcyBiZWVuIGV4Y2x1ZGVkLl0pCiAgICBmaQogIGVsc2UKICAgIG5ld19tb2R1bGVfbGlzdD0iJG5ld19tb2R1bGVfbGlzdCAkaSIKICBmaQpkb25lCgpBQ19NU0dfUkVTVUxUKFskbmV3X21vZHVsZV9saXN0Ll0pCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgbG9vcCBvdmVyIG1vZHVsZSBsaXN0CiMKYWxsX3dhcm5pbmdzPSIiCmlmIHRlc3QgIngkd2l0aF9taWJfY2ZnX2RlYnVnIiA9ICJ4eWVzIjsgdGhlbgogICBtb2R1bGVfZGVidWc9MQplbHNlCiAgIG1vZHVsZV9kZWJ1Zz0wCmZpCmZpcnN0X3Bhc3M9MQpvdXRwdXRfdG89bm9ybWFsCgppZiB0ZXN0ICEgLWQgbWsgOyB0aGVuCiAgbWtkaXIgbWsKZmkKCgptb2R1bGVfcnVsZXM9bWsvbW9kdWxlX3J1bGVzLm1rCmVjaG8gIiMgY29udGVudHMgYmVsb3cgYnVpbHQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmU7IGRvIG5vdCBlZGl0IGJ5IGhhbmQiID4gJG1vZHVsZV9ydWxlcwoKIwojIG1ha2UgZmlsZSBzdWItcGllY2VzCiMKZm9yIGkgaW4gbW9kdWxlX2xpc3RfZGVwcyBtaWJfbW9kdWxlX2xpc3RfZGVwcyBhZ2VudF9tb2R1bGVfbGlzdF9kZXBzIDsgZG8KICBldmFsICIkaT1tay8ke2l9Lm1rIgogIGVjaG8gIiMgY29udGVudHMgYmVsb3cgYnVpbHQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmU7IGRvIG5vdCBlZGl0IGJ5IGhhbmQiID4gbWsvJHtpfS5tawpkb25lCgojCiMgdmFyaWFibGUgc2V0dGluZ3Mgc3ViLXBpZWNlcwojCmZvciBpIGluIG1vZHVsZV9saXN0X2NvZGUgbWliX21vZHVsZV9saXN0X2NvZGUgYWdlbnRfbW9kdWxlX2xpc3RfY29kZSBtb2R1bGVfbGlzdCBtaWJfbW9kdWxlX2xpc3QgYWdlbnRfbW9kdWxlX2xpc3QgOyBkbwogIGV2YWwgIiRpPW1rLyR7aX0ubWsiCiAgZWNobyAiIyBjb250ZW50cyBiZWxvdyBidWlsdCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZTsgZG8gbm90IGVkaXQgYnkgaGFuZCIgPiBtay8ke2l9Lm1rCiAgZWNobyAiJGk9IFxcIiA+PiBtay8ke2l9Lm1rCmRvbmUKCmVjaG8gJEVDSE9fTiAiZWNobyAiICRFQ0hPX0MgPiBtay9NT0RVTEVfTElTVC5tawpNT0RVTEVfTElTVD1tay9NT0RVTEVfTElTVC5tawoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB1bnRpbCB3ZSBoYXZlIGFuIGVtcHR5IG1vZHVsZSBsaXN0Li4uCiMgICAobW9kdWxlcyBtYXkgYWRkIG5ldyBtb2R1bGVzLCBhbmQgdW50aWwgYWxsIGRlcGVuZGVuY2llcyBhcmUgZG9uZS4uLikKIwp3aGlsZSB0ZXN0ICJ4JG5ld19tb2R1bGVfbGlzdCIgIT0gIngiOyBkbwogIEFDX01TR19NT0RVTEVfREJHKC1lLCJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKQogIEFDX01TR19NT0RVTEVfREJHKCJubWw6ICRuZXdfbW9kdWxlX2xpc3QiKQoKICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIyBsb29wIG92ZXIgYWxsIHRoZSBtb2R1bGVzIGluIHRoZSBjdXJyZW50IGxpc3QKICAjCiAgZm9yIGogaW4gJG5ld19tb2R1bGVfbGlzdAogICAgZG8KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGZpZ3VyZSBvdXQgd2hpY2ggc3ViLWJsb2NrcyB0byBidWlsZCBpbiBwYXJ0cwogICAgaWYgZWNobyAiJGoiIHwgZ3JlcCAiPSIgOyB0aGVuCiAgICAgICAjIGJ1aWxkIGEgc2hhcmVkIG9iamVjdCBmaWxlCiAgICAgICAjIGZvcm1hdDogc29maWxlbmFtZT1tb2R1bGUxOm1vZHVsZTIKICAgICAgICMgWFhYOiBjdXJyZW50bHkgZG9lc24ndCBkbyB0aGlzCiAgICAgICBkbF9uYW1lPWBlY2hvICRqIHwgc2VkICdzLz0uKi8vJ2AKICAgICAgIGRsX25hbWVzPSIkZGxfbmFtZXMgJGRsX25hbWUiCiAgICAgICBkbF9vYmplY3RzPWBlY2hvICRqIHwgc2VkICdzLy4qPS8vJ2AKICAgICAgIG1vZHVsZV9zdWJsaXN0PWBlY2hvICRkbF9vYmplY3RzIHwgc2VkICdzLzovIC9nJ2AKICAgICAgIHNhdmVkX3N1Ymxpc3Q9IiIKICAgICAgIHNhdmVkX3N1Ymxpc3RfY29kZT0iIgogICAgICAgb3V0cHV0X3RvPXNlcGFyYXRlCgogICAgICAgIyBjcmVhdGUgb3V0cHV0IGZpbGVzCiAgICAgICAjIHRoZXNlIGFjdHVhbGx5IGdldCBudWtlZCBsYXRlcgogICAgICAgb3V0cHV0X2luaXRzPSJhZ2VudC9taWJncm91cC8ke2RsX25hbWV9LWRsbC5jIgogICAgICAgb3V0cHV0X2hkcnM9ImFnZW50L21pYmdyb3VwLyR7ZGxfbmFtZX0taGRycy5oIgogICAgZWxzZQogICAgICAgIyBub3QgYSBzcGVjaWFsIHRva2VuIGludm9jYXRpb24KICAgICAgIG1vZHVsZV9zdWJsaXN0PSRqCiAgICAgICBvdXRwdXRfdG89bm9ybWFsCiAgICAgICBvdXRwdXRfdD0KICAgIGZpCgogICAgd2hpbGUgdGVzdCAieCRtb2R1bGVfc3VibGlzdCIgIT0gIngiIDsgZG8KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGxvb3Agb3ZlciBhbGwgdGhlIG1vZHVsZXMgaW4gdGhlIHN1YiBsaXN0CiAgICBmb3IgaSBpbiAkbW9kdWxlX3N1Ymxpc3QKICAgIGRvCgogICAgQUNfTVNHX01PRFVMRV9EQkcoLWUgIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpCiAgICBBQ19NU0dfTU9EVUxFX0RCRygidGVzdGluZyAkaSIpCiAgICBuZWVkX2hlYWRlcj0wCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBidWlsZCBhIHBzZXVkbyBpbmNsdWRlIGhlYWRlciB0aGF0IGluY2x1ZGVzIGN1cnJlbnQgY29uZmlnIGFuZAogICAgIyBzeXN0ZW0gc3ltYm9sczoKICAgIEFDX0xBTkdfQ09ORlRFU1QoQUNfTEFOR19TT1VSQ0UoW1sKI2luY2x1ZGUgTkVUU05NUF9TWVNURU1fSU5DTFVERV9GSUxFCiNpbmNsdWRlICIkc3JjZGlyLyRtaWJkaXIvJGkuaCJdXSkpCiAgICBtdiBjb25mdGVzdC4kYWNfZXh0IG1vZHVsZV90bXBfaGVhZGVyLmgKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIG1hY3JvOiBjb25maWdfYmVsb25nc19pbihBUkcpCiAgICAjICAgQVJHOiBlaXRoZXIKICAgICMgICAgIC0gbWliX21vZHVsZSAgID0+IGxpYm5ldHNubXBtaWJzICAgKGRlZmF1bHQpCiAgICAjICAgICAtIGFnZW50X21vZHVsZSA9PiBsaWJuZXRzbm1wYWdlbnQKICAgICMKICAgIG1vZHVsZV90eXBlPW1pYl9tb2R1bGUKICAgIGlmIHRlc3QgLWYgJHNyY2Rpci8kbWliZGlyLyRpLmg7IHRoZW4KICAgICAgY2hhbmdlcXVvdGUoLCApCiAgICAgIG1vZHVsZV90eXBlPWAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19iZWxvbmdzX2luIHwgc2VkICdzQC4qY29uZmlnX2JlbG9uZ3NfaW4oXChbXildKlwpKS4qQFwxQCdgCiAgICAgIGNoYW5nZXF1b3RlKFssIF0pCiAgICBmaQogICAgaWYgdGVzdCAieCRtb2R1bGVfdHlwZSIgPSAieCIgOyB0aGVuCiAgICAgIG1vZHVsZV90eXBlPW1pYl9tb2R1bGUKICAgIGZpCiAgICBpZiB0ZXN0ICJ4JG91dHB1dF90byIgPSAieG5vcm1hbCIgOyB0aGVuCiAgICAgCW91dHB1dF9pbml0cz0iJG1pYmRpci8ke21vZHVsZV90eXBlfV9pbml0cy5oIgogICAgIAlvdXRwdXRfaGRycz0iJG1pYmRpci8ke21vZHVsZV90eXBlfV9pbmNsdWRlcy5oIgogICAgZmkKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZXMgd2l0aGluIHRoZSBkbGwgc3lzdGVtLiAKICAgICMgICAtIGlmIGZvdW5kIGluIGEgZGxsLCB0aGVuIHJlbW92ZSBmcm9tIHRoZSBkbGwgYW5kIGFkZCB0byBtYWluCiAgICBkYmxmaXg9IiIKICAgIGZvciBkbHRlc3QgaW4gJGRsX25hbWVzIDsgZG8KICAgICAgZXZhbCBtb2RfZmlsZXM9IlwiXCRkbF8ke2RsdGVzdH1fZmlsZXNcIiIKICAgICAgaWYgZWNobyAiICRtb2RfZmlsZXMgIiB8IGdyZXAgIiAkaSAiID4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgIyBzb21lIGRsbCBtb2R1bGUgaGFzIGFscmVhZHkgc2VlbiB0aGlzLCB1bmxvYWQgaXQgZnJvbSB0aGF0IGxpc3QKICAgICAgICAjIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBjb3JlIChhZ2FpbikKICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygicmVtb3ZpbmcgJGkgZnJvbSAkZGx0ZXN0IikKICAgICAgICBtb2RfZmlsZXM9YGVjaG8gIiAkbW9kX2ZpbGVzICIgfCBzZWQgInNAICRpIEBAImAKICAgICAgICBkYmxmaXg9Il9fWFhYX18iCiAgICAgICAgZXZhbCAiZGxfJHtkbHRlc3R9X2ZpbGVzPVwiJG1vZF9maWxlc1wiIgoKICAgICAgICBtb2R1bGVfbGlzdD0iJG1vZHVsZV9saXN0ICRpIgoJZWNobyAicmVhZF9jb25maWcubG86IG1pYmdyb3VwLyRpLmgiID4+ICRtb2R1bGVfbGlzdF9kZXBzCglpZiB0ZXN0ICRtb2R1bGVfdHlwZSA9ICJhZ2VudF9tb2R1bGUiIDsgdGhlbgogCSAgICBlY2hvICJzbm1wX3ZhcnMubG86IG1pYmdyb3VwLyRpLmgiID4+ICRhZ2VudF9tb2R1bGVfbGlzdF9kZXBzCiAgICAgICAgZWxzZQogCSAgICBlY2hvICJtaWJfbW9kdWxlcy5sbzogbWliZ3JvdXAvJGkuaCIgPj4gJG1pYl9tb2R1bGVfbGlzdF9kZXBzCiAgICAgICAgZmkKICAgICAgICBldmFsICR7bW9kdWxlX3R5cGV9X2xpc3Q9IlwiXCQke21vZHVsZV90eXBlfV9saXN0ICRpXCIiCgllY2hvICIJJGkgXFwiID4+ICRtb2R1bGVfbGlzdF9jb2RlCgllY2hvICRFQ0hPX04gIiAkaSIgJEVDSE9fQyA+PiAkTU9EVUxFX0xJU1QKICAgICAgICBldmFsIHRtcGZpbGV2YXI9XCRgZWNobyAke21vZHVsZV90eXBlfV9saXN0X2NvZGVgCiAgICAgICAgZWNobyAiCSRpIFxcIiA+PiAkdG1wZmlsZXZhcgoKCSMgWFhYOiBhZGQgdGhpcyB0byB0aGUgbWFpbiBpbml0IGxpc3Q7IHRoaXMgaXMgcG9zc2libGUgbm90CgkjIHF1aXRlIGluIHRoZSByaWdodCBzcG90IGFueSBsb25nZXIgYnV0IHdlJ3JlIHN0dWNrIHdpdGggaXQuCgkjIEFkZGluZyBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBvcmRlcmVkIHNwb3Qgd291bGQgYmUgYQoJIyBuaWdodG1hcmUuICBPaywgd2UncmUgYWxyZWFkeSBpbiBuaWdodG1hcmUgY29kZSBzbyB0aGF0CgkjIHdvbHVkIGhhdmUgdG8gYmUgYSBuaWdodC10ZXJyb3IuCiAgICAgICAgbW5tPWBlY2hvICRpIHwgc2VkICdzLy4qXC8vLztzL1wuYyQvLzsnYAoJb3V0cHV0X2luaXRzX3RtcD0iJG1pYmRpci8ke21vZHVsZV90eXBlfV9pbml0cy5oIgoJZWNobyAiICBpZiAoc2hvdWxkX2luaXQoXCIkbW5tXCIpKSBpbml0XyRtbm0oKTsiID4+ICRvdXRwdXRfaW5pdHNfdG1wCiAgICAgICAgIyBYWFg6IGV2ZW4gd29yc2UsIHdlIGxvb3NlIHdoZXRoZXIgdGhlIGhlYWRlciBpcyBuZWVkZWQgb3Igbm90LgogICAgIAlvdXRwdXRfaGRyc190bXA9IiRtaWJkaXIvJHttb2R1bGVfdHlwZX1faW5jbHVkZXMuaCIKICAgICAgICBlY2hvICcjaW5jbHVkZSAiJyJtaWJncm91cC8kaS5oIiciJyA+PiAkb3V0cHV0X2hkcnNfdG1wCiAgICAgIGZpCiAgICBkb25lCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBtYWtlIHN1cmUgbW9kdWxlIHdhc24ndCBleHBsaWNpdGx5IGV4Y2x1ZGVkLCBvciBhbHJlYWR5IGFkZGVkCiAgICAjCiAgICBpZiB0ZXN0ICJ4JGRibGZpeCIgIT0gIngiIDsgdGhlbgogICAgICBBQ19NU0dfTU9EVUxFX0RCRygiJGkgd2FzIGR1cGxpY2F0ZWQgLS0gcHV0dGluZyBpbnRvIG1haW4iKQogICAgZWxpZiBlY2hvICIgJG5ld193aXRoX291dF9taWJfbW9kdWxlcyAiIHwgZ3JlcCAiICRpICIgPiAvZGV2L251bGw7IHRoZW4KICAgICAgQUNfTVNHX01PRFVMRV9EQkcoIiRpIHdhcyBleGNsdWRlZCIpCiAgICBlbGlmIGVjaG8gIiAkbW9kdWxlX2xpc3QgIiB8IGdyZXAgIiAkaSAiID4gL2Rldi9udWxsOyB0aGVuCiAgICAgIEFDX01TR19NT0RVTEVfREJHKCIkaSBhbHJlYWR5IHRlc3RlZCIpCiAgICBlbHNlCgogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICMgcHJvY2VzcyBtb2R1bGVzIGhlYWRlciwgY2hlY2tpbmcgZm9yIGNvbmZpZ18gcHNldWRvLW1hY3JvcwogICAgICAjCgogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICMgZG9lcyB0aGUgaGVhZGVyIGZpbGUgZm9yIHRoZSBtb2R1bGUgZXhpc3Q/CiAgICAgICMgICBtYWNyb3MgYXJlIG9ubHkgcHJvY2Vzc2VkIGlmIGl0IGRvZXMKICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyLyRtaWJkaXIvJGkuaDsgdGhlbgogICAgICAgIG5ld19saXN0PSIiCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgCSMgbWFjcm86IGNvbmZpZ19leGNsdWRlKG1vZHVsZXMpCiAgICAgIAkjICAtIGxpc3RzIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1vZHVsZXMKICAgICAgCSMgICAgLSBFRzogbmV3IE1JQiBpbXBsZW1lbnRhdGlvbnMgZXhjbHVkZSBvbGQgYW5kIHZpY2UtdmVyc2EKICAgICAgCSMKICAgICAgICAjIGNoZWNrIGlmICRpIGhhcyBhbnkgY29uZmxpY3RzCiAgICAgICAgIwoJbmV3X2xpc3RfZXhjbD1gJE1PRFVMRUNQUCBtb2R1bGVfdG1wX2hlYWRlci5oIHwgZ3JlcCBjb25maWdfZXhjbHVkZSB8IHNlZCAncy8uKmNvbmZpZ19leGNsdWRlKFwoLipcKSkuKi9cMS8nYAoJaWYgdGVzdCAieCRuZXdfbGlzdF9leGNsIiAhPSAieCI7IHRoZW4KICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIkaSBleGNsdWRlcyAkbmV3X2xpc3RfZXhjbCIpCgkgIGZvciBqIGluICRuZXdfbGlzdF9leGNsCgkgICAgZG8KCSAgICBpZiBlY2hvICIgJG1vZHVsZV9saXN0ICRuZXdfbWliX21vZHVsZV9saXN0ICRuZXdfbGlzdF90d28gIiB8IGdyZXAgIiAkaiAiID4gL2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgICAgbWliX2NmZ19tc2c9Im1pYiBtb2R1bGUgJyRpJyBleGNsdWRlcyBtb2R1bGUgJyRqJyBidXQgYW5vdGhlciBtb2R1bGUgcmVxdWlyZXMgaXQiCiAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgZXJyb3JdKQogICAgICAgICAgICAgIGlmIHRlc3QgIngkd2l0aF9taWJfY2ZnX2NoZWNrcyIgPSAieHllcyI7IHRoZW4KCSAgICAgICAgQUNfTVNHX0VSUk9SKFskbWliX2NmZ19tc2ddKQogICAgICAgICAgICAgIGVsc2UKCSAgICAgICAgQUNfTVNHX1dBUk4oWyRtaWJfY2ZnX21zZ10pCiAgICAgICAgICAgICAgICBBQ19NU0dfQ0FDSEVfQUREKFsqKiogTUlCIE1vZHVsZSB3YXJuaW5nICoqKiAkbWliX2NmZ19tc2ddKQogICAgICAgICAgICAgIGZpCgkgICAgZWxzZQoJICAgICAgbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzPSIkaiAkbmV3X3dpdGhfb3V0X21pYl9tb2R1bGVzIgogICAgICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIkaiBhZGRlZCB0byBleGNsdWRlZCBsaXN0IikKCSAgICBmaQoJICBkb25lCglmaQoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIAkjIG1hY3JvOiBjb25maWdfYXJjaF9yZXF1aXJlKEFSQ0gsbW9kdWxlcykKICAgICAgCSMgIC0gbGlzdHMgbW9kdWxlcyByZXF1aXJlZCBmb3IgYSBnaXZlbiBBUkNICiAgICAgICAgIwogICAgICAgICMgY2hlY2sgaWYgJGkgaGFzIGFueSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgcmVxdWlyZW1lbnRzCiAgICAgICAgIwogICAgICAgIGNoYW5nZXF1b3RlKCwgKQogICAgICAgIG5ld19saXN0X2FyY2g9YCRNT0RVTEVDUFAgbW9kdWxlX3RtcF9oZWFkZXIuaCB8IGdyZXAgY29uZmlnX2FyY2hfcmVxdWlyZSB8IHNlZCAncy8uKmNvbmZpZ19hcmNoX3JlcXVpcmUoICpcKFteIF0qXCkgKiwgKlwoW14gXSpcKSAqKS4qL1wxLXhhcmNoeC1cMi8nYAogICAgICAgIGNoYW5nZXF1b3RlKFssIF0pCglpZiB0ZXN0ICJ4JG5ld19saXN0X2FyY2giICE9ICJ4IjsgdGhlbgogICAgICAgICAgZm9yIGogaW4gJG5ld19saXN0X2FyY2gKCSAgICBkbwoJICAgIGFyY2h0ZXN0PWBlY2hvICRqIHwgc2VkICdzLy14YXJjaHgtLiovLydgCgkgICAgIyB0YXJnZXRfb3MgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIHRvIGEgI2RlZmluZSBvZiAxLi4uCgkgICAgaWYgdGVzdCAieCRhcmNodGVzdCIgPSAieDEiIC1vICJ4JHRhcmdldF9vcyIgPSAieCRhcmNodGVzdCIgLW8gIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4JGFyY2h0ZXN0IjsgdGhlbgoJICAgICAgbmV3X2xpc3Q9IiRuZXdfbGlzdCBgZWNobyAkaiB8IHNlZCAncy8uKi14YXJjaHgtLy8nYCIKICAgICAgICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygiICRpIHJlcXVpcmVkIGFkZGluZyBhcmNoIGZpbGVzOiBgZWNobyAkaiB8IHNlZCAncy8uKi14YXJjaHgtLy8nYCIpCgkgICAgZmkKCSAgZG9uZQoJZmkKICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygiICRpIHJlcXVpcmVkIGFyY2ggZmlsZXM6ICRuZXdfbGlzdCIpCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgCSMgbWFjcm86IGNvbmZpZ19yZXF1aXJlKG1vZHVsZXMpCiAgICAgIAkjICAtIGxpc3RzIG1vZHVsZXMgcmVxdWlyZWQgZm9yIHRoaXMgbW9kdWxlCiAgICAgICAgIwogICAgICAgICMgY2hlY2sgaWYgJGkgaGFzIGFueSBvdGhlciByZXF1aXJlZCBtb2R1bGVzCiAgICAgICAgIwoJbmV3X2xpc3Q9IiRuZXdfbGlzdCBgJE1PRFVMRUNQUCBtb2R1bGVfdG1wX2hlYWRlci5oIHwgZ3JlcCBjb25maWdfcmVxdWlyZSB8IHNlZCAncy8uKmNvbmZpZ19yZXF1aXJlKFwoLipcKSkuKi9cMS8nYCIKICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygiICRpIHdpbGwgdGVzdDogJG5ld19saXN0IikKCWlmIHRlc3QgIngkbmV3X2xpc3QiICE9ICJ4IjsgdGhlbgoJICBmb3IgaiBpbiAkbmV3X2xpc3QKCSAgICBkbwogICAgICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygtbiAiICRpIHdhbnRzIHRvIGFkZCAkajogIikKCSAgICBpZiB0ZXN0ICEgLWYgJHNyY2Rpci8kbWliZGlyLyRqLmggLWEgISAtZiAkc3JjZGlyLyRtaWJkaXIvJGouYzsgdGhlbgogICAgICAgICAgICAgIEFDX01TR19XQVJOKFttaWIgbW9kdWxlIGVycm9yXSkKCSAgICAgIEFDX01TR19FUlJPUihbbWliIG1vZHVsZSAiJGkiIHJlcXVpcmVzIG1vZHVsZSAiJGoiIGJ1dCAkai5oIG9yICRqLmMgY291bGQgbm90IGJlIGZvdW5kIGluICRzcmNkaXIvJG1pYmRpcl0pCgkgICAgZWxpZiBlY2hvICIgJG5ld193aXRoX291dF9taWJfbW9kdWxlcyAiIHwgZ3JlcCAiICRqICIgPiAvZGV2L251bGw7IHRoZW4KCSAgICAgIGlmIHRlc3QgIngkaSIgIT0gInhkZWZhdWx0X21vZHVsZXMiIDsgdGhlbgogICAgICAgICAgICAgICAgbWliX2NmZ19tc2c9Im1pYiBtb2R1bGUgJyRpJyByZXF1aXJlcyBtb2R1bGUgJyRqJyBidXQgc29tZW9uZSB0b2xkIG1lIHRvIGNvbXBpbGUgd2l0aG91dCBpdCIKICAgICAgICAgICAgICAgIEFDX01TR19XQVJOKFttaWIgbW9kdWxlIGVycm9yXSkKICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkd2l0aF9taWJfY2ZnX2NoZWNrcyIgPSAieHllcyI7IHRoZW4KICAgICAgICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFskbWliX2NmZ19tc2ddKQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihbJG1pYl9jZmdfbXNnXSkKICAgICAgICAgICAgICAgICAgQUNfTVNHX0NBQ0hFX0FERChbKioqIE1JQiBNb2R1bGUgd2FybmluZyAqKiogJG1pYl9jZmdfbXNnXSkKICAgICAgICAgICAgICAgIGZpCiMJICAgIGVsaWYgZWNobyAiICRtb2R1bGVfbGlzdCAkbmV3X2xpc3RfdHdvICRuZXdfbW9kdWxlX2xpc3QgIiB8IGdyZXAgIiAkaiAiID4gL2Rldi9udWxsOyB0aGVuCiMgICAgICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIgICRqIGluY2x1ZGVkIHByZXZpb3VzbHkiKQogICAgICAgICAgICAgIGZpCgkgICAgZWxzZQoJICAgICAgbmV3X2xpc3RfdHdvPSIkbmV3X2xpc3RfdHdvICRqIgogICAgICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIgICRqIGluY2x1ZGVkIikKCSAgICBmaQoJICBkb25lCglmaQoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIAkjIG1hY3JvOiBjb25maWdfYWRkX21pYihTT01FLU1JQikKICAgICAgCSMgIC0gbGlzdHMgTUlCcyB0byBiZSBhZGRlZCB0byB0aGUgZGVmYXVsdCB0by1sb2FkIGxpc3QuCiAgICAgICAgIwogICAgICAgICMgY2hlY2sgaWYgJGkgaGFzIGFueSBtaWJzIHRvIGFkZAogICAgICAgICMKCW5ld19taWJzPWAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19hZGRfbWliIHwgc2VkICdzLy4qY29uZmlnX2FkZF9taWIoXCguKlwpKS4qL1wxLydgCglpZiB0ZXN0ICJ4JG5ld19taWJzIiAhPSAieCI7IHRoZW4KCSAgICBmb3IgaiBpbiAkbmV3X21pYnMKCQlkbwoJCWlmIHRlc3QgInhgZWNobyA6JGRlZmF1bHRfbWliczogfCBncmVwIDokajpgIiA9ICJ4IjsgdGhlbgoJCSAgICBkZWZhdWx0X21pYnM9IiRkZWZhdWx0X21pYnM6JGoiCgkJZmkKCQlpZiB0ZXN0IC1mICRzcmNkaXIvbWlicy8kai50eHQ7IHRoZW4KCQkgICAgaWYgZWNobyAkZGVmYXVsdF9taWJzX2luc3RhbGwgfCBncmVwICIgJGogIiA+IC9kZXYvbnVsbDsgdGhlbgoJCQkgICAgOgoJCSAgICBlbHNlCgkJCSAgICBkZWZhdWx0X21pYnNfaW5zdGFsbD0iJGRlZmF1bHRfbWlic19pbnN0YWxsICRqLnR4dCIKCQkgICAgZmkKCQlmaQoJICAgIGRvbmUKCWZpICMgbmV3IG1pYnMKCiAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjIGFkZCB0aGUgY3VycmVudCBtb2R1bGUgdG8gdGhlIGxpc3Qgb2Ygc3R1ZmYgdG8gY29tcGlsZSwgZXRjLgogICAgICAgICMKICAgICAgICAjIGFkZCAkaSB0byBtb2R1bGUgbGlzdAogICAgICAgICMKICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygiICAkaSBhZGRlZCAoYmFzZWQgb24gJGkuaCkiKQogICAgICAgIG1vZHVsZV9saXN0PSIkbW9kdWxlX2xpc3QgJGkiCiAgICAgICAgZXZhbCAke21vZHVsZV90eXBlfV9saXN0PSJcIlwkJHttb2R1bGVfdHlwZX1fbGlzdCAkaVwiIgoKCWVjaG8gInJlYWRfY29uZmlnLmxvOiBtaWJncm91cC8kaS5oIiA+PiAkbW9kdWxlX2xpc3RfZGVwcwoJaWYgdGVzdCAkbW9kdWxlX3R5cGUgPSAiYWdlbnRfbW9kdWxlIiA7IHRoZW4KIAkgICAgZWNobyAic25tcF92YXJzLmxvOiBtaWJncm91cC8kaS5oIiA+PiAkYWdlbnRfbW9kdWxlX2xpc3RfZGVwcwogICAgICAgIGVsc2UKIAkgICAgZWNobyAibWliX21vZHVsZXMubG86IG1pYmdyb3VwLyRpLmgiID4+ICRtaWJfbW9kdWxlX2xpc3RfZGVwcwogICAgICAgIGZpCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBjaGVjayBmb3IgdW5zdXBwb3J0ZWQgY29uZmlnX2xvYWRfbWliCiAgICAgICAgIwogICAgICAgIGlmICRNT0RVTEVDUFAgbW9kdWxlX3RtcF9oZWFkZXIuaCB8IGdyZXAgY29uZmlnX2xvYWRfbWliID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIEFDX01TR19XQVJOKFttaWIgbW9kdWxlIGVycm9yXSkKICAgICAgCSAgQUNfTVNHX1dBUk4oW21pYiBtb2R1bGUgIiRpIiB1c2VzIHRoZSAiY29uZmlnX2xvYWRfbWliIiBkaXJlY3RpdmUsIHdoaWNoIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBJdCBwcm9iYWJseSB3b24ndCB3b3JrLl0pCiAgICAgICAgZmkgIyBncmVwIGNvbmZpZ19sb2FkX21pYgoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgY2hlY2sgZm9yIGNvbmZpZ19wYXJzZV9kb3RfY29uZgogICAgICAgICMgIChnZW5lcmFsbHkgbm90IHVzZWQgYW55IGxvbmdlcjsgb2xkIGF1dG8tbG9hZCBhIC5jb25mIHRva2VuKQogICAgICAgICMKICAgICAgICBjaGFuZ2VxdW90ZSgsICkKICAgICAgICAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19wYXJzZV9kb3RfY29uZiB8IHNlZCAnc0AuKmNvbmZpZ19wYXJzZV9kb3RfY29uZihcKFteKV0qXCksICpcKFteKSxdKlwpLCAqXChbXiksXSpcKSwgKlwoW14pLF0qXCkpLipAcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoInNubXBkIixcMSwgXDIsIFwzLCBcNCk7QCcgPj4gJG1pYmRpci9taWJfbW9kdWxlX2RvdF9jb25mLmgKCWNoYW5nZXF1b3RlKFssIF0pCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgCSMgbWFjcm86IGNvbmZpZ19lcnJvcihlcnJvciB0ZXh0KQogICAgICAJIyAgLSB1c2VkIHRvIHNpZ25hbCBhIGNvbmZpZ3VyYXRpb24gZXJyb3IgZnJvbSBhIG1vZHVsZQogICAgICAgICMKICAgICAgICAjIGNoZWNrIGlmICRpIGhhcyBhbnkgZXJyb3JzLCBvciB3YXJuaW5ncwogICAgICAgICMKCWVycm9yPWAkTU9EVUxFQ1BQIG1vZHVsZV90bXBfaGVhZGVyLmggfCBncmVwIGNvbmZpZ19lcnJvciB8IHNlZCAncy8uKmNvbmZpZ19lcnJvcihcKC4qXCkpLiovXDEvJ2AKCWlmIHRlc3QgIngkZXJyb3IiICE9ICJ4IjsgdGhlbgogICAgICAgICAgZWNobwogICAgICAgICAgZWNobwogICAgICAgICAgQUNfTVNHX0VSUk9SKFskaTogKioqICRlcnJvciAqKipdKQogICAgICAgIGZpCgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgCSMgbWFjcm86IGNvbmZpZ193YXJuaW5nKHdhcm5pbmcgdGV4dCkKICAgICAgCSMgIC0gdXNlZCB0byBzaWduYWwgYSBjb25maWd1cmF0aW9uICJ3YXJuaW5nIiB0byBiZSBwcmludGVkIHRvIHRoZSB1c2VyCiAgICAgICAgIwoJd2FybmluZz1gJE1PRFVMRUNQUCBtb2R1bGVfdG1wX2hlYWRlci5oIHwgZ3JlcCBjb25maWdfd2FybmluZyB8IHNlZCAncy8uKmNvbmZpZ193YXJuaW5nKFwoLipcKSkuKi9cMS8nYAoJaWYgdGVzdCAieCR3YXJuaW5nIiAhPSAieCI7IHRoZW4KICAgICAgICAgIGFsbF93YXJuaW5ncz0iJGFsbF93YXJuaW5ncyAkd2FybmluZwoiCiAgICAgICAgZmkKCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIyBDaGVjayBmb3IgYSAuYyBmaWxlIGlmIHRoZSAuaCBkaWRuJ3QgZXhpc3QKICAgICAgIwogICAgICBlbGlmIHRlc3QgLWYgJHNyY2Rpci8kbWliZGlyLyRpLmM7IHRoZW4KICAgICAgICBpZiBlY2hvICIgJG1vZHVsZV9saXN0ICRuZXdfbGlzdF90d28gJG5ld19tb2R1bGVfbGlzdCAiIHwgZ3JlcCAiICRpICAgICAgIiA+IC9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgIEFDX01TR19NT0RVTEVfREJHKCIgICRpIGFscmVhZHkgaW5jbHVkZWQiKQogICAgICAgIGVsc2UKICAgICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygiICAkaSBhZGRlZCAoYmFzZWQgb24gJGkuYykiKQoJICAgbW9kdWxlX2xpc3Q9IiRtb2R1bGVfbGlzdCAkaSIKCSAgIG1pYl9tb2R1bGVfbGlzdD0iJG1pYl9tb2R1bGVfbGlzdCAkaSIKICAgICAgICBmaQoKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIE5vIC5oIG9yIC5jID0gZXJyb3IhICAodHlwbz8pCiAgICAgICMKICAgICAgZWxzZSAjIG5vICRpLmggb3IgJGkuYwogICAgICAgIEFDX01TR19XQVJOKFttaWIgbW9kdWxlIGVycm9yXSkKCUFDX01TR19FUlJPUihbbW9kdWxlIGZpbGVzICRpLmggb3IgJGkuYyBjb3VsZCBub3QgYmUgZm91bmQgaW4gJHNyY2Rpci8kbWliZGlyXSkKICAgICAgZmkgIyBubyAkaS5oCgogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIGNoZWNrIGZvciBpbml0L3NodXRkb3duIHJvdXRpbmVzIHRvbwogICAgICAjCiAgICAgIGhhc19jX2NvZGU9bm8KICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyLyRtaWJkaXIvJGkuYzsgdGhlbgogICAgICAgIGlmIHRlc3QgIngkb3V0cHV0X3RvIiA9ICJ4bm9ybWFsIiA7IHRoZW4KCSAgZWNobyAiCSRpIFxcIiA+PiAkbW9kdWxlX2xpc3RfY29kZQogIAkgIGVjaG8gJEVDSE9fTiAiICRpIiAkRUNIT19DID4+ICRNT0RVTEVfTElTVAogICAgICAgICAgZXZhbCB0bXBmaWxldmFyPVwkYGVjaG8gJHttb2R1bGVfdHlwZX1fbGlzdF9jb2RlYAogICAgICAgICAgZWNobyAiCSRpIFxcIiA+PiAkdG1wZmlsZXZhcgogICAgICAgIGVsc2UKICAgICAgICAgIGV2YWwgImRsXyR7ZGxfbmFtZX1fZmlsZXM9XCJcJGRsXyR7ZGxfbmFtZX1fZmlsZXMgJGlcIiIKICAgICAgICAgIHNhdmVkX3N1Ymxpc3RfY29kZT0iJHNhdmVkX3N1Ymxpc3RfY29kZSAkaSIKICAgICAgICBmaQogICAgICAgIG1ubT1gZWNobyAkaSB8IHNlZCAncy8uKlwvLy87cy9cLmMkLy87J2AKICAgICAgICBBQ19NU0dfTU9EVUxFX0RCRygtZSAiXG5jaGVja2luZyAnJHNyY2Rpci8kbWliZGlyLyRpLmMnICgkbW5tL2BiYXNlbmFtZSAkaWApIEMgZmlsZSBmb3IgaW5pdC9zaHV0ZG93biIpCiAgICAgICAgaWYgdGVzdCAieCRtbm0iICE9ICJ4YGJhc2VuYW1lICRpYCI7IHRoZW4KICAgICAgICAgICBBQ19NU0dfV0FSTihbbWliIG1vZHVsZSBlcnJvcl0pCgkgICBBQ19NU0dfRVJST1IoW2NvbmZsaWN0aW5nIG5hbWVzOiAkbW5tICE9IGBiYXNlbmFtZSAkaWBdKQogICAgICAgIGZpCiAgICAgICAgdGVtcF9pbml0PWBncmVwIGluaXRfJG1ubSAkc3JjZGlyLyRtaWJkaXIvJGkuYyB8IGdyZXAgLXYgX2luaXRfJG1ubWAKCWlmIHRlc3QgIngkdGVtcF9pbml0IiAhPSAieCI7IHRoZW4KICAgICAgICAgICAgQUNfTVNHX01PRFVMRV9EQkcoLWUgImFkZGluZyBpbml0XyRtbm0oKSB0byBsaXN0IikKICAgICAgICAgICAgbmVlZF9oZWFkZXI9MQoJICAgIGVjaG8gIiAgaWYgKHNob3VsZF9pbml0KFwiJG1ubVwiKSkgaW5pdF8kbW5tKCk7IiA+PiAkb3V0cHV0X2luaXRzCglmaQoJZ3JlcCBzaHV0ZG93bl8kbW5tICRzcmNkaXIvJG1pYmRpci8kaS5jID4gL2Rldi9udWxsCiAgICAgICAgaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KICAgICAgICAgICAgaWYgdGVzdCAkbW9kdWxlX2RlYnVnIC1lcSAxOyB0aGVuCiAgICAgICAgICAgICAgZWNobyAtZSAiXG5hZGRpbmcgc2h1dGRvd25fJG1ubSgpIHRvIGxpc3QiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIG5lZWRfaGVhZGVyPTEKCSAgICBlY2hvICIgIGlmIChzaG91bGRfaW5pdChcIiRtbm1cIikpIHNodXRkb3duXyRtbm0oKTsiID4+ICRtaWJkaXIvJHttb2R1bGVfdHlwZX1fc2h1dGRvd24uaAoJZmkKICAgICAgZmkgIyB0ZXN0IC1mICRzcmNkaXIvJG1pYmRpci8kaS5jCgogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIGlmIHRoZXJlIGlzIGEgc2h1dGRvd24vaW5pdCBsaXN0LAogICAgICAjCiAgICAgIGlmIHRlc3QgJG5lZWRfaGVhZGVyIC1lcSAxIDsgdGhlbgogICAgICAgICBlY2hvICcjaW5jbHVkZSAiJyJtaWJncm91cC8kaS5oIiciJyA+PiAkb3V0cHV0X2hkcnMKICAgICAgZWxzZQogICAgICAgICBlY2hvICcvKiNpbmNsdWRlICInIm1pYmdyb3VwLyRpLmgiJyIqLycgPj4gJG91dHB1dF9oZHJzCiAgICAgIGZpCgogICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAjIGNoZWNrIGZvciBvdXRwdXQgZGlyZWN0b3J5IChmb3IgYnVpbGRpbmcgb3V0c2lkZSBvZiBzb3VyY2UgdHJlZQogICAgICAjCiAgICAgIGNoYW5nZXF1b3RlKCwgKQogICAgICBpZiB0ZXN0ICJ4YGVjaG8gJGkgfCBzZWQgJ3MvXC8vL2c7J2AiICE9ICJ4JGkiOyB0aGVuCgltbmQ9YGVjaG8gJGkgfCBzZWQgJ3MvXC9bXi9dKiQvLzsnYAoJaWYgdGVzdCAhIC1kIC4vJG1pYmRpci8kbW5kOyB0aGVuCgkgICAgbW9kdWxlX2RpcmVjdG9yaWVzPSIkbW9kdWxlX2RpcmVjdG9yaWVzIC4vJG1pYmRpci8kbW5kIgoJZmkKICAgICAgZmkgIyBtb2R1bGUgZGlyZWN0b3J5IHRlc3QKICAgICAgY2hhbmdlcXVvdGUoWywgXSkKCiAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICMgZGVmaW5lIFVTSU5HXypfTU9EVUxFCiAgICAgICMKICAgICAgY2hhbmdlcXVvdGUoLCApCiAgICAgIHN5bT0iYGVjaG8gJHtpfSB8IHNlZCAncy9bXmEtekEtWjAtOV9dL18vZycgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgIgogICAgICBjaGFuZ2VxdW90ZShbLCBdKQogICAgICBlY2hvICIvKiBEZWZpbmUgaWYgY29tcGlsaW5nIHdpdGggdGhlICR7aX0gbW9kdWxlIGZpbGVzLiAgKi8iID4+IGluY2x1ZGUvbmV0LXNubXAvYWdlbnQvJHttb2R1bGVfdHlwZX1fY29uZmlnLmgKICAgICAgZWNobyAiI2RlZmluZSBVU0lOR18ke3N5bX1fTU9EVUxFIDEiID4+IGluY2x1ZGUvbmV0LXNubXAvYWdlbnQvJHttb2R1bGVfdHlwZX1fY29uZmlnLmgKICAgICAgZWNobyAiICIgPj4gaW5jbHVkZS9uZXQtc25tcC9hZ2VudC8ke21vZHVsZV90eXBlfV9jb25maWcuaAoKICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgZWNobyAkRUNIT19OICIgJGkkRUNIT19DIgogICAgZmkgIwogICAgZG9uZSAjIGZvciBpIGluICRtb2R1bGVfc3VibGlzdAoKICAgIGlmIHRlc3QgIiRvdXRwdXRfdG8iID0gInNlcGFyYXRlIiA7IHRoZW4KICAgICAgaWYgdGVzdCAieCRuZXdfbGlzdF90d28iID0gIngiIDsgdGhlbgogICAgICAgICMgbm8gbmV3IHN1Yi1tb2R1bGVzIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXJnZXQKICAgICAgICBvdXRwdXRfdG89Im5vcm1hbCIKCiAgICAgICAgZGxsY2xlYW5zPSIkc2F2ZWRfc3VibGlzdF9vICRkbGxjbGVhbnMiCiAgICAgICAgb3V0cHV0X2luaXRzPSIiCiAgICAgICAgbW9kdWxlX3N1Ymxpc3Q9IiIKICAgICAgZWxzZQogICAgICAgICMgYSBtb2R1bGUgaGFkIHN1Yi1tb2R1bGVzIHJlcXVpcmVkOyBrZWVwIGdvaW4nCiAgICAgICAgc2F2ZWRfc3VibGlzdD0iJHNhdmVkX3N1Ymxpc3QgJG1vZHVsZV9zdWJsaXN0IgogICAgICAgIG1vZHVsZV9zdWJsaXN0PSIkbmV3X2xpc3RfdHdvIgogICAgICAgIG5ld19saXN0X3R3bz0iIgogICAgICBmaQogICAgZWxzZQogICAgICBtb2R1bGVfc3VibGlzdD0iIgogICAgZmkKCiAgICBkb25lICMgd2hpbGUgbW9kdWxlX3N1Ymxpc3QKICBkb25lICMgZm9yIGogaW4gJG5ld19tb2R1bGVfbGlzdAoKICAjIHJlbWVtYmVyIHRoZSB0b3AgbGV2ZWwgbW9kdWxlcyBmb3IgbGF0ZXIgcmVwb3J0aW5nCiAgaWYgdGVzdCAkZmlyc3RfcGFzcyA9IDEgOyB0aGVuCiAgICAjIHJlbWVtYmVyIHRoaXMgbGlzdCBmb3IgbGF0ZXIgcmVwb3J0aW5nCiAgICB0b3BfbGV2ZWxfbW9kdWxlcz0iJG5ld19tb2R1bGVfbGlzdCA9PiAkbmV3X2xpc3RfdHdvIgogICAgZmlyc3RfcGFzcz0wCiAgZmkKICAjLS0tLS0tLS0tLS0tLS0tLS0tLQogICMgaWYgJGkgYWRkZWQgbmV3IG1vZHVsZXMgdmlzIGNvbmZpZ18qLAogICMgY2hlY2sgdGhvc2UgbW9kdWxlcyBmb3IgcmVxdWlyZW1lbnRzIHRvbwogICMKICAjIHRyYW5zZmVyIHRoZSBuZXcgbW9kdWxlIHRvIGNoZWNrIGxpc3QgdG8gdGhlIG5vcm1hbCB2YXJpYWJsZQogICMKICBpZiB0ZXN0ICJ4JG5ld19saXN0X3R3byIgOyB0aGVuCiAgICBvdXRwdXRfdG89bm9ybWFsCiAgZmkKICBuZXdfbW9kdWxlX2xpc3Q9IiRuZXdfbGlzdF90d28iCiAgbmV3X2xpc3RfdHdvPSIiCmRvbmUgIyB3aGlsZSB0ZXN0ICJ4JG5ld19tb2R1bGVfbGlzdCIgIT0gIngiOyBkbwplY2hvICIiCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBjb25zdHJ1Y3QgdGhlIGRsbCBjb2RlIGZpbGVzIGFuZCBtYWtlIHJ1bGVzLiAgVGhpcyBjYW4ndCBiZSBkb25lCiMgdW50aWwgbm93IGJlY2F1c2UgZHVwbGljYXRlIHVzZSBvZiBhIG1vZHVsZSBtZWFucyBpdCBnZXRzIHJlbW92ZWQKIyBmcm9tIHRoZSBkbGwgYW5kIHB1dCBpbnRvIHRoZSBtYWluIGFnZW50LgojCmZvciBpIGluICRkbF9uYW1lcyA7IGRvCiAgZXZhbCBtb2RfZmlsZXM9IlwiXCRkbF8ke2l9X2ZpbGVzXCIiCiAgZWNobyAiY29tcG9uZW50cyBpbiB0aGUgJGkgZGxsOiAkbW9kX2ZpbGVzIgoKICBvdXRwdXRfaW5pdHM9ImFnZW50L21pYmdyb3VwLyR7aX0tZGxsLmMiCiAgb3V0cHV0X2hkcnM9ImFnZW50L21pYmdyb3VwLyR7aX0taGRycy5oIgoKICBBQ19NU0dfTU9EVUxFX0RCRygiY3JlYXRpbmcgZGxsIGZpbGU6ICRvdXRwdXRfaW5pdHMiKQogIGZvciBvZmlsZSBpbiAkb3V0cHV0X2luaXRzICRvdXRwdXRfaGRycyA7IGRvCiAgICBpZiB0ZXN0IC1mICRvZmlsZSA7IHRoZW4KICAgICAgaWYgZ3JlcCAidGhpcyBmaWxlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUiICRvZmlsZSA+IC9kZXYvbnVsbCAyPiYxIDsgdGhlbgogIAk6CiAgICAgIGVsc2UKICAJQUNfTVNHX0VSUk9SKFskb2ZpbGUgYWxyZWFkeSBleGlzdGVkIDsgY2FuJ3QgYnVpbGQgZGxsIG9iamVjdCAkaV0pCiAgICAgIGZpCiAgICBmaQogICAgY2F0ID4gJG9maWxlIDw8IEVPRklGCi8qIHhEbyBub3QgZWRpdDsgdGhpcyBmaWxlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUgKi8KRU9GSUYKICBkb25lCgogIGNhdCA+PiAkb3V0cHV0X2luaXRzIDw8IEVPRk9DCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSAiJHtpfS1oZHJzLmgiCnZvaWQKaW5pdF8kaSh2b2lkKSB7CkVPRk9DCgogICMgY3JlYXRlIHRoZSAuc28gcnVsZQogIHNhdmVkX3N1Ymxpc3Rfbz1gZWNobyAiJG1vZF9maWxlcyAiIHwgc2VkICdzL14gKi8vZztzLyAgKi8ubyAvZzsnYAoKICAjIGNyZWF0ZSB0aGUgcnVsZXMgZm9yIGVhY2ggb2JqZWN0CiAgZm9yIGogaW4gJG1vZF9maWxlcyA7IGRvCiAgICBjYXQgPj4gJG1vZHVsZV9ydWxlcyA8PCBFT0ZSCiRqLm86ICRqLmMKCVwkKENDKSAtYyBcJChDUFBGTEFHUykgXCQoQ0ZMQUdTKSBcJChETEZMQUdTKSAtbyBcJEAgXCQ8CgpFT0ZSCiAgICBtbm09YGVjaG8gJGogfCBzZWQgJ3MvLipcLy8vO3MvXC5jJC8vOydgCiAgICBlY2hvICIgIGlmIChzaG91bGRfaW5pdChcIiRtbm1cIikpIGluaXRfJG1ubSgpOyIgPj4gJG91dHB1dF9pbml0cwogIGRvbmUKCiAgIyBjcmVhdGUgdGhlIHJ1bGUgZm9yIHRoZSAuc28gYW5kIHdyYXBwZXIgY29kZQogIGNhdCA+PiAkbW9kdWxlX3J1bGVzIDw8IEVPRk0KJHtpfS1kbGwubzogJHtpfS1kbGwuYwoJXCQoQ0MpIC1jIFwkKENQUEZMQUdTKSBcJChDRkxBR1MpIFwkKERMRkxBR1MpIC1vIFwkQCBcJDwKCiR7aX0uc286ICRzYXZlZF9zdWJsaXN0X28gJHtpfS1kbGwubwoJXCQoQ0MpIFwkKENQUEZMQUdTKSBcJChDRkxBR1MpIFwkKERMRkxBR1MpIC1vIFwkQCAkc2F2ZWRfc3VibGlzdF9vICR7aX0tZGxsLm8KCkVPRk0KICAgICAgICBjYXQgPj4gJG91dHB1dF9pbml0cyA8PCBFT0ZPQ0ZJTgp9CkVPRk9DRklOCgpkb25lCgojIGNsZWFudXAKcm0gLWYgbW9kdWxlX3RtcF9oZWFkZXIuaAoKIy0tLS0tLS0tLS0tLS0tLS0tLS0KIyBidWlsZCBtb2R1bGUgbGlzdHMgZm9yIE1ha2VmaWxlcwojCmNoYW5nZXF1b3RlKCwgKQoKZm9yIGkgaW4gbW9kdWxlX2xpc3RfbyBtb2R1bGVfbGlzdF9jIG1vZHVsZV9saXN0X2xvIG1pYl9tb2R1bGVfbGlzdF9vIG1pYl9tb2R1bGVfbGlzdF9jIG1pYl9tb2R1bGVfbGlzdF9sbyBtaWJncm91cF9saXN0X28gbWliZ3JvdXBfbGlzdF9sbyBhZ2VudF9tb2R1bGVfbGlzdF9vIGFnZW50X21vZHVsZV9saXN0X2MgYWdlbnRfbW9kdWxlX2xpc3RfbG8gYWdlbnRncm91cF9saXN0X28gYWdlbnRncm91cF9saXN0X2xvIDsgZG8KICBldmFsICIkaT1tay8ke2l9Lm1rIgpkb25lCgpzZWQgJ3MvXm1vZHVsZV9saXN0X2NvZGUvbW9kdWxlX2xpc3Rfby87cy9cKFtePV1cKSAgKlxcL1wxLm8gXFwvZycgIDwgJG1vZHVsZV9saXN0X2NvZGUgID4gJG1vZHVsZV9saXN0X28Kc2VkICdzL15tb2R1bGVfbGlzdF9jb2RlL21vZHVsZV9saXN0X2MvO3MvXChbXj1dXCkgICpcXC9cMS5jIFxcL2cnICA8ICRtb2R1bGVfbGlzdF9jb2RlICA+ICRtb2R1bGVfbGlzdF9jCnNlZCAncy9ebW9kdWxlX2xpc3RfY29kZS9tb2R1bGVfbGlzdF9sby87cy9cKFtePV1cKSAgKlxcL1wxLmxvIFxcL2cnIDwgJG1vZHVsZV9saXN0X2NvZGUgID4gJG1vZHVsZV9saXN0X2xvCgpzZWQgJ3MvXm1pYl9tb2R1bGVfbGlzdF9jb2RlL21pYl9tb2R1bGVfbGlzdF9vLztzL1woW149XVwpICAqXFwvXDEubyBcXC9nJyAgPCAkbWliX21vZHVsZV9saXN0X2NvZGUgID4gJG1pYl9tb2R1bGVfbGlzdF9vCnNlZCAncy9ebWliX21vZHVsZV9saXN0X2NvZGUvbWliX21vZHVsZV9saXN0X2MvO3MvXChbXj1dXCkgICpcXC9cMS5jIFxcL2cnICA8ICRtaWJfbW9kdWxlX2xpc3RfY29kZSAgPiAkbWliX21vZHVsZV9saXN0X2MKc2VkICdzL15taWJfbW9kdWxlX2xpc3RfY29kZS9taWJfbW9kdWxlX2xpc3RfbG8vO3MvXChbXj1dXCkgICpcXC9cMS5sbyBcXC9nJyA8ICRtaWJfbW9kdWxlX2xpc3RfY29kZSAgPiAkbWliX21vZHVsZV9saXN0X2xvCgpzZWQgJ3MvXm1pYl9tb2R1bGVfbGlzdF9vL21pYmdyb3VwX2xpc3Rfby87c0BcKFteIAldKlwpXC5vQG1pYmdyb3VwL1wxLm9AZycgPCAkbWliX21vZHVsZV9saXN0X28gPiAkbWliZ3JvdXBfbGlzdF9vCnNlZCAncy9ebWliX21vZHVsZV9saXN0X2xvL21pYmdyb3VwX2xpc3RfbG8vO3NAXChbXiAJXSpcKVwubG9AbWliZ3JvdXAvXDEubG9AZycgPCAkbWliX21vZHVsZV9saXN0X2xvID4gJG1pYmdyb3VwX2xpc3RfbG8KCnNlZCAncy9eYWdlbnRfbW9kdWxlX2xpc3RfY29kZS9hZ2VudF9tb2R1bGVfbGlzdF9vLztzL1woW149XVwpICAqXFwvXDEubyBcXC9nJyAgPCAkYWdlbnRfbW9kdWxlX2xpc3RfY29kZSAgPiAkYWdlbnRfbW9kdWxlX2xpc3RfbwpzZWQgJ3MvXmFnZW50X21vZHVsZV9saXN0X2NvZGUvYWdlbnRfbW9kdWxlX2xpc3RfYy87cy9cKFtePV1cKSAgKlxcL1wxLmMgXFwvZycgIDwgJGFnZW50X21vZHVsZV9saXN0X2NvZGUgID4gJGFnZW50X21vZHVsZV9saXN0X2MKc2VkICdzL15hZ2VudF9tb2R1bGVfbGlzdF9jb2RlL2FnZW50X21vZHVsZV9saXN0X2xvLztzL1woW149XVwpICAqXFwvXDEubG8gXFwvZycgPCAkYWdlbnRfbW9kdWxlX2xpc3RfY29kZSAgPiAkYWdlbnRfbW9kdWxlX2xpc3RfbG8KCnNlZCAncy9eYWdlbnRfbW9kdWxlX2xpc3Rfby9hZ2VudGdyb3VwX2xpc3Rfby87c0BcKFteIAldKlwpXC5vQG1pYmdyb3VwL1wxLm9AZycgPCAkYWdlbnRfbW9kdWxlX2xpc3RfbyA+ICRhZ2VudGdyb3VwX2xpc3RfbwpzZWQgJ3MvXmFnZW50X21vZHVsZV9saXN0X2xvL2FnZW50Z3JvdXBfbGlzdF9sby87c0BcKFteIAldKlwpXC5sb0BtaWJncm91cC9cMS5sb0BnJyA8ICRhZ2VudF9tb2R1bGVfbGlzdF9sbyA+ICRhZ2VudGdyb3VwX2xpc3RfbG8KCmZvciBpIGluIG1vZHVsZV9saXN0X28gbW9kdWxlX2xpc3RfYyBtb2R1bGVfbGlzdF9sbyBtaWJfbW9kdWxlX2xpc3RfbyBtaWJfbW9kdWxlX2xpc3RfYyBtaWJfbW9kdWxlX2xpc3RfbG8gbWliZ3JvdXBfbGlzdF9vIG1pYmdyb3VwX2xpc3RfbG8gYWdlbnRfbW9kdWxlX2xpc3RfbyBhZ2VudF9tb2R1bGVfbGlzdF9jIGFnZW50X21vZHVsZV9saXN0X2xvIGFnZW50Z3JvdXBfbGlzdF9vIGFnZW50Z3JvdXBfbGlzdF9sbyA7IGRvCgkjIGhwdXggbWFrZSAoYXQgbGVhc3QpIGRvZXNuJ3QgbGlrZSBhIHRyYWlsaW5nIFwgb24gdGhlIGxhc3QKCSMgbGluZSBldmVuIHdoZW4gdGhlIG5leHQgbGluZSBjb250YWlucyBub3RoaW5nIGJ1dAoJIyB3aGl0ZXNwYWNlLgoJbGFzdHRva2VuPWB0YWlsIC0xIG1rLyRpLm1rIHwgYXdrICd7cHJpbnQgJDF9J2AKCXNlZCAicyMkbGFzdHRva2VuIFxcXFwjJGxhc3R0b2tlbiMiIDwgbWsvJGkubWsgPiBtay8kaS5tay50bXAKCW12IG1rLyRpLm1rLnRtcCBtay8kaS5tawoKCSMgYWRkIGEgY2xvc2luZyBjb21tZW50CgllY2hvICIiID4+IG1rLyRpLm1rCgllY2hvICIjIGVuZCBjb25maWd1cmUgZ2VuZXJhdGVkIGNvZGUiID4+IG1rLyRpLm1rCmRvbmUKCmNoYW5nZXF1b3RlKFssIF0pCgppZiB0ZXN0ICRtb2R1bGVfZGVidWcgLWVxIDE7IHRoZW4KICAgZWNobyAtZSAiXG5GaW5hbCBtb2R1bGUgbGlzdDogJG1vZHVsZV9saXN0X2NvZGUiCiAgIGV4aXQKZmkKaWYgdGVzdCAieCR3aXRoX21pYl9jZmdfY2hlY2tzIiA9ICJ4eWVzIjsgdGhlbgogIEFDX01TR19DQUNIRV9BREQoW0FnZW50IE1vZHVsZSBsaXN0OiAkbW9kdWxlX2xpc3RfY29kZV0pCmZpCkFDX1NVQlNUX0ZJTEUoTU9EVUxFX0xJU1QpCkFDX1NVQlNUX0ZJTEUobW9kdWxlX2xpc3RfYykKQUNfU1VCU1RfRklMRShtb2R1bGVfbGlzdF9vKQpBQ19TVUJTVF9GSUxFKG1vZHVsZV9saXN0X2xvKQpBQ19TVUJTVF9GSUxFKG1pYl9tb2R1bGVfbGlzdF9jKQpBQ19TVUJTVF9GSUxFKG1pYl9tb2R1bGVfbGlzdF9vKQpBQ19TVUJTVF9GSUxFKG1pYl9tb2R1bGVfbGlzdF9sbykKQUNfU1VCU1RfRklMRShhZ2VudF9tb2R1bGVfbGlzdF9jKQpBQ19TVUJTVF9GSUxFKGFnZW50X21vZHVsZV9saXN0X28pCkFDX1NVQlNUX0ZJTEUoYWdlbnRfbW9kdWxlX2xpc3RfbG8pCkFDX1NVQlNUX0ZJTEUobWliZ3JvdXBfbGlzdF9vKQpBQ19TVUJTVF9GSUxFKG1pYmdyb3VwX2xpc3RfbG8pCkFDX1NVQlNUX0ZJTEUoYWdlbnRncm91cF9saXN0X28pCkFDX1NVQlNUX0ZJTEUoYWdlbnRncm91cF9saXN0X2xvKQpBQ19TVUJTVF9GSUxFKGFnZW50X21vZHVsZV9saXN0KQoKI0FDX1NVQlNUX0ZJTEUobWliX21vZHVsZV9saXN0KQojQUNfU1VCU1QobW9kdWxlX2xpc3QpCkFDX1NVQlNUKGRlZmF1bHRfbWlic19pbnN0YWxsKQpBQ19TVUJTVChkbGxjbGVhbnMpCkFDX1NVQlNUX0ZJTEUobW9kdWxlX3J1bGVzKQpBQ19TVUJTVF9GSUxFKG1vZHVsZV9saXN0X2RlcHMpCkFDX1NVQlNUX0ZJTEUobWliX21vZHVsZV9saXN0X2RlcHMpCkFDX1NVQlNUX0ZJTEUoYWdlbnRfbW9kdWxlX2xpc3RfZGVwcykKCkFDX01TR19SRVNVTFQoLikKCmlmIHRlc3QgJG1vZHVsZV9kZWJ1ZyAtZXEgMTsgdGhlbgpBQ19NU0dfQ0FDSEVfQUREKEFnZW50IE1JQiBjb2RlOiAgICAgICAgICAgICRtb2R1bGVfbGlzdCkKZmkKQUNfTVNHX0NBQ0hFX0FERChBZ2VudCBNSUIgY29kZTogICAgICAgICAgICAkdG9wX2xldmVsX21vZHVsZXMpCgojIGVuZCBoYWlyeSBhZ2VudCBtb2R1bGUgcHJvY2Vzc2luZwoKQUNfTVNHX0NIRUNLSU5HKFtpZiBkaXJlY3RvcmllcyBuZWVkIHRvIGJlIGNyZWF0ZWRdKQpmb3IgaSBpbiAkbW9kdWxlX2RpcmVjdG9yaWVzOyBkbwogICRzcmNkaXIvbWtpbnN0YWxsZGlycyAkaQpkb25lCkFDX01TR19SRVNVTFQoLikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGVmaW5lIGRlZmF1bHQgbWlicwojCkFDX01TR19DSEVDS0lORyhbZGVmYXVsdCBtaWIgZmlsZXMgdG8gcmVhZF0pCmlmIHRlc3QgIngkTkVUU05NUF9ERUZBVUxUX01JQlMiID0gIngiOyB0aGVuCiAgTkVUU05NUF9ERUZBVUxUX01JQlM9IiRkZWZhdWx0X21pYnMiCmZpCmlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMiIgLW8gIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMm1zdmMiIC1vICJ4JFBBUlRJQUxUQVJHRVRPUyIgPSAieGN5Z3dpbiI7IHRoZW4KICAjIG1pbmd3MzIgYW5kIGN5Z3dpbiB1c2UgJzsnIGFzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXBhcmF0b3IgY2hhcgogIEVOVl9TRVBBUkFUT1I9IjsiCiAgTkVUU05NUF9ERUZBVUxUX01JQlM9YGVjaG8gIiRORVRTTk1QX0RFRkFVTFRfTUlCUyIgfCBzZWQgJ3MvOi87L2cnYAogIGRlZmF1bHRfbWlicz1gZWNobyAiJGRlZmF1bHRfbWlicyIgfCBzZWQgJ3MvOi87L2cnYAplbHNlCiAgRU5WX1NFUEFSQVRPUj0iOiIKZmkKQUNfU1VCU1QoRU5WX1NFUEFSQVRPUikKQUNfREVGSU5FX1VOUVVPVEVEKE5FVFNOTVBfREVGQVVMVF9NSUJTLCIkTkVUU05NUF9ERUZBVUxUX01JQlMiKQpBQ19TVUJTVChORVRTTk1QX0RFRkFVTFRfTUlCUykKQUNfTVNHX1JFU1VMVCgkTkVUU05NUF9ERUZBVUxUX01JQlMpCgpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgd2UgaGF2ZSB0byBidWlsZCBQSUMgY29kZV0pCmVjaG8gIiAkbW9kdWxlX2xpc3QgIiB8IGdyZXAgIiB1Y2Qtc25tcC9kbG1vZCAiID4vZGV2L251bGwKaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KICAgICAgICBMSUJfQ0ZMQUdTPSIkTElCX0NGTEFHUyAkU0hMSUJfQ0ZMQUdTIgoJQUNfTVNHX1JFU1VMVCh5ZXMpCmVsc2UKCURMTElCUz0iIgoJQUNfTVNHX1JFU1VMVChubykKZmkKCiMKIyBDaGVjayBmb3Iga2VybmVsIGxvY2F0aW9uCiMKCkFDX0NBQ0hFX0NIRUNLKGZvciBsb2NhdGlvbiBvZiBzeXN0ZW0ga2VybmVsLGFjX2N2X0tFUk5FTF9MT0MsClthY19jdl9LRVJORUxfTE9DPSJ1bmtub3duIgojIEZpcnN0IGRldGVybWluZSBpZiB0ZXN0IGV4cGVjdHMgYSAtZiBvciBhIC1jIChjaGFyYWN0ZXIgZGV2aWNlIChTWVNWKSkKCmlmIHRlc3QgLWMgL2Rldi9udWxsOyB0aGVuCiAgQ0ZMQUc9Ii1jIgplbGlmIHRlc3QgLWYgL2Rldi9udWxsOyB0aGVuCiAgQ0ZMQUc9Ii1mIgplbHNlCiAgIyBmYWxsIGJhY2sKICBDRkxBRz0iLWYiCmZpCmZvciBpIGluIC92bXVuaXggL2hwLXV4IC9zdGFuZC92bXVuaXggL2Rldi9rc3ltcyAva2VybmVsL3VuaXggL2tlcm5lbC9nZW51bml4IC9uZXRic2QgL3VuaXggL2tlcm5lbCAvYnNkIC9tYWNoX2tlcm5lbCAvYm9vdC9rZXJuZWwva2VybmVsCiAgZG8KICBpZiB0ZXN0IC1mICRpIC1vICRDRkxBRyAkaTsgdGhlbgogICAgYWNfY3ZfS0VSTkVMX0xPQz0iJGkiCiAgICBicmVhazsKICBmaQpkb25lCmlmIHRlc3QgJGkgPSAidW5rbm93biI7IHRoZW4KICBBQ19NU0dfV0FSTihbQ2FuJ3QgZmluZCBzeXN0ZW0ga2VybmVsLi4uICBTZXR0aW5nIHRvIC92bXVuaXhdKQogIGFjX2N2X0tFUk5FTF9MT0M9Ii92bXVuaXgiCmZpCl0pCgpBQ19ERUZJTkVfVU5RVU9URUQoS0VSTkVMX0xPQywiJGFjX2N2X0tFUk5FTF9MT0MiKQoKIwojIENoZWNrIGZvciBtb3VudCB0YWJsZSBsb2NhdGlvbgojCgpBQ19DQUNIRV9DSEVDSyhmb3IgbW91bnQgdGFibGUgbG9jYXRpb24sYWNfY3ZfRVRDX01OVFRBQiwKW2FjX2N2X0VUQ19NTlRUQUI9InVua25vd24iCmZvciBpIGluIC9ldGMvbW50dGFiIC9ldGMvbXRhYiAvZXRjL2ZpbGVzeXN0ZW1zIC9kZXYvbW50dGFiCiAgZG8KICBpZiB0ZXN0IC1mICRpIC1vIC1jICRpOyB0aGVuCiAgICBhY19jdl9FVENfTU5UVEFCPSIkaSIKICAgIGJyZWFrOwogIGZpCmRvbmUKXSkKCkFDX0RFRklORV9VTlFVT1RFRChFVENfTU5UVEFCLCIkYWNfY3ZfRVRDX01OVFRBQiIpCgojIENoZWNrIGZvciAvZGV2L2RtZW0gb3IgL2Rldi9kcnVtIGxvY2F0aW9uCkFDX0NBQ0hFX0NIRUNLKGZvciBsb2NhdGlvbiBvZiBzd2FwIGRldmljZSxhY19jdl9ETUVNX0xPQywKWwojIEZpcnN0IGRldGVybWluZSBpZiB0ZXN0IGV4cGVjdHMgYSAtZiBvciBhIC1jIChjaGFyYWN0ZXIgZGV2aWNlIChTWVNWKSkKCmlmIHRlc3QgLWYgL2Rldi9rbWVtOyB0aGVuCiAgQ1RFU1Q9InRlc3QgLWYiCmVsaWYgdGVzdCAtYyAvZGV2L2ttZW07IHRoZW4KICBDVEVTVD0idGVzdCAtYyIKZWxzZQogICMgZmFsbCBiYWNrCiAgQ1RFU1Q9InRlc3QgLWYiCmZpCgppZiAkQ1RFU1QgL2Rldi9kbWVtOyB0aGVuCiAgYWNfY3ZfRE1FTV9MT0M9Ii9kZXYvZG1lbSIKZWxpZiAkQ1RFU1QgL2Rldi9kcnVtOyB0aGVuCiAgYWNfY3ZfRE1FTV9MT0M9Ii9kZXYvZHJ1bSIKZWxzZQogIGFjX2N2X0RNRU1fTE9DPSJub25lIgpmaQpdKQoKaWYgdGVzdCAieCRhY19jdl9ETUVNX0xPQyIgIT0gInhub25lIjsgdGhlbgogIEFDX0RFRklORV9VTlFVT1RFRChETUVNX0xPQywiJGFjX2N2X0RNRU1fTE9DIikKZmkKCiMgZm9yY2VkIGVmZW5jZSB0dXJuZWQgb2ZmLgojIGlmIHRlc3QgIngkZGV2ZWxvcGVyIiA9ICJ4eWVzIiAtYSAieCR1c2VfZWZlbmNlIiAhPSAieG5vIjsgdGhlbgojICAgIHVzZV9lZmVuY2U9InllcyIKIyBmaQoKaWYgdGVzdCAieCR1c2VfZWZlbmNlIiA9ICJ4eWVzIjsgdGhlbgogICAgQUNfQ0hFQ0tfTElCKGVmZW5jZSwgRUZfRXhpdCkKZmkKCiMgQ2hlY2tzIGZvciBsaWJyYXJpZXMuCiMgQUNfQ0hFQ0tfTElCKGRlcywgbWFpbikKQUNfQ0hFQ0tfTElCKG0sIHJvdW5kKQpBQ19DSEVDS19MSUIobSwgZXhwKQoKQUNfQVJHX1dJVEgoZWxmLAoJW0FTX0hFTFBfU1RSSU5HKC0td2l0aG91dC1lbGYsW3VzZSBlbGYgbGlicmFyaWVzXSldLCwKCVtBQ19BUkdfRU5BQkxFKGVsZiwsCgkJW0FDX01TR19FUlJPUihbIEludmFsaWQgb3B0aW9uLiBVc2UgLS13aXRoLWVsZi8tLXdpdGhvdXQtZWxmIGluc3RlYWQgXSldKV0pCgppZiB0ZXN0ICJ4JHdpdGhfZWxmIiAhPSAieG5vIjsgdGhlbgojIG5saXN0IGlzIG5lZWRlZCBmb3IgdXB0aW1lIG9uIHNvbWUgc3l0ZW1zIGluIHRoZSBnZW5lcmljIGxpYnJhcnkKIyBhZGQgaG9zdHMgd2hpY2ggZG9uJ3QgdXNlIG5saXN0IHRvIHRoZSBibGFuayBmaXJzdCBsaW5lCmNhc2UgJHRhcmdldF9vcyBpbgoJbGludXgqKSA7OwoJaXJpeCopICMgQ2hlY2sgZm9yIG5saXN0IGluIG1sZCAoaXJpeCkKCQlBQ19DSEVDS19MSUIoZWxmLCBubGlzdCkKCQlBQ19DSEVDS19MSUIoZWxmLCBubGlzdDY0KQoJCUFDX0NIRUNLX0xJQihtbGQsIG5saXN0KQoJCTs7CgkqKSAjIGRlZmF1bHQKCQlBQ19DSEVDS19MSUIoZWxmLCBubGlzdCkKCQk7Owplc2FjCmZpCiAKCiMgT24gc29tZSBwbGF0Zm9ybXMgKElyaXgpIGxpYm5zbCBhbmQgbGlic29ja2V0IHNob3VsZCBub3QgYmUgdXNlZC4KQUNfQ0hFQ0tfRlVOQyhnZXRob3N0YnluYW1lLCBBQ19ERUZJTkUoSEFWRV9HRVRIT1NUQllOQU1FKSwKCUFDX0NIRUNLX0xJQihuc2wsIGdldGhvc3RieW5hbWUsIEFDX0RFRklORShIQVZFX0dFVEhPU1RCWU5BTUUpCglMSUJTPSIke0xJQlN9IC1sbnNsIikpCgojIFNDTyBVbml4d2FyZSA3LjEuNCBmaW5kcyBnZXRob3N0YnluYW1lKCkgaW4gLWxzb2NrZXQKQUNfQ0hFQ0tfRlVOQyhnZXRob3N0YnluYW1lLCBBQ19ERUZJTkUoSEFWRV9HRVRIT1NUQllOQU1FKSwKCUFDX0NIRUNLX0xJQihzb2NrZXQsIGdldGhvc3RieW5hbWUsIEFDX0RFRklORShIQVZFX0dFVEhPU1RCWU5BTUUpCglMSUJTPSIke0xJQlN9IC1sc29ja2V0IikpCgojIFNvbGFyaXMga3N0YXQKQUNfQ0hFQ0tfTElCKGtzdGF0LCBrc3RhdF9sb29rdXAsCiAgICAgICAgQUNfREVGSU5FKEhBVkVfTElCS1NUQVQsIDEsIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGtzdGF0JyBsaWJyYXJ5ICgtbGtzdGF0KS5dKQogICAgICAgIExORVRTTk1QTElCUz0iJHtMTkVUU05NUExJQlN9IC1sa3N0YXQiKQoKIyBDaGVjayBmb3IgbGlicmFyaWVzIHRoYXQgdGhlIGFnZW50IG5lZWRzCiMgc2F2aW5nIG9sZCBsaWJyYXJpZXMKTk9OQUdFTlRMSUJTPSRMSUJTCgojIENoZWNrIGZvciBzZWN1cml0eSByZWxhdGVkIGZ1bmN0aW9ucwppZiB0ZXN0ICJ4JHRyeW9wZW5zc2wiICE9ICJ4bm8iOyB0aGVuCiAgICBpZiB0ZXN0ICJ4JGFza2Vkb3BlbnNzbCIgIT0gInh5ZXMiIC1hICJ4JGFza2VkcGtjcyIgPSAieHllcyI7IHRoZW4KICAgICAgQUNfQ0hFQ0tfTElCKHBrY3MxMSwgQ19Jbml0aWFsaXplLCBBQ19ERUZJTkUoSEFWRV9MSUJQS0NTMTEsIDEsIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBrY3MxMScgbGlicmFyeSAoLWxwa2NzMTEpLl0pCiAgICAgICAgICAgICAgTElCUEtDUzExPSItbHBrY3MxMSIpCiAgICBlbHNlIAogICAgICBpZiB0ZXN0ICJ4JHRyeXJzYXJlZiIgIT0gInhubyI7IHRoZW4KICAgICAgICAgQUNfQ0hFQ0tfTElCKHJzYXJlZiwgUlNBUHJpdmF0ZURlY3J5cHQpCiAgICAgICAgIEFDX0NIRUNLX0xJQihSU0FnbHVlLCBSU0FfUEtDUzFfUlNBcmVmKQogICAgICBmaQoKICAgICAgQUNfQ0hFQ0tfTElCKGNyeXB0bywgRVZQX21kNSwgQUNfREVGSU5FKEhBVkVfTElCQ1JZUFRPLCAxLCBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjcnlwdG8nIGxpYnJhcnkgKC1sY3J5cHRvKS5dKQogICAgICAgICAgICAgIExJQkNSWVBUTz0iLWxjcnlwdG8iKQogICAgICBBQ19DSEVDS19MSUIoY3J5cHRvLCBBRVNfY2ZiMTI4X2VuY3J5cHQsIAogICAgICAgICAgICAgIEFDX0RFRklORShIQVZFX0FFU19DRkIxMjhfRU5DUllQVCwgMSwgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgQUVTX2NmYjEyOF9lbmNyeXB0JyBmdW5jdGlvbi5dKSkKICAgICAgQUNfQ0hFQ0tfTElCKGNyeXB0bywgRVZQX01EX0NUWF9jcmVhdGUsCiAgICAgICAgICBBQ19ERUZJTkUoW0hBVkVfRVZQX01EX0NUWF9DUkVBVEVdLCBbXSwKICAgICAgICAgICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBFVlBfTURfQ1RYX2NyZWF0ZScgZnVuY3Rpb24uXSkKICAgICAgICAgIEFDX0RFRklORShbSEFWRV9FVlBfTURfQ1RYX0RFU1RST1ldLCBbXSwKICAgICAgICAgICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBFVlBfTURfQ1RYX2Rlc3Ryb3knIGZ1bmN0aW9uLl0pKQogICAgZmkKZWxpZiB0ZXN0ICJ4JGFza2VkcGtjcyIgPSAieHllcyI7IHRoZW4KICAgIEFDX0NIRUNLX0xJQihwa2NzMTEsIENfSW5pdGlhbGl6ZSwgQUNfREVGSU5FKEhBVkVfTElCUEtDUzExKQogICAgICAgICAgICBMSUJQS0NTMTE9Ii1scGtjczExIikKZmkKCkxJQlM9JE5PTkFHRU5UTElCUwoKIyBjaGVjayBmb3IgdGNwIHdyYXBwZXIgc3VwcG9ydApfY3BwZmxhZ3M9IiR7Q1BQRkxBR1N9IgpfbGRmbGFncz0iJHtMREZMQUdTfSIKCkFDX0FSR19XSVRIKGxpYndyYXAsClsgIC0td2l0aC1saWJ3cmFwWz1MSUJQQVRIXSAgQ29tcGlsZSBpbiBsaWJ3cmFwICh0Y3Bfd3JhcHBlcnMpIHN1cHBvcnQuXSxbCiAgaWYgdGVzdCAiJHdpdGhfbGlid3JhcCIgIT0gIm5vIjsgdGhlbgogICAgaWYgdGVzdCAiJHdpdGhfbGlid3JhcCIgIT0gInllcyI7IHRoZW4KICAgICAgQ1BQRkxBR1M9IiR7Q1BQRkxBR1N9IC1JJHdpdGhfbGlid3JhcC9pbmNsdWRlIgogICAgICBMREZMQUdTPSIke0xERkxBR1N9IC1MJHdpdGhfbGlid3JhcC9saWIiCiAgICBmaQoKICAgIF9saWJzPSR7TElCU30KICAgIEFDX0NIRUNLX0hFQURFUih0Y3BkLmgsICwKCSAgICBBQ19NU0dfRVJST1IoW0Fza2VkIHRvIHVzZSBsaWJ3cmFwIGJ1dCBJIGNvdWxkbid0IGZpbmQgdGNwZC5oLl0pKQoKICAgIExJQlM9IiRMSUJTIC1sd3JhcCIKCUFDX01TR19DSEVDS0lORyhbZm9yIFRDUCB3cmFwcGVycyBsaWJyYXJ5IC1sd3JhcF0pCgkjIFhYWDogc2hvdWxkIGNoZWNrIGZvciBob3N0c19jdGwKCUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgkJICAgICAjaW5jbHVkZSA8dGNwZC5oPgoJCSAgICAgaW50IGFsbG93X3NldmVyaXR5ID0gMDsKCQkgICAgIGludCBkZW55X3NldmVyaXR5ICA9IDA7CgkJICAgIF0sW2hvc3RzX2FjY2Vzcygodm9pZCAqKTApXSxbCgoJICAgIEFDX01TR19SRVNVTFQoW3llc10pCgkgICAgQUNfREVGSU5FKE5FVFNOTVBfVVNFX0xJQldSQVApCgkgICAgdGVzdCAiJHdpdGhfbGlid3JhcCIgIT0gbm8gLWEgIiR3aXRoX2xpYndyYXAiICE9IHllcyAmJiBfd3JhcGxpYnM9Ii1MJHdpdGhfbGlid3JhcC9saWIiCgkgICAgX3dyYXBsaWJzPSIkX3dyYXBsaWJzIC1sd3JhcCJdLAogICAgICAgIFsKCSAgICBBQ19NU0dfUkVTVUxUKFtub10pCgkgICAgIyBMaW51eCBSZWRIYXQgNi4xIHdvbid0IGxpbmsgbGlid3JhcCB3aXRob3V0IGxpYm5zbAoJICAgIEFDX0NIRUNLX0ZVTkMoeXBfZ2V0X2RlZmF1bHRfZG9tYWluLCAsCgkJQUNfQ0hFQ0tfTElCKG5zbCwgeXBfZ2V0X2RlZmF1bHRfZG9tYWluKSkKCSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBUQ1Agd3JhcHBlcnMgbGlicmFyeSAtbHdyYXAgbGlua2VkIHdpdGggLWxuc2xdKQoJICAgIEFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgkJICAgICAgICAgI2luY2x1ZGUgPHRjcGQuaD4KCQkgICAgICAgICBpbnQgYWxsb3dfc2V2ZXJpdHkgPSAwOwoJICAgICAgICAgICAgICAgICBpbnQgZGVueV9zZXZlcml0eSAgPSAwOwoJIAkJXSxbaG9zdHNfYWNjZXNzKCh2b2lkICopMCldLAoKCQkJQUNfTVNHX1JFU1VMVCh5ZXMpCgkJCUFDX0RFRklORShORVRTTk1QX1VTRV9MSUJXUkFQKQoJCQl0ZXN0ICIkd2l0aF9saWJ3cmFwIiAhPSBubyAtYSAiJHdpdGhfbGlid3JhcCIgIT0geWVzICYmIF93cmFwbGlicz0iLUwkd2l0aF9saWJ3cmFwL2xpYiIKCQkJX3dyYXBsaWJzPSIkX3dyYXBsaWJzIC1sd3JhcCAtbG5zbCIsCgoJCQlBQ19NU0dfUkVTVUxUKG5vKQoJCQlBQ19NU0dfRVJST1IoQXNrZWQgdG8gdXNlIGxpYndyYXAgYnV0IEkgY291bGRuJ3QgZmluZCBpdC4pKV0pCiAgICBMQUdFTlRMSUJTPSIkX3dyYXBsaWJzIgogICAgQ1BQRkxBR1M9JHtfY3BwZmxhZ3N9CiAgICBMREZMQUdTPSR7X2xkZmxhZ3N9CiAgICBMSUJTPSR7X2xpYnN9CiAgZmkKXSkKCkFDX0NIRUNLX0hFQURFUlMocnBtL3JwbWxpYi5oIHJwbS9oZWFkZXIuaCkKCkFDX0NIRUNLX0hFQURFUihycG0vcnBtbGliLmgscnBtbGliX2g9eWVzLHJwbWxpYl9oPW5vKQpBQ19DSEVDS19IRUFERVIocnBtL2hlYWRlci5oLHJwbWhlYWRlcl9oPXllcyxycG1oZWFkZXJfaD1ubykKCmlmIHRlc3QgIngkcnBtaGVhZGVyX2giID0gInhubyIgLW8gIngkcnBtbGliX2giID0gInhubyIgOyB0aGVuCiAgaWYgdGVzdCAieCR3aXRoX3JwbSIgPSAieHllcyIgOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIGVpdGhlciB0aGUgUlBNIGhlYWRlciBmaWxlcyBuZWVkZWQgYW5kIHdhcyBzcGVjaWZpY2FsbHkgYXNrZWQgdG8gdXNlIFJQTSBzdXBwb3J0XSkKICBlbHNlCiAgICB3aXRoX3JwbT1ubwogIGZpCmZpCgojCiMgcnBtIGxpYnJhcmllcyBvbmx5IG5lZWRlZCBmb3IgdGhlIGhvc3QgcmVzb3VyY2VzIG1pYiBzb2Z0d2FyZQojIGluc3RhbGxlZCB0YWJsZXMgKG9uIGxpbnV4IGluIHBhcnRpY3VsYXIpCiMKaWYgdGVzdCAieCR3aXRoX3JwbSIgIT0gInhubyIgJiYgXAogICAgICAgIGVjaG8gIiAkbW9kdWxlX2xpc3QgIiB8IGdyZXAgIiBob3N0L2hyX3N3aW5zdCAiID4gL2Rldi9udWxsOyB0aGVuCiAgIyBBUkcuICBSUE0gaXMgYSByZWFsIHBhaW4uCiAgIyBGV0lXIGxpYnJwbS5sYSwgbGlicnBtaW8ubGEsIGFuZCBsaWJwb3B0LmxhIGhhdmUgY29ycmVjdCBkZXBlbmRlbmNpZXMuCiAgX3JwbWxpYnM9IiIKCiAgIyBycG0tNC4wLnggbmVlZHMgcnBtaW8uCiAgQUNfQ0hFQ0tfTElCKHJwbWlvLCBycG1HZXRQYXRoLCBbX3JwbWxpYnM9Ii1scnBtaW8gJF9ycG1saWJzIl0sLCRfcnBtbGlicykKICAKICAjIG5vdyBjaGVjayBmb3IgcnBtIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBsaWJyYXJpZXMuCiAgQUNfQ0hFQ0tfTElCKHJwbSwgcnBtR2V0RmlsZXN5c3RlbUxpc3QsWwogICAgQUNfREVGSU5FKEhBVkVfTElCUlBNKQogICAgTE1JQkxJQlM9Ii1scnBtICRfcnBtbGlicyAkTE1JQkxJQlMiCiAgICBDRkxBR1M9IiRDRkxBR1MgLUkvdXNyL2luY2x1ZGUvcnBtIgogIF0sWwogICAgIyBycG0tNC4wLjMgbGlicnBtZGIgYWN0dWFsbHkgY29udGFpbnMgd2hhdCB3ZSBuZWVkLgogICAgQUNfQ0hFQ0tfTElCKHJwbWRiLCBycG1kYk9wZW4sWwogICAgICBBQ19ERUZJTkUoSEFWRV9MSUJSUE0pCiAgICAgIExNSUJMSUJTPSItbHJwbWRiIC1scnBtICRfcnBtbGlicyAkTE1JQkxJQlMiCiAgICAgIENGTEFHUz0iJENGTEFHUyAtSS91c3IvaW5jbHVkZS9ycG0iCiAgICBdLCwtbHJwbSAkX3JwbWxpYnMpCiAgXSkKCiAgIyBycG0gNC42IGhhcyBpbmNvbXBhdGlibGUgQVBJLCB0dXJuIG9uIHRoZSBsZWdhY3kgb25lCiAgQUNfQ0hFQ0tfREVDTChbaGVhZGVyR2V0RW50cnldLAogICAgOiAsCiAgICBBQ19ERUZJTkUoW19SUE1fNF80X0NPTVBBVF0sIFtdLCBbRGVmaW5lIGlmIHlvdSBoYXZlIFJQTSA0LjYgb3IgbmV3ZXIgdG8gdHVybiBvbiBsZWdhY3kgQVBJXSksCiAgICBbWyNpbmNsdWRlIDxycG0vcnBtbGliLmg+XV0KICApCmZpCgojIGxpYmt2bQpBQ19DSEVDS19MSUIoa3ZtLCBrdm1fcmVhZCwgW19saWJrdm09Ii1sa3ZtIl0pCkFDX0NIRUNLX0ZVTkMoa3ZtX29wZW5maWxlcywgQUNfREVGSU5FKEhBVkVfS1ZNX09QRU5GSUxFUywgMSwgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBga3ZtX29wZW5maWxlcycgZnVuY3Rpb24uXSksCglBQ19DSEVDS19MSUIoa3ZtLCBrdm1fb3BlbmZpbGVzLCBBQ19ERUZJTkUoSEFWRV9LVk1fT1BFTkZJTEVTLCAxLCBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBrdm1fb3BlbmZpbGVzJyBmdW5jdGlvbi5dKQoJX2xpYmt2bT0iLWxrdm0iKSkKQUNfQ0hFQ0tfRlVOQyhrdm1fZ2V0cHJvY3MsIEFDX0RFRklORShIQVZFX0tWTV9HRVRQUk9DUywgMSwgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBga3ZtX2dldHByb2NzJyBmdW5jdGlvbi5dKSwKCUFDX0NIRUNLX0xJQihrdm0sIGt2bV9nZXRwcm9jcywgQUNfREVGSU5FKEhBVkVfS1ZNX0dFVFBST0NTLCAxLCBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBrdm1fZ2V0cHJvY3MnIGZ1bmN0aW9uLl0pCglfbGlia3ZtPSItbGt2bSIpKQpBQ19DSEVDS19GVU5DKGt2bV9nZXRzd2FwaW5mbywgQUNfREVGSU5FKEhBVkVfS1ZNX0dFVFNXQVBJTkZPLCAxLCBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBrdm1fZ2V0c3dhcGluZm8nIGZ1bmN0aW9uLl0pLAoJQUNfQ0hFQ0tfTElCKGt2bSwga3ZtX2dldHN3YXBpbmZvLCBBQ19ERUZJTkUoSEFWRV9LVk1fR0VUU1dBUElORk8sIDEsIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGt2bV9nZXRzd2FwaW5mbycgZnVuY3Rpb24uXSkKCV9saWJrdm09Ii1sa3ZtIikpCmlmIHRlc3QgIngke19saWJrdm19IiAhPSAieCI7IHRoZW4KCUFDX0RFRklORShIQVZFX0xJQktWTSwgMSwgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBga3ZtJyBsaWJyYXJ5ICgtbGt2bSkuXSkKCUxBR0VOVExJQlM9IiRMQUdFTlRMSUJTICR7X2xpYmt2bX0iCmZpCgojIERZTkFNSUMgTU9EVUxFIFNVUFBPUlQKQUNfQ0hFQ0tfRlVOQyhkbG9wZW4sIEFDX0RFRklORShIQVZFX0RMT1BFTiwgMSwgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGxvcGVuJyBmdW5jdGlvbi5dKSwKCUFDX0NIRUNLX0xJQihkbCwgZGxvcGVuLCBBQ19ERUZJTkUoSEFWRV9ETE9QRU4sIDEsIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGRsb3BlbicgZnVuY3Rpb24uXSkKCUFDX0RFRklORShIQVZFX0xJQkRMLCAxLCBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkbCcgbGlicmFyeSAoLWxkbCkuXSkKCUxNSUJMSUJTPSIke0xNSUJMSUJTfSAtbGRsIikpCgojIG5saXN0CkFDX0NIRUNLX0ZVTkNTKG5saXN0IG5saXN0NjQga25saXN0KQoKIyB3aGV0aGVyIHdlIG5lZWQgLWxkZXZzdGF0IGZvciBkaXNraW8gTUlCCmVjaG8gIiAkbW9kdWxlX2xpc3QgIiB8IGdyZXAgIiB1Y2Qtc25tcC9kaXNraW8gIiA+L2Rldi9udWxsCmlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCglBQ19DSEVDS19GVU5DKGdldGRldnMsIEFDX0RFRklORShIQVZFX0dFVERFVlMpLAoJCUFDX0NIRUNLX0xJQihkZXZzdGF0LCBnZXRkZXZzLCBBQ19ERUZJTkUoSEFWRV9HRVRERVZTKQoJCUxNSUJMSUJTPSIke0xNSUJMSUJTfSAtbGRldnN0YXQiKSkKCUFDX0NIRUNLX0ZVTkMoZ2V0ZGV2cywgQUNfREVGSU5FKEhBVkVfREVWU1RBVF9HRVRERVZTKSwKCQlBQ19DSEVDS19MSUIoZGV2c3RhdCwgZGV2c3RhdF9nZXRkZXZzLCBBQ19ERUZJTkUoSEFWRV9ERVZTVEFUX0dFVERFVlMpCgkJTE1JQkxJQlM9IiR7TE1JQkxJQlN9IC1sZGV2c3RhdCIpKQpmaQoKIyBMTS1TRU5TT1JTLU1JQiBzdXBwb3J0CmVjaG8gIiAkbW9kdWxlX2xpc3QgIiB8IGdyZXAgIiB1Y2Qtc25tcC9sbVNlbnNvcnMgIiA+IC9kZXYvbnVsbAppZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgogICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHNlbnNvcnMgc3VwcG9ydF0pCiAgICAgICAgY2FzZSAkdGFyZ2V0X29zIGluCiAgICAgICAgICBzb2xhcmlzKikKICAgICAgICAgICAgQUNfQ0hFQ0tfSEVBREVSKHBpY2wuaCwgTE1JQkxJQlM9IiR7TE1JQkxJQlN9IC1scGljbCIsKQogICAgICAgICAgICBBQ19DSEVDS19IRUFERVJTKHBpY2wuaCkKICAgICAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgICBBQ19DSEVDS19IRUFERVIoc2Vuc29ycy9zZW5zb3JzLmgsLAogICAgICAgICAgICAgICAgW0FDX01TR19FUlJPUihbYXNrZWQgdG8gdXNlIGxtX3NlbnNvcnMgYnV0IEkgY291bGRuJ3QgZmluZCBzZW5zb3JzL3NlbnNvcnMuaF0pXSkKICAgICAgICAgICAgQUNfQ0hFQ0tfTElCKHNlbnNvcnMsIHNlbnNvcnNfZ2V0X2RldGVjdGVkX2NoaXBzLCBbCgkJICAgTE1JQkxJQlM9IiR7TE1JQkxJQlN9IC1sc2Vuc29ycyIgOwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW2Fza2VkIHRvIHVzZSBsbV9zZW5zb3JzIGJ1dCBJIGNvdWxkbid0IGZpbmQgLWxzZW5zb3JzXSldKQogICAgICAgICAgICA7OwogICAgICAgIGVzYWMKZmkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBQRVJMIFNVUFBPUlQKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIwojIHRlc3QgdG8gc2VlIGlmIHdlIGNhbiBhdHRlbXB0IHRvIGJ1aWxkIGVtYmVkZGVkIFBlcmwgc28gZmFyCiMKaWYgdGVzdCAieCRlbWJlZF9wZXJsIiA9ICJ4dHJ5IiA7IHRoZW4KICBpZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgPSAieG5vIiA7IHRoZW4KICAgIGluc3RhbGxfcGVybD0idHJ5IgogIGZpCiAgaWYgdGVzdCAieCRhY19jdl9wYXRoX1BFUkxQUk9HIiA9ICJ4IiAtbyAieCRhY19jdl9wYXRoX1BFUkxQUk9HIiA9ICJ4bm8iIDsgdGhlbgogICAgaW5zdGFsbF9wZXJsPSJubyIKICAgIGVtYmVkX3Blcmw9Im5vIgogIGZpCmZpCgoKIwojIEVtYmVkZGVkIFBlcmwgc3BlY2lmaWMgc3R1ZmYKIwoKIyB0ZXN0IHBlcmwgcHJvZwppZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgIT0gInhubyIgOyB0aGVuCiAgICBteXBlcmw9JGFjX2N2X3BhdGhfUEVSTFBST0cKICAgIGlmIHRlc3QgJG15cGVybCA9ICJubyIgOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkaW5zdGFsbF9wZXJsIiA9ICJ4dHJ5IiA7IHRoZW4KICAgICAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICBlbHNlCiAgICAgICAgQUNfTVNHX0VSUk9SKC0tZW5hYmxlLWVtYmVkZGVkLXBlcmwgcmVxdWVzdGVkIGJ1dCBubyBwZXJsIGV4ZWN1dGFibGUgZm91bmQpCiAgICAgIGZpCiAgICBmaQpmaQoKIyB0ZXN0IGZvciBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQKaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogICAgIyBlbWJlZGRlZCBQZXJsIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJpZXMKICAgIGlmIHRlc3QgIngkZW5hYmxlX3NoYXJlZCIgIT0gInh5ZXMiOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkaW5zdGFsbF9wZXJsIiA9ICJ4dHJ5IiA7IHRoZW4KICAgICAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICBlbHNlCiAgICAgICAgQUNfTVNHX0VSUk9SKFBlcmwgc3VwcG9ydCByZXF1aXJlcyAtLWVuYWJsZS1zaGFyZWQpCiAgICAgIGZpCiAgICBmaQpmaQoKaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogIEFDX01TR19DSEVDS0lORyhbaWYgd2UgYXJlIGluIHRoZSBzb3VyY2UgdHJlZSBzbyB3ZSBjYW4gaW5zdGFsbCBQZXJsIG1vZHVsZXNdKQogIGlmIHRlc3QgIngkc3JjZGlyIiA9ICJ4LiIgLW8gLWQgcGVybC9hZ2VudC9kZWZhdWx0X3N0b3JlIDsgdGhlbgogICAgQUNfTVNHX1JFU1VMVChbWWVzXSkKICBlbHNlCiAgICBpZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgPSAieHRyeSIgOyB0aGVuCiAgICAgIGluc3RhbGxfcGVybD0ibm8iCiAgICAgIEFDX01TR19SRVNVTFQoW05vXSkKICAgIGVsc2UKICAgICAgQUNfTVNHX0VSUk9SKFtQZXJsIG1vZHVsZXMgY2FuIG5vdCBiZSBidWlsdCBvdXRzaWRlIHRoZSBzb3VyY2UgZGlyZWN0b3J5XSkKICAgIGZpCiAgZmkKZmkgICAgICAKCiMgY2hlY2sgdGhlIFBlcmwgY29tcGlsZXIgbmFtZQppZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgIT0gInhubyIgOyB0aGVuCiAgICAjCiAgICAjIFBlcmwgY2MgY2hlY2tzCiAgICAjCiAgICBpZiB0ZXN0ICJ4ZW5hYmxlX3BlcmxfY2NfY2hlY2tzIiAhPSAieG5vIiA7IHRoZW4KICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgUGVybCBjY10pCiAgICAgIGNoYW5nZXF1b3RlKCwgKQogICAgICBQRVJMQ0M9YCRteXBlcmwgLVY6Y2MgfCAkbXlwZXJsIC1uIC1lICdwcmludCBpZiAocy9eXHMqY2M9LihbLT1cd1xzXC9dKykuO1xzKi8kMS8pOydgCiAgICAgIGNoYW5nZXF1b3RlKFssIF0pCiAgICAgIGlmIHRlc3QgIngkUEVSTENDIiAhPSAieCIgOyB0aGVuCiAgICAgICAgQUNfTVNHX1JFU1VMVChbJFBFUkxDQ10pCiAgICAgIGVsc2UKICAgICAgICBpZiB0ZXN0ICJ4JGluc3RhbGxfcGVybCIgPSAieHRyeSIgOyB0aGVuCiAgICAgICAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICAgIGVsc2UKICAgICAgICAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGRldGVybWluZSB0aGUgY29tcGlsZXIgdGhhdCB3YXMgdXNlZCB0byBidWlsZCAkbXlwZXJsLiBFaXRoZXIgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQRVJMUFJPRyB0byBhIGRpZmZlcmVudCBwZXJsIGJpbmFyeSBvciB1c2UgLS13aXRob3V0LXBlcmwtbW9kdWxlcyB0byBidWlsZCB3aXRob3V0IFBlcmwuXSkKICAgICAgICBmaQogICAgICBmaQpmaQoKIyBjaGVjayB0aGUgUGVybCBjb21waWxlciBjb21wYXRpYmlsaXR5CmlmIHRlc3QgIngkaW5zdGFsbF9wZXJsIiAhPSAieG5vIiA7IHRoZW4KICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICRQRVJMQ0MgaXMgYSBHTlUgQyBjb21waWxlcl0pCiAgICAgIE9MRENDPSRDQwogICAgICBDQz0iJFBFUkxDQyIKICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwgW1sKI2lmbmRlZiBfX0dOVUNfXwogIGNob2tlIG1lCiNlbmRpZgogICAgICBdXSldLCBbcGVybGNjX2lzX2dudT15ZXNdLCBbcGVybGNjX2lzX2dudT1ub10pCiAgICAgIEFDX01TR19SRVNVTFQoWyRwZXJsY2NfaXNfZ251XSkKICAgICAgQ0M9JE9MRENDCiAgICAgIGlmIHRlc3QgIngkR0NDIiA9ICJ4eWVzIiAtYSAieCRwZXJsY2NfaXNfZ251IiA9ICJ4bm8iIDsgdGhlbgogICAgICAJaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInh0cnkiIDsgdGhlbgogICAgICAJICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICAJZWxzZQogICAgICAJICBBQ19NU0dfRVJST1IoW1RoaXMgYnVpbGQgaXMgdXNpbmcgYSBHTlUgQyBjb21waWxlciAoJENDKSB3aGlsZSBQZXJsIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGggYSBub24tR05VIChvciBub24td29ya2luZykgY29tcGlsZXIgKCRQRVJMQ0MpLiBUaGlzIGxpa2VseSB3b24ndCB3b3JrIGZvciBidWlsZGluZyB3aXRoIFBlcmwgc3VwcG9ydC4gRWl0aGVyIHNwZWNpZnkgYSBkaWZmZXJlbnQgY29tcGlsZXIgKC0td2l0aC1jYz1QQVRIKSwgZGlzYWJsZSB0aGlzIGNoZWNrICgtLWRpc2FibGUtcGVybC1jYy1jaGVja3MpIG9yIGJ1aWxkIHdpdGhvdXQgUGVybCAoLS13aXRob3V0LXBlcmwtbW9kdWxlcykuXSkKICAgICAgCWZpCiAgICAgIGZpCmZpCgojIGNoZWNrIGlmIHRoZXkncmUgYm90aCBnbnUKaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogICAgICBpZiB0ZXN0ICJ4JEdDQyIgIT0gInh5ZXMiIC1hICJ4JHBlcmxjY19pc19nbnUiID0gInh5ZXMiIDsgdGhlbgogICAgICAJaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInh0cnkiIDsgdGhlbgogICAgICAJICBpbnN0YWxsX3Blcmw9Im5vIgogICAgICAJZWxzZQogICAgICAgICAgQUNfTVNHX0VSUk9SKFtUaGlzIGJ1aWxkIGlzIHVzaW5nIGEgbm9uLUdOVSBDIGNvbXBpbGVyICgkQ0MpIHdoaWxlIFBlcmwgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciAoJFBFUkxDQykuIFRoaXMgbGlrZWx5IHdvbid0IHdvcmsgZm9yIGJ1aWxkaW5nIHdpdGggUGVybCBzdXBwb3J0LiBFaXRoZXIgc3BlY2lmeSBhIGRpZmZlcmVudCBjb21waWxlciAoLS13aXRoLWNjPVBBVEgpLCBkaXNhYmxlIHRoaXMgY2hlY2sgKC0tZGlzYWJsZS1wZXJsLWNjLWNoZWNrcykgb3IgYnVpbGQgd2l0aG91dCBQZXJsICgtLXdpdGhvdXQtcGVybC1tb2R1bGVzKS5dKQogICAgICAJZmkKICAgICAgZmkKZmkKCiMgd2UgaGF2ZSBlbm91Z2ggc3VwcG9ydCBmb3IgaW5zdGFsbGluZyB0aGUgbW9kdWxlcyBhdCBsZWFzdC4KaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInh0cnkiIDsgdGhlbgogIGluc3RhbGxfcGVybD0ieWVzIgplbHNlCiAgaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInhubyIgOyB0aGVuCiAgICBpbnN0YWxsX3Blcmw9Im5vIgogICAgZW1iZWRfcGVybD0ibm8iCiAgZmkKZmkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgb24gdG8gZW1iZWRkaW5nLi4uCgojIGNoZWNrIHRoZSBjb21waWxlciBmbGFncyBmb3IgaWxsZWdhbCB0b2tlbnMKY2FzZSAkdGFyZ2V0X29zIGluCiAgICBzb2xhcmlzKikKICAgICAgaWYgdGVzdCAieCRlbWJlZF9wZXJsIiAhPSAieG5vIiA7IHRoZW4KICAgICAgICAgICMKICAgICAgICAgICMgUGVybCBjYyBjaGVja3MKICAgICAgICAgICMKICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHByb2JsZW1hdGljIFBlcmwgY2MgZmxhZ3Mgb24gU3Vuc10pCiAgICAgICAgICBpZiAkbXlwZXJsIC1WOmNjZmxhZ3MgfCBncmVwIExBUkdFRklMRSA+IC9kZXYvbnVsbCA7IHRoZW4KICAgICAgICAgICAgaWYgdGVzdCAieCRlbWJlZF9wZXJsIiA9ICJ4dHJ5IiA7IHRoZW4KICAgICAgICAgICAgICBlbWJlZF9wZXJsPSJubyIKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIEFDX01TR19FUlJPUihbUGVybCB3YXMgY29tcGlsZWQgd2l0aCBMQVJHRUZJTEUgc3VwcG9ydCB3aGljaCB3aWxsIGJyZWFrIE5ldC1TTk1QLiBFaXRoZXIgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQRVJMUFJPRyB0byBhIGRpZmZlcmVudCBwZXJsIGJpbmFyeSBvciB1c2UgLS1kaXNhYmxlLWVtYmVkZGVkLXBlcmwgdG8gdHVybiBvZmYgZW1iZWRkZWQgUGVybCBmdW5jdGlvbmFsaXR5IGFsdG9nZXRoZXIuXSkKICAgICAgICAgICAgZmkKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9uZSBrbm93bl0pCiAgICAgICAgICBmaQogICAgICBmaQogICAgOzsKCiAgICAqKQogICAgOzsKZXNhYwoKCiMgY2hlY2sgdGhlIGNmbGFncwppZiB0ZXN0ICJ4JGVtYmVkX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgUGVybCBDRkxBR1NdKQogICAgcGVybGNmbGFncz1gJG15cGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBjY29wdHNgCiAgICBpZiB0ZXN0ICJ4JHBlcmxjZmxhZ3MiICE9ICJ4IiA7IHRoZW4KICAgICAgQUNfTVNHX1JFU1VMVChbJHBlcmxjZmxhZ3NdKQogICAgICBDRkxBR1M9IiRDRkxBR1MgJHBlcmxjZmxhZ3MiCiAgICBlbHNlCiAgICAgIGlmIHRlc3QgIngkZW1iZWRfcGVybCIgPSAieHRyeSIgOyB0aGVuCiAgICAgICAgZW1iZWRfcGVybD0ibm8iCiAgICAgIGVsc2UKICAgICAgICBBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIEMgY29tcGlsZXIgZmxhZ3MgdGhhdCB3ZXJlIHVzZWQgdG8gYnVpbGQgJG15cGVybC4gRWl0aGVyIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUEVSTFBST0cgdG8gYSBkaWZmZXJlbnQgUGVybCBiaW5hcnkgb3IgdXNlIC0tZGlzYWJsZS1lbWJlZGRlZC1wZXJsIHRvIHR1cm4gb2ZmIGVtYmVkZGVkIFBlcmwgZnVuY3Rpb25hbGl0eSBhbHRvZ2V0aGVyLl0pCiAgICAgIGZpCiAgICBmaQpmaQoKIyBjaGVjayB0aGUgbGRmbGFncwppZiB0ZXN0ICJ4JGVtYmVkX3BlcmwiICE9ICJ4bm8iIDsgdGhlbgogICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgUGVybCBMREZMQUdTXSkKICAgIG5ldHNubXBfcGVybGxkb3B0cz1gJG15cGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBsZG9wdHNgCiAgICBpZiB0ZXN0ICJ4JG5ldHNubXBfcGVybGxkb3B0cyIgIT0gIngiIDsgdGhlbgogICAgICBBQ19NU0dfUkVTVUxUKFskbmV0c25tcF9wZXJsbGRvcHRzXSkKICAgIGVsc2UKICAgICAgaWYgdGVzdCAieCRlbWJlZF9wZXJsIiA9ICJ4dHJ5IiA7IHRoZW4KICAgICAgICBlbWJlZF9wZXJsPSJubyIKICAgICAgZWxzZQogICAgICAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGRldGVybWluZSB0aGUgbGlua2VyIG9wdGlvbnMgdGhhdCB3ZXJlIHVzZWQgdG8gYnVpbGQgJG15cGVybC4gRWl0aGVyIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUEVSTFBST0cgdG8gYSBkaWZmZXJlbnQgUGVybCBiaW5hcnkgb3IgdXNlIC0tZGlzYWJsZS1lbWJlZGRlZC1wZXJsIHRvIHR1cm4gb2ZmIGVtYmVkZGVkIFBlcmwgZnVuY3Rpb25hbGl0eSBhbHRvZ2V0aGVyLl0pCiAgICAgIGZpCiAgICBmaQogICAgaWYgdGVzdCAieCRlbmFibGVfYXNfbmVlZGVkIiA9ICJ4eWVzIiA7IHRoZW4KICAgICAgIyBsaW5rICpsaWJyYXJpZXMqIHdpdGggbGlicGVybAogICAgICBQRVJMTERPUFRTX0ZPUl9MSUJTPSIkbmV0c25tcF9wZXJsbGRvcHRzIgogICAgICAjIFBlcmwgY2NkbGZsYWdzIChSUEFUSCB0byBsaWJwZXJsLCBob3BlZnVsbHkpCiAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFBlcmwgQ0NETEZMQUdTXSkKICAgICAgY2hhbmdlcXVvdGUoLCApCiAgICAgIG5ldHNubXBfcGVybGNjZGxmbGFncz1gJG15cGVybCAtVjpjY2RsZmxhZ3MgfCAkbXlwZXJsIC1uIC1lICdwcmludCAkMSAnImlmICgvXlxzKmNjZGxmbGFncz0nKFteJ10rKSc7Lyk7ImAKICAgICAgY2hhbmdlcXVvdGUoWywgXSkKICAgICAgQUNfTVNHX1JFU1VMVChbJG5ldHNubXBfcGVybGNjZGxmbGFnc10pCiAgICAgIFBFUkxMRE9QVFNfRk9SX0FQUFM9IiRuZXRzbm1wX3BlcmxjY2RsZmxhZ3MiCiAgICBlbHNlCiAgICAgICMgbGluayAqYXBwbGljYXRpb25zKiBhZ2FpbnN0IGxpYnBlcmwKICAgICAgUEVSTExET1BUU19GT1JfQVBQUz0iJG5ldHNubXBfcGVybGxkb3B0cyIKICAgIGZpCmZpCgojIGNoZWNrIG5lZWRlZCBmdW5jdGlvbnMKaWYgdGVzdCAieCRlbWJlZF9wZXJsIiAhPSAieG5vIiA7IHRoZW4KICAgIE9MRExJQlM9IiRMSUJTIgogICAgTElCUz0iJExJQlMgJG5ldHNubXBfcGVybGxkb3B0cyIKCiAgICAjIG5ld2VyIHBlcmwgdnMgb2xkZXIgcGVybCBjYWxsIGZ1bmN0aW9ucwogICAgQUNfQ0hFQ0tfRlVOQ1MoZXZhbF9wdikKCiAgICAjIHNpZ2g6IHRoaXMgaGFzIGEgQ0FQSVRBTCBQIGluIFBlcmwsIHdoaWNoIGVuZHMgdXAgYmVpbmcgdGhlIHNhbWUKICAgICMgYXV0b2NvbmYgZGVmaW5lIGFzIHRoZSBsb3dlciBjYXNlIHNvIHdlIGhhdmUgdG8gdHJlYXQgdGhlbSAqQk9USCoKICAgICMgc3BlY2lhbGx5LiAgV29uZGVyZnVsLgogICAgQUNfQ0hFQ0tfRlVOQyhwZXJsX2V2YWxfcHYsIEFDX0RFRklORShIQVZFX1BFUkxfRVZBTF9QVl9MQykpCiAgICBBQ19DSEVDS19GVU5DKFBlcmxfZXZhbF9wdiwgQUNfREVGSU5FKEhBVkVfUEVSTF9FVkFMX1BWX1VDKSkKCiAgICBMSUJTPSIkT0xETElCUyIKCgogICAgaWYgdGVzdCAieCRhY19jdl9mdW5jX3BlcmxfZXZhbF9wdiIgIT0gInh5ZXMiIC1hICJ4JGFjX2N2X2Z1bmNfUGVybF9ldmFsX3B2IiAhPSAieHllcyIgLWEgIngkYWNfY3ZfZnVuY19ldmFsX3B2IiAhPSAieHllcyIgOyB0aGVuCiAgICAgIGlmIHRlc3QgIngkZW1iZWRfcGVybCIgPSAieHRyeSIgOyB0aGVuCiAgICAgICAgZW1iZWRfcGVybD0ibm8iCiAgICAgIGVsc2UKICAgICAgICBBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIHRoZSBldmFsX3B2LCBwZXJsX2V2YWxfcHYgb3IgUGVybF9ldmFsX3B2IGZ1bmN0aW9ucyBuZWVkZWQgZm9yIGVtYmVkZGVkIFBlcmwgc3VwcG9ydC4gRWl0aGVyIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgUEVSTFBST0cgdG8gYSBkaWZmZXJlbnQgcGVybCBiaW5hcnkgb3IgdXNlIC0tZGlzYWJsZS1lbWJlZGRlZC1wZXJsIHRvIHR1cm4gb2ZmIGVtYmVkZGVkIFBlcmwgZnVuY3Rpb25hbGl0eSBhbHRvZ2V0aGVyLl0pCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIEFDX0RFRklORShORVRTTk1QX0VNQkVEREVEX1BFUkwpCiAgICAgIE9USEVSQUdFTlRMSUJPQkpTPSJzbm1wX3BlcmwubyIKICAgICAgT1RIRVJBR0VOVExJQkxPQkpTPSJzbm1wX3BlcmwubG8iCgogICAgICBFTUJFRFBFUkxJTlNUQUxMPSJlbWJlZHBlcmxpbnN0YWxsIgogICAgICBFTUJFRFBFUkxVTklOU1RBTEw9ImVtYmVkcGVybHVuaW5zdGFsbCIKICAgICAgIyB5YXksIHdlIGdvdCBoZXJlIQogICAgICBlbWJlZF9wZXJsPSJ5ZXMiCiAgICBmaQplbHNlCiAgICAgIEVNQkVEUEVSTElOU1RBTEw9IiIKICAgICAgRU1CRURQRVJMVU5JTlNUQUxMPSIiCiAgICAgIGVtYmVkX3Blcmw9Im5vIgogICAgZmkKZmkKQUNfU1VCU1QoRU1CRURQRVJMSU5TVEFMTCkKQUNfU1VCU1QoRU1CRURQRVJMVU5JTlNUQUxMKQpBQ19TVUJTVChQRVJMTERPUFRTX0ZPUl9MSUJTKQpBQ19TVUJTVChQRVJMTERPUFRTX0ZPUl9BUFBTKQoKIyBlbWJlZGRlZCBQZXJsIHJlc3VsdHMKQUNfTVNHX0NIRUNLSU5HKFtmb3IgcG90ZW50aWFsIGVtYmVkZGVkIFBlcmwgc3VwcG9ydF0pCmlmIHRlc3QgIngkZW1iZWRfcGVybCIgIT0gInh5ZXMiIDsgdGhlbgogIEFDX01TR19DQUNIRV9BREQoRW1iZWRkZWQgUGVybCBzdXBwb3J0OiAgICAgIGRpc2FibGVkKQogIEFDX01TR19SRVNVTFQoW2Rpc2FibGVkXSkKZWxzZQogIEFDX01TR19DQUNIRV9BREQoRW1iZWRkZWQgUGVybCBzdXBwb3J0OiAgICAgIGVuYWJsZWQpCiAgQUNfTVNHX1JFU1VMVChbZW5hYmxlZF0pCmZpCgojIGluc3RhbGwgUGVybCBtb2R1bGUgcmVzdWx0cwpQRVJMVEFSR1M9IiIKUEVSTElOU1RBTExUQVJHUz0iIgpQRVJMVU5JTlNUQUxMVEFSR1M9IiIKQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gaW5zdGFsbCB0aGUgUGVybCBtb2R1bGVzXSkKaWYgdGVzdCAieCRpbnN0YWxsX3BlcmwiID0gInh5ZXMiIDsgdGhlbgogICAgUEVSTFRBUkdTPSJwZXJsbW9kdWxlcyIKICAgIFBFUkxJTlNUQUxMVEFSR1M9InBlcmxpbnN0YWxsIgogICAgUEVSTFVOSU5TVEFMTFRBUkdTPSJwZXJsdW5pbnN0YWxsIgogICAgaWYgdGVzdCAieCRlbWJlZF9wZXJsIiA9ICJ4eWVzIiA7IHRoZW4KICAgICAgQUNfTVNHX0NBQ0hFX0FERChTTk1QIFBlcmwgbW9kdWxlczogICAgICAgICAgYnVpbGRpbmcgLS0gZW1iZWRkYWJsZSkKICAgICAgQUNfTVNHX1JFU1VMVChbeWVzIC0tIGFuZCBlbWJlZGRhYmxlXSkKICAgIGVsc2UKICAgICAgQUNfTVNHX0NBQ0hFX0FERChTTk1QIFBlcmwgbW9kdWxlczogICAgICAgICAgYnVpbGRpbmcgLS0gbm90IGVtYmVkZGFibGUpCiAgICAgIEFDX01TR19SRVNVTFQoW3llcyAtLSBub3QgZW1iZWRkYWJsZV0pCiAgICBmaQplbHNlCiAgICBBQ19NU0dfUkVTVUxUKFtub10pCiAgICBBQ19NU0dfQ0FDSEVfQUREKFNOTVAgUGVybCBtb2R1bGVzOiAgICAgICAgICBkaXNhYmxlZCkKZmkKQUNfU1VCU1QoUEVSTFRBUkdTKQpBQ19TVUJTVChQRVJMSU5TVEFMTFRBUkdTKQpBQ19TVUJTVChQRVJMVU5JTlNUQUxMVEFSR1MpCkFDX1NVQlNUKFBFUkxBUkdTKQoKCgojIHJlc2V0IGxpYnMKQUdFTlRMSUJTPSRMSUJTCkxJQlM9JE5PTkFHRU5UTElCUwoKCgojIHB5dGhvbiBzdXBwb3J0ClBZVEhPTlRBUkdTPSIiClBZVEhPTklOU1RBTExUQVJHUz0iIgpQWVRIT05VTklOU1RBTExUQVJHUz0iIgpQWVRIT05DTEVBTlRBUkdTPSIiCkFDX01TR19DSEVDS0lORyhbaWYgd2Ugc2hvdWxkIGluc3RhbGwgdGhlIHB5dGhvbiBiaW5kaW5nc10pCmlmIHRlc3QgIngkaW5zdGFsbF9weXRob24iID0gInh5ZXMiIDsgdGhlbgogICAgUFlUSE9OVEFSR1M9InB5dGhvbm1vZHVsZXMiCiAgICBQWVRIT05JTlNUQUxMVEFSR1M9InB5dGhvbmluc3RhbGwiCiAgICBQWVRIT05VTklOU1RBTExUQVJHUz0icHl0aG9udW5pbnN0YWxsIgogICAgUFlUSE9OQ0xFQU5UQVJHUz0icHl0aG9uY2xlYW4iCiAgICBBQ19NU0dfQ0FDSEVfQUREKFNOTVAgUHl0aG9uIG1vZHVsZXM6ICAgICAgICBidWlsZGluZyBmb3IgJFBZVEhPTlBST0cpCiAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQplbHNlCiAgICBBQ19NU0dfQ0FDSEVfQUREKFNOTVAgUHl0aG9uIG1vZHVsZXM6ICAgICAgICBkaXNhYmxlZCkKICAgIEFDX01TR19SRVNVTFQoW25vXSkKZmkKQUNfU1VCU1QoUFlUSE9OVEFSR1MpCkFDX1NVQlNUKFBZVEhPTklOU1RBTExUQVJHUykKQUNfU1VCU1QoUFlUSE9OVU5JTlNUQUxMVEFSR1MpCkFDX1NVQlNUKFBZVEhPTkNMRUFOVEFSR1MpCkFDX1NVQlNUKFBZVEhPTkFSR1MpCgoKCiMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCkFDX0hFQURFUl9TVERDCkFDX0hFQURFUl9ESVJFTlQKQUNfSEVBREVSX1NZU19XQUlUCkFDX0NIRUNLX0hFQURFUlMoc3RkYXJnLmggc3RyaW5nLmggZmNudGwuaCBsaW1pdHMuaCBzeXMvZmlsZS5oIHN5cy9pb2N0bC5oIHN5c2xvZy5oIHVuaXN0ZC5oIHN5cy9kbWFwLmggbWFjaGluZS9wdGUuaCB4dGkuaCBzeXMvc29ja2lvLmggc3lzL3NvY2tldC5oIHN5cy9wYXJhbS5oIHN5cy91aW8uaCkKIyBhdCBsZWFzdCBTb2xhcmlzIDkgbmVlZHMgc3lzL3NvY2tldC5oIHRvIGNvbXBpbGUgc3lzL3NvY2tldHZhci5oCkFDX0NIRUNLX0hFQURFUlMoc3lzL3NvY2tldHZhci5oLCwsCkFDX0lOQ0xVREVTX0RFRkFVTFQoW10pClsKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgpdKQojIGF0IGxlYXN0IE9wZW5CU0QgMy40IG5lZWRzIHN5cy9wYXJhbS5oIChNQVhQQVRITEVOKSB0byBjb21waWxlIHN5cy9zd2FwLmgKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc3dhcC5oLCwsCkFDX0lOQ0xVREVTX0RFRkFVTFQoW10pClsKI2lmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKXSkKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdGltZW91dC5oIHN5cy91bi5oIGZzdGFiLmggc3lzL2ZzLmggbXRhYi5oIHVmcy9mcy5oIHN5cy9maXhwb2ludC5oIG1hY2hpbmUvcGFyYW0uaCBzeXMvdm0uaCB2bS92bS5oIHN5cy92bW1ldGVyLmggc3lzL3ZtcGFyYW0uaCBzeXMvdm1tYWMuaCBzeXMvdm1zeXN0bS5oIHN5cy90aW1lLmggc3lzL3RpbWVzLmggc3lzL3N0YXR2ZnMuaCBzeXMvdmZzLmggc3lzL21udHRhYi5oIHN5cy9zZWxlY3QuaCBtbnRlbnQuaCBzeXMvbW50ZW50Lmgga3N0YXQuaCB1dHNuYW1lLmggc3lzL3V0c25hbWUuaCBzeXMvY2RlZnMuaCBnZXRvcHQuaCBsb2NhbGUuaCBwdGhyZWFkLmggc3lzL2xvYWRhdmcuaCByZWdleC5oIGxpbnV4L3Rhc2tzLmggcHdkLmggZ3JwLmggdXRtcHguaCkKIyBOZXR3b3JrIGhlYWRlcnMKQUNfQ0hFQ0tfSEVBREVSUyhhcnBhL2luZXQuaCBuZXRpbmV0L2luX3N5c3RtLmggbmV0aW5ldC9pbi5oIG5ldGluZXQvaXBfdmFyLmggbmV0aW5ldC90Y3AuaCBuZXRpbmV0L3RjcGlwLmggbmV0aW5ldC91ZHAuaCBuZXQvaWYuaCBuZXRpbmV0L2luX3Zhci5oIG5ldGluZXQvaXAuaCBuZXRpbmV0L2lwX2ljbXAuaCBuZXQvaWZfYXJwLmggbmV0L2lmX21pYi5oIG5ldC9pZl92YXIuaCBuZXRpbmV0L2lmX2V0aGVyLmggbmV0aW5ldC90Y3BfdGltZXIuaCBuZXRpbmV0L3RjcF92YXIuaCBuZXRpbmV0L3VkcF92YXIuaCBuZXRpbmV0L2ljbXBfdmFyLmggbmV0ZGIuaCBuZXQvcm91dGUuaCwsLApbWwojaWYgSEFWRV9TWVNfVFlQRVNfSAojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfVElNRU9VVF9ICiNpbmNsdWRlIDxzeXMvdGltZW91dC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUVkFSX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXR2YXIuaD4KI2VuZGlmCiNpZiBIQVZFX0FSUEFfSU5FVF9ICiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fU1lTVE1fSAojaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX0gKI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ICiNpbmNsdWRlIDxuZXQvaWYuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX0lDTVBfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1RDUF9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVENQX1RJTUVSX0gKI2luY2x1ZGUgPG5ldGluZXQvdGNwX3RpbWVyLmg+CiNlbmRpZgpdXSkKIyBVRlMgaGVhZGVycwpBQ19DSEVDS19IRUFERVJTKHVmcy91ZnMvZGlub2RlLmggdWZzL3Vmcy9xdW90YS5oIHVmcy91ZnMvaW5vZGUuaCB1ZnMvZmZzL2ZzLmgsLCwKW1sKI2lmIEhBVkVfU1lTX1RZUEVTX0gKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmIEhBVkVfVUZTX1VGU19ESU5PREVfSAojaW5jbHVkZSA8dWZzL3Vmcy9kaW5vZGUuaD4KI2VuZGlmCiNpZiBIQVZFX1VGU19VRlNfUVVPVEFfSAojaW5jbHVkZSA8dWZzL3Vmcy9xdW90YS5oPgojZW5kaWYKXV0pCiMgRnJlZUJTRCByZXF1aXJlZCBoZWFkZXJzCkFDX0NIRUNLX0hFQURFUlMobWFsbG9jLmggbmV0L2lmX2RsLmggc3lzL3N5c2N0bC5oIHN0ZGxpYi5oIG5ldC9pZl90eXBlcy5oIHN5cy9xdWV1ZS5oIG9zcmVsZGF0ZS5oIG1hY2hpbmUvdHlwZXMuaCBzeXMvdXNlci5oIHN5cy9wcm9jLmggc3lzL21idWYuaCBzeXMvbW91bnQuaCBzeXMvZGtzdGF0Lmggc3lzL2NvbmYuaCwsLApbWwojaWYgSEFWRV9TWVNfVFlQRVNfSAojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgpdXSkKIyBMaW51eApBQ19DSEVDS19IRUFERVJTKG5ldGluZXQvdGNwX2ZzbS5oIHN5cy9wcm90b3N3Lmggbmxpc3QuaCBpb2N0bHMuaCBhc20vcGFnZS5oIGFzbS90eXBlcy5oIG5ldGlweC9pcHguaCBwY2kvcGNpLmgpCiMgU29sYXJpcwpBQ19DSEVDS19IRUFERVJTKGluZXQvbWliMi5oKQojIE5ldEJTRCByZXF1aXJlZCBoZWFkZXJzCkFDX0NIRUNLX0hFQURFUlMoa3ZtLmggc3lzL3Bvb2wuaCB1dm0vdXZtX3BhcmFtLmggdXZtL3V2bV9leHRlcm4uaCB2bS92bV9wYXJhbS5oIHZtL3ZtX2V4dGVybi5oKQojIEJTRGkyIGhlYWRlcnMKQUNfQ0hFQ0tfSEVBREVSUyh2bS9zd2FwX3BhZ2VyLmgsLCwKW1sKI2lmIEhBVkVfVk1fVk1fSAojaW5jbHVkZSA8dm0vdm0uaD4KI2VuZGlmCl1dKQojIGxpbnV4IGV0aHRvb2wKIyByZXF1aXJlcyBzcGVjaWFsIGhhY2tzIHRvIGdldCBhcm91bmQgdmFyaW91cyBwcm9ibGVtcyBvbiBvbGRlciBsaW51eCBrZXJuZWxzLgojIG1ham9yIHVnaC4uLi4KQUNfQ0hFQ0tfSEVBREVSUyhbbGludXgvZXRodG9vbC5oXSwsLApbWwojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KdHlwZWRlZiBfX3U2NCB1NjQ7ICAgICAgICAgLyogaGFjaywgc28gd2UgbWF5IGluY2x1ZGUga2VybmVsJ3MgZXRodG9vbC5oICovCnR5cGVkZWYgX191MzIgdTMyOyAgICAgICAgIC8qIGRpdHRvICovCnR5cGVkZWYgX191MTYgdTE2OyAgICAgICAgIC8qIGRpdHRvICovCnR5cGVkZWYgX191OCB1ODsgICAgICAgICAgIC8qIGRpdHRvICovCl1dKQojIEJTRGkzIGhlYWRlcnMKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc3RhdC5oKQojIEJTRGkzL0lSSVggaGVhZGVycwojIGF0IGxlYXN0IElSSVggNi41IG5lZWRzIF9LTUVNVVNFUiBhbmQgc3lzL3R5cGVzLmggKG1wcm90X3QpIHRvIGNvbXBpbGUgCiMgICBzeXMvdm5vZGUuaApBQ19DSEVDS19IRUFERVJTKHN5cy92bm9kZS5oLCwsClsKI2RlZmluZSBfS01FTVVTRVIgMQojaWYgSEFWRV9TWVNfVFlQRVNfSAojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgpdKQojIGF0IGxlYXN0IElSSVggNi41IG5lZWRzIHN5cy9zZW1hLmggKG1ybG9ja190KSB0byBjb21waWxlIHN5cy9oYXNoaW5nLmgKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc2VtYS5oKQpBQ19DSEVDS19IRUFERVJTKHN5cy9oYXNoaW5nLmgsLCwKQUNfSU5DTFVERVNfREVGQVVMVChbXSkKWwojaWYgSEFWRV9TWVNfU0VNQV9ICiNpbmNsdWRlIDxzeXMvc2VtYS5oPgojZW5kaWYKXSkKIyBtb3JlIElSSVggaGVhZGVycwpBQ19DSEVDS19IRUFERVJTKHN5cy90Y3BpcHN0YXRzLmggc3lzL3N5c21wLmggc3lzL3N5c3RlbWluZm8uaCBzeXMvc3lzZ2V0LmgpCiMgQUlYIHN5c3RlbSBjb25maWd1cmF0aW9uCkFDX0NIRUNLX0hFQURFUlMoc3lzL3N5c3RlbWNmZy5oKQojIGZyb20gc211eCBzdHVmZgpBQ19DSEVDS19IRUFERVJTKGVyci5oIHN5cy9maWxpby5oIHNndHR5LmgpCiMgQUlYIG5lZWRzIHRoaXMgZm9yIHN0YXRmcyBmdW5jCkFDX0NIRUNLX0hFQURFUlMoc3lzL3N0YXRmcy5oKQojIGZvciBIb3N0UmVzIChIUC1VWCBhdCBsZWFzdCkKQUNfQ0hFQ0tfSEVBREVSUyhzeXMvZGtpby5oIHN5cy9kaXNraW8uaCBzeXMvcHN0YXQuaCBsaW51eC9oZHJlZy5oIHBrZ2xvY3MuaCkKIyBmb3IgSG9zdFJlcyAoU29sYXJpcyAyLnggYXQgbGVhc3QpCkFDX0NIRUNLX0hFQURFUlMocGtnaW5mby5oLAogICAgQUNfQ0hFQ0tfTElCKGFkbSwgcGtnaW5mbywgQUNfREVGSU5FKEhBVkVfUEtHSU5GTykKICAgIExNSUJMSUJTPSIke0xNSUJMSUJTfSAtbGFkbSIpKQoKY2FzZSAkdGFyZ2V0X29zIGluCiAgICBhaXgqKSAjIEFJWCBwZXJmc3RhdCBsaWJyYXJ5LCBuZWVkZWQgZm9yIENQVS9tZW1vcnkgc3RhdGlzdGljcwogICAgICAgIEFDX0NIRUNLX0hFQURFUlMobGlicGVyZnN0YXQuaCwKICAgICAgICAgICAgQUNfQ0hFQ0tfTElCKHBlcmZzdGF0LCBwZXJmc3RhdF9jcHVfdG90YWwsIEFDX0RFRklORShIQVZFX1BFUkZTVEFUKQogICAgICAgICAgICBMTUlCTElCUz0iJHtMTUlCTElCU30gLWxwZXJmc3RhdCIpLCBBQ19NU0dfRVJST1IoWwoKKioqIFRvIG1vbml0b3IgQ1BVL21lbW9yeSB2YWx1ZXMgaW4gQUlYIHlvdSBuZWVkIHRvIGluc3RhbGwKKioqIGxpYnBlcmZzdGF0IHdoaWNoIGNhbiBiZSBmb3VuZCBpbiBib3MucGVyZgpdKSkKICAgICAgICA7OwogICAgaHB1eCopICMgSFAtVVggYWdlbnQgbmVlZHMgb3Blbl9taWIKICAgICAgICBBQ19DSEVDS19MSUIobm0sIG9wZW5fbWliLCBBQ19ERUZJTkUoSEFWRV9MSUJOTSkKICAgICAgICAgICAgTE1JQkxJQlM9IiR7TE1JQkxJQlN9IC1sbm0iKQogICAgICAgIDs7CiAgICAqKQogICAgICAgIDs7CmVzYWMKIyBXSU4zMgojIChtaW5ndzMyIG11c3QgbGluayB3aW5zb2NrIGV4cGxpY2l0bHkpCkFDX0NIRUNLX0hFQURFUlMod2luc29jay5oLFsKICAgICAgICBBR0VOVExJQlM9IiR7QUdFTlRMSUJTfSAtbGlwaGxwYXBpIgogICAgICAgIGNhc2UgJHRhcmdldF9vcyBpbgogICAgICAgICAgICAgICAgbWluZ3cqKQogICAgICAgICAgICAgICAgICAgICAgICBMSUJTPSIke0xJQlN9IC1scmVnZXggLWx3czJfMzIiCiAgICAgICAgICAgICAgICAgICAgICAgIEFHRU5UTElCUz0iJHtBR0VOVExJQlN9IC1scmVnZXggLWx3czJfMzIiCiAgICAgICAgICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAqKQogICAgICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgIGVzYWMKXSkKQUNfQ0hFQ0tfSEVBREVSUyhpby5oKQojIFNDTwpBQ19DSEVDS19IRUFERVJTKHN5cy9zdHJlYW0uaCkKIyBLQU1FCkFDX0NIRUNLX0hFQURFUlMobmV0aW5ldC9pcDYuaCBuZXRpbmV0Ni9pbjZfdmFyLmggbmV0aW5ldDYvaW42X3BjYi5oIG5ldGluZXQ2L2lwNl92YXIuaCBuZXRpbmV0Ni90Y3A2LmggbmV0aW5ldDYvdGNwNl9mc20uaCBuZXRpbmV0Ni9uZDYuaCBuZXRpbmV0Ni90Y3A2X3RpbWVyLmggbmV0aW5ldDYvdGNwNl92YXIuaCwsLApbWwojaWYgSEFWRV9TWVNfVFlQRVNfSAojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfUVVFVUVfSAojaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVA2X0gKI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfSAojaW5jbHVkZSA8bmV0L2lmLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfUk9VVEVfSAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNlbmRpZgpdXSkKIyBEWU5BTUlDIE1PRFVMRSBTVVBQT1JUCkFDX0NIRUNLX0hFQURFUlMoZGxmY24uaCkKIyB0YWJsZV9hcnJheSBoZWxwZXIgc3VwcG9ydApBQ19DSEVDS19IRUFERVJTKHNlYXJjaC5oKQoKIyBSUE0gc3ViZGlyZWN0b3J5IHBhdGggKHNpZ2gpCmlmIHRlc3QgIngkd2l0aF9ycG0iICE9ICJ4bm8iICYmIFwKICAgICAgICBlY2hvICIgJG1vZHVsZV9saXN0ICIgfCBncmVwICIgaG9zdC9ocl9zd2luc3QgIiA+IC9kZXYvbnVsbDsgdGhlbgogIEFDX0NIRUNLX0hFQURFUlMocnBtL3JwbXRzLmgsIFtdLCBbXSwgW1sjaW5jbHVkZSA8cnBtL3JwbWxpYi5oPl1dKQpmaQoKIyBPcGVuQlNEIDIuNiBuZWVkcyBuZXRpbmV0L2luLmggYmVmb3JlIG5ldGluZXQvaW5fcGNiLmgKQUNfTVNHX0NIRUNLSU5HKFtbZm9yIG5ldGluZXQvaW5fcGNiLmhdXSkKQUNfQ0FDSEVfVkFMKGN2X2hhdmVfbmV0aW5ldF9pbl9wY2JfaCwKWyBBQ19UUllfQ1BQKCBbCiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPgpdLCBjdl9oYXZlX25ldGluZXRfaW5fcGNiX2g9eWVzLCBjdl9oYXZlX25ldGluZXRfaW5fcGNiX2g9bm8pXSkKQUNfTVNHX1JFU1VMVCgkY3ZfaGF2ZV9uZXRpbmV0X2luX3BjYl9oKQppZiB0ZXN0ICRjdl9oYXZlX25ldGluZXRfaW5fcGNiX2ggPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9ORVRJTkVUX0lOX1BDQl9IKQpmaQoKIyBOZXRCU0QgbmVlZHMgbWFjaGluZS90eXBlcy5oIGJlZm9yZSBzeXMvZGlza2xhYmVsLmgKQUNfTVNHX0NIRUNLSU5HKFtbZm9yIHN5cy9kaXNrbGFiZWwuaF1dKQpBQ19DQUNIRV9WQUwoY3ZfaGF2ZV9zeXNfZGlza2xhYmVsX2gsClsgQUNfVFJZX0NQUCggWwojaW5jbHVkZSA8bWFjaGluZS90eXBlcy5oPgojaW5jbHVkZSA8c3lzL2Rpc2tsYWJlbC5oPgpdLCBjdl9oYXZlX3N5c19kaXNrbGFiZWxfaD15ZXMsIGN2X2hhdmVfc3lzX2Rpc2tsYWJlbF9oPW5vKV0pCkFDX01TR19SRVNVTFQoJGN2X2hhdmVfc3lzX2Rpc2tsYWJlbF9oKQppZiB0ZXN0ICRjdl9oYXZlX3N5c19kaXNrbGFiZWxfaCA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1NZU19ESVNLTEFCRUxfSCkKZmkKCiMgT3BlblNTTApBQ19DSEVDS19IRUFERVJTKG9wZW5zc2wvaG1hYy5oIG9wZW5zc2wvZXZwLmggb3BlbnNzbC9hZXMuaCBvcGVuc3NsL2Rlcy5oIG9wZW5zc2wvZGguaCkKQUNfQ0hFQ0tfSEVBREVSUyhzZWN1cml0eS9jcnlwdG9raS5oKQoKIyBQcmludGluZwpBQ19QQVRIX1BST0coW0xQU1RBVF9QQVRIXSxscHN0YXQpCmlmIHRlc3QgeCRMUFNUQVRfUEFUSCAhPSB4OyB0aGVuCiAgICBBQ19ERUZJTkVfVU5RVU9URUQoTFBTVEFUX1BBVEgsIiRMUFNUQVRfUEFUSCIpCiAgICBBQ19ERUZJTkUoSEFWRV9MUFNUQVQpCmZpCkFDX0NIRUNLX0ZVTkNTKGNnZXRuZXh0KQppZiB0ZXN0IC1yIC9ldGMvcHJpbnRjYXA7IHRoZW4KICAgIEFDX0RFRklORShIQVZFX1BSSU5UQ0FQKQpmaQoKQUNfTVNHX0NIRUNLSU5HKFtmb3IgYXV0aGVudGljYXRpb24gc3VwcG9ydF0pCnVzZW9wZW5zc2w9bm8KdXNlcGtjcz1ubwppZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wa2NzMTFfQ19Jbml0aWFsaXplIiAhPSAieHllcyIgLW8gIngkYWNfY3ZfaGVhZGVyX3NlY3VyaXR5X2NyeXB0b2tpX2giICE9ICJ4eWVzIjsgdGhlbgogICAgaWYgdGVzdCAieCRhc2tlZHBrY3MiID0gInh5ZXMiOyB0aGVuCiAgICAgICBBQ19NU0dfRVJST1IoQXNrZWQgdG8gdXNlIFBLQ1MxMSBidXQgSSBjb3VsZG4ndCBmaW5kIGl0LikKICAgIGZpCmVsc2UKICAgIGlmIHRlc3QgIngkYXNrZWRwa2NzIiA9ICJ4eWVzIjsgdGhlbgogICAgICAgIHVzZXBrY3M9eWVzCiAgICBmaQpmaQoKaWYgdGVzdCAieCRhY19jdl9saWJfY3J5cHRvX0VWUF9tZDUiICE9ICJ4eWVzIiAtbyAieCRhY19jdl9oZWFkZXJfb3BlbnNzbF9obWFjX2giICE9ICJ4eWVzIiAtbyAieCRhY19jdl9oZWFkZXJfb3BlbnNzbF9obWFjX2giICE9ICJ4eWVzIjsgdGhlbgogICAgaWYgdGVzdCAieCRhc2tlZG9wZW5zc2wiID0gInh5ZXMiOyB0aGVuCiAgICAgICAgQUNfTVNHX0VSUk9SKEFza2VkIHRvIHVzZSBPcGVuU1NMIGJ1dCBJIGNvdWxkbid0IGZpbmQgaXQuKQogICAgZmkKZWxzZQogICAgaWYgdGVzdCAieCRhc2tlZG9wZW5zc2wiID0gInh5ZXMiOyB0aGVuCiAgICAgICAgdXNlb3BlbnNzbD15ZXMKICAgIGVsaWYgdGVzdCAieCR0cnlvcGVuc3NsIiA9ICJ4eWVzIjsgdGhlbgogICAgICAgIGlmIHRlc3QgIngkdXNlcGtjcyIgIT0gInh5ZXMiOyB0aGVuCiAgICAgICAgICAgIHVzZW9wZW5zc2w9eWVzCiAgICAgICAgZmkKICAgIGZpCmZpCgppZiB0ZXN0ICJ4JHVzZW9wZW5zc2wiICE9ICJ4bm8iIDsgdGhlbgogICAgYXV0aG1vZGVzPSJNRDUgU0hBMSIKICAgIGlmIHRlc3QgIngkZW5hYmxlX3ByaXZhY3kiICE9ICJ4bm8iIDsgdGhlbgogICAgICAgIGlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX29wZW5zc2xfYWVzX2giID0gInh5ZXMiIDsgdGhlbgogICAgICAgICAgICBlbmNybW9kZXM9IkRFUyBBRVMiCgllbHNlCgkgICAgZW5jcm1vZGVzPSJERVMiCglmaQogICAgZWxzZQogICAgICAgIGVuY3Jtb2Rlcz0iW2Rpc2FibGVkXSIKICAgIGZpCiAgICBBQ19ERUZJTkUoTkVUU05NUF9VU0VfT1BFTlNTTCkKICAgIExORVRTTk1QTElCUz0iJExORVRTTk1QTElCUyAkTElCQ1JZUFRPIgogICAgQUNfTVNHX1JFU1VMVChPcGVuU1NMIFN1cHBvcnQpCmVsaWYgdGVzdCAieCR1c2Vwa2NzIiAhPSAieG5vIiA7IHRoZW4KICAgIGF1dGhtb2Rlcz0iTUQ1IFNIQTEiCiAgICBpZiB0ZXN0ICJ4JGVuYWJsZV9wcml2YWN5IiAhPSAieG5vIiA7IHRoZW4KICAgICAgICBlbmNybW9kZXM9IkRFUyIKICAgIGVsc2UKICAgICAgICBlbmNybW9kZXM9IltkaXNhYmxlZF0iCiAgICBmaQogICAgQUNfREVGSU5FKE5FVFNOTVBfVVNFX1BLQ1MxMSkKICAgIExORVRTTk1QTElCUz0iJExORVRTTk1QTElCUyAkTElCUEtDUzExIgogICAgQUNfTVNHX1JFU1VMVChQS0NTMTEgU3VwcG9ydCkKZWxpZiB0ZXN0ICJ4JGVuYWJsZV9tZDUiICE9ICJ4bm8iOyB0aGVuCiAgICBhdXRobW9kZXM9Ik1ENSIKICAgIGVuY3Jtb2Rlcz0iIgogICAgQUNfREVGSU5FKE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSkKICAgIEFDX01TR19SRVNVTFQoSW50ZXJuYWwgTUQ1IFN1cHBvcnQpCmZpCmlmIHRlc3QgIngkZW5hYmxlX21kNSIgPSAieG5vIjsgdGhlbgogICAgYXV0aG1vZGVzPWBlY2hvICRhdXRobW9kZXMgfCBzZWQgJ3MvTUQ1ICovLzsnYApmaQpBQ19TVUJTVChMTkVUU05NUExJQlMpCkFDX1NVQlNUKExBR0VOVExJQlMpCgpBQ19NU0dfQ0FDSEVfQUREKEF1dGhlbnRpY2F0aW9uIHN1cHBvcnQ6ICAgICAkYXV0aG1vZGVzKQpBQ19NU0dfQ0FDSEVfQUREKEVuY3J5cHRpb24gc3VwcG9ydDogICAgICAgICAkZW5jcm1vZGVzKQoKaWYgdGVzdCAieCRhbGxfd2FybmluZ3MiICE9ICJ4IjsgdGhlbgogICAgQUNfTVNHX0NBQ0hFX0FERChXQVJOSU5HOiAkYWxsX3dhcm5pbmdzKQpmaQoKIyBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgpBQ19UWVBFX09GRl9UCkFDX1RZUEVfUElEX1QKQUNfSEVBREVSX1RJTUUKCiMgdGhpcyBzaG91bGQgdXNlIEFDX0NIRUNLX1RZUEUsIGJ1dCBpdCdzIGJyb2tlbiBhdCBsZWFzdCBpbiAyLjEzLTE0CiMgc28gd2UgZG8gaXQgYnkgaGFuZC4KQUNfTVNHX0NIRUNLSU5HKFtmb3Igc29ja2xlbl90XSkKQUNfQ0FDSEVfVkFMKGFjX2N2X3R5cGVfJDEsCltBQ19FR1JFUF9DUFAoW3NvY2tsZW5fdEA8OkBeYS16QS1aXzAtOUA6PkBdLApbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgU1REQ19IRUFERVJTCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZl0sIFthY19jdl90eXBlX3NvY2tsZW5fdD15ZXNdLCBbYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9bm9dKV0pCgpBQ19NU0dfUkVTVUxUKFskYWNfY3ZfdHlwZV9zb2NrbGVuX3RdKQppZiB0ZXN0ICRhY19jdl90eXBlX3NvY2tsZW5fdCA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1NPQ0tMRU5fVCkKZmkKCiMgQUlYIGtlZXBzIGluX2FkZHJfdCBpbiAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCkFDX01TR19DSEVDS0lORyhbZm9yIGluX2FkZHJfdF0pCkFDX0NBQ0hFX1ZBTChhY19jdl90eXBlXyQxLApbQUNfRUdSRVBfQ1BQKFtpbl9hZGRyX3RAPDpAXmEtekEtWl8wLTlAOj5AXSwKWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIFNURENfSEVBREVSUwojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWZdLCBbYWNfY3ZfdHlwZV9pbl9hZGRyX3Q9eWVzXSwgW2FjX2N2X3R5cGVfaW5fYWRkcl90PW5vXSldKQoKQUNfTVNHX1JFU1VMVChbJGFjX2N2X3R5cGVfaW5fYWRkcl90XSkKaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbl9hZGRyX3QgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9JTl9BRERSX1QpCmZpCgojIE9sZGVyIHZlcnNpb25zIG9mIE1pbkdXIGRvIG5vdCBkZWZpbmUgc3NpemVfdCBpbiBzeXMvdHlwZXMKQUNfTVNHX0NIRUNLSU5HKFtmb3Igc3NpemVfdF0pCkFDX0NBQ0hFX1ZBTChhY19jdl90eXBlXyQxLApbQUNfRUdSRVBfQ1BQKFtzc2l6ZV90QDw6QF5hLXpBLVpfMC05QDo+QF0sClsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBTVERDX0hFQURFUlMKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNlbmRpZl0sIFthY19jdl90eXBlX3NzaXplX3Q9eWVzXSwgW2FjX2N2X3R5cGVfc3NpemVfdD1ub10pXSkKCkFDX01TR19SRVNVTFQoWyRhY19jdl90eXBlX3NzaXplX3RdKQppZiB0ZXN0ICRhY19jdl90eXBlX3NzaXplX3QgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9TU0laRV9ULCAxLCBbRGVmaW5lIGlmIHR5cGUgc3NpemVfdCBpcyBhdmFpbGFibGVdKQpmaQoKIyBDaGVjayBwcyBhcmdzCkFDX0NBQ0hFX0NIRUNLKFtmb3IgY29ycmVjdCBmbGFncyB0byBwc10sIGFjX2N2X3BzX2ZsYWdzLApbaWYgdGVzdCAiYCgkUFNQUk9HIC1lIDI+JjEpIHwgJEVHUkVQICcgKHBzKSAqJCcgfCBhd2sgJ3twcmludCAkTkZ9J2AiID0gInBzIiA7IHRoZW4KICBhY19jdl9wc19mbGFncz0iLWUiCmVsaWYgdGVzdCAiYCgkUFNQUk9HIC1lbCAyPiYxKSB8ICRFR1JFUCAnIChwcykgKiQnIHwgYXdrICd7cHJpbnQgJE5GfSdgIiA9ICJwcyIgOyB0aGVuCiAgYWNfY3ZfcHNfZmxhZ3M9Ii1lbCIKZWxpZiB0ZXN0ICJgKCRQU1BST0cgYWN4IDI+JjEpIHwgJEVHUkVQICcgKHBzKSAqJCcgfCBhd2sgJ3twcmludCAkTkZ9J2AiID0gInBzIiA7IHRoZW4KICBhY19jdl9wc19mbGFncz0iYWN4IgplbGlmIHRlc3QgImAoJFBTUFJPRyAtYWN4IDI+JjEpIHwgJEVHUkVQICcgKHBzKSAqJCcgfCBhd2sgJ3twcmludCAkTkZ9J2AiID0gInBzIiA7IHRoZW4KICBhY19jdl9wc19mbGFncz0iLWFjeCIKZWxpZiB0ZXN0ICJgKCRQU1BST0cgLW8gcGlkLHR0LHN0YXRlLHRpbWUsdWNvbW0gMj4mMSkgfCAkRUdSRVAgJyBwcyAqJCcgfCBhd2sgJ3twcmludCAkTkZ9J2AiID0gInBzIiA7IHRoZW4KICBhY19jdl9wc19mbGFncz0iLW8gcGlkLHR0LHN0YXRlLHRpbWUsdWNvbW0iCmVsaWYgdGVzdCAiYCgkUFNQUk9HIGF4IDI+JjEpIHwgJEVHUkVQICcgKHBzKSAqJCcgfCBhd2sgJ3twcmludCAkTkZ9J2AiID0gInBzIiA7IHRoZW4KICBhY19jdl9wc19mbGFncz0iYXgiCmVsaWYgdGVzdCAieCRQQVJUSUFMVEFSR0VUT1MiID0gInhjeWd3aW4iOyB0aGVuCiAgYWNfY3ZfcHNfZmxhZ3M9Ii1lIgplbGlmIHRlc3QgIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMiIgLW8gIngkUEFSVElBTFRBUkdFVE9TIiA9ICJ4bWluZ3czMm1zdmMiOyB0aGVuIAogIGFjX2N2X3BzX2ZsYWdzPSItZSIKZWxzZQogIEFDX01TR19XQVJOKFtVbmFibGUgdG8gZGV0ZXJtaW5lIHZhbGlkIHBzIGZsYWdzLi4uICBkZWZhdWx0aW5nLi4uXSkKICBhY19jdl9wc19mbGFncz0iLWFjeCIKZmkKXSkKClBTQ01EPSIkUFNQUk9HICRhY19jdl9wc19mbGFncyIKQUNfU1VCU1QoUFNDTUQpCkFDX0RFRklORV9VTlFVT1RFRChQU0NNRCwgIiRQU1BST0cgJGFjX2N2X3BzX2ZsYWdzIikKCiMgQ2hlY2tzIGZvciBieXRlIG9yZGVyCmlmIHRlc3QgJGNyb3NzX2NvbXBpbGluZyA9IHllczsgdGhlbgogIGlmIHRlc3QgeCR3aXRoX2VuZGlhbm5lc3MgPSB4YmlnOyB0aGVuCiAgICBBQ19ERUZJTkUoV09SRFNfQklHRU5ESUFOKQogIGVsaWYgdGVzdCAteiAkd2l0aF9lbmRpYW5uZXNzOyB0aGVuCiAgICBBQ19NU0dfRVJST1IoW1lvdSBhcmUgY3Jvc3MtY29tcGlsaW5nLCBidXQgeW91IGhhdmUgbm90IHNwZWNpZmllZCB0aGUgdGFyZ2V0J3MgZW5kaWFubmVzc10pCiAgZmkKZWxzZQogIGlmIHRlc3QgJHdpdGhfZW5kaWFubmVzczsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFtFbmRpYW5uZXNzIGhhcyBiZWVuIHNwZWNpZmllZCwgYnV0IHlvdSBhcmUgbm90IGNyb3NzLWNvbXBpbGluZy5dKQogIGZpCiAgQUNfQ19CSUdFTkRJQU4KZmkKCiMgQ2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucy4KQUNfRlVOQ19BTExPQ0EKQUNfUFJPR19HQ0NfVFJBRElUSU9OQUwKQUNfRlVOQ19NRU1DTVAKQUNfVFlQRV9TSUdOQUwKQUNfRlVOQ19HRVRNTlRFTlQKQUNfQ0hFQ0tfRlVOQ1Moc2V0bW50ZW50IGhhc21udG9wdCBnZXRob3N0bmFtZSB1bmFtZSBnZXR0aW1lb2ZkYXkgc2VsZWN0IHNvY2tldCkKQUNfQ0hFQ0tfRlVOQ1Moc3RybGNhdCBzdHJsY3B5IHN0cnRvbCBzdHJ0b3VsKQpBQ19DSEVDS19GVU5DUyhzdHJjaHIgc3RydG9rX3Igc3RyZHVwIG1lbWNweSBtZW1tb3ZlIGluZGV4IGJjb3B5IHN0cmNhc2VzdHIgcmVnY29tcCkKQUNfQ0hFQ0tfRlVOQ1Moc2lnbmFsIHNldHNpZCBzaWdzZXQgc2lnYmxvY2sgc2lnaG9sZCBzdHJlcnJvciBzZXRlbnYgdnNucHJpbnRmIHNucHJpbnRmKQpBQ19DSEVDS19GVU5DUyhzaWdhY3Rpb24pCkFDX0NIRUNLX0ZVTkNTKHJhbmRvbSBscmFuZDQ4IHJhbmQpCkFDX0NIRUNLX0ZVTkNTKGV4ZWN2IHN5c3RlbSBmb3JrIGdldHBpZCBzdHJuY2FzZWNtcCBzaWdhbHJtKQpBQ19DSEVDS19GVU5DUyhsc2VlazY0IHByZWFkNjQpCmlmIHRlc3QgIngkd2l0aF9ycG0iICE9ICJ4bm8iICYmIFwKICAgICAgICBlY2hvICIgJG1vZHVsZV9saXN0ICIgfCBncmVwICIgaG9zdC9ocl9zd2luc3QgIiA+IC9kZXYvbnVsbDsgdGhlbgogIE9MRExJQlM9JExJQlMKICBMSUJTPSRMTUlCTElCUwogIEFDX0NIRUNLX0ZVTkNTKHJwbUdldFBhdGgpCiAgTElCUz0kT0xETElCUwpmaQoKQUNfQ0hFQ0tfRlVOQ1MoZ2V0bG9hZGF2ZykKQUNfQ0hFQ0tfRlVOQ1MoZ2V0YWRkcmluZm8gZ2V0aXBub2RlYnluYW1lIGdhaV9zdHJlcnJvcikKIyBCU0RpMiBmdW5jdGlvbnMgZGlmZmVyCkFDX0NIRUNLX0ZVTkNTKHN0YXR2ZnMgc3RhdGZzKQpBQ19DSEVDS19GVU5DUyhnZXRkdGFibGVzaXplKQojIGZyZWVic2QyIGNoZWNrcwpBQ19DSEVDS19GVU5DUyhnZXRmc3N0YXQpCkFDX0NIRUNLX0ZVTkNTKHVzbGVlcCkKQUNfQ0hFQ0tfRlVOQ1Moc2V0bG9jYWxlKQpBQ19DSEVDS19GVU5DUyh0Y2dldGF0dHIpCkFDX0NIRUNLX0ZVTkNTKGlmX25hbWVpbmRleCBpZl9mcmVlbmFtZWluZGV4KQpBQ19DSEVDS19GVU5DUyhraW5mb19nZXRfY3B1cykKIyBzb2xhcmlzIGNoZWNrcwpBQ19DSEVDS19GVU5DUyhnZXRwYWdlc2l6ZSkKQUNfQ0hFQ0tfRlVOQ1MobWtzdGVtcCkKQUNfQ0hFQ0tfRlVOQ1MoZ2V0cHduYW0gZ2V0Z3JuYW0gc2V0Z2lkIHNldHVpZCBzZXRncm91cHMpCiMgSGlnaCByZXNvbHV0aW9uIGFsYXJtIHN1cHBvcnQKQUNfQ0hFQ0tfRlVOQ1Moc2V0aXRpbWVyKQojIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHRoZSBjbG9jay4KQUNfQ0hFQ0tfRlVOQ1MobWt0aW1lIHN0aW1lIHRpbWVzIHN5c2NvbmYpCiMgbWlzc2luZyBmcm9tIGhwLXV4CkFDX0NIRUNLX0ZVTkNTKGlmX25hbWV0b2luZGV4KQojIG1pc3NpbmcgZnJvbSBNaW5HVwpBQ19DSEVDS19GVU5DUyhjaG93biBsb2NhbHRpbWVfcikKCkFDX01TR19DSEVDS0lORyhbW2ZvciBTSU9DR0lGQUREUiBpbiBzeXMvaW9jdGwuaF1dKQpBQ19DQUNIRV9WQUwoY3Zfc3lzX2lvY3RsX2hfaGFzX1NJT0NHSUZBRERSLApbIEFDX0VHUkVQX0NQUCh4eHh5ZXN4eHgsClsKI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojZW5kaWYKI2lmZGVmIFNJT0NHSUZBRERSCnh4eHllc3h4eAojZW5kaWYKXSwgY3Zfc3lzX2lvY3RsX2hfaGFzX1NJT0NHSUZBRERSPXllcywgY3Zfc3lzX2lvY3RsX2hfaGFzX1NJT0NHSUZBRERSPW5vKV0pCkFDX01TR19SRVNVTFQoJGN2X3N5c19pb2N0bF9oX2hhc19TSU9DR0lGQUREUikKaWYgdGVzdCAkY3Zfc3lzX2lvY3RsX2hfaGFzX1NJT0NHSUZBRERSID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKFNZU19JT0NUTF9IX0hBU19TSU9DR0lGQUREUikKZmkKCiMgdWx0cml4CkFDX01TR19DSEVDS0lORyhbW2ZvciB0d28tYXJndW1lbnQgc3RhdGZzIHdpdGggc3RydWN0IGZzX2RhdGEgKFVsdHJpeCldXSkKQUNfQ0FDSEVfVkFMKGZ1X2N2X3N5c19zdGF0X2ZzX2RhdGEsCltBQ19UUllfUlVOKFsKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSEFWRV9TWVNfTU9VTlRfSAojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfRlNfVFlQRVNfSAojaW5jbHVkZSA8c3lzL2ZzX3R5cGVzLmg+CiNlbmRpZgptYWluICgpCnsKc3RydWN0IGZzX2RhdGEgZnNkOwovKiBVbHRyaXgncyBzdGF0ZnMgcmV0dXJucyAxIGZvciBzdWNjZXNzLAogICAwIGZvciBub3QgbW91bnRlZCwgLTEgZm9yIGZhaWx1cmUuICAqLwpleGl0IChzdGF0ZnMgKCIuIiwgJmZzZCkgIT0gMSk7Cn1dLApmdV9jdl9zeXNfc3RhdF9mc19kYXRhPXllcywKZnVfY3Zfc3lzX3N0YXRfZnNfZGF0YT1ubywKZnVfY3Zfc3lzX3N0YXRfZnNfZGF0YT1ubyldKQpBQ19NU0dfUkVTVUxUKCRmdV9jdl9zeXNfc3RhdF9mc19kYXRhKQppZiB0ZXN0ICRmdV9jdl9zeXNfc3RhdF9mc19kYXRhID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKFNUQVRfU1RBVEZTX0ZTX0RBVEEpCmZpCgojIGNoZWNrIGlmIGNvbXBpbGVyIHByZS1wcm9jZXNzb3IgZGVmaW5lcyBfX0ZVTkNUSU9OX18KQUNfQ0FDSEVfQ0hFQ0soaWYgX19GVU5DVElPTl9fIGlzIGRlZmluZWQsYWNfY3ZfSEFWRV9DUFBfVU5ERVJCQVJfRlVOQ1RJT05fREVGSU5FRCwKWwpBQ19UUllfQ09NUElMRSgsWwogICAgY2hhciAqY3AgPSBfX0ZVTkNUSU9OX187Cl0sIGFjX2N2X0hBVkVfQ1BQX1VOREVSQkFSX0ZVTkNUSU9OX0RFRklORUQ9eWVzLCBhY19jdl9IQVZFX0NQUF9VTkRFUkJBUl9GVU5DVElPTl9ERUZJTkVEPW5vKV0pCgppZiB0ZXN0ICJ4JGFjX2N2X0hBVkVfQ1BQX1VOREVSQkFSX0ZVTkNUSU9OX0RFRklORUQiID0gInh5ZXMiOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfQ1BQX1VOREVSQkFSX0ZVTkNUSU9OX0RFRklORUQpCmZpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBvbiBTQ08gVW5peHdhcmUgNy4xLjQgKFNDTyBjb21waWxlciksICJzdGF0aWMgaW5saW5lIiBmdW5jdGlvbnMKIyBhcmUgbm90IHN1cHBvcnRlZCwgc28gdGhpcyBkaXNhYmxlcyB0aGUgd2hvbGUgaW5saW5lIHRoaW5nIGlmIGl0CiMgZG9lc24ndCB3b3JrIHByb3Blcmx5LiBTaG91bGQgaGF2ZSBubyBlZmZlY3Qgb24gb3RoZXIgcGxhdGZvcm1zLgpBQ19DQUNIRV9DSEVDSyhbW3doZXRoZXIgc3RhdGljIGlubGluZSBmdW5jdGlvbnMgYXJlIGJyb2tlbiAoVW5peHdhcmUpXV0sCiAgICBbbmV0c25tcF9jdl9jX2Jyb2tlbl9pbmxpbmVdLApBQ19DT01QSUxFX0lGRUxTRShbWwpzdGF0aWMgaW5saW5lIGludCBuZXN0ZWRfaW5saW5lX2Z1bmN0aW9uKHZvaWQpIHsKICByZXR1cm4gMDsKfQppbmxpbmUgaW50IG1haW5faW5saW5lX2Z1bmN0aW9uKCB2b2lkICkgewogIHJldHVybiBuZXN0ZWRfaW5saW5lX2Z1bmN0aW9uKCk7Cn0KXV0sIG5ldHNubXBfY3ZfYnJva2VuX2lubGluZT1ubywgbmV0c25tcF9jdl9icm9rZW5faW5saW5lPXllcykpCgojIEJ1dCwgc2FkbHksIHRoZSB1c2FnZSBvZiBpbmxpbmUgaW4gTkVUX1NOTVAgZGlzYWdyZWVzIHNlcmlvdXNseSB3aXRoIGF0IGxlYXN0CiMgc29sYXJpczIsIHNvIGRpc2FibGUgaXQgZm9yIG5vdy4KY2FzZSAiJHRhcmdldF9vcyIgaW4KICAgIHNvbGFyaXMqKQogICAgICAgIG5ldHNubXBfY3ZfYnJva2VuX2lubGluZT15ZXMKICAgICAgICA7OwogICAgKikKICAgICAgICA7Owplc2FjCgppZiB0ZXN0ICIkbmV0c25tcF9jdl9icm9rZW5faW5saW5lIiA9IHllcyA7IHRoZW4KICBBQ19ERUZJTkUoTkVUU05NUF9CUk9LRU5fSU5MSU5FLCAxLAogICAgICAgIFtEZWZpbmUgaWYgc3RhdGljIGlubGluZSBmdW5jdGlvbnMgYXJlIHVuc3VwcG9ydGVkXSkKZmkKCiMgb3BlbmJzZCBzZWVtcyB0byBoYXZlIGRyb3BwZWQgbV9jbHVzdGVycyBhbmQgbV9jbGZyZWUgZnJvbSBtYnN0YXQKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZiBIQVZFX1NZU19NQlVGX0gKI2luY2x1ZGUgPHN5cy9tYnVmLmg+CiNlbmRpZgpdLCBtYnN0YXQsIG1fY2x1c3RlcnMsIG5vKQoKIyBvcGVuYnNkIHNlZW1zIHRvIGhhdmUgZHJvcHBlZCBtX21idWZzIGZyb20gbWJzdGF0IHRvbwpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmIEhBVkVfU1lTX01CVUZfSAojaW5jbHVkZSA8c3lzL21idWYuaD4KI2VuZGlmCl0sIG1ic3RhdCwgbV9tYnVmcywgbm8pCgoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KXSwgc2lnYWN0aW9uLCBzYV9zaWdhY3Rpb24sIG5vKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgpdLCB0bSwgdG1fZ210b2ZmLCBubykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxuZXQvaWYuaD4KI2lmZGVmIEhBVkVfTkVUX0lGX1ZBUl9ICiNpbmNsdWRlIDxuZXQvaWZfdmFyLmg+CiNlbmRpZgpdLCBpZm5ldCwgaWZfbXR1KQoKaWYgdGVzdCAieCRhY19jdl9zdHJ1Y3RfaWZuZXRfaGFzX2lmX210dSIgPSAieG5vIjsgdGhlbgpBQ19DQUNIRV9DSEVDSyhpZiBfS0VSTkVMIG5lZWRzIHRvIGJlIGRlZmluZWQgZm9yIGlmX210dSwgYWNfY3ZfSUZORVRfTkVFRFNfS0VSTkVMLApbCmlmIHRlc3QgIngkYWNfY3Zfc3RydWN0X2lmbmV0X2hhc19pZl9tdHUiID0gInh5ZXMiOyB0aGVuCiAgYWNfY3ZfSUZORVRfTkVFRFNfS0VSTkVMPW5vCmVsc2UKQUNfVFJZX0NPTVBJTEUoWwojZGVmaW5lIF9LRVJORUwgMQojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpZmRlZiBIQVZFX1NZU19USU1FX0gKI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNlbmRpZgojaW5jbHVkZSA8bmV0L2lmLmg+CiNpZmRlZiBIQVZFX05FVF9JRl9WQVJfSAojaW5jbHVkZSA8bmV0L2lmX3Zhci5oPgojZW5kaWYKXSxbCnN0cnVjdCBpZm5ldCB0ZXN0aXQ7CnRlc3RpdC5pZl9tdHUgPSAwOwpdLCBhY19jdl9JRk5FVF9ORUVEU19LRVJORUw9eWVzLCBhY19jdl9JRk5FVF9ORUVEU19LRVJORUw9bm8pCmZpCl0pCgppZiB0ZXN0ICJ4JGFjX2N2X0lGTkVUX05FRURTX0tFUk5FTCIgPSAieHllcyI7IHRoZW4KICBBQ19ERUZJTkUoSUZORVRfTkVFRFNfS0VSTkVMKQpmaQpmaQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIElGTkVUX05FRURTX0tFUk5FTAojZGVmaW5lIEtFUk5FTAojaWYgIWRlZmluZWQoX19EcmFnb25GbHlfXykKI2RlZmluZSBfS0VSTkVMIDEKI2VuZGlmCiNlbmRpZgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgpdLCBzb2NrYWRkciwgc2FfbGVuLCBubykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBJRk5FVF9ORUVEU19LRVJORUwKI2RlZmluZSBLRVJORUwKI2lmICFkZWZpbmVkKF9fRHJhZ29uRmx5X18pCiNkZWZpbmUgX0tFUk5FTCAxCiNlbmRpZgojZW5kaWYKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KXSwgc29ja2FkZHIsIHNhX3VuaW9uLnNhX2dlbmVyaWMuc2FfZmFtaWx5Miwgbm8pCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1RZUEVTX0gKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgpdLCBzb2NrYWRkcl9zdG9yYWdlLCBzc19mYW1pbHksIG5vKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKXSwgc29ja2FkZHJfc3RvcmFnZSwgX19zc19mYW1pbHksIG5vKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIElGTkVUX05FRURTX0tFUk5FTAojZGVmaW5lIEtFUk5FTAojaWYgIWRlZmluZWQoX19EcmFnb25GbHlfXykKI2RlZmluZSBfS0VSTkVMIDEKI2VuZGlmCiNlbmRpZgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSwgcnRlbnRyeSwgcnRfZHN0LCBubykKCiMgY2hlY2tpbmcgZm9yIDQuMyB2cyA0LjQgcnRlbnRyeS4KQUNfQ0FDSEVfQ0hFQ0sodHlwZSBvZiBydGVudHJ5IHN0cnVjdHVyZSxhY19jdl9SVEVOVFJZX1RZUEUsClsKCiMgNC40IGNvbXBhdApBQ19UUllfQ09NUElMRShbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIElGTkVUX05FRURTX0tFUk5FTAojZGVmaW5lIEtFUk5FTAojaWYgIWRlZmluZWQoX19EcmFnb25GbHlfXykKI2RlZmluZSBfS0VSTkVMIDEKI2VuZGlmCiNlbmRpZgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSxbCgojaWZuZGVmIFNUUlVDVF9SVEVOVFJZX0hBU19SVF9EU1QKI2RlZmluZSBydF9kc3QgcnRfbm9kZXMtPnJuX2tleQojZW5kaWYKCiAgc3RydWN0IHJ0ZW50cnkgcnQ7IAogIHJ0LnJ0X25vZGVzWzBdLnJuX2ZsYWdzID0gMTsKICBydC5ydF9kc3Q7CiAgXSwgYWNfY3ZfUlRFTlRSWV9UWVBFPSJCU0QtNC40IikKCiMgNC4zIGNvbXBhdAppZiB0ZXN0ICJ4JGFjX2N2X1JURU5UUllfVFlQRSIgPSAieCI7IHRoZW4KQUNfVFJZX0NPTVBJTEUoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBJRk5FVF9ORUVEU19LRVJORUwKI2RlZmluZSBLRVJORUwKI2lmICFkZWZpbmVkKF9fRHJhZ29uRmx5X18pCiNkZWZpbmUgX0tFUk5FTCAxCiNlbmRpZgojZW5kaWYKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI3VuZGVmIEtFUk5FTAojdW5kZWYgX0tFUk5FTAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+Cl0sWwpzdHJ1Y3QgcnRlbnRyeSBydDsgCnJ0LnJ0X2hhc2g7Cl0sIGFjX2N2X1JURU5UUllfVFlQRT0iQlNELTQuMyIpCmZpCgojIGVsc2UgYWNrLgppZiB0ZXN0ICJ4JGFjX2N2X1JURU5UUllfVFlQRSIgPSAieCI7IHRoZW4KICBBQ19NU0dfUkVTVUxUKFVua25vd24pCiAgYWNfY3ZfUlRFTlRSWV9UWVBFPSJ1bmtub3duIgpmaQoKXSkKCmlmIHRlc3QgIngkYWNfY3ZfUlRFTlRSWV9UWVBFIiA9ICJ4QlNELTQuNCI7IHRoZW4KICBBQ19ERUZJTkUoUlRFTlRSWV80XzQpCmZpCgojIGNoZWNraW5nIGZvciBhbHBoYSdzIG9ydGVudHJ5IHZzIHJ0ZW50cnkKaWYgdGVzdCAieCRhY19jdl9SVEVOVFJZX1RZUEUiID0gInh1bmtub3duIjsgdGhlbgpBQ19DQUNIRV9DSEVDSyhmb3Igc3RydWN0IHJ0ZW50cnksIGFjX2N2X3N0cnVjdF9ydGVudHJ5LApbQUNfRUdSRVBfQ1BQKG9ydGVudHJ5LCBbI2RlZmluZSBLRVJORUwKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpdLCAgYWNfY3Zfc3RydWN0X3J0ZW50cnk9b3J0ZW50cnksICBhY19jdl9zdHJ1Y3RfcnRlbnRyeT1ydGVudHJ5ICkKaWYgdGVzdCAieCRhY19jdl9zdHJ1Y3RfcnRlbnRyeSIgPSAieHJ0ZW50cnkiIDsgdGhlbgogIGFjX2N2X3N0cnVjdF9ydGVudHJ5PSJydGVudHJ5IgplbHNlCiAgYWNfY3Zfc3RydWN0X3J0ZW50cnk9Im9ydGVudHJ5IgpmaQpdKQplbHNlCiAgUlRFTlRSWV9UWVBFPSJydGVudHJ5IgogIGFjX2N2X3N0cnVjdF9ydGVudHJ5PSJydGVudHJ5IgpmaQoKaWYgdGVzdCAieCRhY19jdl9zdHJ1Y3RfcnRlbnRyeSIgIT0gIngiOyB0aGVuCiAgQUNfREVGSU5FX1VOUVVPVEVEKFJURU5UUlksc3RydWN0ICR7YWNfY3Zfc3RydWN0X3J0ZW50cnl9KQplbHNlCiAgQUNfREVGSU5FKFJURU5UUlksc3RydWN0IHJ0ZW50cnkpCmZpCgojIGNoZWNrIGZvciA0LjMncyBydGVudHJ5LT5ydF9uZXh0CmlmIHRlc3QgIngkYWNfY3ZfUlRFTlRSWV9UWVBFIiA9ICJ4QlNELTQuMyI7IHRoZW4KQUNfQ0FDSEVfQ0hFQ0soZm9yIHN0cnVjdCBydGVudHJ5IGhhcyBhIHJ0X25leHQgbm9kZSwgCglhY19jdl9zdHJ1Y3RfcnRlbnRyeV9ydF9uZXh0LApbCkFDX1RSWV9DT01QSUxFKFsKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSUZORVRfTkVFRFNfS0VSTkVMCiNkZWZpbmUgS0VSTkVMCiNpZiAhZGVmaW5lZChfX0RyYWdvbkZseV9fKQojZGVmaW5lIF9LRVJORUwgMQojZW5kaWYKI2VuZGlmCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiN1bmRlZiBLRVJORUwKI3VuZGVmIF9LRVJORUwKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpdLFsKc3RydWN0IHJ0ZW50cnkgcnQ7IApydC5ydF9uZXh0OwpdLCBhY19jdl9zdHJ1Y3RfcnRlbnRyeV9ydF9uZXh0PXllcywgIGFjX2N2X3N0cnVjdF9ydGVudHJ5X3J0X25leHQ9bm8gKQpdKQoKaWYgdGVzdCAieCRhY19jdl9zdHJ1Y3RfcnRlbnRyeV9ydF9uZXh0IiA9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShSVEVOVFJZX1JUX05FWFQpCmZpCgpmaQoKIyBDaGVjayBzaW42X3Njb3BlX2lkIG1lbWJlciBzcGVjaWZpZWQgaW4gUkZDMjU1MyBhZGRpdGlvbmFsbHkKQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHNvY2thZGRyX2luNi5zaW42X3Njb3BlX2lkXSwsLFsKQUNfSU5DTFVERVNfREVGQVVMVCgpClsjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKXV0pCgojIENoZWNrIHN0cnVjdCBydGVudHJ5IGZvciB2YXJpb3VzIHRoaW5ncy4KQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIElGTkVUX05FRURTX0tFUk5FTAojZGVmaW5lIEtFUk5FTAojaWYgIWRlZmluZWQoX19EcmFnb25GbHlfXykKI2RlZmluZSBfS0VSTkVMIDEKI2VuZGlmCiNlbmRpZgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojdW5kZWYgS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KXSwgcnRlbnRyeSwgcnRfdW5pdCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBJRk5FVF9ORUVEU19LRVJORUwKI2RlZmluZSBLRVJORUwKI2lmICFkZWZpbmVkKF9fRHJhZ29uRmx5X18pCiNkZWZpbmUgX0tFUk5FTCAxCiNlbmRpZgojZW5kaWYKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI3VuZGVmIEtFUk5FTAojdW5kZWYgX0tFUk5FTAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+Cl0sIHJ0ZW50cnksIHJ0X3JlZmNudCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBJRk5FVF9ORUVEU19LRVJORUwKI2RlZmluZSBLRVJORUwKI2lmICFkZWZpbmVkKF9fRHJhZ29uRmx5X18pCiNkZWZpbmUgX0tFUk5FTCAxCiNlbmRpZgojZW5kaWYKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI3VuZGVmIEtFUk5FTAojdW5kZWYgX0tFUk5FTAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+Cl0sIHJ0ZW50cnksIHJ0X2hhc2gpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSUZORVRfTkVFRFNfS0VSTkVMCiNkZWZpbmUgS0VSTkVMCiNpZiAhZGVmaW5lZChfX0RyYWdvbkZseV9fKQojZGVmaW5lIF9LRVJORUwgMQojZW5kaWYKI2VuZGlmCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiN1bmRlZiBLRVJORUwKI3VuZGVmIF9LRVJORUwKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgpdLCBydGVudHJ5LCBydF91c2UpCgojIENoZWNrIHRjcHN0YXQgZm9yIHRjcHN0YXQudGNwX3Jjdm1lbWRyb3AKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfU1lTX1RJTUVPVVRfSAojaW5jbHVkZSA8c3lzL3RpbWVvdXQuaD4KI2VuZGlmCiNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgojaWZkZWYgSEFWRV9ORVRJTkVUX1RDUF9USU1FUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcF90aW1lci5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX05FVElORVRfVENQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3RjcF92YXIuaD4KI2VuZGlmCl0sIHRjcHN0YXQsIHRjcF9yY3ZtZW1kcm9wKQoKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSUZORVRfTkVFRFNfS0VSTkVMCiNkZWZpbmUgS0VSTkVMCiNpZiAhZGVmaW5lZChfX0RyYWdvbkZseV9fKQojZGVmaW5lIF9LRVJORUwgMQojZW5kaWYKI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2VuZGlmCiNpbmNsdWRlIDxuZXQvaWYuaD4KI2lmZGVmIEhBVkVfTkVUX0lGX1ZBUl9ICiNpbmNsdWRlIDxuZXQvaWZfdmFyLmg+CiNlbmRpZgpdLCBpZmFkZHIsIGlmYV9uZXh0KQoKIyBDaGVjayBpZm5ldCBlbnRyaWVzIHVzaW5nIG1hY3JvIGRlZmluZWQgaW4gYWNsb2NhbC5tNC4KIwojIFhYWCAgQnJva2VuIG9uIEZyZWVCU0Qgd2hlcmUgdGhlc2UgYXJlICNkZWZpbmUnZCBpbiA8bmV0L2lmLmg+CiMKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX2JhdWRyYXRlKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfYmF1ZHJhdGUuaWZzX3ZhbHVlKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfc3BlZWQpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl90eXBlKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfaW1jYXN0cykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX2lxZHJvcHMpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9ub3Byb3RvKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfb21jYXN0cykKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX3huYW1lLG5vKQpBQ19DSEVDS19JRk5FVF9GT1IoaWZfbGFzdGNoYW5nZS50dl9zZWMpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9sYXN0Y2hhbmdlLnR2X25zZWMpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9vYnl0ZXMpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9pYnl0ZXMpCkFDX0NIRUNLX0lGTkVUX0ZPUihpZl9hZGRybGlzdCkKQUNfQ0hFQ0tfSUZORVRfRk9SKGlmX2FkZHJoZWFkLnRxaF9maXJzdCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX0gKI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHBfdmFyLmg+CiNlbmRpZgpdLHVkcHN0YXQsdWRwc19kaXNjYXJkKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9VRFBfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L3VkcF92YXIuaD4KI2VuZGlmCl0sdWRwc3RhdCx1ZHBzX25vcG9ydCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX0gKI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHBfdmFyLmg+CiNlbmRpZgpdLHVkcHN0YXQsdWRwc19ub3BvcnRiY2FzdCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfVURQX0gKI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX1VEUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC91ZHBfdmFyLmg+CiNlbmRpZgpdLHVkcHN0YXQsdWRwc19mdWxsc29jaykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpZmRlZiBIQVZFX1NZU19USU1FX0gKI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNlbmRpZgojaW5jbHVkZSA8bmV0L2lmLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CiNlbmRpZgpdLGFycGhkLGF0X25leHQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmIEhBVkVfU1lTX1RZUEVTX0gKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX0NPTkZfSAojaW5jbHVkZSA8c3lzL2NvbmYuaD4KI2VuZGlmCl0sc3dkZXZ0LHN3X25ibGtzZW5hYmxlZCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRGU19ICiNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVFZGU19ICiNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgojZW5kaWYKXSxzdGF0dmZzLG1udF9kaXIpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFURlNfSAojaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRWRlNfSAojaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KI2VuZGlmCl0sc3RhdHZmcyxmX2Zyc2l6ZSkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRGU19ICiNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVFZGU19ICiNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgojZW5kaWYKXSxzdGF0ZnMsZl9mcnNpemUpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFURlNfSAojaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRWRlNfSAojaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KI2VuZGlmCl0sc3RhdHZmcyxmX2ZpbGVzKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RBVEZTX0gKI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKI2luY2x1ZGUgPHN5cy9tb3VudC5oPgojZW5kaWYKXSxzdGF0ZnMsZl9maWxlcykKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUQVRGU19ICiNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2VuZGlmCl0sc3RhdGZzLGZfZmZyZWUpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVEFURlNfSAojaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfTU9VTlRfSAojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNlbmRpZgpdLHN0YXRmcyxmX2ZhdmFpbCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaWYgSEFWRV9OTElTVF9ICiNpbmNsdWRlIDxubGlzdC5oPgojZW5kaWYKXSxubGlzdCxuX3ZhbHVlKQoKIyBzdHJ1Y3Qgbmxpc3Q2NCAoSVJJWCkKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpZiBIQVZFX1NZU19UWVBFU19ICiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2VuZGlmCiNpZiBIQVZFX05MSVNUX0gKI2luY2x1ZGUgPG5saXN0Lmg+CiNlbmRpZgpdLG5saXN0NjQsIG5fdmFsdWUpCgojIHN0cnVjdCBldGh0b29sX2NtZApBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3QgZXRodG9vbF9jbWQuc3BlZWRfaGldLCwsWwogICAgQUNfSU5DTFVERVNfREVGQVVMVCgpCiAgICBbCiNpZmRlZiBIQVZFX0xJTlVYX0VUSFRPT0xfSAojaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgojZW5kaWYKICAgIF1dKQoKIyBjaGVjayBzdHJ1Y3QgaXBzdGF0IGZvciB2YXJpb3VzIHRoaW5ncwpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19jYW50Zm9yd2FyZCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX2NhbnRmcmFnKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfZGVsaXZlcmVkKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfZnJhZ2Ryb3BwZWQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19mcmFndGltZW91dCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX2ZyYWdtZW50ZWQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19sb2NhbG91dCkKCkFDX0NIRUNLX1NUUlVDVF9GT1IoWwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCl0sIGlwc3RhdCwgaXBzX25vcHJvdG8pCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19ub3JvdXRlKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfb2Ryb3BwZWQpCgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgpdLCBpcHN0YXQsIGlwc19vZnJhZ21lbnRzKQoKQUNfQ0hFQ0tfU1RSVUNUX0ZPUihbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKXSwgaXBzdGF0LCBpcHNfcmVhc3NlbWJsZWQpCgojIGNoZWNrIGZvciB0aGUgZGVzX2tzX3N0cnVjdC53ZWFrX2tleSBhdHRyaWJ1dGUsIHdoaWNoIGluZGljYXRlcyB0aGUgCiMgb2xkZXIgb3BlbnNzbCB2ZXJzaW9uIGlzIGJlaW5nIHVzZWQuCmlmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX29wZW5zc2xfZGVzX2giID0gInh5ZXMiIDsgdGhlbgpBQ19DSEVDS19TVFJVQ1RfRk9SKFsKI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+Cl0sIGRlc19rc19zdHJ1Y3QsIHdlYWtfa2V5KQpmaQoKIyBhdHRlbXB0IHRvIGZpZ3VyZSBvdXQgaWYgc3lzY3RsIGlzIHVzYWJsZQoKaWYgdGVzdCAkY3Jvc3NfY29tcGlsaW5nID0geWVzOyB0aGVuCiAgQUNfTVNHX1dBUk4oW0Nhbid0IGNoZWNrIHN5c2N0bCwgbWFudWFsbHkgZGVmaW5lIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgaWYgcGxhdGZvcm0gc3VwcG9ydCBhdmFpbGFibGVdKQplbHNlCiAgQUNfQ0FDSEVfQ0hFQ0soaWYgc3lzY3RsIGNhbiByZWFkIGtlcm5lbCBpbmZvcm1hdGlvbixhY19jdl9ORVRTTk1QX0NBTl9VU0VfU1lTQ1RMLAogIFtBQ19UUllfUlVOKFsKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfUEFSQU1fSAojIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9TWVNfU1lTQ1RMX0gKIyBpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNlbmRpZgoKbWFpbigpIHsKICBpbnQgICAgICAgICAgICAgICAgIG1pYlsyXTsKICBzaXplX3QgICAgICAgICAgICAgIGxlbjsKICBzdHJ1Y3QgdGltZXZhbCBib290dGltZTsKICAKICBtaWJbMF0gPSBDVExfS0VSTjsKICBtaWJbMV0gPSBLRVJOX0JPT1RUSU1FOwogIAogIGxlbiA9IHNpemVvZihib290dGltZSk7CiAgc3lzY3RsKG1pYiwgMiwgJmJvb3R0aW1lLCAmbGVuLCBOVUxMLCBOVUxMKTsKICBpZiAoYm9vdHRpbWUudHZfc2VjICE9IDApCiAgICBleGl0KDApOwogIGVsc2UKICAgIGV4aXQoMSk7Cn0KICBdLCBhY19jdl9ORVRTTk1QX0NBTl9VU0VfU1lTQ1RMPXllcywgYWNfY3ZfTkVUU05NUF9DQU5fVVNFX1NZU0NUTD1ubywgYWNfY3ZfTkVUU05NUF9DQU5fVVNFX1NZU0NUTD1ubyldKQpmaQoKaWYgdGVzdCAieCRhY19jdl9ORVRTTk1QX0NBTl9VU0VfU1lTQ1RMIiA9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKQpmaQoKIwojIEluIEZyZWVCU0QgNC54LCB0aGUgVENQIHRpbWVyIGNvbnN0YW50cyBhcmVuJ3QuICBUaGV5IGFyZSBkZWZpbmVkCiMgaW4gdGVybXMgb2YgJ2h6JywgdGhlIGtlcm5lbCBjbG9jayB0aWNrLiAgSW4gdGhpcyBjYXNlLAojIHdlIG5lZWQgdG8gaGF2ZSBhIGxvY2FsIHZhcmlhYmxlICdoeicgaW4gc2NvcGUgYW5kIHNldCB0byBhIHVzZWZ1bAojIHZhbHVlIHdoZW5ldmVyIHdlIHVzZSBvbmUgb2YgdGhlc2UgY29uc3RhbnRzLgojCkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgVENQIHRpbWVycyBkZXBlbmQgb24gJ2h6JyxhY19jdl9UQ1BUVl9ORUVEU19IWiwKW0FDX0VHUkVQX0NQUChoeiwKWyNpbmNsdWRlIDxuZXRpbmV0L3RjcF90aW1lci5oPgpUQ1BUVl9TUlRUREZMVApdLCBhY19jdl9UQ1BUVl9ORUVEU19IWj15ZXMsIGFjX2N2X1RDUFRWX05FRURTX0haPW5vKV0pCgppZiB0ZXN0ICJ4JGFjX2N2X1RDUFRWX05FRURTX0haIiA9ICJ4eWVzIjsgdGhlbgogIEFDX0RFRklORShUQ1BUVl9ORUVEU19IWikKZmkKCiMKIyBkZWZpbmUgdGhlIGFnZW50IGxpYnJhcmllcyB2YXJpYWJsZXMKIwpBQ19TVUJTVChMTUlCTElCUykKQUNfU1VCU1QoQUdFTlRMSUJTKQpBQ19TVUJTVChPVEhFUkFHRU5UTElCT0JKUykKQUNfU1VCU1QoT1RIRVJBR0VOVExJQkxPQkpTKQoKIwojIFByb21wdCBmb3IgdmFyaW91cyBiaXRzIG9mIHVzZXIgaW5mb3JtYXRpb24KIwoKaWYgdGVzdCAieCRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0xPR0ZJTEUiID0gIngiIC1vICJ4JGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfU1lTX0xPQyIgPSAieCIgLW8gIngkYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9TWVNfQ09OVEFDVCIgPSAieCIgLW8gIngkYWNfY3ZfdXNlcl9wcm9tcHRfTkVUU05NUF9ERUZBVUxUX1NOTVBfVkVSU0lPTiIgPSAieCI7IHRoZW4KQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciB0byBwcm9tcHQgZm9yIHZhbHVlcywgYWNfY3ZfaGF2ZV93YXJuZWQsClsKaWYgdGVzdCAieCRkZWZhdWx0cyIgPSAieG5vIjsgdGhlbgpjYXQgPDwgRU9GCgoJICoqKioqKioqKioqKioqIENvbmZpZ3VyYXRpb24gU2VjdGlvbiAqKioqKioqKioqKioqKgoKCVlvdSBhcmUgYWJvdXQgdG8gYmUgcHJvbXB0ZWQgd2l0aCBhIHNlcmllcyBvZiBxdWVzdGlvbnMuICBBbnN3ZXIKdGhlbSBjYXJlZnVsbHksIGFzIHRoZXkgZGV0ZXJtaW5lIGhvdyB0aGUgU05NUCBhZ2VudCBhbmQgcmVsYXRlZAphcHBsaWNhdGlvbnMgYXJlIHRvIGZ1bmN0aW9uLgoKCUFmdGVyIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmlzaGVzLCB5b3UgY2FuIGJyb3dzZSB0aGUgbmV3bHkKY3JlYXRlZCBuZXQtc25tcC1jb25maWcuaCBmaWxlIGZvciBmdXJ0aGVyIC0gbGVzcyBpbXBvcnRhbnQgLSBwYXJhbWV0ZXJzIHRvCm1vZGlmeS4gIEJlIGNhcmVmdWwgaWYgeW91IHJlLXJ1biBjb25maWd1cmUgdGhvdWdoLCBzaW5jZSBuZXQtc25tcC1jb25maWcuaCAKd2lsbCBiZSBvdmVyd3JpdHRlbi4KCi1QcmVzcyByZXR1cm4gdG8gY29udGludWUtCkVPRgoKcmVhZCB0bXBpbnB1dAphY19jdl9oYXZlX3dhcm5lZD0ieWVzIgplbHNlCiAgYWNfY3ZfaGF2ZV93YXJuZWQ9Im5vIgpmaQpdKQplbHNlCiAgYWNfY3ZfaGF2ZV93YXJuZWQ9InllcyIKZmkKCk1FPWAkV0hPQU1JYAppZiB0ZXN0IC1mIC9ldGMvcmVzb2x2LmNvbmY7IHRoZW4KICBMT0M9YGNhdCAvZXRjL3Jlc29sdi5jb25mIHwgZ3JlcCAnXmRvbWFpbicgfCB0YWlsIC0xIHwgYXdrICd7cHJpbnQgJE5GfSdgCmVsc2UKICBMT0M9IkBuby53aGVyZSIKZmkKCkFDX1BST01QVF9VU0VSKE5FVFNOTVBfREVGQVVMVF9TTk1QX1ZFUlNJT04sWwoKKioqIERlZmF1bHQgU05NUCBWZXJzaW9uOgoKCVN0YXJ0aW5nIHdpdGggTmV0LVNOTVAgNS4wLCB5b3UgY2FuIGNob29zZSB0aGUgZGVmYXVsdCB2ZXJzaW9uIG9mCnRoZSBTTk1QIHByb3RvY29sIHRvIHVzZSB3aGVuIG5vIHZlcnNpb24gaXMgZ2l2ZW4gZXhwbGljaXRseSBvbiB0aGUKY29tbWFuZCBsaW5lLCBvciB2aWEgYW4gJ3NubXAuY29uZicgZmlsZS4gIEluIHRoZSBwYXN0IHRoaXMgd2FzIHNldCB0bwpTTk1QdjEsIGJ1dCB5b3UgY2FuIHVzZSB0aGlzIHRvIHN3aXRjaCB0byBTTk1QdjMgaWYgZGVzaXJlZC4gIFNOTVB2Mwp3aWxsIHByb3ZpZGUgYSBtb3JlIHNlY3VyZSBtYW5hZ2VtZW50IGVudmlyb25tZW50IChhbmQgdGh1cyB5b3UncmUKZW5jb3VyYWdlZCB0byBzd2l0Y2ggdG8gU05NUHYzKSwgYnV0IG1heSBicmVhayBleGlzdGluZyBzY3JpcHRzIHRoYXQKcmVseSBvbiB0aGUgb2xkIGJlaGF2aW91ci4gIChUaG91Z2ggc3VjaCBzY3JpcHRzIHdpbGwgcHJvYmFibHkgbmVlZCB0bwpiZSBjaGFuZ2VkIHRvIHVzZSB0aGUgJy1jJyBjb21tdW5pdHkgZmxhZyBhbnl3YXksIGFzIHRoZSBTTk1QdjEKY29tbWFuZCBsaW5lIHVzYWdlIGhhcyBjaGFuZ2VkIGFzIHdlbGwuKS4KICAgQXQgdGhpcyBwcm9tcHQgeW91IGNhbiBzZWxlY3QgXCIxXCIsIFwiMlwiIChmb3IgU05NUHYyYyksIG9yIFwiM1wiIGFzCnRoZSBkZWZhdWx0IHZlcnNpb24gZm9yIHRoZSBjb21tYW5kIHRvb2xzIChzbm1wZ2V0LCAuLi4pIHRvIHVzZS4gIFRoaXMKY2FuIGFsd2F5cyBiZSBvdmVycmlkZGVuIGF0IHJ1bnRpbWUgdXNpbmcgdGhlIC12IGZsYWcgdG8gdGhlIHRvb2xzLCBvcgpieSB1c2luZyB0aGUgXCJkZWZWZXJzaW9uXCIgdG9rZW4gaW4geW91ciBzbm1wLmNvbmYgZmlsZS4KICAgUHJvdmlkaW5nIHRoZSAtLXdpdGgtZGVmYXVsdC1zbm1wLXZlcnNpb249XCJ4XCIgcGFyYW1ldGVyIHRvIC4vY29uZmlndXJlCndpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpEZWZhdWx0IHZlcnNpb24gb2YgU05NUCB0byB1c2VdLDMsdW5xdW90ZWQpCgojIHdlIHRlc3RlZCB0aGlzIGFib3ZlIGJlZm9yZSB0aGUgcHJvbXB0LCBidXQgdGhlIHByb21wdCBtYXkgZ2l2ZSBhIG5ldyB2YWx1ZS4KaWYgdGVzdCAiJGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfREVGQVVMVF9TTk1QX1ZFUlNJT04iID0gIjJjIjsgdGhlbgogIGFjX2N2X3VzZXJfcHJvbXB0X05FVFNOTVBfREVGQVVMVF9TTk1QX1ZFUlNJT049IjIiCmZpCmlmIHRlc3QgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMSIgLWEgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMiIgLWEgIiRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX0RFRkFVTFRfU05NUF9WRVJTSU9OIiAhPSAiMyI7IHRoZW4KICBBQ19NU0dfRVJST1IoW0lsbGVnYWwgdmVyc2lvbiBudW1iZXIuICBPbmx5IDEsIDIgKGZvciBTTk1QdjJjKSBhbmQgMyBhcmUgc3VwcG9ydGVkLl0pCmZpCgpBQ19QUk9NUFRfVVNFUihORVRTTk1QX1NZU19DT05UQUNULFsKCioqKiBTeXN0ZW0gQ29udGFjdCBJbmZvcm1hdGlvbjoKCglEZXNjcmliZXMgd2hvIHNob3VsZCBiZSBjb250YWN0ZWQgYWJvdXQgdGhlIGhvc3QgdGhlIGFnZW50IGlzCnJ1bm5pbmcgb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgTUlCLUlJIHRyZWUuICBUaGlzCmNhbiBhbHNvIGJlIG92ZXItcmlkZGVuIHVzaW5nIHRoZSBcInN5c2NvbnRhY3RcIiBzeW50YXggaW4gdGhlIGFnZW50J3MKY29uZmlndXJhdGlvbiBmaWxlcy4KICBQcm92aWRpbmcgdGhlIC0td2l0aC1zeXMtY29udGFjdD1cImNvbnRhY3RcIiBwYXJhbWV0ZXIgdG8gLi9jb25maWd1cmUKd2lsbCBhdm9pZCB0aGlzIHByb21wdC4KClN5c3RlbSBDb250YWN0IEluZm9ybWF0aW9uXSwkTUVAJExPQyxxdW90ZWQpCgpBQ19QUk9NUFRfVVNFUihORVRTTk1QX1NZU19MT0MsWwoKKioqIFN5c3RlbSBMb2NhdGlvbjoKCglEZXNjcmliZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeXN0ZW0uICBUaGlzIGluZm9ybWF0aW9uIGlzCmF2YWlsYWJsZSBpbiB0aGUgTUlCLUlJIHRyZWUuICB0aGlzIGNhbiBhbHNvIGJlIG92ZXItcmlkZGVuIHVzaW5nIHRoZQpcInN5c2xvY2F0aW9uXCIgc3ludGF4IGluIHRoZSBhZ2VudCdzIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiAgUHJvdmlkaW5nIHRoZSAtLXdpdGgtc3lzLWxvY2F0aW9uPVwibG9jYXRpb25cIiBwYXJhbWV0ZXIgdG8gLi9jb25maWd1cmUKd2lsbCBhdm9pZCB0aGlzIHByb21wdC4KClN5c3RlbSBMb2NhdGlvbl0sVW5rbm93bixxdW90ZWQpCgppZiB0ZXN0IC1kIC92YXIvbG9nOyB0aGVuCiAgZGVmYXVsdGxvZz0iL3Zhci9sb2cvc25tcGQubG9nIgplbHNlCiAgZGVmYXVsdGxvZz0iL3Vzci9hZG0vc25tcGQubG9nIgpmaQogIApBQ19QUk9NUFRfVVNFUihORVRTTk1QX0xPR0ZJTEUsWwoKKioqIExvZ2ZpbGUgbG9jYXRpb246CgoJRW50ZXIgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRoZSBzbm1wZCBhZ2VudCB0byBkdW1wCmluZm9ybWF0aW9uICYgZXJyb3JzIHRvLiAgSWYgbm90IGRlZmluZWQgKGVudGVyIHRoZSBrZXl3b3JkIFwibm9uZVwiCmF0IHRoZSBwcm9tcHQgYmVsb3cpIHRoZSBhZ2VudCB3aWxsIHVzZSBzdGRvdXQgYW5kIHN0ZGVyciBpbnN0ZWFkLgooTm90ZTogVGhpcyB2YWx1ZSBjYW4gYmUgb3Zlci1yaWRkZW4gdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMuKQogIFByb3ZpZGluZyB0aGUgLS13aXRoLWxvZ2ZpbGU9XCJwYXRoXCIgcGFyYW1ldGVyIHRvIC4vY29uZmlndXJlCndpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpMb2NhdGlvbiB0byB3cml0ZSBsb2dmaWxlXSwkZGVmYXVsdGxvZyxxdW90ZWQpCgppZiB0ZXN0IC1kIC92YXI7IHRoZW4KICBkZWZhdWx0c3RvcmU9Ii92YXIvbmV0LXNubXAiCiAgdWNkZGVmYXVsdHN0b3JlPSIvdmFyL3VjZC1zbm1wIgplbHNlCiAgZGVmYXVsdHN0b3JlPSIvZXRjL25ldC1zbm1wIgogIHVjZGRlZmF1bHRzdG9yZT0iL2V0Yy91Y2Qtc25tcCIKZmkKICAKQUNfUFJPTVBUX1VTRVIoTkVUU05NUF9QRVJTSVNURU5UX0RJUkVDVE9SWSxbCgoqKiogc25tcGQgcGVyc2lzdGVudCBzdG9yYWdlIGxvY2F0aW9uOgoKCUVudGVyIGEgZGlyZWN0b3J5IGZvciB0aGUgU05NUCBsaWJyYXJ5IHRvIHN0b3JlIHBlcnNpc3RlbnQKZGF0YSBpbiB0aGUgZm9ybSBvZiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoaXMgZGVmYXVsdCBsb2NhdGlvbiBpcwpkaWZmZXJlbnQgdGhhbiB0aGUgb2xkIGRlZmF1bHQgbG9jYXRpb24gKHdoaWNoIHdhcyBmb3IgdWNkLXNubXApLiAgSWYKeW91IHN0YXkgd2l0aCB0aGUgbmV3IHBhdGgsIEknbGwgYXNrIHlvdSBpbiBhIHNlY29uZCBpZiB5b3Ugd2lzaCB0bwpjb3B5IHlvdXIgZmlsZXMgb3ZlciB0byB0aGUgbmV3IGxvY2F0aW9uIChvbmNlIG9ubHkpLiAgSWYgeW91IHBpY2sKc29tZSBvdGhlciBwYXRoIHRoYW4gdGhlIGRlZmF1bHQsIHlvdSdsbCBoYXZlIHRvIGNvcHkgdGhlbSB5b3Vyc2VsZi4KVGhlcmUgaXMgbm90aGluZyB3cm9uZyB3aXRoIHBpY2tpbmcgdGhlIG9sZCBwYXRoICgkdWNkZGVmYXVsdHN0b3JlKSBpZgp5b3UnZCByYXRoZXIuCiAgUHJvdmlkaW5nIHRoZSAtLXdpdGgtcGVyc2lzdGVudC1kaXJlY3Rvcnk9XCJwYXRoXCIgcGFyYW1ldGVyIHRvCi4vY29uZmlndXJlIHdpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpMb2NhdGlvbiB0byB3cml0ZSBwZXJzaXN0ZW50IGluZm9ybWF0aW9uXSwkZGVmYXVsdHN0b3JlLHF1b3RlZCkKClBFUlNJU1RFTlRfRElSRUNUT1JZPSRhY19jdl91c2VyX3Byb21wdF9ORVRTTk1QX1BFUlNJU1RFTlRfRElSRUNUT1JZCkFDX1NVQlNUKFBFUlNJU1RFTlRfRElSRUNUT1JZKQpVQ0RQRVJTSVNURU5UX0RJUkVDVE9SWT0kdWNkZGVmYXVsdHN0b3JlCkFDX1NVQlNUKFVDRFBFUlNJU1RFTlRfRElSRUNUT1JZKQoKaWYgdGVzdCAkUEVSU0lTVEVOVF9ESVJFQ1RPUlkgPSAiJGRlZmF1bHRzdG9yZSIgLWEgLWQgIiR1Y2RkZWZhdWx0c3RvcmUiIC1hICEgLWQgIiRkZWZhdWx0c3RvcmUiIDsgdGhlbgpBQ19DQUNIRV9DSEVDSyhJZiB3ZSBzaG91bGQgY29weSB0aGUgb2xkIHBlcnNpc3RlbnQgZGlyZWN0b3J5LCBhY19jdl91c2VyX3Byb21wdF9DT1BZX1BFUlNJU1RFTlRfRklMRVMsClsKQUNfUFJPTVBUX1VTRVJfTk9fREVGSU5FKGFjX2N2X3VzZXJfcHJvbXB0X0NPUFlfUEVSU0lTVEVOVF9GSUxFUyxbCgoqKiogQ29weWluZyBvbGQgdWNkLXNubXAgcGVyc2lzdGVudCBmaWxlcyB0byBuZXQtc25tcCBwZXJzaXN0ZW50IGRpcmVjdG9yeToKCglXb3VsZCB5b3UgbGlrZSB0byBjb3B5IHRoZSBvbGRlciB1Y2Qtc25tcCBwZXJzaXN0ZW50IGZpbGVzCmludG8geW91ciBuZXcgbmV0LXNubXAgcGVyc2lzdGVudCBmaWxlIHBhdGg/ICBUaGlzIHdpbGwgZnVuY3Rpb25hbGx5CnNhdmUgYWxsIHlvdXIgdWNkLXNubXAgZGF0YSBhbmQgbGV0IGl0IGJlIHVzZWQgd2l0aGluIHRoZSBuZXQtc25tcAp0b29scy4gIFRoaXMgd2lsbCBvbmx5IGJlIGRvbmUgb25jZSB3aGVuIHlvdSBydW4gbWFrZSBpbnN0YWxsLiAgSWYgeW91Cndpc2ggdG8gZG8gdGhpcywgZW50ZXIgInllcyIgYXQgdGhlIHByb21wdC4KICBQcm92aWRpbmcgdGhlIC0td2l0aC1jb3B5LXBlcnNpc3RlbnQtZmlsZXM9XCJub1wiIChvciBcInllc1wiKQpwYXJhbWV0ZXJzIHRvIC4vY29uZmlndXJlIHdpbGwgYXZvaWQgdGhpcyBwcm9tcHQuCgpDb3B5IHVjZC1zbm1wIGRhdGEgaW50byB0aGUgbmV0LXNubXAgZGF0YSBkaXJlY3RvcnldLCJ5ZXMiKQpdKQplbHNlCmFjX2N2X3VzZXJfcHJvbXB0X0NPUFlfUEVSU0lTVEVOVF9GSUxFUz0ibm8iCmZpCkNPUFlfUEVSU0lTVEVOVF9GSUxFUz0iJGFjX2N2X3VzZXJfcHJvbXB0X0NPUFlfUEVSU0lTVEVOVF9GSUxFUyIKQUNfU1VCU1QoQ09QWV9QRVJTSVNURU5UX0ZJTEVTKQoKQUNfU1VCU1QoRExMSUJTKQoKQUNfQ09ORklHX0ZJTEVTKFtNYWtlZmlsZTpNYWtlZmlsZS50b3A6TWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXNdKQpBQ19DT05GSUdfRklMRVMoW3NubXBsaWIvTWFrZWZpbGU6TWFrZWZpbGUudG9wOnNubXBsaWIvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXM6c25tcGxpYi9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FwcHMvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmFwcHMvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXM6YXBwcy9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FwcHMvc25tcG5ldHN0YXQvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmFwcHMvc25tcG5ldHN0YXQvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXM6YXBwcy9zbm1wbmV0c3RhdC9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FnZW50L01ha2VmaWxlOk1ha2VmaWxlLnRvcDphZ2VudC9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlczphZ2VudC9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FnZW50L2hlbHBlcnMvTWFrZWZpbGU6TWFrZWZpbGUudG9wOmFnZW50L2hlbHBlcnMvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXM6YWdlbnQvaGVscGVycy9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2FnZW50L21pYmdyb3VwL01ha2VmaWxlOk1ha2VmaWxlLnRvcDphZ2VudC9taWJncm91cC9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlczphZ2VudC9taWJncm91cC9NYWtlZmlsZS5kZXBlbmRdKQpBQ19DT05GSUdfRklMRVMoW2xvY2FsL01ha2VmaWxlOk1ha2VmaWxlLnRvcDpsb2NhbC9NYWtlZmlsZS5pbjpNYWtlZmlsZS5ydWxlc10pCkFDX0NPTkZJR19GSUxFUyhbdGVzdGluZy9NYWtlZmlsZTpNYWtlZmlsZS50b3A6dGVzdGluZy9NYWtlZmlsZS5pbl0pCkFDX0NPTkZJR19GSUxFUyhbbWFuL01ha2VmaWxlOk1ha2VmaWxlLnRvcDptYW4vTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXNdKQpBQ19DT05GSUdfRklMRVMoW21pYnMvTWFrZWZpbGU6TWFrZWZpbGUudG9wOm1pYnMvTWFrZWZpbGUuaW46TWFrZWZpbGUucnVsZXNdKQpBQ19DT05GSUdfRklMRVMoW25ldC1zbm1wLWNvbmZpZzpuZXQtc25tcC1jb25maWcuaW5dLAoJCVtjaG1vZCAreCBuZXQtc25tcC1jb25maWddKQoKQUNfQ09ORklHX0NPTU1BTkRTKFtkZWZhdWx0XSwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oKQoKIwojIHByb3RlY3QgUEFDS0FHRV8qIHZhcmlhYmxlcwojCkFIX1ZFUkJBVElNKFtQQUNLQUdFX0JVR1JFUE9SVF0sWy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwojaWZuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCiN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAojZW5kaWZdKQpBSF9WRVJCQVRJTShbUEFDS0FHRV9OQU1FXSxbLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwojaWZuZGVmIFBBQ0tBR0VfTkFNRQojdW5kZWYgUEFDS0FHRV9OQU1FCiNlbmRpZl0pCkFIX1ZFUkJBVElNKFtQQUNLQUdFX1NUUklOR10sWy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KI2lmbmRlZiBQQUNLQUdFX1NUUklORwojdW5kZWYgUEFDS0FHRV9TVFJJTkcKI2VuZGlmXSkKQUhfVkVSQkFUSU0oW1BBQ0tBR0VfVEFSTkFNRV0sWy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KI2lmbmRlZiBQQUNLQUdFX1RBUk5BTUUKI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQojZW5kaWZdKQpBSF9WRVJCQVRJTShbUEFDS0FHRV9WRVJTSU9OXSxbLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KI2lmbmRlZiBQQUNLQUdFX1ZFUlNJT04KI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgojZW5kaWZdKQoKQUNfT1VUUFVUCgpBQ19NU0dfQ0FDSEVfRElTUExBWSgpCiMgTG9jYWwgVmFyaWFibGVzOgojIG1vZGU6IEF1dG9jb25mCiMgY29tbWVudC1zdGFydDogIiMiCiMgRW5kOgo=