LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfaTE4bnBvb2wuaHh4IgoKI2luY2x1ZGUgPHJ0bC91c3RyYnVmLmh4eD4KI2luY2x1ZGUgPGkxOG51dGlsL2Nhc2Vmb2xkaW5nLmh4eD4KI2luY2x1ZGUgPGkxOG51dGlsL3VuaWNvZGUuaHh4PgoKI2luY2x1ZGUgPGNvbXBoZWxwZXIvcHJvY2Vzc2ZhY3RvcnkuaHh4PgojaW5jbHVkZSA8b3NsL2RpYWdub3NlLmg+CgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAiY2hhcmFjdGVyY2xhc3NpZmljYXRpb25JbXBsLmh4eCIKI2luY2x1ZGUgImJyZWFraXRlcmF0b3JJbXBsLmh4eCIKCiNkZWZpbmUgVFJBTlNMSVRFUkFUSU9OX0FMTAojaW5jbHVkZSAidHJhbnNsaXRlcmF0aW9uX2JvZHkuaHh4IgoKdXNpbmcgbmFtZXNwYWNlIDo6Y29tOjpzdW46OnN0YXI6OnVubzsKdXNpbmcgbmFtZXNwYWNlIDo6Y29tOjpzdW46OnN0YXI6Omxhbmc7CnVzaW5nIG5hbWVzcGFjZSA6OnJ0bDsKCiNkZWZpbmUgQTJPVSh4KSBPVVN0cmluZzo6Y3JlYXRlRnJvbUFzY2lpKHgpCgpuYW1lc3BhY2UgY29tIHsgbmFtZXNwYWNlIHN1biB7IG5hbWVzcGFjZSBzdGFyIHsgbmFtZXNwYWNlIGkxOG4gewoKClRyYW5zbGl0ZXJhdGlvbl9ib2R5OjpUcmFuc2xpdGVyYXRpb25fYm9keSgpCnsKCW5NYXBwaW5nVHlwZSA9IDA7Cgl0cmFuc2xpdGVyYXRpb25OYW1lID0gIlRyYW5zbGl0ZXJhdGlvbl9ib2R5IjsKCWltcGxlbWVudGF0aW9uTmFtZSA9ICJjb20uc3VuLnN0YXIuaTE4bi5UcmFuc2xpdGVyYXRpb24uVHJhbnNsaXRlcmF0aW9uX2JvZHkiOwp9CgpzYWxfSW50MTYgU0FMX0NBTEwgVHJhbnNsaXRlcmF0aW9uX2JvZHk6OmdldFR5cGUoKSB0aHJvdyhSdW50aW1lRXhjZXB0aW9uKQp7CglyZXR1cm4gVHJhbnNsaXRlcmF0aW9uVHlwZTo6T05FX1RPX09ORTsKfQoKc2FsX0Jvb2wgU0FMX0NBTEwgVHJhbnNsaXRlcmF0aW9uX2JvZHk6OmVxdWFscygKCWNvbnN0IE9VU3RyaW5nJiAvKnN0cjEqLywgc2FsX0ludDMyIC8qcG9zMSovLCBzYWxfSW50MzIgLypuQ291bnQxKi8sIHNhbF9JbnQzMiYgLypuTWF0Y2gxKi8sCgljb25zdCBPVVN0cmluZyYgLypzdHIyKi8sIHNhbF9JbnQzMiAvKnBvczIqLywgc2FsX0ludDMyIC8qbkNvdW50MiovLCBzYWxfSW50MzImIC8qbk1hdGNoMiovKQoJdGhyb3coUnVudGltZUV4Y2VwdGlvbikKewoJdGhyb3cgUnVudGltZUV4Y2VwdGlvbigpOwp9CgpTZXF1ZW5jZTwgT1VTdHJpbmcgPiBTQUxfQ0FMTCAKVHJhbnNsaXRlcmF0aW9uX2JvZHk6OnRyYW5zbGl0ZXJhdGVSYW5nZSggY29uc3QgT1VTdHJpbmcmIHN0cjEsIGNvbnN0IE9VU3RyaW5nJiBzdHIyICkgCgl0aHJvdyggUnVudGltZUV4Y2VwdGlvbikKewoJU2VxdWVuY2U8IE9VU3RyaW5nID4gb3N0cigyKTsKCW9zdHJbMF0gPSBzdHIxOwoJb3N0clsxXSA9IHN0cjI7CglyZXR1cm4gb3N0cjsKfQoKCnN0YXRpYyBzYWxfdUludDggbGNsX2dldE1hcHBpbmdUeXBlRm9yVG9nZ2xlQ2FzZSggc2FsX3VJbnQ4IG5NYXBwaW5nVHlwZSwgc2FsX1VuaWNvZGUgY0NoYXIgKQp7CiAgICBzYWxfdUludDggblJlcyA9IG5NYXBwaW5nVHlwZTsKCiAgICAvLyB0YWtlIGNhcmUgb2YgVE9HR0xFX0NBU0UgdHJhbnNsaXRlcmF0aW9uOgogICAgLy8gbk1hcHBpbmdUeXBlIHNob3VsZCBub3QgYmUgYSBjb21iaW5hdGlvbiBvZiBmbGFncywgdGh1c2Ugd2UgZGVjaWRlIG5vdwogICAgLy8gd2hpY2ggb25lIHRvIHVzZS4KICAgIGlmIChuTWFwcGluZ1R5cGUgPT0gKE1hcHBpbmdUeXBlTG93ZXJUb1VwcGVyIHwgTWFwcGluZ1R5cGVVcHBlclRvTG93ZXIpKQogICAgewogICAgICAgIGNvbnN0IHNhbF9JbnQxNiBuVHlwZSA9IHVuaWNvZGU6OmdldFVuaWNvZGVUeXBlKCBjQ2hhciApOwogICAgICAgIGlmIChuVHlwZSAmIDB4MDIgLyogbG93ZXIgY2FzZSovKQogICAgICAgICAgICBuUmVzID0gTWFwcGluZ1R5cGVMb3dlclRvVXBwZXI7CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIC8vIHNob3VsZCBhbHNvIHdvcmsgcHJvcGVybHkgZm9yIG5vbi11cHBlciBjaGFyYWN0ZXJzIGxpa2Ugd2hpdGUgc3BhY3MsIG51bWJlcnMsIC4uLgogICAgICAgICAgICBuUmVzID0gTWFwcGluZ1R5cGVVcHBlclRvTG93ZXI7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBuUmVzOwp9CgoKT1VTdHJpbmcgU0FMX0NBTEwgClRyYW5zbGl0ZXJhdGlvbl9ib2R5Ojp0cmFuc2xpdGVyYXRlKCAKICAgIGNvbnN0IE9VU3RyaW5nJiBpblN0ciwgc2FsX0ludDMyIHN0YXJ0UG9zLCBzYWxfSW50MzIgbkNvdW50LCAKCVNlcXVlbmNlPCBzYWxfSW50MzIgPiYgb2Zmc2V0KSAKICAgIHRocm93KFJ1bnRpbWVFeGNlcHRpb24pCnsKI2lmIDAKLyogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOgogKiBUaGUgdHdvIHJlYWxsb2MoKSBjb25zdW1lIDQ4JSAoMzIlIGdyb3csIDE2JSBzaHJpbmspIHJ1bnRpbWUgb2YgdGhpcyBtZXRob2QhCiAqIGdldFZhbHVlKCkgbmVlZHMgYWJvdXQgMTUlLCBzbyB0aGVyZSBpcyBlcXVhbCBiYWxhbmNlIGlmIHdlIHRyYWRlIHRoZSBzZWNvbmQKICogKHNocmlua2luZykgcmVhbGxvYygpIGZvciBhIGdldFZhbHVlKCkuIEJ1dCBpZiB0aGUgY2FsbGVyIGluaXRpYWxpemVzIHRoZQogKiBzZXF1ZW5jZSB0byBuQ291bnQgZWxlbWVudHMgdGhlcmUgaXNuJ3QgYW55IGNoYW5nZSBpbiBzaXplIG5lY2Vzc2FyeSBpbiBtb3N0CiAqIGNhc2VzIChvbmUtdG8tb25lIG1hcHBpbmcpIGFuZCB3ZSBnYWluIDMzJS4KICoKICogT2YgdGhhdCBjb25zdGVsbGF0aW9uIHRoZSBnZXRWYWx1ZSgpIG1ldGhvZCB0YWtlcyAyMCUgdXBvbiBlYWNoIGNhbGwsIHNvIDQwJQogKiBmb3IgYm90aC4gQnkgcmVtZW1iZXJpbmcgdGhlIGZpcnN0IGNhbGxzJyByZXN1bHRzIHdlIGNvdWxkIGdhaW4gc29tZSBleHRyYQogKiBwZXJjZW50YWdlIGFnYWluLCBidXQgdW5mb3J0dW5hdGVseSBnZXRWYWx1ZSgpIG1heSByZXR1cm4gYSByZWZlcmVuY2UgdG8gYQogKiBzdGF0aWMgYnVmZmVyLCBzbyB3ZSBjYW4ndCBzdG9yZSB0aGUgcG9pbnRlciBkaXJlY3RseSBidXQgd291bGQgaGF2ZSB0bwogKiBjb3B5LWNvbnN0cnVjdCBhbiBhcnJheSwgd2hpY2ggZG9lc24ndCBnaXZlIHVzIGFueSBhZHZhbnRhZ2UuCiAqCiAqIE11Y2ggbW9yZSBpcyBhY2NvbXBsaXNoZWQgYnkgd29ya2luZyBkaXJlY3RseSBvbiB0aGUgc2VxdWVuY2UgYnVmZmVyCiAqIHJldHVybmVkIGJ5IGdldEFycmF5KCkgaW5zdGVhZCBvZiB1c2luZyBvcGVyYXRvcltdIGZvciBlYWNoIGFuZCBldmVyeQogKiBhY2Nlc3MuCiAqCiAqIEFuZCB3aGlsZSB3ZSdyZSBhdCBpdDogbm93IHRoYXQgd2Uga25vdyB0aGUgc2l6ZSBpbiBhZHZhbmNlIHdlIGRvbid0IG5lZWQgdG8KICogY29weSB0aGUgYnVmZmVyIGFueW1vcmUsIGp1c3QgY3JlYXRlIHRoZSByZWFsIHN0cmluZyBidWZmZXIgYW5kIGxldCB0aGUKICogcmV0dXJuIHZhbHVlIHRha2Ugb3duZXJzaGlwLgogKgogKiBBbGwgdG9nZXRoZXIgdGhlc2UgY2hhbmdlcyByZXN1bHQgaW4gdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBuZWVkaW5nIG9ubHkgNjIlCiAqIG9mIHRoZSB0aW1lIG9mIHRoZSBvbGQgaW1wbGVtZW50YXRpb24gKGluIG90aGVyIHdvcmRzOiB0aGF0IG9uZSB3YXMgMS42MQogKiB0aW1lcyBzbG93ZXIgLi4uKQogKi8KCiAgICAvLyBBbGxvY2F0ZSB0aGUgbWF4IHBvc3NpYmxlIGJ1ZmZlci4gVHJ5IHRvIHVzZSBzdGFjayBpbnN0ZWFkIG9mIGhlYXAgd2hpY2gKICAgIC8vIHdvdWxkIGhhdmUgdG8gYmUgcmVhbGxvY2F0ZWQgbW9zdCB0aW1lcyBhbnl3YXkuCiAgICBjb25zdCBzYWxfSW50MzIgbkxvY2FsQnVmID0gNTEyICogTk1BUFBJTkdNQVg7CiAgICBzYWxfVW5pY29kZSBhTG9jYWxCdWZbbkxvY2FsQnVmXSwgKm91dCA9IGFMb2NhbEJ1ZiwgKmFIZWFwQnVmID0gTlVMTDsKCiAgICBjb25zdCBzYWxfVW5pY29kZSAqaW4gPSBpblN0ci5nZXRTdHIoKSArIHN0YXJ0UG9zOwoKICAgIGlmIChuQ291bnQgPiA1MTIpCiAgICAgICAgb3V0ID0gYUhlYXBCdWYgPSAgKHNhbF9Vbmljb2RlKikgbWFsbG9jKChuQ291bnQgKiBOTUFQUElOR01BWCkgKiBzaXplb2Yoc2FsX1VuaWNvZGUpKTsKCiAgICAgICAgaWYgKHVzZU9mZnNldCkKICAgICAgICAgICAgb2Zmc2V0LnJlYWxsb2MobkNvdW50ICogTk1BUFBJTkdNQVgpOwoJc2FsX0ludDMyIGogPSAwOwoJZm9yIChzYWxfSW50MzIgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewoJICAgIE1hcHBpbmcgJm1hcCA9IGNhc2Vmb2xkaW5nOjpnZXRWYWx1ZShpbiwgaSwgbkNvdW50LCBhTG9jYWxlLCBuTWFwcGluZ1R5cGUpOwoJICAgIGZvciAoc2FsX0ludDMyIGsgPSAwOyBrIDwgbWFwLm5tYXA7IGsrKykgewogICAgICAgICAgICAgICAgaWYgKHVzZU9mZnNldCkKICAgICAgICAgICAgICAgICAgICBvZmZzZXRbal0gPSBpICsgc3RhcnRQb3M7CgkJb3V0W2orK10gPSBtYXAubWFwW2tdOwoJICAgIH0KCX0KICAgICAgICBpZiAodXNlT2Zmc2V0KQogICAgICAgICAgICBvZmZzZXQucmVhbGxvYyhqKTsKCglPVVN0cmluZyByKG91dCwgaik7CgoJaWYgKGFIZWFwQnVmKQoJICAgIGZyZWUoYUhlYXBCdWYpOwoKCXJldHVybiByOwojZWxzZQogICAgY29uc3Qgc2FsX1VuaWNvZGUgKmluID0gaW5TdHIuZ2V0U3RyKCkgKyBzdGFydFBvczsKCiAgICAvLyBUd28gZGlmZmVyZW50IGJsb2NrcyB0byBlbGltaW5hdGUgdGhlIGlmKHVzZU9mZnNldCkgY29uZGl0aW9uIGluc2lkZSB0aGUKICAgIC8vIGlubmVyIGsgbG9vcC4gWWVzLCBvbiBtYXNzaXZlIHVzZSBldmVuIHN1Y2ggc21hbGwgdGhpbmdzIGRvIGNvdW50LgogICAgaWYgKCB1c2VPZmZzZXQgKQogICAgewogICAgICAgIHNhbF9JbnQzMiBuT2ZmQ291bnQgPSAwLCBpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiBUT0dHTEVfQ0FTRSB0cmFuc2xpdGVyYXRpb246CiAgICAgICAgICAgIHNhbF91SW50OCBuVG1wTWFwcGluZ1R5cGUgPSBuTWFwcGluZ1R5cGU7CiAgICAgICAgICAgIGlmIChuTWFwcGluZ1R5cGUgPT0gKE1hcHBpbmdUeXBlTG93ZXJUb1VwcGVyIHwgTWFwcGluZ1R5cGVVcHBlclRvTG93ZXIpKQogICAgICAgICAgICAgICAgblRtcE1hcHBpbmdUeXBlID0gbGNsX2dldE1hcHBpbmdUeXBlRm9yVG9nZ2xlQ2FzZSggbk1hcHBpbmdUeXBlLCBpbltpXSApOwoKICAgICAgICAgICAgY29uc3QgTWFwcGluZyAmbWFwID0gY2FzZWZvbGRpbmc6OmdldFZhbHVlKCBpbiwgaSwgbkNvdW50LCBhTG9jYWxlLCBuVG1wTWFwcGluZ1R5cGUgKTsKICAgICAgICAgICAgbk9mZkNvdW50ICs9IG1hcC5ubWFwOwogICAgICAgIH0KICAgICAgICBydGxfdVN0cmluZyogcFN0ciA9IHhfcnRsX3VTdHJpbmdfbmV3X1dpdGhMZW5ndGgoIG5PZmZDb3VudCApOyAgLy8gb3VyIHhfcnRsX3VzdHJpbmcuaAogICAgICAgIHNhbF9Vbmljb2RlKiBvdXQgPSBwU3RyLT5idWZmZXI7CgogICAgICAgIGlmICggbk9mZkNvdW50ICE9IG9mZnNldC5nZXRMZW5ndGgoKSApCiAgICAgICAgICAgIG9mZnNldC5yZWFsbG9jKCBuT2ZmQ291bnQgKTsKCiAgICAgICAgc2FsX0ludDMyIGogPSAwOwogICAgICAgIHNhbF9JbnQzMiAqIHBBcnIgPSBvZmZzZXQuZ2V0QXJyYXkoKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpKyspCiAgICAgICAgewogICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgVE9HR0xFX0NBU0UgdHJhbnNsaXRlcmF0aW9uOgogICAgICAgICAgICBzYWxfdUludDggblRtcE1hcHBpbmdUeXBlID0gbk1hcHBpbmdUeXBlOwogICAgICAgICAgICBpZiAobk1hcHBpbmdUeXBlID09IChNYXBwaW5nVHlwZUxvd2VyVG9VcHBlciB8IE1hcHBpbmdUeXBlVXBwZXJUb0xvd2VyKSkKICAgICAgICAgICAgICAgIG5UbXBNYXBwaW5nVHlwZSA9IGxjbF9nZXRNYXBwaW5nVHlwZUZvclRvZ2dsZUNhc2UoIG5NYXBwaW5nVHlwZSwgaW5baV0gKTsKCiAgICAgICAgICAgIGNvbnN0IE1hcHBpbmcgJm1hcCA9IGNhc2Vmb2xkaW5nOjpnZXRWYWx1ZSggaW4sIGksIG5Db3VudCwgYUxvY2FsZSwgblRtcE1hcHBpbmdUeXBlICk7CiAgICAgICAgICAgIGZvciAoc2FsX0ludDMyIGsgPSAwOyBrIDwgbWFwLm5tYXA7IGsrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcEFycltqXSA9IGkgKyBzdGFydFBvczsKICAgICAgICAgICAgICAgIG91dFtqKytdID0gbWFwLm1hcFtrXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvdXRbal0gPSAwOwoKICAgICAgICByZXR1cm4gT1VTdHJpbmcoIHBTdHIsIFNBTF9OT19BQ1FVSVJFICk7IC8vIHRha2Ugb3ZlciBvd25lcnNoaXAgb2YgPHBTdHI+CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gSW4gdGhlIHNpbXBsZSBjYXNlIG9mIG5vIG9mZnNldCBzZXF1ZW5jZSB1c2VkIHdlIGNhbiBlbGltaW5hdGUgdGhlCiAgICAgICAgLy8gZmlyc3QgZ2V0VmFsdWUoKSBsb29wLiBXZSBjb3VsZCBhbHNvIGFzc3VtZSB0aGF0IG1vc3QgY2FsbHMgcmVzdWx0CiAgICAgICAgLy8gaW4gaWRlbnRpY2FsIHN0cmluZyBsZW5ndGhzLCB0aHVzIHVzaW5nIGEgcHJlYWxsb2NhdGVkCiAgICAgICAgLy8gT1VTdHJpbmdCdWZmZXIgY291bGQgYmUgYW4gZWFzeSB3YXkgdG8gYXNzZW1ibGUgdGhlIHJldHVybiBzdHJpbmcKICAgICAgICAvLyB3aXRob3V0IHRvbyBtdWNoIGhhc3NsZS4gSG93ZXZlciwgZm9yIHNpbmdsZSBjaGFyYWN0ZXJzIHRoZQogICAgICAgIC8vIE9VU3RyaW5nQnVmZmVyOjphcHBlbmQoKSBtZXRob2QgaXMgcXVpdGUgZXhwZW5zaXZlIGNvbXBhcmVkIHRvIGEKICAgICAgICAvLyBzaW1wbGUgYXJyYXkgb3BlcmF0aW9uLCBzbyBpdCBwYXlzIGhlcmUgdG8gY29weSB0aGUgZmluYWwgcmVzdWx0CiAgICAgICAgLy8gaW5zdGVhZC4KCiAgICAgICAgLy8gQWxsb2NhdGUgdGhlIG1heCBwb3NzaWJsZSBidWZmZXIuIFRyeSB0byB1c2Ugc3RhY2sgaW5zdGVhZCBvZiBoZWFwLAogICAgICAgIC8vIHdoaWNoIHdvdWxkIGhhdmUgdG8gYmUgcmVhbGxvY2F0ZWQgbW9zdCB0aW1lcyBhbnl3YXlzLgogICAgICAgIGNvbnN0IHNhbF9JbnQzMiBuTG9jYWxCdWYgPSAyMDQ4OwogICAgICAgIHNhbF9Vbmljb2RlIGFMb2NhbEJ1ZlsgbkxvY2FsQnVmICogTk1BUFBJTkdNQVggXSwgKm91dCA9IGFMb2NhbEJ1ZiwgKnBIZWFwQnVmID0gTlVMTDsKICAgICAgICBpZiAoIG5Db3VudCA+IG5Mb2NhbEJ1ZiApCiAgICAgICAgICAgIG91dCA9IHBIZWFwQnVmID0gbmV3IHNhbF9Vbmljb2RlWyBuQ291bnQgKiBOTUFQUElOR01BWCBdOwoKICAgICAgICBzYWxfSW50MzIgaiA9IDA7CiAgICAgICAgZm9yICggc2FsX0ludDMyIGkgPSAwOyBpIDwgbkNvdW50OyBpKyspCiAgICAgICAgewogICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgVE9HR0xFX0NBU0UgdHJhbnNsaXRlcmF0aW9uOgogICAgICAgICAgICBzYWxfdUludDggblRtcE1hcHBpbmdUeXBlID0gbk1hcHBpbmdUeXBlOwogICAgICAgICAgICBpZiAobk1hcHBpbmdUeXBlID09IChNYXBwaW5nVHlwZUxvd2VyVG9VcHBlciB8IE1hcHBpbmdUeXBlVXBwZXJUb0xvd2VyKSkKICAgICAgICAgICAgICAgIG5UbXBNYXBwaW5nVHlwZSA9IGxjbF9nZXRNYXBwaW5nVHlwZUZvclRvZ2dsZUNhc2UoIG5NYXBwaW5nVHlwZSwgaW5baV0gKTsKCiAgICAgICAgICAgIGNvbnN0IE1hcHBpbmcgJm1hcCA9IGNhc2Vmb2xkaW5nOjpnZXRWYWx1ZSggaW4sIGksIG5Db3VudCwgYUxvY2FsZSwgblRtcE1hcHBpbmdUeXBlICk7CiAgICAgICAgICAgIGZvciAoc2FsX0ludDMyIGsgPSAwOyBrIDwgbWFwLm5tYXA7IGsrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3V0W2orK10gPSBtYXAubWFwW2tdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBPVVN0cmluZyBhUmV0KCBvdXQsIGogKTsKICAgICAgICBpZiAoIHBIZWFwQnVmICkKICAgICAgICAgICAgZGVsZXRlIFtdIHBIZWFwQnVmOwogICAgICAgIHJldHVybiBhUmV0OwogICAgfQojZW5kaWYKfQoKT1VTdHJpbmcgU0FMX0NBTEwgClRyYW5zbGl0ZXJhdGlvbl9ib2R5Ojp0cmFuc2xpdGVyYXRlQ2hhcjJTdHJpbmcoIHNhbF9Vbmljb2RlIGluQ2hhciApIHRocm93KFJ1bnRpbWVFeGNlcHRpb24pCnsKICAgICAgICBjb25zdCBNYXBwaW5nICZtYXAgPSBjYXNlZm9sZGluZzo6Z2V0VmFsdWUoJmluQ2hhciwgMCwgMSwgYUxvY2FsZSwgbk1hcHBpbmdUeXBlKTsKICAgICAgICBydGxfdVN0cmluZyogcFN0ciA9IHhfcnRsX3VTdHJpbmdfbmV3X1dpdGhMZW5ndGgoIG1hcC5ubWFwICk7ICAvLyBvdXIgeF9ydGxfdXN0cmluZy5oCiAgICAgICAgc2FsX1VuaWNvZGUqIG91dCA9IHBTdHItPmJ1ZmZlcjsKICAgICAgICBzYWxfSW50MzIgaTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG1hcC5ubWFwOyBpKyspCiAgICAgICAgICAgIG91dFtpXSA9IG1hcC5tYXBbaV07CiAgICAgICAgb3V0W2ldID0gMDsKCiAgICAgICAgcmV0dXJuIE9VU3RyaW5nKCBwU3RyLCBTQUxfTk9fQUNRVUlSRSApOyAvLyB0YWtlIG92ZXIgb3duZXJzaGlwIG9mIDxwU3RyPgp9CgpzYWxfVW5pY29kZSBTQUxfQ0FMTCAKVHJhbnNsaXRlcmF0aW9uX2JvZHk6OnRyYW5zbGl0ZXJhdGVDaGFyMkNoYXIoIHNhbF9Vbmljb2RlIGluQ2hhciApIHRocm93KE11bHRpcGxlQ2hhcnNPdXRwdXRFeGNlcHRpb24sIFJ1bnRpbWVFeGNlcHRpb24pCnsKICAgICAgICBjb25zdCBNYXBwaW5nICZtYXAgPSBjYXNlZm9sZGluZzo6Z2V0VmFsdWUoJmluQ2hhciwgMCwgMSwgYUxvY2FsZSwgbk1hcHBpbmdUeXBlKTsKICAgICAgICBpZiAobWFwLm5tYXAgPiAxKQogICAgICAgICAgICB0aHJvdyBNdWx0aXBsZUNoYXJzT3V0cHV0RXhjZXB0aW9uKCk7CiAgICAgICAgcmV0dXJuIG1hcC5tYXBbMF07Cn0KCk9VU3RyaW5nIFNBTF9DQUxMClRyYW5zbGl0ZXJhdGlvbl9ib2R5Ojpmb2xkaW5nKCBjb25zdCBPVVN0cmluZyYgaW5TdHIsIHNhbF9JbnQzMiBzdGFydFBvcywgc2FsX0ludDMyIG5Db3VudCwgCglTZXF1ZW5jZTwgc2FsX0ludDMyID4mIG9mZnNldCkgdGhyb3coUnVudGltZUV4Y2VwdGlvbikKewoJcmV0dXJuIHRoaXMtPnRyYW5zbGl0ZXJhdGUoaW5TdHIsIHN0YXJ0UG9zLCBuQ291bnQsIG9mZnNldCk7Cn0KClRyYW5zbGl0ZXJhdGlvbl9jYXNlbWFwcGluZzo6VHJhbnNsaXRlcmF0aW9uX2Nhc2VtYXBwaW5nKCkKewoJbk1hcHBpbmdUeXBlID0gMDsKCXRyYW5zbGl0ZXJhdGlvbk5hbWUgPSAiY2FzZW1hcHBpbmcoZ2VuZXJpYykiOwoJaW1wbGVtZW50YXRpb25OYW1lID0gImNvbS5zdW4uc3Rhci5pMThuLlRyYW5zbGl0ZXJhdGlvbi5UcmFuc2xpdGVyYXRpb25fY2FzZW1hcHBpbmciOwp9Cgp2b2lkIFNBTF9DQUxMClRyYW5zbGl0ZXJhdGlvbl9jYXNlbWFwcGluZzo6c2V0TWFwcGluZ1R5cGUoIGNvbnN0IHNhbF91SW50OCByTWFwcGluZ1R5cGUsIGNvbnN0IExvY2FsZSYgckxvY2FsZSApCnsKCW5NYXBwaW5nVHlwZSA9IHJNYXBwaW5nVHlwZTsKCWFMb2NhbGUgPSByTG9jYWxlOwp9CgpUcmFuc2xpdGVyYXRpb25fdTJsOjpUcmFuc2xpdGVyYXRpb25fdTJsKCkKewoJbk1hcHBpbmdUeXBlID0gTWFwcGluZ1R5cGVVcHBlclRvTG93ZXI7Cgl0cmFuc2xpdGVyYXRpb25OYW1lID0gInVwcGVyX3RvX2xvd2VyKGdlbmVyaWMpIjsKCWltcGxlbWVudGF0aW9uTmFtZSA9ICJjb20uc3VuLnN0YXIuaTE4bi5UcmFuc2xpdGVyYXRpb24uVHJhbnNsaXRlcmF0aW9uX3UybCI7Cn0KClRyYW5zbGl0ZXJhdGlvbl9sMnU6OlRyYW5zbGl0ZXJhdGlvbl9sMnUoKQp7CgluTWFwcGluZ1R5cGUgPSBNYXBwaW5nVHlwZUxvd2VyVG9VcHBlcjsKCXRyYW5zbGl0ZXJhdGlvbk5hbWUgPSAibG93ZXJfdG9fdXBwZXIoZ2VuZXJpYykiOwoJaW1wbGVtZW50YXRpb25OYW1lID0gImNvbS5zdW4uc3Rhci5pMThuLlRyYW5zbGl0ZXJhdGlvbi5UcmFuc2xpdGVyYXRpb25fbDJ1IjsKfQoKVHJhbnNsaXRlcmF0aW9uX3RvZ2dsZWNhc2U6OlRyYW5zbGl0ZXJhdGlvbl90b2dnbGVjYXNlKCkKewogICAgLy8gdXN1YWxseSBuTWFwcGluZ1R5cGUgbXVzdCBOT1QgYmUgYSBjb21iaWFudGlvbiBvZiBkaWZmZXJlbnQgZmxhZ2VzIGhlcmUsCiAgICAvLyBidXQgd2UgdGFrZSBjYXJlIG9mIHRoYXQgcHJvYmxlbSBpbiBUcmFuc2xpdGVyYXRpb25fYm9keTo6dHJhbnNsaXRlcmF0ZSBhYm92ZQogICAgLy8gYmVmb3JlIHRoYXQgdmFsdWUgaXMgdXNlZC4gVGhlcmUgd2Ugd2lsbCBkZWNpZGUgd2hpY2ggb2YgYm90aCBpcyB0byBiZSB1c2VkIG9uCiAgICAvLyBhIHBlciBjaGFyYWN0ZXIgYmFzaXMuCiAgICBuTWFwcGluZ1R5cGUgPSBNYXBwaW5nVHlwZUxvd2VyVG9VcHBlciB8IE1hcHBpbmdUeXBlVXBwZXJUb0xvd2VyOwogICAgdHJhbnNsaXRlcmF0aW9uTmFtZSA9ICJ0b2dnbGUoZ2VuZXJpYykiOwogICAgaW1wbGVtZW50YXRpb25OYW1lID0gImNvbS5zdW4uc3Rhci5pMThuLlRyYW5zbGl0ZXJhdGlvbi5UcmFuc2xpdGVyYXRpb25fdG9nZ2xlY2FzZSI7Cn0KClRyYW5zbGl0ZXJhdGlvbl90aXRsZWNhc2U6OlRyYW5zbGl0ZXJhdGlvbl90aXRsZWNhc2UoKQp7CiAgICBuTWFwcGluZ1R5cGUgPSBNYXBwaW5nVHlwZVRvVGl0bGU7CiAgICB0cmFuc2xpdGVyYXRpb25OYW1lID0gInRpdGxlKGdlbmVyaWMpIjsKICAgIGltcGxlbWVudGF0aW9uTmFtZSA9ICJjb20uc3VuLnN0YXIuaTE4bi5UcmFuc2xpdGVyYXRpb24uVHJhbnNsaXRlcmF0aW9uX3RpdGxlY2FzZSI7Cn0KCiNpZiAwCnN0cnVjdCBMaWdhdHVyZURhdGEKewogICAgc2FsX3VJbnQzMiAgY0NoYXI7CiAgICBzYWxfQ2hhciAqICBwVXRmOFRleHQ7Cn07CgovLyBhdmFpbGFibGUgVW5pY29kZSBsaWdhdHVyZXM6Ci8vIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzCi8vIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL1BERi9VRkIwMC5wZGYKc3RhdGljIExpZ2F0dXJlRGF0YSBhTGlnYXR1cmVzW10gPQp7CiAgICB7IDB4MEZCMDAsICAgICAiZmYiIH0sCiAgICB7IDB4MEZCMDEsICAgICAiZmkiIH0sCiAgICB7IDB4MEZCMDIsICAgICAiZmwiIH0sCiAgICB7IDB4MEZCMDMsICAgICAiZmZpIiB9LAogICAgeyAweDBGQjA0LCAgICAgImZmbCIgfSwKICAgIHsgMHgwRkIwNSwgICAgICJmdCIgfSwKICAgIHsgMHgwRkIwNiwgICAgICJzdCIgfSwKCiAgICB7IDB4MEZCMTMsICAgICAiXHhENVx4QjRceEQ1XHhCNiIgfSwgICAgIC8vIEFybWVuaWFuIHNtYWxsIG1lbiBub3cKICAgIHsgMHgwRkIxNCwgICAgICJceEQ1XHhCNFx4RDVceEE1IiB9LCAgICAgLy8gQXJtZW5pYW4gc21hbGwgbWVuIGVjaAogICAgeyAweDBGQjE1LCAgICAgIlx4RDVceEI0XHhENVx4QUIiIH0sICAgICAvLyBBcm1lbmlhbiBzbWFsbCBtZW4gaW5pCiAgICB7IDB4MEZCMTYsICAgICAiXHhENVx4QkVceEQ1XHhCNiIgfSwgICAgIC8vIEFybWVuaWFuIHNtYWxsIHZldyBub3cKICAgIHsgMHgwRkIxNywgICAgICJceEQ1XHhCNFx4RDVceEFEIiB9LCAgICAgLy8gQXJtZW5pYW4gc21hbGwgbWVuIHhlaAogICAgeyAweDAwMDAwLCAgICAgIiIgfQp9OwoKc3RhdGljIGlubGluZSBib29sIGxjbF9Jc0xpZ2F0dXJlKCBzYWxfdUludDMyIGNDaGFyICkKewogICAgcmV0dXJuICgweDBGQjAwIDw9IGNDaGFyICYmIGNDaGFyIDw9IDB4MEZCMDYpIHx8ICgweDBGQjEzIDw9IGNDaGFyICYmIGNDaGFyIDw9IDB4MEZCMTcpOwp9CgpzdGF0aWMgcnRsOjpPVVN0cmluZyBsY2xfUmVzb2x2ZUxpZ2F0dXJlKCBzYWxfdUludDMyIGNDaGFyICkKewogICAgcnRsOjpPVVN0cmluZyBhUmVzOwogICAgaWYgKGxjbF9Jc0xpZ2F0dXJlKCBjQ2hhciApKQogICAgewogICAgICAgIExpZ2F0dXJlRGF0YSAqcEZvdW5kID0gTlVMTDsKICAgICAgICBMaWdhdHVyZURhdGEgKnBEYXRhID0gYUxpZ2F0dXJlczsKICAgICAgICB3aGlsZSAoIXBGb3VuZCAmJiBwRGF0YS0+Y0NoYXIgIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwRGF0YS0+Y0NoYXIgPT0gY0NoYXIpCiAgICAgICAgICAgICAgICBwRm91bmQgPSBwRGF0YTsKICAgICAgICAgICAgKytwRGF0YTsKICAgICAgICB9CiAgICAgICAgaWYgKHBGb3VuZCkKICAgICAgICAgICAgYVJlcyA9IHJ0bDo6T1VTdHJpbmcoIHBGb3VuZC0+cFV0ZjhUZXh0LCBzdHJsZW4oIHBGb3VuZC0+cFV0ZjhUZXh0ICksIFJUTF9URVhURU5DT0RJTkdfVVRGOCApOwogICAgfQogICAgZWxzZQogICAgICAgIGFSZXMgPSBydGw6Ok9VU3RyaW5nKCAmY0NoYXIsIDEgKTsKICAgIHJldHVybiBhUmVzOwp9CiNlbmRpZiAvLyBpZiAwCgpzdGF0aWMgcnRsOjpPVVN0cmluZyB0cmFuc2xpdGVyYXRlX3RpdGxlY2FzZV9JbXBsKAogICAgY29uc3QgT1VTdHJpbmcmIGluU3RyLCBzYWxfSW50MzIgc3RhcnRQb3MsIHNhbF9JbnQzMiBuQ291bnQsIAogICAgY29uc3QgTG9jYWxlICZyTG9jYWxlLAoJU2VxdWVuY2U8IHNhbF9JbnQzMiA+JiBvZmZzZXQgKSAKICAgIHRocm93KFJ1bnRpbWVFeGNlcHRpb24pCnsKICAgIGNvbnN0IE9VU3RyaW5nIGFUZXh0KCBpblN0ci5jb3B5KCBzdGFydFBvcywgbkNvdW50ICkgKTsKCiAgICBPVVN0cmluZyBhUmVzOwogICAgaWYgKGFUZXh0LmdldExlbmd0aCgpID4gMCkKICAgIHsKICAgICAgICBSZWZlcmVuY2U8IFhNdWx0aVNlcnZpY2VGYWN0b3J5ID4geE1TRiA9IDo6Y29tcGhlbHBlcjo6Z2V0UHJvY2Vzc1NlcnZpY2VGYWN0b3J5KCk7CiAgICAgICAgQ2hhcmFjdGVyQ2xhc3NpZmljYXRpb25JbXBsIGFDaGFyQ2xhc3NJbXBsKCB4TVNGICk7CgogICAgICAgIC8vIGJlY2F1c2UgYUNoYXJDbGFzc0ltcGwudG9UaXRsZSBkb2VzIG5vdCBoYW5kbGUgbGlnYXR1cmVzIG9yIN8gYnV0IHdpbGwgcmFpc2UgCiAgICAgICAgLy8gYW4gZXhjZXB0aW9uIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBmaXJzdCBjaGFyYSBtYW51YWxseS4uLgoKICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBzdXJyb2dhdGVzIGJ5IGFjY2lkZW50LCB0aHVzZSB3ZSB1c2UgcHJvcGVyIGNvZGUgcG9pbnQgaXRlcmF0aW9uCiAgICAgICAgc2FsX0ludDMyIG5Qb3MgPSAwOwogICAgICAgIHNhbF91SW50MzIgY0ZpcnN0Q2hhciA9IGFUZXh0Lml0ZXJhdGVDb2RlUG9pbnRzKCAmblBvcyApOwogICAgICAgIE9VU3RyaW5nIGFSZXNvbHZlZExpZ2F0dXJlKCAmY0ZpcnN0Q2hhciwgMSApOyAvL2xjbF9SZXNvbHZlTGlnYXR1cmUoIGNGaXJzdENoYXIgKSApOwogICAgICAgIC8vIHRvVXBwZXIgY2FuIGJlIHVzZWQgdG8gcHJvcGVybHkgcmVzb2x2ZSBsaWdhdHVyZXMgYW5kIGNoYXJhY3RlcnMgbGlrZSDfCiAgICAgICAgYVJlc29sdmVkTGlnYXR1cmUgPSBhQ2hhckNsYXNzSW1wbC50b1VwcGVyKCBhUmVzb2x2ZWRMaWdhdHVyZSwgMCwgYVJlc29sdmVkTGlnYXR1cmUuZ2V0TGVuZ3RoKCksIHJMb2NhbGUgKTsKICAgICAgICAvLyBzaW5jZSB0b1RpdGxlIHdpbGwgbGVhdmUgYWxsLXVwcGVyY2FzZSB0ZXh0IHVuY2hhbmdlZCB3ZSBmaXJzdCBuZWVkIHRvCiAgICAgICAgLy8gdXNlIHRvTG93ZXIgdG8gYnJpbmcgcG9zc2libGUgMm5kIGFuZCBmb2xsb3dpbmcgY2hhcmFzIGluIGxvd2VyY2FzZQogICAgICAgIGFSZXNvbHZlZExpZ2F0dXJlID0gYUNoYXJDbGFzc0ltcGwudG9Mb3dlciggYVJlc29sdmVkTGlnYXR1cmUsIDAsIGFSZXNvbHZlZExpZ2F0dXJlLmdldExlbmd0aCgpLCByTG9jYWxlICk7CiAgICAgICAgc2FsX0ludDMyIG5SZXNvbHZlZExlbiA9IGFSZXNvbHZlZExpZ2F0dXJlLmdldExlbmd0aCgpOwoKICAgICAgICAvLyBub3cgd2UgY2FuIHByb3Blcmx5IHVzZSB0b1RpdGxlIHRvIGdldCB0aGUgZXhwZWN0ZWQgcmVzdWx0IGZvciB0aGUgcmVzb2x2ZWQgc3RyaW5nLgogICAgICAgIC8vIFRoZSByZXN0IG9mIHRoZSB0ZXh0IHNob3VsZCBqdXN0IGJlY29tZSBsb3dlcmNhc2UuCiAgICAgICAgYVJlcyA9IGFDaGFyQ2xhc3NJbXBsLnRvVGl0bGUoIGFSZXNvbHZlZExpZ2F0dXJlLCAwLCBuUmVzb2x2ZWRMZW4sIHJMb2NhbGUgKTsKICAgICAgICBhUmVzICs9IGFDaGFyQ2xhc3NJbXBsLnRvTG93ZXIoIGFUZXh0LCAxLCBhVGV4dC5nZXRMZW5ndGgoKSAtIDEsIHJMb2NhbGUgKTsKICAgICAgICBvZmZzZXQucmVhbGxvYyggYVJlcy5nZXRMZW5ndGgoKSApOwoKICAgICAgICBzYWxfSW50MzIgKnBPZmZzZXQgPSBvZmZzZXQuZ2V0QXJyYXkoKTsKICAgICAgICBzYWxfSW50MzIgbkxlbiA9IG9mZnNldC5nZXRMZW5ndGgoKTsKICAgICAgICBmb3IgKHNhbF9JbnQzMiBpID0gMDsgaSA8IG5MZW47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIHNhbF9JbnQzMiBuSWR4ID0gMDsKICAgICAgICAgICAgaWYgKGkgPj0gblJlc29sdmVkTGVuKQogICAgICAgICAgICAgICAgbklkeCA9IGkgLSBuUmVzb2x2ZWRMZW4gKyAxOwogICAgICAgICAgICBwT2Zmc2V0W2ldID0gbklkeDsKICAgICAgICB9CiAgICB9CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCiAgICBjb25zdCBzYWxfSW50MzIgKnBDT2Zmc2V0ID0gb2Zmc2V0LmdldENvbnN0QXJyYXkoKTsKICAgICh2b2lkKSBwQ09mZnNldDsKI2VuZGlmCgogICAgcmV0dXJuIGFSZXM7Cn0KCgovLyB0aGlzIGZ1bmN0aW9uIGV4cGVjdHMgdG8gYmUgY2FsbGVkIG9uIGEgd29yZC1ieS13b3JkIGJhc2lzLAovLyBuYW1lbHkgdGhhdCBzdGFydFBvcyBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXIgb2YgdGhlIHdvcmQKcnRsOjpPVVN0cmluZyBTQUxfQ0FMTCBUcmFuc2xpdGVyYXRpb25fdGl0bGVjYXNlOjp0cmFuc2xpdGVyYXRlKCAKICAgIGNvbnN0IE9VU3RyaW5nJiBpblN0ciwgc2FsX0ludDMyIHN0YXJ0UG9zLCBzYWxfSW50MzIgbkNvdW50LCAKCVNlcXVlbmNlPCBzYWxfSW50MzIgPiYgb2Zmc2V0ICkgCiAgICB0aHJvdyhSdW50aW1lRXhjZXB0aW9uKQp7CiAgICByZXR1cm4gdHJhbnNsaXRlcmF0ZV90aXRsZWNhc2VfSW1wbCggaW5TdHIsIHN0YXJ0UG9zLCBuQ291bnQsIGFMb2NhbGUsIG9mZnNldCApOwp9CgoKVHJhbnNsaXRlcmF0aW9uX3NlbnRlbmNlY2FzZTo6VHJhbnNsaXRlcmF0aW9uX3NlbnRlbmNlY2FzZSgpCnsKICAgIG5NYXBwaW5nVHlwZSA9IE1hcHBpbmdUeXBlVG9UaXRsZTsgIC8vIHRob3VnaCBvbmx5IHRvIGJlIGFwcGxpZWQgdG8gdGhlIGZpcnN0IHdvcmQuLi4KICAgIHRyYW5zbGl0ZXJhdGlvbk5hbWUgPSAic2VudGVuY2UoZ2VuZXJpYykiOwogICAgaW1wbGVtZW50YXRpb25OYW1lID0gImNvbS5zdW4uc3Rhci5pMThuLlRyYW5zbGl0ZXJhdGlvbi5UcmFuc2xpdGVyYXRpb25fc2VudGVuY2VjYXNlIjsKfQoKCi8vIHRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0byBiZSBjYWxsZWQgb24gYSBzZW50ZW5jZS1ieS1zZW50ZW5jZSBiYXNpcywKLy8gbmFtZWx5IHRoYXQgc3RhcnRQb3MgcG9pbnRzIHRvIHRoZSBmaXJzdCB3b3JkIChOT1QgZmlyc3QgY2hhciEpIGluIHRoZSBzZW50ZW5jZQpydGw6Ok9VU3RyaW5nIFNBTF9DQUxMIFRyYW5zbGl0ZXJhdGlvbl9zZW50ZW5jZWNhc2U6OnRyYW5zbGl0ZXJhdGUoIAogICAgY29uc3QgT1VTdHJpbmcmIGluU3RyLCBzYWxfSW50MzIgc3RhcnRQb3MsIHNhbF9JbnQzMiBuQ291bnQsIAogICAgU2VxdWVuY2U8IHNhbF9JbnQzMiA+JiBvZmZzZXQgKQogICAgdGhyb3coUnVudGltZUV4Y2VwdGlvbikKewogICAgcmV0dXJuIHRyYW5zbGl0ZXJhdGVfdGl0bGVjYXNlX0ltcGwoIGluU3RyLCBzdGFydFBvcywgbkNvdW50LCBhTG9jYWxlLCBvZmZzZXQgKTsKfQoKCn0gfSB9IH0KCg==