LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfZGJhY2Nlc3MuaHh4IgojaW5jbHVkZSAiSHRtbFJlYWRlci5oeHgiCiNpbmNsdWRlIDxjb25uZWN0aXZpdHkvZGJjb252ZXJzaW9uLmh4eD4KI2luY2x1ZGUgPGNvbm5lY3Rpdml0eS9kYnRvb2xzLmh4eD4KI2luY2x1ZGUgPHRvb2xzL3RlbmNjdnQuaHh4PgojaW5jbHVkZSA8Y29tcGhlbHBlci9leHRyYWN0Lmh4eD4KI2luY2x1ZGUgImRidV9taXNjLmhyYyIKI2luY2x1ZGUgImRidXN0cmluZ3MuaHJjIgojaW5jbHVkZSA8c2Z4Mi9zZnhodG1sLmh4eD4KI2luY2x1ZGUgPHRvb2xzL2RlYnVnLmh4eD4KI2luY2x1ZGUgPHRvb2xzL3RlbmNjdnQuaHh4PgojaW5jbHVkZSAibW9kdWxlZGJ1Lmh4eCIKI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9zZGJjeC9YRGF0YURlc2NyaXB0b3JGYWN0b3J5LmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9zZGJjeC9YQ29sdW1uc1N1cHBsaWVyLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9zZGJjeC9YQXBwZW5kLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9zZGJjL0RhdGFUeXBlLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9zZGJjL0NvbHVtblZhbHVlLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9hd3QvRm9udERlc2NyaXB0b3IuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL2F3dC9Gb250V2VpZ2h0LmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9hd3QvRm9udFN0cmlrZW91dC5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvYXd0L0ZvbnRTbGFudC5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvYXd0L0ZvbnRVbmRlcmxpbmUuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL3V0aWwvTnVtYmVyRm9ybWF0LmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci91dGlsL1hOdW1iZXJGb3JtYXRUeXBlcy5ocHA+CiNpbmNsdWRlIDxzdnRvb2xzL2h0bWx0b2tuLmg+CiNpbmNsdWRlIDxzdnRvb2xzL2h0bWxreXdkLmh4eD4KI2luY2x1ZGUgPHRvb2xzL2NvbG9yLmh4eD4KI2luY2x1ZGUgIldDb3B5VGFibGUuaHh4IgojaW5jbHVkZSAiV0V4dGVuZFBhZ2VzLmh4eCIKI2luY2x1ZGUgIldOYW1lTWF0Y2guaHh4IgojaW5jbHVkZSAiV0NvbHVtblNlbGVjdC5oeHgiCiNpbmNsdWRlICJRRW51bVR5cGVzLmh4eCIKI2luY2x1ZGUgIldDUGFnZS5oeHgiCiNpbmNsdWRlIDx0b29scy9pbmV0bWltZS5oeHg+CiNpbmNsdWRlIDxzdmwvaW5ldHR5cGUuaHh4PgojaW5jbHVkZSA8cnRsL3RlbmNpbmZvLmg+CiNpbmNsdWRlICJVSVRvb2xzLmh4eCIKI2luY2x1ZGUgPHZjbC9zdmFwcC5oeHg+CiNpbmNsdWRlIDxydGwvbG9nZmlsZS5oeHg+Cgp1c2luZyBuYW1lc3BhY2UgZGJhdWk7CnVzaW5nIG5hbWVzcGFjZSA6OmNvbTo6c3VuOjpzdGFyOjp1bm87CnVzaW5nIG5hbWVzcGFjZSA6OmNvbTo6c3VuOjpzdGFyOjpiZWFuczsKdXNpbmcgbmFtZXNwYWNlIDo6Y29tOjpzdW46OnN0YXI6OmNvbnRhaW5lcjsKdXNpbmcgbmFtZXNwYWNlIDo6Y29tOjpzdW46OnN0YXI6OnNkYmM7CnVzaW5nIG5hbWVzcGFjZSA6OmNvbTo6c3VuOjpzdGFyOjpzZGJjeDsKdXNpbmcgbmFtZXNwYWNlIDo6Y29tOjpzdW46OnN0YXI6OmF3dDsKCiNkZWZpbmUgREJBVUlfSFRNTF9GT05UU0laRVMJOAkJLy8gd2llIEV4cG9ydCwgSFRNTC1PcHRpb25zCiNkZWZpbmUgSFRNTF9NRVRBX05PTkUJCQkwCiNkZWZpbmUgSFRNTF9NRVRBX0FVVEhPUgkJMQojZGVmaW5lIEhUTUxfTUVUQV9ERVNDUklQVElPTgkyCiNkZWZpbmUgSFRNTF9NRVRBX0tFWVdPUkRTCQkzCiNkZWZpbmUgSFRNTF9NRVRBX1JFRlJFU0gJCTQKI2RlZmluZSBIVE1MX01FVEFfQ0xBU1NJRklDQVRJT04gNQojZGVmaW5lIEhUTUxfTUVUQV9DUkVBVEVECQk2CiNkZWZpbmUgSFRNTF9NRVRBX0NIQU5HRURCWQkJNwojZGVmaW5lIEhUTUxfTUVUQV9DSEFOR0VECQk4CiNkZWZpbmUgSFRNTF9NRVRBX0dFTkVSQVRPUgkJOQojZGVmaW5lIEhUTUxfTUVUQV9TREZPT1ROT1RFCTEwCiNkZWZpbmUgSFRNTF9NRVRBX1NERU5ETk9URQkJMTEKI2RlZmluZSBIVE1MX01FVEFfQ09OVEVOVF9UWVBFCTEyCgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpEQkdfTkFNRShPSFRNTFJlYWRlcikKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gT0hUTUxSZWFkZXIKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KT0hUTUxSZWFkZXI6Ok9IVE1MUmVhZGVyKFN2U3RyZWFtJiBySW4sY29uc3QgU2hhcmVkQ29ubmVjdGlvbiYgX3J4Q29ubmVjdGlvbiwKCQkJCQkJY29uc3QgUmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjp1dGlsOjpYTnVtYmVyRm9ybWF0dGVyID4mIF9yeE51bWJlckYsCgkJCQkJCWNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjpsYW5nOjpYTXVsdGlTZXJ2aWNlRmFjdG9yeSA+JiBfck0sCgkJCQkJCWNvbnN0IFRDb2x1bW5WZWN0b3IqIHBMaXN0LAoJCQkJCQljb25zdCBPVHlwZUluZm9NYXAqIF9wSW5mb01hcCkgCgk6SFRNTFBhcnNlcihySW4pCgksT0RhdGFiYXNlRXhwb3J0KCBfcnhDb25uZWN0aW9uLCBfcnhOdW1iZXJGLCBfck0sIHBMaXN0LCBfcEluZm9NYXAsIHJJbiApCgksbV9uVGFibGVDb3VudCgwKQoJLG1fbkNvbHVtbldpZHRoKDg3KQoJLG1fYk1ldGFPcHRpb25zKHNhbF9GYWxzZSkKCSxtX2JTRE51bShzYWxfRmFsc2UpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6T0hUTUxSZWFkZXIiICk7CglEQkdfQ1RPUihPSFRNTFJlYWRlcixOVUxMKTsKCVNldFNyY0VuY29kaW5nKCBHZXRFeHRlbmRlZENvbXBhdGliaWxpdHlUZXh0RW5jb2RpbmcoICBSVExfVEVYVEVOQ09ESU5HX0lTT184ODU5XzEgKSApOwogICAgLy8gSWYgdGhlIGZpbGUgc3RhcnRzIHdpdGggYSBCT00sIHN3aXRjaCB0byBVQ1MyLgogICAgU2V0U3dpdGNoVG9VQ1MyKCBzYWxfVHJ1ZSApOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpPSFRNTFJlYWRlcjo6T0hUTUxSZWFkZXIoU3ZTdHJlYW0mIHJJbiwKCQkJCQkJIHNhbF9JbnQzMiBuUm93cywKCQkJCQkJIGNvbnN0IFRQb3NpdGlvbnMgJl9yQ29sdW1uUG9zaXRpb25zLAoJCQkJCQkgY29uc3QgUmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjp1dGlsOjpYTnVtYmVyRm9ybWF0dGVyID4mIF9yeE51bWJlckYsCgkJCQkJCSBjb25zdCA6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgOjpjb206OnN1bjo6c3Rhcjo6bGFuZzo6WE11bHRpU2VydmljZUZhY3RvcnkgPiYgX3JNLAoJCQkJCQkgY29uc3QgVENvbHVtblZlY3RvciogcExpc3QsCgkJCQkJCSBjb25zdCBPVHlwZUluZm9NYXAqIF9wSW5mb01hcCwKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbF9Cb29sIF9iQXV0b0luY3JlbWVudEVuYWJsZWQpCgk6SFRNTFBhcnNlcihySW4pCgksT0RhdGFiYXNlRXhwb3J0KCBuUm93cywgX3JDb2x1bW5Qb3NpdGlvbnMsIF9yeE51bWJlckYsIF9yTSwgcExpc3QsIF9wSW5mb01hcCwgX2JBdXRvSW5jcmVtZW50RW5hYmxlZCwgckluICkKCSxtX25UYWJsZUNvdW50KDApCgksbV9uQ29sdW1uV2lkdGgoODcpCgksbV9iTWV0YU9wdGlvbnMoc2FsX0ZhbHNlKQoJLG1fYlNETnVtKHNhbF9GYWxzZSkKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpPSFRNTFJlYWRlciIgKTsKCURCR19DVE9SKE9IVE1MUmVhZGVyLE5VTEwpOwoJU2V0U3JjRW5jb2RpbmcoIEdldEV4dGVuZGVkQ29tcGF0aWJpbGl0eVRleHRFbmNvZGluZyggIFJUTF9URVhURU5DT0RJTkdfSVNPXzg4NTlfMSApICk7CiAgICAvLyBJZiB0aGUgZmlsZSBzdGFydHMgd2l0aCBhIEJPTSwgc3dpdGNoIHRvIFVDUzIuCiAgICBTZXRTd2l0Y2hUb1VDUzIoIHNhbF9UcnVlICk7Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk9IVE1MUmVhZGVyOjp+T0hUTUxSZWFkZXIoKQp7CglEQkdfRFRPUihPSFRNTFJlYWRlcixOVUxMKTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU3ZQYXJzZXJTdGF0ZSBPSFRNTFJlYWRlcjo6Q2FsbFBhcnNlcigpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6Q2FsbFBhcnNlciIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJcklucHV0LlNlZWsoU1RSRUFNX1NFRUtfVE9fQkVHSU4pOwoJcklucHV0LlJlc2V0RXJyb3IoKTsKCVN2UGFyc2VyU3RhdGUgIGVQYXJzZVN0YXRlID0gSFRNTFBhcnNlcjo6Q2FsbFBhcnNlcigpOwoJU2V0Q29sdW1uVHlwZXMobV9wQ29sdW1uTGlzdCxtX3BJbmZvTWFwKTsKCXJldHVybiBtX2JGb3VuZFRhYmxlID8gZVBhcnNlU3RhdGUgOiBTVlBBUl9FUlJPUjsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE9IVE1MUmVhZGVyOjpOZXh0VG9rZW4oIGludCBuVG9rZW4gKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6Ok5leHRUb2tlbiIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJaWYobV9iRXJyb3IgfHwgIW1fblJvd3MpIC8vIGZhbGxzIEZlaGxlciBvZGVyIGtlaW5lIFJvd3MgbWVociB6dXIgIlViZXJwciJ1ZnVuZyBkYW5uIGdsZWljaCB6dXIidWNrCgkJcmV0dXJuOwoJaWYgKCBuVG9rZW4gPT0gIEhUTUxfTUVUQSApCgkJc2V0VGV4dEVuY29kaW5nKCk7CgoJaWYobV94Q29ubmVjdGlvbi5pcygpKQkgIC8vIGdpYnQgYW4gd2VsY2hlciBDVE9SIGdlcnVmZW4gd3VyZGUgdW5kIGRhbWl0LCBvYiBlaW5lIFRhYmVsbGUgZXJzdGVsbHQgd2VyZGVuIHNvbGwKCXsKCQlzd2l0Y2goblRva2VuKQoJCXsKCQkJY2FzZSBIVE1MX1RBQkxFX09OOgoJCQkJKyttX25UYWJsZUNvdW50OwoJCQkJewkvLyBlcyBrYW5uIGF1Y2ggVEQgb2RlciBUSCBzZWluLCB3ZW5uIGVzIHZvcmhlciBrZWluIFRBQkxFIGdhYgogICAgICAgICAgICAgICAgICAgIGNvbnN0IEhUTUxPcHRpb25zKiBwSHRtbE9wdGlvbnMgPSBHZXRPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgc2FsX0ludDE2IG5BcnJMZW4gPSBwSHRtbE9wdGlvbnMtPkNvdW50KCk7CgkJCQkJZm9yICggc2FsX0ludDE2IGkgPSAwOyBpIDwgbkFyckxlbjsgaSsrICkKCQkJCQl7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhUTUxPcHRpb24qIHBPcHRpb24gPSAoKnBIdG1sT3B0aW9ucylbaV07CgkJCQkJCXN3aXRjaCggcE9wdGlvbi0+R2V0VG9rZW4oKSApCgkJCQkJCXsKCQkJCQkJCWNhc2UgSFRNTF9PX1dJRFRIOgoJCQkJCQkJewkvLyBQcm96ZW50OiB2b24gRG9rdW1lbnRicmVpdGUgYnp3LiBhZXVzc2VyZXIgWmVsbGUKCQkJCQkJCQltX25Db2x1bW5XaWR0aCA9IEdldFdpZHRoUGl4ZWwoIHBPcHRpb24gKTsKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQljYXNlIEhUTUxfVEhFQURfT046CgkJCWNhc2UgSFRNTF9UQk9EWV9PTjoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzYWxfdUludDMyIG5UZWxsID0gcklucHV0LlRlbGwoKTsgLy8gdmVy5G5kZXJ0IHZpZWxsZWljaHQgZGllIFBvc2l0aW9uIGRlcyBTdHJlYW1zCgkJCQkgICAgaWYgKCAhbV94VGFibGUuaXMoKSApIAogICAgICAgICAgICAgICAgICAgIHsvLyBlcnN0ZSBaZWlsZSBhbHMgSGVhZGVyIHZlcndlbmRlbgoJCQkJCSAgICBtX2JFcnJvciA9ICFDcmVhdGVUYWJsZShuVG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1fYkFwcGVuZEZpcnN0TGluZSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBySW5wdXQuU2VlayhuVGVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRV9PRkY6CgkJCQlpZighLS1tX25UYWJsZUNvdW50KQoJCQkJewoJCQkJCW1feFRhYmxlID0gTlVMTDsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfVEFCTEVST1dfT046CgkJCQlpZiAoIG1fcFVwZGF0ZUhlbHBlci5nZXQoKSApCgkJCQl7CgkJCQkJdHJ5CgkJCQkJewoJCQkJCQltX3BVcGRhdGVIZWxwZXItPm1vdmVUb0luc2VydFJvdygpOyAvLyBzb25zdCBuZXVlIFplaWxlIGFuaCJhbmdlbgoJCQkJCX0KCQkJCQljYXRjaChTUUxFeGNlcHRpb24mIGUpCgkJCQkJLy8gVXBkYXRlRmVobGVyYmVoYW5kbHVuZwoJCQkJCXsKCQkJCQkJc2hvd0Vycm9yRGlhbG9nKGUpOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCQltX2JFcnJvciA9IHNhbF9UcnVlOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9URVhUVE9LRU46CgkJCWNhc2UgSFRNTF9TSU5HTEVDSEFSOgoJCQkJaWYgKCBtX2JJblRibCApIC8vJiYgIW1fYlNETnVtICkgLy8gd2ljaHRpZywgZGEgd2lyIHNvbnN0IGF1Y2ggZGllIE5hbWVuIGRlciBGb250cyBiZWtvbW1lbgoJCQkJICAgIG1fc1RleHRUb2tlbiArPSBhVG9rZW47CgkJCQlicmVhazsKICAgICAgICAgICAgY2FzZSBIVE1MX1BBUkFCUkVBS19PRkY6CiAgICAgICAgICAgICAgICBtX3NDdXJyZW50ICs9IG1fc1RleHRUb2tlbjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEhUTUxfUEFSQUJSRUFLX09OOgogICAgICAgICAgICAgICAgbV9zVGV4dFRva2VuLkVyYXNlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFREFUQV9PTjoKICAgICAgICAgICAgICAgIGZldGNoT3B0aW9ucygpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRURBVEFfT0ZGOgoJCQkJewogICAgICAgICAgICAgICAgICAgIGlmICggbV9zQ3VycmVudC5MZW4oKSApCiAgICAgICAgICAgICAgICAgICAgICAgIG1fc1RleHRUb2tlbiA9IG1fc0N1cnJlbnQ7CgkJCQkJdHJ5CgkJCQkJewoJCQkJCQlpbnNlcnRWYWx1ZUludG9Db2x1bW4oKTsKCQkJCQl9CgkJCQkJY2F0Y2goU1FMRXhjZXB0aW9uJiBlKQoJCQkJCS8vIFVwZGF0ZUZlaGxlcmJlaGFuZGx1bmcKCQkJCQl7CgkJCQkJCXNob3dFcnJvckRpYWxvZyhlKTsKCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgbV9zQ3VycmVudC5FcmFzZSgpOwoJCQkJCW1fbkNvbHVtblBvcysrOwogICAgICAgICAgICAgICAgICAgIGVyYXNlVG9rZW5zKCk7CgkJCQkJbV9iU0ROdW0gPSBtX2JJblRibCA9IHNhbF9GYWxzZTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfVEFCTEVST1dfT0ZGOgoJCQkJaWYgKCAhbV9wVXBkYXRlSGVscGVyLmdldCgpICkKCQkJCXsKCQkJCQltX2JFcnJvciA9IHNhbF9UcnVlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJdHJ5CgkJCQl7CgkJCQkJbV9uUm93Q291bnQrKzsKCQkJCQlpZiAobV9iSXNBdXRvSW5jcmVtZW50KSAvLyBpZiBiU2V0QXV0b0luY3JlbWVudCB0aGVuIEkgaGF2ZSB0byBzZXQgdGhlIGF1dG9pbmNyZW1lbnQKCQkJCQkJbV9wVXBkYXRlSGVscGVyLT51cGRhdGVJbnQoMSxtX25Sb3dDb3VudCk7CgkJCQkJbV9wVXBkYXRlSGVscGVyLT5pbnNlcnRSb3coKTsKCQkJCX0KCQkJCWNhdGNoKFNRTEV4Y2VwdGlvbiYgZSkKCQkJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCQkJCS8vIFVwZGF0ZUZlaGxlcmJlaGFuZGx1bmcKCQkJCXsKCQkJCQlzaG93RXJyb3JEaWFsb2coZSk7CgkJCQl9CgkJCQltX25Db2x1bW5Qb3MgPSAwOwoJCQkJYnJlYWs7CgkJfQoJfQoJZWxzZSAvLyBad2VpZyBudXIgZiJ1ciBUeXBwciJ1ZnVuZyBnInVsdGlnCgl7CgkJc3dpdGNoKG5Ub2tlbikKCQl7CgkJCWNhc2UgSFRNTF9USEVBRF9PTjoKCQkJY2FzZSBIVE1MX1RCT0RZX09OOgoJCQkJLy8gRGVyIFNwYWx0ZW4gS29wZiB6ImFobHQgbmljaHQgbWl0CgkJCQlpZihtX2JIZWFkKQoJCQkJewoJCQkJCWRvCgkJCQkJe30KCQkJCQl3aGlsZShHZXROZXh0VG9rZW4oKSAhPSBIVE1MX1RBQkxFUk9XX09GRik7CgkJCQkJbV9iSGVhZCA9IHNhbF9GYWxzZTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfVEFCTEVEQVRBX09OOgoJCQljYXNlIEhUTUxfVEFCTEVIRUFERVJfT046CgkJCQlmZXRjaE9wdGlvbnMoKTsKCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfVEVYVFRPS0VOOgoJCQljYXNlIEhUTUxfU0lOR0xFQ0hBUjoKICAgICAgICAgICAgICAgIGlmICggbV9iSW5UYmwgKSAvLyAmJiAhbV9iU0ROdW0gKSAvLyB3aWNodGlnLCBkYSB3aXIgc29uc3QgYXVjaCBkaWUgTmFtZW4gZGVyIEZvbnRzIGJla29tbWVuCgkJCQkgICAgbV9zVGV4dFRva2VuICs9IGFUb2tlbjsKCQkJCWJyZWFrOwogICAgICAgICAgICBjYXNlIEhUTUxfUEFSQUJSRUFLX09GRjoKICAgICAgICAgICAgICAgIG1fc0N1cnJlbnQgKz0gbV9zVGV4dFRva2VuOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSFRNTF9QQVJBQlJFQUtfT046CiAgICAgICAgICAgICAgICBtX3NUZXh0VG9rZW4uRXJhc2UoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJCQljYXNlIEhUTUxfVEFCTEVEQVRBX09GRjoKICAgICAgICAgICAgICAgIGlmICggbV9zQ3VycmVudC5MZW4oKSApCiAgICAgICAgICAgICAgICAgICAgbV9zVGV4dFRva2VuID0gbV9zQ3VycmVudDsKICAgICAgICAgICAgICAgIGFkanVzdEZvcm1hdCgpOwoJCQkJbV9uQ29sdW1uUG9zKys7CgkJCQltX2JTRE51bSA9IG1fYkluVGJsID0gc2FsX0ZhbHNlOwogICAgICAgICAgICAgICAgbV9zQ3VycmVudC5FcmFzZSgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRVJPV19PRkY6CiAgICAgICAgICAgICAgICBpZiAoIG1fc0N1cnJlbnQuTGVuKCkgKQogICAgICAgICAgICAgICAgICAgIG1fc1RleHRUb2tlbiA9IG1fc0N1cnJlbnQ7CiAgICAgICAgICAgICAgICBhZGp1c3RGb3JtYXQoKTsKCQkJCW1fbkNvbHVtblBvcyA9IDA7CgkJCQltX25Sb3dzLS07CiAgICAgICAgICAgICAgICBtX3NDdXJyZW50LkVyYXNlKCk7CgkJCQlicmVhazsKCQl9Cgl9Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBPSFRNTFJlYWRlcjo6ZmV0Y2hPcHRpb25zKCkKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpmZXRjaE9wdGlvbnMiICk7CgltX2JJblRibCA9IHNhbF9UcnVlOwoJY29uc3QgSFRNTE9wdGlvbnMqIG9wdGlvbnMgPSBHZXRPcHRpb25zKCk7CglzYWxfSW50MTYgbkFyckxlbiA9IG9wdGlvbnMtPkNvdW50KCk7Cglmb3IgKCBzYWxfSW50MTYgaSA9IDA7IGkgPCBuQXJyTGVuOyBpKysgKQoJewoJCWNvbnN0IEhUTUxPcHRpb24qIHBPcHRpb24gPSAoKm9wdGlvbnMpW2ldOwoJCXN3aXRjaCggcE9wdGlvbi0+R2V0VG9rZW4oKSApCgkJewoJCQljYXNlIEhUTUxfT19TRFZBTDoKCQkJewogICAgICAgICAgICAgICAgbV9zVmFsVG9rZW4gPSBwT3B0aW9uLT5HZXRTdHJpbmcoKTsKCQkJCS8vbV9zVGV4dFRva2VuID0gcE9wdGlvbi0+R2V0U3RyaW5nKCk7CgkJCQltX2JTRE51bSA9IHNhbF9UcnVlOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlIEhUTUxfT19TRE5VTToKICAgICAgICAgICAgICAgIG1fc051bVRva2VuID0gcE9wdGlvbi0+R2V0U3RyaW5nKCk7CgkJCWJyZWFrOwoJCX0KCX0KfQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE9IVE1MUmVhZGVyOjpUYWJsZURhdGFPbihTdnhDZWxsSG9ySnVzdGlmeSYgZVZhbCxpbnQgblRva2VuKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OlRhYmxlRGF0YU9uIiApOwoJREJHX0NIS1RISVMoT0hUTUxSZWFkZXIsTlVMTCk7CglzYWxfQm9vbCBiSG9ySnVzdGlmeUNlbnRlclRIID0gKG5Ub2tlbiA9PSBIVE1MX1RBQkxFSEVBREVSX09OKTsKCWNvbnN0IEhUTUxPcHRpb25zKiBwSHRtbE9wdGlvbnMgPSBHZXRPcHRpb25zKCk7CglzYWxfSW50MTYgbkFyckxlbiA9IHBIdG1sT3B0aW9ucy0+Q291bnQoKTsKCWZvciAoIHNhbF9JbnQxNiBpID0gMDsgaSA8IG5BcnJMZW47IGkrKyApCgl7CgkJY29uc3QgSFRNTE9wdGlvbiogcE9wdGlvbiA9ICgqcEh0bWxPcHRpb25zKVtpXTsKCQlzd2l0Y2goIHBPcHRpb24tPkdldFRva2VuKCkgKQoJCXsKCQkJY2FzZSBIVE1MX09fQUxJR046CgkJCXsKCQkJCWJIb3JKdXN0aWZ5Q2VudGVyVEggPSBzYWxfRmFsc2U7CgkJCQljb25zdCBTdHJpbmcmIHJPcHRWYWwgPSBwT3B0aW9uLT5HZXRTdHJpbmcoKTsKCQkJCWlmIChyT3B0VmFsLkVxdWFsc0lnbm9yZUNhc2VBc2NpaSggT09PX1NUUklOR19TVlRPT0xTX0hUTUxfQUxfcmlnaHQgKSkKCQkJCQllVmFsID0gU1ZYX0hPUl9KVVNUSUZZX1JJR0hUOwoJCQkJZWxzZSBpZiAock9wdFZhbC5FcXVhbHNJZ25vcmVDYXNlQXNjaWkoIE9PT19TVFJJTkdfU1ZUT09MU19IVE1MX0FMX2NlbnRlciApKQoJCQkJCWVWYWwgPSBTVlhfSE9SX0pVU1RJRllfQ0VOVEVSOwoJCQkJZWxzZSBpZiAock9wdFZhbC5FcXVhbHNJZ25vcmVDYXNlQXNjaWkoIE9PT19TVFJJTkdfU1ZUT09MU19IVE1MX0FMX2xlZnQgKSkKCQkJCQllVmFsID0gU1ZYX0hPUl9KVVNUSUZZX0xFRlQ7CgkJCQllbHNlCgkJCQkJZVZhbCA9IFNWWF9IT1JfSlVTVElGWV9TVEFOREFSRDsKCQkJfQoJCQlicmVhazsKCQkJY2FzZSBIVE1MX09fV0lEVEg6CgkJCQltX25XaWR0aCA9IEdldFdpZHRoUGl4ZWwoIHBPcHRpb24gKTsKCQkJYnJlYWs7CgkJfQoJfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE9IVE1MUmVhZGVyOjpUYWJsZUZvbnRPbihGb250RGVzY3JpcHRvciYgX3JGb250LHNhbF9JbnQzMiAmX3JUZXh0Q29sb3IpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6VGFibGVGb250T24iICk7CglEQkdfQ0hLVEhJUyhPSFRNTFJlYWRlcixOVUxMKTsKCWNvbnN0IEhUTUxPcHRpb25zKiBwSHRtbE9wdGlvbnMgPSBHZXRPcHRpb25zKCk7CglzYWxfSW50MTYgbkFyckxlbiA9IHBIdG1sT3B0aW9ucy0+Q291bnQoKTsKCWZvciAoIHNhbF9JbnQxNiBpID0gMDsgaSA8IG5BcnJMZW47IGkrKyApCgl7CgkJY29uc3QgSFRNTE9wdGlvbiogcE9wdGlvbiA9ICgqcEh0bWxPcHRpb25zKVtpXTsKCQlzd2l0Y2goIHBPcHRpb24tPkdldFRva2VuKCkgKQoJCXsKCQljYXNlIEhUTUxfT19DT0xPUjoKCQkJewoJCQkJQ29sb3IgYUNvbG9yOwoJCQkJcE9wdGlvbi0+R2V0Q29sb3IoIGFDb2xvciApOwoJCQkJX3JUZXh0Q29sb3IgPSBhQ29sb3IuR2V0UkdCQ29sb3IoKTsKCQkJfQoJCQlicmVhazsKCQljYXNlIEhUTUxfT19GQUNFIDoKCQkJewoJCQkJY29uc3QgU3RyaW5nJiByRmFjZSA9IHBPcHRpb24tPkdldFN0cmluZygpOwoJCQkJU3RyaW5nIGFGb250TmFtZTsKCQkJCXh1Yl9TdHJMZW4gblBvcyA9IDA7CgkJCQl3aGlsZSggblBvcyAhPSBTVFJJTkdfTk9URk9VTkQgKQoJCQkJewkvLyBGb250bGlzdGUsIFZDTDogU2VtaWtvbG9uIGFscyBTZXBhcmF0b3IsIEhUTUw6IEtvbW1hCgkJCQkJU3RyaW5nIGFGTmFtZSA9IHJGYWNlLkdldFRva2VuKCAwLCAnLCcsIG5Qb3MgKTsKCQkJCQlhRk5hbWUuRXJhc2VUcmFpbGluZ0NoYXJzKCkuRXJhc2VMZWFkaW5nQ2hhcnMoKTsKCQkJCQlpZiggYUZvbnROYW1lLkxlbigpICkKCQkJCQkJYUZvbnROYW1lICs9ICc7JzsKCQkJCQlhRm9udE5hbWUgKz0gYUZOYW1lOwoJCQkJfQoJCQkJaWYgKCBhRm9udE5hbWUuTGVuKCkgKQoJCQkJCV9yRm9udC5OYW1lID0gOjpydGw6Ok9VU3RyaW5nKGFGb250TmFtZSk7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBIVE1MX09fU0laRSA6CgkJCXsKCQkJCXNhbF9JbnQxNiBuU2l6ZSA9IChzYWxfSW50MTYpIHBPcHRpb24tPkdldE51bWJlcigpOwoJCQkJaWYgKCBuU2l6ZSA9PSAwICkKCQkJCQluU2l6ZSA9IDE7CgkJCQllbHNlIGlmICggblNpemUgPCBEQkFVSV9IVE1MX0ZPTlRTSVpFUyApCgkJCQkJblNpemUgPSBEQkFVSV9IVE1MX0ZPTlRTSVpFUzsKCgkJCQlfckZvbnQuSGVpZ2h0ID0gblNpemU7CgkJCX0KCQkJYnJlYWs7CgkJfQoJfQp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzYWxfSW50MTYgT0hUTUxSZWFkZXI6OkdldFdpZHRoUGl4ZWwoIGNvbnN0IEhUTUxPcHRpb24qIHBPcHRpb24gKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OkdldFdpZHRoUGl4ZWwiICk7CglEQkdfQ0hLVEhJUyhPSFRNTFJlYWRlcixOVUxMKTsKCWNvbnN0IFN0cmluZyYgck9wdFZhbCA9IHBPcHRpb24tPkdldFN0cmluZygpOwoJaWYgKCByT3B0VmFsLlNlYXJjaCgnJScpICE9IFNUUklOR19OT1RGT1VORCApCgl7CS8vIFByb3plbnQKCQlEQkdfQVNTRVJUKCBtX25Db2x1bW5XaWR0aCwgIldJRFRIIE9wdGlvbjogbV9uQ29sdW1uV2lkdGg9PTAgdW5kIFdpZHRoJSIgKTsKCQlyZXR1cm4gKHNhbF9JbnQxNikoKHBPcHRpb24tPkdldE51bWJlcigpICogbV9uQ29sdW1uV2lkdGgpIC8gMTAwKTsKCX0KCWVsc2UKCXsKCQlpZiAoIHJPcHRWYWwuU2VhcmNoKCcqJykgIT0gU1RSSU5HX05PVEZPVU5EICkKCQl7CS8vIHJlbGF0aXYgenUgd2FzPyE/Ci8vMmRvOiBDb2xBcnJheSBhbGxlciByZWxhdGl2ZW4gV2VydGUgc2FtbWVsbiB1bmQgZGFubiBNYWtlQ29sCgkJCXJldHVybiAwOwoJCX0KCQllbHNlCgkJCXJldHVybiAoc2FsX0ludDE2KXBPcHRpb24tPkdldE51bWJlcigpOwkvLyBQaXhlbAoJfQp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzYWxfQm9vbCBPSFRNTFJlYWRlcjo6Q3JlYXRlVGFibGUoaW50IG5Ub2tlbikKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpDcmVhdGVUYWJsZSIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJU3RyaW5nIGFUZW1wTmFtZShNb2R1bGVSZXMoU1RSX1RCTF9USVRMRSkpOwoJYVRlbXBOYW1lID0gYVRlbXBOYW1lLkdldFRva2VuKDAsJyAnKTsKCWFUZW1wTmFtZSA9IFN0cmluZyg6OmRidG9vbHM6OmNyZWF0ZVVuaXF1ZU5hbWUobV94VGFibGVzLDo6cnRsOjpPVVN0cmluZyhhVGVtcE5hbWUgKSkpOwoKCWludCBuVG1wVG9rZW4yID0gblRva2VuOwoJc2FsX0Jvb2wgYkNhcHRpb24gPSBzYWxfRmFsc2U7CglzYWxfQm9vbCBiVGFibGVIZWFkZXIgPSBzYWxfRmFsc2U7CglTdHJpbmcgYUNvbHVtbk5hbWU7CglTdnhDZWxsSG9ySnVzdGlmeSBlVmFsOwoKCVN0cmluZyBhVGFibGVOYW1lOwoJRm9udERlc2NyaXB0b3IgYUZvbnQgPSA6OmRiYXVpOjpDcmVhdGVGb250RGVzY3JpcHRvcihBcHBsaWNhdGlvbjo6R2V0U2V0dGluZ3MoKS5HZXRTdHlsZVNldHRpbmdzKCkuR2V0QXBwRm9udCgpKTsKCXNhbF9JbnQzMiBuVGV4dENvbG9yID0gMDsKCWRvCgl7CgkJc3dpdGNoKG5UbXBUb2tlbjIpCgkJewoJCQljYXNlIEhUTUxfVEVYVFRPS0VOOgoJCQljYXNlIEhUTUxfU0lOR0xFQ0hBUjoKCQkJCWlmKGJUYWJsZUhlYWRlcikKCQkJCQlhQ29sdW1uTmFtZSArPSBhVG9rZW47CgkJCQlpZihiQ2FwdGlvbikKCQkJCQlhVGFibGVOYW1lICs9IGFUb2tlbjsKCQkJCWJyZWFrOwogICAgICAgICAgICBjYXNlIEhUTUxfUEFSQUJSRUFLX09GRjoKICAgICAgICAgICAgICAgIG1fc0N1cnJlbnQgKz0gYUNvbHVtbk5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBIVE1MX1BBUkFCUkVBS19PTjoKICAgICAgICAgICAgICAgIG1fc1RleHRUb2tlbi5FcmFzZSgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRURBVEFfT046CiAgICAgICAgICAgICAgICAvLyBtX2JBcHBlbmRGaXJzdExpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gcnVuIHRocm91Z2gKCQkJY2FzZSBIVE1MX1RBQkxFSEVBREVSX09OOgoJCQkJVGFibGVEYXRhT24oZVZhbCxuVG1wVG9rZW4yKTsKCQkJCWJUYWJsZUhlYWRlciA9IHNhbF9UcnVlOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRURBVEFfT0ZGOgogICAgICAgICAgICAgICAgLy8gbV9iQXBwZW5kRmlyc3RMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vIHJ1biB0aHJvdWdoCgkJCWNhc2UgSFRNTF9UQUJMRUhFQURFUl9PRkY6CgkJCQl7CgkJCQkJYUNvbHVtbk5hbWUuRXJhc2VMZWFkaW5nQ2hhcnMoKTsKCQkJCQlhQ29sdW1uTmFtZS5FcmFzZVRyYWlsaW5nQ2hhcnMoKTsKCQkJCQlpZiAoIWFDb2x1bW5OYW1lLkxlbigpIHx8IG1fYkFwcGVuZEZpcnN0TGluZSApCgkJCQkJCWFDb2x1bW5OYW1lID0gU3RyaW5nKE1vZHVsZVJlcyhTVFJfQ09MVU1OX05BTUUpKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggbV9zQ3VycmVudC5MZW4oKSApCiAgICAgICAgICAgICAgICAgICAgICAgIGFDb2x1bW5OYW1lID0gbV9zQ3VycmVudDsKCiAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUuRXJhc2VMZWFkaW5nQ2hhcnMoKTsKCQkJCQlhQ29sdW1uTmFtZS5FcmFzZVRyYWlsaW5nQ2hhcnMoKTsKCQkJCQlDcmVhdGVEZWZhdWx0Q29sdW1uKGFDb2x1bW5OYW1lKTsKCQkJCQlhQ29sdW1uTmFtZS5FcmFzZSgpOwogICAgICAgICAgICAgICAgICAgIG1fc0N1cnJlbnQuRXJhc2UoKTsKCgkJCQkJZVZhbCA9IFNWWF9IT1JfSlVTVElGWV9TVEFOREFSRDsKCQkJCQliVGFibGVIZWFkZXIgPSBzYWxfRmFsc2U7CgkJCQl9CgkJCQlicmVhazsKCgkJCWNhc2UgSFRNTF9USVRMRV9PTjoKCQkJY2FzZSBIVE1MX0NBUFRJT05fT046CgkJCQliQ2FwdGlvbiA9IHNhbF9UcnVlOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9USVRMRV9PRkY6CgkJCWNhc2UgSFRNTF9DQVBUSU9OX09GRjoKCQkJCWFUYWJsZU5hbWUuRXJhc2VMZWFkaW5nQ2hhcnMoKTsKCQkJCWFUYWJsZU5hbWUuRXJhc2VUcmFpbGluZ0NoYXJzKCk7CgkJCQlpZighYVRhYmxlTmFtZS5MZW4oKSkKCQkJCQlhVGFibGVOYW1lID0gU3RyaW5nKDo6ZGJ0b29sczo6Y3JlYXRlVW5pcXVlTmFtZShtX3hUYWJsZXMsOjpydGw6Ok9VU3RyaW5nKGFUYWJsZU5hbWUpKSk7CgkJCQllbHNlCgkJCQkJYVRhYmxlTmFtZSA9IGFUZW1wTmFtZTsKCQkJCWJDYXB0aW9uID0gc2FsX0ZhbHNlOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9GT05UX09OOgoJCQkJVGFibGVGb250T24oYUZvbnQsblRleHRDb2xvcik7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX0JPTERfT046CgkJCQlhRm9udC5XZWlnaHQgPSA6OmNvbTo6c3VuOjpzdGFyOjphd3Q6OkZvbnRXZWlnaHQ6OkJPTEQ7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX0lUQUxJQ19PTjoKCQkJCWFGb250LlNsYW50ID0gOjpjb206OnN1bjo6c3Rhcjo6YXd0OjpGb250U2xhbnRfSVRBTElDOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9VTkRFUkxJTkVfT046CgkJCQlhRm9udC5VbmRlcmxpbmUgPSA6OmNvbTo6c3VuOjpzdGFyOjphd3Q6OkZvbnRVbmRlcmxpbmU6OlNJTkdMRTsKCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfU1RSSUtFX09OOgoJCQkJYUZvbnQuU3RyaWtlb3V0ID0gOjpjb206OnN1bjo6c3Rhcjo6YXd0OjpGb250U3RyaWtlb3V0OjpTSU5HTEU7CgkJCQlicmVhazsKCQl9Cgl9Cgl3aGlsZSgoblRtcFRva2VuMiA9IEdldE5leHRUb2tlbigpKSAhPSBIVE1MX1RBQkxFUk9XX09GRik7CgogICAgaWYgKCBtX3NDdXJyZW50LkxlbigpICkKICAgICAgICBhQ29sdW1uTmFtZSA9IG1fc0N1cnJlbnQ7CiAgICBhQ29sdW1uTmFtZS5FcmFzZUxlYWRpbmdDaGFycygpOwoJYUNvbHVtbk5hbWUuRXJhc2VUcmFpbGluZ0NoYXJzKCk7CglpZihhQ29sdW1uTmFtZS5MZW4oKSkKCQlDcmVhdGVEZWZhdWx0Q29sdW1uKGFDb2x1bW5OYW1lKTsKCglpZiAoIG1fdkRlc3RWZWN0b3IuZW1wdHkoKSApCgkJcmV0dXJuIHNhbF9GYWxzZTsJCgoJaWYoIWFUYWJsZU5hbWUuTGVuKCkpCgkJYVRhYmxlTmFtZSA9IGFUZW1wTmFtZTsKCgltX2JJblRibAkJPSBzYWxfRmFsc2U7CgltX2JGb3VuZFRhYmxlCT0gc2FsX1RydWU7CgoJaWYgKCBpc0NoZWNrRW5hYmxlZCgpICkKCQlyZXR1cm4gc2FsX1RydWU7CgoJcmV0dXJuICFleGVjdXRlV2l6YXJkKGFUYWJsZU5hbWUsbWFrZUFueShuVGV4dENvbG9yKSxhRm9udCkgJiYgbV94VGFibGUuaXMoKTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE9IVE1MUmVhZGVyOjpzZXRUZXh0RW5jb2RpbmcoKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OnNldFRleHRFbmNvZGluZyIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJbV9iTWV0YU9wdGlvbnMgPSBzYWxfVHJ1ZTsKICAgIFBhcnNlTWV0YU9wdGlvbnMoTlVMTCwgTlVMTCk7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgT0hUTUxSZWFkZXI6OnJlbGVhc2UoKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OnJlbGVhc2UiICk7CglEQkdfQ0hLVEhJUyhPSFRNTFJlYWRlcixOVUxMKTsKCVJlbGVhc2VSZWYoKTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUeXBlU2VsZWN0aW9uUGFnZUZhY3RvcnkgT0hUTUxSZWFkZXI6OmdldFR5cGVTZWxlY3Rpb25QYWdlRmFjdG9yeSgpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6Z2V0VHlwZVNlbGVjdGlvblBhZ2VGYWN0b3J5IiApOwoJREJHX0NIS1RISVMoT0hUTUxSZWFkZXIsTlVMTCk7CiAgICByZXR1cm4gJk9XaXpIVE1MRXh0ZW5kOjpDcmVhdGU7Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCg==