ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWJkZGZhLi4wMDAwMDAwCi0tLSBhL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0IEZyZWVUeXBlIGJ1aWxkIGZvciBBbmRyb2lkCi0jCi1pZm5kZWYgVVNFX0ZSRUVUWVBFCi1VU0VfRlJFRVRZUEUgOj0gMi4zLjYKLWVuZGlmCi0KLWlmZXEgKCQoVVNFX0ZSRUVUWVBFKSwyLjMuNikKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMgY29tcGlsZSBpbiBBUk0gbW9kZSwgc2luY2UgdGhlIGdseXBoIGxvYWRlci9yZW5kZXJlciBpcyBhIGhvdHNwb3QKLSMgd2hlbiBsb2FkaW5nIGNvbXBsZXggcGFnZXMgaW4gdGhlIGJyb3dzZXIKLSMKLUxPQ0FMX0FSTV9NT0RFIDo9IGFybQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0Jc3JjL2Jhc2UvZnRiYm94LmMgXAotCXNyYy9iYXNlL2Z0Yml0bWFwLmMgXAotCXNyYy9iYXNlL2Z0Z2x5cGguYyBcCi0Jc3JjL2Jhc2UvZnRzdHJva2UuYyBcCi0Jc3JjL2Jhc2UvZnR4Zjg2LmMgXAotCXNyYy9iYXNlL2Z0YmFzZS5jIFwKLQlzcmMvYmFzZS9mdHN5c3RlbS5jIFwKLQlzcmMvYmFzZS9mdGluaXQuYyBcCi0Jc3JjL2Jhc2UvZnRnYXNwLmMgXAotCXNyYy9iYXNlL2Z0YWR2YW5jLmMgXAotCXNyYy9yYXN0ZXIvcmFzdGVyLmMgXAotCXNyYy9zZm50L3NmbnQuYyBcCi0Jc3JjL3Ntb290aC9zbW9vdGguYyBcCi0Jc3JjL2F1dG9maXQvYXV0b2ZpdC5jIFwKLQlzcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYyBcCi0Jc3JjL2NmZi9jZmYuYyBcCi0Jc3JjL3BzbmFtZXMvcHNuYW1lcy5jIFwKLQlzcmMvcHNoaW50ZXIvcHNoaW50ZXIuYwotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLQkkKExPQ0FMX1BBVEgpL2J1aWxkcyBcCi0JJChMT0NBTF9QQVRIKS9pbmNsdWRlCi0KLUxPQ0FMX0NGTEFHUyArPSAtVyAtV2FsbAotTE9DQUxfQ0ZMQUdTICs9IC1mUElDIC1EUElDCi1MT0NBTF9DRkxBR1MgKz0gIi1EREFSV0lOX05PX0NBUkJPTiIKLUxPQ0FMX0NGTEFHUyArPSAiLURGVDJfQlVJTERfTElCUkFSWSIKLQotIyBvbmx5IGVuYWJsZSB0aGlzIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBvdXIgdWdseSBmb250IGhhY2sKLSMgdG8gYmUgYWJsZSB0byBzd2l0Y2ggdGhlIHN5c3RlbSdzIGZvbnQgaGludGluZyBhdCBydW50aW1lCi0jIHRocm91Z2ggb3VyIG1vZGlmaWVkIERldmVsb3BtZW50IFNldHRpbmdzLiB0aGUgY2hhbmdlIHdpbGwKLSMgb25seSBoYXBwZW4gd2hlbiB5b3UgcmVib290IG9yIHJlc3RhcnQgYW4gYXBwbGljYXRpb24KLSMKLUxPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfRk9OVF9IQUNLPTEKLQotIyBlbmFibGUgdGhlIEZyZWVUeXBlIGludGVybmFsIG1lbW9yeSBkZWJ1Z2dlciBpbiB0aGUgc2ltdWxhdG9yCi0jIHlvdSBuZWVkIHRvIGRlZmluZSB0aGUgRlQyX0RFQlVHX01FTU9SWSBlbnZpcm9ubWVudCB2YXJpYWJsZQotIyB3aGVuIHJ1bm5pbmcgdGhlIHByb2dyYW0gdG8gYWN0aXZhdGUgaXQuIEl0IHdpbGwgZHVtcCBtZW1vcnkKLSMgc3RhdGlzdGljcyB3aGVuIEZUX0RvbmVfRnJlZVR5cGUgaXMgY2FsbGVkCi0jCi1pZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi1MT0NBTF9DRkxBR1MgKz0gIi1ERlRfREVCVUdfTUVNT1JZIgotZW5kaWYKLQotIyB0aGUgZm9sbG93aW5nIGFjdGl2YXRlcyB0aGUgbmV3IGV4cGVyaW1lbnRhbCBhdXRvLWhpbnRlcgotIyBvbmUgdGhhdCBzaG91bGQgY3JlYXRlIGxlc3MgcHJvYmxlbXMgd2l0aCBhIHdpZGUgdmFyaWV0eQotIyBvZiBnbHlwaHMsIGluY2x1ZGluZyBvdXIgZG91YmxlLWRlY2tlciAiZyIKLSNMT0NBTF9DRkxBR1MgKz0gLURGVF9PUFRJT05fQVVUT0ZJVDIKLQotIyB0aGUgZm9sbG93aW5nIGlzIGZvciB0ZXN0aW5nIG9ubHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gZmluYWwgYnVpbGRzCi0jIG9mIHRoZSBwcm9kdWN0Ci0jTE9DQUxfQ0ZMQUdTICs9ICItRFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIiCi0KLWlmZXEgKCQoVEFSR0VUX0JVSUxEX1RZUEUpLHJlbGVhc2UpCi0JTE9DQUxfQ0ZMQUdTICs9IC1PMgotZW5kaWYKLQotTE9DQUxfTU9EVUxFOj0gbGliZnQyCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKLWVuZGlmCi0KZGlmZiAtLWdpdCBhL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFIGIvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDExNGExLi4wMDAwMDAwCi0tLSBhL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1UaGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2YgdGhlIEZyZWVUeXBlIFRlYW0uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICBUaGUgRnJlZVR5cGUgUHJvamVjdCBMSUNFTlNFCi0gICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDYtSmFuLTI3Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IDE5OTYtMjAwMiwgMjAwNiBieQotICAgICAgICAgIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZwotCi0KLQotSW50cm9kdWN0aW9uCi09PT09PT09PT09PT0KLQotICBUaGUgRnJlZVR5cGUgIFByb2plY3QgaXMgZGlzdHJpYnV0ZWQgaW4gIHNldmVyYWwgYXJjaGl2ZSBwYWNrYWdlczsKLSAgc29tZSBvZiB0aGVtIG1heSBjb250YWluLCBpbiBhZGRpdGlvbiB0byB0aGUgRnJlZVR5cGUgZm9udCBlbmdpbmUsCi0gIHZhcmlvdXMgdG9vbHMgYW5kICBjb250cmlidXRpb25zIHdoaWNoIHJlbHkgb24sIG9yICByZWxhdGUgdG8sIHRoZQotICBGcmVlVHlwZSBQcm9qZWN0LgotCi0gIFRoaXMgIGxpY2Vuc2UgYXBwbGllcyAgdG8gYWxsICBmaWxlcyBmb3VuZCAgaW4gc3VjaCAgcGFja2FnZXMsIGFuZAotICB3aGljaCBkbyBub3QgIGZhbGwgdW5kZXIgdGhlaXIgb3duIGV4cGxpY2l0ICBsaWNlbnNlLiAgVGhlIGxpY2Vuc2UKLSAgYWZmZWN0cyAgdGh1cyAgdGhlICBGcmVlVHlwZSAgIGZvbnQgIGVuZ2luZSwgIHRoZSAgdGVzdCAgcHJvZ3JhbXMsCi0gIGRvY3VtZW50YXRpb24gYW5kIG1ha2VmaWxlcywgYXQgdGhlIHZlcnkgbGVhc3QuCi0KLSAgVGhpcyAgbGljZW5zZSAgIHdhcyAgaW5zcGlyZWQgIGJ5ICB0aGUgIEJTRCwgICBBcnRpc3RpYywgIGFuZCAgSUpHCi0gIChJbmRlcGVuZGVudCBKUEVHICBHcm91cCkgbGljZW5zZXMsIHdoaWNoICBhbGwgZW5jb3VyYWdlIGluY2x1c2lvbgotICBhbmQgIHVzZSBvZiAgZnJlZSAgc29mdHdhcmUgaW4gIGNvbW1lcmNpYWwgIGFuZCBmcmVld2FyZSAgcHJvZHVjdHMKLSAgYWxpa2UuICBBcyBhIGNvbnNlcXVlbmNlLCBpdHMgbWFpbiBwb2ludHMgYXJlIHRoYXQ6Ci0KLSAgICBvIFdlIGRvbid0IHByb21pc2UgdGhhdCB0aGlzIHNvZnR3YXJlIHdvcmtzLiBIb3dldmVyLCB3ZSB3aWxsIGJlCi0gICAgICBpbnRlcmVzdGVkIGluIGFueSBraW5kIG9mIGJ1ZyByZXBvcnRzLiAoYGFzIGlzJyBkaXN0cmlidXRpb24pCi0KLSAgICBvIFlvdSBjYW4gIHVzZSB0aGlzIHNvZnR3YXJlIGZvciB3aGF0ZXZlciB5b3UgIHdhbnQsIGluIHBhcnRzIG9yCi0gICAgICBmdWxsIGZvcm0sIHdpdGhvdXQgaGF2aW5nIHRvIHBheSB1cy4gKGByb3lhbHR5LWZyZWUnIHVzYWdlKQotCi0gICAgbyBZb3UgbWF5IG5vdCBwcmV0ZW5kIHRoYXQgIHlvdSB3cm90ZSB0aGlzIHNvZnR3YXJlLiAgSWYgeW91IHVzZQotICAgICAgaXQsIG9yICBvbmx5IHBhcnRzIG9mIGl0LCAgaW4gYSBwcm9ncmFtLCAgeW91IG11c3QgYWNrbm93bGVkZ2UKLSAgICAgIHNvbWV3aGVyZSAgaW4gIHlvdXIgIGRvY3VtZW50YXRpb24gIHRoYXQgIHlvdSAgaGF2ZSAgdXNlZCAgdGhlCi0gICAgICBGcmVlVHlwZSBjb2RlLiAoYGNyZWRpdHMnKQotCi0gIFdlICBzcGVjaWZpY2FsbHkgIHBlcm1pdCAgYW5kICBlbmNvdXJhZ2UgIHRoZSAgaW5jbHVzaW9uICBvZiAgdGhpcwotICBzb2Z0d2FyZSwgd2l0aCAgb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCAgaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KLSAgV2UgIGRpc2NsYWltICBhbGwgd2FycmFudGllcyAgY292ZXJpbmcgIFRoZSAgRnJlZVR5cGUgUHJvamVjdCAgYW5kCi0gIGFzc3VtZSBubyBsaWFiaWxpdHkgcmVsYXRlZCB0byBUaGUgRnJlZVR5cGUgUHJvamVjdC4KLQotCi0gIEZpbmFsbHksICBtYW55ICBwZW9wbGUgIGFza2VkICB1cyAgZm9yICBhICBwcmVmZXJyZWQgIGZvcm0gIGZvciAgYQotICBjcmVkaXQvZGlzY2xhaW1lciB0byB1c2UgaW4gY29tcGxpYW5jZSB3aXRoIHRoaXMgbGljZW5zZS4gIFdlIHRodXMKLSAgZW5jb3VyYWdlIHlvdSB0byB1c2UgdGhlIGZvbGxvd2luZyB0ZXh0OgotCi0gICAiIiIgIAotICAgIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGNvcHlyaWdodCCpIDx5ZWFyPiBUaGUgRnJlZVR5cGUKLSAgICBQcm9qZWN0ICh3d3cuZnJlZXR5cGUub3JnKS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICAiIiIKLQotICBQbGVhc2UgcmVwbGFjZSA8eWVhcj4gd2l0aCB0aGUgdmFsdWUgZnJvbSB0aGUgRnJlZVR5cGUgdmVyc2lvbiB5b3UKLSAgYWN0dWFsbHkgdXNlLgotCi0KLUxlZ2FsIFRlcm1zCi09PT09PT09PT09PQotCi0wLiBEZWZpbml0aW9ucwotLS0tLS0tLS0tLS0tLS0KLQotICBUaHJvdWdob3V0IHRoaXMgbGljZW5zZSwgIHRoZSB0ZXJtcyBgcGFja2FnZScsIGBGcmVlVHlwZSBQcm9qZWN0JywKLSAgYW5kICBgRnJlZVR5cGUgIGFyY2hpdmUnIHJlZmVyICB0byAgdGhlICBzZXQgIG9mIGZpbGVzICBvcmlnaW5hbGx5Ci0gIGRpc3RyaWJ1dGVkICBieSB0aGUgIGF1dGhvcnMgIChEYXZpZCBUdXJuZXIsICBSb2JlcnQgV2lsaGVsbSwgIGFuZAotICBXZXJuZXIgTGVtYmVyZykgYXMgdGhlIGBGcmVlVHlwZSBQcm9qZWN0JywgYmUgdGhleSBuYW1lZCBhcyBhbHBoYSwKLSAgYmV0YSBvciBmaW5hbCByZWxlYXNlLgotCi0gIGBZb3UnIHJlZmVycyB0byAgdGhlIGxpY2Vuc2VlLCBvciBwZXJzb24gdXNpbmcgIHRoZSBwcm9qZWN0LCB3aGVyZQotICBgdXNpbmcnIGlzIGEgZ2VuZXJpYyB0ZXJtIGluY2x1ZGluZyBjb21waWxpbmcgdGhlIHByb2plY3QncyBzb3VyY2UKLSAgY29kZSBhcyAgd2VsbCBhcyBsaW5raW5nIGl0ICB0byBmb3JtIGEgIGBwcm9ncmFtJyBvciBgZXhlY3V0YWJsZScuCi0gIFRoaXMgIHByb2dyYW0gaXMgIHJlZmVycmVkIHRvICBhcyAgYGEgcHJvZ3JhbSAgdXNpbmcgdGhlICBGcmVlVHlwZQotICBlbmdpbmUnLgotCi0gIFRoaXMgIGxpY2Vuc2UgYXBwbGllcyAgdG8gYWxsICBmaWxlcyBkaXN0cmlidXRlZCAgaW4gIHRoZSBvcmlnaW5hbAotICBGcmVlVHlwZSAgUHJvamVjdCwgICBpbmNsdWRpbmcgIGFsbCAgc291cmNlICAgY29kZSwgIGJpbmFyaWVzICBhbmQKLSAgZG9jdW1lbnRhdGlvbiwgIHVubGVzcyAgb3RoZXJ3aXNlICBzdGF0ZWQgICBpbiAgdGhlICBmaWxlICBpbiAgaXRzCi0gIG9yaWdpbmFsLCB1bm1vZGlmaWVkIGZvcm0gYXMgIGRpc3RyaWJ1dGVkIGluIHRoZSBvcmlnaW5hbCBhcmNoaXZlLgotICBJZiB5b3UgYXJlICB1bnN1cmUgd2hldGhlciBvciBub3QgYSBwYXJ0aWN1bGFyICBmaWxlIGlzIGNvdmVyZWQgYnkKLSAgdGhpcyBsaWNlbnNlLCB5b3UgbXVzdCBjb250YWN0IHVzIHRvIHZlcmlmeSB0aGlzLgotCi0gIFRoZSBGcmVlVHlwZSAgUHJvamVjdCBpcyBjb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCAgYnkgRGF2aWQgVHVybmVyLAotICBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgQWxsIHJpZ2h0cyByZXNlcnZlZCBleGNlcHQgYXMKLSAgc3BlY2lmaWVkIGJlbG93LgotCi0xLiBObyBXYXJyYW50eQotLS0tLS0tLS0tLS0tLS0KLQotICBUSEUgRlJFRVRZUEUgUFJPSkVDVCAgSVMgUFJPVklERUQgYEFTIElTJyBXSVRIT1VUICBXQVJSQU5UWSBPRiBBTlkKLSAgS0lORCwgRUlUSEVSICBFWFBSRVNTIE9SIElNUExJRUQsICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgVE8sCi0gIFdBUlJBTlRJRVMgIE9GICBNRVJDSEFOVEFCSUxJVFkgICBBTkQgIEZJVE5FU1MgIEZPUiAgQSAgUEFSVElDVUxBUgotICBQVVJQT1NFLiAgSU4gTk8gRVZFTlQgV0lMTCBBTlkgT0YgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKLSAgQkUgTElBQkxFICBGT1IgQU5ZIERBTUFHRVMgQ0FVU0VEICBCWSBUSEUgVVNFIE9SICBUSEUgSU5BQklMSVRZIFRPCi0gIFVTRSwgT0YgVEhFIEZSRUVUWVBFIFBST0pFQ1QuCi0KLTIuIFJlZGlzdHJpYnV0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFRoaXMgIGxpY2Vuc2UgIGdyYW50cyAgYSAgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUsICBwZXJwZXR1YWwgIGFuZAotICBpcnJldm9jYWJsZSByaWdodCAgYW5kIGxpY2Vuc2UgdG8gdXNlLCAgZXhlY3V0ZSwgcGVyZm9ybSwgY29tcGlsZSwKLSAgZGlzcGxheSwgIGNvcHksICAgY3JlYXRlICBkZXJpdmF0aXZlICB3b3JrcyAgIG9mLCAgZGlzdHJpYnV0ZSAgYW5kCi0gIHN1YmxpY2Vuc2UgdGhlICBGcmVlVHlwZSBQcm9qZWN0IChpbiAgYm90aCBzb3VyY2UgYW5kICBvYmplY3QgY29kZQotICBmb3JtcykgIGFuZCAgZGVyaXZhdGl2ZSB3b3JrcyAgdGhlcmVvZiAgZm9yICBhbnkgIHB1cnBvc2U7IGFuZCAgdG8KLSAgYXV0aG9yaXplIG90aGVycyAgdG8gZXhlcmNpc2UgIHNvbWUgb3IgYWxsICBvZiB0aGUgIHJpZ2h0cyBncmFudGVkCi0gIGhlcmVpbiwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICBvIFJlZGlzdHJpYnV0aW9uIG9mICBzb3VyY2UgY29kZSAgbXVzdCByZXRhaW4gdGhpcyAgbGljZW5zZSBmaWxlCi0gICAgICAoYEZUTC5UWFQnKSB1bmFsdGVyZWQ7IGFueSAgYWRkaXRpb25zLCBkZWxldGlvbnMgb3IgY2hhbmdlcyB0bwotICAgICAgdGhlIG9yaWdpbmFsICBmaWxlcyBtdXN0IGJlIGNsZWFybHkgIGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcKLSAgICAgIGRvY3VtZW50YXRpb24uICAgVGhlICBjb3B5cmlnaHQgICBub3RpY2VzICBvZiAgdGhlICB1bmFsdGVyZWQsCi0gICAgICBvcmlnaW5hbCAgZmlsZXMgbXVzdCAgYmUgIHByZXNlcnZlZCBpbiAgYWxsICBjb3BpZXMgb2YgIHNvdXJjZQotICAgICAgZmlsZXMuCi0KLSAgICBvIFJlZGlzdHJpYnV0aW9uIGluIGJpbmFyeSBmb3JtIG11c3QgcHJvdmlkZSBhICBkaXNjbGFpbWVyICB0aGF0Ci0gICAgICBzdGF0ZXMgIHRoYXQgIHRoZSBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9mIHRoZSB3b3JrIG9mIHRoZQotICAgICAgRnJlZVR5cGUgVGVhbSwgIGluICB0aGUgIGRpc3RyaWJ1dGlvbiAgZG9jdW1lbnRhdGlvbi4gIFdlIGFsc28KLSAgICAgIGVuY291cmFnZSB5b3UgdG8gcHV0IGFuIFVSTCB0byB0aGUgRnJlZVR5cGUgd2ViIHBhZ2UgIGluICB5b3VyCi0gICAgICBkb2N1bWVudGF0aW9uLCB0aG91Z2ggdGhpcyBpc24ndCBtYW5kYXRvcnkuCi0KLSAgVGhlc2UgY29uZGl0aW9ucyAgYXBwbHkgdG8gYW55ICBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgIGJhc2VkIG9uCi0gIHRoZSBGcmVlVHlwZSBQcm9qZWN0LCAgbm90IGp1c3QgdGhlIHVubW9kaWZpZWQgZmlsZXMuICAgSWYgeW91IHVzZQotICBvdXIgd29yaywgeW91ICBtdXN0IGFja25vd2xlZGdlIHVzLiAgSG93ZXZlciwgbm8gIGZlZSBuZWVkIGJlIHBhaWQKLSAgdG8gdXMuCi0KLTMuIEFkdmVydGlzaW5nCi0tLS0tLS0tLS0tLS0tLQotCi0gIE5laXRoZXIgdGhlICBGcmVlVHlwZSBhdXRob3JzIGFuZCAgY29udHJpYnV0b3JzIG5vciB5b3UgIHNoYWxsIHVzZQotICB0aGUgbmFtZSBvZiB0aGUgIG90aGVyIGZvciBjb21tZXJjaWFsLCBhZHZlcnRpc2luZywgb3IgcHJvbW90aW9uYWwKLSAgcHVycG9zZXMgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLSAgV2Ugc3VnZ2VzdCwgIGJ1dCBkbyBub3QgcmVxdWlyZSwgdGhhdCAgeW91IHVzZSBvbmUgb3IgIG1vcmUgb2YgdGhlCi0gIGZvbGxvd2luZyBwaHJhc2VzIHRvIHJlZmVyICB0byB0aGlzIHNvZnR3YXJlIGluIHlvdXIgZG9jdW1lbnRhdGlvbgotICBvciBhZHZlcnRpc2luZyAgbWF0ZXJpYWxzOiBgRnJlZVR5cGUgUHJvamVjdCcsICBgRnJlZVR5cGUgRW5naW5lJywKLSAgYEZyZWVUeXBlIGxpYnJhcnknLCBvciBgRnJlZVR5cGUgRGlzdHJpYnV0aW9uJy4KLQotICBBcyAgeW91IGhhdmUgIG5vdCBzaWduZWQgIHRoaXMgbGljZW5zZSwgIHlvdSBhcmUgIG5vdCAgcmVxdWlyZWQgdG8KLSAgYWNjZXB0ICBpdC4gICBIb3dldmVyLCAgYXMgIHRoZSBGcmVlVHlwZSAgUHJvamVjdCAgaXMgIGNvcHlyaWdodGVkCi0gIG1hdGVyaWFsLCBvbmx5ICB0aGlzIGxpY2Vuc2UsIG9yICBhbm90aGVyIG9uZSBjb250cmFjdGVkICB3aXRoIHRoZQotICBhdXRob3JzLCBncmFudHMgeW91ICB0aGUgcmlnaHQgdG8gdXNlLCBkaXN0cmlidXRlLCAgYW5kIG1vZGlmeSBpdC4KLSAgVGhlcmVmb3JlLCAgYnkgIHVzaW5nLCAgZGlzdHJpYnV0aW5nLCAgb3IgbW9kaWZ5aW5nICB0aGUgIEZyZWVUeXBlCi0gIFByb2plY3QsIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgYWxsIHRoZSB0ZXJtcwotICBvZiB0aGlzIGxpY2Vuc2UuCi0KLTQuIENvbnRhY3RzCi0tLS0tLS0tLS0tLQotCi0gIFRoZXJlIGFyZSB0d28gbWFpbGluZyBsaXN0cyByZWxhdGVkIHRvIEZyZWVUeXBlOgotCi0gICAgbyBmcmVldHlwZUBub25nbnUub3JnCi0KLSAgICAgIERpc2N1c3NlcyBnZW5lcmFsIHVzZSBhbmQgYXBwbGljYXRpb25zIG9mIEZyZWVUeXBlLCBhcyB3ZWxsIGFzCi0gICAgICBmdXR1cmUgYW5kICB3YW50ZWQgYWRkaXRpb25zIHRvIHRoZSAgbGlicmFyeSBhbmQgZGlzdHJpYnV0aW9uLgotICAgICAgSWYgIHlvdSBhcmUgbG9va2luZyAgZm9yIHN1cHBvcnQsICBzdGFydCBpbiAgdGhpcyBsaXN0ICBpZiB5b3UKLSAgICAgIGhhdmVuJ3QgZm91bmQgYW55dGhpbmcgdG8gaGVscCB5b3UgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0KLSAgICBvIGZyZWV0eXBlLWRldmVsQG5vbmdudS5vcmcKLQotICAgICAgRGlzY3Vzc2VzIGJ1Z3MsICBhcyB3ZWxsICBhcyBlbmdpbmUgaW50ZXJuYWxzLCAgZGVzaWduIGlzc3VlcywKLSAgICAgIHNwZWNpZmljIGxpY2Vuc2VzLCBwb3J0aW5nLCBldGMuCi0KLSAgT3VyIGhvbWUgcGFnZSBjYW4gYmUgZm91bmQgYXQKLQotICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnCi0KLQotLS0tIGVuZCBvZiBGVEwuVFhUIC0tLQpkaWZmIC0tZ2l0IGEvYnVpbGRzL2Z0MnVuaXguaCBiL2J1aWxkcy9mdDJ1bml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2I4ZDkuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL2Z0MnVuaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0MmJ1aWxkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCdWlsZCBtYWNyb3Mgb2YgdGhlIEZyZWVUeXBlIDIgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAzLCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgYSBVbml4LXNwZWNpZmljIHZlcnNpb24gb2YgPGZ0MmJ1aWxkLmg+IHRoYXQgc2hvdWxkIGJlIHVzZWQgICAqLwotICAvKiBleGNsdXNpdmVseSAqYWZ0ZXIqIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGFzc3VtZXMgdGhhdCBgL3Vzci9sb2NhbC9pbmNsdWRlL2ZyZWV0eXBlMicgKG9yIHdoYXRldmVyIGlzICAgICAgICAqLwotICAvKiByZXR1cm5lZCBieSB0aGUgYGZyZWV0eXBlLWNvbmZpZyAtLWNmbGFncycgb3IgYHBrZy1jb25maWcgLS1jZmxhZ3MnICAgKi8KLSAgLyogY29tbWFuZCkgaXMgaW4geW91ciBjb21waWxhdGlvbiBpbmNsdWRlIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgaW4gdGhpcyByZWxlYXNlLiAgSG93ZXZlciwgZm9yICAgKi8KLSAgLyogYSBmdXR1cmUgRnJlZVR5cGUgMiByZWxlYXNlLCB0aGUgZm9sbG93aW5nIGluc3RhbGxhdGlvbiBjaGFuZ2VzIHdpbGwgICovCi0gIC8qIGJlIHBlcmZvcm1lZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIFRoZSBjb250ZW50cyBvZiBgZnJlZXR5cGUtMi54L2luY2x1ZGUvZnJlZXR5cGUnIHdpbGwgYmUgaW5zdGFsbGVkICovCi0gIC8qICAgICB0byBgL3Vzci9sb2NhbC9pbmNsdWRlL2ZyZWV0eXBlMicgaW5zdGVhZCBvZiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYC91c3IvbG9jYWwvaW5jbHVkZS9mcmVldHlwZTIvZnJlZXR5cGUnLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGlzIGZpbGUgd2lsbCAjaW5jbHVkZSA8ZnJlZXR5cGUyL2NvbmZpZy9mdGhlYWRlci5oPiwgaW5zdGVhZCAgICAqLwotICAvKiAgICAgb2YgPGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oPi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGUgY29udGVudHMgb2YgYGZ0aGVhZGVyLmgnIHdpbGwgYmUgcHJvY2Vzc2VkIHdpdGggYHNlZCcgdG8gICAgICAqLwotICAvKiAgICAgcmVwbGFjZSBhbGwgYDxmcmVldHlwZS94eHg+JyB3aXRoIGA8ZnJlZXR5cGUyL3h4eD4nLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBBZGRpbmcgYC91c3IvbG9jYWwvaW5jbHVkZS9mcmVldHlwZTInIHRvIHlvdXIgY29tcGlsYXRpb24gaW5jbHVkZSAqLwotICAvKiAgICAgcGF0aCB3aWxsIG5vdCBiZSBuZWNlc3NhcnkgYW55bW9yZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIGNoYW5nZXMgd2lsbCBiZSB0cmFuc3BhcmVudCB0byBjbGllbnQgYXBwbGljYXRpb25zIHdoaWNoIHVzZSAgICAqLwotICAvKiBmcmVldHlwZS1jb25maWcgKG9yIHBrZy1jb25maWcpLiAgTm8gbW9kaWZpY2F0aW9ucyB3aWxsIGJlIG5lY2Vzc2FyeSAgKi8KLSAgLyogdG8gY29tcGlsZSB3aXRoIHRoZSBuZXcgc2NoZW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlQyX0JVSUxEX1VOSVhfSF9fCi0jZGVmaW5lIF9fRlQyX0JVSUxEX1VOSVhfSF9fCi0KLSAgLyogYDxwcmVmaXg+L2luY2x1ZGUvZnJlZXR5cGUyJyBtdXN0IGJlIGluIHlvdXIgY3VycmVudCBpbmNsdXNpb24gcGF0aCAqLwotI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oPgotCi0jZW5kaWYgLyogX19GVDJfQlVJTERfVU5JWF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM2YmU1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjb25maWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFOU0ktc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkICovCi0gIC8qIGJ5IHRoZSByZXN0IG9mIHRoZSBlbmdpbmUuICBNb3N0IG9mIHRoZSBtYWNyb3MgaGVyZSBhcmUgYXV0b21hdGljYWxseSAqLwotICAvKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSwgYW5kIHlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2hhbmdlIGl0IHRvICAgKi8KLSAgLyogcG9ydCBGcmVlVHlwZSwgZXhjZXB0IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhIG5vbi1BTlNJICAgICAgICAgICovCi0gIC8qIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSBob3dldmVyIHRoYXQgaWYgc29tZSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWQsIHdlICAgICAgICovCi0gIC8qIGFkdmlzZSB5b3UgdG8gcGxhY2UgYSBtb2RpZmllZCBjb3B5IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyB1c3VhbGx5IGBmcmVldHlwZS9idWlsZHMvPHN5c3RlbT4nLCBhbmQgICAgICAgICovCi0gIC8qIGNvbnRhaW5zIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW5jbHVkZWQgZmlyc3Qgd2hlbiAgICAqLwotICAvKiBidWlsZGluZyB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgQU5TSSB2ZXJzaW9uIHNob3VsZCBzdGF5IGluIGBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZycuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQ09ORklHX0hfXwotI2RlZmluZSBfX0ZUQ09ORklHX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19PUFRJT05TX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIFBMQVRGT1JNLVNQRUNJRklDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIG1hY3JvcyBjYW4gYmUgdG9nZ2xlZCB0byBzdWl0IGEgc3BlY2lmaWMgc3lzdGVtLiAgVGhlIGN1cnJlbnQgICAqLwotICAvKiBvbmVzIGFyZSBkZWZhdWx0cyB1c2VkIHRvIGNvbXBpbGUgRnJlZVR5cGUgaW4gYW4gQU5TSSBDIGVudmlyb25tZW50ICAgKi8KLSAgLyogKDE2Yml0IGNvbXBpbGVycyBhcmUgYWxzbyBzdXBwb3J0ZWQpLiAgQ29weSB0aGlzIGZpbGUgdG8geW91ciBvd24gICAgICovCi0gIC8qIGBmcmVldHlwZS9idWlsZHMvPHN5c3RlbT4nIGRpcmVjdG9yeSwgYW5kIGVkaXQgaXQgdG8gcG9ydCB0aGUgZW5naW5lLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBUaGVyZSBhcmUgc3lzdGVtcyAobGlrZSB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgJ0M1NHgpIHdoZXJlIGEgYGNoYXInICovCi0gIC8qIGhhcyAxNiBiaXRzLiAgQU5TSSBDIHNheXMgdGhhdCBzaXplb2YoY2hhcikgaXMgYWx3YXlzIDEuICBTaW5jZSBhbiAgKi8KLSAgLyogYGludCcgaGFzIDE2IGJpdHMgYWxzbyBmb3IgdGhpcyBzeXN0ZW0sIHNpemVvZihpbnQpIGdpdmVzIDEgd2hpY2ggICAqLwotICAvKiBpcyBwcm9iYWJseSB1bmV4cGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYENIQVJfQklUJyAoZGVmaW5lZCBpbiBsaW1pdHMuaCkgZ2l2ZXMgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgICAgICAqLwotICAvKiBgY2hhcicgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZm5kZWYgRlRfQ0hBUl9CSVQKLSNkZWZpbmUgRlRfQ0hBUl9CSVQgIENIQVJfQklUCi0jZW5kaWYKLQotCi0gIC8qIFRoZSBzaXplIG9mIGFuIGBpbnQnIHR5cGUuICAqLwotI2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDE2IC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDMyIC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiBGVF9VSU5UX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfSU5UICAoNjQgLyBGVF9DSEFSX0JJVCkKLSNlbHNlCi0jZXJyb3IgIlVuc3VwcG9ydGVkIHNpemUgb2YgYGludCcgdHlwZSEiCi0jZW5kaWYKLQotICAvKiBUaGUgc2l6ZSBvZiBhIGBsb25nJyB0eXBlLiAgQSBmaXZlLWJ5dGUgYGxvbmcnIChhcyB1c2VkIGUuZy4gb24gdGhlICovCi0gIC8qIERNNjQyKSBpcyByZWNvZ25pemVkIGJ1dCBhdm9pZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoMzIgLyBGVF9DSEFSX0JJVCkKLSNlbGlmIEZUX1VMT05HX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICgzMiAvIEZUX0NIQVJfQklUKQotI2VsaWYgRlRfVUxPTkdfTUFYID4gMHhGRkZGRkZGRlVMICYmIEZUX1VMT05HX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKDY0IC8gRlRfQ0hBUl9CSVQpCi0jZWxzZQotI2Vycm9yICJVbnN1cHBvcnRlZCBzaXplIG9mIGBsb25nJyB0eXBlISIKLSNlbmRpZgotCi0KLSAgLyogUHJlZmVycmVkIGFsaWdubWVudCBvZiBkYXRhICovCi0jZGVmaW5lIEZUX0FMSUdOTUVOVCAgOAotCi0KLSAgLyogRlRfVU5VU0VEIGlzIGEgbWFjcm8gdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gcGFyYW1ldGVyIGlzIG5vdCAgKi8KLSAgLyogdXNlZCAtLSB0aGlzIGlzIG9ubHkgdXNlZCB0byBnZXQgcmlkIG9mIHVucGxlYXNhbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KLSNpZm5kZWYgRlRfVU5VU0VECi0jZGVmaW5lIEZUX1VOVVNFRCggYXJnICkgICggKGFyZykgPSAoYXJnKSApCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBBVVRPTUFUSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBtYWNyb3MgYXJlIGNvbXB1dGVkIGZyb20gdGhlIG9uZXMgZGVmaW5lZCBhYm92ZS4gIERvbid0IHRvdWNoICAgKi8KLSAgLyogdGhlaXIgZGVmaW5pdGlvbiwgdW5sZXNzIHlvdSBrbm93IHByZWNpc2VseSB3aGF0IHlvdSBhcmUgZG9pbmcuICBObyAgICovCi0gIC8qIHBvcnRlciBzaG91bGQgbmVlZCB0byBtZXNzIHdpdGggdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1hYyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIGlzIHRoZSBvbmx5IG5lY2Vzc2FyeSBjaGFuZ2UsIHNvIGl0IGlzIGRlZmluZWQgaGVyZSBpbnN0ZWFkICAgICovCi0gIC8qICAgcHJvdmlkaW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAoIGRlZmluZWQoIF9fQVBQTEVfXyApICYmICFkZWZpbmVkKCBEQVJXSU5fTk9fQ0FSQk9OICkgKSB8fCBcCi0gICAgKCBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgZGVmaW5lZCggbWFjaW50b3NoICkgICAgICAgICkKLSAgLyogbm8gQ2FyYm9uIGZyYW1ld29ya3MgZm9yIDY0Yml0IDEwLjQueCAqLwotI2luY2x1ZGUgIkF2YWlsYWJpbGl0eU1hY3Jvcy5oIgotI2lmIGRlZmluZWQoIF9fTFA2NF9fICkgJiYgXAotICAgICggTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPD0gTUFDX09TX1hfVkVSU0lPTl8xMF80ICkKLSNkZWZpbmUgREFSV0lOX05PX0NBUkJPTiAxCi0jZWxzZQotI2RlZmluZSBGVF9NQUNJTlRPU0ggMQotI2VuZGlmCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMTZiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9JbnQxNjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAxNmJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRlRfVUludDE2OwotICAvKiAqLwotCi0KLSAgLyogdGhpcyAjaWYgMCAuLi4gI2VuZGlmIGNsYXVzZSBpcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyAqLwotI2lmIDAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBYWFggIEZUX0ludDMyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIFhYWCAgRlRfVUludDMyOwotCi0gIC8qICovCi0KLSNlbmRpZgotCi0jaWYgRlRfU0laRU9GX0lOVCA9PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfVUludDMyOwotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIHNpZ25lZCBsb25nICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgRlRfVUludDMyOwotCi0jZWxzZQotI2Vycm9yICJubyAzMmJpdCB0eXBlIGZvdW5kIC0tIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMiCi0jZW5kaWYKLQotICAvKiBsb29rIHVwIGFuIGludGVnZXIgdHlwZSB0aGF0IGlzIGF0IGxlYXN0IDMyIGJpdHMgKi8KLSNpZiBGVF9TSVpFT0ZfSU5UID49ICgzMiAvIEZUX0NIQVJfQklUKQotCi0gIHR5cGVkZWYgaW50ICAgICAgICAgICAgRlRfRmFzdDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICBGVF9VRmFzdDsKLQotI2VsaWYgRlRfU0laRU9GX0xPTkcgPj0gKDMyIC8gRlRfQ0hBUl9CSVQpCi0KLSAgdHlwZWRlZiBsb25nICAgICAgICAgICBGVF9GYXN0OwotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIEZUX1VGYXN0OwotCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSKQotLyogcHJvdmlkZSBhc3NlbWJsZXIgZnJhZ21lbnRzIGZvciBwZXJmb3JtYW5jZS1jcml0aWNhbAotICogZnVuY3Rpb25zLiB0aGVzZSBtdXN0IGJlIGRlZmluZWQgc3RhdGljIF9faW5saW5lX18KLSAqIHdpdGggR0NDCi0gKi8KLSNpZiBkZWZpbmVkKF9fR05VQ19fKQotCi0jICBpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKLSMgICAgZGVmaW5lIEZUX01VTEZJWF9BU1NFTUJMRVIgICBGVF9NdWxGaXhfYXJtCi0gICAgc3RhdGljIF9faW5saW5lX18gRlRfSW50MzIKLSAgICBGVF9NdWxGaXhfYXJtKCBGVF9JbnQzMiAgYSwgRlRfSW50MzIgIGIgKQotICAgIHsKLSAgICAgICAgcmVnaXN0ZXIgRlRfSW50MzIgIHQsIHQyOwotICAgICAgICBhc20gX192b2xhdGlsZV9fICgKLSAgICAgICAgICAgICJzbXVsbCAgJTEsICUyLCAlNCwgJTNcblx0IiAgIC8qIChsbz0lMSxoaT0lMikgPSBhKmIgKi8KLSAgICAgICAgICAgICJtb3YgICAgJTAsICUyLCBhc3IgIzMxXG5cdCIgIC8qICUwICA9IChoaSA+PiAzMSkgKi8KLSAgICAgICAgICAgICJhZGQgICAgJTAsICUwLCAjMHg4MDAwXG5cdCIgIC8qICUwICs9IDB4ODAwMCAqLwotICAgICAgICAgICAgImFkZHMgICAlMSwgJTEsICUwXG5cdCIgICAgICAgLyogJTEgKz0gJTAgKi8KLSAgICAgICAgICAgICJhZGMgICAgJTIsICUyLCAjMFxuXHQiICAgICAgIC8qICUyICs9IGNhcnJ5ICovCi0gICAgICAgICAgICAibW92ICAgICUwLCAlMSwgbHNyICMxNlxuXHQiICAvKiAlMCAgPSAlMSA+PiAxNiAqLwotICAgICAgICAgICAgIm9yciAgICAlMCwgJTIsIGxzbCAjMTZcblx0IiAgLyogJTAgfD0gJTIgPDwgMTYgKi8KLSAgICAgICAgICAgIDogIj1yIihhKSwgIj0mciIodDIpLCAiPSZyIih0KQotICAgICAgICAgICAgOiAiciIoYSksICJyIihiKQotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGE7Ci0gICAgfQotIyAgZW5kaWYKLQotIyAgaWYgZGVmaW5lZChpMzg2KQotIyAgICBkZWZpbmUgRlRfX01VTEZJWF9BU1NFTUJMRVIgIEZUX011bEZpeF9pMzg2Ci0gICAgc3RhdGljIF9faW5saW5lX18gRlRfSW50MzIKLSAgICBGVF9NdWxGaXhfaTM4NiggRlRfSW50MzIgIGEsIEZUX0ludDMyICBiICkKLSAgICB7Ci0gICAgICAgIHJlZ2lzdGVyIEZUX0ludDMyICByZXN1bHQ7Ci0KLSAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgICAgICJpbXVsICAlJWVkeFxuIgotICAgICAgICAgICJtb3ZsICAlJWVkeCwgJSVlY3hcbiIKLSAgICAgICAgICAic2FybCAgJDMxLCAlJWVjeFxuIgotICAgICAgICAgICJhZGRsICAkMHg4MDAwLCAlJWVjeFxuIgotICAgICAgICAgICJhZGRsICAlJWVjeCwgJSVlYXhcbiIKLSAgICAgICAgICAiYWRjbCAgJDAsICUlZWR4XG4iCi0gICAgICAgICAgInNocmwgICQxNiwgJSVlYXhcbiIKLSAgICAgICAgICAic2hsbCAgJDE2LCAlJWVkeFxuIgotICAgICAgICAgICJhZGRsICAlJWVkeCwgJSVlYXhcbiIKLSAgICAgICAgICA6ICI9YSIocmVzdWx0KQotICAgICAgICAgIDogImEiKGEpLCAiZCIoYikKLSAgICAgICAgICA6ICIlZWN4IgotICAgICAgICApOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSMgIGVuZGlmCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotI2VuZGlmIC8qICFOT19BU1NFTUJMRVIgKi8KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5MSU5FX01VTEZJWAotIyAgaWZkZWYgRlRfTVVMRklYX0FTU0VNQkxFUgotIyAgICBkZWZpbmUgRlRfTVVMRklYX0lOTElORUQgICBGVF9NVUxGSVhfQVNTRU1CTEVSCi0jICBlbmRpZgotI2VuZGlmCi0KLQotICAvKiBkZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGEgNjQtYml0IGludCB0eXBlIGZvciBwbGF0Zm9ybXMgd2l0aG91dCAqLwotICAvKiBBdXRvY29uZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIEZUX1NJWkVPRl9MT05HID09ICg2NCAvIEZUX0NIQVJfQklUKQotCi0gIC8qIEZUX0xPTkc2NCBtdXN0IGJlIGRlZmluZWQgaWYgYSA2NC1iaXQgdHlwZSBpcyBhdmFpbGFibGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICBsb25nCi0KLSNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkgJiYgX01TQ19WRVIgPj0gOTAwICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAqLwotCi0gIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgIF9faW50NjQKLQotI2VsaWYgZGVmaW5lZCggX19CT1JMQU5EQ19fICkgIC8qIEJvcmxhbmQgQysrICovCi0KLSAgLyogWFhYWDogV2Ugc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoZSB2YWx1ZSBvZiBfX0JPUkxBTkRDX18gaW4gb3JkZXIgKi8KLSAgLyogICAgICAgdG8gdGVzdCB0aGUgY29tcGlsZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiB0aGlzIGNvbXBpbGVyIHByb3ZpZGVzIHRoZSBfX2ludDY0IHR5cGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fV0FUQ09NQ19fICkgICAvKiBXYXRjb20gQysrICovCi0KLSAgLyogV2F0Y29tIGRvZXNuJ3QgcHJvdmlkZSA2NC1iaXQgZGF0YSB0eXBlcyAqLwotCi0jZWxpZiBkZWZpbmVkKCBfX01XRVJLU19fICkgICAgLyogTWV0cm93ZXJrcyBDb2RlV2FycmlvciAqLwotCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgbG9uZyBsb25nIGludAotCi0jZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCi0KLSAgLyogR0NDIHByb3ZpZGVzIHRoZSBgbG9uZyBsb25nJyB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgbG9uZyBsb25nIGludAotCi0jZW5kaWYgLyogRlRfU0laRU9GX0xPTkcgPT0gKDY0IC8gRlRfQ0hBUl9CSVQpICovCi0KLQotI2RlZmluZSBGVF9CRUdJTl9TVE1OVCAgZG8gewotI2RlZmluZSBGVF9FTkRfU1RNTlQgICAgfSB3aGlsZSAoIDAgKQotI2RlZmluZSBGVF9EVU1NWV9TVE1OVCAgRlRfQkVHSU5fU1RNTlQgRlRfRU5EX1NUTU5UCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgNjQtYml0IGRhdGEgdHlwZSB3aWxsIGNyZWF0ZSBjb21waWxhdGlvbiBwcm9ibGVtcyBpZiB5b3UgY29tcGlsZSAgICAqLwotICAvKiBpbiBzdHJpY3QgQU5TSSBtb2RlLiAgVG8gYXZvaWQgdGhlbSwgd2UgZGlzYWJsZSB0aGVpciB1c2UgaWYgICAgICAgICAgKi8KLSAgLyogX19TVERDX18gaXMgZGVmaW5lZC4gIFlvdSBjYW4gaG93ZXZlciBpZ25vcmUgdGhpcyBydWxlIGJ5ICAgICAgICAgICAgICovCi0gIC8qIGRlZmluaW5nIHRoZSBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0IGNvbmZpZ3VyYXRpb24gbWFjcm8uICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKCBGVF9MT05HNjQgKSAmJiAhZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCApCi0KLSNpZmRlZiBfX1NURENfXwotCi0gIC8qIHVuZGVmaW5lIHRoZSA2NC1iaXQgbWFjcm9zIGluIHN0cmljdCBBTlNJIGNvbXBpbGF0aW9uIG1vZGUgKi8KLSN1bmRlZiBGVF9MT05HNjQKLSN1bmRlZiBGVF9JTlQ2NAotCi0jZW5kaWYgLyogX19TVERDX18gKi8KLQotI2VuZGlmIC8qIEZUX0xPTkc2NCAmJiAhRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCAqLwotCi0KLSNpZmRlZiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIHN0YXRpYyAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgc3RhdGljICB4Ci0KLSNlbHNlCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgZXh0ZXJuICJDIiAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIGV4dGVybiAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUICovCi0KLQotI2lmbmRlZiBGVF9CQVNFCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9CQVNFKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0JBU0UoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9CQVNFICovCi0KLQotI2lmbmRlZiBGVF9CQVNFX0RFRgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkFTRV9ERUYoIHggKSAgZXh0ZXJuICJDIiB4Ci0jZWxzZQotI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9CQVNFX0RFRiAqLwotCi0KLSNpZm5kZWYgRlRfRVhQT1JUCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIGV4dGVybiAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfRVhQT1JUICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfREVGCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfREVGICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfVkFSCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfVkFSKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfVkFSICovCi0KLSAgLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG5lZWRlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSAgICovCi0gIC8qIEMrKyBjb21waWxlciBhbmQgd2l0aCAxNmJpdCBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBUaGlzIGlzIHNwZWNpYWwuICBXaXRoaW4gQysrLCB5b3UgbXVzdCBzcGVjaWZ5IGBleHRlcm4gIkMiJyBmb3IgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIHZpYSBmdW5jdGlvbiBwb2ludGVycywgYW5kIHlvdSBhbHNvICAgICovCi0gIC8qIG11c3QgZG8gdGhhdCBmb3Igc3RydWN0dXJlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIHBvaW50ZXJzIHRvICAqLwotICAvKiBhc3N1cmUgQyBsaW5rYWdlIC0tIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGhhdmUgKGxvY2FsKSBhbm9ueW1vdXMgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSBhY2Nlc3NlZCBieSAoZ2xvYmFsKSBmdW5jdGlvbiBwb2ludGVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfQ0FMTEJBQ0tfREVGIGlzIHVzZWQgdG8gX2RlZmluZV8gYSBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRSBpcyB1c2VkIHRvIF9kZWNsYXJlXyBhIGNvbnN0YW50IHZhcmlhYmxlIHRoYXQgKi8KLSAgLyogY29udGFpbnMgcG9pbnRlcnMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRV9ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNvbnN0YW50IHZhcmlhYmxlICAgKi8KLSAgLyogdGhhdCBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU29tZSAxNmJpdCBjb21waWxlcnMgaGF2ZSB0byByZWRlZmluZSB0aGVzZSBtYWNyb3MgdG8gaW5zZXJ0ICAgICovCi0gIC8qIHRoZSBpbmZhbW91cyBgX2NkZWNsJyBvciBgX19mYXN0Y2FsbCcgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ0FMTEJBQ0tfREVGCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0NBTExCQUNLX0RFRiggeCApICBzdGF0aWMgIHgKLSNlbmRpZgotI2VuZGlmIC8qIEZUX0NBTExCQUNLX0RFRiAqLwotCi0jaWZuZGVmIEZUX0NBTExCQUNLX1RBQkxFCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4gIkMiCi0jZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgZXh0ZXJuICJDIgotI2Vsc2UKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4KLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAvKiBub3RoaW5nICovCi0jZW5kaWYKLSNlbmRpZiAvKiBGVF9DQUxMQkFDS19UQUJMRSAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19GVENPTkZJR19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc5YTNmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRoZWFkZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJ1aWxkIG1hY3JvcyBvZiB0aGUgRnJlZVR5cGUgMiBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggYnkgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0ZUX0hFQURFUl9IX18KLSNkZWZpbmUgX19GVF9IRUFERVJfSF9fCi0KLQotICAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CRUdJTl9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gd2l0aCBARlRfRU5EX0hFQURFUiBpbiBoZWFkZXIgICAgKi8KLSAgLyogICAgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyB3aXRoaW4gYXJlIHByb3Blcmx5ICAgICAgICAgICovCi0gIC8qICAgIGVuY2Fwc3VsYXRlZCBpbiBhbiBgZXh0ZXJuICJDIiB7IC4uIH0nIGJsb2NrIHdoZW4gaW5jbHVkZWQgZnJvbSBhICAqLwotICAvKiAgICBDKysgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkVHSU5fSEVBREVSICBleHRlcm4gIkMiIHsKLSNlbHNlCi0jZGVmaW5lIEZUX0JFR0lOX0hFQURFUiAgLyogbm90aGluZyAqLwotI2VuZGlmCi0KLQotICAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkRfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gd2l0aCBARlRfQkVHSU5fSEVBREVSIGluIGhlYWRlciAgKi8KLSAgLyogICAgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyB3aXRoaW4gYXJlIHByb3Blcmx5ICAgICAgICAgICovCi0gIC8qICAgIGVuY2Fwc3VsYXRlZCBpbiBhbiBgZXh0ZXJuICJDIiB7IC4uIH0nIGJsb2NrIHdoZW4gaW5jbHVkZWQgZnJvbSBhICAqLwotICAvKiAgICBDKysgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfRU5EX0hFQURFUiAgfQotI2Vsc2UKLSNkZWZpbmUgRlRfRU5EX0hFQURFUiAgLyogbm90aGluZyAqLwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsaWFzZXMgZm9yIHRoZSBGcmVlVHlwZSAyIHB1YmxpYyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVhZGVyX2ZpbGVfbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVhZGVyIEZpbGUgTWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFjcm8gZGVmaW5pdGlvbnMgdXNlZCB0byAjaW5jbHVkZSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlZmluZWQgdG8gdGhlIG5hbWUgb2Ygc3BlY2lmaWMgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIDIgaGVhZGVyIGZpbGVzLiAgVGhleSBjYW4gYmUgdXNlZCBkaXJlY3RseSBpbiAjaW5jbHVkZSAgICAqLwotICAvKiAgICBzdGF0ZW1lbnRzIGFzIGluOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgRlRfR0xZUEhfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2h5IHdlIGFyZSBub3cgdXNpbmcgbWFjcm9zIHRvIG5hbWUgICAgICAqLwotICAvKiAgICBwdWJsaWMgaGVhZGVyIGZpbGVzLiAgVGhlIGZpcnN0IG9uZSBpcyB0aGF0IHN1Y2ggbWFjcm9zIGFyZSBub3QgICAgKi8KLSAgLyogICAgbGltaXRlZCB0byB0aGUgaW5mYW1vdXMgOC4zIG5hbWluZyBydWxlIHJlcXVpcmVkIGJ5IERPUyAoYW5kICAgICAgICovCi0gIC8qICAgIGBGVF9NVUxUSVBMRV9NQVNURVJTX0gnIGlzIGEgbG90IG1vcmUgbWVhbmluZ2Z1bCB0aGFuIGBmdG1tLmgnKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNlY29uZCByZWFzb24gaXMgdGhhdCBpdCBhbGxvd3MgZm9yIG1vcmUgZmxleGliaWxpdHkgaW4gdGhlICAgICovCi0gIC8qICAgIHdheSBGcmVlVHlwZSAyIGlzIGluc3RhbGxlZCBvbiBhIGdpdmVuIHN5c3RlbS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBjb25maWd1cmF0aW9uIGZpbGVzICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NPTkZJR19DT05GSUdfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgRnJlZVR5cGUgMiBjb25maWd1cmF0aW9uIGRhdGEuCi0gICAqCi0gICAqLwotI2lmbmRlZiBGVF9DT05GSUdfQ09ORklHX0gKLSNkZWZpbmUgRlRfQ09ORklHX0NPTkZJR19IICA8ZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg+Ci0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKLSAgICogICBGcmVlVHlwZSAyIGludGVyZmFjZSB0byB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucy4KLSAgICoKLSAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLSNkZWZpbmUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSCAgPGZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oPgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ09ORklHX09QVElPTlNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgRnJlZVR5cGUgMiBwcm9qZWN0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KLSAgICoKLSAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05TX0gKLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTlNfSCAgPGZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oPgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ09ORklHX01PRFVMRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGxpc3Qgb2YgRnJlZVR5cGUgMiBtb2R1bGVzIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIHRvIG5ldyBsaWJyYXJ5Ci0gICAqICAgaW5zdGFuY2VzIGluIEBGVF9Jbml0X0ZyZWVUeXBlLgotICAgKgotICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX01PRFVMRVNfSAotI2RlZmluZSBGVF9DT05GSUdfTU9EVUxFU19IICA8ZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmg+Ci0jZW5kaWYKLQotICAvKiAqLwotCi0gIC8qIHB1YmxpYyBoZWFkZXJzICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0ZSRUVUWVBFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBiYXNlIEZyZWVUeXBlIDIgQVBJLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfRlJFRVRZUEVfSCAgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRVJST1JTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBsaXN0IG9mIEZyZWVUeXBlIDIgZXJyb3IgY29kZXMgKGFuZCBtZXNzYWdlcykuCi0gICAqCi0gICAqICAgSXQgaXMgaW5jbHVkZWQgYnkgQEZUX0ZSRUVUWVBFX0guCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9FUlJPUlNfSCAgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTU9EVUxFX0VSUk9SU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgbGlzdCBvZiBGcmVlVHlwZSAyIG1vZHVsZSBlcnJvciBvZmZzZXRzIChhbmQgbWVzc2FnZXMpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX0VSUk9SU19IICA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TWVNURU1fSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlIDIgaW50ZXJmYWNlIHRvIGxvdy1sZXZlbCBvcGVyYXRpb25zIChpLmUuLCBtZW1vcnkgbWFuYWdlbWVudAotICAgKiAgIGFuZCBzdHJlYW0gaS9vKS4KLSAgICoKLSAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1NZU1RFTV9IICA8ZnJlZXR5cGUvZnRzeXN0ZW0uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JTUFHRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdHlwZQotICAgKiAgIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gZ2x5cGggaW1hZ2VzIChpLmUuLCBiaXRtYXBzLCBvdXRsaW5lcywKLSAgICogICBzY2FuLWNvbnZlcnRlciBwYXJhbWV0ZXJzKS4KLSAgICoKLSAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0lNQUdFX0ggIDxmcmVldHlwZS9mdGltYWdlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFlQRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGJhc2ljIGRhdGEgdHlwZXMgZGVmaW5lZCBieSBGcmVlVHlwZSAyLgotICAgKgotICAgKiAgIEl0IGlzIGluY2x1ZGVkIGJ5IEBGVF9GUkVFVFlQRV9ILgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFlQRVNfSCAgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MSVNUX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBsaXN0IG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlIDIuCi0gICAqCi0gICAqICAgKE1vc3QgYXBwbGljYXRpb25zIHdpbGwgbmV2ZXIgbmVlZCB0byBpbmNsdWRlIHRoaXMgZmlsZS4pCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9MSVNUX0ggIDxmcmVldHlwZS9mdGxpc3QuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9PVVRMSU5FX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBzY2FsYWJsZSBvdXRsaW5lIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlIDIuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9PVVRMSU5FX0ggIDxmcmVldHlwZS9mdG91dGxuLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfU0laRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSB3aGljaCBtYW5hZ2VzIG11bHRpcGxlIEBGVF9TaXplIG9iamVjdHMgcGVyIGZhY2UuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9TSVpFU19IICA8ZnJlZXR5cGUvZnRzaXplcy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX01PRFVMRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgbW9kdWxlIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlIDIuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9NT0RVTEVfSCAgPGZyZWV0eXBlL2Z0bW9kYXBpLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfUkVOREVSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICByZW5kZXJlciBtb2R1bGUgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGUgMi4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1JFTkRFUl9IICA8ZnJlZXR5cGUvZnRyZW5kZXIuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UWVBFMV9UQUJMRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIHR5cGVzIGFuZCBBUEkgc3BlY2lmaWMgdG8gdGhlIFR5cGUgMSBmb3JtYXQuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9UWVBFMV9UQUJMRVNfSCAgPGZyZWV0eXBlL3QxdGFibGVzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFJVRVRZUEVfSURTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBlbnVtZXJhdGlvbiB2YWx1ZXMgd2hpY2ggaWRlbnRpZnkgbmFtZSBzdHJpbmdzLCBsYW5ndWFnZXMsIGVuY29kaW5ncywKLSAgICogICBldGMuICBUaGlzIGZpbGUgcmVhbGx5IGNvbnRhaW5zIGEgX2xhcmdlXyBzZXQgb2YgY29uc3RhbnQgbWFjcm8KLSAgICogICBkZWZpbml0aW9ucywgdGFrZW4gZnJvbSB0aGUgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIHNwZWNpZmljYXRpb25zLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFJVRVRZUEVfSURTX0ggIDxmcmVldHlwZS90dG5hbWVpZC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgdHlwZXMgYW5kIEFQSSBzcGVjaWZpYyB0byB0aGUgVHJ1ZVR5cGUgKGFzIHdlbGwgYXMgT3BlblR5cGUpIGZvcm1hdC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1RSVUVUWVBFX1RBQkxFU19IICA8ZnJlZXR5cGUvdHR0YWJsZXMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UUlVFVFlQRV9UQUdTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBUcnVlVHlwZSBmb3VyLWJ5dGUgYHRhZ3MnIHdoaWNoIGlkZW50aWZ5IGJsb2NrcyBpbgotICAgKiAgIFNGTlQtYmFzZWQgZm9udCBmb3JtYXRzIChpLmUuLCBUcnVlVHlwZSBhbmQgT3BlblR5cGUpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFJVRVRZUEVfVEFHU19IICA8ZnJlZXR5cGUvdHR0YWdzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQkRGX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggYWNjZXNzZXMgQkRGLXNwZWNpZmljIHN0cmluZ3MgZnJvbSBhCi0gICAqICAgZmFjZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0JERl9IICA8ZnJlZXR5cGUvZnRiZGYuaD4KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NJRF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIGFjY2VzcyBDSUQgZm9udCBpbmZvcm1hdGlvbiBmcm9tIGEKLSAgICogICBmYWNlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0lEX0ggIDxmcmVldHlwZS9mdGNpZC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0daSVBfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBnemlwLWNvbXByZXNzZWQgZmlsZXMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9HWklQX0ggIDxmcmVldHlwZS9mdGd6aXAuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MWldfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBMWlctY29tcHJlc3NlZCBmaWxlcy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0xaV19IICA8ZnJlZXR5cGUvZnRsencuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9XSU5GT05UU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIHN1cHBvcnRzIFdpbmRvd3MgRk5UIGZpbGVzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfV0lORk9OVFNfSCAgIDxmcmVldHlwZS9mdHdpbmZudC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0dMWVBIX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBBUEkgb2YgdGhlIG9wdGlvbmFsIGdseXBoIG1hbmFnZW1lbnQgY29tcG9uZW50LgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfR0xZUEhfSCAgPGZyZWV0eXBlL2Z0Z2x5cGguaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9CSVRNQVBfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgYml0bWFwIGNvbnZlcnNpb24gY29tcG9uZW50LgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQklUTUFQX0ggIDxmcmVldHlwZS9mdGJpdG1hcC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0JCT1hfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgZXhhY3QgYm91bmRpbmcgYm94IGNvbXB1dGF0aW9uIHJvdXRpbmVzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQkJPWF9IICA8ZnJlZXR5cGUvZnRiYm94Lmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ0FDSEVfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgRnJlZVR5cGUgMiBjYWNoZSBzdWItc3lzdGVtLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0FDSEVfSCAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DQUNIRV9JTUFHRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgYGdseXBoIGltYWdlJyBBUEkgb2YgdGhlIEZyZWVUeXBlIDIgY2FjaGUgc3ViLXN5c3RlbS4KLSAgICoKLSAgICogICBJdCBpcyB1c2VkIHRvIGRlZmluZSBhIGNhY2hlIGZvciBARlRfR2x5cGggZWxlbWVudHMuICBZb3UgY2FuIGFsc28KLSAgICogICB1c2UgdGhlIEFQSSBkZWZpbmVkIGluIEBGVF9DQUNIRV9TTUFMTF9CSVRNQVBTX0ggaWYgeW91IG9ubHkgbmVlZCB0bwotICAgKiAgIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMsIGFzIGl0IHdpbGwgdXNlIGxlc3MgbWVtb3J5LgotICAgKgotICAgKiAgIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZC4gIFNpbXBseSBpbmNsdWRlIEBGVF9DQUNIRV9IIHRvIGhhdmUgYWxsCi0gICAqICAgZ2x5cGggaW1hZ2UtcmVsYXRlZCBjYWNoZSBkZWNsYXJhdGlvbnMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DQUNIRV9JTUFHRV9IICBGVF9DQUNIRV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ0FDSEVfU01BTExfQklUTUFQU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgYHNtYWxsIGJpdG1hcHMnIEFQSSBvZiB0aGUgRnJlZVR5cGUgMiBjYWNoZSBzdWItc3lzdGVtLgotICAgKgotICAgKiAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGEgY2FjaGUgZm9yIHNtYWxsIGdseXBoIGJpdG1hcHMgaW4gYSByZWxhdGl2ZWx5Ci0gICAqICAgbWVtb3J5LWVmZmljaWVudCB3YXkuICBZb3UgY2FuIGFsc28gdXNlIHRoZSBBUEkgZGVmaW5lZCBpbgotICAgKiAgIEBGVF9DQUNIRV9JTUFHRV9IIGlmIHlvdSB3YW50IHRvIGNhY2hlIGFyYml0cmFyeSBnbHlwaCBpbWFnZXMsCi0gICAqICAgaW5jbHVkaW5nIHNjYWxhYmxlIG91dGxpbmVzLgotICAgKgotICAgKiAgIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZC4gIFNpbXBseSBpbmNsdWRlIEBGVF9DQUNIRV9IIHRvIGhhdmUgYWxsCi0gICAqICAgc21hbGwgYml0bWFwcy1yZWxhdGVkIGNhY2hlIGRlY2xhcmF0aW9ucy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0NBQ0hFX1NNQUxMX0JJVE1BUFNfSCAgRlRfQ0FDSEVfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NBQ0hFX0NIQVJNQVBfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGBjaGFybWFwJyBBUEkgb2YgdGhlIEZyZWVUeXBlIDIgY2FjaGUgc3ViLXN5c3RlbS4KLSAgICoKLSAgICogICBUaGlzIG1hY3JvIGlzIGRlcHJlY2F0ZWQuICBTaW1wbHkgaW5jbHVkZSBARlRfQ0FDSEVfSCB0byBoYXZlIGFsbAotICAgKiAgIGNoYXJtYXAtYmFzZWQgY2FjaGUgZGVjbGFyYXRpb25zLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0FDSEVfQ0hBUk1BUF9IICBGVF9DQUNIRV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTUFDX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBNYWNpbnRvc2gtc3BlY2lmaWMgRnJlZVR5cGUgMiBBUEkuICBUaGUgbGF0dGVyIGlzIHVzZWQgdG8gYWNjZXNzCi0gICAqICAgZm9udHMgZW1iZWRkZWQgaW4gcmVzb3VyY2UgZm9ya3MuCi0gICAqCi0gICAqICAgVGhpcyBoZWFkZXIgZmlsZSBtdXN0IGJlIGV4cGxpY2l0bHkgaW5jbHVkZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucwotICAgKiAgIGNvbXBpbGVkIG9uIHRoZSBNYWMgKG5vdGUgdGhhdCB0aGUgYmFzZSBBUEkgc3RpbGwgd29ya3MgdGhvdWdoKS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX01BQ19IICA8ZnJlZXR5cGUvZnRtYWMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBvcHRpb25hbCBtdWx0aXBsZS1tYXN0ZXJzIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlIDIuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9NVUxUSVBMRV9NQVNURVJTX0ggIDxmcmVldHlwZS9mdG1tLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfU0ZOVF9OQU1FU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgb3B0aW9uYWwgRnJlZVR5cGUgMiBBUEkgd2hpY2ggYWNjZXNzZXMgZW1iZWRkZWQgYG5hbWUnIHN0cmluZ3MgaW4KLSAgICogICBTRk5ULWJhc2VkIGZvbnQgZm9ybWF0cyAoaS5lLiwgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlKS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1NGTlRfTkFNRVNfSCAgPGZyZWV0eXBlL2Z0c25hbWVzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfT1BFTlRZUEVfVkFMSURBVEVfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIG9wdGlvbmFsIEZyZWVUeXBlIDIgQVBJIHdoaWNoIHZhbGlkYXRlcyBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsCi0gICAqICAgR1BPUywgR1NVQiwgSlNURikuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9PUEVOVFlQRV9WQUxJREFURV9IICA8ZnJlZXR5cGUvZnRvdHZhbC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0dYX1ZBTElEQVRFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBvcHRpb25hbCBGcmVlVHlwZSAyIEFQSSB3aGljaCB2YWxpZGF0ZXMgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzIChmZWF0LAotICAgKiAgIG1vcnQsIG1vcngsIGJzbG4sIGp1c3QsIGtlcm4sIG9wYmQsIHRyYWssIHByb3ApLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfR1hfVkFMSURBVEVfSCAgPGZyZWV0eXBlL2Z0Z3h2YWwuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9QRlJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlIDIgQVBJIHdoaWNoIGFjY2Vzc2VzIFBGUi1zcGVjaWZpYyBkYXRhLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfUEZSX0ggIDxmcmVldHlwZS9mdHBmci5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1NUUk9LRVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlIDIgQVBJIHdoaWNoIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBzdHJva2Ugb3V0bGluZSBwYXRocy4KLSAgICovCi0jZGVmaW5lIEZUX1NUUk9LRVJfSCAgPGZyZWV0eXBlL2Z0c3Ryb2tlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfU1lOVEhFU0lTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZSAyIEFQSSB3aGljaCBwZXJmb3JtcyBhcnRpZmljaWFsIG9ibGlxdWluZyBhbmQgZW1ib2xkZW5pbmcuCi0gICAqLwotI2RlZmluZSBGVF9TWU5USEVTSVNfSCAgPGZyZWV0eXBlL2Z0c3ludGguaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9YRlJFRTg2X0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZSAyIEFQSSB3aGljaCBwcm92aWRlcyBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gdGhlIFhGcmVlODYgYW5kCi0gICAqICAgWC5PcmcgWDExIHNlcnZlcnMuCi0gICAqLwotI2RlZmluZSBGVF9YRlJFRTg2X0ggIDxmcmVldHlwZS9mdHhmODYuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UUklHT05PTUVUUllfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlIDIgQVBJIHdoaWNoIHBlcmZvcm1zIHRyaWdvbm9tZXRyaWMgY29tcHV0YXRpb25zIChlLmcuLAotICAgKiAgIGNvc2luZXMgYW5kIGFyYyB0YW5nZW50cykuCi0gICAqLwotI2RlZmluZSBGVF9UUklHT05PTUVUUllfSCAgPGZyZWV0eXBlL2Z0dHJpZ29uLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTENEX0ZJTFRFUl9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGUgMiBBUEkgd2hpY2ggcGVyZm9ybXMgY29sb3IgZmlsdGVyaW5nIGZvciBzdWJwaXhlbCByZW5kZXJpbmcuCi0gICAqLwotI2RlZmluZSBGVF9MQ0RfRklMVEVSX0ggIDxmcmVldHlwZS9mdGxjZGZpbC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1VOUEFURU5URURfSElOVElOR19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGUgMiBBUEkgd2hpY2ggcGVyZm9ybXMgY29sb3IgZmlsdGVyaW5nIGZvciBzdWJwaXhlbCByZW5kZXJpbmcuCi0gICAqLwotI2RlZmluZSBGVF9VTlBBVEVOVEVEX0hJTlRJTkdfSCAgPGZyZWV0eXBlL3R0dW5wYXQuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JTkNSRU1FTlRBTF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGUgMiBBUEkgd2hpY2ggcGVyZm9ybXMgY29sb3IgZmlsdGVyaW5nIGZvciBzdWJwaXhlbCByZW5kZXJpbmcuCi0gICAqLwotI2RlZmluZSBGVF9JTkNSRU1FTlRBTF9IICA8ZnJlZXR5cGUvZnRpbmNyZW0uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9HQVNQX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZSAyIEFQSSB3aGljaCByZXR1cm5zIGVudHJpZXMgZnJvbSB0aGUgVHJ1ZVR5cGUgR0FTUCB0YWJsZS4KLSAgICovCi0jZGVmaW5lIEZUX0dBU1BfSCAgPGZyZWV0eXBlL2Z0Z2FzcC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0FEVkFOQ0VTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZSAyIEFQSSB3aGljaCByZXR1cm5zIGluZGl2aWR1YWwgYW5kIHJhbmdlZCBnbHlwaCBhZHZhbmNlcwotICAgKi8KLSNkZWZpbmUgRlRfQURWQU5DRVNfSCAgICAgICAgICAgICA8ZnJlZXR5cGUvZnRhZHZhbmMuaD4KLQotICAvKiAqLwotCi0jZGVmaW5lIEZUX0VSUk9SX0RFRklOSVRJT05TX0ggIDxmcmVldHlwZS9mdGVycmRlZi5oPgotCi0KLSAgLyogVGhlIGludGVybmFscyBvZiB0aGUgY2FjaGUgc3ViLXN5c3RlbSBhcmUgbm8gbG9uZ2VyIGV4cG9zZWQuICBXZSAqLwotICAvKiBkZWZhdWx0IHRvIEZUX0NBQ0hFX0ggYXQgdGhlIG1vbWVudCBqdXN0IGluIGNhc2UsIGJ1dCB3ZSBrbm93IG9mICovCi0gIC8qIG5vIHJvZ3VlIGNsaWVudCB0aGF0IHVzZXMgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DQUNIRV9NQU5BR0VSX0ggICAgICAgICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0jZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX01SVV9IICAgICAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLSNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfTUFOQUdFUl9IICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgotI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9DQUNIRV9IICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0jZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX0dMWVBIX0ggICAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLSNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfSU1BR0VfSCAgICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgotI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9TQklUU19IICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0KLQotI2RlZmluZSBGVF9JTkNSRU1FTlRBTF9IICAgICAgICAgIDxmcmVldHlwZS9mdGluY3JlbS5oPgotCi0jZGVmaW5lIEZUX1RSVUVUWVBFX1VOUEFURU5URURfSCAgPGZyZWV0eXBlL3R0dW5wYXQuaD4KLQotCi0gIC8qCi0gICAqIEluY2x1ZGUgaW50ZXJuYWwgaGVhZGVycyBkZWZpbml0aW9ucyBmcm9tIDxmcmVldHlwZS9pbnRlcm5hbC8uLi4+Ci0gICAqIG9ubHkgd2hlbiBidWlsZGluZyB0aGUgbGlicmFyeS4KLSAgICovCi0jaWZkZWYgRlQyX0JVSUxEX0xJQlJBUlkKLSNkZWZpbmUgIEZUX0lOVEVSTkFMX0lOVEVSTkFMX0ggIDxmcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfSU5URVJOQUxfSAotI2VuZGlmIC8qIEZUMl9CVUlMRF9MSUJSQVJZICovCi0KLQotI2VuZGlmIC8qIF9fRlQyX0JVSUxEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjI5YmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIHJlZ2lzdGVycyB0aGUgRnJlZVR5cGUgbW9kdWxlcyBjb21waWxlZCBpbnRvIHRoZSBsaWJyYXJ5LgotICoKLSAqICBJZiB5b3UgdXNlIEdOVSBtYWtlLCB0aGlzIGZpbGUgSVMgTk9UIFVTRUQhICBJbnN0ZWFkLCBpdCBpcyBjcmVhdGVkIGluCi0gKiAgdGhlIG9iamVjdHMgZGlyZWN0b3J5IChub3JtYWxseSBgPHRvcGRpcj4vb2Jqcy8nKSBiYXNlZCBvbiBpbmZvcm1hdGlvbgotICogIGZyb20gYDx0b3BkaXI+L21vZHVsZXMuY2ZnJy4KLSAqCi0gKiAgUGxlYXNlIHJlYWQgYGRvY3MvSU5TVEFMTC5BTlknIGFuZCBgZG9jcy9DVVNUT01JWkUnIGhvdyB0byBjb21waWxlCi0gKiAgRnJlZVR5cGUgd2l0aG91dCBHTlUgbWFrZS4KLSAqCi0gKi8KLQotRlRfVVNFX01PRFVMRShhdXRvZml0X21vZHVsZV9jbGFzcykKLUZUX1VTRV9NT0RVTEUodHRfZHJpdmVyX2NsYXNzKQotRlRfVVNFX01PRFVMRShjZmZfZHJpdmVyX2NsYXNzKQotRlRfVVNFX01PRFVMRShwc25hbWVzX21vZHVsZV9jbGFzcykKLUZUX1VTRV9NT0RVTEUocHNoaW50ZXJfbW9kdWxlX2NsYXNzKQotRlRfVVNFX01PRFVMRShmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzKQotRlRfVVNFX01PRFVMRShzZm50X21vZHVsZV9jbGFzcykKLUZUX1VTRV9NT0RVTEUoZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzKQotRlRfVVNFX01PRFVMRShmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzKQotRlRfVVNFX01PRFVMRShmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzcykKLQotLyogRU9GICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyZTE5Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0b3B0aW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVc2VyLXNlbGVjdGFibGUgY29uZmlndXJhdGlvbiBtYWNyb3MgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUT1BUSU9OX0hfXwotI2RlZmluZSBfX0ZUT1BUSU9OX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIFVTRVItU0VMRUNUQUJMRSBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtYWNybyBkZWZpbml0aW9ucyBmb3IgICAgKi8KLSAgLyogYSBzdGFuZGFyZCBidWlsZCBvZiB0aGUgRnJlZVR5cGUgbGlicmFyeS4gIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvICAgICovCi0gIC8qIHVzZSB0aGlzIGZpbGUgdG8gYnVpbGQgcHJvamVjdC1zcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeTogICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gWW91IGNhbiBtb2RpZnkgdGhpcyBmaWxlIGJ5IGhhbmQsIGJ1dCB0aGlzIGlzIG5vdCByZWNvbW1lbmRlZCBpbiAgICovCi0gIC8qICAgIGNhc2VzIHdoZXJlIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIHNldmVyYWwgdmVyc2lvbnMgb2YgdGhlICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IGZyb20gYSBzaW5nbGUgc291cmNlIGRpcmVjdG9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFlvdSBjYW4gcHV0IGEgY29weSBvZiB0aGlzIGZpbGUgaW4geW91ciBidWlsZCBkaXJlY3RvcnksIG1vcmUgICAgICAqLwotICAvKiAgICBwcmVjaXNlbHkgaW4gYCRCVUlMRC9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCcsIHdoZXJlIGAkQlVJTEQnICAgKi8KLSAgLyogICAgaXMgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkgdGhhdCBpcyBpbmNsdWRlZCBfYmVmb3JlXyB0aGUgRnJlZVR5cGUgICovCi0gIC8qICAgIGluY2x1ZGUgcGF0aCBkdXJpbmcgY29tcGlsYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRlZmF1bHQgRnJlZVR5cGUgTWFrZWZpbGVzIGFuZCBKYW1maWxlcyB1c2UgdGhlIGJ1aWxkICAgICAgICAgICovCi0gIC8qICAgIGRpcmVjdG9yeSBgYnVpbGRzLzxzeXN0ZW0+JyBieSBkZWZhdWx0LCBidXQgeW91IGNhbiBlYXNpbHkgY2hhbmdlICAqLwotICAvKiAgICB0aGF0IGZvciB5b3VyIG93biBwcm9qZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIENvcHkgdGhlIGZpbGUgPGZ0MmJ1aWxkLmg+IHRvIGAkQlVJTEQvZnQyYnVpbGQuaCcgYW5kIG1vZGlmeSBpdCAgICAqLwotICAvKiAgICBzbGlnaHRseSB0byBwcmUtZGVmaW5lIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OU19IIHVzZWQgdG8gICAgICAgKi8KLSAgLyogICAgbG9jYXRlIHRoaXMgZmlsZSBkdXJpbmcgdGhlIGJ1aWxkLiAgRm9yIGV4YW1wbGUsICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNkZWZpbmUgRlRfQ09ORklHX09QVElPTlNfSCAgPG15ZnRvcHRpb25zLmg+ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWxsIHVzZSBgJEJVSUxEL215ZnRvcHRpb25zLmgnIGluc3RlYWQgb2YgdGhpcyBmaWxlIGZvciBtYWNybyAgICAgKi8KLSAgLyogICAgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIGFsc28gdGhhdCB5b3UgY2FuIHNpbWlsYXJseSBwcmUtZGVmaW5lIHRoZSBtYWNybyAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ09ORklHX01PRFVMRVNfSCB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBsaXN0aW5nIG9mIHRoZSBtb2R1bGVzICovCi0gIC8qICAgIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIHRvIHRoZSBsaWJyYXJ5IGF0IGNvbXBpbGUgdGltZS4gIEJ5ICAgICAqLwotICAvKiAgICBkZWZhdWx0LCB0aGlzIGZpbGUgaXMgPGZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oPi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBXZSBoaWdobHkgcmVjb21tZW5kIHVzaW5nIHRoZSB0aGlyZCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiBHIEUgTiBFIFIgQSBMICAgRiBSIEUgRSBUIFkgUCBFICAgMiAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3YW50IHRvIGFjdGl2YXRlIHN1Yi1waXhlbCByZW5kZXJpbmcgICovCi0gIC8qIChhLmsuYS4gTENEIHJlbmRlcmluZywgb3IgQ2xlYXJUeXBlKSBpbiB0aGlzIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBjb3ZlcmVkIGJ5IHNldmVyYWwgTWljcm9zb2Z0IHBhdGVudHMgICAgICAgICovCi0gIC8qIGFuZCBzaG91bGQgbm90IGJlIGFjdGl2YXRlZCBpbiBhbnkgZGVmYXVsdCBidWlsZCBvZiB0aGUgbGlicmFyeS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtYWNybyBoYXMgbm8gaW1wYWN0IG9uIHRoZSBGcmVlVHlwZSBBUEksIG9ubHkgb24gaXRzICAgICAgICAgICAgICovCi0gIC8qIF9pbXBsZW1lbnRhdGlvbl8uICBGb3IgZXhhbXBsZSwgdXNpbmcgRlRfUkVOREVSX01PREVfTENEIHdoZW4gY2FsbGluZyAqLwotICAvKiBGVF9SZW5kZXJfR2x5cGggc3RpbGwgZ2VuZXJhdGVzIGEgYml0bWFwIHRoYXQgaXMgMyB0aW1lcyBsYXJnZXIgdGhhbiAgKi8KLSAgLyogdGhlIG9yaWdpbmFsIHNpemU7IHRoZSBkaWZmZXJlbmNlIHdpbGwgYmUgdGhhdCBlYWNoIHRyaXBsZXQgb2YgICAgICAgICovCi0gIC8qIHN1YnBpeGVscyBoYXMgUj1HPUIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyBkb25lIHRvIGFsbG93IEZyZWVUeXBlIGNsaWVudHMgdG8gcnVuIHVubW9kaWZpZWQsIGZvcmNpbmcgICAgICovCi0gIC8qIHRoZW0gdG8gZGlzcGxheSBub3JtYWwgZ3JheS1sZXZlbCBhbnRpLWFsaWFzZWQgZ2x5cGhzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWFueSBjb21waWxlcnMgcHJvdmlkZSBhIG5vbi1BTlNJIDY0LWJpdCBkYXRhIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCAgICovCi0gIC8qIGJ5IEZyZWVUeXBlIHRvIHNwZWVkIHVwIHNvbWUgY29tcHV0YXRpb25zLiAgSG93ZXZlciwgdGhpcyB3aWxsIGNyZWF0ZSAqLwotICAvKiBzb21lIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGluIHN0cmljdCBBTlNJIG1vZGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciB0aGlzIHJlYXNvbiwgdGhlIHVzZSBvZiA2NC1iaXQgaW50ZWdlcnMgaXMgbm9ybWFsbHkgZGlzYWJsZWQgd2hlbiAqLwotICAvKiB0aGUgX19TVERDX18gbWFjcm8gaXMgZGVmaW5lZC4gIFlvdSBjYW4gaG93ZXZlciBkaXNhYmxlIHRoaXMgYnkgICAgICAgKi8KLSAgLyogZGVmaW5pbmcgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgaGVyZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3IgbW9zdCBjb21waWxlcnMsIHRoaXMgd2lsbCBvbmx5IGNyZWF0ZSBjb21waWxhdGlvbiB3YXJuaW5ncyB3aGVuICAgKi8KLSAgLyogYnVpbGRpbmcgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPYk5vdGU6IFRoZSBjb21waWxlci1zcGVjaWZpYyA2NC1iaXQgaW50ZWdlcnMgYXJlIGRldGVjdGVkIGluIHRoZSAgICAgKi8KLSAgLyogICAgICAgICBmaWxlIGBmdGNvbmZpZy5oJyBlaXRoZXIgc3RhdGljYWxseSBvciB0aHJvdWdoIHRoZSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgYGNvbmZpZ3VyZScgc2NyaXB0IG9uIHN1cHBvcnRlZCBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXaGVuIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgZG8gbm90IHRyeSB0byB1c2UgYW4gYXNzZW1ibGVyIHZlcnNpb24gICAgKi8KLSAgLyogb2YgcGVyZm9ybWFuY2UtY3JpdGljYWwgZnVuY3Rpb25zIChlLmcuIEZUX011bEZpeCkuIHlvdSBzaG91bGQgb25seSAgICovCi0gIC8qIGRvIHRoYXQgdG8gdmVyaWZ5IHRoYXQgdGhlIGFzc2VtYmxlciBmdW5jdGlvbiB3b3JrcyBwcm9wZXJseSwgb3IgZXZlbiAqLwotICAvKiB0byBiZW5jaG1hcmtzIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucy4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdoZW4gdGhpcyBtYWNybyBpcyBkZWZpbmVkLCB0cnkgdG8gdXNlIGFuIGlubGluZWQgYXNzZW1ibGVyIHZlcnNpb24gICAqLwotICAvKiBvZiB0aGUgRlRfTXVsRml4IGZ1bmN0aW9uLCB3aGljaCBhcHBlYXJzIHRvIGJlIGEgaG90c3BvdCB3aGVuIGxvYWRpbmcgKi8KLSAgLyogYW5kIGhpbnRpbmcgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBub3RlIHRoYXQgaWYgeW91ciBjb21waWxlci9jcHUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0byAgKi8KLSAgLyogdGhlIHN0YW5kYXJkIGFuZCBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBmb3VuZCBpbiBzcmMvYmFzZS9mdGNhbGMuYyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0lOTElORV9NVUxGSVgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTFpXLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KLSAgLyogICBgY29tcHJlc3MnIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiAgICovCi0gIC8qICAgZmlsZXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBYMTEgZGlzdHJpYnV0aW9ucy4gIFRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICAvKiAgIHVzZXMgTmV0QlNEJ3MgYHpvcGVuJyB0byBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5ICAgKi8KLSAgLyogICAoc2VlIHNyYy9sencvZnRnemlwLmMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0xaVwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHemlwLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgZm9udCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlICAqLwotICAvKiAgIGBnemlwJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgZmlsZXMgKi8KLSAgLyogICB0aGF0IGNvbWUgd2l0aCBYRnJlZTg2LiAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYHpsaWInIHRvICAgICAgICAgICovCi0gIC8qICAgcGFydGlhbGx5IHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAoc2VlIHNyYy9nemlwL2Z0Z3ppcC5jKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICBTZWUgYWxzbyAgICovCi0gIC8qICAgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBaTGliIGxpYnJhcnkgc2VsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBtYWNybyBpcyBvbmx5IHVzZWQgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCIGlzIGRlZmluZWQuICAqLwotICAvKiAgIEl0IGFsbG93cyBGcmVlVHlwZSdzIGBmdGd6aXAnIGNvbXBvbmVudCB0byBsaW5rIHRvIHRoZSBzeXN0ZW0ncyAgICAgKi8KLSAgLyogICBpbnN0YWxsYXRpb24gb2YgdGhlIFpMaWIgbGlicmFyeS4gIFRoaXMgaXMgdXNlZnVsIG9uIHN5c3RlbXMgbGlrZSAgICovCi0gIC8qICAgVW5peCBvciBWTVMgd2hlcmUgaXQgZ2VuZXJhbGx5IGlzIGFscmVhZHkgYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiB5b3UgbGV0IGl0IHVuZGVmaW5lZCwgdGhlIGNvbXBvbmVudCB3aWxsIHVzZSBpdHMgb3duIGNvcHkgICAgICAgICovCi0gIC8qICAgb2YgdGhlIHpsaWIgc291cmNlcyBpbnN0ZWFkLiAgVGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGJlICAgICAgICAqLwotICAvKiAgIGluY2x1ZGVkIGRpcmVjdGx5IHdpdGhpbiB0aGUgY29tcG9uZW50IGFuZCAqbm90KiBleHBvcnQgZXh0ZXJuYWwgICAgKi8KLSAgLyogICBmdW5jdGlvbiBuYW1lcy4gIFRoaXMgYWxsb3dzIHlvdSB0byBsaW5rIGFueSBwcm9ncmFtIHdpdGggRnJlZVR5cGUgICovCi0gIC8qICAgX2FuZF8gWkxpYiB3aXRob3V0IGxpbmtpbmcgY29uZmxpY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAgICovCi0gIC8qICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRExMIGV4cG9ydCBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdoZW4gY29tcGlsaW5nIEZyZWVUeXBlIGFzIGEgRExMLCBzb21lIHN5c3RlbXMvY29tcGlsZXJzIG5lZWQgYSAgICAgKi8KLSAgLyogICBzcGVjaWFsIGtleXdvcmQgaW4gZnJvbnQgT1IgYWZ0ZXIgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uICAgICAgICovCi0gIC8qICAgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUd28gbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUgdG8gZGVmaW5lICAgICAgICovCi0gIC8qICAgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnM6IEZUX0VYUE9SVCBhbmQgRlRfRVhQT1JUX0RFRi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VYUE9SVCggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGFzIGluICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfRVhQT1JUKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVhQT1JUX0RFRiggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uLCBhcyBpbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSogIGFsaWJyYXJ5ICkgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IGNhbiBwcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIEZUX0VYUE9SVCBhbmQgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VYUE9SVF9ERUYgaGVyZSBpZiB5b3Ugd2FudC4gIElmIHlvdSBsZWF2ZSB0aGVtIHVuZGVmaW5lZCwgdGhleSAgKi8KLSAgLyogICB3aWxsIGJlIGxhdGVyIGF1dG9tYXRpY2FsbHkgZGVmaW5lZCBhcyBgZXh0ZXJuIHJldHVybl90eXBlJyB0byAgICAgICovCi0gIC8qICAgYWxsb3cgbm9ybWFsIGNvbXBpbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICovCi0gIC8qICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgIEZUX0VYUE9SVCh4KSAgICAgICBleHRlcm4geCAqLwotLyogI2RlZmluZSAgRlRfRVhQT1JUX0RFRih4KSAgIHggKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR2x5cGggUG9zdHNjcmlwdCBOYW1lcyBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIDIgaXMgY29tcGlsZWQgd2l0aCB0aGUgYFBTTmFtZXMnIG1vZHVsZS4gIFRoaXMgKi8KLSAgLyogICBtb2R1bGUgaXMgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCBuYW1lIHN0cmluZyBpbnRvIGEgICAgICAgICovCi0gIC8qICAgVW5pY29kZSB2YWx1ZSwgb3IgcmV0dXJuIGEgTWFjaW50b3NoIHN0YW5kYXJkIGdseXBoIG5hbWUgZm9yIHRoZSAgICAqLwotICAvKiAgIHVzZSB3aXRoIHRoZSBUcnVlVHlwZSBgcG9zdCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgYFBTTmFtZXMnIGNvbXBpbGVkIGluIHlvdXIgICAqLwotICAvKiAgIGJ1aWxkIG9mIEZyZWVUeXBlLiAgVGhpcyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGUgVHJ1ZVR5cGUgZHJpdmVyIHdpbGwgcHJvdmlkZSBpdHMgb3duIHNldCBvZiBnbHlwaCBuYW1lcywgICAgICAqLwotICAvKiAgICAgaWYgeW91IGJ1aWxkIGl0IHRvIHN1cHBvcnQgcG9zdHNjcmlwdCBuYW1lcyBpbiB0aGUgVHJ1ZVR5cGUgICAgICAgKi8KLSAgLyogICAgIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gVGhlIFR5cGUgMSBkcml2ZXIgd2lsbCBub3QgYmUgYWJsZSB0byBzeW50aGV0aXplIGEgVW5pY29kZSAgICAgICAgKi8KLSAgLyogICAgIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFlvdSB3b3VsZCBub3JtYWxseSB1bmRlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gd2hlbiBidWlsZGluZyAgKi8KLSAgLyogICBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYSBUeXBlIDEgb3IgQ0ZGIGRyaXZlci4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zdHNjcmlwdCBOYW1lcyB0byBVbmljb2RlIFZhbHVlcyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIDIgaXMgYnVpbHQgd2l0aCB0aGUgYFBTTmFtZXMnIG1vZHVsZSBjb21waWxlZCAgKi8KLSAgLyogICBpbi4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIG1vZHVsZSBpcyB1c2VkIHRvIGNvbnZlcnQgYSBnbHlwaCBuYW1lICovCi0gIC8qICAgaW50byBhIFVuaWNvZGUgdmFsdWUuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIG9yZGVyIHRvICAgICAgICAqLwotICAvKiAgIHN5bnRoZXRpemUgb24gdGhlIGZseSBhIFVuaWNvZGUgY2hhcm1hcCBmcm9tIHRoZSBDRkYvVHlwZSAxIGRyaXZlciAgKi8KLSAgLyogICB0aHJvdWdoIGEgYmlnIHRhYmxlIG5hbWVkIHRoZSBgQWRvYmUgR2x5cGggTGlzdCcgKEFHTCkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IGRvIG5vdCB3YW50IHRoZSBBZG9iZSBHbHlwaCBMaXN0ICAgICAgICAgKi8KLSAgLyogICBjb21waWxlZCBpbiB5b3VyIGBQU05hbWVzJyBtb2R1bGUuICBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSAgICovCi0gIC8qICAgYWJsZSB0byBzeW50aGV0aXplIGEgVW5pY29kZSBjaGFybWFwIG91dCBvZiB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSAqLwotICAvKiAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdXBwb3J0IGZvciBNYWMgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igb3V0bGluZSBmb250cyBpbiBNYWMgICAgICAqLwotICAvKiAgIGZvcm1hdCAobWFjIGRmb250LCBtYWMgcmVzb3VyY2UsIG1hY2JpbmFyeSBjb250YWluaW5nIGEgbWFjICAgICAgICAgKi8KLSAgLyogICByZXNvdXJjZSkgb24gbm9uLU1hYyBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vdGUgdGhhdCB0aGUgYEZPTkQnIHJlc291cmNlIGlzbid0IGNoZWNrZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEd1ZXNzaW5nIG1ldGhvZHMgdG8gYWNjZXNzIGVtYmVkZGVkIHJlc291cmNlIGZvcmtzICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFbmFibGUgZXh0cmEgTWFjIGZvbnRzIHN1cHBvcnQgb24gbm9uLU1hYyBwbGF0Zm9ybXMgKGUuZy4gICAgICAgICAgICovCi0gIC8qICAgR05VL0xpbnV4KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBSZXNvdXJjZSBmb3JrcyB3aGljaCBpbmNsdWRlIGZvbnRzIGRhdGEgYXJlIHN0b3JlZCBzb21ldGltZXMgaW4gICAgICovCi0gIC8qICAgbG9jYXRpb25zIHdoaWNoIHVzZXJzIG9yIGRldmVsb3BlcnMgZG9uJ3QgZXhwZWN0ZWQuICBJbiBzb21lIGNhc2VzLCAqLwotICAvKiAgIHJlc291cmNlIGZvcmtzIHN0YXJ0IHdpdGggc29tZSBvZmZzZXQgZnJvbSB0aGUgaGVhZCBvZiBhIGZpbGUuICBJbiAgKi8KLSAgLyogICBvdGhlciBjYXNlcywgdGhlIGFjdHVhbCByZXNvdXJjZSBmb3JrIGlzIHN0b3JlZCBpbiBmaWxlIGRpZmZlcmVudCAgICovCi0gIC8qICAgZnJvbSB3aGF0IHRoZSB1c2VyIHNwZWNpZmllcy4gIElmIHRoaXMgb3B0aW9uIGlzIGFjdGl2YXRlZCwgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgc3VjaCBvZmZzZXRzIG9yIGRpZmZlcmVudCBmaWxlICAgICAgKi8KLSAgLyogICBuYW1lcyBtdXN0IGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vdGUgdGhhdCBub3JtYWwsIGRpcmVjdCBhY2Nlc3Mgb2YgcmVzb3VyY2UgZm9ya3MgaXMgY29udHJvbGxlZCB2aWEgKi8KLSAgLyogICB0aGUgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMgb3B0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGxvdyB0aGUgdXNlIG9mIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZSB0byBsb2FkIHR5cGVmYWNlcyB0aGF0ICAgICAgKi8KLSAgLyogY29udGFpbiBubyBnbHlwaCBkYXRhLCBidXQgc3VwcGx5IGl0IHZpYSBhIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICovCi0gIC8qIFRoaXMgYWxsb3dzIEZyZWVUeXBlIHRvIGJlIHVzZWQgd2l0aCB0aGUgUG9zdFNjcmlwdCBsYW5ndWFnZSwgdXNpbmcgICAqLwotICAvKiB0aGUgR2hvc3RTY3JpcHQgaW50ZXJwcmV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0S0J5dGUgaWYgeW91IHVzZSBGcmVlVHlwZSB0byByYXN0ZXJpemUgICAgICovCi0gIC8qIGdseXBoczsgb3RoZXJ3aXNlLCB5b3UgbWF5IHNldCBpdCB0byB6ZXJvIHRvIGF2b2lkIHVubmVjZXNzYXJ5ICAgICAgICAqLwotICAvKiBhbGxvY2F0aW9uIG9mIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1JFTkRFUl9QT09MX1NJWkUgIDE2Mzg0TAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9NQVhfTU9EVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG1vZHVsZXMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhIHNpbmdsZSAgICAqLwotICAvKiAgIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgMzIgaXMgdGhlIGRlZmF1bHQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX01BWF9NT0RVTEVTICAzMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWJ1ZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgY2FuIGJlIGNvbXBpbGVkIGluIGRlYnVnIG9yIHRyYWNlIG1vZGUuICBJbiBkZWJ1ZyBtb2RlLCAgICAqLwotICAvKiAgIGVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgYGZ0ZGVidWcnIGNvbXBvbmVudC4gIEluIHRyYWNlICAgICAgKi8KLSAgLyogICBtb2RlLCBhZGRpdGlvbmFsIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZHVyaW5nICAgICovCi0gIC8qICAgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfRVJST1IgdG8gYnVpbGQgdGhlIGxpYnJhcnkgaW4gZGVidWcgbW9kZS4gICAgICovCi0gIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFIHRvIGJ1aWxkIGl0IGluIHRyYWNlIG1vZGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEb24ndCBkZWZpbmUgYW55IG9mIHRoZXNlIG1hY3JvcyB0byBjb21waWxlIGluIGByZWxlYXNlJyBtb2RlISAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvIG5vdCAjdW5kZWYgdGhlc2UgbWFjcm9zIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgKi8KLSAgLyogICB0aGVtIGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotLyogI2RlZmluZSBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNZW1vcnkgRGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGNvbWVzIHdpdGggYW4gaW50ZWdyYXRlZCBtZW1vcnkgZGVidWdnZXIgdGhhdCBpcyAgICAgICAqLwotICAvKiAgIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNpbXBsZSBlcnJvcnMgbGlrZSBtZW1vcnkgbGVha3Mgb3IgZG91YmxlICAgICAgKi8KLSAgLyogICBkZWxldGVzLiAgVG8gY29tcGlsZSBpdCB3aXRoaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgeW91ICAgICAgICovCi0gIC8qICAgc2hvdWxkIGRlZmluZSBGVF9ERUJVR19NRU1PUlkgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgdGhlIG1lbW9yeSBkZWJ1Z2dlciBpcyBvbmx5IGFjdGl2YXRlZCBhdCBydW50aW1lIHdoZW4gICAgICovCi0gIC8qICAgd2hlbiB0aGUgX2Vudmlyb25tZW50XyB2YXJpYWJsZSBgRlQyX0RFQlVHX01FTU9SWScgaXMgZGVmaW5lZCBhbHNvISAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAgICovCi0gIC8qICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfREVCVUdfTUVNT1JZICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1vZHVsZSBlcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiB0aGlzIG1hY3JvIGlzIHNldCAod2hpY2ggaXMgX25vdF8gdGhlIGRlZmF1bHQpLCB0aGUgaGlnaGVyIGJ5dGUgICovCi0gIC8qICAgb2YgYW4gZXJyb3IgY29kZSBnaXZlcyB0aGUgbW9kdWxlIGluIHdoaWNoIHRoZSBlcnJvciBoYXMgb2NjdXJyZWQsICAqLwotICAvKiAgIHdoaWxlIHRoZSBsb3dlciBieXRlIGlzIHRoZSByZWFsIGVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU2V0dGluZyB0aGlzIG1hY3JvIG1ha2VzIHNlbnNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSwgc2luY2UgICAqLwotICAvKiAgIGl0IHdvdWxkIGJyZWFrIHNvdXJjZSBjb21wYXRpYmlsaXR5IG9mIGNlcnRhaW4gcHJvZ3JhbXMgdGhhdCB1c2UgICAgKi8KLSAgLyogICBGcmVlVHlwZSAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGVzIGZ0bW9kZXJyLmggYW5kIGZ0ZXJyb3JzLmguICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgRlRfQ09ORklHX09QVElPTl9VU0VfTU9EVUxFX0VSUk9SUwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgUyBGIE4gVCAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyBpZiB5b3Ugd2FudCB0byBzdXBwb3J0ICAgICAgICovCi0gIC8qIGVtYmVkZGVkIGJpdG1hcHMgaW4gYWxsIGZvcm1hdHMgdXNpbmcgdGhlIFNGTlQgbW9kdWxlIChuYW1lbHkgICAgICAgICAqLwotICAvKiBUcnVlVHlwZSAmIE9wZW5UeXBlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gICAgKi8KLSAgLyogbG9hZCBhbmQgZW51bWVyYXRlIHRoZSBnbHlwaCBQb3N0c2NyaXB0IG5hbWVzIGluIGEgVHJ1ZVR5cGUgb3IgICAgICAgICovCi0gIC8qIE9wZW5UeXBlIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IHdoZW4geW91IGRvIG5vdCBjb21waWxlIHRoZSBgUFNOYW1lcycgbW9kdWxlIGJ5IHVuZGVmaW5pbmcgICovCi0gIC8qIHRoZSBhYm92ZSBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMsIHRoZSBgc2ZudCcgbW9kdWxlIHdpbGwgICAqLwotICAvKiBjb250YWluIGFkZGl0aW9uYWwgY29kZSB1c2VkIHRvIHJlYWQgdGhlIFBTIE5hbWVzIHRhYmxlIGZyb20gYSBmb250LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIChCeSBkZWZhdWx0LCB0aGUgbW9kdWxlIHVzZXMgYFBTTmFtZXMnIHRvIGV4dHJhY3QgZ2x5cGggbmFtZXMuKSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMgaWYgeW91ciBhcHBsaWNhdGlvbnMgbmVlZCB0byAgICAgICAqLwotICAvKiBhY2Nlc3MgdGhlIGludGVybmFsIG5hbWUgdGFibGUgaW4gYSBTRk5ULWJhc2VkIGZvcm1hdCBsaWtlIFRydWVUeXBlICAgKi8KLSAgLyogb3IgT3BlblR5cGUuICBUaGUgbmFtZSB0YWJsZSBjb250YWlucyB2YXJpb3VzIHN0cmluZ3MgdXNlZCB0byAgICAgICAgICovCi0gIC8qIGRlc2NyaWJlIHRoZSBmb250LCBsaWtlIGZhbWlseSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4gIEl0ICAgICAqLwotICAvKiBkb2VzIG5vdCBjb250YWluIGFueSBnbHlwaCBuYW1lIHRob3VnaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFjY2Vzc2luZyBTRk5UIG5hbWVzIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICAgICAgICAqLwotICAvKiBgZnJlZXR5cGUvZnRuYW1lcy5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUcnVlVHlwZSBDTWFwIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSGVyZSB5b3UgY2FuIGZpbmUtdHVuZSB3aGljaCBUcnVlVHlwZSBDTWFwIHRhYmxlIGZvcm1hdCBzaGFsbCBiZSAgICAqLwotICAvKiAgIHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzAKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzIKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzQKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzYKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzgKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEwCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMgotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgIFQgUiBVIEUgVCBZIFAgRSAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgaWYgeW91IHdhbnQgdG8gY29tcGlsZSAgICovCi0gIC8qIGEgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaW4gdGhlIFRydWVUeXBlIGRyaXZlci4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgICAqLwotICAvKiBpbXBvcnRhbnQgcGF0ZW50IGlzc3VlcyByZWxhdGVkIHRvIHRoZSB1c2Ugb2YgdGhlIGludGVycHJldGVyLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJ5IHVuZGVmaW5pbmcgdGhpcywgeW91IHdpbGwgb25seSBjb21waWxlIHRoZSBjb2RlIG5lY2Vzc2FyeSB0byBsb2FkICAqLwotICAvKiBUcnVlVHlwZSBnbHlwaHMgd2l0aG91dCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGlzIG1hY3JvIGhlcmUsIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgICAgICAgICAqLwotICAvKiAgIGRlZmluZSBpdCBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgeW91IGRlZmluZSBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORywgYSBzcGVjaWFsIHZlcnNpb24gICovCi0gIC8qIG9mIHRoZSBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBpcyB1c2VkIHRoYXQgZG9lc24ndCBpbXBsZW1lbnQgICAqLwotICAvKiBhbnkgb2YgdGhlIHBhdGVudGVkIG9wY29kZXMgYW5kIGFsZ29yaXRobXMuICBOb3RlIHRoYXQgdGhlICAgICAgICAgICAgKi8KLSAgLyogdGhlIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HIG1hY3JvIGlzICppZ25vcmVkKiBpZiB5b3UgICAgICovCi0gIC8qIGRlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSOyB3aXRoIG90aGVyIHdvcmRzLCAgICAgICAqLwotICAvKiBlaXRoZXIgZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgb3IgICAgICAgICAgICAgICAgKi8KLSAgLyogVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcgYnV0IG5vdCBib3RoIGF0IHRoZSBzYW1lIHRpbWUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIG1hY3JvIGlzIG9ubHkgdXNlZnVsIGZvciBhIHNtYWxsIG51bWJlciBvZiBmb250IGZpbGVzIChtb3N0bHkgICAgKi8KLSAgLyogZm9yIEFzaWFuIHNjcmlwdHMpIHRoYXQgcmVxdWlyZSBieXRlY29kZSBpbnRlcnByZXRhdGlvbiB0byBwcm9wZXJseSAgICovCi0gIC8qIGxvYWQgZ2x5cGhzLiAgRm9yIGFsbCBvdGhlciBmb250cywgdGhpcyBwcm9kdWNlcyB1bnBsZWFzYW50IHJlc3VsdHMsICAqLwotICAvKiB0aHVzIHRoZSB1bnBhdGVudGVkIGludGVycHJldGVyIGlzIG5ldmVyIHVzZWQgdG8gbG9hZCBnbHlwaHMgZnJvbSAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgZm9udHMgdW5sZXNzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBvcHRpb25zIGlzIHVzZWQuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gVGhlIHVucGF0ZW50ZWQgaW50ZXJwcmV0ZXIgaXMgZXhwbGljaXRseSBhY3RpdmF0ZWQgYnkgdGhlIHVzZXIgICAgKi8KLSAgLyogICAgIHRocm91Z2ggdGhlIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcgcGFyYW1ldGVyIHRhZyAgICAgICAgICovCi0gIC8qICAgICB3aGVuIG9wZW5pbmcgdGhlIEZUX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIEZyZWVUeXBlIGRldGVjdHMgdGhhdCB0aGUgRlRfRmFjZSBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlICAgICAgICovCi0gIC8qICAgICBgdHJpY2snIGZvbnRzIChlLmcuLCBgTWluZ2xpdScpIGl0IGtub3dzIGFib3V0LiAgVGhlIGZvbnQgZW5naW5lICAqLwotICAvKiAgICAgY29udGFpbnMgYSBoYXJkLWNvZGVkIGxpc3Qgb2YgZm9udCBuYW1lcyBhbmQgb3RoZXIgbWF0Y2hpbmcgICAgICAgKi8KLSAgLyogICAgIHBhcmFtZXRlcnMgKHNlZSBmdW5jdGlvbiBgdHRfZmFjZV9pbml0JyBpbiBmaWxlICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBgc3JjL3RydWV0eXBlL3R0b2Jqcy5jJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSGVyZSBhIHNhbXBsZSBjb2RlIHNuaXBwZXQgZm9yIHVzaW5nIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX1BhcmFtZXRlciAgcGFyYW1ldGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBGVF9PcGVuX0FyZ3MgIG9wZW5fYXJnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBwYXJhbWV0ZXIudGFnID0gRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORzsgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG9wZW5fYXJncy5mbGFncyAgICAgID0gRlRfT1BFTl9QQVRITkFNRSB8IEZUX09QRU5fUEFSQU1TOyAgICAgICAgICovCi0gIC8qICAgICBvcGVuX2FyZ3MucGF0aG5hbWUgICA9IG15X2ZvbnRfcGF0aG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgb3Blbl9hcmdzLm51bV9wYXJhbXMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG9wZW5fYXJncy5wYXJhbXMgICAgID0gJnBhcmFtZXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZvcGVuX2FyZ3MsIGluZGV4LCAmZmFjZSApOyAgICAgICAgKi8KLSAgLyogICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fSU5URVJQUkVURVJfU1dJVENIIHRvIGNvbXBpbGUgdGhlIFRydWVUeXBlICAgICovCi0gIC8qIGJ5dGVjb2RlIGludGVycHJldGVyIHdpdGggYSBodWdlIHN3aXRjaCBzdGF0ZW1lbnQsIHJhdGhlciB0aGFuIGEgY2FsbCAqLwotICAvKiB0YWJsZS4gIFRoaXMgcmVzdWx0cyBpbiBzbWFsbGVyIGFuZCBmYXN0ZXIgY29kZSBmb3IgYSBudW1iZXIgb2YgICAgICAgKi8KLSAgLyogYXJjaGl0ZWN0dXJlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIGhvd2V2ZXIgdGhhdCBvbiBzb21lIGNvbXBpbGVyL3Byb2Nlc3NvciBjb21iaW5hdGlvbnMsIHVuZGVmaW5pbmcgKi8KLSAgLyogdGhpcyBtYWNybyB3aWxsIGdlbmVyYXRlIGZhc3RlciwgdGhvdWdoIGxhcmdlciwgY29kZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRCB0byBjb21waWxlIHRoZSAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIHRvIHVzZSBBcHBsZSdzIGRlZmluaXRpb24gb2YgaG93IHRvIGhhbmRsZSAgICAgICovCi0gIC8qIGNvbXBvbmVudCBvZmZzZXRzIGluIGNvbXBvc2l0ZSBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQXBwbGUgYW5kIE1TIGRpc2FncmVlIG9uIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGNvbXBvbmVudCBvZmZzZXRzICAgICovCi0gIC8qIGluIGNvbXBvc2l0ZXMuICBBcHBsZSBzYXlzIHRoYXQgdGhleSBzaG91bGQgYmUgc2NhbGVkIGJ5IHRoZSBzY2FsaW5nICAqLwotICAvKiBmYWN0b3JzIGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKHJvdWdobHksIGl0J3MgbW9yZSBjb21wbGV4KSAgICAgKi8KLSAgLyogd2hpbGUgTVMgc2F5cyB0aGV5IHNob3VsZCBub3QuICBPcGVuVHlwZSBkZWZpbmVzIHR3byBiaXRzIGluIHRoZSAgICAgICovCi0gIC8qIGNvbXBvc2l0ZSBmbGFncyBhcnJheSB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNhbWJpZ3VhdGUsIGJ1dCBvbGQgICAgICAqLwotICAvKiBmb250cyB3aWxsIG5vdCBoYXZlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgaHR0cDovL3BhcnRuZXJzLmFkb2JlLmNvbS9hc24vZGV2ZWxvcGVyL29wZW50eXBlL2dseWYuaHRtbCAgICAgICAgICAqLwotICAvKiAgIGh0dHA6Ly9mb250cy5hcHBsZS5jb20vVFRSZWZNYW4vUk0wNi9DaGFwNmdseWYuaHRtbCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCBpZiB5b3Ugd2FudCB0byBpbmNsdWRlICAgICAgICAgKi8KLSAgLyogc3VwcG9ydCBmb3IgQXBwbGUncyBkaXN0b3J0YWJsZSBmb250IHRlY2hub2xvZ3kgKGZ2YXIsIGd2YXIsIGN2YXIsICAgICovCi0gIC8qIGFuZCBhdmFyIHRhYmxlcykuICBUaGlzIGhhcyBtYW55IHNpbWlsYXJpdGllcyB0byBUeXBlIDEgTXVsdGlwbGUgICAgICAqLwotICAvKiBNYXN0ZXJzIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQkRGIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgICAgICAgICovCi0gIC8qIGFuIGVtYmVkZGVkIGBCREYgJyB0YWJsZSB3aXRoaW4gU0ZOVC1iYXNlZCBiaXRtYXAgZm9ybWF0cy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9CREYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgVCBZIFAgRSAxICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUMV9NQVhfRElDVF9ERVBUSCBpcyB0aGUgbWF4aW1hbCBkZXB0aCBvZiBuZXN0IGRpY3Rpb25hcmllcyBhbmQgICAgICAgKi8KLSAgLyogYXJyYXlzIGluIHRoZSBUeXBlIDEgc3RyZWFtIChzZWUgdDFsb2FkLmMpLiAgQSBtaW5pbXVtIG9mIDQgaXMgICAgICAgICovCi0gIC8qIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVDFfTUFYX0RJQ1RfREVQVEggIDUKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX1NVQlJTX0NBTExTIGRldGFpbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5lc3RlZCBzdWItcm91dGluZSAgICovCi0gIC8qIGNhbGxzIGR1cmluZyBnbHlwaCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVDFfTUFYX1NVQlJTX0NBTExTICAxNgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUMV9NQVhfQ0hBUlNUUklOR19PUEVSQU5EUyBpcyB0aGUgY2hhcnN0cmluZyBzdGFjaydzIGNhcGFjaXR5LiAgQSAgICAgKi8KLSAgLyogbWluaW11bSBvZiAxNiBpcyByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgQ2hpbmVzZSBmb250IE1pbmdUaUVHLU1lZGl1bSAoQ05TIDExNjQzIGNoYXJhY3RlciBzZXQpIG5lZWRzIDI1Ni4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EUyAgMjU2Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gaWYgeW91IHdhbnQgdG8gcHJldmVudCB0aGUgICAgICAgICAgICAqLwotICAvKiBjb21waWxhdGlvbiBvZiBgdDFhZm0nLCB3aGljaCBpcyBpbiBjaGFyZ2Ugb2YgcmVhZGluZyBUeXBlIDEgQUZNICAgICAgKi8KLSAgLyogZmlsZXMgaW50byBhbiBleGlzdGluZyBmYWNlLiAgTm90ZSB0aGF0IGlmIHNldCwgdGhlIFQxIGRyaXZlciB3aWxsIGJlICovCi0gIC8qIHVuYWJsZSB0byBwcm9kdWNlIGtlcm5pbmcgZGlzdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gb2YgdGhlIE11bHRpcGxlIE1hc3RlcnMgZm9udCBzdXBwb3J0IGluIHRoZSBUeXBlIDEgICAgICAgICovCi0gIC8qIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgIEEgVSBUIE8gRiBJIFQgICBNIE8gRCBVIEwgRSAgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggQ0pLIChDaGluZXNlLCBKYXBhbmVzZSwgS29yZWFuKSBzY3JpcHQgICAgKi8KLSAgLyogc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX0NKSwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcGlsZSBhdXRvZml0IG1vZHVsZSB3aXRoIEluZGljIHNjcmlwdCBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX0lORElDCi0KLSAgLyogKi8KLQotCi0gIC8qCi0gICAqIERlZmluZSB0aGlzIHZhcmlhYmxlIGlmIHlvdSB3YW50IHRvIGtlZXAgdGhlIGxheW91dCBvZiBpbnRlcm5hbAotICAgKiBzdHJ1Y3R1cmVzIHRoYXQgd2FzIHVzZWQgcHJpb3IgdG8gRnJlZVR5cGUgMi4yLiAgVGhpcyBhbHNvIGNvbXBpbGVzIGluCi0gICAqIGEgZmV3IG9ic29sZXRlIGZ1bmN0aW9ucyB0byBhdm9pZCBsaW5raW5nIHByb2JsZW1zIG9uIHR5cGljYWwgVW5peAotICAgKiBkaXN0cmlidXRpb25zLgotICAgKgotICAgKiBGb3IgZW1iZWRkZWQgc3lzdGVtcyBvciBidWlsZGluZyBhIG5ldyBkaXN0cmlidXRpb24gZnJvbSBzY3JhdGNoLCBpdAotICAgKiBpcyByZWNvbW1lbmRlZCB0byBkaXNhYmxlIHRoZSBtYWNybyBzaW5jZSBpdCByZWR1Y2VzIHRoZSBsaWJyYXJ5J3MgY29kZQotICAgKiBzaXplIGFuZCBhY3RpdmF0ZXMgYSBmZXcgbWVtb3J5LXNhdmluZyBvcHRpbWl6YXRpb25zIGFzIHdlbGwuCi0gICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotCi0gIC8qCi0gICAqIFRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZCBpZiBlaXRoZXIgdW5wYXRlbnRlZCBvciBuYXRpdmUgVHJ1ZVR5cGUKLSAgICogaGludGluZyBpcyByZXF1ZXN0ZWQgYnkgdGhlIGRlZmluaXRpb25zIGFib3ZlLgotICAgKi8KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0jZGVmaW5lICBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSNlbGlmIGRlZmluZWQgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNkZWZpbmUgIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotI2VuZGlmCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19GVE9QVElPTl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTIzZjNlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzdGRsaWIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFOU0ktc3BlY2lmaWMgbGlicmFyeSBhbmQgaGVhZGVyIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3BlY2lmaWNhdGlvbiAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGdyb3VwIGFsbCAjaW5jbHVkZXMgdG8gdGhlIEFOU0kgQyBsaWJyYXJ5IHRoYXQgICAqLwotICAvKiBGcmVlVHlwZSBub3JtYWxseSByZXF1aXJlcy4gIEl0IGFsc28gZGVmaW5lcyBtYWNyb3MgdG8gcmVuYW1lIHRoZSAgICAgKi8KLSAgLyogc3RhbmRhcmQgZnVuY3Rpb25zIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMb2FkIGEgZmlsZSB3aGljaCBkZWZpbmVzIF9fRlRTVERMSUJfSF9fIGJlZm9yZSB0aGlzIG9uZSB0byBvdmVycmlkZSAgKi8KLSAgLyogaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRTVERMSUJfSF9fCi0jZGVmaW5lIF9fRlRTVERMSUJfSF9fCi0KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jZGVmaW5lIGZ0X3B0cmRpZmZfdCAgcHRyZGlmZl90Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciBsaW1pdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVUlOVF9NQVggYW5kIFVMT05HX01BWCBhcmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgdGhlIHNpemUgICovCi0gIC8qIG9mIGBpbnQnIGFuZCBgbG9uZycgaW4gYnl0ZXMgYXQgY29tcGlsZS10aW1lLiAgU28gZmFyLCB0aGlzIHdvcmtzICAqLwotICAvKiBmb3IgYWxsIHBsYXRmb3JtcyB0aGUgbGlicmFyeSBoYXMgYmVlbiB0ZXN0ZWQgb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBvbiB0aGUgZXh0cmVtZWx5IHJhcmUgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHByb3ZpZGUgICAgICAqLwotICAvKiBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlIF9leGFjdGx5XyAxNiBhbmQgMzIgYml0cyB3aWRlIChlLmcuIHNvbWUgICAgKi8KLSAgLyogb2xkIENyYXlzIHdoZXJlIGBpbnQnIGlzIDM2IGJpdHMpLCB3ZSBkbyBub3QgbWFrZSBhbnkgZ3VhcmFudGVlICAgICovCi0gIC8qIGFib3V0IHRoZSBjb3JyZWN0IGJlaGF2aW91ciBvZiBGVDIgd2l0aCBhbGwgZm9udHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW4gdGhlc2UgY2FzZSwgYGZ0Y29uZmlnLmgnIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUgYW55d2F5IHdpdGggYSAgICovCi0gIC8qIG1lc3NhZ2UgbGlrZSBgY291bGRuJ3QgZmluZCAzMi1iaXQgdHlwZScgb3Igc29tZXRoaW5nIHNpbWlsYXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSU1QT1JUQU5UIE5PVEU6IFdlIGRvIG5vdCBkZWZpbmUgYWxpYXNlcyBmb3IgaGVhcCBtYW5hZ2VtZW50IGFuZCAgICovCi0gIC8qICAgICAgICAgICAgICAgICBpL28gcm91dGluZXMgKGkuZS4gbWFsbG9jL2ZyZWUvZm9wZW4vZnJlYWQvLi4uKSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgc2luY2UgdGhlc2UgZnVuY3Rpb25zIHNob3VsZCBhbGwgYmUgZW5jYXBzdWxhdGVkICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGJ5IHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBvZiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBgZnRzeXN0ZW0uYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jZGVmaW5lIEZUX0NIQVJfQklUICAgQ0hBUl9CSVQKLSNkZWZpbmUgRlRfSU5UX01BWCAgICBJTlRfTUFYCi0jZGVmaW5lIEZUX1VJTlRfTUFYICAgVUlOVF9NQVgKLSNkZWZpbmUgRlRfVUxPTkdfTUFYICBVTE9OR19NQVgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGNoYXJhY3RlciBhbmQgc3RyaW5nIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgZnRfbWVtY2hyICAgbWVtY2hyCi0jZGVmaW5lIGZ0X21lbWNtcCAgIG1lbWNtcAotI2RlZmluZSBmdF9tZW1jcHkgICBtZW1jcHkKLSNkZWZpbmUgZnRfbWVtbW92ZSAgbWVtbW92ZQotI2RlZmluZSBmdF9tZW1zZXQgICBtZW1zZXQKLSNkZWZpbmUgZnRfc3RyY2F0ICAgc3RyY2F0Ci0jZGVmaW5lIGZ0X3N0cmNtcCAgIHN0cmNtcAotI2RlZmluZSBmdF9zdHJjcHkgICBzdHJjcHkKLSNkZWZpbmUgZnRfc3RybGVuICAgc3RybGVuCi0jZGVmaW5lIGZ0X3N0cm5jbXAgIHN0cm5jbXAKLSNkZWZpbmUgZnRfc3RybmNweSAgc3RybmNweQotI2RlZmluZSBmdF9zdHJyY2hyICBzdHJyY2hyCi0jZGVmaW5lIGZ0X3N0cnN0ciAgIHN0cnN0cgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIEZUX0ZJTEUgICAgIEZJTEUKLSNkZWZpbmUgZnRfZmNsb3NlICAgZmNsb3NlCi0jZGVmaW5lIGZ0X2ZvcGVuICAgIGZvcGVuCi0jZGVmaW5lIGZ0X2ZyZWFkICAgIGZyZWFkCi0jZGVmaW5lIGZ0X2ZzZWVrICAgIGZzZWVrCi0jZGVmaW5lIGZ0X2Z0ZWxsICAgIGZ0ZWxsCi0jZGVmaW5lIGZ0X3NwcmludGYgIHNwcmludGYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNkZWZpbmUgZnRfcXNvcnQgIHFzb3J0Ci0KLSNkZWZpbmUgZnRfZXhpdCAgIGV4aXQgICAgLyogb25seSB1c2VkIHRvIGV4aXQgZnJvbSB1bmhhbmRsZWQgZXhjZXB0aW9ucyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgZnRfc2NhbGxvYyAgIGNhbGxvYwotI2RlZmluZSBmdF9zZnJlZSAgICAgZnJlZQotI2RlZmluZSBmdF9zbWFsbG9jICAgbWFsbG9jCi0jZGVmaW5lIGZ0X3NyZWFsbG9jICByZWFsbG9jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBmdF9hdG9sICAgYXRvbAotI2RlZmluZSBmdF9sYWJzICAgbGFicwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2RlZmluZSBmdF9qbXBfYnVmICAgICBqbXBfYnVmICAvKiBub3RlOiB0aGlzIGNhbm5vdCBiZSBhIHR5cGVkZWYgc2luY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgam1wX2J1ZiBpcyBkZWZpbmVkIGFzIGEgbWFjcm8gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgIG9uIGNlcnRhaW4gcGxhdGZvcm1zICAgICAgICAgICAqLwotCi0jZGVmaW5lIGZ0X2xvbmdqbXAgICAgIGxvbmdqbXAKLSNkZWZpbmUgZnRfc2V0am1wKCBiICkgc2V0am1wKCAqKGptcF9idWYqKSAmKGIpICkgICAgLyogc2FtZSB0aGluZyBoZXJlICovCi0KLQotICAvKiB0aGUgZm9sbG93aW5nIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpLmUuLCBpZiAqLwotICAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiBvciBGVF9ERUJVR19MRVZFTF9UUkFDRSBhcmUgZGVmaW5lZCAgICAqLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLQotI2VuZGlmIC8qIF9fRlRTVERMSUJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NjlmNWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmcmVldHlwZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgaGlnaC1sZXZlbCBBUEkgYW5kIGNvbW1vbiB0eXBlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRfRlJFRVRZUEVfSAotI2Vycm9yICJgZnQyYnVpbGQuaCcgaGFzbid0IGJlZW4gaW5jbHVkZWQgeWV0ISIKLSNlcnJvciAiUGxlYXNlIGFsd2F5cyB1c2UgbWFjcm9zIHRvIGluY2x1ZGUgRnJlZVR5cGUgaGVhZGVyIGZpbGVzLiIKLSNlcnJvciAiRXhhbXBsZToiCi0jZXJyb3IgIiAgI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+IgotI2Vycm9yICIgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0giCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGByYXN0ZXInIGNvbXBvbmVudCBkdXBsaWNhdGVzIHNvbWUgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiAgICAgICAgICovCi0gIC8qIGZyZWV0eXBlLmggZm9yIHN0YW5kLWFsb25lIHVzZSBpZiBfRlJFRVRZUEVfIGlzbid0IGRlZmluZWQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZSRUVUWVBFX0hfXwotI2RlZmluZSBfX0ZSRUVUWVBFX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotI2luY2x1ZGUgRlRfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyX2FsbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VyIGFsbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIb3cgY2xpZW50IGFwcGxpY2F0aW9ucyBzaG91bGQgYWxsb2NhdGUgRnJlZVR5cGUgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBhc3N1bWVzIHRoYXQgc3RydWN0dXJlcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgYW5kIHBhc3NlZCAgKi8KLSAgLyogICAgYXMgYXJndW1lbnRzIGFyZSB6ZXJvZWQgb3V0IGV4Y2VwdCBmb3IgdGhlIGFjdHVhbCBkYXRhLiAgV2l0aCAgICAgICovCi0gIC8qICAgIG90aGVyIHdvcmRzLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGNhbGxvYycgKG9yIHZhcmlhbnRzIG9mIGl0KSAqLwotICAvKiAgICBpbnN0ZWFkIG9mIGBtYWxsb2MnIGZvciBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEIgQSBTIEkgQyAgIFQgWSBQIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2VfaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJhc2UgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZSAyIGJhc2UgZm9udCBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHB1YmxpYyBoaWdoLWxldmVsIEFQSSBvZiBGcmVlVHlwZSAyLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfVkVSVElDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1NGTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19LRVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0hJTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVFlMRV9GTEFHX0JPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19JVEFMSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFNsb3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N1YkdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19NZW1vcnlfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3Blbl9BcmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BhcmFtZXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdHRhY2hfRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXR0YWNoX1N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfQ2hhcl9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1BpeGVsX1NpemVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlcXVlc3RfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZWxlY3RfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0X1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTmFtZV9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fUEFUSE5BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9SRU5ERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX0xJTkVBUl9ERVNJR04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9OT19TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX0JJVE1BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9DUk9QX0JJVE1BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9OT19SRUNVUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfUEVEQU5USUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9NT05PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfTENEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX0xDRF9WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS2VybmluZ19Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9UcmFja19LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfR2x5cGhfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyTWFwUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2VsZWN0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfQ2hhcm1hcF9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgbWV0cmljcyBvZiBhIHNpbmdsZSBnbHlwaC4gIFRoZSAgICAgICovCi0gIC8qICAgIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbCBmb3JtYXQ7IGlmIHRoZSBmbGFnICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSBoYXMgYmVlbiB1c2VkIHdoaWxlIGxvYWRpbmcgdGhlIGdseXBoLCB2YWx1ZXMgICAgKi8KLSAgLyogICAgYXJlIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoJ3Mgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoJ3MgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUJlYXJpbmdYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgTGVmdCBzaWRlIGJlYXJpbmcgZm9yIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUJlYXJpbmdZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVG9wIHNpZGUgYmVhcmluZyBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUFkdmFuY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQWR2YW5jZSB3aWR0aCBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEJlYXJpbmdYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgTGVmdCBzaWRlIGJlYXJpbmcgZm9yIHZlcnRpY2FsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEJlYXJpbmdZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVG9wIHNpZGUgYmVhcmluZyBmb3IgdmVydGljYWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEFkdmFuY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQWR2YW5jZSBoZWlnaHQgZm9yIHZlcnRpY2FsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoX01ldHJpY3NfCi0gIHsKLSAgICBGVF9Qb3MgIHdpZHRoOwotICAgIEZUX1BvcyAgaGVpZ2h0OwotCi0gICAgRlRfUG9zICBob3JpQmVhcmluZ1g7Ci0gICAgRlRfUG9zICBob3JpQmVhcmluZ1k7Ci0gICAgRlRfUG9zICBob3JpQWR2YW5jZTsKLQotICAgIEZUX1BvcyAgdmVydEJlYXJpbmdYOwotICAgIEZUX1BvcyAgdmVydEJlYXJpbmdZOwotICAgIEZUX1BvcyAgdmVydEFkdmFuY2U7Ci0KLSAgfSBGVF9HbHlwaF9NZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgbW9kZWxzIHRoZSBtZXRyaWNzIG9mIGEgYml0bWFwIHN0cmlrZSAoaS5lLiwgYSBzZXQgICovCi0gIC8qICAgIG9mIGdseXBocyBmb3IgYSBnaXZlbiBwb2ludCBzaXplIGFuZCByZXNvbHV0aW9uKSBpbiBhIGJpdG1hcCBmb250LiAqLwotICAvKiAgICBJdCBpcyB1c2VkIGZvciB0aGUgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgQEZUX0ZhY2UuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgOjogVGhlIHZlcnRpY2FsIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdHdvICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGNvbnNlY3V0aXZlIGJhc2VsaW5lcy4gIEl0IGlzIGFsd2F5cyBwb3NpdGl2ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgOjogVGhlIGF2ZXJhZ2Ugd2lkdGgsIGluIHBpeGVscywgb2YgYWxsIGdseXBocyBpbiB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgOjogVGhlIG5vbWluYWwgc2l6ZSBvZiB0aGUgc3RyaWtlIGluIDI2LjYgZnJhY3Rpb25hbCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHBvaW50cy4gIFRoaXMgZmllbGQgaXMgbm90IHZlcnkgdXNlZnVsLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3BwZW0gOjogVGhlIGhvcml6b250YWwgcHBlbSAobm9taW5hbCB3aWR0aCkgaW4gMjYuNiBmcmFjdGlvbmFsICAgKi8KLSAgLyogICAgICAgICAgICAgIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW0gOjogVGhlIHZlcnRpY2FsIHBwZW0gKG5vbWluYWwgaGVpZ2h0KSBpbiAyNi42IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgICAgICAgICAgIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93cyBGTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG5vbWluYWwgc2l6ZSBnaXZlbiBpbiBhIEZOVCBmb250IGlzIG5vdCByZWxpYWJsZS4gIFRodXMgd2hlbiAqLwotICAvKiAgICAgIHRoZSBkcml2ZXIgZmluZHMgaXQgaW5jb3JyZWN0LCBpdCBzZXRzIGBzaXplJyB0byBzb21lIGNhbGN1bGF0ZWQgKi8KLSAgLyogICAgICB2YWx1ZXMgYW5kIHNldHMgYHhfcHBlbScgYW5kIGB5X3BwZW0nIHRvIHRoZSBwaXhlbCB3aWR0aCBhbmQgICAgICovCi0gIC8qICAgICAgaGVpZ2h0IGdpdmVuIGluIHRoZSBmb250LCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgZW1iZWRkZWQgYml0bWFwczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYHNpemUnLCBgd2lkdGgnLCBhbmQgYGhlaWdodCcgdmFsdWVzIGFyZSBub3QgY29udGFpbmVkIGluIHRoZSAgICAqLwotICAvKiAgICAgIGJpdG1hcCBzdHJpa2UgaXRzZWxmLiAgVGhleSBhcmUgY29tcHV0ZWQgZnJvbSB0aGUgZ2xvYmFsIGZvbnQgICAgKi8KLSAgLyogICAgICBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQml0bWFwX1NpemVfCi0gIHsKLSAgICBGVF9TaG9ydCAgaGVpZ2h0OwotICAgIEZUX1Nob3J0ICB3aWR0aDsKLQotICAgIEZUX1BvcyAgICBzaXplOwotCi0gICAgRlRfUG9zICAgIHhfcHBlbTsKLSAgICBGVF9Qb3MgICAgeV9wcGVtOwotCi0gIH0gRlRfQml0bWFwX1NpemU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIE8gQiBKIEUgQyBUICAgQyBMIEEgUyBTIEUgUyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICBFYWNoIGBsaWJyYXJ5JyBpcyAgICAgICAgKi8KLSAgLyogICAgY29tcGxldGVseSBpbmRlcGVuZGVudCBmcm9tIHRoZSBvdGhlcnM7IGl0IGlzIHRoZSBgcm9vdCcgb2YgYSBzZXQgICovCi0gIC8qICAgIG9mIG9iamVjdHMgbGlrZSBmb250cywgZmFjZXMsIHNpemVzLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgYWxzbyBlbWJlZHMgYSBtZW1vcnkgbWFuYWdlciAoc2VlIEBGVF9NZW1vcnkpLCBhcyB3ZWxsIGFzIGEgICAgICovCi0gIC8qICAgIHNjYW4tbGluZSBjb252ZXJ0ZXIgb2JqZWN0IChzZWUgQEZUX1Jhc3RlcikuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIG11bHRpLXRocmVhZGluZyBhcHBsaWNhdGlvbnMgZWFjaCB0aHJlYWQgc2hvdWxkIGhhdmUgaXRzIG93biAgICovCi0gIC8qICAgIEZUX0xpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpYnJhcnkgb2JqZWN0cyBhcmUgbm9ybWFsbHkgY3JlYXRlZCBieSBARlRfSW5pdF9GcmVlVHlwZSwgYW5kICAgICAqLwotICAvKiAgICBkZXN0cm95ZWQgd2l0aCBARlRfRG9uZV9GcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0xpYnJhcnlSZWNfICAqRlRfTGlicmFyeTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gRnJlZVR5cGUgbW9kdWxlIG9iamVjdC4gIEVhY2ggbW9kdWxlIGNhbiBiZSBhICAqLwotICAvKiAgICBmb250IGRyaXZlciwgYSByZW5kZXJlciwgb3IgYW55dGhpbmcgZWxzZSB0aGF0IHByb3ZpZGVzIHNlcnZpY2VzICAgKi8KLSAgLyogICAgdG8gdGhlIGZvcm1lcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9Nb2R1bGVSZWNfKiAgRlRfTW9kdWxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBGcmVlVHlwZSBmb250IGRyaXZlciBvYmplY3QuICBFYWNoIGZvbnQgZHJpdmVyICovCi0gIC8qICAgIGlzIGEgc3BlY2lhbCBtb2R1bGUgY2FwYWJsZSBvZiBjcmVhdGluZyBmYWNlcyBmcm9tIGZvbnQgZmlsZXMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfRHJpdmVyUmVjXyogIEZUX0RyaXZlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gRnJlZVR5cGUgcmVuZGVyZXIuICBBIHJlbmRlcmVyIGlzIGEgc3BlY2lhbCAgICAqLwotICAvKiAgICBtb2R1bGUgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCBpbWFnZSB0byBhIGJpdG1hcCwgd2hlbiAgICAgKi8KLSAgLyogICAgbmVjZXNzYXJ5LiAgRWFjaCByZW5kZXJlciBzdXBwb3J0cyBhIGdpdmVuIGdseXBoIGltYWdlIGZvcm1hdCwgYW5kICovCi0gIC8qICAgIG9uZSBvciBtb3JlIHRhcmdldCBzdXJmYWNlIGRlcHRocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfUmVuZGVyZXJSZWNfKiAgRlRfUmVuZGVyZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIHR5cG9ncmFwaGljIGZhY2Ugb2JqZWN0LiAgQSBmYWNlIG9iamVjdCBtb2RlbHMgKi8KLSAgLyogICAgYSBnaXZlbiB0eXBlZmFjZSwgaW4gYSBnaXZlbiBzdHlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBmYWNlIG9iamVjdCBhbHNvIG93bnMgYSBzaW5nbGUgQEZUX0dseXBoU2xvdCBvYmplY3QsIGFzIHdlbGwgICovCi0gIC8qICAgIGFzIG9uZSBvciBtb3JlIEBGVF9TaXplIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9OZXdfRmFjZSBvciBARlRfT3Blbl9GYWNlIHRvIGNyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tICovCi0gIC8qICAgIGEgZ2l2ZW4gZmlsZXBhdGhuYW1lIG9yIGEgY3VzdG9tIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9Eb25lX0ZhY2UgdG8gZGVzdHJveSBpdCAoYWxvbmcgd2l0aCBpdHMgc2xvdCBhbmQgc2l6ZXMpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEBGVF9GYWNlUmVjIGRldGFpbHMgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgZ2l2ZW4gICovCi0gIC8qICAgIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfRmFjZVJlY18qICBGVF9GYWNlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgYSBmYWNlIHNjYWxlZCB0byBhIGdpdmVuICAgICAgICovCi0gIC8qICAgIGNoYXJhY3RlciBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVhY2ggQEZUX0ZhY2UgaGFzIGFuIF9hY3RpdmVfIEBGVF9TaXplIG9iamVjdCB0aGF0IGlzIHVzZWQgYnkgICAgICAqLwotICAvKiAgICBmdW5jdGlvbnMgbGlrZSBARlRfTG9hZF9HbHlwaCB0byBkZXRlcm1pbmUgdGhlIHNjYWxpbmcgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtYXRpb24gd2hpY2ggaXMgdXNlZCB0byBsb2FkIGFuZCBoaW50IGdseXBocyBhbmQgbWV0cmljcy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHVzZSBARlRfU2V0X0NoYXJfU2l6ZSwgQEZUX1NldF9QaXhlbF9TaXplcywgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1JlcXVlc3RfU2l6ZSBvciBldmVuIEBGVF9TZWxlY3RfU2l6ZSB0byBjaGFuZ2UgdGhlIGNvbnRlbnQgICAgICovCi0gIC8qICAgIChpLmUuLCB0aGUgc2NhbGluZyB2YWx1ZXMpIG9mIHRoZSBhY3RpdmUgQEZUX1NpemUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiB1c2UgQEZUX05ld19TaXplIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNpemUgb2JqZWN0cyBmb3IgYSAgICovCi0gIC8qICAgIGdpdmVuIEBGVF9GYWNlLCBidXQgdGhleSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyB1bnRpbCAgICAqLwotICAvKiAgICB5b3UgYWN0aXZhdGUgaXQgdGhyb3VnaCBARlRfQWN0aXZhdGVfU2l6ZS4gIE9ubHkgb25lIHNpemUgY2FuIGJlICAgKi8KLSAgLyogICAgYWN0aXZhdGVkIGF0IGFueSBnaXZlbiB0aW1lIHBlciBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEBGVF9TaXplUmVjIHN0cnVjdHVyZSBkZXRhaWxzIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyAgICovCi0gIC8qICAgIG9mIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2l6ZVJlY18qICBGVF9TaXplOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBgZ2x5cGggc2xvdCcuICBBIHNsb3QgaXMgYSBjb250YWluZXIgd2hlcmUgaXQgICovCi0gIC8qICAgIGlzIHBvc3NpYmxlIHRvIGxvYWQgYW55IG9uZSBvZiB0aGUgZ2x5cGhzIGNvbnRhaW5lZCBpbiBpdHMgcGFyZW50ICAqLwotICAvKiAgICBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIG90aGVyIHdvcmRzLCBlYWNoIHRpbWUgeW91IGNhbGwgQEZUX0xvYWRfR2x5cGggb3IgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTG9hZF9DaGFyLCB0aGUgc2xvdCdzIGNvbnRlbnQgaXMgZXJhc2VkIGJ5IHRoZSBuZXcgZ2x5cGggZGF0YSwgKi8KLSAgLyogICAgaS5lLiwgdGhlIGdseXBoJ3MgbWV0cmljcywgaXRzIGltYWdlIChiaXRtYXAgb3Igb3V0bGluZSksIGFuZCAgICAgICovCi0gIC8qICAgIG90aGVyIGNvbnRyb2wgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFsc28+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9HbHlwaFNsb3RSZWMgZGV0YWlscyB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBnbHlwaCBmaWVsZHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfR2x5cGhTbG90UmVjXyogIEZUX0dseXBoU2xvdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NoYXJNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gY2hhcmFjdGVyIG1hcC4gIEEgY2hhcm1hcCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSAqLwotICAvKiAgICBjaGFyYWN0ZXIgY29kZXMgaW4gYSBnaXZlbiBlbmNvZGluZyBpbnRvIGdseXBoIGluZGV4ZXMgZm9yIGl0cyAgICAgKi8KLSAgLyogICAgcGFyZW50J3MgZmFjZS4gIFNvbWUgZm9udCBmb3JtYXRzIG1heSBwcm92aWRlIHNldmVyYWwgY2hhcm1hcHMgcGVyICovCi0gIC8qICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBmYWNlIG9iamVjdCBvd25zIHplcm8gb3IgbW9yZSBjaGFybWFwcywgYnV0IG9ubHkgb25lIG9mIHRoZW0gICovCi0gIC8qICAgIGNhbiBiZSBgYWN0aXZlJyBhbmQgdXNlZCBieSBARlRfR2V0X0NoYXJfSW5kZXggb3IgQEZUX0xvYWRfQ2hhci4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNoYXJtYXBzIGluIGEgZmFjZSBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgICovCi0gIC8qICAgIGBmYWNlLT5udW1fY2hhcm1hcHMnIGFuZCBgZmFjZS0+Y2hhcm1hcHMnIGZpZWxkcyBvZiBARlRfRmFjZVJlYy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGN1cnJlbnRseSBhY3RpdmUgY2hhcm1hcCBpcyBhdmFpbGFibGUgYXMgYGZhY2UtPmNoYXJtYXAnLiAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgY2FsbCBARlRfU2V0X0NoYXJtYXAgdG8gY2hhbmdlIGl0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gYSBuZXcgZmFjZSBpcyBjcmVhdGVkIChlaXRoZXIgdGhyb3VnaCBARlRfTmV3X0ZhY2Ugb3IgICAgICAgICAqLwotICAvKiAgICBARlRfT3Blbl9GYWNlKSwgdGhlIGxpYnJhcnkgbG9va3MgZm9yIGEgVW5pY29kZSBjaGFybWFwIHdpdGhpbiAgICAgKi8KLSAgLyogICAgdGhlIGxpc3QgYW5kIGF1dG9tYXRpY2FsbHkgYWN0aXZhdGVzIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEBGVF9DaGFyTWFwUmVjIGRldGFpbHMgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgICAgICovCi0gIC8qICAgIGdpdmVuIGNoYXJhY3RlciBtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfQ2hhck1hcFJlY18qICBGVF9DaGFyTWFwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBtYWNybyBjb252ZXJ0cyBmb3VyLWxldHRlciB0YWdzIGludG8gYW4gdW5zaWduZWQgbG9uZy4gIEl0IGlzICovCi0gIC8qICAgIHVzZWQgdG8gZGVmaW5lIGBlbmNvZGluZycgaWRlbnRpZmllcnMgKHNlZSBARlRfRW5jb2RpbmcpLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIG1hbnkgMTZiaXQgY29tcGlsZXJzIGRvbid0IGxpa2UgMzJiaXQgZW51bWVyYXRpb25zLCB5b3UgICAgICAqLwotICAvKiAgICBzaG91bGQgcmVkZWZpbmUgdGhpcyBtYWNybyBpbiBjYXNlIG9mIHByb2JsZW1zIHRvIHNvbWV0aGluZyBsaWtlICAgKi8KLSAgLyogICAgdGhpczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjZGVmaW5lIEZUX0VOQ19UQUcoIHZhbHVlLCBhLCBiLCBjLCBkICkgIHZhbHVlICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gZ2V0IGEgc2ltcGxlIGVudW1lcmF0aW9uIHdpdGhvdXQgYXNzaWduaW5nIHNwZWNpYWwgbnVtYmVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIEZUX0VOQ19UQUcKLSNkZWZpbmUgRlRfRU5DX1RBRyggdmFsdWUsIGEsIGIsIGMsIGQgKSAgICAgICAgIFwKLSAgICAgICAgICB2YWx1ZSA9ICggKCAoRlRfVUludDMyKShhKSA8PCAyNCApIHwgIFwKLSAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUludDMyKShiKSA8PCAxNiApIHwgIFwKLSAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUludDMyKShjKSA8PCAgOCApIHwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludDMyKShkKSAgICAgICAgICkKLQotI2VuZGlmIC8qIEZUX0VOQ19UQUcgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHVzZWQgdG8gc3BlY2lmeSBjaGFyYWN0ZXIgc2V0cyBzdXBwb3J0ZWQgYnkgICAgICAgICAqLwotICAvKiAgICBjaGFybWFwcy4gIFVzZWQgaW4gdGhlIEBGVF9TZWxlY3RfQ2hhcm1hcCBBUEkgZnVuY3Rpb24uICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXNwaXRlIHRoZSBuYW1lLCB0aGlzIGVudW1lcmF0aW9uIGxpc3RzIHNwZWNpZmljIGNoYXJhY3RlciAgICAgICAgKi8KLSAgLyogICAgcmVwZXJ0b3JpZXMgKGkuZS4sIGNoYXJzZXRzKSwgYW5kIG5vdCB0ZXh0IGVuY29kaW5nIG1ldGhvZHMgKGUuZy4sICovCi0gIC8qICAgIFVURi04LCBVVEYtMTYsIEdCMjMxMl9FVUMsIGV0Yy4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmVjYXVzZSBvZiAzMi1iaXQgY2hhcmNvZGVzIGRlZmluZWQgaW4gVW5pY29kZSAoaS5lLiwgc3Vycm9nYXRlcyksICovCi0gIC8qICAgIGFsbCBjaGFyYWN0ZXIgY29kZXMgbXVzdCBiZSBleHByZXNzZWQgYXMgRlRfTG9uZ3MuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3RoZXIgZW5jb2RpbmdzIG1pZ2h0IGJlIGRlZmluZWQgaW4gdGhlIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FTkNPRElOR19OT05FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUaGUgZW5jb2RpbmcgdmFsdWUgMCBpcyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FTkNPRElOR19VTklDT0RFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBDb3JyZXNwb25kcyB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgc2V0LiAgVGhpcyB2YWx1ZSBjb3ZlcnMgICAgICAqLwotICAvKiAgICAgYWxsIHZlcnNpb25zIG9mIHRoZSBVbmljb2RlIHJlcGVydG9pcmUsIGluY2x1ZGluZyBBU0NJSSBhbmQgICAgICAgKi8KLSAgLyogICAgIExhdGluLTEuICBNb3N0IGZvbnRzIGluY2x1ZGUgYSBVbmljb2RlIGNoYXJtYXAsIGJ1dCBub3QgYWxsICAgICAgICovCi0gIC8qICAgICBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FTkNPRElOR19NU19TWU1CT0wgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBDb3JyZXNwb25kcyB0byB0aGUgTWljcm9zb2Z0IFN5bWJvbCBlbmNvZGluZywgdXNlZCB0byBlbmNvZGUgICAgICAqLwotICAvKiAgICAgbWF0aGVtYXRpY2FsIHN5bWJvbHMgaW4gdGhlIDMyLi4yNTUgY2hhcmFjdGVyIGNvZGUgcmFuZ2UuICBGb3IgICAgKi8KLSAgLyogICAgIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBgaHR0cDovL3d3dy5jZXZpei5uZXQvc3ltYm9sLmh0bScuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VOQ09ESU5HX1NKSVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIENvcnJlc3BvbmRzIHRvIEphcGFuZXNlIFNKSVMgZW5jb2RpbmcuICBNb3JlIGluZm8gYXQgICAgICAgICAgICAgICovCi0gIC8qICAgICBhdCBgaHR0cDovL2xhbmdzdXBwb3J0LmphcGFucmVmZXJlbmNlLmNvbS9lbmNvZGluZy5zaHRtbCcuICAgICAgICAqLwotICAvKiAgICAgU2VlIG5vdGUgb24gbXVsdGktYnl0ZSBlbmNvZGluZ3MgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfR0IyMzEyIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQ29ycmVzcG9uZHMgdG8gYW4gZW5jb2Rpbmcgc3lzdGVtIGZvciBTaW1wbGlmaWVkIENoaW5lc2UgYXMgdXNlZCAgKi8KLSAgLyogICAgIHVzZWQgaW4gbWFpbmxhbmQgQ2hpbmEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VOQ09ESU5HX0JJRzUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIENvcnJlc3BvbmRzIHRvIGFuIGVuY29kaW5nIHN5c3RlbSBmb3IgVHJhZGl0aW9uYWwgQ2hpbmVzZSBhcyB1c2VkICovCi0gIC8qICAgICBpbiBUYWl3YW4gYW5kIEhvbmcgS29uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FTkNPRElOR19XQU5TVU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBDb3JyZXNwb25kcyB0byB0aGUgS29yZWFuIGVuY29kaW5nIHN5c3RlbSBrbm93biBhcyBXYW5zdW5nLiAgICAgICAqLwotICAvKiAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS91bmljb2RlLzk0OS50eHQnLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VOQ09ESU5HX0pPSEFCIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoZSBLb3JlYW4gc3RhbmRhcmQgY2hhcmFjdGVyIHNldCAoS1MgQy01NjAxLTE5OTIpLCB3aGljaCAgICAgICAgICovCi0gIC8qICAgICBjb3JyZXNwb25kcyB0byBNUyBXaW5kb3dzIGNvZGUgcGFnZSAxMzYxLiAgVGhpcyBjaGFyYWN0ZXIgc2V0ICAgICAqLwotICAvKiAgICAgaW5jbHVkZXMgYWxsIHBvc3NpYmxlIEhhbmdldWwgY2hhcmFjdGVyIGNvbWJpbmF0aW9ucy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQ29ycmVzcG9uZHMgdG8gYSBMYXRpbi0xIGVuY29kaW5nIGFzIGRlZmluZWQgaW4gYSBUeXBlIDEgICAgICAgICAgKi8KLSAgLyogICAgIFBvc3RzY3JpcHQgZm9udC4gIEl0IGlzIGxpbWl0ZWQgdG8gMjU2IGNoYXJhY3RlciBjb2Rlcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIENvcnJlc3BvbmRzIHRvIHRoZSBBZG9iZSBTdGFuZGFyZCBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZSAxLCAgICovCi0gIC8qICAgICBDRkYsIGFuZCBPcGVuVHlwZS9DRkYgZm9udHMuICBJdCBpcyBsaW1pdGVkIHRvIDI1NiBjaGFyYWN0ZXIgICAgICAqLwotICAvKiAgICAgY29kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIEFkb2JlIEV4cGVydCBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZSAxLCAgICAgKi8KLSAgLyogICAgIENGRiwgYW5kIE9wZW5UeXBlL0NGRiBmb250cy4gIEl0IGlzIGxpbWl0ZWQgdG8gMjU2IGNoYXJhY3RlciAgICAgICovCi0gIC8qICAgICBjb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FTkNPRElOR19BRE9CRV9DVVNUT00gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBDb3JyZXNwb25kcyB0byBhIGN1c3RvbSBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZSAxLCBDRkYsIGFuZCAgICAqLwotICAvKiAgICAgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIDgtYml0IEFwcGxlIHJvbWFuIGVuY29kaW5nLiAgTWFueSBUcnVlVHlwZSBhbmQgKi8KLSAgLyogICAgIE9wZW5UeXBlIGZvbnRzIGNvbnRhaW4gYSBjaGFybWFwIGZvciB0aGlzIGVuY29kaW5nLCBzaW5jZSBvbGRlciAgICovCi0gIC8qICAgICB2ZXJzaW9ucyBvZiBNYWMgT1MgYXJlIGFibGUgdG8gdXNlIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FTkNPRElOR19PTERfTEFUSU5fMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUaGlzIHZhbHVlIGlzIGRlcHJlY2F0ZWQgYW5kIHdhcyBuZXZlciB1c2VkIG5vciByZXBvcnRlZCBieSAgICAgICAqLwotICAvKiAgICAgRnJlZVR5cGUuICBEb24ndCB1c2Ugb3IgdGVzdCBmb3IgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfTVNfU0pJUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19TSklTLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfTVNfR0IyMzEyIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19HQjIzMTIuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfTVNfQklHNSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19CSUc1LiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfTVNfV0FOU1VORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19XQU5TVU5HLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfTVNfSk9IQUIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19KT0hBQi4gIERlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIGF1dG9tYXRpY2FsbHkgc3ludGhldGl6ZXMgYSBVbmljb2RlIGNoYXJtYXAgICAgKi8KLSAgLyogICBmb3IgUG9zdHNjcmlwdCBmb250cywgdXNpbmcgdGhlaXIgZ2x5cGggbmFtZXMgZGljdGlvbmFyaWVzLiAgICAgICAgICovCi0gIC8qICAgSG93ZXZlciwgaXQgYWxzbyByZXBvcnRzIHRoZSBlbmNvZGluZ3MgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSAgICAqLwotICAvKiAgIGZvbnQgZmlsZSwgZm9yIHRoZSBjYXNlcyB3aGVuIHRoZXkgYXJlIG5lZWRlZCwgd2l0aCB0aGUgQWRvYmUgICAgICAgKi8KLSAgLyogICB2YWx1ZXMgYXMgd2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VOQ09ESU5HX05PTkUgaXMgc2V0IGJ5IHRoZSBCREYgYW5kIFBDRiBkcml2ZXJzIGlmIHRoZSBjaGFybWFwICAgKi8KLSAgLyogICBpcyBuZWl0aGVyIFVuaWNvZGUgbm9yIElTTy04ODU5LTEgKG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfVU5JQ09ERSkuICBVc2UgQEZUX0dldF9CREZfQ2hhcnNldF9JRCB0byBmaW5kIG91dCB3aGljaCAqLwotICAvKiAgIGVuY29kaW5nIGlzIHJlYWxseSBwcmVzZW50LiAgSWYsIGZvciBleGFtcGxlLCB0aGUgYGNzX3JlZ2lzdHJ5JyAgICAgKi8KLSAgLyogICBmaWVsZCBpcyBgS09JOCcgYW5kIHRoZSBgY3NfZW5jb2RpbmcnIGZpZWxkIGlzIGBSJywgdGhlIGZvbnQgaXMgICAgICovCi0gIC8qICAgZW5jb2RlZCBpbiBLT0k4LVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FTkNPRElOR19OT05FIGlzIGFsd2F5cyBzZXQgKHdpdGggYSBzaW5nbGUgZXhjZXB0aW9uKSBieSB0aGUgICAgICovCi0gIC8qICAgd2luZm9udHMgZHJpdmVyLiAgVXNlIEBGVF9HZXRfV2luRk5UX0hlYWRlciBhbmQgZXhhbWluZSB0aGUgICAgICAgICAqLwotICAvKiAgIGBjaGFyc2V0JyBmaWVsZCBvZiB0aGUgQEZUX1dpbkZOVF9IZWFkZXJSZWMgc3RydWN0dXJlIHRvIGZpbmQgb3V0ICAgKi8KLSAgLyogICB3aGljaCBlbmNvZGluZyBpcyByZWFsbHkgcHJlc2VudC4gIEZvciBleGFtcGxlLCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQEZUX1dpbkZOVF9JRF9DUDEyNTEgKDIwNCkgbWVhbnMgV2luZG93cyBjb2RlIHBhZ2UgMTI1MSAoZm9yICAgICAgICAqLwotICAvKiAgIFJ1c3NpYW4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRU5DT0RJTkdfTk9ORSBpcyBzZXQgaWYgYHBsYXRmb3JtX2lkJyBpcyBAVFRfUExBVEZPUk1fTUFDSU5UT1NIICAqLwotICAvKiAgIGFuZCBgZW5jb2RpbmdfaWQnIGlzIG5vdCBAVFRfTUFDX0lEX1JPTUFOIChvdGhlcndpc2UgaXQgaXMgc2V0IHRvICAgKi8KLSAgLyogICBGVF9FTkNPRElOR19BUFBMRV9ST01BTikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIElmIGBwbGF0Zm9ybV9pZCcgaXMgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwgdXNlIHRoZSBmdW5jdGlvbiAgYyAgICAgKi8KLSAgLyogICBARlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgIHRvIHF1ZXJ5IHRoZSBNYWMgbGFuZ3VhZ2UgSUQgd2hpY2ggbWF5IGJlICovCi0gIC8qICAgbmVlZGVkIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggQXBwbGUgZW5jb2RpbmcgdmFyaWFudHMuICBTZWUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvUkVBRE1FLlRYVCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHRvIGdldCBhbiBpZGVhIGhvdyB0byBkbyB0aGF0LiAgQmFzaWNhbGx5LCBpZiB0aGUgbGFuZ3VhZ2UgSUQgaXMgMCwgKi8KLSAgLyogICBkb24ndCB1c2UgaXQsIG90aGVyd2lzZSBzdWJ0cmFjdCAxIGZyb20gdGhlIGxhbmd1YWdlIElELiAgVGhlbiAgICAgICovCi0gIC8qICAgZXhhbWluZSBgZW5jb2RpbmdfaWQnLiAgSWYsIGZvciBleGFtcGxlLCBgZW5jb2RpbmdfaWQnIGlzICAgICAgICAgICAqLwotICAvKiAgIEBUVF9NQUNfSURfUk9NQU4gYW5kIHRoZSBsYW5ndWFnZSBJRCAobWludXMgMSkgaXMgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBgVFRfTUFDX0xBTkdJRF9HUkVFSycsIGl0IGlzIHRoZSBHcmVlayBlbmNvZGluZywgbm90IFJvbWFuLiAgICAgICAgICovCi0gIC8qICAgQFRUX01BQ19JRF9BUkFCSUMgd2l0aCBgVFRfTUFDX0xBTkdJRF9GQVJTSScgbWVhbnMgdGhlIEZhcnNpICAgICAgICAqLwotICAvKiAgIHZhcmlhbnQgdGhlIEFyYWJpYyBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfRW5jb2RpbmdfCi0gIHsKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19OT05FLCAwLCAwLCAwLCAwICksCi0KLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19NU19TWU1CT0wsICdzJywgJ3knLCAnbScsICdiJyApLAotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX1VOSUNPREUsICAgJ3UnLCAnbicsICdpJywgJ2MnICksCi0KLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19TSklTLCAgICAncycsICdqJywgJ2knLCAncycgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19HQjIzMTIsICAnZycsICdiJywgJyAnLCAnICcgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19CSUc1LCAgICAnYicsICdpJywgJ2cnLCAnNScgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19XQU5TVU5HLCAndycsICdhJywgJ24nLCAncycgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19KT0hBQiwgICAnaicsICdvJywgJ2gnLCAnYScgKSwKLQotICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwotICAgIEZUX0VOQ09ESU5HX01TX1NKSVMgICAgPSBGVF9FTkNPRElOR19TSklTLAotICAgIEZUX0VOQ09ESU5HX01TX0dCMjMxMiAgPSBGVF9FTkNPRElOR19HQjIzMTIsCi0gICAgRlRfRU5DT0RJTkdfTVNfQklHNSAgICA9IEZUX0VOQ09ESU5HX0JJRzUsCi0gICAgRlRfRU5DT0RJTkdfTVNfV0FOU1VORyA9IEZUX0VOQ09ESU5HX1dBTlNVTkcsCi0gICAgRlRfRU5DT0RJTkdfTVNfSk9IQUIgICA9IEZUX0VOQ09ESU5HX0pPSEFCLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQsICdBJywgJ0QnLCAnTycsICdCJyApLAotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVCwgICAnQScsICdEJywgJ0InLCAnRScgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BRE9CRV9DVVNUT00sICAgJ0EnLCAnRCcsICdCJywgJ0MnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMSwgICdsJywgJ2EnLCAndCcsICcxJyApLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfT0xEX0xBVElOXzIsICdsJywgJ2EnLCAndCcsICcyJyApLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4sICdhJywgJ3InLCAnbScsICduJyApCi0KLSAgfSBGVF9FbmNvZGluZzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2VuY29kaW5nX3h4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nIEBGVF9FbmNvZGluZyAqLwotICAvKiAgICB2YWx1ZXMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X2VuY29kaW5nX25vbmUgICAgICAgICAgICBGVF9FTkNPRElOR19OT05FCi0jZGVmaW5lIGZ0X2VuY29kaW5nX3VuaWNvZGUgICAgICAgICBGVF9FTkNPRElOR19VTklDT0RFCi0jZGVmaW5lIGZ0X2VuY29kaW5nX3N5bWJvbCAgICAgICAgICBGVF9FTkNPRElOR19NU19TWU1CT0wKLSNkZWZpbmUgZnRfZW5jb2RpbmdfbGF0aW5fMSAgICAgICAgIEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzEKLSNkZWZpbmUgZnRfZW5jb2RpbmdfbGF0aW5fMiAgICAgICAgIEZUX0VOQ09ESU5HX09MRF9MQVRJTl8yCi0jZGVmaW5lIGZ0X2VuY29kaW5nX3NqaXMgICAgICAgICAgICBGVF9FTkNPRElOR19TSklTCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2diMjMxMiAgICAgICAgICBGVF9FTkNPRElOR19HQjIzMTIKLSNkZWZpbmUgZnRfZW5jb2RpbmdfYmlnNSAgICAgICAgICAgIEZUX0VOQ09ESU5HX0JJRzUKLSNkZWZpbmUgZnRfZW5jb2Rpbmdfd2Fuc3VuZyAgICAgICAgIEZUX0VOQ09ESU5HX1dBTlNVTkcKLSNkZWZpbmUgZnRfZW5jb2Rpbmdfam9oYWIgICAgICAgICAgIEZUX0VOQ09ESU5HX0pPSEFCCi0KLSNkZWZpbmUgZnRfZW5jb2RpbmdfYWRvYmVfc3RhbmRhcmQgIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJECi0jZGVmaW5lIGZ0X2VuY29kaW5nX2Fkb2JlX2V4cGVydCAgICBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQKLSNkZWZpbmUgZnRfZW5jb2RpbmdfYWRvYmVfY3VzdG9tICAgIEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTQotI2RlZmluZSBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiAgICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NoYXJNYXBSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBiYXNlIGNoYXJtYXAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW5jb2RpbmcgICAgOjogQW4gQEZUX0VuY29kaW5nIHRhZyBpZGVudGlmeWluZyB0aGUgY2hhcm1hcC4gIFVzZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoaXMgd2l0aCBARlRfU2VsZWN0X0NoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGxhdGZvcm1faWQgOjogQW4gSUQgbnVtYmVyIGRlc2NyaWJpbmcgdGhlIHBsYXRmb3JtIGZvciB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBlbmNvZGluZyBJRC4gIFRoaXMgY29tZXMgZGlyZWN0bHkgZnJvbSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBhbmQgc2hvdWxkIGJlIGVtdWxhdGVkICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9yIG90aGVyIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZ19pZCA6OiBBIHBsYXRmb3JtIHNwZWNpZmljIGVuY29kaW5nIG51bWJlci4gIFRoaXMgYWxzbyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY29tZXMgZnJvbSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBhbmQgc2hvdWxkIGJlICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGVtdWxhdGVkIHNpbWlsYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0NoYXJNYXBSZWNfCi0gIHsKLSAgICBGVF9GYWNlICAgICAgZmFjZTsKLSAgICBGVF9FbmNvZGluZyAgZW5jb2Rpbmc7Ci0gICAgRlRfVVNob3J0ICAgIHBsYXRmb3JtX2lkOwotICAgIEZUX1VTaG9ydCAgICBlbmNvZGluZ19pZDsKLQotICB9IEZUX0NoYXJNYXBSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgQiBBIFMgRSAgIE8gQiBKIEUgQyBUICAgQyBMIEEgUyBTIEUgUyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX0ZhY2VfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSwgdXNlZCB0byAgICAqLwotICAvKiAgICBtb2RlbCBwcml2YXRlIGRhdGEgb2YgYSBnaXZlbiBARlRfRmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIG1pZ2h0IGNoYW5nZSBiZXR3ZWVuIHJlbGVhc2VzIG9mIEZyZWVUeXBlIDIgYW5kIGlzICAqLwotICAvKiAgICBub3QgZ2VuZXJhbGx5IGF2YWlsYWJsZSB0byBjbGllbnQgYXBwbGljYXRpb25zLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0ZhY2VfSW50ZXJuYWxSZWNfKiAgRlRfRmFjZV9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3QgZmFjZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIGZhY2Ugb2JqZWN0IG1vZGVscyBhICAgICAgICAqLwotICAvKiAgICB0eXBlZmFjZSBpbiBhIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZmFjZXMgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZmFjZXMgaW4gdGhlIGZvbnQgZmlsZS4gIFNvbWUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZvcm1hdHMgY2FuIGhhdmUgbXVsdGlwbGUgZmFjZXMgaW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCAgICAgICAgICA6OiBUaGUgaW5kZXggb2YgdGhlIGZhY2UgaW4gdGhlIGZvbnQgZmlsZS4gIEl0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0IHRvIDAgaWYgdGhlcmUgaXMgb25seSBvbmUgZmFjZSBpbiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfZmxhZ3MgICAgICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHRoYXQgZ2l2ZSBpbXBvcnRhbnQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWNlOyBzZWUgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfRkFDRV9GTEFHX1hYWCBmb3IgdGhlIGRldGFpbHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHlsZV9mbGFncyAgICAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIHRoZSBzdHlsZSBvZiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmFjZTsgc2VlIEBGVF9TVFlMRV9GTEFHX1hYWCBmb3IgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2dseXBocyAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZmFjZS4gIElmIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSBpcyBzY2FsYWJsZSBhbmQgaGFzIHNiaXRzIChzZWUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBudW1fZml4ZWRfc2l6ZXMnKSwgaXQgaXMgc2V0IHRvIHRoZSBudW1iZXIgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBvdXRsaW5lIGdseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYW1pbHlfbmFtZSAgICAgICAgIDo6IFRoZSBmYWNlJ3MgZmFtaWx5IG5hbWUuICBUaGlzIGlzIGFuIEFTQ0lJICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIHVzdWFsbHkgaW4gRW5nbGlzaCwgd2hpY2ggZGVzY3JpYmVzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGVmYWNlJ3MgZmFtaWx5IChsaWtlIGBUaW1lcyBOZXcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbWFuJywgYEJvZG9uaScsIGBHYXJhbW9uZCcsIGV0YykuICBUaGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIGxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciB1c2VkIHRvIGxpc3QgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHMuICBTb21lIGZvcm1hdHMgKFRydWVUeXBlICYgT3BlblR5cGUpICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGUgbG9jYWxpemVkIGFuZCBVbmljb2RlIHZlcnNpb25zIG9mICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0cmluZy4gIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IHNwZWNpZmljIGludGVyZmFjZSB0byBhY2Nlc3MgdGhlbS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBOVUxMIChlLmcuLCBpbiBmb250cyBlbWJlZGRlZCBpbiBhICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBQREYgZmlsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHlsZV9uYW1lICAgICAgICAgIDo6IFRoZSBmYWNlJ3Mgc3R5bGUgbmFtZS4gIFRoaXMgaXMgYW4gQVNDSUkgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIHVzdWFsbHkgaW4gRW5nbGlzaCwgd2hpY2ggZGVzY3JpYmVzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGVmYWNlJ3Mgc3R5bGUgKGxpa2UgYEl0YWxpYycsICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCb2xkJywgYENvbmRlbnNlZCcsIGV0YykuICBOb3QgYWxsIGZvbnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzIHByb3ZpZGUgYSBzdHlsZSBuYW1lLCBzbyB0aGlzIGZpZWxkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgb3B0aW9uYWwsIGFuZCBjYW4gYmUgc2V0IHRvIE5VTEwuICBBcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBgZmFtaWx5X25hbWUnLCBzb21lIGZvcm1hdHMgcHJvdmlkZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGl6ZWQgYW5kIFVuaWNvZGUgdmVyc2lvbnMgb2YgdGhpcyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLiAgQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIGZvcm1hdCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGludGVyZmFjZSB0byBhY2Nlc3MgdGhlbS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9maXhlZF9zaXplcyAgICAgOjogVGhlIG51bWJlciBvZiBiaXRtYXAgc3RyaWtlcyBpbiB0aGUgZmFjZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW4gaWYgdGhlIGZhY2UgaXMgc2NhbGFibGUsIHRoZXJlIG1pZ2h0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCBiZSBiaXRtYXAgc3RyaWtlcywgd2hpY2ggYXJlIGNhbGxlZCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYHNiaXRzJyBpbiB0aGF0IGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXZhaWxhYmxlX3NpemVzICAgICA6OiBBbiBhcnJheSBvZiBARlRfQml0bWFwX1NpemUgZm9yIGFsbCBiaXRtYXAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlcyBpbiB0aGUgZmFjZS4gIEl0IGlzIHNldCB0byBOVUxMIGlmICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGJpdG1hcCBzdHJpa2UuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jaGFybWFwcyAgICAgICAgOjogVGhlIG51bWJlciBvZiBjaGFybWFwcyBpbiB0aGUgZmFjZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcHMgICAgICAgICAgICA6OiBBbiBhcnJheSBvZiB0aGUgY2hhcm1hcHMgb2YgdGhlIGZhY2UuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZW5lcmljICAgICAgICAgICAgIDo6IEEgZmllbGQgcmVzZXJ2ZWQgZm9yIGNsaWVudCB1c2VzLiAgU2VlIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR2VuZXJpYyB0eXBlIGRlc2NyaXB0aW9uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYm94ICAgICAgICAgICAgICAgIDo6IFRoZSBmb250IGJvdW5kaW5nIGJveC4gIENvb3JkaW5hdGVzIGFyZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cyAoc2VlICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYHVuaXRzX3Blcl9FTScpLiAgVGhlIGJveCBpcyBsYXJnZSBlbm91Z2ggICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvbnRhaW4gYW55IGdseXBoIGZyb20gdGhlIGZvbnQuICBUaHVzLCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYmJveC55TWF4JyBjYW4gYmUgc2VlbiBhcyB0aGUgYG1heGltYWwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjZW5kZXInLCBhbmQgYGJib3gueU1pbicgYXMgdGhlIGBtaW5pbWFsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRlcicuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1bml0c19wZXJfRU0gICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZm9udCB1bml0cyBwZXIgRU0gc3F1YXJlIGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZhY2UuICBUaGlzIGlzIHR5cGljYWxseSAyMDQ4IGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgZm9udHMsIGFuZCAxMDAwIGZvciBUeXBlIDEgZm9udHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzY2VuZGVyICAgICAgICAgICAgOjogVGhlIHR5cG9ncmFwaGljIGFzY2VuZGVyIG9mIHRoZSBmYWNlLCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzLiAgRm9yIGZvbnQgZm9ybWF0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaGF2aW5nIHRoaXMgaW5mb3JtYXRpb24sIGl0IGlzIHNldCB0byAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJib3gueU1heCcuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc2NlbmRlciAgICAgICAgICAgOjogVGhlIHR5cG9ncmFwaGljIGRlc2NlbmRlciBvZiB0aGUgZmFjZSwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzLiAgRm9yIGZvbnQgZm9ybWF0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaGF2aW5nIHRoaXMgaW5mb3JtYXRpb24sIGl0IGlzIHNldCB0byAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJib3gueU1pbicuICBOb3RlIHRoYXQgdGhpcyBmaWVsZCBpcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzdWFsbHkgbmVnYXRpdmUuICBPbmx5IHJlbGV2YW50IGZvciAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgICAgICAgICAgIDo6IFRoZSBoZWlnaHQgaXMgdGhlIHZlcnRpY2FsIGRpc3RhbmNlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBiYXNlbGluZXMsICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBJdCBpcyBhbHdheXMgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfYWR2YW5jZV93aWR0aCAgIDo6IFRoZSBtYXhpbWFsIGFkdmFuY2Ugd2lkdGgsIGluIGZvbnQgdW5pdHMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWxsIGdseXBocyBpbiB0aGlzIGZhY2UuICBUaGlzIGNhbiBiZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBtYWtlIHdvcmQgd3JhcHBpbmcgY29tcHV0YXRpb25zICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3Rlci4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfYWR2YW5jZV9oZWlnaHQgIDo6IFRoZSBtYXhpbWFsIGFkdmFuY2UgaGVpZ2h0LCBpbiBmb250IHVuaXRzLCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWxsIGdseXBocyBpbiB0aGlzIGZhY2UuICBUaGlzIGlzIG9ubHkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgZm9yIHZlcnRpY2FsIGxheW91dHMsIGFuZCBpcyBzZXQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGBoZWlnaHQnIGZvciBmb250cyB0aGF0IGRvIG5vdCBwcm92aWRlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBtZXRyaWNzLiAgT25seSByZWxldmFudCBmb3IgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdW5kZXJsaW5lX3Bvc2l0aW9uICA6OiBUaGUgcG9zaXRpb24sIGluIGZvbnQgdW5pdHMsIG9mIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lIGxpbmUgZm9yIHRoaXMgZmFjZS4gIEl0J3MgdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciBvZiB0aGUgdW5kZXJsaW5pbmcgc3RlbS4gIE9ubHkgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1bmRlcmxpbmVfdGhpY2tuZXNzIDo6IFRoZSB0aGlja25lc3MsIGluIGZvbnQgdW5pdHMsIG9mIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmUgZm9yIHRoaXMgZmFjZS4gIE9ubHkgcmVsZXZhbnQgZm9yICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIGFzc29jaWF0ZWQgZ2x5cGggc2xvdChzKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICAgICAgICAgIDo6IFRoZSBjdXJyZW50IGFjdGl2ZSBzaXplIGZvciB0aGlzIGZhY2UuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgICAgICAgICAgICAgOjogVGhlIGN1cnJlbnQgYWN0aXZlIGNoYXJtYXAgZm9yIHRoaXMgZmFjZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRmllbGRzIG1heSBiZSBjaGFuZ2VkIGFmdGVyIGEgY2FsbCB0byBARlRfQXR0YWNoX0ZpbGUgb3IgICAgICAgICAgICAqLwotICAvKiAgIEBGVF9BdHRhY2hfU3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9GYWNlUmVjXwotICB7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgbnVtX2ZhY2VzOwotICAgIEZUX0xvbmcgICAgICAgICAgIGZhY2VfaW5kZXg7Ci0KLSAgICBGVF9Mb25nICAgICAgICAgICBmYWNlX2ZsYWdzOwotICAgIEZUX0xvbmcgICAgICAgICAgIHN0eWxlX2ZsYWdzOwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgbnVtX2dseXBoczsKLQotICAgIEZUX1N0cmluZyogICAgICAgIGZhbWlseV9uYW1lOwotICAgIEZUX1N0cmluZyogICAgICAgIHN0eWxlX25hbWU7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICBudW1fZml4ZWRfc2l6ZXM7Ci0gICAgRlRfQml0bWFwX1NpemUqICAgYXZhaWxhYmxlX3NpemVzOwotCi0gICAgRlRfSW50ICAgICAgICAgICAgbnVtX2NoYXJtYXBzOwotICAgIEZUX0NoYXJNYXAqICAgICAgIGNoYXJtYXBzOwotCi0gICAgRlRfR2VuZXJpYyAgICAgICAgZ2VuZXJpYzsKLQotICAgIC8qIyBUaGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMgKGRvd24gdG8gYHVuZGVybGluZV90aGlja25lc3MnKSAqLwotICAgIC8qIyBhcmUgb25seSByZWxldmFudCB0byBzY2FsYWJsZSBvdXRsaW5lczsgY2YuIEBGVF9CaXRtYXBfU2l6ZSAgICAqLwotICAgIC8qIyBmb3IgYml0bWFwIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0JCb3ggICAgICAgICAgIGJib3g7Ci0KLSAgICBGVF9VU2hvcnQgICAgICAgICB1bml0c19wZXJfRU07Ci0gICAgRlRfU2hvcnQgICAgICAgICAgYXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICAgICAgICAgZGVzY2VuZGVyOwotICAgIEZUX1Nob3J0ICAgICAgICAgIGhlaWdodDsKLQotICAgIEZUX1Nob3J0ICAgICAgICAgIG1heF9hZHZhbmNlX3dpZHRoOwotICAgIEZUX1Nob3J0ICAgICAgICAgIG1heF9hZHZhbmNlX2hlaWdodDsKLQotICAgIEZUX1Nob3J0ICAgICAgICAgIHVuZGVybGluZV9wb3NpdGlvbjsKLSAgICBGVF9TaG9ydCAgICAgICAgICB1bmRlcmxpbmVfdGhpY2tuZXNzOwotCi0gICAgRlRfR2x5cGhTbG90ICAgICAgZ2x5cGg7Ci0gICAgRlRfU2l6ZSAgICAgICAgICAgc2l6ZTsKLSAgICBGVF9DaGFyTWFwICAgICAgICBjaGFybWFwOwotCi0gICAgLypAcHJpdmF0ZSBiZWdpbiAqLwotCi0gICAgRlRfRHJpdmVyICAgICAgICAgZHJpdmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW07Ci0KLSAgICBGVF9MaXN0UmVjICAgICAgICBzaXplc19saXN0OwotCi0gICAgRlRfR2VuZXJpYyAgICAgICAgYXV0b2hpbnQ7Ci0gICAgdm9pZCogICAgICAgICAgICAgZXh0ZW5zaW9uczsKLQotICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsOwotCi0gICAgLypAcHJpdmF0ZSBlbmQgKi8KLQotICB9IEZUX0ZhY2VSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0IGZsYWdzIHVzZWQgaW4gdGhlIGBmYWNlX2ZsYWdzJyBmaWVsZCBvZiB0aGUgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLiAgVGhleSBpbmZvcm0gY2xpZW50IGFwcGxpY2F0aW9ucyBvZiAgICAgICAgICovCi0gIC8qICAgIHByb3BlcnRpZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIG91dGxpbmUgZ2x5cGhzLiAgVGhpcyBkb2Vzbid0ICAgKi8KLSAgLyogICAgICBwcmV2ZW50IGJpdG1hcCBzdHJpa2VzLCBpLmUuLCBhIGZhY2UgY2FuIGhhdmUgYm90aCB0aGlzIGFuZCAgICAgICovCi0gIC8qICAgICAgYW5kIEBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgY29udGFpbnMgYml0bWFwIHN0cmlrZXMuICBTZWUgYWxzbyB0aGUgICAqLwotICAvKiAgICAgIGBudW1fZml4ZWRfc2l6ZXMnIGFuZCBgYXZhaWxhYmxlX3NpemVzJyBmaWVsZHMgb2YgQEZUX0ZhY2VSZWMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIGZpeGVkLXdpZHRoIGNoYXJhY3RlcnMgKGxpa2UgICAgKi8KLSAgLyogICAgICBDb3VyaWVyLCBMdWNpZG8sIE1vbm9UeXBlLCBldGMuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfU0ZOVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSB1c2VzIHRoZSBgc2ZudCcgc3RvcmFnZSBzY2hlbWUuICBGb3IgICAgICovCi0gIC8qICAgICAgbm93LCB0aGlzIG1lYW5zIFRydWVUeXBlIGFuZCBPcGVuVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgY29udGFpbnMgaG9yaXpvbnRhbCBnbHlwaCBtZXRyaWNzLiAgVGhpcyAqLwotICAvKiAgICAgIHNob3VsZCBiZSBzZXQgZm9yIGFsbCBjb21tb24gZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIHZlcnRpY2FsIGdseXBoIG1ldHJpY3MuICBUaGlzICAgKi8KLSAgLyogICAgICBpcyBvbmx5IGF2YWlsYWJsZSBpbiBzb21lIGZvcm1hdHMsIG5vdCBhbGwgb2YgdGhlbS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfS0VSTklORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSBjb250YWlucyBrZXJuaW5nIGluZm9ybWF0aW9uLiAgSWYgc2V0LCAgICovCi0gIC8qICAgICAgdGhlIGtlcm5pbmcgZGlzdGFuY2UgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSBmdW5jdGlvbiAgICAgICAqLwotICAvKiAgICAgIEBGVF9HZXRfS2VybmluZy4gIE90aGVyd2lzZSB0aGUgZnVuY3Rpb24gYWx3YXlzIHJldHVybiB0aGUgICAgICAgKi8KLSAgLyogICAgICB2ZWN0b3IgKDAsMCkuICBOb3RlIHRoYXQgRnJlZVR5cGUgZG9lc24ndCBoYW5kbGUga2VybmluZyBkYXRhICAgICovCi0gIC8qICAgICAgZnJvbSB0aGUgYEdQT1MnIHRhYmxlIChhcyBwcmVzZW50IGluIHNvbWUgT3BlblR5cGUgZm9udHMpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVEhJUyBGTEFHIElTIERFUFJFQ0FURUQuICBETyBOT1QgVVNFIE9SIFRFU1QgSVQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZvbnQgY29udGFpbnMgbXVsdGlwbGUgbWFzdGVycyBhbmQgaXMgY2FwYWJsZSAqLwotICAvKiAgICAgIG9mIGludGVycG9sYXRpbmcgYmV0d2VlbiB0aGVtLiAgU2VlIHRoZSBtdWx0aXBsZS1tYXN0ZXJzICAgICAgICAgKi8KLSAgLyogICAgICBzcGVjaWZpYyBBUEkgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9udCBjb250YWlucyBnbHlwaCBuYW1lcyB0aGF0IGNhbiBiZSAgICAgICAgICovCi0gIC8qICAgICAgcmV0cmlldmVkIHRocm91Z2ggQEZUX0dldF9HbHlwaF9OYW1lLiAgTm90ZSB0aGF0IHNvbWUgVHJ1ZVR5cGUgICAqLwotICAvKiAgICAgIGZvbnRzIGNvbnRhaW4gYnJva2VuIGdseXBoIG5hbWUgdGFibGVzLiAgVXNlIHRoZSBmdW5jdGlvbiAgICAgICAgKi8KLSAgLyogICAgICBARlRfSGFzX1BTX0dseXBoX05hbWVzIHdoZW4gbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBVc2VkIGludGVybmFsbHkgYnkgRnJlZVR5cGUgdG8gaW5kaWNhdGUgdGhhdCBhIGZhY2UncyBzdHJlYW0gd2FzICovCi0gIC8qICAgICAgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBkZXN0cm95ZWQgICAqLwotICAvKiAgICAgIHdoZW4gQEZUX0RvbmVfRmFjZSBpcyBjYWxsZWQuICBEb24ndCByZWFkIG9yIHRlc3QgdGhpcyBmbGFnLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19ISU5URVIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNldCBpZiB0aGUgZm9udCBkcml2ZXIgaGFzIGEgaGludGluZyBtYWNoaW5lIG9mIGl0cyBvd24uICBGb3IgICAgKi8KLSAgLyogICAgICBleGFtcGxlLCB3aXRoIFRydWVUeXBlIGZvbnRzLCBpdCBtYWtlcyBzZW5zZSB0byB1c2UgZGF0YSBmcm9tICAgICovCi0gIC8qICAgICAgdGhlIFNGTlQgYGdhc3AnIHRhYmxlIG9ubHkgaWYgdGhlIG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIGVuZ2luZSAqLwotICAvKiAgICAgICh3aXRoIHRoZSBieXRlY29kZSBpbnRlcnByZXRlcikgaXMgYXZhaWxhYmxlIGFuZCBhY3RpdmUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNldCBpZiB0aGUgZm9udCBpcyBDSUQta2V5ZWQuICBJbiB0aGF0IGNhc2UsIHRoZSBmb250IGlzIG5vdCAgICAgKi8KLSAgLyogICAgICBhY2Nlc3NlZCBieSBnbHlwaCBpbmRpY2VzIGJ1dCBieSBDSUQgdmFsdWVzLiAgRm9yIHN1YnNldHRlZCAgICAgICovCi0gIC8qICAgICAgQ0lELWtleWVkIGZvbnRzIHRoaXMgaGFzIHRoZSBjb25zZXF1ZW5jZSB0aGF0IG5vdCBhbGwgaW5kZXggICAgICAqLwotICAvKiAgICAgIHZhbHVlcyBhcmUgYSB2YWxpZCBhcmd1bWVudCB0byBGVF9Mb2FkX0dseXBoLiAgT25seSB0aGUgQ0lEICAgICAgKi8KLSAgLyogICAgICB2YWx1ZXMgZm9yIHdoaWNoIGNvcnJlc3BvbmRpbmcgZ2x5cGhzIGluIHRoZSBzdWJzZXR0ZWQgZm9udCAgICAgICovCi0gIC8qICAgICAgZXhpc3QgbWFrZSBGVF9Mb2FkX0dseXBoIHJldHVybiBzdWNjZXNzZnVsbHk7IGluIGFsbCBvdGhlciBjYXNlcyAqLwotICAvKiAgICAgIHlvdSBnZXQgYW4gYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50JyBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSAgICAgICAgICAoIDFMIDw8ICAwICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTICAgICAgICggMUwgPDwgIDEgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEggICAgICAgKCAxTCA8PCAgMiApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19TRk5UICAgICAgICAgICAgICAoIDFMIDw8ICAzICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgICAgICAgICggMUwgPDwgIDQgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfVkVSVElDQUwgICAgICAgICAgKCAxTCA8PCAgNSApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19LRVJOSU5HICAgICAgICAgICAoIDFMIDw8ICA2ICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTICAgICAgICggMUwgPDwgIDcgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyAgKCAxTCA8PCAgOCApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyAgICAgICAoIDFMIDw8ICA5ICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSAgICggMUwgPDwgMTAgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfSElOVEVSICAgICAgICAgICAgKCAxTCA8PCAxMSApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgICAgICAgICAoIDFMIDw8IDEyICkKLQotICAvKiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19IT1JJWk9OVEFMKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucwotICAgKiAgIGhvcml6b250YWwgbWV0cmljcyAodGhpcyBpcyB0cnVlIGZvciBhbGwgZm9udCBmb3JtYXRzIHRob3VnaCkuCi0gICAqCi0gICAqIEBhbHNvOgotICAgKiAgIEBGVF9IQVNfVkVSVElDQUwgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZm9yIHZlcnRpY2FsIG1ldHJpY3MuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfSE9SSVpPTlRBTCggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX1ZFUlRJQ0FMKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyB2ZXJ0aWNhbAotICAgKiAgIG1ldHJpY3MuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfVkVSVElDQUwoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfS0VSTklORyggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMga2VybmluZwotICAgKiAgIGRhdGEgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCBARlRfR2V0X0tlcm5pbmcuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfS0VSTklORyggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfS0VSTklORyApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfU0NBTEFCTEUoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGEgc2NhbGFibGUKLSAgICogICBmb250IGZhY2UgKHRydWUgZm9yIFRydWVUeXBlLCBUeXBlIDEsIFR5cGUgNDIsIENJRCwgT3BlblR5cGUvQ0ZGLAotICAgKiAgIGFuZCBQRlIgZm9udCBmb3JtYXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSVNfU0NBTEFCTEUoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JU19TRk5UKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIGZvbnQKLSAgICogICB3aG9zZSBmb3JtYXQgaXMgYmFzZWQgb24gdGhlIFNGTlQgc3RvcmFnZSBzY2hlbWUuICBUaGlzIHVzdWFsbHkKLSAgICogICBtZWFuczogVHJ1ZVR5cGUgZm9udHMsIE9wZW5UeXBlIGZvbnRzLCBhcyB3ZWxsIGFzIFNGTlQtYmFzZWQgZW1iZWRkZWQKLSAgICogICBiaXRtYXAgZm9udHMuCi0gICAqCi0gICAqICAgSWYgdGhpcyBtYWNybyBpcyB0cnVlLCBhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gQEZUX1NGTlRfTkFNRVNfSCBhbmQKLSAgICogICBARlRfVFJVRVRZUEVfVEFCTEVTX0ggYXJlIGF2YWlsYWJsZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0lTX1NGTlQoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NGTlQgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0lTX0ZJWEVEX1dJRFRIKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIGZvbnQgZmFjZQotICAgKiAgIHRoYXQgY29udGFpbnMgZml4ZWQtd2lkdGggKG9yIGBtb25vc3BhY2UnLCBgZml4ZWQtcGl0Y2gnLCBldGMuKQotICAgKiAgIGdseXBocy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0lTX0ZJWEVEX1dJRFRIKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBzb21lCi0gICAqICAgZW1iZWRkZWQgYml0bWFwcy4gIFNlZSB0aGUgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgdGhlCi0gICAqICAgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyApCi0KLSAgLyogKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfRkFTVF9HTFlQSFMoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgRGVwcmVjYXRlZC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19GQVNUX0dMWVBIUyggZmFjZSApICAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0dMWVBIX05BTUVTKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBzb21lIGdseXBoCi0gICAqICAgbmFtZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCBARlRfR2V0X0dseXBoX05hbWUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfR0xZUEhfTkFNRVMoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgc29tZQotICAgKiAgIG11bHRpcGxlIG1hc3RlcnMuICBUaGUgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IEBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSAgICogICBhcmUgdGhlbiBhdmFpbGFibGUgdG8gY2hvb3NlIHRoZSBleGFjdCBkZXNpZ24geW91IHdhbnQuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfQ0lEX0tFWUVEKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIENJRC1rZXllZAotICAgKiAgIGZvbnQuICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgQEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgZm9yIG1vcmUKLSAgICogICBkZXRhaWxzLgotICAgKgotICAgKiAgIElmIHRoaXMgbWFjcm8gaXMgdHJ1ZSwgYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIEBGVF9DSURfSCBhcmUKLSAgICogICBhdmFpbGFibGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9JU19DSURfS0VZRUQoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVFlMRV9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0LWZsYWdzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHN0eWxlIG9mIGEgZ2l2ZW4gZmFjZS4gICAgKi8KLSAgLyogICAgVGhlc2UgYXJlIHVzZWQgaW4gdGhlIGBzdHlsZV9mbGFncycgZmllbGQgb2YgQEZUX0ZhY2VSZWMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19JVEFMSUMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgYSBnaXZlbiBmYWNlIHN0eWxlIGlzIGl0YWxpYyBvciBvYmxpcXVlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19CT0xEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgYSBnaXZlbiBmYWNlIGlzIGJvbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHlsZSBpbmZvcm1hdGlvbiBhcyBwcm92aWRlZCBieSBGcmVlVHlwZSBpcyB2ZXJ5IGJhc2ljLiAgTW9yZSAqLwotICAvKiAgICBkZXRhaWxzIGFyZSBiZXlvbmQgdGhlIHNjb3BlIGFuZCBzaG91bGQgYmUgZG9uZSBvbiBhIGhpZ2hlciBsZXZlbCAgKi8KLSAgLyogICAgKGZvciBleGFtcGxlLCBieSBhbmFseXppbmcgdmFyaW91cyBmaWVsZHMgb2YgdGhlIGBPUy8yJyB0YWJsZSBpbiAgICovCi0gIC8qICAgIFNGTlQgYmFzZWQgZm9udHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfU1RZTEVfRkxBR19JVEFMSUMgICggMSA8PCAwICkKLSNkZWZpbmUgRlRfU1RZTEVfRkxBR19CT0xEICAgICggMSA8PCAxICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX1NpemVfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSwgdXNlZCB0byAgICAqLwotICAvKiAgICBtb2RlbCBwcml2YXRlIGRhdGEgb2YgYSBnaXZlbiBARlRfU2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1NpemVfSW50ZXJuYWxSZWNfKiAgRlRfU2l6ZV9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzaXplIG1ldHJpY3Mgc3RydWN0dXJlIGdpdmVzIHRoZSBtZXRyaWNzIG9mIGEgc2l6ZSBvYmplY3QuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfcHBlbSAgICAgICA6OiBUaGUgd2lkdGggb2YgdGhlIHNjYWxlZCBFTSBzcXVhcmUgaW4gcGl4ZWxzLCBoZW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIHRlcm0gYHBwZW0nIChwaXhlbHMgcGVyIEVNKS4gIEl0IGlzIGFsc28gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHJlZmVycmVkIHRvIGFzIGBub21pbmFsIHdpZHRoJy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW0gICAgICAgOjogVGhlIGhlaWdodCBvZiB0aGUgc2NhbGVkIEVNIHNxdWFyZSBpbiBwaXhlbHMsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGhlbmNlIHRoZSB0ZXJtIGBwcGVtJyAocGl4ZWxzIHBlciBFTSkuICBJdCBpcyBhbHNvICovCi0gIC8qICAgICAgICAgICAgICAgICAgICByZWZlcnJlZCB0byBhcyBgbm9taW5hbCBoZWlnaHQnLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9zY2FsZSAgICAgIDo6IEEgMTYuMTYgZnJhY3Rpb25hbCBzY2FsaW5nIHZhbHVlIHVzZWQgdG8gY29udmVydCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIG1ldHJpY3MgZnJvbSBmb250IHVuaXRzIHRvIDI2LjYgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25hbCBwaXhlbHMuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZvbnQgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3NjYWxlICAgICAgOjogQSAxNi4xNiBmcmFjdGlvbmFsIHNjYWxpbmcgdmFsdWUgdXNlZCB0byBjb252ZXJ0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIG1ldHJpY3MgZnJvbSBmb250IHVuaXRzIHRvIDI2LjYgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVscy4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZm9udCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzY2VuZGVyICAgICA6OiBUaGUgYXNjZW5kZXIgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscy4gIFNlZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc2NlbmRlciAgICA6OiBUaGUgZGVzY2VuZGVyIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICBTZWUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgICAgICA6OiBUaGUgaGVpZ2h0IGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICBTZWUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9hZHZhbmNlICA6OiBUaGUgbWF4aW1hbCBhZHZhbmNlIHdpZHRoIGluIDI2LjYgZnJhY3Rpb25hbCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLiAgU2VlIEBGVF9GYWNlUmVjIGZvciB0aGUgZGV0YWlscy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc2NhbGluZyB2YWx1ZXMsIGlmIHJlbGV2YW50LCBhcmUgZGV0ZXJtaW5lZCBmaXJzdCBkdXJpbmcgYSAgICAgKi8KLSAgLyogICAgc2l6ZSBjaGFuZ2luZyBvcGVyYXRpb24uICBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgdGhlbiBzZXQgYnkgdGhlICovCi0gIC8qICAgIGRyaXZlci4gIEZvciBzY2FsYWJsZSBmb3JtYXRzLCB0aGV5IGFyZSB1c3VhbGx5IHNldCB0byBzY2FsZWQgICAgICAqLwotICAvKiAgICB2YWx1ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIEBGVF9GYWNlUmVjLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBkdWUgdG8gZ2x5cGggaGludGluZywgdGhlc2UgdmFsdWVzIG1pZ2h0IG5vdCBiZSBleGFjdCAgICAqLwotICAvKiAgICBmb3IgY2VydGFpbiBmb250cy4gIFRodXMgdGhleSBtdXN0IGJlIHRyZWF0ZWQgYXMgdW5yZWxpYWJsZSAgICAgICAgKi8KLSAgLyogICAgd2l0aCBhbiBlcnJvciBtYXJnaW4gb2YgYXQgbGVhc3Qgb25lIHBpeGVsISAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmRlZWQsIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlIGV4YWN0IG1ldHJpY3MgaXMgdG8gcmVuZGVyIF9hbGxfICAgKi8KLSAgLyogICAgZ2x5cGhzLiAgQXMgdGhpcyB3b3VsZCBiZSBhIGRlZmluaXRlIHBlcmZvcm1hbmNlIGhpdCwgaXQgaXMgdXAgdG8gICovCi0gIC8qICAgIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBzdWNoIGNvbXB1dGF0aW9ucy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEZUX1NpemVfTWV0cmljcyBzdHJ1Y3R1cmUgaXMgdmFsaWQgZm9yIGJpdG1hcCBmb250cyBhbHNvLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9NZXRyaWNzXwotICB7Ci0gICAgRlRfVVNob3J0ICB4X3BwZW07ICAgICAgLyogaG9yaXpvbnRhbCBwaXhlbHMgcGVyIEVNICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VU2hvcnQgIHlfcHBlbTsgICAgICAvKiB2ZXJ0aWNhbCBwaXhlbHMgcGVyIEVNICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfRml4ZWQgICB4X3NjYWxlOyAgICAgLyogc2NhbGluZyB2YWx1ZXMgdXNlZCB0byBjb252ZXJ0IGZvbnQgICAgKi8KLSAgICBGVF9GaXhlZCAgIHlfc2NhbGU7ICAgICAvKiB1bml0cyB0byAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzICAgICAgICAqLwotCi0gICAgRlRfUG9zICAgICBhc2NlbmRlcjsgICAgLyogYXNjZW5kZXIgaW4gMjYuNiBmcmFjLiBwaXhlbHMgICAgICAgICAgKi8KLSAgICBGVF9Qb3MgICAgIGRlc2NlbmRlcjsgICAvKiBkZXNjZW5kZXIgaW4gMjYuNiBmcmFjLiBwaXhlbHMgICAgICAgICAqLwotICAgIEZUX1BvcyAgICAgaGVpZ2h0OyAgICAgIC8qIHRleHQgaGVpZ2h0IGluIDI2LjYgZnJhYy4gcGl4ZWxzICAgICAgICovCi0gICAgRlRfUG9zICAgICBtYXhfYWR2YW5jZTsgLyogbWF4IGhvcml6b250YWwgYWR2YW5jZSwgaW4gMjYuNiBwaXhlbHMgKi8KLQotICB9IEZUX1NpemVfTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3Qgc2l6ZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIHNpemUgb2JqZWN0IG1vZGVscyBhIGZhY2UgICAqLwotICAvKiAgICBvYmplY3QgYXQgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IEhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdlbmVyaWMgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlICAgICAqLwotICAvKiAgICAgICAgICAgICAgIGxpYnJhcnkgb3IgYW55IG9mIGl0cyBkcml2ZXJzLiAgSXQgY2FuIGJlIHVzZWQgYnkgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBjbGllbnQgYXBwbGljYXRpb25zIHRvIGxpbmsgdGhlaXIgb3duIGRhdGEgdG8gZWFjaCBzaXplICovCi0gIC8qICAgICAgICAgICAgICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljcyA6OiBNZXRyaWNzIGZvciB0aGlzIHNpemUgb2JqZWN0LiAgVGhpcyBmaWVsZCBpcyByZWFkLW9ubHkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZVJlY18KLSAgewotICAgIEZUX0ZhY2UgICAgICAgICAgIGZhY2U7ICAgICAgLyogcGFyZW50IGZhY2Ugb2JqZWN0ICAgICAgICAgICAgICAqLwotICAgIEZUX0dlbmVyaWMgICAgICAgIGdlbmVyaWM7ICAgLyogZ2VuZXJpYyBwb2ludGVyIGZvciBjbGllbnQgdXNlcyAqLwotICAgIEZUX1NpemVfTWV0cmljcyAgIG1ldHJpY3M7ICAgLyogc2l6ZSBtZXRyaWNzICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1NpemVfSW50ZXJuYWwgIGludGVybmFsOwotCi0gIH0gRlRfU2l6ZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N1YkdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdWJnbHlwaCBzdHJ1Y3R1cmUgaXMgYW4gaW50ZXJuYWwgb2JqZWN0IHVzZWQgdG8gZGVzY3JpYmUgICAgICAqLwotICAvKiAgICBzdWJnbHlwaHMgKGZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBjb21wb3NpdGVzKS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3ViZ2x5cGggaW1wbGVtZW50YXRpb24gaXMgbm90IHBhcnQgb2YgdGhlIGhpZ2gtbGV2ZWwgQVBJLCAgICAgKi8KLSAgLyogICAgaGVuY2UgdGhlIGZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIGhvd2V2ZXIgcmV0cmlldmUgc3ViZ2x5cGggaW5mb3JtYXRpb24gd2l0aCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9TdWJHbHlwaF9JbmZvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9TdWJHbHlwaFJlY18qICBGVF9TdWJHbHlwaDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nsb3RfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX1Nsb3RfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSwgdXNlZCB0byAgICAqLwotICAvKiAgICBtb2RlbCBwcml2YXRlIGRhdGEgb2YgYSBnaXZlbiBARlRfR2x5cGhTbG90IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1Nsb3RfSW50ZXJuYWxSZWNfKiAgRlRfU2xvdF9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3QgZ2x5cGggc2xvdCBjbGFzcyBzdHJ1Y3R1cmUuICBBIGdseXBoIHNsb3QgaXMgYSAgICAgICAqLwotICAvKiAgICBjb250YWluZXIgd2hlcmUgaW5kaXZpZHVhbCBnbHlwaHMgY2FuIGJlIGxvYWRlZCwgYmUgdGhleSBpbiAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSBvciBiaXRtYXAgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2xvdCBiZWxvbmdzIHRvLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXh0ICAgICAgICAgICAgICA6OiBJbiBzb21lIGNhc2VzIChsaWtlIHNvbWUgZm9udCB0b29scyksIHNldmVyYWwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggc2xvdHMgcGVyIGZhY2Ugb2JqZWN0IGNhbiBiZSBhIGdvb2QgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLiAgQXMgdGhpcyBpcyByYXJlLCB0aGUgZ2x5cGggc2xvdHMgYXJlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZWQgdGhyb3VnaCBhIGRpcmVjdCwgc2luZ2xlLWxpbmtlZCBsaXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgaXRzIGBuZXh0JyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZW5lcmljICAgICAgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgd2hpY2ggaXMgdW51c2VkIGJ5IHRoZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRnJlZVR5cGUgbGlicmFyeSBvciBhbnkgb2YgaXRzIGRyaXZlcnMuICBJdCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gbGluayAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVpciBvd24gZGF0YSB0byBlYWNoIGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3MgICAgICAgICAgIDo6IFRoZSBtZXRyaWNzIG9mIHRoZSBsYXN0IGxvYWRlZCBnbHlwaCBpbiB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LiAgVGhlIHJldHVybmVkIHZhbHVlcyBkZXBlbmQgb24gdGhlIGxhc3QgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCBmbGFncyAoc2VlIHRoZSBARlRfTG9hZF9HbHlwaCBBUEkgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKSBhbmQgY2FuIGJlIGV4cHJlc3NlZCBlaXRoZXIgaW4gMjYuNiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVscyBvciBmb250IHVuaXRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBldmVuIHdoZW4gdGhlIGdseXBoIGltYWdlIGlzICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCwgdGhlIG1ldHJpY3MgYXJlIG5vdC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpbmVhckhvcmlBZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9mIHRoZSB1bmhpbnRlZCBnbHlwaC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBJdHMgdmFsdWUgaXMgZXhwcmVzc2VkIGluIDE2LjE2IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLCB1bmxlc3MgQEZUX0xPQURfTElORUFSX0RFU0lHTiBpcyBzZXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbG9hZGluZyB0aGUgZ2x5cGguICBUaGlzIGZpZWxkIGNhbiBiZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbnQgdG8gcGVyZm9ybSBjb3JyZWN0IFdZU0lXWUcgbGF5b3V0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgT25seSByZWxldmFudCBmb3Igb3V0bGluZSBnbHlwaHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaW5lYXJWZXJ0QWR2YW5jZSA6OiBUaGUgYWR2YW5jZSBoZWlnaHQgb2YgdGhlIHVuaGludGVkIGdseXBoLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSXRzIHZhbHVlIGlzIGV4cHJlc3NlZCBpbiAxNi4xNiBmcmFjdGlvbmFsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscywgdW5sZXNzIEBGVF9MT0FEX0xJTkVBUl9ERVNJR04gaXMgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGxvYWRpbmcgdGhlIGdseXBoLiAgVGhpcyBmaWVsZCBjYW4gYmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50IHRvIHBlcmZvcm0gY29ycmVjdCBXWVNJV1lHIGxheW91dC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIG91dGxpbmUgZ2x5cGhzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSAgICAgICAgICAgOjogVGhpcyBpcyB0aGUgdHJhbnNmb3JtZWQgYWR2YW5jZSB3aWR0aCBmb3IgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0ICAgICAgICAgICAgOjogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGZvcm1hdCBvZiB0aGUgaW1hZ2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgZ2x5cGggc2xvdC4gIFR5cGljYWxseSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX0JJVE1BUCwgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLCBvciAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFLCBidXQgb3RoZXJzIGFyZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcCAgICAgICAgICAgIDo6IFRoaXMgZmllbGQgaXMgdXNlZCBhcyBhIGJpdG1hcCBkZXNjcmlwdG9yICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBzbG90IGZvcm1hdCBpcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAuICBOb3RlIHRoYXQgdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgYW5kIGNvbnRlbnQgb2YgdGhlIGJpdG1hcCBidWZmZXIgY2FuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgYmV0d2VlbiBjYWxscyBvZiBARlRfTG9hZF9HbHlwaCBhbmQgYSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZmV3IG90aGVyIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXBfbGVmdCAgICAgICA6OiBUaGlzIGlzIHRoZSBiaXRtYXAncyBsZWZ0IGJlYXJpbmcgZXhwcmVzc2VkICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50ZWdlciBwaXhlbHMuICBPZiBjb3Vyc2UsIHRoaXMgaXMgb25seSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGlmIHRoZSBmb3JtYXQgaXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX0JJVE1BUC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcF90b3AgICAgICAgIDo6IFRoaXMgaXMgdGhlIGJpdG1hcCdzIHRvcCBiZWFyaW5nIGV4cHJlc3NlZCBpbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIHBpeGVscy4gIFJlbWVtYmVyIHRoYXQgdGhpcyBpcyB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHNjYW5saW5lLCB1cHdhcmRzIHktY29vcmRpbmF0ZXMgYmVpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zaXRpdmUqLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgICAgICAgICAgIDo6IFRoZSBvdXRsaW5lIGRlc2NyaXB0b3IgZm9yIHRoZSBjdXJyZW50IGdseXBoICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBpZiBpdHMgZm9ybWF0IGlzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLiAgT25jZSBhIGdseXBoIGlzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCwgYG91dGxpbmUnIGNhbiBiZSB0cmFuc2Zvcm1lZCwgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0b3J0ZWQsIGVtYm9sZGVkLCBldGMuICBIb3dldmVyLCBpdCBtdXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlIGZyZWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fc3ViZ2x5cGhzICAgICA6OiBUaGUgbnVtYmVyIG9mIHN1YmdseXBocyBpbiBhIGNvbXBvc2l0ZSBnbHlwaC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBvbmx5IHZhbGlkIGZvciB0aGUgY29tcG9zaXRlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIGZvcm1hdCB0aGF0IHNob3VsZCBub3JtYWxseSBvbmx5IGJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgd2l0aCB0aGUgQEZUX0xPQURfTk9fUkVDVVJTRSBmbGFnLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG5vdyB0aGlzIGlzIGludGVybmFsIHRvIEZyZWVUeXBlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdWJnbHlwaHMgICAgICAgICA6OiBBbiBhcnJheSBvZiBzdWJnbHlwaCBkZXNjcmlwdG9ycyBmb3IgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIGdseXBocy4gIFRoZXJlIGFyZSBgbnVtX3N1YmdseXBocycgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZXJlLiAgQ3VycmVudGx5IGludGVybmFsIHRvICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2xfZGF0YSAgICAgIDo6IENlcnRhaW4gZm9udCBkcml2ZXJzIGNhbiBhbHNvIHJldHVybiB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGRhdGEgZm9yIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgKGUuZy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgYnl0ZWNvZGUsIFR5cGUgMSBjaGFyc3RyaW5ncywgZXRjLikuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgYSBwb2ludGVyIHRvIHN1Y2ggZGF0YS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbF9sZW4gICAgICAgOjogVGhpcyBpcyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjb250cm9sICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3RoZXIgICAgICAgICAgICAgOjogUmVhbGx5IHdpY2tlZCBmb3JtYXRzIGNhbiB1c2UgdGhpcyBwb2ludGVyIHRvICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQgdGhlaXIgb3duIGdseXBoIGltYWdlIHRvIGNsaWVudCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuICBOb3RlIHRoYXQgdGhlIGFwcGxpY2F0aW9uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgaW1hZ2UgZm9ybWF0LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsc2JfZGVsdGEgICAgICAgICA6OiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhpbnRlZCBhbmQgdW5oaW50ZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBzaWRlIGJlYXJpbmcgd2hpbGUgYXV0b2hpbnRpbmcgaXMgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS4gIFplcm8gb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcnNiX2RlbHRhICAgICAgICAgOjogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBoaW50ZWQgYW5kIHVuaGludGVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IHNpZGUgYmVhcmluZyB3aGlsZSBhdXRvaGludGluZyBpcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuICBaZXJvIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBARlRfTG9hZF9HbHlwaCBpcyBjYWxsZWQgd2l0aCBkZWZhdWx0IGZsYWdzIChzZWUgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xPQURfREVGQVVMVCkgdGhlIGdseXBoIGltYWdlIGlzIGxvYWRlZCBpbiB0aGUgZ2x5cGggc2xvdCBpbiAgICovCi0gIC8qICAgIGl0cyBuYXRpdmUgZm9ybWF0IChlLmcuLCBhbiBvdXRsaW5lIGdseXBoIGZvciBUcnVlVHlwZSBhbmQgVHlwZSAxICAqLwotICAvKiAgICBmb3JtYXRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaW1hZ2UgY2FuIGxhdGVyIGJlIGNvbnZlcnRlZCBpbnRvIGEgYml0bWFwIGJ5IGNhbGxpbmcgICAgICAgICAqLwotICAvKiAgICBARlRfUmVuZGVyX0dseXBoLiAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgICAgKi8KLSAgLyogICAgdGhlIG5hdGl2ZSBpbWFnZSdzIGZvcm1hdCB0aGVuIGludm9rZXMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVuZGVyZXIgaXMgaW4gY2hhcmdlIG9mIHRyYW5zZm9ybWluZyB0aGUgbmF0aXZlIGltYWdlIHRocm91Z2ggKi8KLSAgLyogICAgdGhlIHNsb3QncyBmYWNlIHRyYW5zZm9ybWF0aW9uIGZpZWxkcywgdGhlbiBjb252ZXJ0IGl0IGludG8gYSAgICAgICovCi0gIC8qICAgIGJpdG1hcCB0aGF0IGlzIHJldHVybmVkIGluIGBzbG90LT5iaXRtYXAnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IGBzbG90LT5iaXRtYXBfbGVmdCcgYW5kIGBzbG90LT5iaXRtYXBfdG9wJyBhcmUgYWxzbyB1c2VkICovCi0gIC8qICAgIHRvIHNwZWNpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBiaXRtYXAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcGVuICAqLwotICAvKiAgICBwb3NpdGlvbiAoZS5nLiwgY29vcmRpbmF0ZXMgKDAsMCkgb24gdGhlIGJhc2VsaW5lKS4gIE9mIGNvdXJzZSwgICAgKi8KLSAgLyogICAgYHNsb3QtPmZvcm1hdCcgaXMgYWxzbyBjaGFuZ2VkIHRvIEBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBhIHNtYWxsIHBzZXVkbyBjb2RlIGZyYWdtZW50IHdoaWNoIHNob3dzIGhvdyB0byB1c2UgICAgICAgICAgICovCi0gIC8qICAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfUG9zICBvcmlnaW5feCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX1BvcyAgcHJldl9yc2JfZGVsdGEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGZvciBhbGwgZ2x5cGhzIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIDxjb21wdXRlIGtlcm4gYmV0d2VlbiBjdXJyZW50IGFuZCBwcmV2aW91cyBnbHlwaCBhbmQgYWRkIGl0IHRvICovCi0gIC8qICAgICAgICAgYG9yaWdpbl94Jz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIDxsb2FkIGdseXBoIHdpdGggYEZUX0xvYWRfR2x5cGgnPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgaWYgKCBwcmV2X3JzYl9kZWx0YSAtIGZhY2UtPmdseXBoLT5sc2JfZGVsdGEgPj0gMzIgKSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgb3JpZ2luX3ggLT0gNjQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBlbHNlIGlmICggcHJldl9yc2JfZGVsdGEgLSBmYWNlLT5nbHlwaC0+bHNiX2RlbHRhIDwgLTMyICkgICAgICAqLwotICAvKiAgICAgICAgICBvcmlnaW5feCArPSA2NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBwcmV2X3JzYl9kZWx0YSA9IGZhY2UtPmdseXBoLT5yc2JfZGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIDxzYXZlIGdseXBoIGltYWdlLCBvciByZW5kZXIgZ2x5cGgsIG9yIC4uLj4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgb3JpZ2luX3ggKz0gZmFjZS0+Z2x5cGgtPmFkdmFuY2UueDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBlbmRmb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoU2xvdFJlY18KLSAgewotICAgIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnk7Ci0gICAgRlRfRmFjZSAgICAgICAgICAgZmFjZTsKLSAgICBGVF9HbHlwaFNsb3QgICAgICBuZXh0OwotICAgIEZUX1VJbnQgICAgICAgICAgIHJlc2VydmVkOyAgICAgICAvKiByZXRhaW5lZCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KLSAgICBGVF9HZW5lcmljICAgICAgICBnZW5lcmljOwotCi0gICAgRlRfR2x5cGhfTWV0cmljcyAgbWV0cmljczsKLSAgICBGVF9GaXhlZCAgICAgICAgICBsaW5lYXJIb3JpQWR2YW5jZTsKLSAgICBGVF9GaXhlZCAgICAgICAgICBsaW5lYXJWZXJ0QWR2YW5jZTsKLSAgICBGVF9WZWN0b3IgICAgICAgICBhZHZhbmNlOwotCi0gICAgRlRfR2x5cGhfRm9ybWF0ICAgZm9ybWF0OwotCi0gICAgRlRfQml0bWFwICAgICAgICAgYml0bWFwOwotICAgIEZUX0ludCAgICAgICAgICAgIGJpdG1hcF9sZWZ0OwotICAgIEZUX0ludCAgICAgICAgICAgIGJpdG1hcF90b3A7Ci0KLSAgICBGVF9PdXRsaW5lICAgICAgICBvdXRsaW5lOwotCi0gICAgRlRfVUludCAgICAgICAgICAgbnVtX3N1YmdseXBoczsKLSAgICBGVF9TdWJHbHlwaCAgICAgICBzdWJnbHlwaHM7Ci0KLSAgICB2b2lkKiAgICAgICAgICAgICBjb250cm9sX2RhdGE7Ci0gICAgbG9uZyAgICAgICAgICAgICAgY29udHJvbF9sZW47Ci0KLSAgICBGVF9Qb3MgICAgICAgICAgICBsc2JfZGVsdGE7Ci0gICAgRlRfUG9zICAgICAgICAgICAgcnNiX2RlbHRhOwotCi0gICAgdm9pZCogICAgICAgICAgICAgb3RoZXI7Ci0KLSAgICBGVF9TbG90X0ludGVybmFsICBpbnRlcm5hbDsKLQotICB9IEZUX0dseXBoU2xvdFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW5pdF9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIG5ldyBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIFRoZSBzZXQgb2YgbW9kdWxlcyAgICAgICovCi0gIC8qICAgIHRoYXQgYXJlIHJlZ2lzdGVyZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGF0IGJ1aWxkIHRpbWUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkgICphbGlicmFyeSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhIGdpdmVuIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0IGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLCAgICovCi0gIC8qICAgIGluY2x1ZGluZyByZXNvdXJjZXMsIGRyaXZlcnMsIGZhY2VzLCBzaXplcywgZXRjLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfRnJlZVR5cGUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aGluIHRoZSBgZmxhZ3MnIGZpZWxkIG9mIHRoZSAqLwotICAvKiAgICBARlRfT3Blbl9BcmdzIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX01FTU9SWSAgICAgIDo6IFRoaXMgaXMgYSBtZW1vcnktYmFzZWQgc3RyZWFtLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fU1RSRUFNICAgICAgOjogQ29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGBzdHJlYW0nIGZpZWxkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9QQVRITkFNRSAgICA6OiBDcmVhdGUgYSBuZXcgaW5wdXQgc3RyZWFtIGZyb20gYSBDICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9EUklWRVIgICAgICA6OiBVc2UgdGhlIGBkcml2ZXInIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1BBUkFNUyAgICAgIDo6IFVzZSB0aGUgYG51bV9wYXJhbXMnIGFuZCBgcGFyYW1zJyBmaWVsZHMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X29wZW5fbWVtb3J5ICAgICAgOjogRGVwcmVjYXRlZDsgdXNlIEBGVF9PUEVOX01FTU9SWSBpbnN0ZWFkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfb3Blbl9zdHJlYW0gICAgICA6OiBEZXByZWNhdGVkOyB1c2UgQEZUX09QRU5fU1RSRUFNIGluc3RlYWQuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9vcGVuX3BhdGhuYW1lICAgIDo6IERlcHJlY2F0ZWQ7IHVzZSBARlRfT1BFTl9QQVRITkFNRSBpbnN0ZWFkLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X29wZW5fZHJpdmVyICAgICAgOjogRGVwcmVjYXRlZDsgdXNlIEBGVF9PUEVOX0RSSVZFUiBpbnN0ZWFkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfb3Blbl9wYXJhbXMgICAgICA6OiBEZXByZWNhdGVkOyB1c2UgQEZUX09QRU5fUEFSQU1TIGluc3RlYWQuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBGVF9PUEVOX01FTU9SWScsIGBGVF9PUEVOX1NUUkVBTScsIGFuZCBgRlRfT1BFTl9QQVRITkFNRScgICAgICovCi0gIC8qICAgIGZsYWdzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfT1BFTl9NRU1PUlkgICAgMHgxCi0jZGVmaW5lIEZUX09QRU5fU1RSRUFNICAgIDB4MgotI2RlZmluZSBGVF9PUEVOX1BBVEhOQU1FICAweDQKLSNkZWZpbmUgRlRfT1BFTl9EUklWRVIgICAgMHg4Ci0jZGVmaW5lIEZUX09QRU5fUEFSQU1TICAgIDB4MTAKLQotI2RlZmluZSBmdF9vcGVuX21lbW9yeSAgICBGVF9PUEVOX01FTU9SWSAgICAgLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBmdF9vcGVuX3N0cmVhbSAgICBGVF9PUEVOX1NUUkVBTSAgICAgLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBmdF9vcGVuX3BhdGhuYW1lICBGVF9PUEVOX1BBVEhOQU1FICAgLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBmdF9vcGVuX2RyaXZlciAgICBGVF9PUEVOX0RSSVZFUiAgICAgLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBmdF9vcGVuX3BhcmFtcyAgICBGVF9PUEVOX1BBUkFNUyAgICAgLyogZGVwcmVjYXRlZCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBtb3JlIG9yIGxlc3MgZ2VuZXJpYyBwYXJhbWV0ZXJzICAgICovCi0gIC8qICAgIHRvIEBGVF9PcGVuX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgOjogQSBmb3VyLWJ5dGUgaWRlbnRpZmljYXRpb24gdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlciBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIElEIGFuZCBmdW5jdGlvbiBvZiBwYXJhbWV0ZXJzIGFyZSBkcml2ZXItc3BlY2lmaWMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfUGFyYW1ldGVyXwotICB7Ci0gICAgRlRfVUxvbmcgICAgdGFnOwotICAgIEZUX1BvaW50ZXIgIGRhdGE7Ci0KLSAgfSBGVF9QYXJhbWV0ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuX0FyZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGluZGljYXRlIGhvdyB0byBvcGVuIGEgbmV3IGZvbnQgZmlsZSBvciAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtLiAgQSBwb2ludGVyIHRvIHN1Y2ggYSBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgICovCi0gIC8qICAgIGZvciB0aGUgZnVuY3Rpb25zIEBGVF9PcGVuX0ZhY2UgYW5kIEBGVF9BdHRhY2hfU3RyZWFtLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIGhvdyB0byB1c2UgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeV9iYXNlIDo6IFRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWxlIGluIG1lbW9yeS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5X3NpemUgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgaW4gbWVtb3J5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRobmFtZSAgICA6OiBBIHBvaW50ZXIgdG8gYW4gOC1iaXQgZmlsZSBwYXRobmFtZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZHJpdmVyICAgICAgOjogVGhpcyBmaWVsZCBpcyBleGNsdXNpdmVseSB1c2VkIGJ5IEBGVF9PcGVuX0ZhY2U7ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGl0IHNpbXBseSBzcGVjaWZpZXMgdGhlIGZvbnQgZHJpdmVyIHRvIHVzZSB0byBvcGVuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0aGUgZmFjZS4gIElmIHNldCB0byAwLCBGcmVlVHlwZSB0cmllcyB0byBsb2FkIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZmFjZSB3aXRoIGVhY2ggb25lIG9mIHRoZSBkcml2ZXJzIGluIGl0cyBsaXN0LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zICA6OiBUaGUgbnVtYmVyIG9mIGV4dHJhIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgIDo6IEV4dHJhIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBmb250IGRyaXZlciB3aGVuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvcGVuaW5nIGEgbmV3IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3RyZWFtIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udGVudHMgb2YgYGZsYWdzJyB3aGljaCAgICAgKi8KLSAgLyogICAgYXJlIHRlc3RlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGJ5IEBGVF9PcGVuX0ZhY2U6ICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgYEZUX09QRU5fTUVNT1JZJyBiaXQgaXMgc2V0LCBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IGZpbGUgb2YgYG1lbW9yeV9zaXplJyBieXRlcywgbG9jYXRlZCBhdCBgbWVtb3J5X2FkZHJlc3MnLiAgICovCi0gIC8qICAgIFRoZSBkYXRhIGFyZSBhcmUgbm90IGNvcGllZCwgYW5kIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yICAgICAqLwotICAvKiAgICByZWxlYXNpbmcgYW5kIGRlc3Ryb3lpbmcgdGhlbSBfYWZ0ZXJfIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgdG8gICAgKi8KLSAgLyogICAgQEZUX0RvbmVfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPdGhlcndpc2UsIGlmIHRoZSBgRlRfT1BFTl9TVFJFQU0nIGJpdCBpcyBzZXQsIGFzc3VtZSB0aGF0IGEgICAgICAgKi8KLSAgLyogICAgY3VzdG9tIGlucHV0IHN0cmVhbSBgc3RyZWFtJyBpcyB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPdGhlcndpc2UsIGlmIHRoZSBgRlRfT1BFTl9QQVRITkFNRScgYml0IGlzIHNldCwgYXNzdW1lIHRoYXQgdGhpcyAgKi8KLSAgLyogICAgaXMgYSBub3JtYWwgZmlsZSBhbmQgdXNlIGBwYXRobmFtZScgdG8gb3BlbiBpdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgYEZUX09QRU5fRFJJVkVSJyBiaXQgaXMgc2V0LCBARlRfT3Blbl9GYWNlIG9ubHkgdHJpZXMgdG8gICAgKi8KLSAgLyogICAgb3BlbiB0aGUgZmlsZSB3aXRoIHRoZSBkcml2ZXIgd2hvc2UgaGFuZGxlciBpcyBpbiBgZHJpdmVyJy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgYEZUX09QRU5fUEFSQU1TJyBiaXQgaXMgc2V0LCB0aGUgcGFyYW1ldGVycyBnaXZlbiBieSAgICAgICAgKi8KLSAgLyogICAgYG51bV9wYXJhbXMnIGFuZCBgcGFyYW1zJyBpcyB1c2VkLiAgVGhleSBhcmUgaWdub3JlZCBvdGhlcndpc2UuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZGVhbGx5LCBib3RoIHRoZSBgcGF0aG5hbWUnIGFuZCBgcGFyYW1zJyBmaWVsZHMgc2hvdWxkIGJlIHRhZ2dlZCAgKi8KLSAgLyogICAgYXMgYGNvbnN0JzsgdGhpcyBpcyBtaXNzaW5nIGZvciBBUEkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBXaXRoICovCi0gIC8qICAgIG90aGVyIHdvcmRzLCBhcHBsaWNhdGlvbnMgc2hvdWxkIHRyZWF0IHRoZW0gYXMgcmVhZC1vbmx5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX09wZW5fQXJnc18KLSAgewotICAgIEZUX1VJbnQgICAgICAgICBmbGFnczsKLSAgICBjb25zdCBGVF9CeXRlKiAgbWVtb3J5X2Jhc2U7Ci0gICAgRlRfTG9uZyAgICAgICAgIG1lbW9yeV9zaXplOwotICAgIEZUX1N0cmluZyogICAgICBwYXRobmFtZTsKLSAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtOwotICAgIEZUX01vZHVsZSAgICAgICBkcml2ZXI7Ci0gICAgRlRfSW50ICAgICAgICAgIG51bV9wYXJhbXM7Ci0gICAgRlRfUGFyYW1ldGVyKiAgIHBhcmFtczsKLQotICB9IEZUX09wZW5fQXJnczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX09wZW5fRmFjZSB0byBvcGVuIGEgZm9udCBieSBpdHMgcGF0aG5hbWUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhuYW1lICAgOjogQSBwYXRoIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2l0aGluIHRoZSBmb250LiAgVGhlIGZpcnN0ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmFjZSBoYXMgaW5kZXggMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICBJZiBgZmFjZV9pbmRleCcgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdCBtdXN0IGJlIG5vbi1OVUxMLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBTZWUgQEZUX09wZW5fRmFjZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSwKLSAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgKmFmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTWVtb3J5X0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIEBGVF9PcGVuX0ZhY2UgdG8gb3BlbiBhIGZvbnQgd2hpY2ggaGFzIGJlZW4gICAgKi8KLSAgLyogICAgbG9hZGVkIGludG8gbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmlsZV9iYXNlICA6OiBBIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9udCBkYXRhLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaWxlX3NpemUgIDo6IFRoZSBzaXplIG9mIHRoZSBtZW1vcnkgY2h1bmsgdXNlZCBieSB0aGUgZm9udCBkYXRhLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBmYWNlIHdpdGhpbiB0aGUgZm9udC4gIFRoZSBmaXJzdCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGZhY2UgaGFzIGluZGV4IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgSWYgYGZhY2VfaW5kZXgnIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybywgaXQgbXVzdCBiZSBub24tTlVMTC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgU2VlIEBGVF9PcGVuX0ZhY2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBtdXN0IG5vdCBkZWFsbG9jYXRlIHRoZSBtZW1vcnkgYmVmb3JlIGNhbGxpbmcgQEZUX0RvbmVfRmFjZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19NZW1vcnlfRmFjZSggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGZpbGVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgZmlsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICphZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3Blbl9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGRlc2NyaWJlZCBieSAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9PcGVuX0FyZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFyZ3MgICAgICAgOjogQSBwb2ludGVyIHRvIGFuIGBGVF9PcGVuX0FyZ3MnIHN0cnVjdHVyZSB3aGljaCBtdXN0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCBieSB0aGUgY2FsbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBmYWNlIHdpdGhpbiB0aGUgZm9udC4gIFRoZSBmaXJzdCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGZhY2UgaGFzIGluZGV4IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgSWYgYGZhY2VfaW5kZXgnIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybywgaXQgbXVzdCBiZSBub24tTlVMTC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgU2VlIG5vdGUgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVubGlrZSBGcmVlVHlwZSAxLngsIHRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBjcmVhdGVzIGEgZ2x5cGggICAqLwotICAvKiAgICBzbG90IGZvciB0aGUgZmFjZSBvYmplY3Qgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHRocm91Z2ggICAgKi8KLSAgLyogICAgYGZhY2UtPmdseXBoJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuX0ZhY2UgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBjaGVjayB3aGV0aGVyIHRoZSBmb250ICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0IG9mIGEgZ2l2ZW4gZm9udCByZXNvdXJjZSBpcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGUuICBJZiB0aGUgICovCi0gIC8qICAgIGBmYWNlX2luZGV4JyBmaWVsZCBpcyBuZWdhdGl2ZSwgdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGlzIDAgICAqLwotICAvKiAgICBpZiB0aGUgZm9udCBmb3JtYXQgaXMgcmVjb2duaXplZCwgb3Igbm9uLXplcm8gb3RoZXJ3aXNlOyAgICAgICAgICAgKi8KLSAgLyogICAgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBtb3JlIG9yIGxlc3MgZW1wdHkgZmFjZSBoYW5kbGUgaW4gYCphZmFjZScgICovCi0gIC8qICAgIChpZiBgYWZhY2UnIGlzbid0IE5VTEwpLiAgVGhlIG9ubHkgdXNlZnVsIGZpZWxkIGluIHRoaXMgc3BlY2lhbCAgICAqLwotICAvKiAgICBjYXNlIGlzIGBmYWNlLT5udW1fZmFjZXMnIHdoaWNoIGdpdmVzIHRoZSBudW1iZXIgb2YgZmFjZXMgd2l0aGluICAgKi8KLSAgLyogICAgdGhlIGZvbnQgZmlsZS4gIEFmdGVyIGV4YW1pbmF0aW9uLCB0aGUgcmV0dXJuZWQgQEZUX0ZhY2Ugc3RydWN0dXJlICovCi0gIC8qICAgIHNob3VsZCBiZSBkZWFsbG9jYXRlZCB3aXRoIGEgY2FsbCB0byBARlRfRG9uZV9GYWNlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBuZXcgZmFjZSBvYmplY3QgY3JlYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gYWxzbyBvd25zIGEgICAgICAgICovCi0gIC8qICAgIGRlZmF1bHQgQEZUX1NpemUgb2JqZWN0LCBhY2Nlc3NpYmxlIGFzIGBmYWNlLT5zaXplJy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX09wZW5fRmFjZSggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICBjb25zdCBGVF9PcGVuX0FyZ3MqICBhcmdzLAotICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAqYWZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9GaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX0F0dGFjaF9TdHJlYW0gdG8gYXR0YWNoIGEgZmlsZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbGVwYXRobmFtZSA6OiBUaGUgcGF0aG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0F0dGFjaF9GaWxlKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBBdHRhY2gnIGRhdGEgdG8gYSBmYWNlIG9iamVjdC4gIE5vcm1hbGx5LCB0aGlzIGlzIHVzZWQgdG8gcmVhZCAgICAqLwotICAvKiAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZmFjZSBvYmplY3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiAgKi8KLSAgLyogICAgYXR0YWNoIGFuIEFGTSBmaWxlIHRoYXQgY29tZXMgd2l0aCBhIFR5cGUgMSBmb250IHRvIGdldCB0aGUgICAgICAgICovCi0gIC8qICAgIGtlcm5pbmcgdmFsdWVzIGFuZCBvdGhlciBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtZXRlcnMgOjogQSBwb2ludGVyIHRvIEBGVF9PcGVuX0FyZ3Mgd2hpY2ggbXVzdCBiZSBmaWxsZWQgYnkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVhbmluZyBvZiB0aGUgYGF0dGFjaCcgKGkuZS4sIHdoYXQgcmVhbGx5IGhhcHBlbnMgd2hlbiB0aGUgICAgKi8KLSAgLyogICAgbmV3IGZpbGUgaXMgcmVhZCkgaXMgbm90IGZpeGVkIGJ5IEZyZWVUeXBlIGl0c2VsZi4gIEl0IHJlYWxseSAgICAgICovCi0gIC8qICAgIGRlcGVuZHMgb24gdGhlIGZvbnQgZm9ybWF0IChhbmQgdGh1cyB0aGUgZm9udCBkcml2ZXIpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8ga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nICAgICAgICovCi0gIC8qICAgIHdoZW4gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gIE1vc3QgZHJpdmVycyBzaW1wbHkgZG8gbm90IGltcGxlbWVudCAqLwotICAvKiAgICBmaWxlIGF0dGFjaG1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9BdHRhY2hfU3RyZWFtKCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9PcGVuX0FyZ3MqICBwYXJhbWV0ZXJzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkIGEgZ2l2ZW4gZmFjZSBvYmplY3QsIGFzIHdlbGwgYXMgYWxsIG9mIGl0cyBjaGlsZCBzbG90cyBhbmQgKi8KLSAgLyogICAgc2l6ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9GYWNlKCBGVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZWxlY3RfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWxlY3QgYSBiaXRtYXAgc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpa2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBiaXRtYXAgc3RyaWtlIGluIHRoZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGBhdmFpbGFibGVfc2l6ZXMnIGZpZWxkIG9mIEBGVF9GYWNlUmVjIHN0cnVjdHVyZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2VsZWN0X1NpemUoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICBzdHJpa2VfaW5kZXggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdF9UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHR5cGUgdGhhdCBsaXN0cyB0aGUgc3VwcG9ydGVkIHNpemUgcmVxdWVzdCB0eXBlcy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBub21pbmFsIHNpemUuICBUaGUgYHVuaXRzX3Blcl9FTScgZmllbGQgb2YgQEZUX0ZhY2VSZWMgaXMgICAgKi8KLSAgLyogICAgICB1c2VkIHRvIGRldGVybWluZSBib3RoIHNjYWxpbmcgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgcmVhbCBkaW1lbnNpb24uICBUaGUgc3VtIG9mIHRoZSB0aGUgYEFzY2VuZGVyJyBhbmQgKG1pbnVzICAgICovCi0gIC8qICAgICAgb2YpIHRoZSBgRGVzY2VuZGVyJyBmaWVsZHMgb2YgQEZUX0ZhY2VSZWMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lICAqLwotICAvKiAgICAgIGJvdGggc2NhbGluZyB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX0JCT1ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmb250IGJvdW5kaW5nIGJveC4gIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBgYmJveCcgZmllbGQgKi8KLSAgLyogICAgICBvZiBARlRfRmFjZVJlYyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICovCi0gIC8qICAgICAgc2NhbGluZyB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfQ0VMTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGBtYXhfYWR2YW5jZV93aWR0aCcgZmllbGQgb2YgQEZUX0ZhY2VSZWMgaXMgdXNlZCB0byAgICAgICAgICAqLwotICAvKiAgICAgIGRldGVybWluZSB0aGUgaG9yaXpvbnRhbCBzY2FsaW5nIHZhbHVlOyB0aGUgdmVydGljYWwgc2NhbGluZyAgICAgKi8KLSAgLyogICAgICB2YWx1ZSBpcyBkZXRlcm1pbmVkIHRoZSBzYW1lIHdheSBhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX1NJWkVfUkVRVUVTVF9UWVBFX1JFQUxfRElNIGRvZXMuICBGaW5hbGx5LCBib3RoIHNjYWxpbmcgICAgICAqLwotICAvKiAgICAgIHZhbHVlcyBhcmUgc2V0IHRvIHRoZSBzbWFsbGVyIG9uZS4gIFRoaXMgdHlwZSBpcyB1c2VmdWwgaWYgeW91ICAgKi8KLSAgLyogICAgICB3YW50IHRvIHNwZWNpZnkgdGhlIGZvbnQgc2l6ZSBmb3IsIHNheSwgYSB3aW5kb3cgb2YgYSBnaXZlbiAgICAgICovCi0gIC8qICAgICAgZGltZW5zaW9uIGFuZCA4MHgyNCBjZWxscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfU0NBTEVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU3BlY2lmeSB0aGUgc2NhbGluZyB2YWx1ZXMgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBhYm92ZSBkZXNjcmlwdGlvbnMgb25seSBhcHBseSB0byBzY2FsYWJsZSBmb3JtYXRzLiAgRm9yIGJpdG1hcCAqLwotICAvKiAgICBmb3JtYXRzLCB0aGUgYmVoYXZpb3VyIGlzIHVwIHRvIHRoZSBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSB0aGUgbm90ZSBzZWN0aW9uIG9mIEBGVF9TaXplX01ldHJpY3MgaWYgeW91IHdvbmRlciBob3cgc2l6ZSAgICAqLwotICAvKiAgICByZXF1ZXN0aW5nIHJlbGF0ZXMgdG8gc2NhbGluZyB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfU2l6ZV9SZXF1ZXN0X1R5cGVfCi0gIHsKLSAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMLAotICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1JFQUxfRElNLAotICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX0JCT1gsCi0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfQ0VMTCwKLSAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9TQ0FMRVMsCi0KLSAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9NQVgKLQotICB9IEZUX1NpemVfUmVxdWVzdF9UeXBlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIHNpemUgcmVxdWVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHlwZSAgICAgICAgICAgOjogU2VlIEBGVF9TaXplX1JlcXVlc3RfVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgICAgICAgICA6OiBUaGUgZGVzaXJlZCB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgICAgICAgIDo6IFRoZSBkZXNpcmVkIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaVJlc29sdXRpb24gOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbi4gIElmIHNldCB0byB6ZXJvLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGB3aWR0aCcgaXMgdHJlYXRlZCBhcyBhIDI2LjYgZnJhY3Rpb25hbCBwaXhlbCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRSZXNvbHV0aW9uIDo6IFRoZSB2ZXJ0aWNhbCByZXNvbHV0aW9uLiAgSWYgc2V0IHRvIHplcm8sICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBgaGVpZ2h0JyBpcyB0cmVhdGVkIGFzIGEgMjYuNiBmcmFjdGlvbmFsIHBpeGVsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYHdpZHRoJyBpcyB6ZXJvLCB0aGVuIHRoZSBob3Jpem9udGFsIHNjYWxpbmcgdmFsdWUgaXMgc2V0ICAgICAgKi8KLSAgLyogICAgZXF1YWwgdG8gdGhlIHZlcnRpY2FsIHNjYWxpbmcgdmFsdWUsIGFuZCB2aWNlIHZlcnNhLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9SZXF1ZXN0UmVjXwotICB7Ci0gICAgRlRfU2l6ZV9SZXF1ZXN0X1R5cGUgIHR5cGU7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgIHdpZHRoOwotICAgIEZUX0xvbmcgICAgICAgICAgICAgICBoZWlnaHQ7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgIGhvcmlSZXNvbHV0aW9uOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICB2ZXJ0UmVzb2x1dGlvbjsKLQotICB9IEZUX1NpemVfUmVxdWVzdFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgc2l6ZSByZXF1ZXN0IHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2l6ZV9SZXF1ZXN0UmVjXyAgKkZUX1NpemVfUmVxdWVzdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlcXVlc3RfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlc2l6ZSB0aGUgc2NhbGUgb2YgdGhlIGFjdGl2ZSBARlRfU2l6ZSBvYmplY3QgaW4gYSBmYWNlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcSAgOjogQSBwb2ludGVyIHRvIGEgQEZUX1NpemVfUmVxdWVzdFJlYy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsdGhvdWdoIGRyaXZlcnMgbWF5IHNlbGVjdCB0aGUgYml0bWFwIHN0cmlrZSBtYXRjaGluZyB0aGUgICAgICAgICAqLwotICAvKiAgICByZXF1ZXN0LCB5b3Ugc2hvdWxkIG5vdCByZWx5IG9uIHRoaXMgaWYgeW91IGludGVuZCB0byBzZWxlY3QgYSAgICAgKi8KLSAgLyogICAgcGFydGljdWxhciBiaXRtYXAgc3RyaWtlLiAgVXNlIEBGVF9TZWxlY3RfU2l6ZSBpbnN0ZWFkIGluIHRoYXQgICAgICovCi0gIC8qICAgIGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1JlcXVlc3RfU2l6ZSggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfQ2hhcl9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIEBGVF9SZXF1ZXN0X1NpemUgdG8gcmVxdWVzdCB0aGUgbm9taW5hbCBzaXplICAgKi8KLSAgLyogICAgKGluIHBvaW50cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl93aWR0aCAgICAgIDo6IFRoZSBub21pbmFsIHdpZHRoLCBpbiAyNi42IGZyYWN0aW9uYWwgcG9pbnRzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX2hlaWdodCAgICAgOjogVGhlIG5vbWluYWwgaGVpZ2h0LCBpbiAyNi42IGZyYWN0aW9uYWwgcG9pbnRzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcnpfcmVzb2x1dGlvbiA6OiBUaGUgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydF9yZXNvbHV0aW9uIDo6IFRoZSB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgZWl0aGVyIHRoZSBjaGFyYWN0ZXIgd2lkdGggb3IgaGVpZ2h0IGlzIHplcm8sIGl0IGlzIHNldCBlcXVhbCAgICovCi0gIC8qICAgIHRvIHRoZSBvdGhlciB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgZWl0aGVyIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHJlc29sdXRpb24gaXMgemVybywgaXQgaXMgc2V0ICovCi0gIC8qICAgIGVxdWFsIHRvIHRoZSBvdGhlciB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBjaGFyYWN0ZXIgd2lkdGggb3IgaGVpZ2h0IHNtYWxsZXIgdGhhbiAxcHQgaXMgc2V0IHRvIDFwdDsgaWYgICAgICovCi0gIC8qICAgIGJvdGggcmVzb2x1dGlvbiB2YWx1ZXMgYXJlIHplcm8sIHRoZXkgYXJlIHNldCB0byA3MmRwaS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X0NoYXJfU2l6ZSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgY2hhcl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgY2hhcl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGhvcnpfcmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgdmVydF9yZXNvbHV0aW9uICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfUGl4ZWxfU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIEBGVF9SZXF1ZXN0X1NpemUgdG8gcmVxdWVzdCB0aGUgbm9taW5hbCBzaXplICAgKi8KLSAgLyogICAgKGluIHBpeGVscykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl4ZWxfd2lkdGggIDo6IFRoZSBub21pbmFsIHdpZHRoLCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXhlbF9oZWlnaHQgOjogVGhlIG5vbWluYWwgaGVpZ2h0LCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZXRfUGl4ZWxfU2l6ZXMoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcGl4ZWxfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcGl4ZWxfaGVpZ2h0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb2FkX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gbG9hZCBhIHNpbmdsZSBnbHlwaCBpbnRvIHRoZSBnbHlwaCBzbG90IG9mIGEgICAgKi8KLSAgLyogICAgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGlzIGxvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggaW4gdGhlIGZvbnQgZmlsZS4gIEZvciAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBDSUQta2V5ZWQgZm9udHMgKGVpdGhlciBpbiBQUyBvciBpbiBDRkYgZm9ybWF0KSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdGhpcyBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIENJRCB2YWx1ZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgQEZUX0xPQURfWFhYIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxvYWRlZCBnbHlwaCBtYXkgYmUgdHJhbnNmb3JtZWQuICBTZWUgQEZUX1NldF9UcmFuc2Zvcm0gZm9yICAgICovCi0gIC8qICAgIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIHN1YnNldHRlZCBDSUQta2V5ZWQgZm9udHMsIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgaXMgICAgICAgICovCi0gIC8qICAgIHJldHVybmVkIGZvciBpbnZhbGlkIENJRCB2YWx1ZXMgKHRoaXMgaXMsIGZvciBDSUQgdmFsdWVzIHdoaWNoICAgICAqLwotICAvKiAgICBkb24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBnbHlwaCBpbiB0aGUgZm9udCkuICBTZWUgdGhlIGRpc2N1c3Npb24gKi8KLSAgLyogICAgb2YgdGhlIEBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEIGZsYWcgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTG9hZF9HbHlwaCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGxvYWRfZmxhZ3MgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvYWRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIGludG8gdGhlIGdseXBoIHNsb3Qgb2YgYSAgICAqLwotICAvKiAgICBmYWNlIG9iamVjdCwgYWNjb3JkaW5nIHRvIGl0cyBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaXMgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9jb2RlICAgOjogVGhlIGdseXBoJ3MgY2hhcmFjdGVyIGNvZGUsIGFjY29yZGluZyB0byB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgY2hhcm1hcCB1c2VkIGluIHRoZSBmYWNlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogQSBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBsb2FkIGZvciB0aGlzIGdseXBoLiAgVGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sIHdoZXRoZXIgdGhlIG91dGxpbmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNjYWxlZCwgd2hldGhlciB0byBsb2FkIGJpdG1hcHMgb3Igbm90LCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gc2ltcGx5IGNhbGxzIEBGVF9HZXRfQ2hhcl9JbmRleCBhbmQgQEZUX0xvYWRfR2x5cGguICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0xvYWRfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfTE9BRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfTG9hZF9HbHlwaCB0byBpbmRpY2F0ZQotICAgKiAgIHdoYXQga2luZCBvZiBvcGVyYXRpb25zIHRvIHBlcmZvcm0gZHVyaW5nIGdseXBoIGxvYWRpbmcuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfTE9BRF9ERUZBVUxUIDo6Ci0gICAqICAgICBDb3JyZXNwb25kaW5nIHRvIDAsIHRoaXMgdmFsdWUgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBnbHlwaCBsb2FkCi0gICAqICAgICBvcGVyYXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKLSAgICoKLSAgICogICAgIDEuIEZyZWVUeXBlIGxvb2tzIGZvciBhIGJpdG1hcCBmb3IgdGhlIGdseXBoIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAqICAgICAgICBmYWNlJ3MgY3VycmVudCBzaXplLiAgSWYgb25lIGlzIGZvdW5kLCB0aGUgZnVuY3Rpb24gcmV0dXJucy4KLSAgICogICAgICAgIFRoZSBiaXRtYXAgZGF0YSBjYW4gYmUgYWNjZXNzZWQgZnJvbSB0aGUgZ2x5cGggc2xvdCAoc2VlIG5vdGUKLSAgICogICAgICAgIGJlbG93KS4KLSAgICoKLSAgICogICAgIDIuIElmIG5vIGVtYmVkZGVkIGJpdG1hcCBpcyBzZWFyY2hlZCBvciBmb3VuZCwgRnJlZVR5cGUgbG9va3MgZm9yIGEKLSAgICogICAgICAgIHNjYWxhYmxlIG91dGxpbmUuICBJZiBvbmUgaXMgZm91bmQsIGl0IGlzIGxvYWRlZCBmcm9tIHRoZSBmb250Ci0gICAqICAgICAgICBmaWxlLCBzY2FsZWQgdG8gZGV2aWNlIHBpeGVscywgdGhlbiBgaGludGVkJyB0byB0aGUgcGl4ZWwgZ3JpZAotICAgKiAgICAgICAgaW4gb3JkZXIgdG8gb3B0aW1pemUgaXQuICBUaGUgb3V0bGluZSBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBmcm9tCi0gICAqICAgICAgICB0aGUgZ2x5cGggc2xvdCAoc2VlIG5vdGUgYmVsb3cpLgotICAgKgotICAgKiAgICAgTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoZSBnbHlwaCBsb2FkZXIgZG9lc24ndCByZW5kZXIgb3V0bGluZXMgaW50bwotICAgKiAgICAgYml0bWFwcy4gIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHVzZWQgdG8gbW9kaWZ5IHRoaXMgZGVmYXVsdAotICAgKiAgICAgYmVoYXZpb3VyIHRvIG1vcmUgc3BlY2lmaWMgYW5kIHVzZWZ1bCBjYXNlcy4KLSAgICoKLSAgICogICBGVF9MT0FEX05PX1NDQUxFIDo6Ci0gICAqICAgICBEb24ndCBzY2FsZSB0aGUgb3V0bGluZSBnbHlwaCBsb2FkZWQsIGJ1dCBrZWVwIGl0IGluIGZvbnQgdW5pdHMuCi0gICAqCi0gICAqICAgICBUaGlzIGZsYWcgaW1wbGllcyBARlRfTE9BRF9OT19ISU5USU5HIGFuZCBARlRfTE9BRF9OT19CSVRNQVAsIGFuZAotICAgKiAgICAgdW5zZXRzIEBGVF9MT0FEX1JFTkRFUi4KLSAgICoKLSAgICogICBGVF9MT0FEX05PX0hJTlRJTkcgOjoKLSAgICogICAgIERpc2FibGUgaGludGluZy4gIFRoaXMgZ2VuZXJhbGx5IGdlbmVyYXRlcyBgYmx1cnJpZXInIGJpdG1hcCBnbHlwaAotICAgKiAgICAgd2hlbiB0aGUgZ2x5cGggaXMgcmVuZGVyZWQgaW4gYW55IG9mIHRoZSBhbnRpLWFsaWFzZWQgbW9kZXMuICBTZWUKLSAgICogICAgIGFsc28gdGhlIG5vdGUgYmVsb3cuCi0gICAqCi0gICAqICAgICBUaGlzIGZsYWcgaXMgaW1wbGllZCBieSBARlRfTE9BRF9OT19TQ0FMRS4KLSAgICoKLSAgICogICBGVF9MT0FEX1JFTkRFUiA6OgotICAgKiAgICAgQ2FsbCBARlRfUmVuZGVyX0dseXBoIGFmdGVyIHRoZSBnbHlwaCBpcyBsb2FkZWQuICBCeSBkZWZhdWx0LCB0aGUKLSAgICogICAgIGdseXBoIGlzIHJlbmRlcmVkIGluIEBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgbW9kZS4gIFRoaXMgY2FuIGJlCi0gICAqICAgICBvdmVycmlkZGVuIGJ5IEBGVF9MT0FEX1RBUkdFVF9YWFggb3IgQEZUX0xPQURfTU9OT0NIUk9NRS4KLSAgICoKLSAgICogICAgIFRoaXMgZmxhZyBpcyB1bnNldCBieSBARlRfTE9BRF9OT19TQ0FMRS4KLSAgICoKLSAgICogICBGVF9MT0FEX05PX0JJVE1BUCA6OgotICAgKiAgICAgSWdub3JlIGJpdG1hcCBzdHJpa2VzIHdoZW4gbG9hZGluZy4gIEJpdG1hcC1vbmx5IGZvbnRzIGlnbm9yZSB0aGlzCi0gICAqICAgICBmbGFnLgotICAgKgotICAgKiAgICAgQEZUX0xPQURfTk9fU0NBTEUgYWx3YXlzIHNldHMgdGhpcyBmbGFnLgotICAgKgotICAgKiAgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIDo6Ci0gICAqICAgICBMb2FkIHRoZSBnbHlwaCBmb3IgdmVydGljYWwgdGV4dCBsYXlvdXQuICBfRG9uJ3RfIHVzZSBpdCBhcyBpdCBpcwotICAgKiAgICAgcHJvYmxlbWF0aWMgY3VycmVudGx5LgotICAgKgotICAgKiAgIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgOjoKLSAgICogICAgIEluZGljYXRlcyB0aGF0IHRoZSBhdXRvLWhpbnRlciBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgZm9udCdzIG5hdGl2ZQotICAgKiAgICAgaGludGVyLiAgU2VlIGFsc28gdGhlIG5vdGUgYmVsb3cuCi0gICAqCi0gICAqICAgRlRfTE9BRF9DUk9QX0JJVE1BUCA6OgotICAgKiAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZvbnQgZHJpdmVyIHNob3VsZCBjcm9wIHRoZSBsb2FkZWQgYml0bWFwIGdseXBoCi0gICAqICAgICAoaS5lLiwgcmVtb3ZlIGFsbCBzcGFjZSBhcm91bmQgaXRzIGJsYWNrIGJpdHMpLiAgTm90IGFsbCBkcml2ZXJzCi0gICAqICAgICBpbXBsZW1lbnQgdGhpcy4KLSAgICoKLSAgICogICBGVF9MT0FEX1BFREFOVElDIDo6Ci0gICAqICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9udCBkcml2ZXIgc2hvdWxkIHBlcmZvcm0gcGVkYW50aWMgdmVyaWZpY2F0aW9ucwotICAgKiAgICAgZHVyaW5nIGdseXBoIGxvYWRpbmcuICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIGRldGVjdCBicm9rZW4gZ2x5cGhzCi0gICAqICAgICBpbiBmb250cy4gIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIHRyaWVzIHRvIGhhbmRsZSBicm9rZW4gZm9udHMgYWxzby4KLSAgICoKLSAgICogICBGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCA6OgotICAgKiAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZvbnQgZHJpdmVyIHNob3VsZCBpZ25vcmUgdGhlIGdsb2JhbCBhZHZhbmNlCi0gICAqICAgICB3aWR0aCBkZWZpbmVkIGluIHRoZSBmb250LiAgQnkgZGVmYXVsdCwgdGhhdCB2YWx1ZSBpcyB1c2VkIGFzIHRoZQotICAgKiAgICAgYWR2YW5jZSB3aWR0aCBmb3IgYWxsIGdseXBocyB3aGVuIHRoZSBmYWNlIGhhcwotICAgKiAgICAgQEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCBzZXQuCi0gICAqCi0gICAqICAgICBUaGlzIGZsYWcgZXhpc3RzIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgKHRvIHN1cHBvcnQgYnVnZ3kgQ0pLCi0gICAqICAgICBmb250cykuCi0gICAqCi0gICAqICAgRlRfTE9BRF9OT19SRUNVUlNFIDo6Ci0gICAqICAgICBUaGlzIGZsYWcgaXMgb25seSB1c2VkIGludGVybmFsbHkuICBJdCBtZXJlbHkgaW5kaWNhdGVzIHRoYXQgdGhlCi0gICAqICAgICBmb250IGRyaXZlciBzaG91bGQgbm90IGxvYWQgY29tcG9zaXRlIGdseXBocyByZWN1cnNpdmVseS4gIEluc3RlYWQsCi0gICAqICAgICBpdCBzaG91bGQgc2V0IHRoZSBgbnVtX3N1YmdseXBoJyBhbmQgYHN1YmdseXBocycgdmFsdWVzIG9mIHRoZQotICAgKiAgICAgZ2x5cGggc2xvdCBhY2NvcmRpbmdseSwgYW5kIHNldCBgZ2x5cGgtPmZvcm1hdCcgdG8KLSAgICogICAgIEBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFLgotICAgKgotICAgKiAgICAgVGhlIGRlc2NyaXB0aW9uIG9mIHN1Yi1nbHlwaHMgaXMgbm90IGF2YWlsYWJsZSB0byBjbGllbnQKLSAgICogICAgIGFwcGxpY2F0aW9ucyBmb3Igbm93LgotICAgKgotICAgKiAgICAgVGhpcyBmbGFnIGltcGxpZXMgQEZUX0xPQURfTk9fU0NBTEUgYW5kIEBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0uCi0gICAqCi0gICAqICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNIDo6Ci0gICAqICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgdHJhbnNmb3JtIG1hdHJpeCBzZXQgYnkgQEZUX1NldF9UcmFuc2Zvcm0gc2hvdWxkCi0gICAqICAgICBiZSBpZ25vcmVkLgotICAgKgotICAgKiAgIEZUX0xPQURfTU9OT0NIUk9NRSA6OgotICAgKiAgICAgVGhpcyBmbGFnIGlzIHVzZWQgd2l0aCBARlRfTE9BRF9SRU5ERVIgdG8gaW5kaWNhdGUgdGhhdCB5b3Ugd2FudCB0bwotICAgKiAgICAgcmVuZGVyIGFuIG91dGxpbmUgZ2x5cGggdG8gYSAxLWJpdCBtb25vY2hyb21lIGJpdG1hcCBnbHlwaCwgd2l0aAotICAgKiAgICAgOCBwaXhlbHMgcGFja2VkIGludG8gZWFjaCBieXRlIG9mIHRoZSBiaXRtYXAgZGF0YS4KLSAgICoKLSAgICogICAgIE5vdGUgdGhhdCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGhpbnRpbmcgYWxnb3JpdGhtIHVzZWQuICBZb3UKLSAgICogICAgIHNob3VsZCB1c2UgQEZUX0xPQURfVEFSR0VUX01PTk8gaW5zdGVhZCBzbyB0aGF0IHRoZQotICAgKiAgICAgbW9ub2Nocm9tZS1vcHRpbWl6ZWQgaGludGluZyBhbGdvcml0aG0gaXMgdXNlZC4KLSAgICoKLSAgICogICBGVF9MT0FEX0xJTkVBUl9ERVNJR04gOjoKLSAgICogICAgIEluZGljYXRlcyB0aGF0IHRoZSBgbGluZWFySG9yaUFkdmFuY2UnIGFuZCBgbGluZWFyVmVydEFkdmFuY2UnCi0gICAqICAgICBmaWVsZHMgb2YgQEZUX0dseXBoU2xvdFJlYyBzaG91bGQgYmUga2VwdCBpbiBmb250IHVuaXRzLiAgU2VlCi0gICAqICAgICBARlRfR2x5cGhTbG90UmVjIGZvciBkZXRhaWxzLgotICAgKgotICAgKiAgIEZUX0xPQURfTk9fQVVUT0hJTlQgOjoKLSAgICogICAgIERpc2FibGUgYXV0by1oaW50ZXIuICBTZWUgYWxzbyB0aGUgbm90ZSBiZWxvdy4KLSAgICoKLSAgICoKLSAgICogICBGVF9MT0FEX0FEVkFOQ0VfT05MWSA6OgotICAgKiAgICAgVHJ5IHRvIG9ubHkgbG9hZCB0aGUgZ2x5cGggYWR2YW5jZSwgYW5kIG5vdGhpbmcgZWxzZS4gd2hlbiBzZXQsIHRoZQotICAgKiAgICAgY29udGVudCBvZiBmYWNlLT5nbHlwaCBtaWdodCBiZSBnYXJiYWdlLCBleGNlcHQgZm9yIHRoZQotICAgKiAgICAgZmFjZS0+Z2x5cGguYWR2YW5jZSB2ZWN0b3IuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEJ5IGRlZmF1bHQsIGhpbnRpbmcgaXMgZW5hYmxlZCBhbmQgdGhlIGZvbnQncyBuYXRpdmUgaGludGVyIChzZWUKLSAgICogICBARlRfRkFDRV9GTEFHX0hJTlRFUikgaXMgcHJlZmVycmVkIG92ZXIgdGhlIGF1dG8taGludGVyLiAgWW91IGNhbgotICAgKiAgIGRpc2FibGUgaGludGluZyBieSBzZXR0aW5nIEBGVF9MT0FEX05PX0hJTlRJTkcgb3IgY2hhbmdlIHRoZQotICAgKiAgIHByZWNlZGVuY2UgYnkgc2V0dGluZyBARlRfTE9BRF9GT1JDRV9BVVRPSElOVC4gIFlvdSBjYW4gYWxzbyBzZXQKLSAgICogICBARlRfTE9BRF9OT19BVVRPSElOVCBpbiBjYXNlIHlvdSBkb24ndCB3YW50IHRoZSBhdXRvLWhpbnRlciB0byBiZQotICAgKiAgIHVzZWQgYXQgYWxsLgotICAgKgotICAgKiAgIEJlc2lkZXMgZGVjaWRpbmcgd2hpY2ggaGludGVyIHRvIHVzZSwgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGljaAotICAgKiAgIGhpbnRpbmcgYWxnb3JpdGhtIHRvIHVzZS4gIFNlZSBARlRfTE9BRF9UQVJHRVRfWFhYIGZvciBkZXRhaWxzLgotICAgKi8KLSNkZWZpbmUgRlRfTE9BRF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIEZUX0xPQURfTk9fSElOVElORyAgICAgICAgICAgICAgICAgICAweDIKLSNkZWZpbmUgRlRfTE9BRF9SRU5ERVIgICAgICAgICAgICAgICAgICAgICAgIDB4NAotI2RlZmluZSBGVF9MT0FEX05PX0JJVE1BUCAgICAgICAgICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEZUX0xPQURfQ1JPUF9CSVRNQVAgICAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIEZUX0xPQURfUEVEQU5USUMgICAgICAgICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIICAweDIwMAotI2RlZmluZSBGVF9MT0FEX05PX1JFQ1VSU0UgICAgICAgICAgICAgICAgICAgMHg0MDAKLSNkZWZpbmUgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNICAgICAgICAgICAgIDB4ODAwCi0jZGVmaW5lIEZUX0xPQURfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICAgICAweDEwMDAKLSNkZWZpbmUgRlRfTE9BRF9MSU5FQVJfREVTSUdOICAgICAgICAgICAgICAgIDB4MjAwMAotI2RlZmluZSBGVF9MT0FEX05PX0FVVE9ISU5UICAgICAgICAgICAgICAgICAgMHg4MDAwVQotI2RlZmluZSBGVF9MT0FEX0FEVkFOQ0VfT05MWSAgICAgICAgICAgICAgICAgMHgxMDAwMFUKLQotICAvKiB1c2VkIGludGVybmFsbHkgb25seSBieSBjZXJ0YWluIGZvbnQgZHJpdmVycyAhICovCi0jZGVmaW5lIEZUX0xPQURfU0JJVFNfT05MWSAgICAgICAgICAgICAgICAgICAweDQwMDAKLQotICAvKiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX0xPQURfVEFSR0VUX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbHVlcyB0aGF0IGFyZSB1c2VkIHRvIHNlbGVjdCBhIHNwZWNpZmljIGhpbnRpbmcgYWxnb3JpdGhtCi0gICAqICAgdG8gdXNlIGJ5IHRoZSBoaW50ZXIuICBZb3Ugc2hvdWxkIE9SIG9uZSBvZiB0aGVzZSB2YWx1ZXMgdG8geW91cgotICAgKiAgIGBsb2FkX2ZsYWdzJyB3aGVuIGNhbGxpbmcgQEZUX0xvYWRfR2x5cGguCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IGZvbnQncyBuYXRpdmUgaGludGVycyBtYXkgaWdub3JlIHRoZSBoaW50aW5nIGFsZ29yaXRobSB5b3UKLSAgICogICBoYXZlIHNwZWNpZmllZCAoZS5nLiwgdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyKS4gIFlvdSBjYW4gc2V0Ci0gICAqICAgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgdG8gZW5zdXJlIHRoYXQgdGhlIGF1dG8taGludGVyIGlzIHVzZWQuCi0gICAqCi0gICAqICAgQWxzbyBub3RlIHRoYXQgQEZUX0xPQURfVEFSR0VUX0xJR0hUIGlzIGFuIGV4Y2VwdGlvbiwgaW4gdGhhdCBpdAotICAgKiAgIGFsd2F5cyBpbXBsaWVzIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5ULgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX0xPQURfVEFSR0VUX05PUk1BTCA6OgotICAgKiAgICAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZGVmYXVsdCBoaW50aW5nIGFsZ29yaXRobSwgb3B0aW1pemVkIGZvcgotICAgKiAgICAgc3RhbmRhcmQgZ3JheS1sZXZlbCByZW5kZXJpbmcuICBGb3IgbW9ub2Nocm9tZSBvdXRwdXQsIHVzZQotICAgKiAgICAgQEZUX0xPQURfVEFSR0VUX01PTk8gaW5zdGVhZC4KLSAgICoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9MSUdIVCA6OgotICAgKiAgICAgQSBsaWdodGVyIGhpbnRpbmcgYWxnb3JpdGhtIGZvciBub24tbW9ub2Nocm9tZSBtb2Rlcy4gIE1hbnkKLSAgICogICAgIGdlbmVyYXRlZCBnbHlwaHMgYXJlIG1vcmUgZnV6enkgYnV0IGJldHRlciByZXNlbWJsZSBpdHMgb3JpZ2luYWwKLSAgICogICAgIHNoYXBlLiAgQSBiaXQgbGlrZSByZW5kZXJpbmcgb24gTWFjIE9TIFguCi0gICAqCi0gICAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGlzIHRhcmdldCBpbXBsaWVzIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5ULgotICAgKgotICAgKiAgIEZUX0xPQURfVEFSR0VUX01PTk8gOjoKLSAgICogICAgIFN0cm9uZyBoaW50aW5nIGFsZ29yaXRobSB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIG1vbm9jaHJvbWUKLSAgICogICAgIG91dHB1dC4gIFRoZSByZXN1bHQgaXMgcHJvYmFibHkgdW5wbGVhc2FudCBpZiB0aGUgZ2x5cGggaXMgcmVuZGVyZWQKLSAgICogICAgIGluIG5vbi1tb25vY2hyb21lIG1vZGVzLgotICAgKgotICAgKiAgIEZUX0xPQURfVEFSR0VUX0xDRCA6OgotICAgKiAgICAgQSB2YXJpYW50IG9mIEBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgb3B0aW1pemVkIGZvciBob3Jpem9udGFsbHkKLSAgICogICAgIGRlY2ltYXRlZCBMQ0QgZGlzcGxheXMuCi0gICAqCi0gICAqICAgRlRfTE9BRF9UQVJHRVRfTENEX1YgOjoKLSAgICogICAgIEEgdmFyaWFudCBvZiBARlRfTE9BRF9UQVJHRVRfTk9STUFMIG9wdGltaXplZCBmb3IgdmVydGljYWxseQotICAgKiAgICAgZGVjaW1hdGVkIExDRCBkaXNwbGF5cy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCB1c2Ugb25seSBfb25lXyBvZiB0aGUgRlRfTE9BRF9UQVJHRVRfWFhYIHZhbHVlcyBpbiB5b3VyCi0gICAqICAgYGxvYWRfZmxhZ3MnLiAgVGhleSBjYW4ndCBiZSBPUmVkLgotICAgKgotICAgKiAgIElmIEBGVF9MT0FEX1JFTkRFUiBpcyBhbHNvIHNldCwgdGhlIGdseXBoIGlzIHJlbmRlcmVkIGluIHRoZQotICAgKiAgIGNvcnJlc3BvbmRpbmcgbW9kZSAoaS5lLiwgdGhlIG1vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgdXNlZCBhbGdvcml0aG0KLSAgICogICBiZXN0KSB1bmxlc3MgQEZUX0xPQURfTU9OT0NIUk9NRSBpcyBzZXQuCi0gICAqCi0gICAqICAgWW91IGNhbiB1c2UgYSBoaW50aW5nIGFsZ29yaXRobSB0aGF0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byB0aGUgc2FtZQotICAgKiAgIHJlbmRlcmluZyBtb2RlLiAgQXMgYW4gZXhhbXBsZSwgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBgbGlnaHQnCi0gICAqICAgaGludGluZyBhbGdvcml0aG0gYW5kIGhhdmUgdGhlIHJlc3VsdHMgcmVuZGVyZWQgaW4gaG9yaXpvbnRhbCBMQ0QKLSAgICogICBwaXhlbCBtb2RlLCB3aXRoIGNvZGUgbGlrZQotICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICogICAgICAgICAgICAgICAgICAgICAgbG9hZF9mbGFncyB8IEZUX0xPQURfVEFSR0VUX0xJR0hUICk7Ci0gICAqCi0gICAqICAgICAgIEZUX1JlbmRlcl9HbHlwaCggZmFjZS0+Z2x5cGgsIEZUX1JFTkRFUl9NT0RFX0xDRCApOwotICAgKiAgICAgfQotICAgKi8KLQotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF8oIHggKSAgICAgICggKEZUX0ludDMyKSggKHgpICYgMTUgKSA8PCAxNiApCi0KLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTk9STUFMICAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX05PUk1BTCApCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xJR0hUICAgICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MSUdIVCAgKQotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9NT05PICAgICAgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTU9OTyAgICkKLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTENEICAgICAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX0xDRCAgICApCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xDRF9WICAgICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MQ0RfViAgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9NT0RFCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIEBGVF9SZW5kZXJfTW9kZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAgICogICBARlRfTE9BRF9UQVJHRVRfWFhYIHZhbHVlLgotICAgKgotICAgKi8KLQotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9NT0RFKCB4ICkgICggKEZUX1JlbmRlcl9Nb2RlKSggKCAoeCkgPj4gMTYgKSAmIDE1ICkgKQotCi0gIC8qICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gc2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gZ2x5cGggKi8KLSAgLyogICAgaW1hZ2VzIHdoZW4gdGhleSBhcmUgbG9hZGVkIGludG8gYSBnbHlwaCBzbG90IHRocm91Z2ggICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0dseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hdHJpeCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWF0aW9uJ3MgMngyIG1hdHJpeC4gIFVzZSAwIGZvciAqLwotICAvKiAgICAgICAgICAgICAgdGhlIGlkZW50aXR5IG1hdHJpeC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGEgIDo6IEEgcG9pbnRlciB0byB0aGUgdHJhbnNsYXRpb24gdmVjdG9yLiAgVXNlIDAgZm9yIHRoZSBudWxsICovCi0gIC8qICAgICAgICAgICAgICB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvbmx5IGFwcGxpZWQgdG8gc2NhbGFibGUgaW1hZ2UgZm9ybWF0cyBhZnRlciAqLwotICAvKiAgICB0aGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkLiAgSXQgbWVhbnMgdGhhdCBoaW50aW5nIGlzIHVuYWx0ZXJlZCBieSAgKi8KLSAgLyogICAgdGhlIHRyYW5zZm9ybWF0aW9uIGFuZCBpcyBwZXJmb3JtZWQgb24gdGhlIGNoYXJhY3RlciBzaXplIGdpdmVuIGluICovCi0gIC8qICAgIHRoZSBsYXN0IGNhbGwgdG8gQEZUX1NldF9DaGFyX1NpemUgb3IgQEZUX1NldF9QaXhlbF9TaXplcy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoaXMgYWxzbyB0cmFuc2Zvcm1zIHRoZSBgZmFjZS5nbHlwaC5hZHZhbmNlJyBmaWVsZCwgYnV0ICovCi0gIC8qICAgICpub3QqIHRoZSB2YWx1ZXMgaW4gYGZhY2UuZ2x5cGgubWV0cmljcycuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU2V0X1RyYW5zZm9ybSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBkZWx0YSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdHlwZSB0aGF0IGxpc3RzIHRoZSByZW5kZXIgbW9kZXMgc3VwcG9ydGVkIGJ5ICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIDIuICBFYWNoIG1vZGUgY29ycmVzcG9uZHMgdG8gYSBzcGVjaWZpYyB0eXBlIG9mIHNjYW5saW5lICAqLwotICAvKiAgICBjb252ZXJzaW9uIHBlcmZvcm1lZCBvbiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBiaXRtYXAgZm9udHMgdGhlIGBiaXRtYXAtPnBpeGVsX21vZGUnIGZpZWxkIGluIHRoZSAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSBnaXZlcyB0aGUgZm9ybWF0IG9mIHRoZSByZXR1cm5lZCAgICAgICAgKi8KLSAgLyogICAgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTk9STUFMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCByZW5kZXIgbW9kZTsgaXQgY29ycmVzcG9uZHMgdG8gOC1iaXQgICAgICAgICAqLwotICAvKiAgICAgIGFudGktYWxpYXNlZCBiaXRtYXBzLCB1c2luZyAyNTYgbGV2ZWxzIG9mIG9wYWNpdHkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xJR0hUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBARlRfUkVOREVSX01PREVfTk9STUFMLiAgSXQgaXMgb25seSAgICAgICAgKi8KLSAgLyogICAgICBkZWZpbmVkIGFzIGEgc2VwYXJhdGUgdmFsdWUgYmVjYXVzZSByZW5kZXIgbW9kZXMgYXJlIGFsc28gdXNlZCAgICovCi0gIC8qICAgICAgaW5kaXJlY3RseSB0byBkZWZpbmUgaGludGluZyBhbGdvcml0aG0gc2VsZWN0b3JzLiAgU2VlICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9MT0FEX1RBUkdFVF9YWFggZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX01PTk8gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byAxLWJpdCBiaXRtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xDRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byBob3Jpem9udGFsIFJHQiBhbmQgQkdSIHN1Yi1waXhlbCAgICAgICAgKi8KLSAgLyogICAgICBkaXNwbGF5cywgbGlrZSBMQ0Qtc2NyZWVucy4gIEl0IHByb2R1Y2VzIDgtYml0IGJpdG1hcHMgdGhhdCBhcmUgICovCi0gIC8qICAgICAgMyB0aW1lcyB0aGUgd2lkdGggb2YgdGhlIG9yaWdpbmFsIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzLCBhbmQgICAqLwotICAvKiAgICAgIHdoaWNoIHVzZSB0aGUgQEZUX1BJWEVMX01PREVfTENEIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xDRF9WIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byB2ZXJ0aWNhbCBSR0IgYW5kIEJHUiBzdWItcGl4ZWwgZGlzcGxheXMgKi8KLSAgLyogICAgICAobGlrZSBQREEgc2NyZWVucywgcm90YXRlZCBMQ0QgZGlzcGxheXMsIGV0Yy4pLiAgSXQgcHJvZHVjZXMgICAgICovCi0gIC8qICAgICAgOC1iaXQgYml0bWFwcyB0aGF0IGFyZSAzIHRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIG9yaWdpbmFsICAgICAgICAqLwotICAvKiAgICAgIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzIGFuZCB1c2UgdGhlIEBGVF9QSVhFTF9NT0RFX0xDRF9WIG1vZGUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBMQ0Qtb3B0aW1pemVkIGdseXBoIGJpdG1hcHMgcHJvZHVjZWQgYnkgRlRfUmVuZGVyX0dseXBoIGNhbiBiZSAgKi8KLSAgLyogICBmaWx0ZXJlZCB0byByZWR1Y2UgY29sb3ItZnJpbmdlcyBieSB1c2luZyBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIgICovCi0gIC8qICAgKG5vdCBhY3RpdmUgaW4gdGhlIGRlZmF1bHQgYnVpbGRzKS4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gICAgICAqLwotICAvKiAgIGVpdGhlciBjYWxsIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciAoaWYgYXZhaWxhYmxlKSBvciBkbyB0aGUgICAgICAgKi8KLSAgLyogICBmaWx0ZXJpbmcgaXRzZWxmLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1JlbmRlcl9Nb2RlXwotICB7Ci0gICAgRlRfUkVOREVSX01PREVfTk9STUFMID0gMCwKLSAgICBGVF9SRU5ERVJfTU9ERV9MSUdIVCwKLSAgICBGVF9SRU5ERVJfTU9ERV9NT05PLAotICAgIEZUX1JFTkRFUl9NT0RFX0xDRCwKLSAgICBGVF9SRU5ERVJfTU9ERV9MQ0RfViwKLQotICAgIEZUX1JFTkRFUl9NT0RFX01BWAotCi0gIH0gRlRfUmVuZGVyX01vZGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9yZW5kZXJfbW9kZV94eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQuICBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1JlbmRlcl9Nb2RlIHZhbHVlcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmdF9yZW5kZXJfbW9kZV9ub3JtYWwgOjogc2VlIEBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZnRfcmVuZGVyX21vZGVfbW9ubyAgIDo6IHNlZSBARlRfUkVOREVSX01PREVfTU9OTyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfcmVuZGVyX21vZGVfbm9ybWFsICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwKLSNkZWZpbmUgZnRfcmVuZGVyX21vZGVfbW9ubyAgICBGVF9SRU5ERVJfTU9ERV9NT05PCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0IGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgdG8gYSBiaXRtYXAuICBJdCBkb2VzIHNvIGJ5IGluc3BlY3RpbmcgKi8KLSAgLyogICAgdGhlIGdseXBoIGltYWdlIGZvcm1hdCwgZmluZGluZyB0aGUgcmVsZXZhbnQgcmVuZGVyZXIsIGFuZCAgICAgICAgICovCi0gIC8qICAgIGludm9raW5nIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBnbHlwaCBzbG90IGNvbnRhaW5pbmcgdGhlIGltYWdlIHRvICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjb252ZXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZW5kZXJfbW9kZSA6OiBUaGlzIGlzIHRoZSByZW5kZXIgbW9kZSB1c2VkIHRvIHJlbmRlciB0aGUgZ2x5cGggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2UgaW50byBhIGJpdG1hcC4gIFNlZSBARlRfUmVuZGVyX01vZGUgZm9yIGEgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1JlbmRlcl9HbHlwaCggRlRfR2x5cGhTbG90ICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9LZXJuaW5nX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB1c2VkIHRvIHNwZWNpZnkgd2hpY2gga2VybmluZyB2YWx1ZXMgdG8gcmV0dXJuIGluICAgKi8KLSAgLyogICAgQEZUX0dldF9LZXJuaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS0VSTklOR19ERUZBVUxUICA6OiBSZXR1cm4gc2NhbGVkIGFuZCBncmlkLWZpdHRlZCBrZXJuaW5nICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VzICh2YWx1ZSBpcyAwKS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS0VSTklOR19VTkZJVFRFRCA6OiBSZXR1cm4gc2NhbGVkIGJ1dCB1bi1ncmlkLWZpdHRlZCBrZXJuaW5nICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS0VSTklOR19VTlNDQUxFRCA6OiBSZXR1cm4gdGhlIGtlcm5pbmcgdmVjdG9yIGluIG9yaWdpbmFsIGZvbnQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9LZXJuaW5nX01vZGVfCi0gIHsKLSAgICBGVF9LRVJOSU5HX0RFRkFVTFQgID0gMCwKLSAgICBGVF9LRVJOSU5HX1VORklUVEVELAotICAgIEZUX0tFUk5JTkdfVU5TQ0FMRUQKLQotICB9IEZUX0tlcm5pbmdfTW9kZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPENvbnN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2tlcm5pbmdfZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgY29uc3RhbnQgaXMgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgQEZUX0tFUk5JTkdfREVGQVVMVCAgICAgICAqLwotICAvKiAgICBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X2tlcm5pbmdfZGVmYXVsdCAgIEZUX0tFUk5JTkdfREVGQVVMVAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Q29uc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfa2VybmluZ191bmZpdHRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBjb25zdGFudCBpcyBkZXByZWNhdGVkLiAgUGxlYXNlIHVzZSBARlRfS0VSTklOR19VTkZJVFRFRCAgICAgICovCi0gIC8qICAgIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfa2VybmluZ191bmZpdHRlZCAgRlRfS0VSTklOR19VTkZJVFRFRAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Q29uc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfa2VybmluZ191bnNjYWxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBjb25zdGFudCBpcyBkZXByZWNhdGVkLiAgUGxlYXNlIHVzZSBARlRfS0VSTklOR19VTlNDQUxFRCAgICAgICovCi0gIC8qICAgIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfa2VybmluZ191bnNjYWxlZCAgRlRfS0VSTklOR19VTlNDQUxFRAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0tlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBiZXR3ZWVuIHR3byBnbHlwaHMgb2YgYSBzYW1lIGZhY2UuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0X2dseXBoICA6OiBUaGUgaW5kZXggb2YgdGhlIGxlZnQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJpZ2h0X2dseXBoIDo6IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2Vybl9tb2RlICAgOjogU2VlIEBGVF9LZXJuaW5nX01vZGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIERldGVybWluZXMgdGhlIHNjYWxlIGFuZCBkaW1lbnNpb24gb2YgdGhlIHJldHVybmVkICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBrZXJuaW5nIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBha2VybmluZyAgICA6OiBUaGUga2VybmluZyB2ZWN0b3IuICBUaGlzIGlzIGVpdGhlciBpbiBmb250IHVuaXRzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgb3IgaW4gcGl4ZWxzICgyNi42IGZvcm1hdCkgZm9yIHNjYWxhYmxlIGZvcm1hdHMsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzIGZvcm1hdHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgaG9yaXpvbnRhbCBsYXlvdXRzIChsZWZ0LXRvLXJpZ2h0ICYgcmlnaHQtdG8tbGVmdCkgYXJlICAgICAgICAqLwotICAvKiAgICBzdXBwb3J0ZWQgYnkgdGhpcyBtZXRob2QuICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICAgKi8KLSAgLyogICAga2VybmluZ3MsIGFyZSBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoaXMgQVBJIGZ1bmN0aW9uIC0tIHRoZXkgY2FuIGJlICovCi0gIC8qICAgIGltcGxlbWVudGVkIHRocm91Z2ggZm9ybWF0LXNwZWNpZmljIGludGVyZmFjZXMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9LZXJuaW5nKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAga2Vybl9tb2RlLAotICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAqYWtlcm5pbmcgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9UcmFja19LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgdHJhY2sga2VybmluZyBmb3IgYSBnaXZlbiBmYWNlIG9iamVjdCBhdCBhIGdpdmVuIHNpemUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRfc2l6ZSAgOjogVGhlIHBvaW50IHNpemUgaW4gMTYuMTYgZnJhY3Rpb25hbCBwb2ludHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWdyZWUgICAgICA6OiBUaGUgZGVncmVlIG9mIHRpZ2h0bmVzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBha2VybmluZyAgICA6OiBUaGUga2VybmluZyBpbiAxNi4xNiBmcmFjdGlvbmFsIHBvaW50cy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfVHJhY2tfS2VybmluZyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICBwb2ludF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGFrZXJuaW5nICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfR2x5cGhfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgQVNDSUkgbmFtZSBvZiBhIGdpdmVuIGdseXBoIGluIGEgZmFjZS4gIFRoaXMgb25seSAgICAgKi8KLSAgLyogICAgd29ya3MgZm9yIHRob3NlIGZhY2VzIHdoZXJlIEBGVF9IQVNfR0xZUEhfTkFNRVMoZmFjZSkgcmV0dXJucyAxLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlcl9tYXggIDo6IFRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmZXIgICAgICA6OiBBIHBvaW50ZXIgdG8gYSB0YXJnZXQgYnVmZmVyIHdoZXJlIHRoZSBuYW1lIGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY29waWVkIHRvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIGZhY2UgZG9lc24ndCBwcm92aWRlIGdseXBoIG5hbWVzIG9yIGlmICovCi0gIC8qICAgIHRoZSBnbHlwaCBpbmRleCBpcyBpbnZhbGlkLiAgSW4gYWxsIGNhc2VzIG9mIGZhaWx1cmUsIHRoZSBmaXJzdCAgICAqLwotICAvKiAgICBieXRlIG9mIGBidWZmZXInIGlzIHNldCB0byAwIHRvIGluZGljYXRlIGFuIGVtcHR5IG5hbWUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBuYW1lIGlzIHRydW5jYXRlZCB0byBmaXQgd2l0aGluIHRoZSBidWZmZXIgaWYgaXQgaXMgdG9vICAqLwotICAvKiAgICBsb25nLiAgVGhlIHJldHVybmVkIHN0cmluZyBpcyBhbHdheXMgemVyby10ZXJtaW5hdGVkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IGNvbXBpbGVkIHdpdGhpbiB0aGUgbGlicmFyeSBpZiB0aGUgY29uZmlnICAgICAqLwotICAvKiAgICBtYWNybyBgRlRfQ09ORklHX09QVElPTl9OT19HTFlQSF9OQU1FUycgaXMgZGVmaW5lZCBpbiAgICAgICAgICAgICAgKi8KLSAgLyogICAgYGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9ucy5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0dseXBoX05hbWUoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9Qb3N0c2NyaXB0X05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBBU0NJSSBQb3N0c2NyaXB0IG5hbWUgb2YgYSBnaXZlbiBmYWNlLCBpZiBhdmFpbGFibGUuICAqLwotICAvKiAgICBUaGlzIG9ubHkgd29ya3Mgd2l0aCBQb3N0c2NyaXB0IGFuZCBUcnVlVHlwZSBmb250cy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHBvaW50ZXIgdG8gdGhlIGZhY2UncyBQb3N0c2NyaXB0IG5hbWUuICBOVUxMIGlmIHVuYXZhaWxhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyBvd25lZCBieSB0aGUgZmFjZSBhbmQgaXMgZGVzdHJveWVkIHdpdGggICAgKi8KLSAgLyogICAgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIGNvbnN0IGNoYXIqICkKLSAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2VsZWN0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VsZWN0IGEgZ2l2ZW4gY2hhcm1hcCBieSBpdHMgZW5jb2RpbmcgdGFnIChhcyBsaXN0ZWQgaW4gICAgICAgICAgICovCi0gIC8qICAgIGBmcmVldHlwZS5oJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVuY29kaW5nIDo6IEEgaGFuZGxlIHRvIHRoZSBzZWxlY3RlZCBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiBubyBjaGFybWFwIGluIHRoZSBmYWNlICAgICAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kcyB0byB0aGUgZW5jb2RpbmcgcXVlcmllZCBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlY2F1c2UgbWFueSBmb250cyBjb250YWluIG1vcmUgdGhhbiBhIHNpbmdsZSBjbWFwIGZvciBVbmljb2RlICAgICAqLwotICAvKiAgICBlbmNvZGluZywgdGhpcyBmdW5jdGlvbiBoYXMgc29tZSBzcGVjaWFsIGNvZGUgdG8gc2VsZWN0IHRoZSBvbmUgICAgKi8KLSAgLyogICAgd2hpY2ggY292ZXJzIFVuaWNvZGUgYmVzdCAoYGJlc3QnIGluIHRoZSBzZW5zZSB0aGF0IGEgVUNTLTQgY21hcCAgICovCi0gIC8qICAgIGlzIHByZWZlcnJlZCB0byBhIFVDUy0yIGNtYXApLiAgSXQgaXMgdGh1cyBwcmVmZXJhYmxlIHRvICAgICAgICAgICAqLwotICAvKiAgICBARlRfU2V0X0NoYXJtYXAgaW4gdGhpcyBjYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZWxlY3RfQ2hhcm1hcCggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9FbmNvZGluZyAgZW5jb2RpbmcgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlbGVjdCBhIGdpdmVuIGNoYXJtYXAgZm9yIGNoYXJhY3RlciBjb2RlIHRvIGdseXBoIGluZGV4IG1hcHBpbmcuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgOjogQSBoYW5kbGUgdG8gdGhlIHNlbGVjdGVkIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgY2hhcm1hcCBpcyBub3QgcGFydCBvZiAgICAgICAqLwotICAvKiAgICB0aGUgZmFjZSAoaS5lLiwgaWYgaXQgaXMgbm90IGxpc3RlZCBpbiB0aGUgYGZhY2UtPmNoYXJtYXBzJyAgICAgICAgKi8KLSAgLyogICAgdGFibGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBhbHNvIGZhaWxzIGlmIGEgdHlwZSAxNCBjaGFybWFwIGlzIHNlbGVjdGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZXRfQ2hhcm1hcCggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9HZXRfQ2hhcm1hcF9JbmRleAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0cmlldmUgaW5kZXggb2YgYSBnaXZlbiBjaGFybWFwLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgY2hhcm1hcCA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gYSBjaGFybWFwLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSBpbmRleCBpbnRvIHRoZSBhcnJheSBvZiBjaGFyYWN0ZXIgbWFwcyB3aXRoaW4gdGhlIGZhY2UgdG8gd2hpY2gKLSAgICogICBgY2hhcm1hcCcgYmVsb25ncy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfSW50ICkKLSAgRlRfR2V0X0NoYXJtYXBfSW5kZXgoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZS4gIFRoaXMgZnVuY3Rpb24gICAqLwotICAvKiAgICB1c2VzIGEgY2hhcm1hcCBvYmplY3QgdG8gZG8gdGhlIG1hcHBpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6IFRoZSBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBpbmRleC4gIDAgbWVhbnMgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSB1c2UgRnJlZVR5cGUgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgZm9udCBmaWxlcyAgICAgICAqLwotICAvKiAgICBkaXJlY3RseSwgYmUgYXdhcmUgdGhhdCB0aGUgZ2x5cGggaW5kZXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiAgKi8KLSAgLyogICAgZG9lc24ndCBhbHdheXMgY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgaW5kaWNlcyB1c2VkIHdpdGhpbiAgICAgICovCi0gIC8qICAgIHRoZSBmaWxlLiAgVGhpcyBpcyBkb25lIHRvIGVuc3VyZSB0aGF0IHZhbHVlIDAgYWx3YXlzIGNvcnJlc3BvbmRzICAqLwotICAvKiAgICB0byB0aGUgYG1pc3NpbmcgZ2x5cGgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUX0dldF9DaGFyX0luZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0ZpcnN0X0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgZmlyc3QgY2hhcmFjdGVyIGNvZGUgaW4gdGhlICAgICovCi0gIC8qICAgIGN1cnJlbnQgY2hhcm1hcCBvZiBhIGdpdmVuIGZhY2UuICBJdCBhbHNvIHJldHVybnMgdGhlICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2luZGV4IDo6IEdseXBoIGluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBjb2RlLiAgMCBpZiBjaGFybWFwIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNoYXJtYXAncyBmaXJzdCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoIEBGVF9HZXRfTmV4dF9DaGFyIHRvIGJlIGFibGUgdG8gICovCi0gIC8qICAgIHBhcnNlIGFsbCBjaGFyYWN0ZXIgY29kZXMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gY2hhcm1hcC4gIFRoZSBjb2RlICAqLwotICAvKiAgICBzaG91bGQgbG9vayBsaWtlIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX1VMb25nICBjaGFyY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9VSW50ICAgZ2luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBjaGFyY29kZSA9IEZUX0dldF9GaXJzdF9DaGFyKCBmYWNlLCAmZ2luZGV4ICk7ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgd2hpbGUgKCBnaW5kZXggIT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiBkbyBzb21ldGhpbmcgd2l0aCAoY2hhcmNvZGUsZ2luZGV4KSBwYWlyIC4uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgY2hhcmNvZGUgPSBGVF9HZXRfTmV4dF9DaGFyKCBmYWNlLCBjaGFyY29kZSwgJmdpbmRleCApOyAgICAgICAgKi8KLSAgLyogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IGAqYWdpbmRleCcgaXMgc2V0IHRvIDAgaWYgdGhlIGNoYXJtYXAgaXMgZW1wdHkuICBUaGUgICAgICovCi0gIC8qICAgIHJlc3VsdCBpdHNlbGYgY2FuIGJlIDAgaW4gdHdvIGNhc2VzOiBpZiB0aGUgY2hhcm1hcCBpcyBlbXB0eSBvciAgICAqLwotICAvKiAgICB3aGVuIHRoZSB2YWx1ZSAwIGlzIHRoZSBmaXJzdCB2YWxpZCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUxvbmcgKQotICBGVF9HZXRfRmlyc3RfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqYWdpbmRleCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X05leHRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgICAgICovCi0gIC8qICAgIGN1cnJlbnQgY2hhcm1hcCBvZiBhIGdpdmVuIGZhY2UgZm9sbG93aW5nIHRoZSB2YWx1ZSBgY2hhcl9jb2RlJywgICAqLwotICAvKiAgICBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9jb2RlIDo6IFRoZSBzdGFydGluZyBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdpbmRleCAgIDo6IEdseXBoIGluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBjb2RlLiAgMCBpZiBjaGFybWFwICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBpcyBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjaGFybWFwJ3MgbmV4dCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBARlRfR2V0X0ZpcnN0X0NoYXIgdG8gd2FsayAgICAgICAqLwotICAvKiAgICBvdmVyIGFsbCBjaGFyYWN0ZXIgY29kZXMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gY2hhcm1hcC4gIFNlZSB0aGUgICAgKi8KLSAgLyogICAgbm90ZSBmb3IgdGhpcyBmdW5jdGlvbiBmb3IgYSBzaW1wbGUgY29kZSBleGFtcGxlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgYCphZ2luZGV4JyBpcyBzZXQgdG8gMCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGNvZGVzIGluICAgKi8KLSAgLyogICAgdGhlIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VMb25nICkKLSAgRlRfR2V0X05leHRfQ2hhciggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphZ2luZGV4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTmFtZV9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIGdseXBoIGluZGV4IG9mIGEgZ2l2ZW4gZ2x5cGggbmFtZS4gIFRoaXMgZnVuY3Rpb24gdXNlcyAgKi8KLSAgLyogICAgZHJpdmVyIHNwZWNpZmljIG9iamVjdHMgdG8gZG8gdGhlIHRyYW5zbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9uYW1lIDo6IFRoZSBnbHlwaCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ2x5cGggaW5kZXguICAwIG1lYW5zIGB1bmRlZmluZWQgY2hhcmFjdGVyIGNvZGUnLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUX0dldF9OYW1lX0luZGV4KCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgdG8gZGVzY3JpYmUgc3ViZ2x5cGhzLiAgUGxlYXNlIHJlZmVyIHRvIHRoZQotICAgKiAgIFRydWVUeXBlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGZsYWdzLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfV09SRFMgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUyA6OgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfUk9VTkRfWFlfVE9fR1JJRCA6OgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfU0NBTEUgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1hZX1NDQUxFIDo6Ci0gICAqICAgRlRfU1VCR0xZUEhfRkxBR18yWDIgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTIDo6Ci0gICAqCi0gICAqLwotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1dPUkRTICAgICAgICAgIDEKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVMgICAgICAyCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfUk9VTkRfWFlfVE9fR1JJRCAgICAgICAgNAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1NDQUxFICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19YWV9TQ0FMRSAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfMlgyICAgICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTICAgICAgMHgyMDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jOgotICAgKiAgIEZUX0dldF9TdWJHbHlwaF9JbmZvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSBhIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gc3ViZ2x5cGguICBPbmx5IHVzZSBpdCBpZgotICAgKiAgIGBnbHlwaC0+Zm9ybWF0JyBpcyBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSwgb3IgYW4gZXJyb3IgaXMKLSAgICogICByZXR1cm5lZC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGdseXBoIDo6Ci0gICAqICAgICBUaGUgc291cmNlIGdseXBoIHNsb3QuCi0gICAqCi0gICAqICAgc3ViX2luZGV4IDo6Ci0gICAqICAgICBUaGUgaW5kZXggb2Ygc3ViZ2x5cGguICBNdXN0IGJlIGxlc3MgdGhhbiBgZ2x5cGgtPm51bV9zdWJnbHlwaHMnLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHBfaW5kZXggOjoKLSAgICogICAgIFRoZSBnbHlwaCBpbmRleCBvZiB0aGUgc3ViZ2x5cGguCi0gICAqCi0gICAqICAgcF9mbGFncyA6OgotICAgKiAgICAgVGhlIHN1YmdseXBoIGZsYWdzLCBzZWUgQEZUX1NVQkdMWVBIX0ZMQUdfWFhYLgotICAgKgotICAgKiAgIHBfYXJnMSA6OgotICAgKiAgICAgVGhlIHN1YmdseXBoJ3MgZmlyc3QgYXJndW1lbnQgKGlmIGFueSkuCi0gICAqCi0gICAqICAgcF9hcmcyIDo6Ci0gICAqICAgICBUaGUgc3ViZ2x5cGgncyBzZWNvbmQgYXJndW1lbnQgKGlmIGFueSkuCi0gICAqCi0gICAqICAgcF90cmFuc2Zvcm0gOjoKLSAgICogICAgIFRoZSBzdWJnbHlwaCB0cmFuc2Zvcm1hdGlvbiAoaWYgYW55KS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgdmFsdWVzIG9mIGAqcF9hcmcxJywgYCpwX2FyZzInLCBhbmQgYCpwX3RyYW5zZm9ybScgbXVzdCBiZQotICAgKiAgIGludGVycHJldGVkIGRlcGVuZGluZyBvbiB0aGUgZmxhZ3MgcmV0dXJuZWQgaW4gYCpwX2ZsYWdzJy4gIFNlZSB0aGUKLSAgICogICBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9TdWJHbHlwaF9JbmZvKCBGVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBzdWJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgKnBfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqcF9hcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4ICAgICpwX3RyYW5zZm9ybSApOwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF92YXJpYW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHbHlwaCBWYXJpYW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgRnJlZVR5cGUgMiBpbnRlcmZhY2UgdG8gVW5pY29kZSBJZGVvZ3JhcGhpYyBWYXJpYXRpb24gICAgICAgICAgKi8KLSAgLyogICAgU2VxdWVuY2VzIChJVlMpLCB1c2luZyB0aGUgU0ZOVCBjbWFwIGZvcm1hdCAxNC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFueSBDSksgY2hhcmFjdGVycyBoYXZlIHZhcmlhbnQgZm9ybXMuICBUaGV5IGFyZSBhIHNvcnQgb2YgZ3JleSAgICovCi0gIC8qICAgIGFyZWEgc29tZXdoZXJlIGJldHdlZW4gYmVpbmcgdG90YWxseSBpcnJlbGV2YW50IGFuZCBzZW1hbnRpY2FsbHkgICAqLwotICAvKiAgICBkaXN0aW5jdDsgZm9yIHRoaXMgcmVhc29uLCB0aGUgVW5pY29kZSBjb25zb3J0aXVtIGRlY2lkZWQgdG8gICAgICAgKi8KLSAgLyogICAgaW50cm9kdWNlIElkZW9ncmFwaGljIFZhcmlhdGlvbiBTZXF1ZW5jZXMgKElWUyksIGNvbnNpc3Rpbmcgb2YgYSAgICovCi0gIC8qICAgIFVuaWNvZGUgYmFzZSBjaGFyYWN0ZXIgYW5kIG9uZSBvZiAyNDAgdmFyaWFudCBzZWxlY3RvcnMgICAgICAgICAgICAqLwotICAvKiAgICAoVStFMDEwMC1VK0UwMUVGKSwgaW5zdGVhZCBvZiBmdXJ0aGVyIGV4dGVuZGluZyB0aGUgYWxyZWFkeSBodWdlICAgKi8KLSAgLyogICAgY29kZSByYW5nZSBmb3IgQ0pLIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBJVlMgaXMgcmVnaXN0ZXJlZCBhbmQgdW5pcXVlOyBmb3IgZnVydGhlciBkZXRhaWxzIHBsZWFzZSByZWZlciAgKi8KLSAgLyogICAgdG8gVW5pY29kZSBUZWNobmljYWwgUmVwb3J0ICMzNywgdGhlIElkZW9ncmFwaGljIFZhcmlhdGlvbiAgICAgICAgICovCi0gIC8qICAgIERhdGFiYXNlLiAgVG8gZGF0ZSAoT2N0b2JlciAyMDA3KSwgdGhlIGNoYXJhY3RlciB3aXRoIHRoZSBtb3N0ICAgICAqLwotICAvKiAgICB2YXJpYW50cyBpcyBVKzkwOEEsIGhhdmluZyA4IHN1Y2ggSVZTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkb2JlIGFuZCBNUyBkZWNpZGVkIHRvIHN1cHBvcnQgSVZTIHdpdGggYSBuZXcgY21hcCBzdWJ0YWJsZSAgICAgICAqLwotICAvKiAgICAoZm9ybWF0IDE0KS4gIEl0IGlzIGFuIG9kZCBzdWJ0YWJsZSBiZWNhdXNlIGl0IGlzIG5vdCBhIG1hcHBpbmcgb2YgKi8KLSAgLyogICAgaW5wdXQgY29kZSBwb2ludHMgdG8gZ2x5cGhzLCBidXQgY29udGFpbnMgbGlzdHMgb2YgYWxsIHZhcmlhbnRzICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2YXJpYW50IG1heSBiZSBlaXRoZXIgYGRlZmF1bHQnIG9yIGBub24tZGVmYXVsdCcuICBBIGRlZmF1bHQgICAgICovCi0gIC8qICAgIHZhcmlhbnQgaXMgdGhlIG9uZSB5b3Ugd2lsbCBnZXQgZm9yIHRoYXQgY29kZSBwb2ludCBpZiB5b3UgbG9vayBpdCAqLwotICAvKiAgICB1cCBpbiB0aGUgc3RhbmRhcmQgVW5pY29kZSBjbWFwLiAgQSBub24tZGVmYXVsdCB2YXJpYW50IGlzIGEgICAgICAgKi8KLSAgLyogICAgZGlmZmVyZW50IGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSBhcyBtb2RpZmllZCBieSAgICAqLwotICAvKiAgICB0aGUgdmFyaWF0aW9uIHNlbGVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY2hhcmFjdGVyIGNvZGUgcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYW50U2VsZWN0b3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgVW5pY29kZSBjb2RlIHBvaW50IG9mIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMCBtZWFucyBlaXRoZXIgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScsIG9yICAgICovCi0gIC8qICAgIGB1bmRlZmluZWQgc2VsZWN0b3IgY29kZScsIG9yIGBubyB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCAgICAgICAgICAqLwotICAvKiAgICBzdWJ0YWJsZScsIG9yIGBjdXJyZW50IENoYXJNYXAgaXMgbm90IFVuaWNvZGUnLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgdXNlIEZyZWVUeXBlIHRvIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnRzIG9mIGZvbnQgZmlsZXMgICAgICAgKi8KLSAgLyogICAgZGlyZWN0bHksIGJlIGF3YXJlIHRoYXQgdGhlIGdseXBoIGluZGV4IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gICovCi0gIC8qICAgIGRvZXNuJ3QgYWx3YXlzIGNvcnJlc3BvbmQgdG8gdGhlIGludGVybmFsIGluZGljZXMgdXNlZCB3aXRoaW4gICAgICAqLwotICAvKiAgICB0aGUgZmlsZS4gIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB2YWx1ZSAwIGFsd2F5cyBjb3JyZXNwb25kcyAgKi8KLSAgLyogICAgdG8gdGhlIGBtaXNzaW5nIGdseXBoJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBhKSB0aGUgZm9udCBoYXMgYSB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCBzdWIgdGFibGUsICAgICAgICAgICAgICovCi0gIC8qICAgIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGIpIHRoZSBjdXJyZW50IGNoYXJtYXAgaGFzIGEgVW5pY29kZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJbmRleCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrIHdoZXRoZXIgdGhpcyB2YXJpYW50IG9mIHRoaXMgVW5pY29kZSBjaGFyYWN0ZXIgaXMgdGhlIG9uZSB0byAqLwotICAvKiAgICBiZSBmb3VuZCBpbiB0aGUgYGNtYXAnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY2hhcmFjdGVyIGNvZGVwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYW50U2VsZWN0b3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgVW5pY29kZSBjb2RlcG9pbnQgb2YgdGhlIHZhcmlhdGlvbiBzZWxlY3Rvci4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMSBpZiBmb3VuZCBpbiB0aGUgc3RhbmRhcmQgKFVuaWNvZGUpIGNtYXAsIDAgaWYgZm91bmQgaW4gdGhlICAgICAgICovCi0gIC8qICAgIHZhcmlhdGlvbiBzZWxlY3RvciBjbWFwLCBvciAtMSBpZiBpdCBpcyBub3QgYSB2YXJpYW50LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBmb250IGhhcyBhIHZhcmlhdGlvbiAgICAgICAqLwotICAvKiAgICBzZWxlY3RvciBjbWFwIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfSW50ICkKLSAgRlRfRmFjZV9HZXRDaGFyVmFyaWFudElzRGVmYXVsdCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9HZXRWYXJpYW50U2VsZWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgVW5pY29kZSB2YXJpYW50IHNlbGVjdG9ycyBmb3VuZCAgICovCi0gIC8qICAgIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc2VsZWN0b3IgY29kZSBwb2ludHMsIG9yIE5VTEwgaWYgdGhlcmUgaXMgKi8KLSAgLyogICAgbm8gdmFsaWQgdmFyaWFudCBzZWxlY3RvciBjbWFwIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxhc3QgaXRlbSBpbiB0aGUgYXJyYXkgaXMgMDsgdGhlIGFycmF5IGlzIG93bmVkIGJ5IHRoZSAgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlIG9iamVjdCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIG9yIHJlbGVhc2VkIG9uIHRoZSBuZXh0ICAgICAqLwotICAvKiAgICBjYWxsIHRvIGEgRnJlZVR5cGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludDMyKiApCi0gIEZUX0ZhY2VfR2V0VmFyaWFudFNlbGVjdG9ycyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9HZXRWYXJpYW50c09mQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgVW5pY29kZSB2YXJpYW50IHNlbGVjdG9ycyBmb3VuZCAgICovCi0gIC8qICAgIGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjaGFyYWN0ZXIgY29kZXBvaW50IGluIFVuaWNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmFyaWFudCBzZWxlY3RvciBjb2RlIHBvaW50cyB3aGljaCBhcmUgICAgKi8KLSAgLyogICAgYWN0aXZlIGZvciB0aGUgZ2l2ZW4gY2hhcmFjdGVyLCBvciBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIGxpc3QgICovCi0gIC8qICAgIGlzIGVtcHR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzIDA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZSBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCAgICAgKi8KLSAgLyogICAgY2FsbCB0byBhIEZyZWVUeXBlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQzMiogKQotICBGVF9GYWNlX0dldFZhcmlhbnRzT2ZDaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0dldENoYXJzT2ZWYXJpYW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBVbmljb2RlIGNoYXJhY3RlciBjb2RlcyBmb3VuZCBmb3IgKi8KLSAgLyogICAgdGhlIHNwZWNpZmllZCB2YXJpYW50IHNlbGVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmFyaWFudFNlbGVjdG9yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHZhcmlhbnQgc2VsZWN0b3IgY29kZSBwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBhbGwgdGhlIGNvZGUgcG9pbnRzIHdoaWNoIGFyZSBzcGVjaWZpZWQgYnkgdGhpcyBzZWxlY3RvciAqLwotICAvKiAgICAoYm90aCBkZWZhdWx0IGFuZCBub24tZGVmYXVsdCBjb2RlcyBhcmUgcmV0dXJuZWQpIG9yIE5VTEwgaWYgdGhlcmUgKi8KLSAgLyogICAgaXMgbm8gdmFsaWQgY21hcCBvciB0aGUgdmFyaWFudCBzZWxlY3RvciBpcyBpbnZhbGlkLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxhc3QgaXRlbSBpbiB0aGUgYXJyYXkgaXMgMDsgdGhlIGFycmF5IGlzIG93bmVkIGJ5IHRoZSAgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlIG9iamVjdCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIG9yIHJlbGVhc2VkIG9uIHRoZSBuZXh0ICAgICAqLwotICAvKiAgICBjYWxsIHRvIGEgRnJlZVR5cGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludDMyKiApCi0gIEZUX0ZhY2VfR2V0Q2hhcnNPZlZhcmlhbnQoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcnVuY2hpbmcgZml4ZWQgbnVtYmVycyBhbmQgdmVjdG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdmFyaW91cyBmdW5jdGlvbnMgdXNlZCB0byBwZXJmb3JtICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcHV0YXRpb25zIG9uIDE2LjE2IGZpeGVkLWZsb2F0IG51bWJlcnMgb3IgMmQgdmVjdG9ycy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTXVsRGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9EaXZGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUm91bmRGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NlaWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GbG9vckZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeF9NdWx0aXBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXhfSW52ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTXVsRGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIGAoYSpiKS9jJyAgICovCi0gIC8qICAgIHdpdGggbWF4aW1hbCBhY2N1cmFjeSAoaXQgdXNlcyBhIDY0LWJpdCBpbnRlcm1lZGlhdGUgaW50ZWdlciAgICAgICAqLwotICAvKiAgICB3aGVuZXZlciBuZWNlc3NhcnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLwotICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGMgOjogVGhlIGRpdmlzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKmIpL2MnLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0byAqLwotICAvKiAgICBkaXZpZGUgYnkgemVybzsgaXQgc2ltcGx5IHJldHVybnMgYE1heEludCcgb3IgYE1pbkludCcgZGVwZW5kaW5nICAgKi8KLSAgLyogICAgb24gdGhlIHNpZ25zIG9mIGBhJyBhbmQgYGInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0xvbmcgKQotICBGVF9NdWxEaXYoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiwKLSAgICAgICAgICAgICBGVF9Mb25nICBjICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gICAgICAgICAgICAgKi8KLSAgLyogICAgYChhKmIpLzB4MTAwMDAnIHdpdGggbWF4aW1hbCBhY2N1cmFjeS4gIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyAgICovCi0gIC8qICAgIHVzZWQgdG8gbXVsdGlwbHkgYSBnaXZlbiB2YWx1ZSBieSBhIDE2LjE2IGZpeGVkIGZsb2F0IGZhY3Rvci4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIGZpcnN0IG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiIDo6IFRoZSBzZWNvbmQgbXVsdGlwbGllci4gIFVzZSBhIDE2LjE2IGZhY3RvciBoZXJlIHdoZW5ldmVyICAgICAgKi8KLSAgLyogICAgICAgICBwb3NzaWJsZSAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvMHgxMDAwMCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBvcHRpbWl6ZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBhYnNvbHV0ZSAgICovCi0gIC8qICAgIHZhbHVlIG9mIGBhJyBpcyBsZXNzIHRoYW4gMjA0OCwgYW5kIGBiJyBpcyBhIDE2LjE2IHNjYWxpbmcgZmFjdG9yLiAqLwotICAvKiAgICBBcyB0aGlzIGhhcHBlbnMgbWFpbmx5IHdoZW4gc2NhbGluZyBmcm9tIG5vdGlvbmFsIHVuaXRzIHRvICAgICAgICAgKi8KLSAgLyogICAgZnJhY3Rpb25hbCBwaXhlbHMgaW4gRnJlZVR5cGUsIGl0IHJlc3VsdGVkIGluIG5vdGljZWFibGUgc3BlZWQgICAgICovCi0gIC8qICAgIGltcHJvdmVtZW50cyBiZXR3ZWVuIHZlcnNpb25zIDIueCBhbmQgMS54LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXMgYSBjb25jbHVzaW9uLCBhbHdheXMgdHJ5IHRvIHBsYWNlIGEgMTYuMTYgZmFjdG9yIGFzIHRoZSAgICAgICAgICovCi0gIC8qICAgIF9zZWNvbmRfIGFyZ3VtZW50IG9mIHRoaXMgZnVuY3Rpb247IHRoaXMgY2FuIG1ha2UgYSBncmVhdCAgICAgICAgICAqLwotICAvKiAgICBkaWZmZXJlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgRlRfTVVMRklYX0lOTElORUQKLSMgIGRlZmluZSAgRlRfTXVsRml4KGEsYikgIEZUX01VTEZJWF9JTkxJTkVEKGEsYikKLSNlbHNlCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX011bEZpeCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiICk7Ci0jZW5kaWYKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9EaXZGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gICAgICAgICAgICAgKi8KLSAgLyogICAgYChhKjB4MTAwMDApL2InIHdpdGggbWF4aW1hbCBhY2N1cmFjeS4gIE1vc3Qgb2YgdGhlIHRpbWUsIHRoaXMgaXMgICovCi0gIC8qICAgIHVzZWQgdG8gZGl2aWRlIGEgZ2l2ZW4gdmFsdWUgYnkgYSAxNi4xNiBmaXhlZCBmbG9hdCBmYWN0b3IuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIGZpcnN0IG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiIDo6IFRoZSBzZWNvbmQgbXVsdGlwbGllci4gIFVzZSBhIDE2LjE2IGZhY3RvciBoZXJlIHdoZW5ldmVyICAgICAgKi8KLSAgLyogICAgICAgICBwb3NzaWJsZSAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqMHgxMDAwMCkvYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG9wdGltaXphdGlvbiBmb3IgRlRfRGl2Rml4KCkgaXMgc2ltcGxlOiBJZiAoYSA8PCAxNikgZml0cyBpbiAgICovCi0gIC8qICAgIDMyIGJpdHMsIHRoZW4gdGhlIGRpdmlzaW9uIGlzIGNvbXB1dGVkIGRpcmVjdGx5LiAgT3RoZXJ3aXNlLCB3ZSAgICAqLwotICAvKiAgICB1c2UgYSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIEBGVF9NdWxEaXYuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX0RpdkZpeCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Sb3VuZEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcm91bmQgYSAxNi4xNiBmaXhlZCBudW1iZXIuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1iZXIgdG8gYmUgcm91bmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSArIDB4ODAwMCkgJiAtMHgxMDAwMCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9Sb3VuZEZpeCggRlRfRml4ZWQgIGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NlaWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBjb21wdXRlIHRoZSBjZWlsaW5nIGZ1bmN0aW9uIG9mIGEgICAqLwotICAvKiAgICAxNi4xNiBmaXhlZCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1iZXIgZm9yIHdoaWNoIHRoZSBjZWlsaW5nIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSArIDB4MTAwMDAgLSAxKSAmIC0weDEwMDAwJy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9DZWlsRml4KCBGVF9GaXhlZCAgYSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmxvb3JGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIGZsb29yIGZ1bmN0aW9uIG9mIGEgICAgICovCi0gIC8qICAgIDE2LjE2IGZpeGVkIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIG51bWJlciBmb3Igd2hpY2ggdGhlIGZsb29yIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYGEgJiAtMHgxMDAwMCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCi0gIEZUX0Zsb29yRml4KCBGVF9GaXhlZCAgYSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJhbnNmb3JtIGEgc2luZ2xlIHZlY3RvciB0aHJvdWdoIGEgMngyIG1hdHJpeC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVjdG9yIDo6IFRoZSB0YXJnZXQgdmVjdG9yIHRvIHRyYW5zZm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIDJ4MiBtYXRyaXguICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgZWl0aGVyIGB2ZWN0b3InIG9yIGBtYXRyaXgnIGlzIGludmFsaWQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfVHJhbnNmb3JtKCBGVF9WZWN0b3IqICAgICAgICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnVuY3Rpb25zIGFuZCBtYWNyb3MgcmVsYXRlZCB0byBGcmVlVHlwZSB2ZXJzaW9ucy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRob3NlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGFyZSBvZiBsaW1pdGVkIHVzZSBiZWNhdXNlICAgICovCi0gIC8qICAgIGV2ZW4gYSBuZXcgcmVsZWFzZSBvZiBGcmVlVHlwZSB3aXRoIG9ubHkgZG9jdW1lbnRhdGlvbiBjaGFuZ2VzICAgICAqLwotICAvKiAgICBpbmNyZWFzZXMgdGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogIEBlbnVtOgotICAgKiAgICBGUkVFVFlQRV9YWFgKLSAgICoKLSAgICogIEBkZXNjcmlwdGlvbjoKLSAgICogICAgVGhlc2UgdGhyZWUgbWFjcm9zIGlkZW50aWZ5IHRoZSBGcmVlVHlwZSBzb3VyY2UgY29kZSB2ZXJzaW9uLgotICAgKiAgICBVc2UgQEZUX0xpYnJhcnlfVmVyc2lvbiB0byBhY2Nlc3MgdGhlbSBhdCBydW50aW1lLgotICAgKgotICAgKiAgQHZhbHVlczoKLSAgICogICAgRlJFRVRZUEVfTUFKT1IgOjogVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLgotICAgKiAgICBGUkVFVFlQRV9NSU5PUiA6OiBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIuCi0gICAqICAgIEZSRUVUWVBFX1BBVENIIDo6IFRoZSBwYXRjaCBsZXZlbC4KLSAgICoKLSAgICogIEBub3RlOgotICAgKiAgICBUaGUgdmVyc2lvbiBudW1iZXIgb2YgRnJlZVR5cGUgaWYgYnVpbHQgYXMgYSBkeW5hbWljIGxpbmsgbGlicmFyeQotICAgKiAgICB3aXRoIHRoZSBgbGlidG9vbCcgcGFja2FnZSBpcyBfbm90XyBjb250cm9sbGVkIGJ5IHRoZXNlIHRocmVlCi0gICAqICAgIG1hY3Jvcy4KLSAgICovCi0jZGVmaW5lIEZSRUVUWVBFX01BSk9SICAyCi0jZGVmaW5lIEZSRUVUWVBFX01JTk9SICAzCi0jZGVmaW5lIEZSRUVUWVBFX1BBVENIICA2Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5X1ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkgYmVpbmcgdXNlZC4gIFRoaXMgaXMgICAgKi8KLSAgLyogICAgdXNlZnVsIHdoZW4gZHluYW1pY2FsbHkgbGlua2luZyB0byB0aGUgbGlicmFyeSwgc2luY2Ugb25lIGNhbm5vdCAgICovCi0gIC8qICAgIHVzZSB0aGUgbWFjcm9zIEBGUkVFVFlQRV9NQUpPUiwgQEZSRUVUWVBFX01JTk9SLCBhbmQgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlJFRVRZUEVfUEFUQ0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgc291cmNlIGxpYnJhcnkgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFqb3IgIDo6IFRoZSBtYWpvciB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtaW5vciAgOjogVGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXBhdGNoICA6OiBUaGUgcGF0Y2ggdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGBsaWJyYXJ5JyBhcmd1bWVudCBpcyBiZWNhdXNlICovCi0gIC8qICAgIGNlcnRhaW4gcHJvZ3JhbXMgaW1wbGVtZW50IGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gaW4gYSBjdXN0b20gd2F5ICAqLwotICAvKiAgICB0aGF0IGRvZXNuJ3QgdXNlIEBGVF9Jbml0X0ZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIHN1Y2ggY2FzZXMsIHRoZSBsaWJyYXJ5IHZlcnNpb24gbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBiZWZvcmUgICAqLwotICAvKiAgICB0aGUgbGlicmFyeSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpYnJhcnlfVmVyc2lvbiggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgKmFtYWpvciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYW1pbm9yLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphcGF0Y2ggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlIGFsbCBieXRlY29kZSBpbnN0cnVjdGlvbnMgb2YgYSBUcnVlVHlwZSBmb250IGZpbGUgdG8gY2hlY2sgICAqLwotICAvKiAgICB3aGV0aGVyIGFueSBvZiB0aGUgcGF0ZW50ZWQgb3Bjb2RlcyBhcmUgdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgKi8KLSAgLyogICAgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgdGhlIHVucGF0ZW50ZWQgaGludGVyIHdpdGggICAgICAgICAgICovCi0gIC8qICAgIGZvbnRzIHRoYXQgZG8gKm5vdCogdXNlIHRoZXNlIG9wY29kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGFyc2VzICphbGwqIGdseXBoIGluc3RydWN0aW9ucyBpbiB0aGUgICAgICovCi0gIC8qICAgIGZvbnQgZmlsZSwgd2hpY2ggbWF5IGJlIHNsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBmYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDEgaWYgdGhpcyBpcyBhIFRydWVUeXBlIGZvbnQgdGhhdCB1c2VzIG9uZSBvZiB0aGUgcGF0ZW50ZWQgICAgICAgICAqLwotICAvKiAgICBvcGNvZGVzLCAwIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfQm9vbCApCi0gIEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVuYWJsZSBvciBkaXNhYmxlIHRoZSB1bnBhdGVudGVkIGhpbnRlciBmb3IgYSBnaXZlbiBmYWNlLiAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGVuYWJsZSBpdCBpZiB5b3UgaGF2ZSBkZXRlcm1pbmVkIHRoYXQgdGhlIGZhY2UgZG9lc24ndCAgICAgICAgKi8KLSAgLyogICAgdXNlIGFueSBwYXRlbnRlZCBvcGNvZGVzIChzZWUgQEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMpLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgOjogQSBmYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YWx1ZSA6OiBOZXcgYm9vbGVhbiBzZXR0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgb2xkIHNldHRpbmcgdmFsdWUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGlmIHRoaXMgaXMgbm90ICAgKi8KLSAgLyogICAgYSBTRk5UIGZvbnQsIG9yIGlmIHRoZSB1bnBhdGVudGVkIGhpbnRlciBpcyBub3QgY29tcGlsZWQgaW4gdGhpcyAgICovCi0gIC8qICAgIGluc3RhbmNlIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Cb29sICkKLSAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZyggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgdmFsdWUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlJFRVRZUEVfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YWR2YW5jLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0YWR2YW5jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOGIxY2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YWR2YW5jLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBhY2Nlc3MgdGhlIGdseXBoIGFkdmFuY2VzICAgICAgIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19GUkVFVFlQRV9BRFZBTkNFX0hfXwotI2RlZmluZSBfX0ZSRUVUWVBFX0FEVkFOQ0VfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPENvbnN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0FEVkFOQ0VfRkxBR19GQVNUX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgYml0LWZsYWcgdG8gYmUgb3ItZWQgdG8gdGhlICdmbGFncycgcGFyYW1ldGVyIG9mIHRoZSAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfR2V0X0FkdmFuY2UgYW5kIEBGVF9HZXRfQWR2YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdoZW4gc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2FudCB0aGVzZSBmdW5jdGlvbnMgdG8gZmFpbCAgICAgICAqLwotICAvKiAgICBpZiB0aGUgY29ycmVzcG9uZGluZyBoaW50aW5nIG1vZGUgb3IgZm9udCBkcml2ZXIgZG9lc24ndCAgICAgICAgICAgKi8KLSAgLyogICAgYWxsb3cgZm9yIHZlcnkgcXVpY2sgYWR2YW5jZSBjb21wdXRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBpY2FsbHksIHVuc2NhbGVkLCB1bmhpbnRlZCwgYml0bWFwcGVkIGFuZCBsaWdodC1oaW50ZWQgZ2x5cGhzICAgKi8KLSAgLyogICAgY2FuIGhhdmUgdGhlaXIgYWR2YW5jZSB3aWR0aChzKSBjb21wdXRlZCB2ZXJ5IHF1aWNrbHkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub3Qgc28gZm9yIG5vcm1hbCBhbmQgYnl0ZWNvZGUgaGludGVkIG1vZGVzLCB3aGljaCByZXF1aXJlICAgICAgICAgKi8KLSAgLyogICAgbG9hZGluZy9zY2FsaW5nL2hpbnRpbmcgdGhlIGdseXBoIG91dGxpbmUgaW5zdGVhZCwgd2hpY2ggaXMgICAgICAgICovCi0gIC8qICAgIGV4dHJlbWVseSBzbG93IGJ5IGNvbXBhcmlzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgIEZUX0FEVkFOQ0VfRkxBR19GQVNUX09OTFkgICAweDIwMDAwMDAwVQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0FkdmFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIGFkdmFuY2Ugb2YgYSBnaXZlbiBnbHlwaCBvdXRsaW5lIGluIGEgRlRfRmFjZS4gICAgICAgICovCi0gIC8qICAgIGJ5IGRlZmF1bHQsIHRoZSB1bmhpbnRlZCBhZHZhbmNlIGlzIHJldHVybmVkIGluIGZvbnQgdW5pdHMgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogc291cmNlIEZUX0ZhY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICAgIDo6IGdseXBoIGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyA6OiBhIHNldCBvZiBiaXQtZmxhZ3Mgc2ltaWxhciB0byB0aG9zZSB1c2VkICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgd2hlbiBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLCB1c2VkIHRvIGRldGVybWluZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHdoYXQga2luZCBvZiBhZHZhbmNlcyB5b3UgbmVlZC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhZHZhbmNlIDo6IHRoZSBhZHZhbmNlIHZhbHVlLCBpbiBlaXRoZXIgZm9udCB1bml0cyBvciAxNi4xNiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGlmIEBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCBpcyBzZXQsIHRoaXMgaXMgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBhZHZhbmNlIGNvcnJlc3BvbmRpbmcgdG8gYSB2ZXJ0aWNhbCBsYXlvdXQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBpdCdzIHRoZSBob3Jpem9udGFsIGFkdmFuY2UgaW4gYW4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgZmFpbCBpZiB5b3UgdXNlIEBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZIGFuZCAgICovCi0gIC8qICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nJ3MgZm9udCBiYWNrZW5kIGRvZXNuJ3QgaGF2ZSBhIHF1aWNrIHdheSB0byAgICAqLwotICAvKiAgICByZXRyaWV2ZSB0aGUgYWR2YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2NhbGVkIGFkdmFuY2UgaXMgcmV0dXJuZWQgaW4gMTYuMTYgZm9ybWF0LCBidXQgaXNuJ3QgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1lZCBieSB0aGUgYWZmaW5lIHRyYW5zZm9ybSBzcGVjaWZpZWQgYnkgQEZUX1NldF9UcmFuc2Zvcm0gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfQWR2YW5jZSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKnBhZHZhbmNlICk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0FkdmFuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIGFkdmFuY2Ugb2Ygc2V2ZXJhbCBnbHlwaCBvdXRsaW5lcyBpbiBhIEZUX0ZhY2UuICAgICAgICovCi0gIC8qICAgIGJ5IGRlZmF1bHQsIHRoZSB1bmhpbnRlZCBhZHZhbmNlcyBhcmUgcmV0dXJuZWQgaW4gZm9udCB1bml0cyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IHNvdXJjZSBGVF9GYWNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdGFydCAgICAgICA6OiBmaXJzdCBnbHlwaCBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgICAgICAgOjogbnVtYmVyIG9mIGFkdmFuY2VzIHlvdSB3YW50IHRvIHJldHJpZXZlICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IGEgc2V0IG9mIGJpdC1mbGFncyBzaW1pbGFyIHRvIHRob3NlIHVzZWQgd2hlbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYWR2YW5jZSA6OiB0aGUgYWR2YW5jZXMsIGluIGVpdGhlciBmb250IHVuaXRzIG9yIDE2LjE2IGZvcm1hdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdGhpcyBhcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJ2NvdW50JyBlbGVtZW50cyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBpZiBARlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgaXMgc2V0LCB0aGVzZSBhcmUgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdmVydGljYWwgYWR2YW5jZXMgY29ycmVzcG9uZGluZyB0byBhIHZlcnRpY2FsIGxheW91dC4gICovCi0gIC8qICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgdGhleSBhcmUgdGhlIGhvcml6b250YWwgYWR2YW5jZXMgaW4gYW4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBob3Jpem9udGFsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gbWF5IGZhaWwgaWYgeW91IHVzZSBARlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSBhbmQgICAqLwotICAvKiAgICBpZiB0aGUgY29ycmVzcG9uZGluZydzIGZvbnQgYmFja2VuZCBkb2Vzbid0IGhhdmUgYSBxdWljayB3YXkgdG8gICAgKi8KLSAgLyogICAgcmV0cmlldmUgdGhlIGFkdmFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTY2FsZWQgYWR2YW5jZXMgYXJlIHJldHVybmVkIGluIDE2LjE2IGZvcm1hdCwgYnV0IGFyZW4ndCAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtZWQgYnkgdGhlIGFmZmluZSB0cmFuc2Zvcm0gc3BlY2lmaWVkIGJ5IEBGVF9TZXRfVHJhbnNmb3JtICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0FkdmFuY2VzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKnBhZHZhbmNlcyApOwotCi0vKiAqLwotCi0jZW5kaWYgLyogX19GUkVFVFlQRV9BRFZBTkNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGJib3guaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRiYm94LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDE5NGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGJib3guaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmJveC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBleGFjdCBiYm94IGNvbXB1dGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAzLCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGhhcyBhIF9zaW5nbGVfIHJvbGU6IHRvIGNvbXB1dGUgZXhhY3Qgb3V0bGluZSBib3VuZGluZyAqLwotICAvKiBib3hlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIHNlcGFyYXRlZCBmcm9tIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgZm9yIHZhcmlvdXMgdGVjaG5pY2FsICAgICAqLwotICAvKiByZWFzb25zLiAgSXQgbWF5IHdlbGwgYmUgaW50ZWdyYXRlZCBpbiBgZnRvdXRsbicgbGF0ZXIuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEJCT1hfSF9fCi0jZGVmaW5lIF9fRlRCQk9YX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgZXhhY3QgYm91bmRpbmcgYm94IG9mIGFuIG91dGxpbmUuICBUaGlzIGlzIHNsb3dlciAgICAgKi8KLSAgLyogICAgdGhhbiBjb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94LiAgSG93ZXZlciwgaXQgdXNlcyBhbiBhZHZhbmNlZCAgICAgICovCi0gIC8qICAgIGFsZ29yaXRobSB3aGljaCByZXR1cm5zIF92ZXJ5XyBxdWlja2x5IHdoZW4gdGhlIHR3byBib3hlcyAgICAgICAgICAqLwotICAvKiAgICBjb2luY2lkZS4gIE90aGVyd2lzZSwgdGhlIG91dGxpbmUgQsOpemllciBhcmNzIGFyZSB0cmF2ZXJzZWQgdG8gICAgICovCi0gIC8qICAgIGV4dHJhY3QgdGhlaXIgZXh0cmVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFiYm94ICAgOjogVGhlIG91dGxpbmUncyBleGFjdCBib3VuZGluZyBib3guICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfR2V0X0JCb3goIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAqYWJib3ggKTsKLQotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVEJCT1hfSF9fICovCi0KLQotLyogRU5EICovCi0KLQotLyogTG9jYWwgVmFyaWFibGVzOiAqLwotLyogY29kaW5nOiB1dGYtOCAgICAqLwotLyogRW5kOiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU1Njk0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRiZGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQkRGLXNwZWNpZmljIHN0cmluZ3MgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEJERl9IX18KLSNkZWZpbmUgX19GVEJERl9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmRmX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkRGIEZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkRGIHNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBCREYgc3BlY2lmaWMgZnVuY3Rpb25zLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBlbnVtOgotICAqICAgIEZUX1Byb3BlcnR5VHlwZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEEgbGlzdCBvZiBCREYgcHJvcGVydHkgdHlwZXMuCi0gICoKLSAgKiBAdmFsdWVzOgotICAqICAgIEJERl9QUk9QRVJUWV9UWVBFX05PTkUgOjoKLSAgKiAgICAgIFZhbHVlIDAgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIG1pc3NpbmcgcHJvcGVydHkuCi0gICoKLSAgKiAgICBCREZfUFJPUEVSVFlfVFlQRV9BVE9NIDo6Ci0gICogICAgICBQcm9wZXJ0eSBpcyBhIHN0cmluZyBhdG9tLgotICAqCi0gICogICAgQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUiA6OgotICAqICAgICAgUHJvcGVydHkgaXMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuCi0gICoKLSAgKiAgICBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCA6OgotICAqICAgICAgUHJvcGVydHkgaXMgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4KLSAgKi8KLSAgdHlwZWRlZiBlbnVtICBCREZfUHJvcGVydHlUeXBlXwotICB7Ci0gICAgQkRGX1BST1BFUlRZX1RZUEVfTk9ORSAgICAgPSAwLAotICAgIEJERl9QUk9QRVJUWV9UWVBFX0FUT00gICAgID0gMSwKLSAgICBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSICA9IDIsCi0gICAgQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwgPSAzCi0KLSAgfSBCREZfUHJvcGVydHlUeXBlOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQHR5cGU6Ci0gICogICAgQkRGX1Byb3BlcnR5Ci0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgQSBoYW5kbGUgdG8gYSBAQkRGX1Byb3BlcnR5UmVjIHN0cnVjdHVyZSB0byBtb2RlbCBhIGdpdmVuCi0gICogICAgQkRGL1BDRiBwcm9wZXJ0eS4KLSAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQkRGX1Byb3BlcnR5UmVjXyogIEJERl9Qcm9wZXJ0eTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBzdHJ1Y3Q6Ci0gICogICAgQkRGX1Byb3BlcnR5UmVjCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgVGhpcyBzdHJ1Y3R1cmUgbW9kZWxzIGEgZ2l2ZW4gQkRGL1BDRiBwcm9wZXJ0eS4KLSAgKgotICAqIEBmaWVsZHM6Ci0gICogICAgdHlwZSA6OgotICAqICAgICAgVGhlIHByb3BlcnR5IHR5cGUuCi0gICoKLSAgKiAgICB1LmF0b20gOjoKLSAgKiAgICAgIFRoZSBhdG9tIHN0cmluZywgaWYgdHlwZSBpcyBAQkRGX1BST1BFUlRZX1RZUEVfQVRPTS4KLSAgKgotICAqICAgIHUuaW50ZWdlciA6OgotICAqICAgICAgQSBzaWduZWQgaW50ZWdlciwgaWYgdHlwZSBpcyBAQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUi4KLSAgKgotICAqICAgIHUuY2FyZGluYWwgOjoKLSAgKiAgICAgIEFuIHVuc2lnbmVkIGludGVnZXIsIGlmIHR5cGUgaXMgQEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMLgotICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQkRGX1Byb3BlcnR5UmVjXwotICB7Ci0gICAgQkRGX1Byb3BlcnR5VHlwZSAgdHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICBjb25zdCBjaGFyKiAgICAgYXRvbTsKLSAgICAgIEZUX0ludDMyICAgICAgICBpbnRlZ2VyOwotICAgICAgRlRfVUludDMyICAgICAgIGNhcmRpbmFsOwotCi0gICAgfSB1OwotCi0gIH0gQkRGX1Byb3BlcnR5UmVjOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0dldF9CREZfQ2hhcnNldF9JRAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFJldHJpZXZlcyBhIEJERiBmb250IGNoYXJhY3RlciBzZXQgaWRlbnRpdHksIGFjY29yZGluZyB0bwotICAqICAgIHRoZSBCREYgc3BlY2lmaWNhdGlvbi4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGFjaGFyc2V0X2VuY29kaW5nIDo6Ci0gICogICAgICAgQ2hhcnNldCBlbmNvZGluZywgYXMgYSBDIHN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCi0gICoKLSAgKiAgICBhY2hhcnNldF9yZWdpc3RyeSA6OgotICAqICAgICAgIENoYXJzZXQgcmVnaXN0cnksIGFzIGEgQyBzdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIEJERiBmYWNlcywgcmV0dXJuaW5nIGFuIGVycm9yIG90aGVyd2lzZS4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9CREZfQ2hhcnNldF9JRCggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9yZWdpc3RyeSApOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0dldF9CREZfUHJvcGVydHkKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXRyaWV2ZXMgYSBCREYgcHJvcGVydHkgZnJvbSBhIEJERiBvciBQQ0YgZm9udCBmaWxlLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICBuYW1lIDo6IFRoZSBwcm9wZXJ0eSBuYW1lLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBhcHJvcGVydHkgOjogVGhlIHByb3BlcnR5LgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBCREYgX2FuZF8gUENGIGZvbnRzLiAgSXQgcmV0dXJucyBhbiBlcnJvcgotICAqICAgb3RoZXJ3aXNlLiAgSXQgYWxzbyByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgaW4gdGhlCi0gICogICBmb250LgotICAqCi0gICogICBJbiBjYXNlIG9mIGVycm9yLCBgYXByb3BlcnR5LT50eXBlJyBpcyBhbHdheXMgc2V0IHRvCi0gICogICBAQkRGX1BST1BFUlRZX1RZUEVfTk9ORS4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9CREZfUHJvcGVydHkoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3BlcnR5ICk7Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQkRGX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdkODg4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJpdG1hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNvbnZlcnRpbmcgMWJwcCwgMmJwcCwgNGJwcCwgYW5kIDhicHAgKi8KLS8qICAgIGJpdG1hcHMgaW50byA4YnBwIGZvcm1hdCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LCAyMDA1LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRCSVRNQVBfSF9fCi0jZGVmaW5lIF9fRlRCSVRNQVBfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0bWFwX2hhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQml0bWFwIEhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGFuZGxpbmcgRlRfQml0bWFwIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgY29udmVydGluZyBGVF9CaXRtYXAgb2JqZWN0cy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemUgYSBwb2ludGVyIHRvIGFuIEBGVF9CaXRtYXAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFiaXRtYXAgOjogQSBwb2ludGVyIHRvIHRoZSBiaXRtYXAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfQml0bWFwX05ldyggRlRfQml0bWFwICAqYWJpdG1hcCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX0NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29waWVzIGFuIGJpdG1hcCBpbnRvIGFub3RoZXIgb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3VyY2UgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YXJnZXQgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfQ29weSggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgKnRhcmdldCk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfRW1ib2xkZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbWJvbGRlbiBhIGJpdG1hcC4gIFRoZSBuZXcgYml0bWFwIHdpbGwgYmUgYWJvdXQgYHhTdHJlbmd0aCcgICAgICAgKi8KLSAgLyogICAgcGl4ZWxzIHdpZGVyIGFuZCBgeVN0cmVuZ3RoJyBwaXhlbHMgaGlnaGVyLiAgVGhlIGxlZnQgYW5kIGJvdHRvbSAgICovCi0gIC8qICAgIGJvcmRlcnMgYXJlIGtlcHQgdW5jaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeFN0cmVuZ3RoIDo6IEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQgaG9yaXpvbnRhbGx5LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBFeHByZXNzZWQgaW4gMjYuNiBwaXhlbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeVN0cmVuZ3RoIDo6IEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQgdmVydGljYWxseS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBFeHByZXNzZWQgaW4gMjYuNiBwaXhlbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcCAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHJlc3RyaWN0cyBgeFN0cmVuZ3RoJyB0byBiZSBsZXNzIHRoYW4gICAqLwotICAvKiAgICBvciBlcXVhbCB0byA4IGlmIGJpdG1hcCBpcyBvZiBwaXhlbF9tb2RlIEBGVF9QSVhFTF9NT0RFX01PTk8uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSB3YW50IHRvIGVtYm9sZGVuIHRoZSBiaXRtYXAgb3duZWQgYnkgYSBARlRfR2x5cGhTbG90UmVjLCAgICAqLwotICAvKiAgICB5b3Ugc2hvdWxkIGNhbGwgYEZUX0dseXBoU2xvdF9Pd25fQml0bWFwJyBvbiB0aGUgc2xvdCBmaXJzdC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfRW1ib2xkZW4oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHhTdHJlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5U3RyZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9Db252ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbnZlcnQgYSBiaXRtYXAgb2JqZWN0IHdpdGggZGVwdGggMWJwcCwgMmJwcCwgNGJwcCwgb3IgOGJwcCB0byBhICAqLwotICAvKiAgICBiaXRtYXAgb2JqZWN0IHdpdGggZGVwdGggOGJwcCwgbWFraW5nIHRoZSBudW1iZXIgb2YgdXNlZCBieXRlcyBwZXIgKi8KLSAgLyogICAgbGluZSAoYS5rLmEuIHRoZSBgcGl0Y2gnKSBhIG11bHRpcGxlIG9mIGBhbGlnbm1lbnQnLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgIDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3VyY2UgICAgOjogVGhlIHNvdXJjZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFsaWdubWVudCA6OiBUaGUgcGl0Y2ggb2YgdGhlIGJpdG1hcCBpcyBhIG11bHRpcGxlIG9mIHRoaXMgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiAgQ29tbW9uIHZhbHVlcyBhcmUgMSwgMiwgb3IgNC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YXJnZXQgICAgOjogVGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBpcyBwb3NzaWJsZSB0byBjYWxsIEBGVF9CaXRtYXBfQ29udmVydCBtdWx0aXBsZSB0aW1lcyB3aXRob3V0ICAgKi8KLSAgLyogICAgY2FsbGluZyBARlRfQml0bWFwX0RvbmUgKHRoZSBtZW1vcnkgaXMgc2ltcGx5IHJlYWxsb2NhdGVkKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2UgQEZUX0JpdG1hcF9Eb25lIHRvIGZpbmFsbHkgcmVtb3ZlIHRoZSBiaXRtYXAgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbGlicmFyeScgYXJndW1lbnQgaXMgdGFrZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gRnJlZVR5cGUncyAgICAgICAqLwotICAvKiAgICBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfQ29udmVydCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgKnRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgIGFsaWdubWVudCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhIGJpdG1hcCBvYmplY3QgY3JlYXRlZCB3aXRoIEBGVF9CaXRtYXBfTmV3LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXAgIDo6IFRoZSBiaXRtYXAgb2JqZWN0IHRvIGJlIGZyZWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYGxpYnJhcnknIGFyZ3VtZW50IGlzIHRha2VuIHRvIGhhdmUgYWNjZXNzIHRvIEZyZWVUeXBlJ3MgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0RvbmUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICpiaXRtYXAgKTsKLQotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVEJJVE1BUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWRmNzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2FjaGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBDYWNoZSBzdWJzeXN0ZW0gKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQ0FDSEVfSF9fCi0jZGVmaW5lIF9fRlRDQUNIRV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0dMWVBIX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIDxTZWN0aW9uPgotICAgKiAgICBjYWNoZV9zdWJzeXN0ZW0KLSAgICoKLSAgICogPFRpdGxlPgotICAgKiAgICBDYWNoZSBTdWItU3lzdGVtCi0gICAqCi0gICAqIDxBYnN0cmFjdD4KLSAgICogICAgSG93IHRvIGNhY2hlIGZhY2UsIHNpemUsIGFuZCBnbHlwaCBkYXRhIHdpdGggRnJlZVR5cGUgMi4KLSAgICoKLSAgICogPERlc2NyaXB0aW9uPgotICAgKiAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIEZyZWVUeXBlIDIgY2FjaGUgc3ViLXN5c3RlbSwgd2hpY2ggaXMgdXNlZAotICAgKiAgIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudGx5IG9wZW5lZCBARlRfRmFjZSBhbmQgQEZUX1NpemUKLSAgICogICBvYmplY3RzLCBhcyB3ZWxsIGFzIGNhY2hpbmcgaW5mb3JtYXRpb24gbGlrZSBjaGFyYWN0ZXIgbWFwcyBhbmQgZ2x5cGgKLSAgICogICBpbWFnZXMgd2hpbGUgbGltaXRpbmcgdGhlaXIgbWF4aW11bSBtZW1vcnkgdXNhZ2UuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IGFsbCB0eXBlcyBhbmQgZnVuY3Rpb25zIGJlZ2luIHdpdGggdGhlIGBGVENfJyBwcmVmaXguCi0gICAqCi0gICAqICAgVGhlIGNhY2hlIGlzIGhpZ2hseSBwb3J0YWJsZSBhbmQgdGh1cyBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlCi0gICAqICAgZm9udHMgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLCBvciBob3cgdG8gYWNjZXNzIHRoZW0uICBUaGlzIGltcGxpZXMKLSAgICogICB0aGUgZm9sbG93aW5nIHNjaGVtZToKLSAgICoKLSAgICogICBGaXJzdCwgYXZhaWxhYmxlIG9yIGluc3RhbGxlZCBmb250IGZhY2VzIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIGJ5Ci0gICAqICAgQEZUQ19GYWNlSUQgdmFsdWVzLCBwcm92aWRlZCB0byB0aGUgY2FjaGUgYnkgdGhlIGNsaWVudC4gIE5vdGUgdGhhdAotICAgKiAgIHRoZSBjYWNoZSBvbmx5IHN0b3JlcyBhbmQgY29tcGFyZXMgdGhlc2UgdmFsdWVzLCBhbmQgZG9lc24ndCB0cnkgdG8KLSAgICogICBpbnRlcnByZXQgdGhlbSBpbiBhbnkgd2F5LgotICAgKgotICAgKiAgIFNlY29uZCwgdGhlIGNhY2hlIGNhbGxzLCBvbmx5IHdoZW4gbmVlZGVkLCBhIGNsaWVudC1wcm92aWRlZCBmdW5jdGlvbgotICAgKiAgIHRvIGNvbnZlcnQgYSBARlRDX0ZhY2VJRCBpbnRvIGEgbmV3IEBGVF9GYWNlIG9iamVjdC4gIFRoZSBsYXR0ZXIgaXMKLSAgICogICB0aGVuIGNvbXBsZXRlbHkgbWFuYWdlZCBieSB0aGUgY2FjaGUsIGluY2x1ZGluZyBpdHMgdGVybWluYXRpb24KLSAgICogICB0aHJvdWdoIEBGVF9Eb25lX0ZhY2UuCi0gICAqCi0gICAqICAgQ2xpZW50cyBhcmUgZnJlZSB0byBtYXAgZmFjZSBJRHMgdG8gYW55dGhpbmcgZWxzZS4gIFRoZSBtb3N0IHNpbXBsZQotICAgKiAgIHVzYWdlIGlzIHRvIGFzc29jaWF0ZSB0aGVtIHRvIGEgKHBhdGhuYW1lLGZhY2VfaW5kZXgpIHBhaXIgdGhhdCBpcwotICAgKiAgIHVzZWQgdG8gY2FsbCBARlRfTmV3X0ZhY2UuICBIb3dldmVyLCBtb3JlIGNvbXBsZXggc2NoZW1lcyBhcmUgYWxzbwotICAgKiAgIHBvc3NpYmxlLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCBmb3IgdGhlIGNhY2hlIHRvIHdvcmsgY29ycmVjdGx5LCB0aGUgZmFjZSBJRCB2YWx1ZXMgbXVzdCBiZQotICAgKiAgICpwZXJzaXN0ZW50Kiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29udGVudHMgdGhleSBwb2ludCB0byBzaG91bGQgbm90Ci0gICAqICAgY2hhbmdlIGF0IHJ1bnRpbWUsIG9yIHRoYXQgdGhlaXIgdmFsdWUgc2hvdWxkIG5vdCBiZWNvbWUgaW52YWxpZC4KLSAgICoKLSAgICogICBJZiB0aGlzIGlzIHVuYXZvaWRhYmxlIChlLmcuLCB3aGVuIGEgZm9udCBpcyB1bmluc3RhbGxlZCBhdCBydW50aW1lKSwKLSAgICogICB5b3Ugc2hvdWxkIGNhbGwgQEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCBhcyBzb29uIGFzIHBvc3NpYmxlLCB0byBsZXQKLSAgICogICB0aGUgY2FjaGUgZ2V0IHJpZCBvZiBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb2xkIEBGVENfRmFjZUlEIGl0IG1heQotICAgKiAgIGtlZXAgaW50ZXJuYWxseS4gIEZhaWx1cmUgdG8gZG8gc28gd2lsbCBsZWFkIHRvIGluY29ycmVjdCBiZWhhdmlvdXIKLSAgICogICBvciBldmVuIGNyYXNoZXMuCi0gICAqCi0gICAqICAgVG8gdXNlIHRoZSBjYWNoZSwgc3RhcnQgd2l0aCBjYWxsaW5nIEBGVENfTWFuYWdlcl9OZXcgdG8gY3JlYXRlIGEgbmV3Ci0gICAqICAgQEZUQ19NYW5hZ2VyIG9iamVjdCwgd2hpY2ggbW9kZWxzIGEgc2luZ2xlIGNhY2hlIGluc3RhbmNlLiAgWW91IGNhbgotICAgKiAgIHRoZW4gbG9vayB1cCBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cyB3aXRoCi0gICAqICAgQEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UgYW5kIEBGVENfTWFuYWdlcl9Mb29rdXBTaXplLCByZXNwZWN0aXZlbHkuCi0gICAqCi0gICAqICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBjaGFybWFwIGNhY2hpbmcsIGNhbGwgQEZUQ19DTWFwQ2FjaGVfTmV3LCB0aGVuCi0gICAqICAgbGF0ZXIgdXNlIEBGVENfQ01hcENhY2hlX0xvb2t1cCB0byBwZXJmb3JtIHRoZSBlcXVpdmFsZW50IG9mCi0gICAqICAgQEZUX0dldF9DaGFyX0luZGV4LCBvbmx5IG11Y2ggZmFzdGVyLgotICAgKgotICAgKiAgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgQEZUX0dseXBoIGNhY2hpbmcsIGNhbGwgQEZUQ19JbWFnZUNhY2hlLCB0aGVuCi0gICAqICAgbGF0ZXIgdXNlIEBGVENfSW1hZ2VDYWNoZV9Mb29rdXAgdG8gcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICogICBARlRfR2x5cGggb2JqZWN0cyBmcm9tIHRoZSBjYWNoZS4KLSAgICoKLSAgICogICBJZiB5b3UgbmVlZCBsb3RzIG9mIHNtYWxsIGJpdG1hcHMsIGl0IGlzIG11Y2ggbW9yZSBtZW1vcnkgZWZmaWNpZW50Ci0gICAqICAgdG8gY2FsbCBARlRDX1NCaXRDYWNoZV9OZXcgZm9sbG93ZWQgYnkgQEZUQ19TQml0Q2FjaGVfTG9va3VwLiAgVGhpcwotICAgKiAgIHJldHVybnMgQEZUQ19TQml0UmVjIHN0cnVjdHVyZXMsIHdoaWNoIGFyZSB1c2VkIHRvIHN0b3JlIHNtYWxsCi0gICAqICAgYml0bWFwcyBkaXJlY3RseS4gIChBIHNtYWxsIGJpdG1hcCBpcyBvbmUgd2hvc2UgbWV0cmljcyBhbmQKLSAgICogICBkaW1lbnNpb25zIGFsbCBmaXQgaW50byA4LWJpdCBpbnRlZ2VycykuCi0gICAqCi0gICAqICAgV2UgaG9wZSB0byBhbHNvIHByb3ZpZGUgYSBrZXJuaW5nIGNhY2hlIGluIHRoZSBuZWFyIGZ1dHVyZS4KLSAgICoKLSAgICoKLSAgICogPE9yZGVyPgotICAgKiAgIEZUQ19NYW5hZ2VyCi0gICAqICAgRlRDX0ZhY2VJRAotICAgKiAgIEZUQ19GYWNlX1JlcXVlc3RlcgotICAgKgotICAgKiAgIEZUQ19NYW5hZ2VyX05ldwotICAgKiAgIEZUQ19NYW5hZ2VyX1Jlc2V0Ci0gICAqICAgRlRDX01hbmFnZXJfRG9uZQotICAgKiAgIEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UKLSAgICogICBGVENfTWFuYWdlcl9Mb29rdXBTaXplCi0gICAqICAgRlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlECi0gICAqCi0gICAqICAgRlRDX05vZGUKLSAgICogICBGVENfTm9kZV9VbnJlZgotICAgKgotICAgKiAgIEZUQ19JbWFnZUNhY2hlCi0gICAqICAgRlRDX0ltYWdlQ2FjaGVfTmV3Ci0gICAqICAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwCi0gICAqCi0gICAqICAgRlRDX1NCaXQKLSAgICogICBGVENfU0JpdENhY2hlCi0gICAqICAgRlRDX1NCaXRDYWNoZV9OZXcKLSAgICogICBGVENfU0JpdENhY2hlX0xvb2t1cAotICAgKgotICAgKiAgIEZUQ19DTWFwQ2FjaGUKLSAgICogICBGVENfQ01hcENhY2hlX05ldwotICAgKiAgIEZUQ19DTWFwQ2FjaGVfTG9va3VwCi0gICAqCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgQkFTSUMgVFlQRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOiBGVENfRmFjZUlECi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBbiBvcGFxdWUgcG9pbnRlciB0eXBlIHRoYXQgaXMgdXNlZCB0byBpZGVudGl0eSBmYWNlIG9iamVjdHMuICBUaGUKLSAgICogICBjb250ZW50cyBvZiBzdWNoIG9iamVjdHMgaXMgYXBwbGljYXRpb24tZGVwZW5kZW50LgotICAgKgotICAgKiAgIFRoZXNlIHBvaW50ZXJzIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBwb2ludCB0byBhIHVzZXItZGVmaW5lZAotICAgKiAgIHN0cnVjdHVyZSBjb250YWluaW5nIGEgZm9udCBmaWxlIHBhdGgsIGFuZCBmYWNlIGluZGV4LgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBOZXZlciB1c2UgTlVMTCBhcyBhIHZhbGlkIEBGVENfRmFjZUlELgotICAgKgotICAgKiAgIEZhY2UgSURzIGFyZSBwYXNzZWQgYnkgdGhlIGNsaWVudCB0byB0aGUgY2FjaGUgbWFuYWdlciwgd2hpY2ggY2FsbHMsCi0gICAqICAgd2hlbiBuZWVkZWQsIHRoZSBARlRDX0ZhY2VfUmVxdWVzdGVyIHRvIHRyYW5zbGF0ZSB0aGVtIGludG8gbmV3Ci0gICAqICAgQEZUX0ZhY2Ugb2JqZWN0cy4KLSAgICoKLSAgICogICBJZiB0aGUgY29udGVudCBvZiBhIGdpdmVuIGZhY2UgSUQgY2hhbmdlcyBhdCBydW50aW1lLCBvciBpZiB0aGUgdmFsdWUKLSAgICogICBiZWNvbWVzIGludmFsaWQgKGUuZy4sIHdoZW4gdW5pbnN0YWxsaW5nIGEgZm9udCksIHlvdSBzaG91bGQKLSAgICogICBpbW1lZGlhdGVseSBjYWxsIEBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQgYmVmb3JlIGFueSBvdGhlciBjYWNoZQotICAgKiAgIGZ1bmN0aW9uLgotICAgKgotICAgKiAgIEZhaWx1cmUgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gaW5jb3JyZWN0IGJlaGF2aW91ciBvciBldmVuCi0gICAqICAgbWVtb3J5IGxlYWtzIGFuZCBjcmFzaGVzLgotICAgKi8KLSAgdHlwZWRlZiBGVF9Qb2ludGVyICBGVENfRmFjZUlEOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRDX0ZhY2VfUmVxdWVzdGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMuICBJdCBpcyB1c2VkIGJ5Ci0gICAqICAgdGhlIGNhY2hlIG1hbmFnZXIgdG8gdHJhbnNsYXRlIGEgZ2l2ZW4gQEZUQ19GYWNlSUQgaW50byBhIG5ldyB2YWxpZAotICAgKiAgIEBGVF9GYWNlIG9iamVjdCwgb24gZGVtYW5kLgotICAgKgotICAgKiA8SW5wdXQ+Ci0gICAqICAgZmFjZV9pZCA6OgotICAgKiAgICAgVGhlIGZhY2UgSUQgdG8gcmVzb2x2ZS4KLSAgICoKLSAgICogICBsaWJyYXJ5IDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LgotICAgKgotICAgKiAgIHJlcV9kYXRhIDo6Ci0gICAqICAgICBBcHBsaWNhdGlvbi1wcm92aWRlZCByZXF1ZXN0IGRhdGEgKHNlZSBub3RlIGJlbG93KS4KLSAgICoKLSAgICogPE91dHB1dD4KLSAgICogICBhZmFjZSA6OgotICAgKiAgICAgQSBuZXcgQEZUX0ZhY2UgaGFuZGxlLgotICAgKgotICAgKiA8UmV0dXJuPgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIDxOb3RlPgotICAgKiAgIFRoZSB0aGlyZCBwYXJhbWV0ZXIgYHJlcV9kYXRhJyBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBieSB0aGUKLSAgICogICBjbGllbnQgd2hlbiBARlRDX01hbmFnZXJfTmV3IGlzIGNhbGxlZC4KLSAgICoKLSAgICogICBUaGUgZmFjZSByZXF1ZXN0ZXIgc2hvdWxkIG5vdCBwZXJmb3JtIGZ1bm55IHRoaW5ncyBvbiB0aGUgcmV0dXJuZWQKLSAgICogICBmYWNlIG9iamVjdCwgbGlrZSBjcmVhdGluZyBhIG5ldyBARlRfU2l6ZSBmb3IgaXQsIG9yIHNldHRpbmcgYQotICAgKiAgIHRyYW5zZm9ybWF0aW9uIHRocm91Z2ggQEZUX1NldF9UcmFuc2Zvcm0hCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRDX0ZhY2VfUmVxdWVzdGVyKSggRlRDX0ZhY2VJRCAgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIHJlcXVlc3RfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICBhZmFjZSApOwotCi0gLyogKi8KLQotI2RlZmluZSBGVF9QT0lOVEVSX1RPX1VMT05HKCBwICkgICggKEZUX1VMb25nKShGVF9Qb2ludGVyKShwKSApCi0KLSNkZWZpbmUgRlRDX0ZBQ0VfSURfSEFTSCggaSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKChGVF9VSW50MzIpKCggRlRfUE9JTlRFUl9UT19VTE9ORyggaSApID4+IDMgKSBeICAgXAotICAgICAgICAgICAgICAgICAgICAgICAoIEZUX1BPSU5URVJfVE9fVUxPTkcoIGkgKSA8PCA3ICkgKSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIENBQ0hFIE1BTkFHRVIgT0JKRUNUICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBvYmplY3QgY29ycmVzcG9uZHMgdG8gb25lIGluc3RhbmNlIG9mIHRoZSBjYWNoZS1zdWJzeXN0ZW0uICAgICovCi0gIC8qICAgIEl0IGlzIHVzZWQgdG8gY2FjaGUgb25lIG9yIG1vcmUgQEZUX0ZhY2Ugb2JqZWN0cywgYWxvbmcgd2l0aCAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kaW5nIEBGVF9TaXplIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtYW5hZ2VyIGludGVudGlvbmFsbHkgbGltaXRzIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3BlbmVkICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cyB0byBjb250cm9sIG1lbW9yeSB1c2FnZS4gIFNlZSB0aGUgICAgKi8KLSAgLyogICAgYG1heF9mYWNlcycgYW5kIGBtYXhfc2l6ZXMnIHBhcmFtZXRlcnMgb2YgQEZUQ19NYW5hZ2VyX05ldy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWFuYWdlciBpcyBhbHNvIHVzZWQgdG8gY2FjaGUgYG5vZGVzJyBvZiB2YXJpb3VzIHR5cGVzIHdoaWxlICAgKi8KLSAgLyogICAgbGltaXRpbmcgdGhlaXIgdG90YWwgbWVtb3J5IHVzYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbGwgbGltaXRhdGlvbnMgYXJlIGVuZm9yY2VkIGJ5IGtlZXBpbmcgbGlzdHMgb2YgbWFuYWdlZCBvYmplY3RzICAgKi8KLSAgLyogICAgaW4gbW9zdC1yZWNlbnRseS11c2VkIG9yZGVyLCBhbmQgZmx1c2hpbmcgb2xkIG5vZGVzIHRvIG1ha2Ugcm9vbSAgICovCi0gIC8qICAgIGZvciBuZXcgb25lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX01hbmFnZXJSZWNfKiAgRlRDX01hbmFnZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIHRvIGEgY2FjaGUgbm9kZSBvYmplY3QuICBFYWNoIGNhY2hlIG5vZGUgaXMgICAgICAgKi8KLSAgLyogICAgcmVmZXJlbmNlLWNvdW50ZWQuICBBIG5vZGUgd2l0aCBhIGNvdW50IG9mIDAgbWlnaHQgYmUgZmx1c2hlZCAgICAgICovCi0gIC8qICAgIG91dCBvZiBhIGZ1bGwgY2FjaGUgd2hlbmV2ZXIgYSBsb29rdXAgcmVxdWVzdCBpcyBwZXJmb3JtZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgeW91IGxvb2t1cCBub2RlcywgeW91IGhhdmUgdGhlIGFiaWxpdHkgdG8gYGFjcXVpcmUnIHRoZW0sIGkuZS4sICovCi0gIC8qICAgIHRvIGluY3JlbWVudCB0aGVpciByZWZlcmVuY2UgY291bnQuICBUaGlzIHdpbGwgcHJldmVudCB0aGUgbm9kZSAgICAqLwotICAvKiAgICBmcm9tIGJlaW5nIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSB1bnRpbCB5b3UgZXhwbGljaXRseSBgcmVsZWFzZScgKi8KLSAgLyogICAgaXQgKHNlZSBARlRDX05vZGVfVW5yZWYpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgYWxzbyBARlRDX1NCaXRDYWNoZV9Mb29rdXAgYW5kIEBGVENfSW1hZ2VDYWNoZV9Mb29rdXAuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19Ob2RlUmVjXyogIEZUQ19Ob2RlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlcyBhIG5ldyBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgIDo6IFRoZSBwYXJlbnQgRnJlZVR5cGUgbGlicmFyeSBoYW5kbGUgdG8gdXNlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfZmFjZXMgOjogTWF4aW11bSBudW1iZXIgb2Ygb3BlbmVkIEBGVF9GYWNlIG9iamVjdHMgbWFuYWdlZCBieSAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHRoaXMgY2FjaGUgaW5zdGFuY2UuICBVc2UgMCBmb3IgZGVmYXVsdHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfc2l6ZXMgOjogTWF4aW11bSBudW1iZXIgb2Ygb3BlbmVkIEBGVF9TaXplIG9iamVjdHMgbWFuYWdlZCBieSAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHRoaXMgY2FjaGUgaW5zdGFuY2UuICBVc2UgMCBmb3IgZGVmYXVsdHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfYnl0ZXMgOjogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gdXNlIGZvciBjYWNoZWQgZGF0YSBub2Rlcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgIFVzZSAwIGZvciBkZWZhdWx0cy4gIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGRvZXMgbm90ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBhY2NvdW50IGZvciBtYW5hZ2VkIEBGVF9GYWNlIGFuZCBARlRfU2l6ZSBvYmplY3RzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVxdWVzdGVyIDo6IEFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGNhbGxiYWNrIHVzZWQgdG8gdHJhbnNsYXRlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBmYWNlIElEcyBpbnRvIHJlYWwgQEZUX0ZhY2Ugb2JqZWN0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVxX2RhdGEgIDo6IEEgZ2VuZXJpYyBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0ZXIgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkIChzZWUgQEZUQ19GYWNlX1JlcXVlc3RlcikuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtYW5hZ2VyICA6OiBBIGhhbmRsZSB0byBhIG5ldyBtYW5hZ2VyIG9iamVjdC4gIDAgaW4gY2FzZSBvZiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZmFpbHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfTWFuYWdlcl9OZXcoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgIG1heF9mYWNlcywKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgIG1heF9zaXplcywKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICAgIG1heF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICBGVENfRmFjZV9SZXF1ZXN0ZXIgIHJlcXVlc3RlciwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgICAgIHJlcV9kYXRhLAotICAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICAgICAgICAqYW1hbmFnZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyX1Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVtcHRpZXMgYSBnaXZlbiBjYWNoZSBtYW5hZ2VyLiAgVGhpcyBzaW1wbHkgZ2V0cyByaWQgb2YgYWxsIHRoZSAgICAqLwotICAvKiAgICBjdXJyZW50bHkgY2FjaGVkIEBGVF9GYWNlIGFuZCBARlRfU2l6ZSBvYmplY3RzIHdpdGhpbiB0aGUgbWFuYWdlci4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUQ19NYW5hZ2VyX1Jlc2V0KCBGVENfTWFuYWdlciAgbWFuYWdlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBtYW5hZ2VyIGFmdGVyIGVtcHR5aW5nIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGNhY2hlIG1hbmFnZXIgb2JqZWN0LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVENfTWFuYWdlcl9Eb25lKCBGVENfTWFuYWdlciAgbWFuYWdlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfTG9va3VwRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmVzIHRoZSBARlRfRmFjZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuIGZhY2UgSUQgICovCi0gIC8qICAgIHRocm91Z2ggYSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pZCA6OiBUaGUgSUQgb2YgdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJldHVybmVkIEBGVF9GYWNlIG9iamVjdCBpcyBhbHdheXMgb3duZWQgYnkgdGhlIG1hbmFnZXIuICBZb3UgICovCi0gIC8qICAgIHNob3VsZCBuZXZlciB0cnkgdG8gZGlzY2FyZCBpdCB5b3Vyc2VsZi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEBGVF9GYWNlIG9iamVjdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBjdXJyZW50IHNpemUgb2JqZWN0ICovCi0gIC8qICAgIChpLmUuLCBmYWNlLT5zaXplIGNhbiBiZSAwKS4gIElmIHlvdSBuZWVkIGEgc3BlY2lmaWMgYGZvbnQgc2l6ZScsICAqLwotICAvKiAgICB1c2UgQEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5ldmVyIGNoYW5nZSB0aGUgZmFjZSdzIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAoaS5lLiwgbmV2ZXIgY2FsbCAgICAqLwotICAvKiAgICB0aGUgQEZUX1NldF9UcmFuc2Zvcm0gZnVuY3Rpb24pIG9uIGEgcmV0dXJuZWQgZmFjZSEgIElmIHlvdSBuZWVkICAgKi8KLSAgLyogICAgdG8gdHJhbnNmb3JtIGdseXBocywgZG8gaXQgeW91cnNlbGYgYWZ0ZXIgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIHlvdSBwZXJmb3JtIGEgbG9va3VwLCBvdXQtb2YtbWVtb3J5IGVycm9ycyBhcmUgZGV0ZWN0ZWQgICAgICAgKi8KLSAgLyogICAgX3dpdGhpbl8gdGhlIGxvb2t1cCBhbmQgZm9yY2UgaW5jcmVtZW50YWwgZmx1c2hlcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIHVudGlsIGVub3VnaCBtZW1vcnkgaXMgcmVsZWFzZWQgZm9yIHRoZSBsb29rdXAgdG8gc3VjY2VlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYSBsb29rdXAgZmFpbHMgd2l0aCBgRlRfRXJyX091dF9PZl9NZW1vcnknIHRoZSBjYWNoZSBoYXMgICAgICAgICovCi0gIC8qICAgIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IGZsdXNoZWQsIGFuZCBzdGlsbCBubyBtZW1vcnkgd2FzIGF2YWlsYWJsZSAqLwotICAvKiAgICBmb3IgdGhlIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfTWFuYWdlcl9Mb29rdXBGYWNlKCBGVENfTWFuYWdlciAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgIGZhY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NjYWxlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdpdmVuIGNoYXJhY3RlciBzaXplIGluIGVpdGhlciAgICAgICovCi0gIC8qICAgIHBpeGVscyBvciBwb2ludHMgdG8gdGhlIGNhY2hlIG1hbmFnZXIuICBTZWUgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRDX01hbmFnZXJfTG9va3VwU2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2lkIDo6IFRoZSBzb3VyY2UgZmFjZSBJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgOjogVGhlIGNoYXJhY3RlciB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICA6OiBUaGUgY2hhcmFjdGVyIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXhlbCAgIDo6IEEgQm9vbGVhbi4gIElmIDEsIHRoZSBgd2lkdGgnIGFuZCBgaGVpZ2h0JyBmaWVsZHMgYXJlICAgKi8KLSAgLyogICAgICAgICAgICAgICBpbnRlcnByZXRlZCBhcyBpbnRlZ2VyIHBpeGVsIGNoYXJhY3RlciBzaXplcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBleHByZXNzZWQgYXMgMS82NHRoIG9mIHBvaW50cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9yZXMgICA6OiBPbmx5IHVzZWQgd2hlbiBgcGl4ZWwnIGlzIHZhbHVlIDAgdG8gaW5kaWNhdGUgdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9yZXMgICA6OiBPbmx5IHVzZWQgd2hlbiBgcGl4ZWwnIGlzIHZhbHVlIDAgdG8gaW5kaWNhdGUgdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgdHlwZSBpcyBtYWlubHkgdXNlZCB0byByZXRyaWV2ZSBARlRfU2l6ZSBvYmplY3RzIHRocm91Z2ggdGhlICAqLwotICAvKiAgICBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVENfU2NhbGVyUmVjXwotICB7Ci0gICAgRlRDX0ZhY2VJRCAgZmFjZV9pZDsKLSAgICBGVF9VSW50ICAgICB3aWR0aDsKLSAgICBGVF9VSW50ICAgICBoZWlnaHQ7Ci0gICAgRlRfSW50ICAgICAgcGl4ZWw7Ci0gICAgRlRfVUludCAgICAgeF9yZXM7Ci0gICAgRlRfVUludCAgICAgeV9yZXM7Ci0KLSAgfSBGVENfU2NhbGVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gQEZUQ19TY2FsZXJSZWMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfU2NhbGVyUmVjXyogIEZUQ19TY2FsZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9Mb29rdXBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgQEZUX1NpemUgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiAgICAgICAgICAgKi8KLSAgLyogICAgQEZUQ19TY2FsZXJSZWMgcG9pbnRlciB0aHJvdWdoIGEgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzY2FsZXIgIDo6IEEgc2NhbGVyIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc2l6ZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmV0dXJuZWQgQEZUX1NpemUgb2JqZWN0IGlzIGFsd2F5cyBvd25lZCBieSB0aGUgbWFuYWdlci4gIFlvdSAgKi8KLSAgLyogICAgc2hvdWxkIG5ldmVyIHRyeSB0byBkaXNjYXJkIGl0IGJ5IHlvdXJzZWxmLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIGFjY2VzcyB0aGUgcGFyZW50IEBGVF9GYWNlIG9iamVjdCBzaW1wbHkgYXMgYHNpemUtPmZhY2UnICAgKi8KLSAgLyogICAgaWYgeW91IG5lZWQgaXQuICBOb3RlIHRoYXQgdGhpcyBvYmplY3QgaXMgYWxzbyBvd25lZCBieSB0aGUgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4geW91IHBlcmZvcm0gYSBsb29rdXAsIG91dC1vZi1tZW1vcnkgZXJyb3JzIGFyZSBkZXRlY3RlZCAgICAgICAqLwotICAvKiAgICBfd2l0aGluXyB0aGUgbG9va3VwIGFuZCBmb3JjZSBpbmNyZW1lbnRhbCBmbHVzaGVzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgdW50aWwgZW5vdWdoIG1lbW9yeSBpcyByZWxlYXNlZCBmb3IgdGhlIGxvb2t1cCB0byBzdWNjZWVkLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBhIGxvb2t1cCBmYWlscyB3aXRoIGBGVF9FcnJfT3V0X09mX01lbW9yeScgdGhlIGNhY2hlIGhhcyAgICAgICAgKi8KLSAgLyogICAgYWxyZWFkeSBiZWVuIGNvbXBsZXRlbHkgZmx1c2hlZCwgYW5kIHN0aWxsIG5vIG1lbW9yeSBpcyBhdmFpbGFibGUgICovCi0gIC8qICAgIGZvciB0aGUgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgc2NhbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAqYXNpemUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19Ob2RlX1VucmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlY3JlbWVudCBhIGNhY2hlIG5vZGUncyBpbnRlcm5hbCByZWZlcmVuY2UgY291bnQuICBXaGVuIHRoZSBjb3VudCAqLwotICAvKiAgICByZWFjaGVzIDAsIGl0IGlzIG5vdCBkZXN0cm95ZWQgYnV0IGJlY29tZXMgZWxpZ2libGUgZm9yIHN1YnNlcXVlbnQgKi8KLSAgLyogICAgY2FjaGUgZmx1c2hlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSAgICA6OiBUaGUgY2FjaGUgbm9kZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IFRoZSBjYWNoZSBtYW5hZ2VyIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUQ19Ob2RlX1VucmVmKCBGVENfTm9kZSAgICAgbm9kZSwKLSAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlECi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHNwZWNpYWwgZnVuY3Rpb24gdXNlZCB0byBpbmRpY2F0ZSB0byB0aGUgY2FjaGUgbWFuYWdlciB0aGF0Ci0gICAqICAgYSBnaXZlbiBARlRDX0ZhY2VJRCBpcyBubyBsb25nZXIgdmFsaWQsIGVpdGhlciBiZWNhdXNlIGl0cwotICAgKiAgIGNvbnRlbnQgY2hhbmdlZCwgb3IgYmVjYXVzZSBpdCB3YXMgZGVhbGxvY2F0ZWQgb3IgdW5pbnN0YWxsZWQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBtYW5hZ2VyIDo6Ci0gICAqICAgICBUaGUgY2FjaGUgbWFuYWdlciBoYW5kbGUuCi0gICAqCi0gICAqICAgZmFjZV9pZCA6OgotICAgKiAgICAgVGhlIEBGVENfRmFjZUlEIHRvIGJlIHJlbW92ZWQuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyBhbGwgbm9kZXMgZnJvbSB0aGUgY2FjaGUgY29ycmVzcG9uZGluZyB0byB0aGlzCi0gICAqICAgYGZhY2VfaWQnLCB3aXRoIHRoZSBleGNlcHRpb24gb2Ygbm9kZXMgd2l0aCBhIG5vbi1udWxsIHJlZmVyZW5jZQotICAgKiAgIGNvdW50LgotICAgKgotICAgKiAgIFN1Y2ggbm9kZXMgYXJlIGhvd2V2ZXIgbW9kaWZpZWQgaW50ZXJuYWxseSBzbyBhcyB0byBuZXZlciBhcHBlYXIKLSAgICogICBpbiBsYXRlciBsb29rdXBzIHdpdGggdGhlIHNhbWUgYGZhY2VfaWQnIHZhbHVlLCBhbmQgdG8gYmUgaW1tZWRpYXRlbHkKLSAgICogICBkZXN0cm95ZWQgd2hlbiByZWxlYXNlZCBieSBhbGwgdGhlaXIgdXNlcnMuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlSUQgICBmYWNlX2lkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYWNoZV9zdWJzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUQ19DTWFwQ2FjaGUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFuIG9wYXF1ZSBoYW5kbGUgdXNlZCB0byBtb2RlbCBhIGNoYXJtYXAgY2FjaGUuICBUaGlzIGNhY2hlIGlzIHRvCi0gICAqICAgaG9sZCBjaGFyYWN0ZXIgY29kZXMgLT4gZ2x5cGggaW5kaWNlcyBtYXBwaW5ncy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19DTWFwQ2FjaGVSZWNfKiAgRlRDX0NNYXBDYWNoZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVENfQ01hcENhY2hlX05ldwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ3JlYXRlIGEgbmV3IGNoYXJtYXAgY2FjaGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBtYW5hZ2VyIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgY2FjaGUgbWFuYWdlci4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBhY2FjaGUgOjoKLSAgICogICAgIEEgbmV3IGNhY2hlIGhhbmRsZS4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBMaWtlIGFsbCBvdGhlciBjYWNoZXMsIHRoaXMgb25lIHdpbGwgYmUgZGVzdHJveWVkIHdpdGggdGhlIGNhY2hlCi0gICAqICAgbWFuYWdlci4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfQ01hcENhY2hlX05ldyggRlRDX01hbmFnZXIgICAgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVENfQ01hcENhY2hlICAqYWNhY2hlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVENfQ01hcENhY2hlX0xvb2t1cAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVHJhbnNsYXRlIGEgY2hhcmFjdGVyIGNvZGUgaW50byBhIGdseXBoIGluZGV4LCB1c2luZyB0aGUgY2hhcm1hcAotICAgKiAgIGNhY2hlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgY2FjaGUgOjoKLSAgICogICAgIEEgY2hhcm1hcCBjYWNoZSBoYW5kbGUuCi0gICAqCi0gICAqICAgZmFjZV9pZCA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIElELgotICAgKgotICAgKiAgIGNtYXBfaW5kZXggOjoKLSAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgY2hhcm1hcCBpbiB0aGUgc291cmNlIGZhY2UuCi0gICAqCi0gICAqICAgY2hhcl9jb2RlIDo6Ci0gICAqICAgICBUaGUgY2hhcmFjdGVyIGNvZGUgKGluIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJtYXApLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBHbHlwaCBpbmRleC4gIDAgbWVhbnMgYG5vIGdseXBoJy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUQ19DTWFwQ2FjaGVfTG9va3VwKCBGVENfQ01hcENhY2hlICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlSUQgICAgIGZhY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBjbWFwX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgICAgY2hhcl9jb2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYWNoZV9zdWJzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgSU1BR0UgQ0FDSEUgT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRDX0ltYWdlVHlwZVJlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgdHlwZSBvZiBpbWFnZXMgaW4gYSBnbHlwaCBjYWNoZS4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBmYWNlX2lkIDo6Ci0gICAqICAgICBUaGUgZmFjZSBJRC4KLSAgICoKLSAgICogICB3aWR0aCA6OgotICAgKiAgICAgVGhlIHdpZHRoIGluIHBpeGVscy4KLSAgICoKLSAgICogICBoZWlnaHQgOjoKLSAgICogICAgIFRoZSBoZWlnaHQgaW4gcGl4ZWxzLgotICAgKgotICAgKiAgIGZsYWdzIDo6Ci0gICAqICAgICBUaGUgbG9hZCBmbGFncywgYXMgaW4gQEZUX0xvYWRfR2x5cGguCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRDX0ltYWdlVHlwZVJlY18KLSAgewotICAgIEZUQ19GYWNlSUQgIGZhY2VfaWQ7Ci0gICAgRlRfSW50ICAgICAgd2lkdGg7Ci0gICAgRlRfSW50ICAgICAgaGVpZ2h0OwotICAgIEZUX0ludDMyICAgIGZsYWdzOwotCi0gIH0gRlRDX0ltYWdlVHlwZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUQ19JbWFnZVR5cGUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgaGFuZGxlIHRvIGFuIEBGVENfSW1hZ2VUeXBlUmVjIHN0cnVjdHVyZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19JbWFnZVR5cGVSZWNfKiAgRlRDX0ltYWdlVHlwZTsKLQotCi0gIC8qICovCi0KLQotI2RlZmluZSBGVENfSU1BR0VfVFlQRV9DT01QQVJFKCBkMSwgZDIgKSAgICAgIFwKLSAgICAgICAgICAoIChkMSktPmZhY2VfaWQgPT0gKGQyKS0+ZmFjZV9pZCAmJiBcCi0gICAgICAgICAgICAoZDEpLT53aWR0aCAgID09IChkMiktPndpZHRoICAgJiYgXAotICAgICAgICAgICAgKGQxKS0+ZmxhZ3MgICA9PSAoZDIpLT5mbGFncyAgICkKLQotI2RlZmluZSBGVENfSU1BR0VfVFlQRV9IQVNIKCBkICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoRlRfVUZhc3QpKCBGVENfRkFDRV9JRF9IQVNIKCAoZCktPmZhY2VfaWQgKSAgXiBcCi0gICAgICAgICAgICAgICAgICAgICAgKCAoZCktPndpZHRoIDw8IDggKSBeIChkKS0+aGVpZ2h0IF4gXAotICAgICAgICAgICAgICAgICAgICAgICggKGQpLT5mbGFncyA8PCA0ICkgICAgICAgICAgICAgICApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfSW1hZ2VDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBnbHlwaCBpbWFnZSBjYWNoZSBvYmplY3QuICBUaGV5IGFyZSBkZXNpZ25lZCB0byAgICAgKi8KLSAgLyogICAgaG9sZCBtYW55IGRpc3RpbmN0IGdseXBoIGltYWdlcyB3aGlsZSBub3QgZXhjZWVkaW5nIGEgY2VydGFpbiAgICAgICovCi0gIC8qICAgIG1lbW9yeSB0aHJlc2hvbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX0ltYWdlQ2FjaGVSZWNfKiAgRlRDX0ltYWdlQ2FjaGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfSW1hZ2VDYWNoZV9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGVzIGEgbmV3IGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IFRoZSBwYXJlbnQgbWFuYWdlciBmb3IgdGhlIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgZ2x5cGggaW1hZ2UgY2FjaGUgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfSW1hZ2VDYWNoZV9OZXcoIEZUQ19NYW5hZ2VyICAgICAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVENfSW1hZ2VDYWNoZSAgKmFjYWNoZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmVzIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgZnJvbSBhIGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgY2FjaGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBlICAgOjogQSBwb2ludGVyIHRvIGEgZ2x5cGggaW1hZ2UgdHlwZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdpbmRleCA6OiBUaGUgZ2x5cGggaW5kZXggdG8gcmV0cmlldmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnbHlwaCA6OiBUaGUgY29ycmVzcG9uZGluZyBARlRfR2x5cGggb2JqZWN0LiAgMCBpbiBjYXNlIG9mICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgZmFpbHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSAqLwotICAvKiAgICAgICAgICAgICAgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAoc2VlIG5vdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJldHVybmVkIGdseXBoIGlzIG93bmVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBnbHlwaCBpbWFnZSBjYWNoZS4gICovCi0gIC8qICAgIE5ldmVyIHRyeSB0byB0cmFuc2Zvcm0gb3IgZGlzY2FyZCBpdCBtYW51YWxseSEgIFlvdSBjYW4gaG93ZXZlciAgICAqLwotICAvKiAgICBjcmVhdGUgYSBjb3B5IHdpdGggQEZUX0dseXBoX0NvcHkgYW5kIG1vZGlmeSB0aGUgbmV3IG9uZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgX25vdF8gTlVMTCwgaXQgcmVjZWl2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICBub2RlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGltYWdlLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgICAgKi8KLSAgLyogICAgY291bnQuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgQEZUX0dseXBoKSB3aWxsICovCi0gIC8qICAgIGFsd2F5cyBiZSBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gICAgICAqLwotICAvKiAgICBgcmVsZWFzZScgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBARlRfR2x5cGggY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19JbWFnZUNhY2hlX0xvb2t1cCggRlRDX0ltYWdlQ2FjaGUgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19JbWFnZVR5cGUgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICAgKmFnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICAqYW5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19JbWFnZUNhY2hlX0xvb2t1cFNjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmFyaWFudCBvZiBARlRDX0ltYWdlQ2FjaGVfTG9va3VwIHRoYXQgdXNlcyBhbiBARlRDX1NjYWxlclJlYyAgICAqLwotICAvKiAgICB0byBzcGVjaWZ5IHRoZSBmYWNlIElEIGFuZCBpdHMgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYWNoZSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgY2FjaGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNjYWxlciAgICAgOjogQSBwb2ludGVyIHRvIGEgc2NhbGVyIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyA6OiBUaGUgY29ycmVzcG9uZGluZyBsb2FkIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICAgIDo6IFRoZSBnbHlwaCBpbmRleCB0byByZXRyaWV2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGggICAgIDo6IFRoZSBjb3JyZXNwb25kaW5nIEBGVF9HbHlwaCBvYmplY3QuICAwIGluIGNhc2Ugb2YgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbm9kZSAgICAgIDo6IFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIG9mIHRoZSBjb3JyZXNwb25kaW5nICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYWNoZSBub2RlIGFmdGVyIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgKHNlZSBub3RlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBnbHlwaCBpcyBvd25lZCBhbmQgbWFuYWdlZCBieSB0aGUgZ2x5cGggaW1hZ2UgY2FjaGUuICAqLwotICAvKiAgICBOZXZlciB0cnkgdG8gdHJhbnNmb3JtIG9yIGRpc2NhcmQgaXQgbWFudWFsbHkhICBZb3UgY2FuIGhvd2V2ZXIgICAgKi8KLSAgLyogICAgY3JlYXRlIGEgY29weSB3aXRoIEBGVF9HbHlwaF9Db3B5IGFuZCBtb2RpZnkgdGhlIG5ldyBvbmUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBnbHlwaCBpbWFnZSwgYWZ0ZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlICAgICovCi0gIC8qICAgIGNvdW50LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG5vZGUgKGFzIHdlbGwgYXMgdGhlIEBGVF9HbHlwaCkgd2lsbCAqLwotICAvKiAgICBhbHdheXMgYmUga2VwdCBpbiB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvICAgICAgKi8KLSAgLyogICAgYHJlbGVhc2UnIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIE5VTEwsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucyAgKi8KLSAgLyogICAgdGhhdCB0aGUgQEZUX0dseXBoIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCAgICovCi0gIC8qICAgIGNhbGwgdG8gb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0ICAqLwotICAvKiAgICBpcyBwZXJzaXN0ZW50ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfSW1hZ2VDYWNoZV9Mb29rdXBTY2FsZXIoIEZUQ19JbWFnZUNhY2hlICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgICAgc2NhbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICAgKmFnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICAqYW5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IuICBTZWUgdGhlIEBGVENfU0JpdFJlYyAgICAgICAqLwotICAvKiAgICBzdHJ1Y3R1cmUgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19TQml0UmVjXyogIEZUQ19TQml0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IGNvbXBhY3Qgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBzbWFsbCBnbHlwaCBiaXRtYXAuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgIDo6IFRoZSBiaXRtYXAgd2lkdGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgOjogVGhlIGJpdG1hcCBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnQgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBkaXN0YW5jZSBmcm9tIHRoZSBwZW4gcG9zaXRpb24gdG8gdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgbGVmdCBiaXRtYXAgYm9yZGVyIChhLmsuYS4gYGxlZnQgc2lkZSBiZWFyaW5nJywgb3IgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGBsc2InKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0b3AgICAgICAgOjogVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGZyb20gdGhlIHBlbiBwb3NpdGlvbiAob24gdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGJhc2VsaW5lKSB0byB0aGUgdXBwZXIgYml0bWFwIGJvcmRlciAoYS5rLmEuIGB0b3AgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBzaWRlIGJlYXJpbmcnKS4gIFRoZSBkaXN0YW5jZSBpcyBwb3NpdGl2ZSBmb3IgdXB3YXJkcyAqLwotICAvKiAgICAgICAgICAgICAgICAgWSBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgICA6OiBUaGUgZm9ybWF0IG9mIHRoZSBnbHlwaCBiaXRtYXAgKG1vbm9jaHJvbWUgb3IgZ3JheSkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2dyYXlzIDo6IE1heGltdW0gZ3JheSBsZXZlbCB2YWx1ZSAoaW4gdGhlIHJhbmdlIDEgdG8gMjU1KS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXRjaCAgICAgOjogVGhlIG51bWJlciBvZiBieXRlcyBwZXIgYml0bWFwIGxpbmUuICBNYXkgYmUgcG9zaXRpdmUgKi8KLSAgLyogICAgICAgICAgICAgICAgIG9yIG5lZ2F0aXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4YWR2YW5jZSAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZSB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlhZHZhbmNlICA6OiBUaGUgdmVydGljYWwgYWR2YW5jZSBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyICAgIDo6IEEgcG9pbnRlciB0byB0aGUgYml0bWFwIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRDX1NCaXRSZWNfCi0gIHsKLSAgICBGVF9CeXRlICAgd2lkdGg7Ci0gICAgRlRfQnl0ZSAgIGhlaWdodDsKLSAgICBGVF9DaGFyICAgbGVmdDsKLSAgICBGVF9DaGFyICAgdG9wOwotCi0gICAgRlRfQnl0ZSAgIGZvcm1hdDsKLSAgICBGVF9CeXRlICAgbWF4X2dyYXlzOwotICAgIEZUX1Nob3J0ICBwaXRjaDsKLSAgICBGVF9DaGFyICAgeGFkdmFuY2U7Ci0gICAgRlRfQ2hhciAgIHlhZHZhbmNlOwotCi0gICAgRlRfQnl0ZSogIGJ1ZmZlcjsKLQotICB9IEZUQ19TQml0UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgY2FjaGUuICBUaGVzZSBhcmUgc3BlY2lhbCBjYWNoZSBvYmplY3RzICovCi0gIC8qICAgIHVzZWQgdG8gc3RvcmUgc21hbGwgZ2x5cGggYml0bWFwcyAoYW5kIGFudGktYWxpYXNlZCBwaXhtYXBzKSBpbiBhICAqLwotICAvKiAgICBtdWNoIG1vcmUgZWZmaWNpZW50IHdheSB0aGFuIHRoZSB0cmFkaXRpb25hbCBnbHlwaCBpbWFnZSBjYWNoZSAgICAgKi8KLSAgLyogICAgaW1wbGVtZW50ZWQgYnkgQEZUQ19JbWFnZUNhY2hlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfU0JpdENhY2hlUmVjXyogIEZUQ19TQml0Q2FjaGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdENhY2hlX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGVzIGEgbmV3IGNhY2hlIHRvIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgc2JpdCBjYWNoZS4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfU0JpdENhY2hlX05ldyggRlRDX01hbmFnZXIgICAgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVENfU0JpdENhY2hlICAqYWNhY2hlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdENhY2hlX0xvb2t1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb29rcyB1cCBhIGdpdmVuIHNtYWxsIGdseXBoIGJpdG1hcCBpbiBhIGdpdmVuIHNiaXQgY2FjaGUgYW5kICAgICAgKi8KLSAgLyogICAgYGxvY2snIGl0IHRvIHByZXZlbnQgaXRzIGZsdXNoaW5nIGZyb20gdGhlIGNhY2hlIHVudGlsIG5lZWRlZC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugc2JpdCBjYWNoZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBlICAgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBpbWFnZSB0eXBlIGRlc2NyaXB0b3IuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdpbmRleCA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNiaXQgICA6OiBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5vZGUgIDo6IFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhY2hlICovCi0gIC8qICAgICAgICAgICAgICBub2RlIGFmdGVyIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50IChzZWUgbm90ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IgYW5kIGl0cyBiaXQgYnVmZmVyIGFyZSBvd25lZCBieSB0aGUgICAgKi8KLSAgLyogICAgY2FjaGUgYW5kIHNob3VsZCBuZXZlciBiZSBmcmVlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGV5IG1pZ2h0ICAgICovCi0gIC8qICAgIGFzIHdlbGwgZGlzYXBwZWFyIGZyb20gbWVtb3J5IG9uIHRoZSBuZXh0IGNhY2hlIGxvb2t1cCwgc28gZG9uJ3QgICAqLwotICAvKiAgICB0cmVhdCB0aGVtIGFzIHBlcnNpc3RlbnQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZXNjcmlwdG9yJ3MgYGJ1ZmZlcicgZmllbGQgaXMgc2V0IHRvIDAgdG8gaW5kaWNhdGUgYSBtaXNzaW5nICAqLwotICAvKiAgICBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgX25vdF8gTlVMTCwgaXQgcmVjZWl2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICBub2RlIGNvbnRhaW5pbmcgdGhlIGJpdG1hcCwgYWZ0ZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlIGNvdW50LiAgKi8KLSAgLyogICAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG5vZGUgKGFzIHdlbGwgYXMgdGhlIGltYWdlKSB3aWxsIGFsd2F5cyBiZSAgICovCi0gIC8qICAgIGtlcHQgaW4gdGhlIGNhY2hlIHVudGlsIHlvdSBjYWxsIEBGVENfTm9kZV9VbnJlZiB0byBgcmVsZWFzZScgaXQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBOVUxMLCB0aGUgY2FjaGUgbm9kZSBpcyBsZWZ0IHVuY2hhbmdlZCwgd2hpY2ggbWVhbnMgICovCi0gIC8qICAgIHRoYXQgdGhlIGJpdG1hcCBjb3VsZCBiZSBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgb24gdGhlIG5leHQgICAgICAqLwotICAvKiAgICBjYWxsIHRvIG9uZSBvZiB0aGUgY2FjaGluZyBzdWItc3lzdGVtIEFQSXMuICBEb24ndCBhc3N1bWUgdGhhdCBpdCAgKi8KLSAgLyogICAgaXMgcGVyc2lzdGVudCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX1NCaXRDYWNoZV9Mb29rdXAoIEZUQ19TQml0Q2FjaGUgICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfSW1hZ2VUeXBlICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TQml0ICAgICAgICAqc2JpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgICAqYW5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0Q2FjaGVfTG9va3VwU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmFyaWFudCBvZiBARlRDX1NCaXRDYWNoZV9Mb29rdXAgdGhhdCB1c2VzIGFuIEBGVENfU2NhbGVyUmVjICAgICAqLwotICAvKiAgICB0byBzcGVjaWZ5IHRoZSBmYWNlIElEIGFuZCBpdHMgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYWNoZSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugc2JpdCBjYWNoZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNjYWxlciAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzY2FsZXIgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyA6OiBUaGUgY29ycmVzcG9uZGluZyBsb2FkIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0ICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICAgICAgOjogVXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2Ygb2YgdGhlIGNvcnJlc3BvbmRpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNhY2hlIG5vZGUgYWZ0ZXIgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yIGFuZCBpdHMgYml0IGJ1ZmZlciBhcmUgb3duZWQgYnkgdGhlICAgICovCi0gIC8qICAgIGNhY2hlIGFuZCBzaG91bGQgbmV2ZXIgYmUgZnJlZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhleSBtaWdodCAgICAqLwotICAvKiAgICBhcyB3ZWxsIGRpc2FwcGVhciBmcm9tIG1lbW9yeSBvbiB0aGUgbmV4dCBjYWNoZSBsb29rdXAsIHNvIGRvbid0ICAgKi8KLSAgLyogICAgdHJlYXQgdGhlbSBhcyBwZXJzaXN0ZW50IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVzY3JpcHRvcidzIGBidWZmZXInIGZpZWxkIGlzIHNldCB0byAwIHRvIGluZGljYXRlIGEgbWlzc2luZyAgKi8KLSAgLyogICAgZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBiaXRtYXAsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4gICovCi0gIC8qICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBpbWFnZSkgd2lsbCBhbHdheXMgYmUgICAqLwotICAvKiAgICBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gYHJlbGVhc2UnIGl0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBiaXRtYXAgY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19TQml0Q2FjaGVfTG9va3VwU2NhbGVyKCBGVENfU0JpdENhY2hlICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TY2FsZXIgICAgIHNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU0JpdCAgICAgICpzYml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAqYW5vZGUgKTsKLQotCi0gLyogKi8KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotCi0gIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19Gb250UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgZ2l2ZW4gYGZvbnQnIHRvIHRoZSBjYWNoZSAgICAqLwotICAvKiAgICBtYW5hZ2VyLiAgTm90ZSB0aGF0IGEgYGZvbnQnIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhIGdpdmVuIGZhY2UgICAgKi8KLSAgLyogICAgd2l0aCBhIGdpdmVuIGNoYXJhY3RlciBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pZCAgICA6OiBUaGUgSUQgb2YgdGhlIGZhY2UgdG8gdXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXhfd2lkdGggIDo6IFRoZSBjaGFyYWN0ZXIgd2lkdGggaW4gaW50ZWdlciBwaXhlbHMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBpeF9oZWlnaHQgOjogVGhlIGNoYXJhY3RlciBoZWlnaHQgaW4gaW50ZWdlciBwaXhlbHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19Gb250UmVjXwotICB7Ci0gICAgRlRDX0ZhY2VJRCAgZmFjZV9pZDsKLSAgICBGVF9VU2hvcnQgICBwaXhfd2lkdGg7Ci0gICAgRlRfVVNob3J0ICAgcGl4X2hlaWdodDsKLQotICB9IEZUQ19Gb250UmVjOwotCi0KLSAgLyogKi8KLQotCi0jZGVmaW5lIEZUQ19GT05UX0NPTVBBUkUoIGYxLCBmMiApICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKGYxKS0+ZmFjZV9pZCAgICA9PSAoZjIpLT5mYWNlX2lkICAgICYmIFwKLSAgICAgICAgICAgIChmMSktPnBpeF93aWR0aCAgPT0gKGYyKS0+cGl4X3dpZHRoICAmJiBcCi0gICAgICAgICAgICAoZjEpLT5waXhfaGVpZ2h0ID09IChmMiktPnBpeF9oZWlnaHQgKQotCi0jZGVmaW5lIEZUQ19GT05UX0hBU0goIGYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoRlRfVUludDMyKSggRlRDX0ZBQ0VfSURfSEFTSCgoZiktPmZhY2VfaWQpIF4gXAotICAgICAgICAgICAgICAgICAgICAgICAoKGYpLT5waXhfd2lkdGggPDwgOCkgICAgICAgICAgXiBcCi0gICAgICAgICAgICAgICAgICAgICAgICgoZiktPnBpeF9oZWlnaHQpICAgICAgICAgICAgICApCi0KLSAgdHlwZWRlZiBGVENfRm9udFJlYyogIEZUQ19Gb250OwotCi0KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19NYW5hZ2VyX0xvb2t1cF9GYWNlKCBGVENfTWFuYWdlciAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlSUQgICBmYWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgKmFmYWNlICk7Ci0KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19NYW5hZ2VyX0xvb2t1cF9TaXplKCBGVENfTWFuYWdlciAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Gb250ICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgKmFmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgKmFzaXplICk7Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KLQotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVENBQ0hFX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGNoYXB0ZXJzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2MTgyNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEZyZWVUeXBlIHJlZmVyZW5jZS4gICAgICAgICAgICAgICovCi0vKiBJdCBpcyB1c2VkIGJ5IHRoZSBweXRob24gc2NyaXB0IHdoaWNoIGdlbmVyYXRlcyB0aGUgSFRNTCBmaWxlcy4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZ2VuZXJhbF9yZW1hcmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgR2VuZXJhbCBSZW1hcmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgdXNlcl9hbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPENoYXB0ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGNvcmVfYXBpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENvcmUgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPFNlY3Rpb25zPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBiYXNpY190eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYmFzZV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGdseXBoX3ZhcmlhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBnbHlwaF9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbWFjX3NwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHNpemVzX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBoZWFkZXJfZmlsZV9tYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZm9ybWF0X3NwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRm9ybWF0LVNwZWNpZmljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbXVsdGlwbGVfbWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHRydWV0eXBlX3RhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICB0eXBlMV90YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgc2ZudF9uYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJkZl9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBjaWRfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgcGZyX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHdpbmZudF9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBmb250X2Zvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZ2FzcF90YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPENoYXB0ZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGNhY2hlX3N1YnN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENhY2hlIFN1Yi1TeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPFNlY3Rpb25zPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGNhY2hlX3N1YnN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxDaGFwdGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBzdXBwb3J0X2FwaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTdXBwb3J0IEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxTZWN0aW9ucz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBjb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbGlzdF9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBiaXRtYXBfaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgcmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGdseXBoX3N0cm9rZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBzeXN0ZW1faW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbW9kdWxlX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBsencgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbGNkX2ZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGNpZC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGNpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM4N2YwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2lkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBDSUQgZm9udCBpbmZvcm1hdGlvbiAoc3BlY2lmaWNhdGlvbikuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNyBieSBEZXJlZyBDbGVnZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRDSURfSF9fCi0jZGVmaW5lIF9fRlRDSURfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRCBGb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRC1rZXllZCBmb250IHNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgQ0lELWtleWVkIGZvbnQgc3BlY2lmaWMgICAqLwotICAvKiAgICBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9HZXRfQ0lEX1JlZ2lzdHJ5X09yZGVyaW5nX1N1cHBsZW1lbnQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgUmVnaXN0cnkvT3JkZXJpbmcvU3VwcGxlbWVudCB0cmlwbGUgKGFsc28ga25vd24gYXMgdGhlCi0gICAqICAgICJSL08vUyIpIGZyb20gYSBDSUQta2V5ZWQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgICByZWdpc3RyeSA6OgotICAgKiAgICAgICBUaGUgcmVnaXN0cnksIGFzIGEgQyBzdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAgKgotICAgKiAgICBvcmRlcmluZyA6OgotICAgKiAgICAgICBUaGUgb3JkZXJpbmcsIGFzIGEgQyBzdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAgKgotICAgKiAgICBzdXBwbGVtZW50IDo6Ci0gICAqICAgICAgIFRoZSBzdXBwbGVtZW50LgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgICogICAgb3RoZXJ3aXNlLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgIDIuMy42Ci0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0NJRF9SZWdpc3RyeV9PcmRlcmluZ19TdXBwbGVtZW50KCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKm9yZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqc3VwcGxlbWVudCk7Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQ0lEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FkMjU2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGVycmRlZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDQsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgIExJU1QgT0YgRVJST1IgQ09ERVMvTUVTU0FHRVMgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBZb3UgbmVlZCB0byBkZWZpbmUgYm90aCBGVF9FUlJPUkRFRl8gYW5kIEZUX05PRVJST1JERUZfIGJlZm9yZSAqLwotICAvKiBpbmNsdWRpbmcgdGhpcyBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLSAgLyogZ2VuZXJpYyBlcnJvcnMgKi8KLQotICBGVF9OT0VSUk9SREVGXyggT2ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsIFwKLSAgICAgICAgICAgICAgICAgICJubyBlcnJvciIgKQotCi0gIEZUX0VSUk9SREVGXyggQ2Fubm90X09wZW5fUmVzb3VyY2UsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwgXAotICAgICAgICAgICAgICAgICJjYW5ub3Qgb3BlbiByZXNvdXJjZSIgKQotICBGVF9FUlJPUkRFRl8oIFVua25vd25fRmlsZV9Gb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIsIFwKLSAgICAgICAgICAgICAgICAidW5rbm93biBmaWxlIGZvcm1hdCIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfRmlsZV9Gb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMsIFwKLSAgICAgICAgICAgICAgICAiYnJva2VuIGZpbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0LCBcCi0gICAgICAgICAgICAgICAgImludmFsaWQgRnJlZVR5cGUgdmVyc2lvbiIgKQotICBGVF9FUlJPUkRFRl8oIExvd2VyX01vZHVsZV9WZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUsIFwKLSAgICAgICAgICAgICAgICAibW9kdWxlIHZlcnNpb24gaXMgdG9vIGxvdyIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQXJndW1lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsIFwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBhcmd1bWVudCIgKQotICBGVF9FUlJPUkRFRl8oIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDcsIFwKLSAgICAgICAgICAgICAgICAidW5pbXBsZW1lbnRlZCBmZWF0dXJlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9UYWJsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCwgXAotICAgICAgICAgICAgICAgICJicm9rZW4gdGFibGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX09mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LCBcCi0gICAgICAgICAgICAgICAgImJyb2tlbiBvZmZzZXQgd2l0aGluIHRhYmxlIiApCi0gIEZUX0VSUk9SREVGXyggQXJyYXlfVG9vX0xhcmdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwgXAotICAgICAgICAgICAgICAgICJhcnJheSBhbGxvY2F0aW9uIHNpemUgdG9vIGxhcmdlIiApCi0KLSAgLyogZ2x5cGgvY2hhcmFjdGVyIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9HbHlwaF9JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGdseXBoIGluZGV4IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DaGFyYWN0ZXJfQ29kZSwgICAgICAgICAgICAgICAgICAgICAgMHgxMSwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNoYXJhY3RlciBjb2RlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9HbHlwaF9Gb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwgXAotICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBnbHlwaCBpbWFnZSBmb3JtYXQiICkKLSAgRlRfRVJST1JERUZfKCBDYW5ub3RfUmVuZGVyX0dseXBoLCAgICAgICAgICAgICAgICAgICAgICAgICAweDEzLCBcCi0gICAgICAgICAgICAgICAgImNhbm5vdCByZW5kZXIgdGhpcyBnbHlwaCBmb3JtYXQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX091dGxpbmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LCBcCi0gICAgICAgICAgICAgICAgImludmFsaWQgb3V0bGluZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ29tcG9zaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUsIFwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBjb21wb3NpdGUgZ2x5cGgiICkKLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9IaW50cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE2LCBcCi0gICAgICAgICAgICAgICAgInRvbyBtYW55IGhpbnRzIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9QaXhlbF9TaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNywgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHBpeGVsIHNpemUiICkKLQotICAvKiBoYW5kbGUgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwLCBcCi0gICAgICAgICAgICAgICAgImludmFsaWQgb2JqZWN0IGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfTGlicmFyeV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgIDB4MjEsIFwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBsaWJyYXJ5IGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfRHJpdmVyX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgIDB4MjIsIFwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBtb2R1bGUgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9GYWNlX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMywgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGZhY2UgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TaXplX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNCwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHNpemUgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TbG90X0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNSwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGdseXBoIHNsb3QgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DaGFyTWFwX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgMHgyNiwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNoYXJtYXAgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DYWNoZV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAgMHgyNywgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNhY2hlIG1hbmFnZXIgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgMHgyOCwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBoYW5kbGUiICkKLQotICAvKiBkcml2ZXIgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9Ecml2ZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwLCBcCi0gICAgICAgICAgICAgICAgInRvbyBtYW55IG1vZHVsZXMiICkKLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9FeHRlbnNpb25zLCAgICAgICAgICAgICAgICAgICAgICAgICAweDMxLCBcCi0gICAgICAgICAgICAgICAgInRvbyBtYW55IGV4dGVuc2lvbnMiICkKLQotICAvKiBtZW1vcnkgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBPdXRfT2ZfTWVtb3J5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwLCBcCi0gICAgICAgICAgICAgICAgIm91dCBvZiBtZW1vcnkiICkKLSAgRlRfRVJST1JERUZfKCBVbmxpc3RlZF9PYmplY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxLCBcCi0gICAgICAgICAgICAgICAgInVubGlzdGVkIG9iamVjdCIgKQotCi0gIC8qIHN0cmVhbSBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIENhbm5vdF9PcGVuX1N0cmVhbSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTEsIFwKLSAgICAgICAgICAgICAgICAiY2Fubm90IG9wZW4gc3RyZWFtIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fU2VlaywgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MiwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBzZWVrIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fU2tpcCwgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MywgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBza2lwIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fUmVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NCwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSByZWFkIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uLCAgICAgICAgICAgICAgICAgICAgMHg1NSwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBvcGVyYXRpb24iICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0ZyYW1lX09wZXJhdGlvbiwgICAgICAgICAgICAgICAgICAgICAweDU2LCBcCi0gICAgICAgICAgICAgICAgImludmFsaWQgZnJhbWUgb3BlcmF0aW9uIiApCi0gIEZUX0VSUk9SREVGXyggTmVzdGVkX0ZyYW1lX0FjY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NywgXAotICAgICAgICAgICAgICAgICJuZXN0ZWQgZnJhbWUgYWNjZXNzIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9GcmFtZV9SZWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1OCwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGZyYW1lIHJlYWQiICkKLQotICAvKiByYXN0ZXIgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfVW5pbml0aWFsaXplZCwgICAgICAgICAgICAgICAgICAgICAgICAweDYwLCBcCi0gICAgICAgICAgICAgICAgInJhc3RlciB1bmluaXRpYWxpemVkIiApCi0gIEZUX0VSUk9SREVGXyggUmFzdGVyX0NvcnJ1cHRlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MSwgXAotICAgICAgICAgICAgICAgICJyYXN0ZXIgY29ycnVwdGVkIiApCi0gIEZUX0VSUk9SREVGXyggUmFzdGVyX092ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MiwgXAotICAgICAgICAgICAgICAgICJyYXN0ZXIgb3ZlcmZsb3ciICkKLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfTmVnYXRpdmVfSGVpZ2h0LCAgICAgICAgICAgICAgICAgICAgICAweDYzLCBcCi0gICAgICAgICAgICAgICAgIm5lZ2F0aXZlIGhlaWdodCB3aGlsZSByYXN0ZXJpbmciICkKLQotICAvKiBjYWNoZSBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIFRvb19NYW55X0NhY2hlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAsIFwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgcmVnaXN0ZXJlZCBjYWNoZXMiICkKLQotICAvKiBUcnVlVHlwZSBhbmQgU0ZOVCBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfT3Bjb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsIFwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBvcGNvZGUiICkKLSAgRlRfRVJST1JERUZfKCBUb29fRmV3X0FyZ3VtZW50cywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxLCBcCi0gICAgICAgICAgICAgICAgInRvbyBmZXcgYXJndW1lbnRzIiApCi0gIEZUX0VSUk9SREVGXyggU3RhY2tfT3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MiwgXAotICAgICAgICAgICAgICAgICJzdGFjayBvdmVyZmxvdyIgKQotICBGVF9FUlJPUkRFRl8oIENvZGVfT3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMsIFwKLSAgICAgICAgICAgICAgICAiY29kZSBvdmVyZmxvdyIgKQotICBGVF9FUlJPUkRFRl8oIEJhZF9Bcmd1bWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODQsIFwKLSAgICAgICAgICAgICAgICAiYmFkIGFyZ3VtZW50IiApCi0gIEZUX0VSUk9SREVGXyggRGl2aWRlX0J5X1plcm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NSwgXAotICAgICAgICAgICAgICAgICJkaXZpc2lvbiBieSB6ZXJvIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9SZWZlcmVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NiwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlZmVyZW5jZSIgKQotICBGVF9FUlJPUkRFRl8oIERlYnVnX09wQ29kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODcsIFwKLSAgICAgICAgICAgICAgICAiZm91bmQgZGVidWcgb3Bjb2RlIiApCi0gIEZUX0VSUk9SREVGXyggRU5ERl9Jbl9FeGVjX1N0cmVhbSwgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OCwgXAotICAgICAgICAgICAgICAgICJmb3VuZCBFTkRGIG9wY29kZSBpbiBleGVjdXRpb24gc3RyZWFtIiApCi0gIEZUX0VSUk9SREVGXyggTmVzdGVkX0RFRlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OSwgXAotICAgICAgICAgICAgICAgICJuZXN0ZWQgREVGUyIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ29kZVJhbmdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEEsIFwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBjb2RlIHJhbmdlIiApCi0gIEZUX0VSUk9SREVGXyggRXhlY3V0aW9uX1Rvb19Mb25nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QiwgXAotICAgICAgICAgICAgICAgICJleGVjdXRpb24gY29udGV4dCB0b28gbG9uZyIgKQotICBGVF9FUlJPUkRFRl8oIFRvb19NYW55X0Z1bmN0aW9uX0RlZnMsICAgICAgICAgICAgICAgICAgICAgIDB4OEMsIFwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMiICkKLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9JbnN0cnVjdGlvbl9EZWZzLCAgICAgICAgICAgICAgICAgICAweDhELCBcCi0gICAgICAgICAgICAgICAgInRvbyBtYW55IGluc3RydWN0aW9uIGRlZmluaXRpb25zIiApCi0gIEZUX0VSUk9SREVGXyggVGFibGVfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RSwgXAotICAgICAgICAgICAgICAgICJTRk5UIGZvbnQgdGFibGUgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIEhvcml6X0hlYWRlcl9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgIDB4OEYsIFwKLSAgICAgICAgICAgICAgICAiaG9yaXpvbnRhbCBoZWFkZXIgKGhoZWEpIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBMb2NhdGlvbnNfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkwLCBcCi0gICAgICAgICAgICAgICAgImxvY2F0aW9ucyAobG9jYSkgdGFibGUgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE5hbWVfVGFibGVfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEsIFwKLSAgICAgICAgICAgICAgICAibmFtZSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggQ01hcF9UYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MiwgXAotICAgICAgICAgICAgICAgICJjaGFyYWN0ZXIgbWFwIChjbWFwKSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggSG10eF9UYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MywgXAotICAgICAgICAgICAgICAgICJob3Jpem9udGFsIG1ldHJpY3MgKGhtdHgpIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBQb3N0X1RhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDk0LCBcCi0gICAgICAgICAgICAgICAgIlBvc3RTY3JpcHQgKHBvc3QpIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0hvcml6X01ldHJpY3MsICAgICAgICAgICAgICAgICAgICAgICAweDk1LCBcCi0gICAgICAgICAgICAgICAgImludmFsaWQgaG9yaXpvbnRhbCBtZXRyaWNzIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DaGFyTWFwX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgMHg5NiwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNoYXJhY3RlciBtYXAgKGNtYXApIGZvcm1hdCIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfUFBlbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTcsIFwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBwcGVtIHZhbHVlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9WZXJ0X01ldHJpY3MsICAgICAgICAgICAgICAgICAgICAgICAgMHg5OCwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHZlcnRpY2FsIG1ldHJpY3MiICkKLSAgRlRfRVJST1JERUZfKCBDb3VsZF9Ob3RfRmluZF9Db250ZXh0LCAgICAgICAgICAgICAgICAgICAgICAweDk5LCBcCi0gICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGNvbnRleHQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1Bvc3RfVGFibGVfRm9ybWF0LCAgICAgICAgICAgICAgICAgICAweDlBLCBcCi0gICAgICAgICAgICAgICAgImludmFsaWQgUG9zdFNjcmlwdCAocG9zdCkgdGFibGUgZm9ybWF0IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9Qb3N0X1RhYmxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5QiwgXAotICAgICAgICAgICAgICAgICJpbnZhbGlkIFBvc3RTY3JpcHQgKHBvc3QpIHRhYmxlIiApCi0KLSAgLyogQ0ZGLCBDSUQsIGFuZCBUeXBlIDEgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBTeW50YXhfRXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEEwLCBcCi0gICAgICAgICAgICAgICAgIm9wY29kZSBzeW50YXggZXJyb3IiICkKLSAgRlRfRVJST1JERUZfKCBTdGFja19VbmRlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEExLCBcCi0gICAgICAgICAgICAgICAgImFyZ3VtZW50IHN0YWNrIHVuZGVyZmxvdyIgKQotICBGVF9FUlJPUkRFRl8oIElnbm9yZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTIsIFwKLSAgICAgICAgICAgICAgICAiaWdub3JlIiApCi0KLSAgLyogQkRGIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19TdGFydGZvbnRfRmllbGQsICAgICAgICAgICAgICAgICAgICAgMHhCMCwgXAotICAgICAgICAgICAgICAgICJgU1RBUlRGT05UJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19Gb250X0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMSwgXAotICAgICAgICAgICAgICAgICJgRk9OVCcgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfU2l6ZV9GaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjIsIFwKLSAgICAgICAgICAgICAgICAiYFNJWkUnIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0NoYXJzX0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAweEIzLCBcCi0gICAgICAgICAgICAgICAgImBDSEFSUycgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfU3RhcnRjaGFyX0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgIDB4QjQsIFwKLSAgICAgICAgICAgICAgICAiYFNUQVJUQ0hBUicgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfRW5jb2RpbmdfRmllbGQsICAgICAgICAgICAgICAgICAgICAgIDB4QjUsIFwKLSAgICAgICAgICAgICAgICAiYEVOQ09ESU5HJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19CYnhfRmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCNiwgXAotICAgICAgICAgICAgICAgICJgQkJYJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggQmJ4X1Rvb19CaWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCNywgXAotICAgICAgICAgICAgICAgICJgQkJYJyB0b28gYmlnIiApCi0gIEZUX0VSUk9SREVGXyggQ29ycnVwdGVkX0ZvbnRfSGVhZGVyLCAgICAgICAgICAgICAgICAgICAgICAgMHhCOCwgXAotICAgICAgICAgICAgICAgICJGb250IGhlYWRlciBjb3JydXB0ZWQgb3IgbWlzc2luZyBmaWVsZHMiICkKLSAgRlRfRVJST1JERUZfKCBDb3JydXB0ZWRfRm9udF9HbHlwaHMsICAgICAgICAgICAgICAgICAgICAgICAweEI5LCBcCi0gICAgICAgICAgICAgICAgIkZvbnQgZ2x5cGhzIGNvcnJ1cHRlZCBvciBtaXNzaW5nIGZpZWxkcyIgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAwZGFkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGVycm9ycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZSBoYW5kbGluZyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNCwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIHNwZWNpYWwgaGVhZGVyIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGhhbmRsaW5nIG9mIEZUMiAgICAgICAgKi8KLSAgLyogZW51bWVyYXRpb24gY29uc3RhbnRzLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBnZW5lcmF0ZSBlcnJvciBtZXNzYWdlICovCi0gIC8qIHN0cmluZ3Mgd2l0aCBhIHNtYWxsIG1hY3JvIHRyaWNrIGV4cGxhaW5lZCBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSSAtIEVycm9yIEZvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGNhbiBiZSAgICovCi0gIC8qICAgZGVmaW5lZCBpbiBmdG9wdGlvbi5oIGluIG9yZGVyIHRvIG1ha2UgdGhlIGhpZ2hlciBieXRlIGluZGljYXRlICAgICAqLwotICAvKiAgIHRoZSBtb2R1bGUgd2hlcmUgdGhlIGVycm9yIGhhcyBoYXBwZW5lZCAodGhpcyBpcyBub3QgY29tcGF0aWJsZSAgICAgKi8KLSAgLyogICB3aXRoIHN0YW5kYXJkIGJ1aWxkcyBvZiBGcmVlVHlwZSAyKS4gIFlvdSBjYW4gdGhlbiB1c2UgdGhlIG1hY3JvICAgICovCi0gIC8qICAgRlRfRVJST1JfQkFTRSBtYWNybyB0byBleHRyYWN0IHRoZSBnZW5lcmljIGVycm9yIGNvZGUgZnJvbSBhbiAgICAgICAqLwotICAvKiAgIEZUX0Vycm9yIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJSSAtIEVycm9yIE1lc3NhZ2Ugc3RyaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBlcnJvciBkZWZpbml0aW9ucyBiZWxvdyBhcmUgbWFkZSB0aHJvdWdoIHNwZWNpYWwgbWFjcm9zIHRoYXQgICAgKi8KLSAgLyogICBhbGxvdyBjbGllbnQgYXBwbGljYXRpb25zIHRvIGJ1aWxkIGEgdGFibGUgb2YgZXJyb3IgbWVzc2FnZSBzdHJpbmdzICovCi0gIC8qICAgaWYgdGhleSBuZWVkIGl0LiAgVGhlIHN0cmluZ3MgYXJlIG5vdCBpbmNsdWRlZCBpbiBhIG5vcm1hbCBidWlsZCBvZiAqLwotICAvKiAgIEZyZWVUeXBlIDIgdG8gc2F2ZSBzcGFjZSAobW9zdCBjbGllbnQgYXBwbGljYXRpb25zIGRvIG5vdCB1c2UgICAgICAgKi8KLSAgLyogICB0aGVtKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRvIGRvIHNvLCB5b3UgaGF2ZSB0byBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgYmVmb3JlIGluY2x1ZGluZyAgKi8KLSAgLyogICB0aGlzIGZpbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUk9SX1NUQVJUX0xJU1QgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvIGRlZmluZSB0aGUgc3RhcnQgb2YgICovCi0gIC8qICAgICB0aGUgZXJyb3IgbGlzdC4gIEl0IGlzIGZvbGxvd2VkIGJ5IHNldmVyYWwgRlRfRVJST1JfREVGIGNhbGxzICAgICAqLwotICAvKiAgICAgKHNlZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJST1JfREVGKCBlLCB2LCBzICkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgVGhpcyBtYWNybyBpcyBjYWxsZWQgdG8gZGVmaW5lIG9uZSBzaW5nbGUgZXJyb3IuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGBlJyBpcyB0aGUgZXJyb3IgY29kZSBpZGVudGlmaWVyIChlLmcuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50KS4gICovCi0gIC8qICAgICBgdicgaXMgdGhlIGVycm9yIG51bWVyaWNhbCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYHMnIGlzIHRoZSBjb3JyZXNwb25kaW5nIGVycm9yIHN0cmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJST1JfRU5EX0xJU1QgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgVGhpcyBtYWNybyBlbmRzIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWRkaXRpb25hbGx5LCB5b3UgaGF2ZSB0byB1bmRlZmluZSBfX0ZURVJST1JTX0hfXyBiZWZvcmUgI2luY2x1ZGluZyAqLwotICAvKiAgIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICN1bmRlZiBfX0ZURVJST1JTX0hfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAjZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgIHsgZSwgcyB9LCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgI2RlZmluZSBGVF9FUlJPUl9TVEFSVF9MSVNUICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgeyAwLCAwIH0gfTsgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgY29uc3Qgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIGludCAgICAgICAgICBlcnJfY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBjb25zdCBjaGFyKiAgZXJyX21zZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIH0gZnRfZXJyb3JzW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgI2luY2x1ZGUgRlRfRVJST1JTX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZURVJST1JTX0hfXwotI2RlZmluZSBfX0ZURVJST1JTX0hfXwotCi0KLSAgLyogaW5jbHVkZSBtb2R1bGUgYmFzZSBlcnJvciBjb2RlcyAqLwotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNFVFVQIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX05FRURfRVhURVJOX0MKLQotI3VuZGVmICBGVF9FUlJfWENBVAotI3VuZGVmICBGVF9FUlJfQ0FUCi0KLSNkZWZpbmUgRlRfRVJSX1hDQVQoIHgsIHkgKSAgeCAjIyB5Ci0jZGVmaW5lIEZUX0VSUl9DQVQoIHgsIHkgKSAgIEZUX0VSUl9YQ0FUKCB4LCB5ICkKLQotCi0gIC8qIEZUX0VSUl9QUkVGSVggaXMgdXNlZCBhcyBhIHByZWZpeCBmb3IgZXJyb3IgaWRlbnRpZmllcnMuICovCi0gIC8qIEJ5IGRlZmF1bHQsIHdlIHVzZSBgRlRfRXJyXycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgRlRfRXJyXwotI2VuZGlmCi0KLQotICAvKiBGVF9FUlJfQkFTRSBpcyB1c2VkIGFzIHRoZSBiYXNlIGZvciBtb2R1bGUtc3BlY2lmaWMgZXJyb3JzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKLQotI2lmbmRlZiBGVF9FUlJfQkFTRQotI2RlZmluZSBGVF9FUlJfQkFTRSAgRlRfTW9kX0Vycl9CYXNlCi0jZW5kaWYKLQotI2Vsc2UKLQotI3VuZGVmIEZUX0VSUl9CQVNFCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAwCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTICovCi0KLQotICAvKiBJZiBGVF9FUlJPUkRFRiBpcyBub3QgZGVmaW5lZCwgd2UgbmVlZCB0byBkZWZpbmUgYSBzaW1wbGUgKi8KLSAgLyogZW51bWVyYXRpb24gdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FUlJPUkRFRgotCi0jZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgIGUgPSB2LAotI2RlZmluZSBGVF9FUlJPUl9TVEFSVF9MSVNUICAgICBlbnVtIHsKLSNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgTWF4ICkgfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX05FRURfRVhURVJOX0MKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FUlJPUkRFRiAqLwotCi0KLSAgLyogdGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSBhbiBlcnJvciAqLwotI2RlZmluZSBGVF9FUlJPUkRFRl8oIGUsIHYsIHMgKSAgIFwKLSAgICAgICAgICBGVF9FUlJPUkRFRiggRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApLCB2ICsgRlRfRVJSX0JBU0UsIHMgKQotCi0gIC8qIHRoaXMgaXMgb25seSB1c2VkIGZvciA8bW9kdWxlPl9FcnJfT2ssIHdoaWNoIG11c3QgYmUgMCEgKi8KLSNkZWZpbmUgRlRfTk9FUlJPUkRFRl8oIGUsIHYsIHMgKSBcCi0gICAgICAgICAgRlRfRVJST1JERUYoIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKSwgdiwgcyApCi0KLQotI2lmZGVmIEZUX0VSUk9SX1NUQVJUX0xJU1QKLSAgRlRfRVJST1JfU1RBUlRfTElTVAotI2VuZGlmCi0KLQotICAvKiBub3cgaW5jbHVkZSB0aGUgZXJyb3IgY29kZXMgKi8KLSNpbmNsdWRlIEZUX0VSUk9SX0RFRklOSVRJT05TX0gKLQotCi0jaWZkZWYgRlRfRVJST1JfRU5EX0xJU1QKLSAgRlRfRVJST1JfRU5EX0xJU1QKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIFNJTVBMRSBDTEVBTlVQICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBGVF9ORUVEX0VYVEVSTl9DCi0gIH0KLSNlbmRpZgotCi0jdW5kZWYgRlRfRVJST1JfU1RBUlRfTElTVAotI3VuZGVmIEZUX0VSUk9SX0VORF9MSVNUCi0KLSN1bmRlZiBGVF9FUlJPUkRFRgotI3VuZGVmIEZUX0VSUk9SREVGXwotI3VuZGVmIEZUX05PRVJST1JERUZfCi0KLSN1bmRlZiBGVF9ORUVEX0VYVEVSTl9DCi0jdW5kZWYgRlRfRVJSX0NPTkNBVAotI3VuZGVmIEZUX0VSUl9CQVNFCi0KLSAgLyogRlRfS0VFUF9FUlJfUFJFRklYIGlzIG5lZWRlZCBmb3IgZnR2YWxpZC5oICovCi0jaWZuZGVmIEZUX0tFRVBfRVJSX1BSRUZJWAotI3VuZGVmIEZUX0VSUl9QUkVGSVgKLSNlbmRpZgotCi0jZW5kaWYgLyogX19GVEVSUk9SU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2FzcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjkyYzMxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnYXNwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFjY2VzcyBvZiBUcnVlVHlwZSdzIGBnYXNwJyB0YWJsZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9GVF9HQVNQX0hfCi0jZGVmaW5lIF9GVF9HQVNQX0hfCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgZ2FzcF90YWJsZQotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgR2FzcCBUYWJsZQotICAgKgotICAgKiBAYWJzdHJhY3Q6Ci0gICAqICAgUmV0cmlldmluZyBUcnVlVHlwZSBgZ2FzcCcgdGFibGUgZW50cmllcwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIGZ1bmN0aW9uIEBGVF9HZXRfR2FzcCBjYW4gYmUgdXNlZCB0byBxdWVyeSBhIFRydWVUeXBlIG9yIE9wZW5UeXBlCi0gICAqICAgZm9udCBmb3Igc3BlY2lmaWMgZW50cmllcyBpbiB0aGVpciBgZ2FzcCcgdGFibGUsIGlmIGFueS4gIFRoaXMgaXMKLSAgICogICBtYWlubHkgdXNlZnVsIHdoZW4gaW1wbGVtZW50aW5nIG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIHdpdGggdGhlCi0gICAqICAgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gZHVwbGljYXRlIHRoZSBXaW5kb3dzIHRleHQgcmVuZGVyaW5nIHJlc3VsdHMuCi0gICAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX0dBU1BfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsdWVzIGFuZC9vciBiaXQtZmxhZ3MgcmV0dXJuZWQgYnkgdGhlIEBGVF9HZXRfR2FzcAotICAgKiAgIGZ1bmN0aW9uLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX0dBU1BfTk9fVEFCTEUgOjoKLSAgICogICAgIFRoaXMgc3BlY2lhbCB2YWx1ZSBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIEdBU1AgdGFibGUgaW4gdGhpcyBmYWNlLgotICAgKiAgICAgSXQgaXMgdXAgdG8gdGhlIGNsaWVudCB0byBkZWNpZGUgd2hhdCB0byBkby4KLSAgICoKLSAgICogICBGVF9HQVNQX0RPX0dSSURGSVQgOjoKLSAgICogICAgIEdyaWQtZml0dGluZyBhbmQgaGludGluZyBzaG91bGQgYmUgcGVyZm9ybWVkIGF0IHRoZSBzcGVjaWZpZWQgcHBlbS4KLSAgICogICAgIFRoaXMgKnJlYWxseSogbWVhbnMgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24uCi0gICAqCi0gICAqICAgRlRfR0FTUF9ET19HUkFZIDo6Ci0gICAqICAgICBBbnRpLWFsaWFzZWQgcmVuZGVyaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQgYXQgdGhlIHNwZWNpZmllZCBwcGVtLgotICAgKgotICAgKiAgIEZUX0dBU1BfU1lNTUVUUklDX1NNT09USElORyA6OgotICAgKiAgICAgU21vb3RoaW5nIGFsb25nIG11bHRpcGxlIGF4ZXMgbXVzdCBiZSB1c2VkIHdpdGggQ2xlYXJUeXBlLgotICAgKgotICAgKiAgIEZUX0dBU1BfU1lNTUVUUklDX0dSSURGSVQgOjoKLSAgICogICAgIEdyaWQtZml0dGluZyBtdXN0IGJlIHVzZWQgd2l0aCBDbGVhclR5cGUncyBzeW1tZXRyaWMgc21vb3RoaW5nLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBgQ2xlYXJUeXBlJyBpcyBNaWNyb3NvZnQncyBpbXBsZW1lbnRhdGlvbiBvZiBMQ0QgcmVuZGVyaW5nLCBwYXJ0bHkKLSAgICogICBwcm90ZWN0ZWQgYnkgcGF0ZW50cy4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgIDIuMy4wCi0gICAqLwotI2RlZmluZSBGVF9HQVNQX05PX1RBQkxFICAgICAgICAgICAgICAgLTEKLSNkZWZpbmUgRlRfR0FTUF9ET19HUklERklUICAgICAgICAgICAweDAxCi0jZGVmaW5lIEZUX0dBU1BfRE9fR1JBWSAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBGVF9HQVNQX1NZTU1FVFJJQ19TTU9PVEhJTkcgIDB4MDgKLSNkZWZpbmUgRlRfR0FTUF9TWU1NRVRSSUNfR1JJREZJVCAgICAweDEwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuYzoKLSAgICogICBGVF9HZXRfR2FzcAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmVhZCB0aGUgYGdhc3AnIHRhYmxlIGZyb20gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250IGZpbGUgYW5kCi0gICAqICAgcmV0dXJuIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gY2hhcmFjdGVyIHBpeGVsIHNpemUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBmYWNlIDo6IFRoZSBzb3VyY2UgZmFjZSBoYW5kbGUuCi0gICAqICAgcHBlbSA6OiBUaGUgdmVydGljYWwgY2hhcmFjdGVyIHBpeGVsIHNpemUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgQml0IGZsYWdzIChzZWUgQEZUX0dBU1BfWFhYKSwgb3IgQEZUX0dBU1BfTk9fVEFCTEUgaWYgdGhlcmUgaXMgbm8KLSAgICogICBgZ2FzcCcgdGFibGUgaW4gdGhlIGZhY2UuCi0gICAqCi0gICAqIEBzaW5jZToKLSAgICogICAyLjMuMAotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9JbnQgKQotICBGVF9HZXRfR2FzcCggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgIEZUX1VJbnQgIHBwZW0gKTsKLQotLyogKi8KLQotI2VuZGlmIC8qIF9GVF9HQVNQX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRnbHlwaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzJmNDljLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRnbHlwaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z2x5cGguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGdseXBocyAoc3BlY2lmaWNhdGlvbikuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBzZXZlcmFsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyAgICAqLwotICAvKiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gZWFzaWx5IHJldHJpZXZlIGdseXBoICAgICAgKi8KLSAgLyogYml0bWFwcyBhbmQgb3V0bGluZXMgZnJvbSBhIGdpdmVuIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIG9wdGlvbmFsIGlmIHlvdSBhcmUgd3JpdGluZyBhIGZvbnQgc2VydmVyICAgKi8KLSAgLyogb3IgdGV4dCBsYXlvdXQgZW5naW5lIG9uIHRvcCBvZiBGcmVlVHlwZS4gIEhvd2V2ZXIsIHRoZXkgYXJlIHByZXR0eSAgICovCi0gIC8qIGhhbmR5IGZvciBtYW55IG90aGVyIHNpbXBsZSB1c2VzIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUR0xZUEhfSF9fCi0jZGVmaW5lIF9fRlRHTFlQSF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHbHlwaCBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZW5lcmljIGludGVyZmFjZSB0byBtYW5hZ2UgaW5kaXZpZHVhbCBnbHlwaCBkYXRhLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGVmaW5pdGlvbnMgdXNlZCB0byBtYW5hZ2UgZ2x5cGggZGF0YSAgICAgICAgKi8KLSAgLyogICAgdGhyb3VnaCBnZW5lcmljIEZUX0dseXBoIG9iamVjdHMuICBFYWNoIG9mIHRoZW0gY2FuIGNvbnRhaW4gYSAgICAgICovCi0gIC8qICAgIGJpdG1hcCwgYSB2ZWN0b3Igb3V0bGluZSwgb3IgZXZlbiBpbWFnZXMgaW4gb3RoZXIgZm9ybWF0cy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGEgcHJpdmF0ZSB0eXBlICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0dseXBoX0NsYXNzXyAgRlRfR2x5cGhfQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgZ2VuZXJpYyBnbHlwaCBpbWFnZXMuICBJdCBpcyBhICAgKi8KLSAgLyogICAgcG9pbnRlciB0byB0aGUgQEZUX0dseXBoUmVjIHN0cnVjdHVyZSBhbmQgY2FuIGNvbnRhaW4gYSBnbHlwaCAgICAgICovCi0gIC8qICAgIGJpdG1hcCBvciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdseXBoIG9iamVjdHMgYXJlIG5vdCBvd25lZCBieSB0aGUgbGlicmFyeS4gIFlvdSBtdXN0IHRodXMgcmVsZWFzZSAqLwotICAvKiAgICB0aGVtIG1hbnVhbGx5ICh0aHJvdWdoIEBGVF9Eb25lX0dseXBoKSBfYmVmb3JlXyBjYWxsaW5nICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0RvbmVfRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaFJlY18qICBGVF9HbHlwaDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByb290IGdseXBoIHN0cnVjdHVyZSBjb250YWlucyBhIGdpdmVuIGdseXBoIGltYWdlIHBsdXMgaXRzICAgICAqLwotICAvKiAgICBhZHZhbmNlIHdpZHRoIGluIDE2LjE2IGZpeGVkIGZsb2F0IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCdzIGNsYXNzLiAgUHJpdmF0ZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIHRoZSBnbHlwaCdzIGltYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlIDo6IEEgMTYuMTYgdmVjdG9yIHRoYXQgZ2l2ZXMgdGhlIGdseXBoJ3MgYWR2YW5jZSB3aWR0aC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaFJlY18KLSAgewotICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgbGlicmFyeTsKLSAgICBjb25zdCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6OwotICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgZm9ybWF0OwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgYWR2YW5jZTsKLQotICB9IEZUX0dseXBoUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgYSBiaXRtYXAgZ2x5cGggaW1hZ2UuICBUaGlzIGlzICovCi0gIC8qICAgIGEgc3ViLWNsYXNzIG9mIEBGVF9HbHlwaCwgYW5kIGEgcG9pbnRlciB0byBARlRfQml0bWFwR2x5cGhSZWMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfQml0bWFwR2x5cGhSZWNfKiAgRlRfQml0bWFwR2x5cGg7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBHbHlwaFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGZvciBiaXRtYXAgZ2x5cGggaW1hZ2VzLiAgVGhpcyByZWFsbHkgaXMgYSAgICAgICAgKi8KLSAgLyogICAgYHN1Yi1jbGFzcycgb2YgQEZUX0dseXBoUmVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgIDo6IFRoZSByb290IEBGVF9HbHlwaCBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0ICAgOjogVGhlIGxlZnQtc2lkZSBiZWFyaW5nLCBpLmUuLCB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGZyb20gdGhlIGN1cnJlbnQgcGVuIHBvc2l0aW9uIHRvIHRoZSBsZWZ0IGJvcmRlciBvZiB0aGUgICovCi0gIC8qICAgICAgICAgICAgICBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG9wICAgIDo6IFRoZSB0b3Atc2lkZSBiZWFyaW5nLCBpLmUuLCB0aGUgdmVydGljYWwgZGlzdGFuY2UgZnJvbSAgICovCi0gIC8qICAgICAgICAgICAgICB0aGUgY3VycmVudCBwZW4gcG9zaXRpb24gdG8gdGhlIHRvcCBib3JkZXIgb2YgdGhlIGdseXBoICAqLwotICAvKiAgICAgICAgICAgICAgYml0bWFwLiAgVGhpcyBkaXN0YW5jZSBpcyBwb3NpdGl2ZSBmb3IgdXB3YXJkcy15ISAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcCA6OiBBIGRlc2NyaXB0b3IgZm9yIHRoZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBjYW4gdHlwZWNhc3QgYW4gQEZUX0dseXBoIHRvIEBGVF9CaXRtYXBHbHlwaCBpZiB5b3UgaGF2ZSAgICAgICAqLwotICAvKiAgICBgZ2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQJy4gIFRoaXMgbGV0cyB5b3UgYWNjZXNzICAgKi8KLSAgLyogICAgdGhlIGJpdG1hcCdzIGNvbnRlbnRzIGVhc2lseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY29ycmVzcG9uZGluZyBwaXhlbCBidWZmZXIgaXMgYWx3YXlzIG93bmVkIGJ5IEBGVF9CaXRtYXBHbHlwaCAgKi8KLSAgLyogICAgYW5kIGlzIHRodXMgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHdpdGggaXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQml0bWFwR2x5cGhSZWNfCi0gIHsKLSAgICBGVF9HbHlwaFJlYyAgcm9vdDsKLSAgICBGVF9JbnQgICAgICAgbGVmdDsKLSAgICBGVF9JbnQgICAgICAgdG9wOwotICAgIEZUX0JpdG1hcCAgICBiaXRtYXA7Ci0KLSAgfSBGVF9CaXRtYXBHbHlwaFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVHbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGFuIG91dGxpbmUgZ2x5cGggaW1hZ2UuICBUaGlzICAqLwotICAvKiAgICBpcyBhIHN1Yi1jbGFzcyBvZiBARlRfR2x5cGgsIGFuZCBhIHBvaW50ZXIgdG8gQEZUX091dGxpbmVHbHlwaFJlYy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX091dGxpbmVHbHlwaFJlY18qICBGVF9PdXRsaW5lR2x5cGg7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lR2x5cGhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGZvciBvdXRsaW5lICh2ZWN0b3JpYWwpIGdseXBoIGltYWdlcy4gIFRoaXMgICAgICAgKi8KLSAgLyogICAgcmVhbGx5IGlzIGEgYHN1Yi1jbGFzcycgb2YgQEZUX0dseXBoUmVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICA6OiBUaGUgcm9vdCBARlRfR2x5cGggZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgZGVzY3JpcHRvciBmb3IgdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHR5cGVjYXN0IGEgQEZUX0dseXBoIHRvIEBGVF9PdXRsaW5lR2x5cGggaWYgeW91IGhhdmUgICAgICAgKi8KLSAgLyogICAgYGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUnLiAgVGhpcyBsZXRzIHlvdSBhY2Nlc3MgICovCi0gIC8qICAgIHRoZSBvdXRsaW5lJ3MgY29udGVudCBlYXNpbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXMgdGhlIG91dGxpbmUgaXMgZXh0cmFjdGVkIGZyb20gYSBnbHlwaCBzbG90LCBpdHMgY29vcmRpbmF0ZXMgYXJlICovCi0gIC8qICAgIGV4cHJlc3NlZCBub3JtYWxseSBpbiAyNi42IHBpeGVscywgdW5sZXNzIHRoZSBmbGFnICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSB3YXMgdXNlZCBpbiBARlRfTG9hZF9HbHlwaCgpIG9yIEBGVF9Mb2FkX0NoYXIoKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBvdXRsaW5lJ3MgdGFibGVzIGFyZSBhbHdheXMgb3duZWQgYnkgdGhlIG9iamVjdCBhbmQgYXJlICAgICAgICAqLwotICAvKiAgICBkZXN0cm95ZWQgd2l0aCBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9PdXRsaW5lR2x5cGhSZWNfCi0gIHsKLSAgICBGVF9HbHlwaFJlYyAgcm9vdDsKLSAgICBGVF9PdXRsaW5lICAgb3V0bGluZTsKLQotICB9IEZUX091dGxpbmVHbHlwaFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBleHRyYWN0IGEgZ2x5cGggaW1hZ2UgZnJvbSBhIHNsb3QuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9HbHlwaCggRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgIEZUX0dseXBoICAgICAqYWdseXBoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gY29weSBhIGdseXBoIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBjcmVhdGVkICAgICAgKi8KLSAgLyogICAgQEZUX0dseXBoIG9iamVjdCBtdXN0IGJlIHJlbGVhc2VkIHdpdGggQEZUX0RvbmVfR2x5cGguICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgMCBpbiBjYXNlIG9mICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX0NvcHkoIEZUX0dseXBoICAgc291cmNlLAotICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgKnRhcmdldCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJhbnNmb3JtcyBhIGdseXBoIGltYWdlIGlmIGl0cyBmb3JtYXQgaXMgc2NhbGFibGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byBhIDJ4MiBtYXRyaXggdG8gYXBwbHkuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWx0YSAgOjogQSBwb2ludGVyIHRvIGEgMmQgdmVjdG9yIHRvIGFwcGx5LiAgQ29vcmRpbmF0ZXMgYXJlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiAxLzY0dGggb2YgYSBwaXhlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZSAoaWYgbm90IDAsIHRoZSBnbHlwaCBmb3JtYXQgaXMgbm90IHNjYWxhYmxlKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIDJ4MiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBnbHlwaCdzICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1RyYW5zZm9ybSggRlRfR2x5cGggICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGRlbHRhICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9CQm94X01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbW9kZSBob3cgdGhlIHZhbHVlcyBvZiBARlRfR2x5cGhfR2V0X0NCb3ggYXJlIHJldHVybmVkLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX1VOU0NBTEVEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gdW5zY2FsZWQgZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gdW5maXR0ZWQgMjYuNiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX0dSSURGSVQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gZ3JpZC1maXR0ZWQgMjYuNiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gY29vcmRpbmF0ZXMgaW4gaW50ZWdlciBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX1BJWEVMUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gZ3JpZC1maXR0ZWQgcGl4ZWwgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX0dseXBoX0JCb3hfTW9kZV8KLSAgewotICAgIEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQgID0gMCwKLSAgICBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUyA9IDAsCi0gICAgRlRfR0xZUEhfQkJPWF9HUklERklUICAgPSAxLAotICAgIEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUgID0gMiwKLSAgICBGVF9HTFlQSF9CQk9YX1BJWEVMUyAgICA9IDMKLQotICB9IEZUX0dseXBoX0JCb3hfTW9kZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2dseXBoX2Jib3hfeHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZC4gIFVzZSB0aGUgY29ycmVzcG9uZGluZyAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfR2x5cGhfQkJveF9Nb2RlIHZhbHVlcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZ0X2dseXBoX2Jib3hfdW5zY2FsZWQgIDo6IFNlZSBARlRfR0xZUEhfQkJPWF9VTlNDQUxFRC4gICAgICAgICAgICAgKi8KLSAgLyogICBmdF9nbHlwaF9iYm94X3N1YnBpeGVscyA6OiBTZWUgQEZUX0dMWVBIX0JCT1hfU1VCUElYRUxTLiAgICAgICAgICAgICovCi0gIC8qICAgZnRfZ2x5cGhfYmJveF9ncmlkZml0ICAgOjogU2VlIEBGVF9HTFlQSF9CQk9YX0dSSURGSVQuICAgICAgICAgICAgICAqLwotICAvKiAgIGZ0X2dseXBoX2Jib3hfdHJ1bmNhdGUgIDo6IFNlZSBARlRfR0xZUEhfQkJPWF9UUlVOQ0FURS4gICAgICAgICAgICAgKi8KLSAgLyogICBmdF9nbHlwaF9iYm94X3BpeGVscyAgICA6OiBTZWUgQEZUX0dMWVBIX0JCT1hfUElYRUxTLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9nbHlwaF9iYm94X3Vuc2NhbGVkICAgRlRfR0xZUEhfQkJPWF9VTlNDQUxFRAotI2RlZmluZSBmdF9nbHlwaF9iYm94X3N1YnBpeGVscyAgRlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMKLSNkZWZpbmUgZnRfZ2x5cGhfYmJveF9ncmlkZml0ICAgIEZUX0dMWVBIX0JCT1hfR1JJREZJVAotI2RlZmluZSBmdF9nbHlwaF9iYm94X3RydW5jYXRlICAgRlRfR0xZUEhfQkJPWF9UUlVOQ0FURQotI2RlZmluZSBmdF9nbHlwaF9iYm94X3BpeGVscyAgICAgRlRfR0xZUEhfQkJPWF9QSVhFTFMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIGdseXBoJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwgdGhlICAqLwotICAvKiAgICBvdXRsaW5lJ3MgcG9pbnRzLCBpbmNsdWRpbmcgQsOpemllciBjb250cm9sIHBvaW50cy4gIFRob3VnaCBpdCAgICAgICovCi0gIC8qICAgIGNvaW5jaWRlcyB3aXRoIHRoZSBleGFjdCBib3VuZGluZyBib3ggZm9yIG1vc3QgZ2x5cGhzLCBpdCBjYW4gYmUgICAqLwotICAvKiAgICBzbGlnaHRseSBsYXJnZXIgaW4gc29tZSBzaXR1YXRpb25zIChsaWtlIHdoZW4gcm90YXRpbmcgYW4gb3V0bGluZSAgKi8KLSAgLyogICAgd2hpY2ggY29udGFpbnMgQsOpemllciBvdXRzaWRlIGFyY3MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0aW5nIHRoZSBjb250cm9sIGJveCBpcyB2ZXJ5IGZhc3QsIHdoaWxlIGdldHRpbmcgdGhlIGJvdW5kaW5nICovCi0gIC8qICAgIGJveCBjYW4gdGFrZSBtdWNoIG1vcmUgdGltZSBhcyBpdCBuZWVkcyB0byB3YWxrIG92ZXIgYWxsIHNlZ21lbnRzICAqLwotICAvKiAgICBhbmQgYXJjcyBpbiB0aGUgb3V0bGluZS4gIFRvIGdldCB0aGUgbGF0dGVyLCB5b3UgY2FuIHVzZSB0aGUgICAgICAgKi8KLSAgLyogICAgYGZ0YmJveCcgY29tcG9uZW50IHdoaWNoIGlzIGRlZGljYXRlZCB0byB0aGlzIHNpbmdsZSB0YXNrLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2RlICA6OiBUaGUgbW9kZSB3aGljaCBpbmRpY2F0ZXMgaG93IHRvIGludGVycHJldCB0aGUgcmV0dXJuZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgYm91bmRpbmcgYm94IHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNib3ggOjogVGhlIGdseXBoIGNvb3JkaW5hdGUgYm91bmRpbmcgYm94LiAgQ29vcmRpbmF0ZXMgYXJlICAgICAgICovCi0gIC8qICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiAxLzY0dGggb2YgcGl4ZWxzIGlmIGl0IGlzIGdyaWQtZml0dGVkLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvb3JkaW5hdGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgZ2x5cGggb3JpZ2luLCB1c2luZyB0aGUgWS11cHdhcmRzICAqLwotICAvKiAgICBjb252ZW50aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQgd2l0aCBARlRfTE9BRF9OT19TQ0FMRSwgYGJib3hfbW9kZScgICAqLwotICAvKiAgICBtdXN0IGJlIHNldCB0byBARlRfR0xZUEhfQkJPWF9VTlNDQUxFRCB0byBnZXQgdW5zY2FsZWQgZm9udCAgICAgICAgKi8KLSAgLyogICAgdW5pdHMgaW4gMjYuNiBwaXhlbCBmb3JtYXQuICBUaGUgdmFsdWUgQEZUX0dMWVBIX0JCT1hfU1VCUElYRUxTICAgICovCi0gIC8qICAgIGlzIGFub3RoZXIgbmFtZSBmb3IgdGhpcyBjb25zdGFudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoZSBtYXhpbXVtIGNvb3JkaW5hdGVzIGFyZSBleGNsdXNpdmUsIHdoaWNoIG1lYW5zIHRoYXQgICovCi0gIC8qICAgIG9uZSBjYW4gY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZ2x5cGggaW1hZ2UgKGJlIGl0IGluICAqLwotICAvKiAgICBpbnRlZ2VyIG9yIDI2LjYgcGl4ZWxzKSBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHdpZHRoICA9IGJib3gueE1heCAtIGJib3gueE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBoZWlnaHQgPSBiYm94LnlNYXggLSBiYm94LnlNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgZm9yIDI2LjYgY29vcmRpbmF0ZXMsIGlmIGBiYm94X21vZGUnIGlzIHNldCB0byAgICAgICovCi0gIC8qICAgIEBGVF9HTFlQSF9CQk9YX0dSSURGSVQsIHRoZSBjb29yZGluYXRlcyB3aWxsIGFsc28gYmUgZ3JpZC1maXR0ZWQsICAqLwotICAvKiAgICB3aGljaCBjb3JyZXNwb25kcyB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJib3gueE1pbiA9IEZMT09SKGJib3gueE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBiYm94LnlNaW4gPSBGTE9PUihiYm94LnlNaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYmJveC54TWF4ID0gQ0VJTElORyhiYm94LnhNYXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJib3gueU1heCA9IENFSUxJTkcoYmJveC55TWF4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgdGhlIGJib3ggaW4gcGl4ZWwgY29vcmRpbmF0ZXMsIHNldCBgYmJveF9tb2RlJyB0byAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgdGhlIGJib3ggaW4gZ3JpZC1maXR0ZWQgcGl4ZWwgY29vcmRpbmF0ZXMsIHNldCBgYmJveF9tb2RlJyAgKi8KLSAgLyogICAgdG8gQEZUX0dMWVBIX0JCT1hfUElYRUxTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9HbHlwaF9HZXRfQ0JveCggRlRfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGJib3hfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICphY2JveCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfVG9fQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29udmVydHMgYSBnaXZlbiBnbHlwaCBvYmplY3QgdG8gYSBiaXRtYXAgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGhlX2dseXBoICAgOjogQSBwb2ludGVyIHRvIGEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGguICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyX21vZGUgOjogQW4gZW51bWVyYXRpb24gdGhhdCBkZXNjcmliZSBob3cgdGhlIGRhdGEgaXMgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3JpZ2luICAgICAgOjogQSBwb2ludGVyIHRvIGEgdmVjdG9yIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBnbHlwaCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGltYWdlIGJlZm9yZSByZW5kZXJpbmcuICBDYW4gYmUgMCAoaWYgbm8gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbikuICBUaGUgb3JpZ2luIGlzIGV4cHJlc3NlZCBpbiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgMjYuNiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZXN0cm95ICAgICA6OiBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3JpZ2luYWwgZ2x5cGggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2Ugc2hvdWxkIGJlIGRlc3Ryb3llZCBieSB0aGlzIGZ1bmN0aW9uLiAgSXQgaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG5ldmVyIGRlc3Ryb3llZCBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBpbWFnZSBpcyB0cmFuc2xhdGVkIHdpdGggdGhlIGBvcmlnaW4nIHZlY3RvciBiZWZvcmUgICAgICAqLwotICAvKiAgICByZW5kZXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIEBGVF9HbHlwaCBoYW5kbGUsIHRoYXQgd2lsbCAqLwotICAvKiAgICBiZSByZXBsYWNlZCBieSB0aGlzIGZ1bmN0aW9uLiAgVHlwaWNhbGx5LCB5b3Ugd291bGQgdXNlIChvbWl0dGluZyAgKi8KLSAgLyogICAgZXJyb3IgaGFuZGxpbmcpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9HbHlwaCAgICAgICAgZ2x5cGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfQml0bWFwR2x5cGggIGdseXBoX2JpdG1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gbG9hZCBnbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVycm9yID0gRlRfTG9hZF9DaGFyKCBmYWNlLCBnbHlwaF9pbmRleCwgRlRfTE9BRF9ERUZBVVQgKTsgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gZXh0cmFjdCBnbHlwaCBpbWFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVycm9yID0gRlRfR2V0X0dseXBoKCBmYWNlLT5nbHlwaCwgJmdseXBoICk7ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gY29udmVydCB0byBhIGJpdG1hcCAoZGVmYXVsdCByZW5kZXIgbW9kZSArIGRlc3Ryb3kgb2xkKSAgICAgKi8KLSAgLyogICAgICAgIGlmICggZ2x5cGgtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICkgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBlcnJvciA9IEZUX0dseXBoX1RvX0JpdG1hcCggJmdseXBoLCBGVF9SRU5ERVJfTU9ERV9ERUZBVUxULCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIGlmICggZXJyb3IgKSAvLyBnbHlwaCB1bmNoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gYWNjZXNzIGJpdG1hcCBjb250ZW50IGJ5IHR5cGVjYXN0aW5nICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGdseXBoX2JpdG1hcCA9IChGVF9CaXRtYXBHbHlwaClnbHlwaDsgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gZG8gZnVubnkgc3R1ZmYgd2l0aCBpdCwgbGlrZSBibGl0dGluZy9kcmF3aW5nICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLy8gZGlzY2FyZCBnbHlwaCBpbWFnZSAoYml0bWFwIG9yIG5vdCkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIHRoZSBnbHlwaCBmb3JtYXQgaXNuJ3Qgc2NhbGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1RvX0JpdG1hcCggRlRfR2x5cGgqICAgICAgIHRoZV9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgIG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgZGVzdHJveSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9Eb25lX0dseXBoKCBGVF9HbHlwaCAgZ2x5cGggKTsKLQotICAvKiAqLwotCi0KLSAgLyogb3RoZXIgaGVscGZ1bCBmdW5jdGlvbnMgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4X011bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGVyZm9ybXMgdGhlIG1hdHJpeCBvcGVyYXRpb24gYGIgPSBhKmInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBhJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYiA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgZWl0aGVyIGBhJyBvciBgYicgaXMgemVyby4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9NYXRyaXhfTXVsdGlwbHkoIGNvbnN0IEZUX01hdHJpeCogIGEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgICAgICAgYiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4X0ludmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW52ZXJ0cyBhIDJ4MiBtYXRyaXguICBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IGNhbid0IGJlIGludmVydGVkLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG1hdHJpeC4gIFJlbWFpbnMgdW50b3VjaGVkIGluICAgICovCi0gIC8qICAgICAgICAgICAgICBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX01hdHJpeF9JbnZlcnQoIEZUX01hdHJpeCogIG1hdHJpeCApOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUR0xZUEhfSF9fICovCi0KLQotLyogRU5EICovCi0KLQotLyogTG9jYWwgVmFyaWFibGVzOiAqLwotLyogY29kaW5nOiB1dGYtOCAgICAqLwotLyogRW5kOiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGd4dmFsLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlYTg2MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGd4dmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoc3BlY2lmaWNhdGlvbikuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQsIDIwMDUsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkaGF0IEsuSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRHWFZBTF9IX18KLSNkZWZpbmUgX19GVEdYVkFMX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBneF92YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZUdYL0FBVCBWYWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBBUEkgdG8gdmFsaWRhdGUgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9ucyB0byB2YWxpZGF0ZSAgICAgKi8KLSAgLyogICAgc29tZSBUcnVlVHlwZUdYIHRhYmxlcyAoZmVhdCwgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2Vybiwgb3BiZCwgICovCi0gIC8qICAgIHRyYWssIHByb3AsIGxjYXIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXYXJuaW5nOiBVc2UgRlRfVkFMSURBVEVfWFhYIHRvIHZhbGlkYXRlIGEgdGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgRm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBmb3IgZ3h2YWxpZCBkZXZlbG9wZXJzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRlRfVkFMSURBVEVfZmVhdF9JTkRFWCAgICAgMAotI2RlZmluZSBGVF9WQUxJREFURV9tb3J0X0lOREVYICAgICAxCi0jZGVmaW5lIEZUX1ZBTElEQVRFX21vcnhfSU5ERVggICAgIDIKLSNkZWZpbmUgRlRfVkFMSURBVEVfYnNsbl9JTkRFWCAgICAgMwotI2RlZmluZSBGVF9WQUxJREFURV9qdXN0X0lOREVYICAgICA0Ci0jZGVmaW5lIEZUX1ZBTElEQVRFX2tlcm5fSU5ERVggICAgIDUKLSNkZWZpbmUgRlRfVkFMSURBVEVfb3BiZF9JTkRFWCAgICAgNgotI2RlZmluZSBGVF9WQUxJREFURV90cmFrX0lOREVYICAgICA3Ci0jZGVmaW5lIEZUX1ZBTElEQVRFX3Byb3BfSU5ERVggICAgIDgKLSNkZWZpbmUgRlRfVkFMSURBVEVfbGNhcl9JTkRFWCAgICAgOQotI2RlZmluZSBGVF9WQUxJREFURV9HWF9MQVNUX0lOREVYICBGVF9WQUxJREFURV9sY2FyX0lOREVYCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVkFMSURBVEVfR1hfTEVOR1RICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgbnVtYmVyIG9mIHRhYmxlcyBjaGVja2VkIGluIHRoaXMgbW9kdWxlLiAgVXNlIGl0IGFzIGEgcGFyYW1ldGVyCi0gICAqICAgZm9yIHRoZSBgdGFibGUtbGVuZ3RoJyBhcmd1bWVudCBvZiBmdW5jdGlvbiBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZS4KLSAgICovCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dYX0xFTkdUSCAgICAgKEZUX1ZBTElEQVRFX0dYX0xBU1RfSU5ERVggKyAxKQotCi0gIC8qICovCi0KLSAgLyogVXAgdG8gMHgxMDAwIGlzIHVzZWQgYnkgb3R2YWxpZC4KLSAgICAgT3gyeHh4IGlzIHJlc2VydmVkIGZvciBmZWF0dXJlIE9UIGV4dGVuc2lvbi4gKi8KLSNkZWZpbmUgRlRfVkFMSURBVEVfR1hfU1RBUlQgMHg0MDAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCB0YWcgKSAgICAgICAgICAgICAgICAgIFwKLSAgKCBGVF9WQUxJREFURV9HWF9TVEFSVCA8PCBGVF9WQUxJREFURV8jI3RhZyMjX0lOREVYICkKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBlbnVtOgotICAqICAgIEZUX1ZBTElEQVRFX0dYWFhYCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlZCB3aXRoIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlIHRvCi0gICogICAgaW5kaWNhdGUgd2hpY2ggVHJ1ZVR5cGVHWC9BQVQgVHlwZSB0YWJsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZC4KLSAgKgotICAqIEB2YWx1ZXM6Ci0gICogICAgRlRfVkFMSURBVEVfZmVhdCA6OgotICAqICAgICAgVmFsaWRhdGUgYGZlYXQnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfbW9ydCA6OgotICAqICAgICAgVmFsaWRhdGUgYG1vcnQnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfbW9yeCA6OgotICAqICAgICAgVmFsaWRhdGUgYG1vcngnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfYnNsbiA6OgotICAqICAgICAgVmFsaWRhdGUgYGJzbG4nIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfanVzdCA6OgotICAqICAgICAgVmFsaWRhdGUgYGp1c3QnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfa2VybiA6OgotICAqICAgICAgVmFsaWRhdGUgYGtlcm4nIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfb3BiZCA6OgotICAqICAgICAgVmFsaWRhdGUgYG9wYmQnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfdHJhayA6OgotICAqICAgICAgVmFsaWRhdGUgYHRyYWsnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfcHJvcCA6OgotICAqICAgICAgVmFsaWRhdGUgYHByb3AnIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfbGNhciA6OgotICAqICAgICAgVmFsaWRhdGUgYGxjYXInIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfR1ggOjoKLSAgKiAgICAgIFZhbGlkYXRlIGFsbCBUcnVlVHlwZUdYIHRhYmxlcyAoZmVhdCwgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2VybiwKLSAgKiAgICAgIG9wYmQsIHRyYWssIHByb3AgYW5kIGxjYXIpLgotICAqCi0gICovCi0KLSNkZWZpbmUgRlRfVkFMSURBVEVfZmVhdCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGZlYXQgKQotI2RlZmluZSBGVF9WQUxJREFURV9tb3J0ICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggbW9ydCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX21vcnggIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBtb3J4ICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfYnNsbiAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGJzbG4gKQotI2RlZmluZSBGVF9WQUxJREFURV9qdXN0ICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCgganVzdCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2tlcm4gIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBrZXJuICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfb3BiZCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIG9wYmQgKQotI2RlZmluZSBGVF9WQUxJREFURV90cmFrICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggdHJhayApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX3Byb3AgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBwcm9wICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfbGNhciAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGxjYXIgKQotCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dYICAoIEZUX1ZBTElEQVRFX2ZlYXQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX21vcnQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX21vcnggfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX2JzbG4gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX2p1c3QgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX2tlcm4gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX29wYmQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX3RyYWsgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX3Byb3AgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX2xjYXIgKQotCi0KLSAgLyogKi8KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFZhbGlkYXRlIHZhcmlvdXMgVHJ1ZVR5cGVHWCB0YWJsZXMgdG8gYXNzdXJlIHRoYXQgYWxsIG9mZnNldHMgYW5kCi0gICogICAgaW5kaWNlcyBhcmUgdmFsaWQuICBUaGUgaWRlYSBpcyB0aGF0IGEgaGlnaGVyLWxldmVsIGxpYnJhcnkgd2hpY2gKLSAgKiAgICBhY3R1YWxseSBkb2VzIHRoZSB0ZXh0IGxheW91dCBjYW4gYWNjZXNzIHRob3NlIHRhYmxlcyB3aXRob3V0Ci0gICogICAgZXJyb3IgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgotICAqICAgICAgIEEgYml0IGZpZWxkIHdoaWNoIHNwZWNpZmllcyB0aGUgdGFibGVzIHRvIGJlIHZhbGlkYXRlZC4gIFNlZQotICAqICAgICAgIEBGVF9WQUxJREFURV9HWFhYWCBmb3IgcG9zc2libGUgdmFsdWVzLgotICAqCi0gICogICAgdGFibGVfbGVuZ3RoIDo6Ci0gICogICAgICAgVGhlIHNpemUgb2YgdGhlIGB0YWJsZXMnIGFycmF5LiAgTm9ybWFsbHksIEBGVF9WQUxJREFURV9HWF9MRU5HVEgKLSAgKiAgICAgICBzaG91bGQgYmUgcGFzc2VkLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICB0YWJsZXMgOjoKLSAgKiAgICAgICBUaGUgYXJyYXkgd2hlcmUgYWxsIHZhbGlkYXRlZCBzZm50IHRhYmxlcyBhcmUgc3RvcmVkLgotICAqICAgICAgIFRoZSBhcnJheSBpdHNlbGYgbXVzdCBiZSBhbGxvY2F0ZWQgYnkgYSBjbGllbnQuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggVHJ1ZVR5cGVHWCBmb250cywgcmV0dXJuaW5nIGFuIGVycm9yCi0gICogICBvdGhlcndpc2UuCi0gICoKLSAgKiAgIEFmdGVyIHVzZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWFsbG9jYXRlIHRoZSBidWZmZXJzIHBvaW50ZWQgdG8gYnkKLSAgKiAgIGVhY2ggYHRhYmxlcycgZWxlbWVudCwgYnkgY2FsbGluZyBARlRfVHJ1ZVR5cGVHWF9GcmVlLiAgQSBOVUxMIHZhbHVlCi0gICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFibGUgZWl0aGVyIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIHRoZQotICAqICAgYXBwbGljYXRpb24gaGFzbid0IGFza2VkIGZvciB2YWxpZGF0aW9uLCBvciB0aGUgdmFsaWRhdG9yIGRvZXNuJ3QgaGF2ZQotICAqICAgdGhlIGFiaWxpdHkgdG8gdmFsaWRhdGUgdGhlIHNmbnQgdGFibGUuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZXNbRlRfVkFMSURBVEVfR1hfTEVOR1RIXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHRhYmxlX2xlbmd0aCApOwotCi0KLSAgLyogKi8KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfVHJ1ZVR5cGVHWF9GcmVlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBUcnVlVHlwZUdYIHZhbGlkYXRvci4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB0YWJsZSA6OgotICAqICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0gICogICAgICAgQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIGZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkKLSAgKiAgIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlIG9ubHkuCi0gICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1RydWVUeXBlR1hfRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlICk7Ci0KLQotICAvKiAqLwotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBlbnVtOgotICAqICAgIEZUX1ZBTElEQVRFX0NLRVJOWFhYCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlZCB3aXRoIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZQotICAqICAgIHRvIGluZGljYXRlIHRoZSBjbGFzc2ljIGtlcm4gZGlhbGVjdCBvciBkaWFsZWN0cy4gIElmIHRoZSBzZWxlY3RlZAotICAqICAgIHR5cGUgZG9lc24ndCBmaXQsIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSByZWdhcmRzIHRoZSB0YWJsZSBhcwotICAqICAgIGludmFsaWQuCi0gICoKLSAgKiBAdmFsdWVzOgotICAqICAgIEZUX1ZBTElEQVRFX01TIDo6Ci0gICogICAgICBIYW5kbGUgdGhlIGBrZXJuJyB0YWJsZSBhcyBhIGNsYXNzaWMgTWljcm9zb2Z0IGtlcm4gdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9BUFBMRSA6OgotICAqICAgICAgSGFuZGxlIHRoZSBga2VybicgdGFibGUgYXMgYSBjbGFzc2ljIEFwcGxlIGtlcm4gdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9DS0VSTiA6OgotICAqICAgICAgSGFuZGxlIHRoZSBga2VybicgYXMgZWl0aGVyIGNsYXNzaWMgQXBwbGUgb3IgTWljcm9zb2Z0IGtlcm4gdGFibGUuCi0gICovCi0jZGVmaW5lIEZUX1ZBTElEQVRFX01TICAgICAoIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDw8IDAgKQotI2RlZmluZSBGVF9WQUxJREFURV9BUFBMRSAgKCBGVF9WQUxJREFURV9HWF9TVEFSVCA8PCAxICkKLQotI2RlZmluZSBGVF9WQUxJREFURV9DS0VSTiAgKCBGVF9WQUxJREFURV9NUyB8IEZUX1ZBTElEQVRFX0FQUExFICkKLQotCi0gIC8qICovCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgVmFsaWRhdGUgY2xhc3NpYyAoMTZiaXQgZm9ybWF0KSBrZXJuIHRhYmxlIHRvIGFzc3VyZSB0aGF0IHRoZSBvZmZzZXRzCi0gICogICAgYW5kIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHdoaWNoCi0gICogICAgYWN0dWFsbHkgZG9lcyB0aGUgdGV4dCBsYXlvdXQgY2FuIGFjY2VzcyB0aG9zZSB0YWJsZXMgd2l0aG91dCBlcnJvcgotICAqICAgIGNoZWNraW5nICh3aGljaCBjYW4gYmUgcXVpdGUgdGltZSBjb25zdW1pbmcpLgotICAqCi0gICogICAgVGhlIGBrZXJuJyB0YWJsZSB2YWxpZGF0b3IgaW4gQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUgZGVhbHMgd2l0aCBib3RoCi0gICogICAgdGhlIG5ldyAzMmJpdCBmb3JtYXQgYW5kIHRoZSBjbGFzc2ljIDE2Yml0IGZvcm1hdCwgd2hpbGUKLSAgKiAgICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSBvbmx5IHN1cHBvcnRzIHRoZSBjbGFzc2ljIDE2Yml0IGZvcm1hdC4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB2YWxpZGF0aW9uX2ZsYWdzIDo6Ci0gICogICAgICAgQSBiaXQgZmllbGQgd2hpY2ggc3BlY2lmaWVzIHRoZSBkaWFsZWN0IHRvIGJlIHZhbGlkYXRlZC4gIFNlZQotICAqICAgICAgIEBGVF9WQUxJREFURV9DS0VSTlhYWCBmb3IgcG9zc2libGUgdmFsdWVzLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBja2Vybl90YWJsZSA6OgotICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUga2VybiB0YWJsZS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBBZnRlciB1c2UsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGVhbGxvY2F0ZSB0aGUgYnVmZmVycyBwb2ludGVkIHRvIGJ5Ci0gICogICBgY2tlcm5fdGFibGUnLCBieSBjYWxsaW5nIEBGVF9DbGFzc2ljS2Vybl9GcmVlLiAgQSBOVUxMIHZhbHVlCi0gICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFibGUgZG9lc24ndCBleGlzdCBpbiB0aGUgZm9udC4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKmNrZXJuX3RhYmxlICk7Ci0KLQotICAvKiAqLwotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9DbGFzc2ljS2Vybl9GcmVlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBjbGFzc2ljIEtlcm4gdmFsaWRhdG9yLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIHRhYmxlIDo6Ci0gICogICAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IGlzIGFsbG9jYXRlZCBieQotICAqICAgICAgIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZS4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgdG8gZnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQotICAqICAgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIG9ubHkuCi0gICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0NsYXNzaWNLZXJuX0ZyZWUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGUgKTsKLQotCi0gLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUR1hWQUxfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGd6aXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5MzQzNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z3ppcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBHemlwLWNvbXByZXNzZWQgc3RyZWFtIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUR1pJUF9IX18KLSNkZWZpbmUgX19GVEdaSVBfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnemlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWklQIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2luZyBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIEd6aXAtc3BlY2lmaWMgZnVuY3Rpb25zLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9TdHJlYW1fT3Blbkd6aXAKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIE9wZW4gYSBuZXcgc3RyZWFtIHRvIHBhcnNlIGd6aXAtY29tcHJlc3NlZCBmb250IGZpbGVzLiAgVGhpcyBpcwotICAqICAgbWFpbmx5IHVzZWQgdG8gc3VwcG9ydCB0aGUgY29tcHJlc3NlZCBgKi5wY2YuZ3onIGZvbnRzIHRoYXQgY29tZQotICAqICAgd2l0aCBYRnJlZTg2LgotICAqCi0gICogQGlucHV0OgotICAqICAgc3RyZWFtIDo6Ci0gICogICAgIFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KLSAgKgotICAqICAgc291cmNlIDo6Ci0gICogICAgIFRoZSBzb3VyY2Ugc3RyZWFtLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAgKgotICAqICAgQ2FsbGluZyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIG5ldyBzdHJlYW0gd2lsbAotICAqICAgKm5vdCogY2FsbCBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgc291cmNlIHN0cmVhbS4gIE5vbmUgb2YgdGhlIHN0cmVhbQotICAqICAgb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgotICAqCi0gICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgotICAqICAgcHJvY2VzcyBlYWNoIHRpbWUgc2Vla2luZyBiYWNrd2FyZHMgaXMgbmVlZGVkIHdpdGhpbiB0aGUgc3RyZWFtLgotICAqCi0gICogICBJbiBjZXJ0YWluIGJ1aWxkcyBvZiB0aGUgbGlicmFyeSwgZ3ppcCBjb21wcmVzc2lvbiByZWNvZ25pdGlvbiBpcwotICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KLSAgKiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBubyBmb250IGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSByYXcKLSAgKiAgIGNvbXByZXNzZWQgZmlsZSwgdGhlIGxpYnJhcnkgd2lsbCB0cnkgdG8gb3BlbiBhIGd6aXBwZWQgc3RyZWFtIGZyb20KLSAgKiAgIGl0IGFuZCByZS1vcGVuIHRoZSBmYWNlIHdpdGggaXQuCi0gICoKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAotICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIHpsaWIgc3VwcG9ydC4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9PcGVuR3ppcCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzb3VyY2UgKTsKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVEdaSVBfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmFjYjE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGltYWdlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZ2x5cGggaW1hZ2UgZm9ybWF0cyBhbmQgZGVmYXVsdCByYXN0ZXIgaW50ZXJmYWNlICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggYnkgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGU6IEEgYHJhc3RlcicgaXMgc2ltcGx5IGEgc2Nhbi1saW5lIGNvbnZlcnRlciwgdXNlZCB0byByZW5kZXIgICAgICAqLwotICAvKiAgICAgICBGVF9PdXRsaW5lcyBpbnRvIEZUX0JpdG1hcHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVElNQUdFX0hfXwotI2RlZmluZSBfX0ZUSU1BR0VfSF9fCi0KLQotICAvKiBfU1RBTkRBTE9ORV8gaXMgZnJvbSBmdGdyYXlzLmMgKi8KLSNpZm5kZWYgX1NUQU5EQUxPTkVfCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSB0eXBlIEZUX1BvcyBpcyBhIDMyLWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgdmVjdG9yaWFsICAgICAgICAqLwotICAvKiAgICBjb29yZGluYXRlcy4gIERlcGVuZGluZyBvbiB0aGUgY29udGV4dCwgdGhlc2UgY2FuIHJlcHJlc2VudCAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2VzIGluIGludGVnZXIgZm9udCB1bml0cywgb3IgMTYsMTYsIG9yIDI2LjYgZml4ZWQgZmxvYXQgICAgICovCi0gIC8qICAgIHBpeGVsIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfUG9zOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyRCB2ZWN0b3I7IGNvb3JkaW5hdGVzIGFyZSBvZiAgICovCi0gIC8qICAgIHRoZSBGVF9Qb3MgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggOjogVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5IDo6IFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9WZWN0b3JfCi0gIHsKLSAgICBGVF9Qb3MgIHg7Ci0gICAgRlRfUG9zICB5OwotCi0gIH0gRlRfVmVjdG9yOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGFuIG91dGxpbmUncyBib3VuZGluZyBib3gsIGkuZS4sIHRoZSAgICAgICovCi0gIC8qICAgIGNvb3JkaW5hdGVzIG9mIGl0cyBleHRyZW1hIGluIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAgICAgICAgICAqLwotICAvKiAgICBkaXJlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4TWluIDo6IFRoZSBob3Jpem9udGFsIG1pbmltdW0gKGxlZnQtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlNaW4gOjogVGhlIHZlcnRpY2FsIG1pbmltdW0gKGJvdHRvbS1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeE1heCA6OiBUaGUgaG9yaXpvbnRhbCBtYXhpbXVtIChyaWdodC1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5TWF4IDo6IFRoZSB2ZXJ0aWNhbCBtYXhpbXVtICh0b3AtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9CQm94XwotICB7Ci0gICAgRlRfUG9zICB4TWluLCB5TWluOwotICAgIEZUX1BvcyAgeE1heCwgeU1heDsKLQotICB9IEZUX0JCb3g7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QaXhlbF9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBwaXhlbHMgaW4gYSAgICAgKi8KLSAgLyogICAgZ2l2ZW4gYml0bWFwLiAgTm90ZSB0aGF0IGFkZGl0aW9uYWwgZm9ybWF0cyBtYXkgYmUgYWRkZWQgaW4gdGhlICAgICovCi0gIC8qICAgIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFZhbHVlIDAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTU9OTyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgbW9ub2Nocm9tZSBiaXRtYXAsIHVzaW5nIDEgYml0IHBlciBwaXhlbC4gIE5vdGUgdGhhdCBwaXhlbHMgICAgKi8KLSAgLyogICAgICBhcmUgc3RvcmVkIGluIG1vc3Qtc2lnbmlmaWNhbnQgb3JkZXIgKE1TQiksIHdoaWNoIG1lYW5zIHRoYXQgICAgICovCi0gIC8qICAgICAgdGhlIGxlZnQtbW9zdCBwaXhlbCBpbiBhIGJ5dGUgaGFzIHZhbHVlIDEyOC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gOC1iaXQgYml0bWFwLCBnZW5lcmFsbHkgdXNlZCB0byByZXByZXNlbnQgYW50aS1hbGlhc2VkIGdseXBoICAqLwotICAvKiAgICAgIGltYWdlcy4gIEVhY2ggcGl4ZWwgaXMgc3RvcmVkIGluIG9uZSBieXRlLiAgTm90ZSB0aGF0IHRoZSBudW1iZXIgKi8KLSAgLyogICAgICBvZiB2YWx1ZSBgZ3JheScgbGV2ZWxzIGlzIHN0b3JlZCBpbiB0aGUgYG51bV9ieXRlcycgZmllbGQgb2YgICAgICovCi0gIC8qICAgICAgdGhlIEBGVF9CaXRtYXAgc3RydWN0dXJlIChpdCBnZW5lcmFsbHkgaXMgMjU2KS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSAyLWJpdC9waXhlbCBiaXRtYXAsIHVzZWQgdG8gcmVwcmVzZW50IGVtYmVkZGVkIGFudGktYWxpYXNlZCAgICAqLwotICAvKiAgICAgIGJpdG1hcHMgaW4gZm9udCBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgKi8KLSAgLyogICAgICBXZSBoYXZlbid0IGZvdW5kIGEgc2luZ2xlIGZvbnQgdXNpbmcgdGhpcyBmb3JtYXQsIGhvd2V2ZXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0dSQVk0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIDQtYml0L3BpeGVsIGJpdG1hcCwgdXNlZCB0byByZXByZXNlbnQgZW1iZWRkZWQgYW50aS1hbGlhc2VkICAgICovCi0gIC8qICAgICAgYml0bWFwcyBpbiBmb250IGZpbGVzIGFjY29yZGluZyB0byB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAqLwotICAvKiAgICAgIFdlIGhhdmVuJ3QgZm91bmQgYSBzaW5nbGUgZm9udCB1c2luZyB0aGlzIGZvcm1hdCwgaG93ZXZlci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTENEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIDgtYml0IGJpdG1hcCwgdXNlZCB0byByZXByZXNlbnQgUkdCIG9yIEJHUiBkZWNpbWF0ZWQgZ2x5cGggICAgKi8KLSAgLyogICAgICBpbWFnZXMgdXNlZCBmb3IgZGlzcGxheSBvbiBMQ0QgZGlzcGxheXM7IHRoZSBiaXRtYXAgaXMgdGhyZWUgICAgICovCi0gIC8qICAgICAgdGltZXMgd2lkZXIgdGhhbiB0aGUgb3JpZ2luYWwgZ2x5cGggaW1hZ2UuICBTZWUgYWxzbyAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9SRU5ERVJfTU9ERV9MQ0QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTENEX1YgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIDgtYml0IGJpdG1hcCwgdXNlZCB0byByZXByZXNlbnQgUkdCIG9yIEJHUiBkZWNpbWF0ZWQgZ2x5cGggICAgKi8KLSAgLyogICAgICBpbWFnZXMgdXNlZCBmb3IgZGlzcGxheSBvbiByb3RhdGVkIExDRCBkaXNwbGF5czsgdGhlIGJpdG1hcCAgICAgICovCi0gIC8qICAgICAgaXMgdGhyZWUgdGltZXMgdGFsbGVyIHRoYW4gdGhlIG9yaWdpbmFsIGdseXBoIGltYWdlLiAgU2VlIGFsc28gICAqLwotICAvKiAgICAgIEBGVF9SRU5ERVJfTU9ERV9MQ0RfVi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfUGl4ZWxfTW9kZV8KLSAgewotICAgIEZUX1BJWEVMX01PREVfTk9ORSA9IDAsCi0gICAgRlRfUElYRUxfTU9ERV9NT05PLAotICAgIEZUX1BJWEVMX01PREVfR1JBWSwKLSAgICBGVF9QSVhFTF9NT0RFX0dSQVkyLAotICAgIEZUX1BJWEVMX01PREVfR1JBWTQsCi0gICAgRlRfUElYRUxfTU9ERV9MQ0QsCi0gICAgRlRfUElYRUxfTU9ERV9MQ0RfViwKLQotICAgIEZUX1BJWEVMX01PREVfTUFYICAgICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gRlRfUGl4ZWxfTW9kZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3BpeGVsX21vZGVfeHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBkZXByZWNhdGVkIGNvbnN0YW50cy4gIFVzZSB0aGUgY29ycmVzcG9uZGluZyAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfUGl4ZWxfTW9kZSB2YWx1ZXMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9waXhlbF9tb2RlX25vbmUgIDo6IFNlZSBARlRfUElYRUxfTU9ERV9OT05FLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfcGl4ZWxfbW9kZV9tb25vICA6OiBTZWUgQEZUX1BJWEVMX01PREVfTU9OTy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3BpeGVsX21vZGVfZ3JheXMgOjogU2VlIEBGVF9QSVhFTF9NT0RFX0dSQVkuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9waXhlbF9tb2RlX3BhbDIgIDo6IFNlZSBARlRfUElYRUxfTU9ERV9HUkFZMi4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfcGl4ZWxfbW9kZV9wYWw0ICA6OiBTZWUgQEZUX1BJWEVMX01PREVfR1JBWTQuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9waXhlbF9tb2RlX25vbmUgICBGVF9QSVhFTF9NT0RFX05PTkUKLSNkZWZpbmUgZnRfcGl4ZWxfbW9kZV9tb25vICAgRlRfUElYRUxfTU9ERV9NT05PCi0jZGVmaW5lIGZ0X3BpeGVsX21vZGVfZ3JheXMgIEZUX1BJWEVMX01PREVfR1JBWQotI2RlZmluZSBmdF9waXhlbF9tb2RlX3BhbDIgICBGVF9QSVhFTF9NT0RFX0dSQVkyCi0jZGVmaW5lIGZ0X3BpeGVsX21vZGVfcGFsNCAgIEZUX1BJWEVMX01PREVfR1JBWTQKLQotIC8qICovCi0KLSNpZiAwCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGFsZXR0ZV9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVEhJUyBUWVBFIElTIERFUFJFQ0FURUQuICBETyBOT1QgVVNFIElUISAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgYSBiaXRtYXAgcGFsZXR0ZSwgICAgKi8KLSAgLyogICAgdXNlZCB3aXRoIGZ0X3BpeGVsX21vZGVfcGFsNCBhbmQgZnRfcGl4ZWxfbW9kZV9wYWw4LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfcGFsZXR0ZV9tb2RlX3JnYiAgOjogVGhlIHBhbGV0dGUgaXMgYW4gYXJyYXkgb2YgMy1ieXRlcyBSR0IgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfcGFsZXR0ZV9tb2RlX3JnYmEgOjogVGhlIHBhbGV0dGUgaXMgYW4gYXJyYXkgb2YgNC1ieXRlcyBSR0JBICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFzIGZ0X3BpeGVsX21vZGVfcGFsMiwgcGFsNCBhbmQgcGFsOCBhcmUgY3VycmVudGx5IHVudXNlZCBieSAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSwgdGhlc2UgdHlwZXMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBsaWJyYXJ5IGl0c2VsZi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfUGFsZXR0ZV9Nb2RlXwotICB7Ci0gICAgZnRfcGFsZXR0ZV9tb2RlX3JnYiA9IDAsCi0gICAgZnRfcGFsZXR0ZV9tb2RlX3JnYmEsCi0KLSAgICBmdF9wYWxldHRlX21vZGVfbWF4ICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gRlRfUGFsZXR0ZV9Nb2RlOwotCi0gIC8qICovCi0KLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGJpdG1hcCBvciBwaXhtYXAgdG8gdGhlIHJhc3Rlci4gICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB3ZSBub3cgbWFuYWdlIHBpeG1hcHMgb2YgdmFyaW91cyBkZXB0aHMgdGhyb3VnaCB0aGUgICAgICAqLwotICAvKiAgICBgcGl4ZWxfbW9kZScgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb3dzICAgICAgICAgOjogVGhlIG51bWJlciBvZiBiaXRtYXAgcm93cy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHBpeGVscyBpbiBiaXRtYXAgcm93LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl0Y2ggICAgICAgIDo6IFRoZSBwaXRjaCdzIGFic29sdXRlIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0YWtlbiBieSBvbmUgYml0bWFwIHJvdywgaW5jbHVkaW5nIHBhZGRpbmcuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgdGhlIHBpdGNoIGlzIHBvc2l0aXZlIHdoZW4gdGhlIGJpdG1hcCBoYXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGEgYGRvd24nIGZsb3csIGFuZCBuZWdhdGl2ZSB3aGVuIGl0IGhhcyBhbiBgdXAnICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmbG93LiAgSW4gYWxsIGNhc2VzLCB0aGUgcGl0Y2ggaXMgYW4gb2Zmc2V0IHRvIGFkZCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdG8gYSBiaXRtYXAgcG9pbnRlciBpbiBvcmRlciB0byBnbyBkb3duIG9uZSByb3cuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciAgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBidWZmZXIuICBUaGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIGFsaWduZWQgb24gMzItYml0IGJvdW5kYXJpZXMgaW4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIG1vc3QgY2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ3JheXMgICAgOjogVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgd2l0aCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEBGVF9QSVhFTF9NT0RFX0dSQVk7IGl0IGdpdmVzIHRoZSBudW1iZXIgb2YgZ3JheSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBsZXZlbHMgdXNlZCBpbiB0aGUgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl4ZWxfbW9kZSAgIDo6IFRoZSBwaXhlbCBtb2RlLCBpLmUuLCBob3cgcGl4ZWwgYml0cyBhcmUgc3RvcmVkLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBTZWUgQEZUX1BpeGVsX01vZGUgZm9yIHBvc3NpYmxlIHZhbHVlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFsZXR0ZV9tb2RlIDo6IFRoaXMgZmllbGQgaXMgaW50ZW5kZWQgZm9yIHBhbGV0dGVkIHBpeGVsIG1vZGVzOyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBpdCBpbmRpY2F0ZXMgaG93IHRoZSBwYWxldHRlIGlzIHN0b3JlZC4gIE5vdCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdXNlZCBjdXJyZW50bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhbGV0dGUgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBwYWxldHRlOyB0aGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZmllbGQgaXMgaW50ZW5kZWQgZm9yIHBhbGV0dGVkIHBpeGVsIG1vZGVzLiAgTm90ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHVzZWQgY3VycmVudGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGb3Igbm93LCB0aGUgb25seSBwaXhlbCBtb2RlcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGUgYXJlIG1vbm8gYW5kICAgICovCi0gIC8qICAgZ3JheXMuICBIb3dldmVyLCBkcml2ZXJzIG1pZ2h0IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUgdG8gc3VwcG9ydCAgICAqLwotICAvKiAgIG1vcmUgYGNvbG9yZnVsJyBvcHRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBfCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgcm93czsKLSAgICBpbnQgICAgICAgICAgICAgd2lkdGg7Ci0gICAgaW50ICAgICAgICAgICAgIHBpdGNoOwotICAgIHVuc2lnbmVkIGNoYXIqICBidWZmZXI7Ci0gICAgc2hvcnQgICAgICAgICAgIG51bV9ncmF5czsKLSAgICBjaGFyICAgICAgICAgICAgcGl4ZWxfbW9kZTsKLSAgICBjaGFyICAgICAgICAgICAgcGFsZXR0ZV9tb2RlOwotICAgIHZvaWQqICAgICAgICAgICBwYWxldHRlOwotCi0gIH0gRlRfQml0bWFwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZV9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgYW4gb3V0bGluZSB0byB0aGUgc2Nhbi1saW5lICAgICAqLwotICAvKiAgICBjb252ZXJ0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuX2NvbnRvdXJzIDo6IFRoZSBudW1iZXIgb2YgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5fcG9pbnRzICAgOjogVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRzICAgICA6OiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYG5fcG9pbnRzJyBARlRfVmVjdG9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZWxlbWVudHMsIGdpdmluZyB0aGUgb3V0bGluZSdzIHBvaW50IGNvb3JkaW5hdGVzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFncyAgICAgICA6OiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYG5fcG9pbnRzJyBjaGFycywgZ2l2aW5nICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZWFjaCBvdXRsaW5lIHBvaW50J3MgdHlwZS4gIElmIGJpdCAwIGlzIHVuc2V0LCB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHBvaW50IGlzIGBvZmYnIHRoZSBjdXJ2ZSwgaS5lLiwgYSBCw6l6aWVyIGNvbnRyb2wgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgcG9pbnQsIHdoaWxlIGl0IGlzIGBvbicgd2hlbiBzZXQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBCaXQgMSBpcyBtZWFuaW5nZnVsIGZvciBgb2ZmJyBwb2ludHMgb25seS4gIElmIHNldCwgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaXQgaW5kaWNhdGVzIGEgdGhpcmQtb3JkZXIgQsOpemllciBhcmMgY29udHJvbCBwb2ludDsgKi8KLSAgLyogICAgICAgICAgICAgICAgICBhbmQgYSBzZWNvbmQtb3JkZXIgY29udHJvbCBwb2ludCBpZiB1bnNldC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250b3VycyAgIDo6IEFuIGFycmF5IG9mIGBuX2NvbnRvdXJzJyBzaG9ydHMsIGdpdmluZyB0aGUgZW5kICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBwb2ludCBvZiBlYWNoIGNvbnRvdXIgd2l0aGluIHRoZSBvdXRsaW5lLiAgRm9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZXhhbXBsZSwgdGhlIGZpcnN0IGNvbnRvdXIgaXMgZGVmaW5lZCBieSB0aGUgcG9pbnRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGAwJyB0byBgY29udG91cnNbMF0nLCB0aGUgc2Vjb25kIG9uZSBpcyBkZWZpbmVkIGJ5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB0aGUgcG9pbnRzIGBjb250b3Vyc1swXSsxJyB0byBgY29udG91cnNbMV0nLCBldGMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGFncyAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyB1c2VkIHRvIGNoYXJhY3Rlcml6ZSB0aGUgb3V0bGluZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBhbmQgZ2l2ZSBoaW50cyB0byB0aGUgc2Nhbi1jb252ZXJ0ZXIgYW5kIGhpbnRlciBvbiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaG93IHRvIGNvbnZlcnQvZ3JpZC1maXQgaXQuICBTZWUgQEZUX09VVExJTkVfRkxBR1MuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX091dGxpbmVfCi0gIHsKLSAgICBzaG9ydCAgICAgICBuX2NvbnRvdXJzOyAgICAgIC8qIG51bWJlciBvZiBjb250b3VycyBpbiBnbHlwaCAgICAgICAgKi8KLSAgICBzaG9ydCAgICAgICBuX3BvaW50czsgICAgICAgIC8qIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGdseXBoICAgICAgKi8KLQotICAgIEZUX1ZlY3RvciogIHBvaW50czsgICAgICAgICAgLyogdGhlIG91dGxpbmUncyBwb2ludHMgICAgICAgICAgICAgICAqLwotICAgIGNoYXIqICAgICAgIHRhZ3M7ICAgICAgICAgICAgLyogdGhlIHBvaW50cyBmbGFncyAgICAgICAgICAgICAgICAgICAqLwotICAgIHNob3J0KiAgICAgIGNvbnRvdXJzOyAgICAgICAgLyogdGhlIGNvbnRvdXIgZW5kIHBvaW50cyAgICAgICAgICAgICAqLwotCi0gICAgaW50ICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAvKiBvdXRsaW5lIG1hc2tzICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgfSBGVF9PdXRsaW5lOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9PVVRMSU5FX0ZMQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlIGZvciB0aGUgZmxhZ3MgaW4gYW4gb3V0bGluZSdzICAgICovCi0gIC8qICAgIGBmbGFncycgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfTk9ORSAgICAgICAgICAgOjogVmFsdWUgMCBpcyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9PV05FUiAgICAgICAgICA6OiBJZiBzZXQsIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSdzIGZpZWxkIGFycmF5cyAoaS5lLiwgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBwb2ludHMnLCBgZmxhZ3MnICYgYGNvbnRvdXJzJykgYXJlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgb3duZWQnIGJ5IHRoZSBvdXRsaW5lIG9iamVjdCwgYW5kICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIHRodXMgYmUgZnJlZWQgd2hlbiBpdCBpcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3llZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMICAgOjogQnkgZGVmYXVsdCwgb3V0bGluZXMgYXJlIGZpbGxlZCB1c2luZyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBub24temVybyB3aW5kaW5nIHJ1bGUuICBJZiBzZXQgdG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB0aGUgb3V0bGluZSB3aWxsIGJlIGZpbGxlZCB1c2luZyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGV2ZW4tb2RkIGZpbGwgcnVsZSAob25seSB3b3JrcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIHNtb290aCByYXN0ZXIpLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgICAgOjogQnkgZGVmYXVsdCwgb3V0c2lkZSBjb250b3VycyBvZiBhbiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgYXJlIG9yaWVudGVkIGluIGNsb2NrLXdpc2UgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sIGFzIGRlZmluZWQgaW4gdGhlIFRydWVUeXBlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi4gIFRoaXMgZmxhZyBpcyBzZXQgaWYgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIHVzZXMgdGhlIG9wcG9zaXRlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gKHR5cGljYWxseSBmb3IgVHlwZSAxICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHMpLiAgVGhpcyBmbGFnIGlzIGlnbm9yZWQgYnkgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4tY29udmVydGVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgOjogQnkgZGVmYXVsdCwgdGhlIHNjYW4gY29udmVydGVyIHdpbGwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB0byBkZXRlY3QgZHJvcC1vdXRzIGluIGFuIG91dGxpbmUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgY29ycmVjdCB0aGUgZ2x5cGggYml0bWFwIHRvICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlIGNvbnNpc3RlbnQgc2hhcGUgY29udGludWl0eS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCwgdGhpcyBmbGFnIGhpbnRzIHRoZSBzY2FuLWxpbmUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgdG8gaWdub3JlIHN1Y2ggY2FzZXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gIDo6IFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLWxpbmUgY29udmVydGVyIHNob3VsZCB0cnkgdG8gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCB0aGlzIG91dGxpbmUgdG8gYml0bWFwcyB3aXRoICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHF1YWxpdHkuICBJdCBpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBpY2FsbHkgc2V0IGZvciBzbWFsbCBjaGFyYWN0ZXIgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXMuICBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGEgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQsIHRoYXQgbWlnaHQgYmUgY29tcGxldGVseSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVkIGJ5IGEgZ2l2ZW4gc2Nhbi1jb252ZXJ0ZXIuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX09VVExJTkVfU0lOR0xFX1BBU1MgICAgIDo6IFRoaXMgZmxhZyBpcyBzZXQgdG8gZm9yY2UgYSBnaXZlbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLWNvbnZlcnRlciB0byBvbmx5IHVzZSBhIHNpbmdsZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyBvdmVyIHRoZSBvdXRsaW5lIHRvIHJlbmRlciBhICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCBnbHlwaCBpbWFnZS4gIE5vcm1hbGx5LCBpdCBpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZm9yIHZlcnkgbGFyZ2UgY2hhcmFjdGVyIHNpemVzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgb25seSBhIGhpbnQsIHRoYXQgbWlnaHQgYmUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgaWdub3JlZCBieSBhIGdpdmVuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLWNvbnZlcnRlci4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9PVVRMSU5FX05PTkUgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIEZUX09VVExJTkVfT1dORVIgICAgICAgICAgICAweDEKLSNkZWZpbmUgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMICAgIDB4MgotI2RlZmluZSBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTCAgICAgMHg0Ci0jZGVmaW5lIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTICAweDgKLQotI2RlZmluZSBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OICAgMHgxMDAKLSNkZWZpbmUgRlRfT1VUTElORV9TSU5HTEVfUEFTUyAgICAgIDB4MjAwCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZW51bToKLSAgKiAgIGZ0X291dGxpbmVfZmxhZ3MKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIFRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgdGhlIGNvcnJlc3BvbmRpbmcKLSAgKiAgIEBGVF9PVVRMSU5FX0ZMQUdTIHZhbHVlcy4KLSAgKgotICAqIEB2YWx1ZXM6Ci0gICogICBmdF9vdXRsaW5lX25vbmUgICAgICAgICAgICA6OiBTZWUgQEZUX09VVExJTkVfTk9ORS4KLSAgKiAgIGZ0X291dGxpbmVfb3duZXIgICAgICAgICAgIDo6IFNlZSBARlRfT1VUTElORV9PV05FUi4KLSAgKiAgIGZ0X291dGxpbmVfZXZlbl9vZGRfZmlsbCAgIDo6IFNlZSBARlRfT1VUTElORV9FVkVOX09ERF9GSUxMLgotICAqICAgZnRfb3V0bGluZV9yZXZlcnNlX2ZpbGwgICAgOjogU2VlIEBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTC4KLSAgKiAgIGZ0X291dGxpbmVfaWdub3JlX2Ryb3BvdXRzIDo6IFNlZSBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMuCi0gICogICBmdF9vdXRsaW5lX2hpZ2hfcHJlY2lzaW9uICA6OiBTZWUgQEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04uCi0gICogICBmdF9vdXRsaW5lX3NpbmdsZV9wYXNzICAgICA6OiBTZWUgQEZUX09VVExJTkVfU0lOR0xFX1BBU1MuCi0gICovCi0jZGVmaW5lIGZ0X291dGxpbmVfbm9uZSAgICAgICAgICAgICBGVF9PVVRMSU5FX05PTkUKLSNkZWZpbmUgZnRfb3V0bGluZV9vd25lciAgICAgICAgICAgIEZUX09VVExJTkVfT1dORVIKLSNkZWZpbmUgZnRfb3V0bGluZV9ldmVuX29kZF9maWxsICAgIEZUX09VVExJTkVfRVZFTl9PRERfRklMTAotI2RlZmluZSBmdF9vdXRsaW5lX3JldmVyc2VfZmlsbCAgICAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwKLSNkZWZpbmUgZnRfb3V0bGluZV9pZ25vcmVfZHJvcG91dHMgIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTCi0jZGVmaW5lIGZ0X291dGxpbmVfaGlnaF9wcmVjaXNpb24gICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OCi0jZGVmaW5lIGZ0X291dGxpbmVfc2luZ2xlX3Bhc3MgICAgICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTCi0KLSAgLyogKi8KLQotI2RlZmluZSBGVF9DVVJWRV9UQUcoIGZsYWcgKSAgKCBmbGFnICYgMyApCi0KLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX09OICAgICAgICAgICAxCi0jZGVmaW5lIEZUX0NVUlZFX1RBR19DT05JQyAgICAgICAgMAotI2RlZmluZSBGVF9DVVJWRV9UQUdfQ1VCSUMgICAgICAgIDIKLQotI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfWCAgICAgIDggIC8qIHJlc2VydmVkIGZvciB0aGUgVHJ1ZVR5cGUgaGludGVyICovCi0jZGVmaW5lIEZUX0NVUlZFX1RBR19UT1VDSF9ZICAgICAxNiAgLyogcmVzZXJ2ZWQgZm9yIHRoZSBUcnVlVHlwZSBoaW50ZXIgKi8KLQotI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfQk9USCAgKCBGVF9DVVJWRV9UQUdfVE9VQ0hfWCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgKQotCi0jZGVmaW5lIEZUX0N1cnZlX1RhZ19PbiAgICAgICBGVF9DVVJWRV9UQUdfT04KLSNkZWZpbmUgRlRfQ3VydmVfVGFnX0NvbmljICAgIEZUX0NVUlZFX1RBR19DT05JQwotI2RlZmluZSBGVF9DdXJ2ZV9UYWdfQ3ViaWMgICAgRlRfQ1VSVkVfVEFHX0NVQklDCi0jZGVmaW5lIEZUX0N1cnZlX1RhZ19Ub3VjaF9YICBGVF9DVVJWRV9UQUdfVE9VQ0hfWAotI2RlZmluZSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWSAgRlRfQ1VSVkVfVEFHX1RPVUNIX1kKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTW92ZVRvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBtb3ZlICAqLwotICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZy9kZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYG1vdmUgdG8nIGlzIGVtaXR0ZWQgdG8gc3RhcnQgYSBuZXcgY29udG91ciBpbiBhbiBvdXRsaW5lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgcG9pbnQgb2YgdGhlIGBtb3ZlIHRvJy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiB0aGUgICovCi0gIC8qICAgICAgICAgICAgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBpbnQKLSAgKCpGVF9PdXRsaW5lX01vdmVUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7Ci0KLSNkZWZpbmUgRlRfT3V0bGluZV9Nb3ZlVG9fRnVuYyAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgbGluZSAgKi8KLSAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcvZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGBsaW5lIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgc2VnbWVudCBpbiB0aGUgb3V0bGluZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHBvaW50IG9mIHRoZSBgbGluZSB0bycuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgdGhlICAqLwotICAvKiAgICAgICAgICAgIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfT3V0bGluZV9MaW5lVG9GdW5jKSggY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOwotCi0jZGVmaW5lIEZUX091dGxpbmVfTGluZVRvX0Z1bmMgIEZUX091dGxpbmVfTGluZVRvRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Db25pY1RvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgY29uaWMgICovCi0gIC8qICAgIHRvJyBmdW5jdGlvbiBkdXJpbmcgb3V0bGluZSB3YWxraW5nL2RlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBgY29uaWMgdG8nIGlzIGVtaXR0ZWQgdG8gaW5kaWNhdGUgYSBzZWNvbmQtb3JkZXIgQsOpemllciBhcmMgaW4gICAqLwotICAvKiAgICB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sIDo6IEFuIGludGVybWVkaWF0ZSBjb250cm9sIHBvaW50IGJldHdlZW4gdGhlIGxhc3QgcG9zaXRpb24gKi8KLSAgLyogICAgICAgICAgICAgICBhbmQgdGhlIG5ldyB0YXJnZXQgaW4gYHRvJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGVuZCBwb2ludCBvZiB0aGUgY29uaWMgYXJjLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgICAqLwotICAvKiAgICAgICAgICAgICAgIHRoZSBkZWNvbXBvc2l0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfT3V0bGluZV9Db25pY1RvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7Ci0KLSNkZWZpbmUgRlRfT3V0bGluZV9Db25pY1RvX0Z1bmMgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBjdWJpYyAqLwotICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZy9kZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYGN1YmljIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgdGhpcmQtb3JkZXIgQsOpemllciBhcmMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sMSA6OiBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IELDqXppZXIgY29udHJvbCBwb2ludC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sMiA6OiBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBlbmQgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB3aGljaCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyIG9mICAqLwotICAvKiAgICAgICAgICAgICAgICB0aGUgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfT3V0bGluZV9DdWJpY1RvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHVzZXIgKTsKLQotI2RlZmluZSBGVF9PdXRsaW5lX0N1YmljVG9fRnVuYyAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB2YXJpb3VzIGZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgZHVyaW5nIG91dGxpbmUgICovCi0gIC8qICAgIGRlY29tcG9zaXRpb24gaW4gb3JkZXIgdG8gZW1pdCBzZWdtZW50cywgY29uaWMsIGFuZCBjdWJpYyBCw6l6aWVycywgKi8KLSAgLyogICAgYXMgd2VsbCBhcyBgbW92ZSB0bycgYW5kIGBjbG9zZSB0bycgb3BlcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW92ZV90byAgOjogVGhlIGBtb3ZlIHRvJyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaW5lX3RvICA6OiBUaGUgc2VnbWVudCBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbmljX3RvIDo6IFRoZSBzZWNvbmQtb3JkZXIgQsOpemllciBhcmMgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1YmljX3RvIDo6IFRoZSB0aGlyZC1vcmRlciBCw6l6aWVyIGFyYyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNoaWZ0ICAgIDo6IFRoZSBzaGlmdCB0aGF0IGlzIGFwcGxpZWQgdG8gY29vcmRpbmF0ZXMgYmVmb3JlIHRoZXkgICAqLwotICAvKiAgICAgICAgICAgICAgICBhcmUgc2VudCB0byB0aGUgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhICAgIDo6IFRoZSBkZWx0YSB0aGF0IGlzIGFwcGxpZWQgdG8gY29vcmRpbmF0ZXMgYmVmb3JlIHRoZXkgICAqLwotICAvKiAgICAgICAgICAgICAgICBhcmUgc2VudCB0byB0aGUgZW1pdHRlciwgYnV0IGFmdGVyIHRoZSBzaGlmdC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgc2VudCB0byB0aGUgZW1pdHRlcnMgYXJlIHRoZSB0cmFuc2Zvcm1lZCAgICAgKi8KLSAgLyogICAgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZXMgKHRoaXMgaXMgaW1wb3J0YW50IGZvciBoaWdoICAgICovCi0gIC8qICAgIGFjY3VyYWN5IGR1cmluZyBzY2FuLWNvbnZlcnNpb24pLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGlzIHNpbXBsZTogICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeCcgPSAoeCA8PCBzaGlmdCkgLSBkZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHknID0gKHggPDwgc2hpZnQpIC0gZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXQgdGhlIHZhbHVlIG9mIGBzaGlmdCcgYW5kIGBkZWx0YScgdG8gMCB0byBnZXQgdGhlIG9yaWdpbmFsICAgICAgKi8KLSAgLyogICAgcG9pbnQgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZV9GdW5jc18KLSAgewotICAgIEZUX091dGxpbmVfTW92ZVRvRnVuYyAgIG1vdmVfdG87Ci0gICAgRlRfT3V0bGluZV9MaW5lVG9GdW5jICAgbGluZV90bzsKLSAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jICBjb25pY190bzsKLSAgICBGVF9PdXRsaW5lX0N1YmljVG9GdW5jICBjdWJpY190bzsKLQotICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OwotICAgIEZUX1BvcyAgICAgICAgICAgICAgICAgIGRlbHRhOwotCi0gIH0gRlRfT3V0bGluZV9GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JTUFHRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGNvbnZlcnRzIGZvdXItbGV0dGVyIHRhZ3MgdG8gYW4gdW5zaWduZWQgbG9uZyB0eXBlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSBtYW55IDE2Yml0IGNvbXBpbGVycyBkb24ndCBsaWtlIDMyYml0IGVudW1lcmF0aW9ucywgeW91ICAgICAgKi8KLSAgLyogICAgc2hvdWxkIHJlZGVmaW5lIHRoaXMgbWFjcm8gaW4gY2FzZSBvZiBwcm9ibGVtcyB0byBzb21ldGhpbmcgbGlrZSAgICovCi0gIC8qICAgIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2RlZmluZSBGVF9JTUFHRV9UQUcoIHZhbHVlLCBfeDEsIF94MiwgX3gzLCBfeDQgKSAgdmFsdWUgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvIGdldCBhIHNpbXBsZSBlbnVtZXJhdGlvbiB3aXRob3V0IGFzc2lnbmluZyBzcGVjaWFsIG51bWJlcnMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfSU1BR0VfVEFHCi0jZGVmaW5lIEZUX0lNQUdFX1RBRyggdmFsdWUsIF94MSwgX3gyLCBfeDMsIF94NCApICBcCi0gICAgICAgICAgdmFsdWUgPSAoICggKHVuc2lnbmVkIGxvbmcpX3gxIDw8IDI0ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpX3gyIDw8IDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpX3gzIDw8IDggICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpX3g0ICAgICAgICAgKQotI2VuZGlmIC8qIEZUX0lNQUdFX1RBRyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgYSBnaXZlbiBnbHlwaCAgICovCi0gIC8qICAgIGltYWdlLiAgTm90ZSB0aGF0IHRoaXMgdmVyc2lvbiBvZiBGcmVlVHlwZSBvbmx5IHN1cHBvcnRzIHR3byBpbWFnZSAqLwotICAvKiAgICBmb3JtYXRzLCBldmVuIHRob3VnaCBmdXR1cmUgZm9udCBkcml2ZXJzIHdpbGwgYmUgYWJsZSB0byByZWdpc3RlciAgKi8KLSAgLyogICAgdGhlaXIgb3duIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfRk9STUFUX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHZhbHVlIDAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoIGltYWdlIGlzIGEgY29tcG9zaXRlIG9mIHNldmVyYWwgb3RoZXIgaW1hZ2VzLiAgVGhpcyAgICAqLwotICAvKiAgICAgIGZvcm1hdCBpcyBfb25seV8gdXNlZCB3aXRoIEBGVF9MT0FEX05PX1JFQ1VSU0UsIGFuZCBpcyB1c2VkIHRvICAgKi8KLSAgLyogICAgICByZXBvcnQgY29tcG91bmQgZ2x5cGhzIChsaWtlIGFjY2VudGVkIGNoYXJhY3RlcnMpLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfQklUTUFQIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSBiaXRtYXAsIGFuZCBjYW4gYmUgZGVzY3JpYmVkIGFzIGFuICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0JpdG1hcC4gIFlvdSBnZW5lcmFsbHkgbmVlZCB0byBhY2Nlc3MgdGhlIGBiaXRtYXAnIGZpZWxkIG9mICAqLwotICAvKiAgICAgIHRoZSBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSB0byByZWFkIGl0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIHZlY3RvcmlhbCBvdXRsaW5lIG1hZGUgb2YgbGluZSBzZWdtZW50cyAgICAgKi8KLSAgLyogICAgICBhbmQgQsOpemllciBhcmNzOyBpdCBjYW4gYmUgZGVzY3JpYmVkIGFzIGFuIEBGVF9PdXRsaW5lOyB5b3UgICAgICAqLwotICAvKiAgICAgIGdlbmVyYWxseSB3YW50IHRvIGFjY2VzcyB0aGUgYG91dGxpbmUnIGZpZWxkIG9mIHRoZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSB0byByZWFkIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfUExPVFRFUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSB2ZWN0b3JpYWwgcGF0aCB3aXRoIG5vIGluc2lkZSBhbmQgb3V0c2lkZSAgICovCi0gIC8qICAgICAgY29udG91cnMuICBTb21lIFR5cGUgMSBmb250cywgbGlrZSB0aG9zZSBpbiB0aGUgSGVyc2hleSBmYW1pbHksICAqLwotICAvKiAgICAgIGNvbnRhaW4gZ2x5cGhzIGluIHRoaXMgZm9ybWF0LiAgVGhlc2UgYXJlIGRlc2NyaWJlZCBhcyAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfT3V0bGluZSwgYnV0IEZyZWVUeXBlIGlzbid0IGN1cnJlbnRseSBjYXBhYmxlIG9mIHJlbmRlcmluZyAgICovCi0gIC8qICAgICAgdGhlbSBjb3JyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9HbHlwaF9Gb3JtYXRfCi0gIHsKLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9OT05FLCAwLCAwLCAwLCAwICksCi0KLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUsICdjJywgJ28nLCAnbScsICdwJyApLAotICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX0JJVE1BUCwgICAgJ2InLCAnaScsICd0JywgJ3MnICksCi0gICAgRlRfSU1BR0VfVEFHKCBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwgICAnbycsICd1JywgJ3QnLCAnbCcgKSwKLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9QTE9UVEVSLCAgICdwJywgJ2wnLCAnbycsICd0JyApCi0KLSAgfSBGVF9HbHlwaF9Gb3JtYXQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9nbHlwaF9mb3JtYXRfeHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgZGVwcmVjYXRlZCBjb25zdGFudHMuICBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dseXBoX0Zvcm1hdCB2YWx1ZXMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfZ2x5cGhfZm9ybWF0X25vbmUgICAgICA6OiBTZWUgQEZUX0dMWVBIX0ZPUk1BVF9OT05FLiAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2dseXBoX2Zvcm1hdF9jb21wb3NpdGUgOjogU2VlIEBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFLiAgICAgICAqLwotICAvKiAgICBmdF9nbHlwaF9mb3JtYXRfYml0bWFwICAgIDo6IFNlZSBARlRfR0xZUEhfRk9STUFUX0JJVE1BUC4gICAgICAgICAgKi8KLSAgLyogICAgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmUgICA6OiBTZWUgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLiAgICAgICAgICovCi0gIC8qICAgIGZ0X2dseXBoX2Zvcm1hdF9wbG90dGVyICAgOjogU2VlIEBGVF9HTFlQSF9GT1JNQVRfUExPVFRFUi4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X25vbmUgICAgICAgRlRfR0xZUEhfRk9STUFUX05PTkUKLSNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X2NvbXBvc2l0ZSAgRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURQotI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwICAgICBGVF9HTFlQSF9GT1JNQVRfQklUTUFQCi0jZGVmaW5lIGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FCi0jZGVmaW5lIGZ0X2dseXBoX2Zvcm1hdF9wbG90dGVyICAgIEZUX0dMWVBIX0ZPUk1BVF9QTE9UVEVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgUiBBIFMgVCBFIFIgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHJhc3RlciBpcyBhIHNjYW4gY29udmVydGVyLCBpbiBjaGFyZ2Ugb2YgcmVuZGVyaW5nIGFuIG91dGxpbmUgaW50byAgKi8KLSAgLyogYSBhIGJpdG1hcC4gIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgcHVibGljIEFQSSBmb3IgcmFzdGVycy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgaW4gRnJlZVR5cGUgMiwgYWxsIHJhc3RlcnMgYXJlIG5vdyBlbmNhcHN1bGF0ZWQgd2l0aGluICAgICAgKi8KLSAgLyogc3BlY2lmaWMgbW9kdWxlcyBjYWxsZWQgYHJlbmRlcmVycycuICBTZWUgYGZyZWV0eXBlL2Z0cmVuZGVyLmgnIGZvciAgICovCi0gIC8qIG1vcmUgZGV0YWlscyBvbiByZW5kZXJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTY2FubGluZSBDb252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIb3cgdmVjdG9yaWFsIG91dGxpbmVzIGFyZSBjb252ZXJ0ZWQgaW50byBiaXRtYXBzIGFuZCBwaXhtYXBzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGVjaG5pY2FsIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgKHBvaW50ZXIpIHRvIGEgcmFzdGVyIG9iamVjdC4gIEVhY2ggb2JqZWN0IGNhbiBiZSB1c2VkICAgICovCi0gIC8qICAgIGluZGVwZW5kZW50bHkgdG8gY29udmVydCBhbiBvdXRsaW5lIGludG8gYSBiaXRtYXAgb3IgcGl4bWFwLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfUmFzdGVyUmVjXyogIEZUX1Jhc3RlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NwYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBzaW5nbGUgc3BhbiBvZiBncmF5IChvciBibGFjaykgcGl4ZWxzICAqLwotICAvKiAgICB3aGVuIHJlbmRlcmluZyBhIG1vbm9jaHJvbWUgb3IgYW50aS1hbGlhc2VkIGJpdG1hcC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4ICAgICAgICA6OiBUaGUgc3BhbidzIGhvcml6b250YWwgc3RhcnQgcG9zaXRpb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbiAgICAgIDo6IFRoZSBzcGFuJ3MgbGVuZ3RoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY292ZXJhZ2UgOjogVGhlIHNwYW4gY29sb3IvY292ZXJhZ2UsIHJhbmdpbmcgZnJvbSAwIChiYWNrZ3JvdW5kKSAgICovCi0gIC8qICAgICAgICAgICAgICAgIHRvIDI1NSAoZm9yZWdyb3VuZCkuICBPbmx5IHVzZWQgZm9yIGFudGktYWxpYXNlZCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICByZW5kZXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBzcGFuIGRyYXdpbmcgY2FsbGJhY2sgdHlwZSBuYW1lZCAgICAgKi8KLSAgLyogICAgQEZUX1NwYW5GdW5jIHdoaWNoIHRha2VzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNwYW4gYXMgYSAgICAgICAgICovCi0gIC8qICAgIGEgcGFyYW1ldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNvdmVyYWdlIHZhbHVlIGlzIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIDI1NS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU3Bhbl8KLSAgewotICAgIHNob3J0ICAgICAgICAgICB4OwotICAgIHVuc2lnbmVkIHNob3J0ICBsZW47Ci0gICAgdW5zaWduZWQgY2hhciAgIGNvdmVyYWdlOwotCi0gIH0gRlRfU3BhbjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NwYW5GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCBhcyBhIGNhbGwtYmFjayBieSB0aGUgYW50aS1hbGlhc2VkIHJlbmRlcmVyIGluICAgICAqLwotICAvKiAgICBvcmRlciB0byBsZXQgY2xpZW50IGFwcGxpY2F0aW9ucyBkcmF3IHRoZW1zZWx2ZXMgdGhlIGdyYXkgcGl4ZWwgICAgKi8KLSAgLyogICAgc3BhbnMgb24gZWFjaCBzY2FuIGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeSAgICAgOjogVGhlIHNjYW5saW5lJ3MgeS1jb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCA6OiBUaGUgbnVtYmVyIG9mIHNwYW5zIHRvIGRyYXcgb24gdGhpcyBzY2FubGluZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwYW5zIDo6IEEgdGFibGUgb2YgYGNvdW50JyBzcGFucyB0byBkcmF3IG9uIHRoZSBzY2FubGluZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgOjogVXNlci1zdXBwbGllZCBkYXRhIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBjYWxsYmFjayBhbGxvd3MgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBkaXJlY3RseSByZW5kZXIgdGhlICAgICovCi0gIC8qICAgIGdyYXkgc3BhbnMgb2YgdGhlIGFudGktYWxpYXNlZCBiaXRtYXAgdG8gYW55IGtpbmQgb2Ygc3VyZmFjZXMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBjYW4gYmUgdXNlZCB0byB3cml0ZSBhbnRpLWFsaWFzZWQgb3V0bGluZXMgZGlyZWN0bHkgdG8gYSAgICAgICovCi0gIC8qICAgIGdpdmVuIGJhY2tncm91bmQgYml0bWFwLCBhbmQgZXZlbiBwZXJmb3JtIHRyYW5zbHVjZW5jeS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoZSBgY291bnQnIGZpZWxkIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gYSBmaXhlZCB2YWx1ZSAgICovCi0gIC8qICAgIGRlZmluZWQgYnkgdGhlIGBGVF9NQVhfR1JBWV9TUEFOUycgY29uZmlndXJhdGlvbiBtYWNybyBpbiAgICAgICAgICAqLwotICAvKiAgICBgZnRvcHRpb24uaCcuICBCeSBkZWZhdWx0LCB0aGlzIHZhbHVlIGlzIHNldCB0byAzMiwgd2hpY2ggbWVhbnMgICAgKi8KLSAgLyogICAgdGhhdCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDMyIHNwYW5zIG9uIGEgZ2l2ZW4gc2NhbmxpbmUsIHRoZSAgICAgICovCi0gIC8qICAgIGNhbGxiYWNrIGlzIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHdpdGggdGhlIHNhbWUgYHknIHBhcmFtZXRlciBpbiAgICAqLwotICAvKiAgICBvcmRlciB0byBkcmF3IGFsbCBjYWxsYmFja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE90aGVyd2lzZSwgdGhlIGNhbGxiYWNrIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIHNjYW4tbGluZSwgYW5kICAgICAqLwotICAvKiAgICBvbmx5IGZvciB0aG9zZSBzY2FubGluZXMgdGhhdCBkbyBoYXZlIGBncmF5JyBwaXhlbHMgb24gdGhlbS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1NwYW5GdW5jKSggaW50ICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGVF9TcGFuKiAgc3BhbnMsCi0gICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgdXNlciApOwotCi0jZGVmaW5lIEZUX1Jhc3Rlcl9TcGFuX0Z1bmMgIEZUX1NwYW5GdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfQml0VGVzdF9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUSElTIFRZUEUgSVMgREVQUkVDQVRFRC4gIERPIE5PVCBVU0UgSVQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCBhcyBhIGNhbGwtYmFjayBieSB0aGUgbW9ub2Nocm9tZSBzY2FuLWNvbnZlcnRlciAgICAqLwotICAvKiAgICB0byB0ZXN0IHdoZXRoZXIgYSBnaXZlbiB0YXJnZXQgcGl4ZWwgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIGRyYXdpbmcgKi8KLSAgLyogICAgYGNvbG9yJy4gIFRoZXNlIHRlc3RzIGFyZSBjcnVjaWFsIHRvIGltcGxlbWVudCBkcm9wLW91dCBjb250cm9sICAgICovCi0gIC8qICAgIHBlci1zZSB0aGUgVHJ1ZVR5cGUgc3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkgICAgIDo6IFRoZSBwaXhlbCdzIHktY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeCAgICAgOjogVGhlIHBpeGVsJ3MgeC1jb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICA6OiBVc2VyLXN1cHBsaWVkIGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDEgaWYgdGhlIHBpeGVsIGlzIGBzZXQnLCAwIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfUmFzdGVyX0JpdFRlc3RfRnVuYykoIGludCAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogIHVzZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9CaXRTZXRfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRISVMgVFlQRSBJUyBERVBSRUNBVEVELiAgRE8gTk9UIFVTRSBJVC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIGFzIGEgY2FsbC1iYWNrIGJ5IHRoZSBtb25vY2hyb21lIHNjYW4tY29udmVydGVyICAgICovCi0gIC8qICAgIHRvIHNldCBhbiBpbmRpdmlkdWFsIHRhcmdldCBwaXhlbC4gIFRoaXMgaXMgY3J1Y2lhbCB0byBpbXBsZW1lbnQgICAqLwotICAvKiAgICBkcm9wLW91dCBjb250cm9sIGFjY29yZGluZyB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5ICAgICA6OiBUaGUgcGl4ZWwncyB5LWNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggICAgIDo6IFRoZSBwaXhlbCdzIHgtY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgOjogVXNlci1zdXBwbGllZCBkYXRhIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMSBpZiB0aGUgcGl4ZWwgaXMgYHNldCcsIDAgb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9SYXN0ZXJfQml0U2V0X0Z1bmMpKCBpbnQgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgdXNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdCBmbGFnIGNvbnN0YW50cyBhcyB1c2VkIGluIHRoZSBgZmxhZ3MnIGZpZWxkIG9mIGEgICAgICovCi0gIC8qICAgIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9GTEFHX0RFRkFVTFQgOjogVGhpcyB2YWx1ZSBpcyAwLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfQUEgICAgICA6OiBUaGlzIGZsYWcgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQgYW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW50aS1hbGlhc2VkIGdseXBoIGltYWdlIHNob3VsZCBiZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25vY2hyb21lICgxLWJpdCkuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19ESVJFQ1QgIDo6IFRoaXMgZmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgZGlyZWN0ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmcuICBJbiB0aGlzIG1vZGUsIGNsaWVudCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zIG11c3QgcHJvdmlkZSB0aGVpciBvd24gc3BhbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiAgVGhpcyBsZXRzIHRoZW0gZGlyZWN0bHkgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3IG9yIGNvbXBvc2Ugb3ZlciBhbiBleGlzdGluZyBiaXRtYXAuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBiaXQgaXMgbm90IHNldCwgdGhlIHRhcmdldCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeG1hcCdzIGJ1ZmZlciBfbXVzdF8gYmUgemVyb2VkIGJlZm9yZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBmb3Igbm93LCBkaXJlY3QgcmVuZGVyaW5nIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHBvc3NpYmxlIHdpdGggYW50aS1hbGlhc2VkIGdseXBocy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19DTElQICAgIDo6IFRoaXMgZmxhZyBpcyBvbmx5IHVzZWQgaW4gZGlyZWN0ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmcgbW9kZS4gIElmIHNldCwgdGhlIG91dHB1dCB3aWxsICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2xpcHBlZCB0byBhIGJveCBzcGVjaWZpZWQgaW4gdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjbGlwX2JveCcgZmllbGQgb2YgdGhlICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfUmFzdGVyX1BhcmFtcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBieSBkZWZhdWx0LCB0aGUgZ2x5cGggYml0bWFwICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBjbGlwcGVkIHRvIHRoZSB0YXJnZXQgcGl4bWFwLCBleGNlcHQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZGlyZWN0IHJlbmRlcmluZyBtb2RlIHdoZXJlIGFsbCBzcGFucyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBnZW5lcmF0ZWQgaWYgbm8gY2xpcHBpbmcgYm94IGlzIHNldC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1JBU1RFUl9GTEFHX0RFRkFVTFQgIDB4MAotI2RlZmluZSBGVF9SQVNURVJfRkxBR19BQSAgICAgICAweDEKLSNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfRElSRUNUICAgMHgyCi0jZGVmaW5lIEZUX1JBU1RFUl9GTEFHX0NMSVAgICAgIDB4NAotCi0gIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfZGVmYXVsdCAgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVAotI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19hYSAgICAgICBGVF9SQVNURVJfRkxBR19BQQotI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19kaXJlY3QgICBGVF9SQVNURVJfRkxBR19ESVJFQ1QKLSNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfY2xpcCAgICAgRlRfUkFTVEVSX0ZMQUdfQ0xJUAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1BhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYXJndW1lbnRzIHVzZWQgYnkgYSByYXN0ZXIncyByZW5kZXIgICAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhcmdldCAgICAgIDo6IFRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgKGUuZy4sIGFuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBGVF9PdXRsaW5lKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxhZ3MgICAgICAgOjogVGhlIHJlbmRlcmluZyBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBncmF5X3NwYW5zICA6OiBUaGUgZ3JheSBzcGFuIGRyYXdpbmcgY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsYWNrX3NwYW5zIDo6IFRoZSBibGFjayBzcGFuIGRyYXdpbmcgY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0X3Rlc3QgICAgOjogVGhlIGJpdCB0ZXN0IGNhbGxiYWNrLiAgVU5JTVBMRU1FTlRFRCEgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRfc2V0ICAgICA6OiBUaGUgYml0IHNldCBjYWxsYmFjay4gIFVOSU1QTEVNRU5URUQhICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgIDo6IFVzZXItc3VwcGxpZWQgZGF0YSB0aGF0IGlzIHBhc3NlZCB0byBlYWNoIGRyYXdpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsaXBfYm94ICAgIDo6IEFuIG9wdGlvbmFsIGNsaXBwaW5nIGJveC4gIEl0IGlzIG9ubHkgdXNlZCBpbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBkaXJlY3QgcmVuZGVyaW5nIG1vZGUuICBOb3RlIHRoYXQgY29vcmRpbmF0ZXMgaGVyZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBfaW50ZWdlcl8gcGl4ZWxzIChhbmQgbm90IGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgIDI2LjYgZml4ZWQtcG9pbnQgdW5pdHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGFudGktYWxpYXNlZCBnbHlwaCBiaXRtYXAgaXMgZHJhd24gaWYgdGhlIEBGVF9SQVNURVJfRkxBR19BQSAgICAqLwotICAvKiAgICBiaXQgZmxhZyBpcyBzZXQgaW4gdGhlIGBmbGFncycgZmllbGQsIG90aGVyd2lzZSBhIG1vbm9jaHJvbWUgICAgICAgKi8KLSAgLyogICAgYml0bWFwIGlzIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBiaXQgZmxhZyBpcyBzZXQgaW4gYGZsYWdzJywgdGhlICAgICAgKi8KLSAgLyogICAgcmFzdGVyIHdpbGwgY2FsbCB0aGUgYGdyYXlfc3BhbnMnIGNhbGxiYWNrIHRvIGRyYXcgZ3JheSBwaXhlbCAgICAgICovCi0gIC8qICAgIHNwYW5zLCBpbiB0aGUgY2FzZSBvZiBhbiBhYSBnbHlwaCBiaXRtYXAsIGl0IHdpbGwgY2FsbCAgICAgICAgICAgICAqLwotICAvKiAgICBgYmxhY2tfc3BhbnMnLCBhbmQgYGJpdF90ZXN0JyBhbmQgYGJpdF9zZXQnIGluIHRoZSBjYXNlIG9mIGEgICAgICAgKi8KLSAgLyogICAgbW9ub2Nocm9tZSBiaXRtYXAuICBUaGlzIGFsbG93cyBkaXJlY3QgY29tcG9zaXRpb24gb3ZlciBhICAgICAgICAgICovCi0gIC8qICAgIHByZS1leGlzdGluZyBiaXRtYXAgdGhyb3VnaCB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrcyB0byBwZXJmb3JtIHRoZSAqLwotICAvKiAgICBzcGFuIGRyYXdpbmcvY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aGUgYGJpdF90ZXN0JyBhbmQgYGJpdF9zZXQnIGNhbGxiYWNrcyBhcmUgcmVxdWlyZWQgd2hlbiAqLwotICAvKiAgICByZW5kZXJpbmcgYSBtb25vY2hyb21lIGJpdG1hcCwgYXMgdGhleSBhcmUgY3J1Y2lhbCB0byBpbXBsZW1lbnQgICAgKi8KLSAgLyogICAgY29ycmVjdCBkcm9wLW91dCBjb250cm9sIGFzIGRlZmluZWQgaW4gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfUmFzdGVyX1BhcmFtc18KLSAgewotICAgIGNvbnN0IEZUX0JpdG1hcCogICAgICAgIHRhcmdldDsKLSAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICBzb3VyY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgZ3JheV9zcGFuczsKLSAgICBGVF9TcGFuRnVuYyAgICAgICAgICAgICBibGFja19zcGFuczsKLSAgICBGVF9SYXN0ZXJfQml0VGVzdF9GdW5jICBiaXRfdGVzdDsgICAgIC8qIGRvZXNuJ3Qgd29yayEgKi8KLSAgICBGVF9SYXN0ZXJfQml0U2V0X0Z1bmMgICBiaXRfc2V0OyAgICAgIC8qIGRvZXNuJ3Qgd29yayEgKi8KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICB1c2VyOwotICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgIGNsaXBfYm94OwotCi0gIH0gRlRfUmFzdGVyX1BhcmFtczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9OZXdGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSBuZXcgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbWVtb3J5JyBwYXJhbWV0ZXIgaXMgYSB0eXBlbGVzcyBwb2ludGVyIGluIG9yZGVyIHRvIGF2b2lkICAgICAqLwotICAvKiAgICB1bi13YW50ZWQgZGVwZW5kZW5jaWVzIG9uIHRoZSByZXN0IG9mIHRoZSBGcmVlVHlwZSBjb2RlLiAgSW4gICAgICAgKi8KLSAgLyogICAgcHJhY3RpY2UsIGl0IGlzIGFuIEBGVF9NZW1vcnkgb2JqZWN0LCBpLmUuLCBhIGhhbmRsZSB0byB0aGUgICAgICAgICovCi0gIC8qICAgIHN0YW5kYXJkIEZyZWVUeXBlIG1lbW9yeSBhbGxvY2F0b3IuICBIb3dldmVyLCB0aGlzIGZpZWxkIGNhbiBiZSAgICAqLwotICAvKiAgICBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSBnaXZlbiByYXN0ZXIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfUmFzdGVyX05ld0Z1bmMpKCB2b2lkKiAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXIqICByYXN0ZXIgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfTmV3X0Z1bmMgIEZUX1Jhc3Rlcl9OZXdGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfRG9uZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSBhIGdpdmVuIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1Jhc3Rlcl9Eb25lRnVuYykoIEZUX1Jhc3RlciAgcmFzdGVyICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX0RvbmVfRnVuYyAgRlRfUmFzdGVyX0RvbmVGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfUmVzZXRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBwcm92aWRlcyBhbiBhcmVhIG9mIG1lbW9yeSBjYWxsZWQgdGhlIGByZW5kZXIgcG9vbCcsICAgICAgKi8KLSAgLyogICAgYXZhaWxhYmxlIHRvIGFsbCByZWdpc3RlcmVkIHJhc3RlcnMuICBUaGlzIHBvb2wgY2FuIGJlIGZyZWVseSB1c2VkICovCi0gIC8qICAgIGR1cmluZyBhIGdpdmVuIHNjYW4tY29udmVyc2lvbiBidXQgaXMgc2hhcmVkIGJ5IGFsbCByYXN0ZXJzLiAgSXRzICAqLwotICAvKiAgICBjb250ZW50IGlzIHRodXMgdHJhbnNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgcmVuZGVyIHBvb2wgY2hhbmdlcywgb3IganVzdCAqLwotICAvKiAgICBhZnRlciBhIG5ldyByYXN0ZXIgb2JqZWN0IGlzIGNyZWF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgICAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvb2xfYmFzZSA6OiBUaGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9vbF9zaXplIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmFzdGVycyBjYW4gaWdub3JlIHRoZSByZW5kZXIgcG9vbCBhbmQgcmVseSBvbiBkeW5hbWljIG1lbW9yeSAgICAgICovCi0gIC8qICAgIGFsbG9jYXRpb24gaWYgdGhleSB3YW50IHRvIChhIGhhbmRsZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvciBpcyAgICAqLwotICAvKiAgICBwYXNzZWQgdG8gdGhlIHJhc3RlciBjb25zdHJ1Y3RvcikuICBIb3dldmVyLCB0aGlzIGlzIG5vdCAgICAgICAgICAgKi8KLSAgLyogICAgcmVjb21tZW5kZWQgZm9yIGVmZmljaWVuY3kgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9SYXN0ZXJfUmVzZXRGdW5jKSggRlRfUmFzdGVyICAgICAgIHJhc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIHBvb2xfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIHBvb2xfc2l6ZSApOwotCi0jZGVmaW5lIEZUX1Jhc3Rlcl9SZXNldF9GdW5jICBGVF9SYXN0ZXJfUmVzZXRGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGEgZ2VuZXJpYyBmYWNpbGl0eSB0byBjaGFuZ2UgbW9kZXMgb3IgYXR0cmlidXRlcyAgKi8KLSAgLyogICAgaW4gYSBnaXZlbiByYXN0ZXIuICBUaGlzIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIG9yICAgICovCi0gIC8qICAgIHNpbXBseSB0byBhbGxvdyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBgZmVhdHVyZXMnIGluIGEgZ2l2ZW4gICAgICAqLwotICAvKiAgICByYXN0ZXIgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZGUgICA6OiBBIDQtYnl0ZSB0YWcgdXNlZCB0byBuYW1lIHRoZSBtb2RlIG9yIHByb3BlcnR5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXJncyAgIDo6IEEgcG9pbnRlciB0byB0aGUgbmV3IG1vZGUvcHJvcGVydHkgdG8gdXNlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX1Jhc3Rlcl9TZXRNb2RlRnVuYykoIEZUX1Jhc3RlciAgICAgIHJhc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIGFyZ3MgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfU2V0X01vZGVfRnVuYyAgRlRfUmFzdGVyX1NldE1vZGVGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfUmVuZGVyRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEludm9rZXMgYSBnaXZlbiByYXN0ZXIgdG8gc2Nhbi1jb252ZXJ0IGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgaW50byBhICAgKi8KLSAgLyogICB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyIDo6IEEgaGFuZGxlIHRvIHRoZSByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJhbXMgOjogQSBwb2ludGVyIHRvIGFuIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZSB1c2VkIHRvICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHN0b3JlIHRoZSByZW5kZXJpbmcgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUgc291cmNlIGltYWdlIGRlcGVuZHMgb24gdGhlIHJhc3RlcidzIGdseXBoICovCi0gIC8qICAgIGZvcm1hdCBkZWZpbmVkIGluIGl0cyBARlRfUmFzdGVyX0Z1bmNzIHN0cnVjdHVyZS4gIEl0IGNhbiBiZSBhbiAgICAqLwotICAvKiAgICBARlRfT3V0bGluZSBvciBhbnl0aGluZyBlbHNlIGluIG9yZGVyIHRvIHN1cHBvcnQgYSBsYXJnZSBhcnJheSBvZiAgKi8KLSAgLyogICAgZ2x5cGggZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIGFsc28gdGhhdCB0aGUgcmVuZGVyIGZ1bmN0aW9uIGNhbiBmYWlsIGFuZCByZXR1cm4gYSAgICAgICAgICAgKi8KLSAgLyogICAgYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGVycm9yIGNvZGUgaWYgdGhlIHJhc3RlciB1c2VkIGRvZXMgICovCi0gIC8qICAgIG5vdCBzdXBwb3J0IGRpcmVjdCBjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWFhYOiBGb3Igbm93LCB0aGUgc3RhbmRhcmQgcmFzdGVyIGRvZXNuJ3Qgc3VwcG9ydCBkaXJlY3QgICAgICAgICAgICovCi0gIC8qICAgICAgICAgY29tcG9zaXRpb24gYnV0IHRoaXMgc2hvdWxkIGNoYW5nZSBmb3IgdGhlIGZpbmFsIHJlbGVhc2UgKHNlZSAqLwotICAvKiAgICAgICAgIHRoZSBmaWxlcyBgZGVtb3Mvc3JjL2Z0Z3JheXMuYycgYW5kIGBkZW1vcy9zcmMvZnRncmF5czIuYycgICAgKi8KLSAgLyogICAgICAgICBmb3IgZXhhbXBsZXMgb2YgZGlzdGluY3QgaW1wbGVtZW50YXRpb25zIHdoaWNoIHN1cHBvcnQgZGlyZWN0ICovCi0gIC8qICAgICAgICAgY29tcG9zaXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBpbnQKLSAgKCpGVF9SYXN0ZXJfUmVuZGVyRnVuYykoIEZUX1Jhc3RlciAgICAgICAgICAgICAgICByYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9SYXN0ZXJfUGFyYW1zKiAgcGFyYW1zICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX1JlbmRlcl9GdW5jICBGVF9SYXN0ZXJfUmVuZGVyRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgZ2l2ZW4gcmFzdGVyIGNsYXNzIHRvIHRoZSBsaWJyYXJ5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfZm9ybWF0ICA6OiBUaGUgc3VwcG9ydGVkIGdseXBoIGZvcm1hdCBmb3IgdGhpcyByYXN0ZXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfbmV3ICAgIDo6IFRoZSByYXN0ZXIgY29uc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9yZXNldCAgOjogVXNlZCB0byByZXNldCB0aGUgcmVuZGVyIHBvb2wgd2l0aGluIHRoZSByYXN0ZXIuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyX3JlbmRlciA6OiBBIGZ1bmN0aW9uIHRvIHJlbmRlciBhIGdseXBoIGludG8gYSBnaXZlbiBiaXRtYXAuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfZG9uZSAgIDo6IFRoZSByYXN0ZXIgZGVzdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9SYXN0ZXJfRnVuY3NfCi0gIHsKLSAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgIGdseXBoX2Zvcm1hdDsKLSAgICBGVF9SYXN0ZXJfTmV3RnVuYyAgICAgIHJhc3Rlcl9uZXc7Ci0gICAgRlRfUmFzdGVyX1Jlc2V0RnVuYyAgICByYXN0ZXJfcmVzZXQ7Ci0gICAgRlRfUmFzdGVyX1NldE1vZGVGdW5jICByYXN0ZXJfc2V0X21vZGU7Ci0gICAgRlRfUmFzdGVyX1JlbmRlckZ1bmMgICByYXN0ZXJfcmVuZGVyOwotICAgIEZUX1Jhc3Rlcl9Eb25lRnVuYyAgICAgcmFzdGVyX2RvbmU7Ci0KLSAgfSBGVF9SYXN0ZXJfRnVuY3M7Ci0KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRJTUFHRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZDJmNTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGluY3JlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aW5jcmVtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBpbmNyZW1lbnRhbCBsb2FkaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUSU5DUkVNX0hfXwotI2RlZmluZSBfX0ZUSU5DUkVNX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICAgaW5jcmVtZW50YWwKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgICBJbmNyZW1lbnRhbCBMb2FkaW5nCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICAgQ3VzdG9tIEdseXBoIExvYWRpbmcuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdmFyaW91cyBmdW5jdGlvbnMgdXNlZCB0byBwZXJmb3JtIHNvLWNhbGxlZAotICAgKiAgIGBpbmNyZW1lbnRhbCcgZ2x5cGggbG9hZGluZy4gIFRoaXMgaXMgYSBtb2RlIHdoZXJlIGFsbCBnbHlwaHMgbG9hZGVkCi0gICAqICAgZnJvbSBhIGdpdmVuIEBGVF9GYWNlIGFyZSBwcm92aWRlZCBieSB0aGUgY2xpZW50IGFwcGxpY2F0aW9uLAotICAgKgotICAgKiAgIEFwYXJ0IGZyb20gdGhhdCwgYWxsIG90aGVyIHRhYmxlcyBhcmUgbG9hZGVkIG5vcm1hbGx5IGZyb20gdGhlIGZvbnQKLSAgICogICBmaWxlLiAgVGhpcyBtb2RlIGlzIHVzZWZ1bCB3aGVuIEZyZWVUeXBlIGlzIHVzZWQgd2l0aGluIGFub3RoZXIKLSAgICogICBlbmdpbmUsIGUuZy4sIGEgUG9zdHNjcmlwdCBJbWFnaW5nIFByb2Nlc3Nvci4KLSAgICoKLSAgICogICBUbyBlbmFibGUgdGhpcyBtb2RlLCB5b3UgbXVzdCB1c2UgQEZUX09wZW5fRmFjZSwgcGFzc2luZyBhbgotICAgKiAgIEBGVF9QYXJhbWV0ZXIgd2l0aCB0aGUgQEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTCB0YWcgYW5kIGFuCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0ludGVyZmFjZSB2YWx1ZS4gIFNlZSB0aGUgY29tbWVudHMgZm9yCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyBmb3IgYW4gZXhhbXBsZS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX0luY3JlbWVudGFsCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBbiBvcGFxdWUgdHlwZSBkZXNjcmliaW5nIGEgdXNlci1wcm92aWRlZCBvYmplY3QgdXNlZCB0byBpbXBsZW1lbnQKLSAgICogICBgaW5jcmVtZW50YWwnIGdseXBoIGxvYWRpbmcgd2l0aGluIEZyZWVUeXBlLiAgVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQKLSAgICogICBlbWJlZGRlZCBmb250cyBpbiBjZXJ0YWluIGVudmlyb25tZW50cyAoZS5nLiwgUG9zdHNjcmlwdCBpbnRlcnByZXRlcnMpLAotICAgKiAgIHdoZXJlIHRoZSBnbHlwaCBkYXRhIGlzbid0IGluIHRoZSBmb250IGZpbGUsIG9yIG11c3QgYmUgb3ZlcnJpZGRlbiBieQotICAgKiAgIGRpZmZlcmVudCB2YWx1ZXMuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEl0IGlzIHVwIHRvIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGFuZCBpbXBsZW1lbnQgQEZUX0luY3JlbWVudGFsCi0gICAqICAgb2JqZWN0cywgYXMgbG9uZyBhcyB0aGV5IHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgbWV0aG9kcwotICAgKiAgIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jLCBARlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMKLSAgICogICBhbmQgQEZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMuCi0gICAqCi0gICAqICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjIHRvIHVuZGVyc3RhbmQgaG93Ci0gICAqICAgdG8gdXNlIGluY3JlbWVudGFsIG9iamVjdHMgd2l0aCBGcmVlVHlwZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0luY3JlbWVudGFsUmVjXyogIEZUX0luY3JlbWVudGFsOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgc21hbGwgc3RydWN0dXJlIHVzZWQgdG8gY29udGFpbiB0aGUgYmFzaWMgZ2x5cGggbWV0cmljcyByZXR1cm5lZAotICAgKiAgIGJ5IHRoZSBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYyBtZXRob2QuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgYmVhcmluZ194IDo6Ci0gICAqICAgICBMZWZ0IGJlYXJpbmcsIGluIGZvbnQgdW5pdHMuCi0gICAqCi0gICAqICAgYmVhcmluZ195IDo6Ci0gICAqICAgICBUb3AgYmVhcmluZywgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogICBhZHZhbmNlIDo6Ci0gICAqICAgICBHbHlwaCBhZHZhbmNlLCBpbiBmb250IHVuaXRzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGVzZSBjb3JyZXNwb25kIHRvIGhvcml6b250YWwgb3IgdmVydGljYWwgbWV0cmljcyBkZXBlbmRpbmcgb24gdGhlCi0gICAqICAgdmFsdWUgb2YgdGhlIGB2ZXJ0aWNhbCcgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlY18KLSAgewotICAgIEZUX0xvbmcgIGJlYXJpbmdfeDsKLSAgICBGVF9Mb25nICBiZWFyaW5nX3k7Ci0gICAgRlRfTG9uZyAgYWR2YW5jZTsKLQotICB9IEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfTWV0cmljcwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBoYW5kbGUgdG8gYW4gQEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWMgc3RydWN0dXJlLgotICAgKgotICAgKi8KLSAgIHR5cGVkZWYgc3RydWN0IEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWNfKiAgRlRfSW5jcmVtZW50YWxfTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiBjYWxsZWQgYnkgRnJlZVR5cGUgdG8gYWNjZXNzIGEgZ2l2ZW4gZ2x5cGgncyBkYXRhIGJ5dGVzCi0gICAqICAgZHVyaW5nIEBGVF9Mb2FkX0dseXBoIG9yIEBGVF9Mb2FkX0NoYXIgaWYgaW5jcmVtZW50YWwgbG9hZGluZyBpcwotICAgKiAgIGVuYWJsZWQuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IHRoZSBmb3JtYXQgb2YgdGhlIGdseXBoJ3MgZGF0YSBieXRlcyBkZXBlbmRzIG9uIHRoZSBmb250Ci0gICAqICAgZmlsZSBmb3JtYXQuICBGb3IgVHJ1ZVR5cGUsIGl0IG11c3QgY29ycmVzcG9uZCB0byB0aGUgcmF3IGJ5dGVzIHdpdGhpbgotICAgKiAgIHRoZSBgZ2x5ZicgdGFibGUuICBGb3IgUG9zdHNjcmlwdCBmb3JtYXRzLCBpdCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlCi0gICAqICAgKnVuZW5jcnlwdGVkKiBjaGFyc3RyaW5nIGJ5dGVzLCB3aXRob3V0IGFueSBgbGVuSVYnIGhlYWRlci4gIEl0IGlzCi0gICAqICAgdW5kZWZpbmVkIGZvciBhbnkgb3RoZXIgZm9ybWF0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaW5jcmVtZW50YWwgOjoKLSAgICogICAgIEhhbmRsZSB0byBhbiBvcGFxdWUgQEZUX0luY3JlbWVudGFsIGhhbmRsZSBwcm92aWRlZCBieSB0aGUgY2xpZW50Ci0gICAqICAgICBhcHBsaWNhdGlvbi4KLSAgICoKLSAgICogICBnbHlwaF9pbmRleCA6OgotICAgKiAgICAgSW5kZXggb2YgcmVsZXZhbnQgZ2x5cGguCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYWRhdGEgOjoKLSAgICogICAgIEEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIHJldHVybmVkIGdseXBoIGRhdGEgYnl0ZXMgKHdoaWNoIHdpbGwgYmUKLSAgICogICAgIGFjY2Vzc2VkIGFzIGEgcmVhZC1vbmx5IGJ5dGUgYmxvY2spLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzZnVsbHkgdGhlIG1ldGhvZAotICAgKiAgIEBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYyB3aWxsIGJlIGNhbGxlZCBsYXRlciB0byByZWxlYXNlCi0gICAqICAgdGhlIGRhdGEgYnl0ZXMuCi0gICAqCi0gICAqICAgTmVzdGVkIGNhbGxzIHRvIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jIGNhbiBoYXBwZW4gZm9yCi0gICAqICAgY29tcG91bmQgZ2x5cGhzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMpKCBGVF9JbmNyZW1lbnRhbCAgaW5jcmVtZW50YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGF0YSogICAgICAgIGFkYXRhICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX0luY3JlbWVudGFsX0ZyZWVHbHlwaERhdGFGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVsZWFzZSB0aGUgZ2x5cGggZGF0YSBieXRlcyByZXR1cm5lZCBieSBhCi0gICAqICAgc3VjY2Vzc2Z1bCBjYWxsIHRvIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaW5jcmVtZW50YWwgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIGFuIG9wYXF1ZSBARlRfSW5jcmVtZW50YWwgaGFuZGxlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQKLSAgICogICAgIGFwcGxpY2F0aW9uLgotICAgKgotICAgKiAgIGRhdGEgOjoKLSAgICogICAgIEEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGdseXBoIGRhdGEgYnl0ZXMgKHdoaWNoIHdpbGwgYmUgYWNjZXNzZWQKLSAgICogICAgIGFzIGEgcmVhZC1vbmx5IGJ5dGUgYmxvY2spLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMpKCBGVF9JbmNyZW1lbnRhbCAgaW5jcmVtZW50YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9EYXRhKiAgICAgICAgZGF0YSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmV0cmlldmUgdGhlIGJhc2ljIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCBpbmRleAotICAgKiAgIGJlZm9yZSBhY2Nlc3NpbmcgaXRzIGRhdGEuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlLCBpbiBjZXJ0YWluCi0gICAqICAgZm9ybWF0cyBsaWtlIFRydWVUeXBlLCB0aGUgbWV0cmljcyBhcmUgc3RvcmVkIGluIGEgZGlmZmVyZW50IHBsYWNlIGZyb20KLSAgICogICB0aGUgZ2x5cGggaW1hZ2VzIHByb3Blci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGluY3JlbWVudGFsIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byBhbiBvcGFxdWUgQEZUX0luY3JlbWVudGFsIGhhbmRsZSBwcm92aWRlZCBieSB0aGUgY2xpZW50Ci0gICAqICAgICBhcHBsaWNhdGlvbi4KLSAgICoKLSAgICogICBnbHlwaF9pbmRleCA6OgotICAgKiAgICAgSW5kZXggb2YgcmVsZXZhbnQgZ2x5cGguCi0gICAqCi0gICAqICAgdmVydGljYWwgOjoKLSAgICogICAgIElmIHRydWUsIHJldHVybiB2ZXJ0aWNhbCBtZXRyaWNzLgotICAgKgotICAgKiAgIGFtZXRyaWNzIDo6Ci0gICAqICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCi0gICAqICAgICBUaGUgb3JpZ2luYWwgZ2x5cGggbWV0cmljcywgaWYgYW55LCBpbiBmb250IHVuaXRzLiAgSWYgbWV0cmljcyBhcmUKLSAgICogICAgIG5vdCBhdmFpbGFibGUgYWxsIHRoZSB2YWx1ZXMgbXVzdCBiZSBzZXQgdG8gemVyby4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBhbWV0cmljcyA6OgotICAgKiAgICAgVGhlIHJlcGxhY2VtZW50IGdseXBoIG1ldHJpY3MgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jKQotICAgICAgICAgICAgICAgICAgICAgICggRlRfSW5jcmVtZW50YWwgICAgICAgICAgICAgIGluY3JlbWVudGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYyAgKmFtZXRyaWNzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVF9JbmNyZW1lbnRhbF9GdW5jc1JlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSB0YWJsZSBvZiBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBmb250cyB0aGF0IGxvYWQgZGF0YQotICAgKiAgIGluY3JlbWVudGFsbHkuICBVc2VkIGluIEBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgZ2V0X2dseXBoX2RhdGEgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBnZXQgZ2x5cGggZGF0YS4gIE11c3Qgbm90IGJlIG51bGwuCi0gICAqCi0gICAqICAgZnJlZV9nbHlwaF9kYXRhIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gcmVsZWFzZSBnbHlwaCBkYXRhLiAgTXVzdCBub3QgYmUgbnVsbC4KLSAgICoKLSAgICogICBnZXRfZ2x5cGhfbWV0cmljcyA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIGdldCBnbHlwaCBtZXRyaWNzLiAgTWF5IGJlIG51bGwgaWYgdGhlIGZvbnQgZG9lcwotICAgKiAgICAgbm90IHByb3ZpZGUgb3ZlcnJpZGluZyBnbHlwaCBtZXRyaWNzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0luY3JlbWVudGFsX0Z1bmNzUmVjXwotICB7Ci0gICAgRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYyAgICAgZ2V0X2dseXBoX2RhdGE7Ci0gICAgRlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMgICAgZnJlZV9nbHlwaF9kYXRhOwotICAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMgIGdldF9nbHlwaF9tZXRyaWNzOwotCi0gIH0gRlRfSW5jcmVtZW50YWxfRnVuY3NSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHN0cnVjdHVyZSB0byBiZSB1c2VkIHdpdGggQEZUX09wZW5fRmFjZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB1c2VyCi0gICAqICAgd2FudHMgdG8gc3VwcG9ydCBpbmNyZW1lbnRhbCBnbHlwaCBsb2FkaW5nLiAgWW91IHNob3VsZCB1c2UgaXQgd2l0aAotICAgKiAgIEBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgotICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMgIGluY19pbnQ7Ci0gICAqICAgICAgIEZUX1BhcmFtZXRlciAgICAgICAgICAgICAgICAgcGFyYW1ldGVyOwotICAgKiAgICAgICBGVF9PcGVuX0FyZ3MgICAgICAgICAgICAgICAgIG9wZW5fYXJnczsKLSAgICoKLSAgICoKLSAgICogICAgICAgLy8gc2V0IHVwIGluY3JlbWVudGFsIGRlc2NyaXB0b3IKLSAgICogICAgICAgaW5jX2ludC5mdW5jcyAgPSBteV9mdW5jczsKLSAgICogICAgICAgaW5jX2ludC5vYmplY3QgPSBteV9vYmplY3Q7Ci0gICAqCi0gICAqICAgICAgIC8vIHNldCB1cCBvcHRpb25hbCBwYXJhbWV0ZXIKLSAgICogICAgICAgcGFyYW1ldGVyLnRhZyAgPSBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUw7Ci0gICAqICAgICAgIHBhcmFtZXRlci5kYXRhID0gJmluY19pbnQ7Ci0gICAqCi0gICAqICAgICAgIC8vIHNldCB1cCBGVF9PcGVuX0FyZ3Mgc3RydWN0dXJlCi0gICAqICAgICAgIG9wZW5fYXJncy5mbGFncyAgICAgID0gRlRfT1BFTl9QQVRITkFNRSB8IEZUX09QRU5fUEFSQU1TOwotICAgKiAgICAgICBvcGVuX2FyZ3MucGF0aG5hbWUgICA9IG15X2ZvbnRfcGF0aG5hbWU7Ci0gICAqICAgICAgIG9wZW5fYXJncy5udW1fcGFyYW1zID0gMTsKLSAgICogICAgICAgb3Blbl9hcmdzLnBhcmFtcyAgICAgPSAmcGFyYW1ldGVyOyAvLyB3ZSB1c2Ugb25lIG9wdGlvbmFsIGFyZ3VtZW50Ci0gICAqCi0gICAqICAgICAgIC8vIG9wZW4gdGhlIGZvbnQKLSAgICogICAgICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZvcGVuX2FyZ3MsIGluZGV4LCAmZmFjZSApOwotICAgKiAgICAgICAuLi4KLSAgICogICAgIH0KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWNfCi0gIHsKLSAgICBjb25zdCBGVF9JbmNyZW1lbnRhbF9GdW5jc1JlYyogIGZ1bmNzOwotICAgIEZUX0luY3JlbWVudGFsICAgICAgICAgICAgICAgICAgb2JqZWN0OwotCi0gIH0gRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2UKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgcG9pbnRlciB0byBhbiBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjIHN0cnVjdHVyZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjKiAgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGNvbnN0YW50OgotICAgKiAgIEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBjb25zdGFudCB1c2VkIGFzIHRoZSB0YWcgb2YgQEZUX1BhcmFtZXRlciBzdHJ1Y3R1cmVzIHRvIGluZGljYXRlCi0gICAqICAgYW4gaW5jcmVtZW50YWwgbG9hZGluZyBvYmplY3QgdG8gYmUgdXNlZCBieSBGcmVlVHlwZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTCAgRlRfTUFLRV9UQUcoICdpJywgJ24nLCAnYycsICdyJyApCi0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVElOQ1JFTV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkOTc4MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRsY2RmaWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY29sb3IgZmlsdGVyaW5nIG9mIHN1YnBpeGVsIGJpdG1hcCBnbHlwaHMgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUX0xDRF9GSUxURVJfSF9fCi0jZGVmaW5lIF9fRlRfTENEX0ZJTFRFUl9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICBsY2RfZmlsdGVyaW5nCi0gICAqCi0gICAqIEB0aXRsZToKLSAgICogICBMQ0QgRmlsdGVyaW5nCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICBSZWR1Y2UgY29sb3IgZnJpbmdlcyBvZiBMQ0Qtb3B0aW1pemVkIGJpdG1hcHMuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyIEFQSSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbG93LXBhc3MKLSAgICogICBmaWx0ZXIgd2hpY2ggaXMgdGhlbiBhcHBsaWVkIHRvIExDRC1vcHRpbWl6ZWQgYml0bWFwcyBnZW5lcmF0ZWQKLSAgICogICB0aHJvdWdoIEBGVF9SZW5kZXJfR2x5cGguICBUaGlzIGlzIHVzZWZ1bCB0byByZWR1Y2UgY29sb3IgZnJpbmdlcwotICAgKiAgIHdoaWNoIHdvdWxkIG9jY3VyIHdpdGggdW5maWx0ZXJlZCByZW5kZXJpbmcuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IG5vIGZpbHRlciBpcyBhY3RpdmUgYnkgZGVmYXVsdCwgYW5kIHRoYXQgdGhpcyBmdW5jdGlvbiBpcwotICAgKiAgICpub3QqIGltcGxlbWVudGVkIGluIGRlZmF1bHQgYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LiAgWW91IG5lZWQgdG8KLSAgICogICAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HIGluIHlvdXIgYGZ0b3B0aW9uLmgnIGZpbGUKLSAgICogICBpbiBvcmRlciB0byBhY3RpdmF0ZSBpdC4KLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuYzoKLSAgICogICBGVF9MY2RGaWx0ZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWx1ZXMgdG8gaWRlbnRpZnkgdmFyaW91cyB0eXBlcyBvZiBMQ0QgZmlsdGVycy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9MQ0RfRklMVEVSX05PTkUgOjoKLSAgICogICAgIERvIG5vdCBwZXJmb3JtIGZpbHRlcmluZy4gIFdoZW4gdXNlZCB3aXRoIHN1YnBpeGVsIHJlbmRlcmluZywgdGhpcwotICAgKiAgICAgcmVzdWx0cyBpbiBzb21ldGltZXMgc2V2ZXJlIGNvbG9yIGZyaW5nZXMuCi0gICAqCi0gICAqICAgRlRfTENEX0ZJTFRFUl9ERUZBVUxUIDo6Ci0gICAqICAgICBUaGUgZGVmYXVsdCBmaWx0ZXIgcmVkdWNlcyBjb2xvciBmcmluZ2VzIGNvbnNpZGVyYWJseSwgYXQgdGhlIGNvc3QKLSAgICogICAgIG9mIGEgc2xpZ2h0IGJsdXJyaW5lc3MgaW4gdGhlIG91dHB1dC4KLSAgICoKLSAgICogICBGVF9MQ0RfRklMVEVSX0xJR0hUIDo6Ci0gICAqICAgICBUaGUgbGlnaHQgZmlsdGVyIGlzIGEgdmFyaWFudCB0aGF0IHByb2R1Y2VzIGxlc3MgYmx1cnJpbmVzcyBhdCB0aGUKLSAgICogICAgIGNvc3Qgb2Ygc2xpZ2h0bHkgbW9yZSBjb2xvciBmcmluZ2VzIHRoYW4gdGhlIGRlZmF1bHQgb25lLiAgSXQgbWlnaHQKLSAgICogICAgIGJlIGJldHRlciwgZGVwZW5kaW5nIG9uIHRhc3RlLCB5b3VyIG1vbml0b3IsIG9yIHlvdXIgcGVyc29uYWwgdmlzaW9uLgotICAgKgotICAgKiAgIEZUX0xDRF9GSUxURVJfTEVHQUNZIDo6Ci0gICAqICAgICBUaGlzIGZpbHRlciBjb3JyZXNwb25kcyB0byB0aGUgb3JpZ2luYWwgbGliWGZ0IGNvbG9yIGZpbHRlci4gIEl0Ci0gICAqICAgICBwcm92aWRlcyBoaWdoIGNvbnRyYXN0IG91dHB1dCBidXQgY2FuIGV4aGliaXQgcmVhbGx5IGJhZCBjb2xvcgotICAgKiAgICAgZnJpbmdlcyBpZiBnbHlwaHMgYXJlIG5vdCBleHRyZW1lbHkgd2VsbCBoaW50ZWQgdG8gdGhlIHBpeGVsIGdyaWQuCi0gICAqICAgICBJbiBvdGhlciB3b3JkcywgaXQgb25seSB3b3JrcyB3ZWxsIGlmIHRoZSBUcnVlVHlwZSBieXRlY29kZQotICAgKiAgICAgaW50ZXJwcmV0ZXIgaXMgZW5hYmxlZCAqYW5kKiBoaWdoLXF1YWxpdHkgaGludGVkIGZvbnRzIGFyZSB1c2VkLgotICAgKgotICAgKiAgICAgVGhpcyBmaWx0ZXIgaXMgb25seSBwcm92aWRlZCBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcywgYW5kIG1pZ2h0IGJlCi0gICAqICAgICBkaXNhYmxlZCBvciBzdGF5IHVuc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuCi0gICAqCi0gICAqIEBzaW5jZToKLSAgICogICAyLjMuMAotICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9MY2RGaWx0ZXJfCi0gIHsKLSAgICBGVF9MQ0RfRklMVEVSX05PTkUgICAgPSAwLAotICAgIEZUX0xDRF9GSUxURVJfREVGQVVMVCA9IDEsCi0gICAgRlRfTENEX0ZJTFRFUl9MSUdIVCAgID0gMiwKLSAgICBGVF9MQ0RfRklMVEVSX0xFR0FDWSAgPSAxNiwKLQotICAgIEZUX0xDRF9GSUxURVJfTUFYICAgLyogZG8gbm90IHJlbW92ZSAqLwotCi0gIH0gRlRfTGNkRmlsdGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jOgotICAgKiAgIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXBwbHkgY29sb3IgZmlsdGVyaW5nIHRvIExDRCBkZWNpbWF0ZWQKLSAgICogICBiaXRtYXBzLCBsaWtlIHRoZSBvbmVzIHVzZWQgd2hlbiBjYWxsaW5nIEBGVF9SZW5kZXJfR2x5cGggd2l0aAotICAgKiAgIEBGVF9SRU5ERVJfTU9ERV9MQ0Qgb3IgQEZUX1JFTkRFUl9NT0RFX0xDRF9WLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbGlicmFyeSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5IGluc3RhbmNlLgotICAgKgotICAgKiAgIGZpbHRlciA6OgotICAgKiAgICAgVGhlIGZpbHRlciB0eXBlLgotICAgKgotICAgKiAgICAgWW91IGNhbiB1c2UgQEZUX0xDRF9GSUxURVJfTk9ORSBoZXJlIHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLCBvcgotICAgKiAgICAgQEZUX0xDRF9GSUxURVJfREVGQVVMVCB0byB1c2UgYSBkZWZhdWx0IGZpbHRlciB0aGF0IHNob3VsZCB3b3JrCi0gICAqICAgICB3ZWxsIG9uIG1vc3QgTENEIHNjcmVlbnMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmZWF0dXJlIGlzIGFsd2F5cyBkaXNhYmxlZCBieSBkZWZhdWx0LiAgQ2xpZW50cyBtdXN0IG1ha2UgYW4KLSAgICogICBleHBsaWNpdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gd2l0aCBhIGBmaWx0ZXInIHZhbHVlIG90aGVyIHRoYW4KLSAgICogICBARlRfTENEX0ZJTFRFUl9OT05FIGluIG9yZGVyIHRvIGVuYWJsZSBpdC4KLSAgICoKLSAgICogICBEdWUgdG8gKlBBVEVOVFMqIGNvdmVyaW5nIHN1YnBpeGVsIHJlbmRlcmluZywgdGhpcyBmdW5jdGlvbiBkb2Vzbid0Ci0gICAqICAgZG8gYW55dGhpbmcgZXhjZXB0IHJldHVybmluZyBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgdGhlCi0gICAqICAgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyBpcyBub3QKLSAgICogICBkZWZpbmVkIGluIHlvdXIgYnVpbGQgb2YgdGhlIGxpYnJhcnksIHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIGFsbAotICAgKiAgIGRlZmF1bHQgYnVpbGRzIG9mIEZyZWVUeXBlLgotICAgKgotICAgKiAgIFRoZSBmaWx0ZXIgYWZmZWN0cyBnbHlwaCBiaXRtYXBzIHJlbmRlcmVkIHRocm91Z2ggQEZUX1JlbmRlcl9HbHlwaCwKLSAgICogICBARlRfT3V0bGluZV9HZXRfQml0bWFwLCBARlRfTG9hZF9HbHlwaCwgYW5kIEBGVF9Mb2FkX0NoYXIuCi0gICAqCi0gICAqICAgSXQgZG9lcyBfbm90XyBhZmZlY3QgdGhlIG91dHB1dCBvZiBARlRfT3V0bGluZV9SZW5kZXIgYW5kCi0gICAqICAgQEZUX091dGxpbmVfR2V0X0JpdG1hcC4KLSAgICoKLSAgICogICBJZiB0aGlzIGZlYXR1cmUgaXMgYWN0aXZhdGVkLCB0aGUgZGltZW5zaW9ucyBvZiBMQ0QgZ2x5cGggYml0bWFwcyBhcmUKLSAgICogICBlaXRoZXIgbGFyZ2VyIG9yIHRhbGxlciB0aGFuIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqICAgb3V0bGluZSB3aXRoIHJlZ2FyZHMgdG8gdGhlIHBpeGVsIGdyaWQuICBGb3IgZXhhbXBsZSwgZm9yCi0gICAqICAgQEZUX1JFTkRFUl9NT0RFX0xDRCwgdGhlIGZpbHRlciBhZGRzIHVwIHRvIDMgcGl4ZWxzIHRvIHRoZSBsZWZ0LCBhbmQKLSAgICogICB1cCB0byAzIHBpeGVscyB0byB0aGUgcmlnaHQuCi0gICAqCi0gICAqICAgVGhlIGJpdG1hcCBvZmZzZXQgdmFsdWVzIGFyZSBhZGp1c3RlZCBjb3JyZWN0bHksIHNvIGNsaWVudHMgc2hvdWxkbid0Ci0gICAqICAgbmVlZCB0byBtb2RpZnkgdGhlaXIgbGF5b3V0IGFuZCBnbHlwaCBwb3NpdGlvbmluZyBjb2RlIHdoZW4gZW5hYmxpbmcKLSAgICogICB0aGUgZmlsdGVyLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgMi4zLjAKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGNkRmlsdGVyICBmaWx0ZXIgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRfTENEX0ZJTFRFUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRsaXN0LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzIyM2VlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRsaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRsaXN0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEdlbmVyaWMgbGlzdCBzdXBwb3J0IGZvciBGcmVlVHlwZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDMsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyByZWxhdGl2ZSB0byBsaXN0IHByb2Nlc3NpbmcuICBJdHMgICAgICovCi0gIC8qICBkYXRhIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gYGZyZWV0eXBlLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUTElTVF9IX18KLSNkZWZpbmUgX19GVExJU1RfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdF9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGlzdCBQcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2ltcGxlIG1hbmFnZW1lbnQgb2YgbGlzdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHZhcmlvdXMgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBsaXN0ICAgICAgICAgICovCi0gIC8qICAgIHByb2Nlc3NpbmcgdXNpbmcgZG91Ymx5LWxpbmtlZCBub2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0Tm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3ROb2RlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9BZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSW5zZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0ZpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfVXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0l0ZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9JdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRmluYWxpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0Rlc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9GaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluZHMgdGhlIGxpc3Qgbm9kZSBmb3IgYSBnaXZlbiBsaXN0ZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGEgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGxpc3RlZCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpc3Qgbm9kZS4gIE5VTEwgaWYgaXQgd2Fzbid0IGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9MaXN0Tm9kZSApCi0gIEZUX0xpc3RfRmluZCggRlRfTGlzdCAgbGlzdCwKLSAgICAgICAgICAgICAgICB2b2lkKiAgICBkYXRhICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcHBlbmRzIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byBhcHBlbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9MaXN0X0FkZCggRlRfTGlzdCAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9JbnNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zZXJ0cyBhbiBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIGEgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gaW5zZXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTGlzdF9JbnNlcnQoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbW92ZXMgYSBub2RlIGZyb20gYSBsaXN0LiAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgICAqLwotICAvKiAgICB0aGUgbm9kZSBpcyBpbiB0aGUgbGlzdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIHJlbW92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpc3RfUmVtb3ZlKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb3ZlcyBhIG5vZGUgdG8gdGhlIGhlYWQvdG9wIG9mIGEgbGlzdC4gIFVzZWQgdG8gbWFpbnRhaW4gTFJVICAgICAgKi8KLSAgLyogICAgbGlzdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gbW92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTGlzdF9VcCggRlRfTGlzdCAgICAgIGxpc3QsCi0gICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBGVF9MaXN0IGl0ZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0IHBhcnNlICAgKi8KLSAgLyogICAgYnkgQEZUX0xpc3RfSXRlcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSA6OiBUaGUgY3VycmVudCBpdGVyYXRpb24gbGlzdCBub2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyIDo6IEEgdHlwZWxlc3MgcG9pbnRlciBwYXNzZWQgdG8gQEZUX0xpc3RfSXRlcmF0ZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICBDYW4gYmUgdXNlZCB0byBwb2ludCB0byB0aGUgaXRlcmF0aW9uJ3Mgc3RhdGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfTGlzdF9JdGVyYXRvcikoIEZUX0xpc3ROb2RlICBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdXNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9JdGVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2VzIGEgbGlzdCBhbmQgY2FsbHMgYSBnaXZlbiBpdGVyYXRvciBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQuICovCi0gIC8qICAgIE5vdGUgdGhhdCBwYXJzaW5nIGlzIHN0b3BwZWQgYXMgc29vbiBhcyBvbmUgb2YgdGhlIGl0ZXJhdG9yIGNhbGxzICAqLwotICAvKiAgICByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0ICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaXRlcmF0b3IgOjogQW4gaXRlcmF0b3IgZnVuY3Rpb24sIGNhbGxlZCBvbiBlYWNoIG5vZGUgb2YgdGhlIGxpc3QuICovCi0gIC8qICAgIHVzZXIgICAgIDo6IEEgdXNlci1zdXBwbGllZCBmaWVsZCB3aGljaCBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICBhcmd1bWVudCB0byB0aGUgaXRlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IChhIEZyZWVUeXBlIGVycm9yIGNvZGUpIG9mIHRoZSBsYXN0IGl0ZXJhdG9yIGNhbGwuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9MaXN0X0l0ZXJhdGUoIEZUX0xpc3QgICAgICAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgRlRfTGlzdF9JdGVyYXRvciAgaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9EZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gQEZUX0xpc3QgaXRlcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGR1cmluZyBhIGxpc3QgICAgICAgICovCi0gIC8qICAgIGZpbmFsaXphdGlvbiBieSBARlRfTGlzdF9GaW5hbGl6ZSB0byBkZXN0cm95IGFsbCBlbGVtZW50cyBpbiBhICAgICAqLwotICAvKiAgICBnaXZlbiBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzeXN0ZW0gOjogVGhlIGN1cnJlbnQgc3lzdGVtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGEgICA6OiBUaGUgY3VycmVudCBvYmplY3QgdG8gZGVzdHJveS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciBwYXNzZWQgdG8gQEZUX0xpc3RfSXRlcmF0ZS4gIEl0IGNhbiAgICovCi0gIC8qICAgICAgICAgICAgICBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZSBpdGVyYXRpb24ncyBzdGF0ZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfTGlzdF9EZXN0cnVjdG9yKSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgdXNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9GaW5hbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFzIHdlbGwgYXMgdGhlIGxpc3QgaXRzZWxmLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZXN0cm95IDo6IEEgbGlzdCBkZXN0cnVjdG9yIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGVhY2ggZWxlbWVudCAgKi8KLSAgLyogICAgICAgICAgICAgICBvZiB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgIDo6IFRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3Qgd2hpY2ggaGFuZGxlcyBkZWFsbG9jYXRpb24uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgOjogQSB1c2VyLXN1cHBsaWVkIGZpZWxkIHdoaWNoIGlzIHBhc3NlZCBhcyB0aGUgbGFzdCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHRoZSBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpc3RfRmluYWxpemUoIEZUX0xpc3QgICAgICAgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgRlRfTGlzdF9EZXN0cnVjdG9yICBkZXN0cm95LAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICB1c2VyICk7Ci0KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRMSVNUX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGx6dy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGx6dy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTUwNjUzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bHp3LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMWlctY29tcHJlc3NlZCBzdHJlYW0gc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNCwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUTFpXX0hfXwotI2RlZmluZSBfX0ZUTFpXX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbHp3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTFpXIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNpbmcgTFpXLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBMWlctc3BlY2lmaWMgZnVuY3Rpb25zLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgIEZUX1N0cmVhbV9PcGVuTFpXCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBMWlctY29tcHJlc3NlZCBmb250IGZpbGVzLiAgVGhpcyBpcwotICAqICAgbWFpbmx5IHVzZWQgdG8gc3VwcG9ydCB0aGUgY29tcHJlc3NlZCBgKi5wY2YuWicgZm9udHMgdGhhdCBjb21lCi0gICogICB3aXRoIFhGcmVlODYuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBzdHJlYW0gOjogVGhlIHRhcmdldCBlbWJlZGRpbmcgc3RyZWFtLgotICAqCi0gICogICBzb3VyY2UgOjogVGhlIHNvdXJjZSBzdHJlYW0uCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhlIHNvdXJjZSBzdHJlYW0gbXVzdCBiZSBvcGVuZWQgX2JlZm9yZV8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICAqCi0gICogICBDYWxsaW5nIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgbmV3IHN0cmVhbSB3aWxsCi0gICogICAqbm90KiBjYWxsIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLiAgTm9uZSBvZiB0aGUgc3RyZWFtCi0gICogICBvYmplY3RzIHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlIGhlYXAuCi0gICoKLSAgKiAgIFRoZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYyBhbmQgcmVzZXRzIHRoZSBkZWNvbXByZXNzaW9uCi0gICogICBwcm9jZXNzIGVhY2ggdGltZSBzZWVraW5nIGJhY2t3YXJkcyBpcyBuZWVkZWQgd2l0aGluIHRoZSBzdHJlYW0KLSAgKgotICAqICAgSW4gY2VydGFpbiBidWlsZHMgb2YgdGhlIGxpYnJhcnksIExaVyBjb21wcmVzc2lvbiByZWNvZ25pdGlvbiBpcwotICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KLSAgKiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBubyBmb250IGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSByYXcKLSAgKiAgIGNvbXByZXNzZWQgZmlsZSwgdGhlIGxpYnJhcnkgd2lsbCB0cnkgdG8gb3BlbiBhIExaVyBzdHJlYW0gZnJvbSBpdAotICAqICAgYW5kIHJlLW9wZW4gdGhlIGZhY2Ugd2l0aCBpdC4KLSAgKgotICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB5b3VyIGJ1aWxkCi0gICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggTFpXIHN1cHBvcnQuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3BlbkxaVyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHNvdXJjZSApOwotCi0gLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUTFpXX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzUyZDEzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1hYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRkaXRpb25hbCBNYWMtc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwNCwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEp1c3QgdmFuIFJvc3N1bSwgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URTogSW5jbHVkZSB0aGlzIGZpbGUgYWZ0ZXIgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+IGFuZCBhZnRlciBhbnkgICAgICAgKi8KLS8qICAgICAgIE1hYy1zcGVjaWZpYyBoZWFkZXJzIChiZWNhdXNlIHRoaXMgaGVhZGVyIHVzZXMgTWFjIHR5cGVzIHN1Y2ggYXMgICovCi0vKiAgICAgICBIYW5kbGUsIEZTU3BlYywgRlNSZWYsIGV0Yy4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUTUFDX0hfXwotI2RlZmluZSBfX0ZUTUFDX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLS8qIGdjYy0zLjQuMSBhbmQgbGF0ZXIgY2FuIHdhcm4gYWJvdXQgZnVuY3Rpb25zIHRhZ2dlZCBhcyBkZXByZWNhdGVkICovCi0jaWZuZGVmIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKLSAgICAoKF9fR05VQ19fID49IDQpIHx8ICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpKSkKLSNkZWZpbmUgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEUgIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKQotI2Vsc2UKLSNkZWZpbmUgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEUKLSNlbmRpZgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYWNfc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYWMgU3BlY2lmaWMgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGF2YWlsYWJsZSBvbiB0aGUgTWFjaW50b3NoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBGcmVlVHlwZSBpcyAgICAgICAgKi8KLSAgLyogICAgY29tcGlsZWQgb24gYSBNYWNpbnRvc2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19GYWNlX0Zyb21fRk9ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgRk9ORCByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbmQgICAgICAgOjogQSBGT05EIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBPbmx5IHN1cHBvcnRlZCBmb3IgdGhlIC0xIGBzYW5pdHkgY2hlY2snIHNwZWNpYWwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIEBGVF9GYWNlIG9iamVjdHMgZnJvbSBmb250cyAgICAqLwotICAvKiAgICB0aGF0IGFyZSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBhcyBmb2xsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGZvbmQgPSBHZXRSZXNvdXJjZSggJ0ZPTkQnLCBmb250TmFtZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fRk9ORCggbGlicmFyeSwgZm9uZCwgMCwgJmZhY2UgKTsgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlX0Zyb21fRk9ORCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgICAgICBmb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAqYWZhY2UgKQotICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhbiBGU1NwZWMgZm9yIHRoZSBkaXNrIGZpbGUgY29udGFpbmluZyB0aGUgbmFtZWQgZm9udC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnROYW1lICAgOjogTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgKGUuZy4sIFRpbWVzIE5ldyBSb21hbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEJvbGQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRoU3BlYyAgIDo6IEZTU3BlYyB0byB0aGUgZmlsZS4gIEZvciBwYXNzaW5nIHRvICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IEluZGV4IG9mIHRoZSBmYWNlLiAgRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjKiAgICAgIHBhdGhTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYW4gRlNTcGVjIGZvciB0aGUgZGlzayBmaWxlIGNvbnRhaW5pbmcgdGhlIG5hbWVkIGZvbnQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb250TmFtZSAgIDo6IE1hYyBPUyBuYW1lIG9mIHRoZSBmb250IGluIEFUUyBmcmFtZXdvcmsuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRoU3BlYyAgIDo6IEZTU3BlYyB0byB0aGUgZmlsZS4gRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IEluZGV4IG9mIHRoZSBmYWNlLiBGb3IgcGFzc2luZyB0byAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWMqICAgICAgcGF0aFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0RmlsZVBhdGhfRnJvbV9NYWNfQVRTX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGEgcGF0aG5hbWUgb2YgdGhlIGRpc2sgZmlsZSBhbmQgZmFjZSBpbmRleCBmb3IgZ2l2ZW4gZm9udCAgICovCi0gIC8qICAgIG5hbWUgd2hpY2ggaXMgaGFuZGxlZCBieSBBVFMgZnJhbWV3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnROYW1lICAgIDo6IE1hYyBPUyBuYW1lIG9mIHRoZSBmb250IGluIEFUUyBmcmFtZXdvcmsuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGggICAgICAgIDo6IEJ1ZmZlciB0byBzdG9yZSBwYXRobmFtZSBvZiB0aGUgZmlsZS4gIEZvciBwYXNzaW5nICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0byBARlRfTmV3X0ZhY2UuICBUaGUgY2xpZW50IG11c3QgYWxsb2NhdGUgdGhpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYnVmZmVyIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhQYXRoU2l6ZSA6OiBMZW5ndGhzIG9mIHRoZSBidWZmZXIgYHBhdGgnIHRoYXQgY2xpZW50IGFsbG9jYXRlZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggIDo6IEluZGV4IG9mIHRoZSBmYWNlLiAgRm9yIHBhc3NpbmcgdG8gQEZUX05ld19GYWNlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldEZpbGVQYXRoX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50OCogICAgICAgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICBtYXhQYXRoU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgZ2l2ZW4gcmVzb3VyY2UgYW5kIHR5cGVmYWNlIGluZGV4ICAqLwotICAvKiAgICB1c2luZyBhbiBGU1NwZWMgdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzcGVjICAgICAgIDo6IEZTU3BlYyB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBmYWNlIHdpdGhpbiB0aGUgcmVzb3VyY2UuICBUaGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGZpcnN0IGZhY2UgaGFzIGluZGV4IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyBpcyBpZGVudGljYWwgdG8gQEZUX05ld19GYWNlIGV4Y2VwdCAgICAgICAqLwotICAvKiAgICBpdCBhY2NlcHRzIGFuIEZTU3BlYyBpbnN0ZWFkIG9mIGEgcGF0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTU3BlYyAgKnNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAqYWZhY2UgKQotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBhbmQgdHlwZWZhY2UgaW5kZXggICovCi0gIC8qICAgIHVzaW5nIGFuIEZTUmVmIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwZWMgICAgICAgOjogRlNSZWYgdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2l0aGluIHRoZSByZXNvdXJjZS4gIFRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmlyc3QgZmFjZSBoYXMgaW5kZXggMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX05ld19GYWNlX0Zyb21fRlNSZWYgaXMgaWRlbnRpY2FsIHRvIEBGVF9OZXdfRmFjZSBleGNlcHQgICAgICAgICovCi0gIC8qICAgIGl0IGFjY2VwdHMgYW4gRlNSZWYgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlX0Zyb21fRlNSZWYoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNSZWYgICpyZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICphZmFjZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19GVE1BQ19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdG1tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Y2NmZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdG1tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIE11bHRpcGxlIE1hc3RlciBmb250IGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDMsIDIwMDQsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRNTV9IX18KLSNkZWZpbmUgX19GVE1NX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfVFlQRTFfVEFCTEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG11bHRpcGxlX21hc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE11bHRpcGxlIE1hc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyB0byBtYW5hZ2UgTXVsdGlwbGUgTWFzdGVycyBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmb2xsb3dpbmcgdHlwZXMgYW5kIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBtYW5hZ2UgTXVsdGlwbGUgICAgICAqLwotICAvKiAgICBNYXN0ZXIgZm9udHMsIGkuZS4sIHRoZSBzZWxlY3Rpb24gb2Ygc3BlY2lmaWMgZGVzaWduIGluc3RhbmNlcyBieSAgKi8KLSAgLyogICAgc2V0dGluZyBkZXNpZ24gYXhpcyBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZW9yZ2UgV2lsbGlhbXMgaGFzIGV4dGVuZGVkIHRoaXMgaW50ZXJmYWNlIHRvIG1ha2UgaXQgd29yayB3aXRoICAgKi8KLSAgLyogICAgYm90aCBUeXBlIDEgTXVsdGlwbGUgTWFzdGVycyBmb250cyBhbmQgR1ggZGlzdG9ydGFibGUgKHZhcikgICAgICAgICovCi0gIC8qICAgIGZvbnRzLiAgU29tZSBvZiB0aGVzZSByb3V0aW5lcyBvbmx5IHdvcmsgd2l0aCBNTSBmb250cywgb3RoZXJzICAgICAqLwotICAvKiAgICB3aWxsIHdvcmsgd2l0aCBib3RoIHR5cGVzLiAgVGhleSBhcmUgc2ltaWxhciBlbm91Z2ggdGhhdCBhICAgICAgICAgKi8KLSAgLyogICAgY29uc2lzdGVudCBpbnRlcmZhY2UgbWFrZXMgc2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01NX0F4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgZ2l2ZW4gYXhpcyBpbiBkZXNpZ24gc3BhY2UgZm9yICAqLwotICAvKiAgICBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNhbid0IGJlIHVzZWQgZm9yIEdYIHZhciBmb250cy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWUgICAgOjogVGhlIGF4aXMncyBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluaW11bSA6OiBUaGUgYXhpcydzIG1pbmltdW0gZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhpbXVtIDo6IFRoZSBheGlzJ3MgbWF4aW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NTV9BeGlzXwotICB7Ci0gICAgRlRfU3RyaW5nKiAgbmFtZTsKLSAgICBGVF9Mb25nICAgICBtaW5pbXVtOwotICAgIEZUX0xvbmcgICAgIG1heGltdW07Ci0KLSAgfSBGVF9NTV9BeGlzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTXVsdGlfTWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgYXhlcyBhbmQgc3BhY2Ugb2YgYSBNdWx0aXBsZSBNYXN0ZXJzICovCi0gIC8qICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY2FuJ3QgYmUgdXNlZCBmb3IgR1ggdmFyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2F4aXMgICAgOjogTnVtYmVyIG9mIGF4ZXMuICBDYW5ub3QgZXhjZWVkIDQuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZGVzaWducyA6OiBOdW1iZXIgb2YgZGVzaWduczsgc2hvdWxkIGJlIG5vcm1hbGx5IDJebnVtX2F4aXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZXZlbiB0aG91Z2ggdGhlIFR5cGUgMSBzcGVjaWZpY2F0aW9uIHN0cmFuZ2VseSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGFsbG93cyBmb3IgaW50ZXJtZWRpYXRlIGRlc2lnbnMgdG8gYmUgcHJlc2VudC4gVGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICBudW1iZXIgY2Fubm90IGV4Y2VlZCAxNi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF4aXMgICAgICAgIDo6IEEgdGFibGUgb2YgYXhpcyBkZXNjcmlwdG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX011bHRpX01hc3Rlcl8KLSAgewotICAgIEZUX1VJbnQgICAgIG51bV9heGlzOwotICAgIEZUX1VJbnQgICAgIG51bV9kZXNpZ25zOwotICAgIEZUX01NX0F4aXMgIGF4aXNbVDFfTUFYX01NX0FYSVNdOwotCi0gIH0gRlRfTXVsdGlfTWFzdGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmFyX0F4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBnaXZlbiBheGlzIGluIGRlc2lnbiBzcGFjZSBmb3IgICovCi0gIC8qICAgIE11bHRpcGxlIE1hc3RlcnMgYW5kIEdYIHZhciBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWUgICAgOjogVGhlIGF4aXMncyBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIE5vdCBhbHdheXMgbWVhbmluZ2Z1bCBmb3IgR1guICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbmltdW0gOjogVGhlIGF4aXMncyBtaW5pbXVtIGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVmICAgICA6OiBUaGUgYXhpcydzIGRlZmF1bHQgZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgRnJlZVR5cGUgY29tcHV0ZXMgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlcyBmb3IgTU07IGl0ICAqLwotICAvKiAgICAgICAgICAgICAgIGlzIHRoZW4gYW4gaW50ZWdlciB2YWx1ZSwgbm90IGluIDE2LjE2IGZvcm1hdC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heGltdW0gOjogVGhlIGF4aXMncyBtYXhpbXVtIGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgICA6OiBUaGUgYXhpcydzIHRhZyAodGhlIEdYIGVxdWl2YWxlbnQgdG8gYG5hbWUnKS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgRnJlZVR5cGUgcHJvdmlkZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIE1NIGlmIHBvc3NpYmxlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaWQgICA6OiBUaGUgZW50cnkgaW4gYG5hbWUnIHRhYmxlIChhbm90aGVyIEdYIHZlcnNpb24gb2YgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgYG5hbWUnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIE5vdCBtZWFuaW5nZnVsIGZvciBNTS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9WYXJfQXhpc18KLSAgewotICAgIEZUX1N0cmluZyogIG5hbWU7Ci0KLSAgICBGVF9GaXhlZCAgICBtaW5pbXVtOwotICAgIEZUX0ZpeGVkICAgIGRlZjsKLSAgICBGVF9GaXhlZCAgICBtYXhpbXVtOwotCi0gICAgRlRfVUxvbmcgICAgdGFnOwotICAgIEZUX1VJbnQgICAgIHN0cmlkOwotCi0gIH0gRlRfVmFyX0F4aXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WYXJfTmFtZWRfU3R5bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIG5hbWVkIHN0eWxlIGluIGEgR1ggdmFyIGZvbnQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNhbid0IGJlIHVzZWQgZm9yIE1NIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyA6OiBUaGUgZGVzaWduIGNvb3JkaW5hdGVzIGZvciB0aGlzIHN0eWxlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgVGhpcyBpcyBhbiBhcnJheSB3aXRoIG9uZSBlbnRyeSBmb3IgZWFjaCBheGlzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlkICA6OiBUaGUgZW50cnkgaW4gYG5hbWUnIHRhYmxlIGlkZW50aWZ5aW5nIHRoaXMgc3R5bGUuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Zhcl9OYW1lZF9TdHlsZV8KLSAgewotICAgIEZUX0ZpeGVkKiAgY29vcmRzOwotICAgIEZUX1VJbnQgICAgc3RyaWQ7Ci0KLSAgfSBGVF9WYXJfTmFtZWRfU3R5bGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NTV9WYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBheGVzIGFuZCBzcGFjZSBvZiBhIE11bHRpcGxlIE1hc3RlcnMgKi8KLSAgLyogICAgb3IgR1ggdmFyIGRpc3RvcnRhYmxlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTb21lIGZpZWxkcyBhcmUgc3BlY2lmaWMgdG8gb25lIGZvcm1hdCBhbmQgbm90IHRvIHRoZSBvdGhlci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fYXhpcyAgICAgICAgOjogVGhlIG51bWJlciBvZiBheGVzLiAgVGhlIG1heGltdW0gdmFsdWUgaXMgNCBmb3IgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIE1NOyBubyBsaW1pdCBpbiBHWC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZGVzaWducyAgICAgOjogVGhlIG51bWJlciBvZiBkZXNpZ25zOyBzaG91bGQgYmUgbm9ybWFsbHkgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIDJebnVtX2F4aXMgZm9yIE1NIGZvbnRzLiAgTm90IG1lYW5pbmdmdWwgZm9yIEdYICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUgZXZlcnkgZ2x5cGggY291bGQgaGF2ZSBhIGRpZmZlcmVudCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGRlc2lnbnMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9uYW1lZHN0eWxlcyA6OiBUaGUgbnVtYmVyIG9mIG5hbWVkIHN0eWxlczsgb25seSBtZWFuaW5nZnVsIGZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgR1ggd2hpY2ggYWxsb3dzIGNlcnRhaW4gZGVzaWduIGNvb3JkaW5hdGVzIHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYSBzdHJpbmcgSUQgKGluIHRoZSBgbmFtZScgdGFibGUpICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlbS4gIFRoZSBmb250IGNhbiB0ZWxsIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgdXNlciB0aGF0LCBmb3IgZXhhbXBsZSwgV2VpZ2h0PTEuNSBpcyBgQm9sZCcuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF4aXMgICAgICAgICAgICA6OiBBIHRhYmxlIG9mIGF4aXMgZGVzY3JpcHRvcnMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgR1ggZm9udHMgY29udGFpbiBzbGlnaHRseSBtb3JlIGRhdGEgdGhhbiBNTS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWVkc3R5bGVzICAgICA6OiBBIHRhYmxlIG9mIG5hbWVkIHN0eWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgT25seSBtZWFuaW5nZnVsIHdpdGggR1guICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NTV9WYXJfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICBudW1fYXhpczsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICBudW1fZGVzaWduczsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICBudW1fbmFtZWRzdHlsZXM7Ci0gICAgRlRfVmFyX0F4aXMqICAgICAgICAgYXhpczsKLSAgICBGVF9WYXJfTmFtZWRfU3R5bGUqICBuYW1lZHN0eWxlOwotCi0gIH0gRlRfTU1fVmFyOwotCi0KLSAgLyogKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9NdWx0aV9NYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlcyB0aGUgTXVsdGlwbGUgTWFzdGVyIGRlc2NyaXB0b3Igb2YgYSBnaXZlbiBmb250LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4ndCBiZSB1c2VkIHdpdGggR1ggZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1hc3RlciA6OiBUaGUgTXVsdGlwbGUgTWFzdGVycyBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X011bHRpX01hc3RlciggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsdGlfTWFzdGVyICAqYW1hc3RlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01NX1ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmVzIHRoZSBNdWx0aXBsZSBNYXN0ZXIvR1ggdmFyIGRlc2NyaXB0b3Igb2YgYSBnaXZlbiBmb250LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1hc3RlciA6OiBUaGUgTXVsdGlwbGUgTWFzdGVycyBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgQWxsb2NhdGVzIGEgZGF0YSBzdHJ1Y3R1cmUsIHdoaWNoIHRoZSB1c2VyIG11c3QgZnJlZSAgICAqLwotICAvKiAgICAgICAgICAgICAgIChhIHNpbmdsZSBjYWxsIHRvIEZUX0ZSRUUgd2lsbCBkbyBpdCkuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfTU1fVmFyKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfTU1fVmFyKiAgKmFtYXN0ZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLCBjaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduICAgICAqLwotICAvKiAgICB0aHJvdWdoIGRlc2lnbiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgdXNlZCB3aXRoIEdYIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgKG11c3QgYmUgZXF1YWwgdG8gICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYXhlcyBpbiB0aGUgZm9udCkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyAgICAgOjogQW4gYXJyYXkgb2YgZGVzaWduIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIE11bHRpcGxlIE1hc3RlciBvciBHWCBWYXIgZm9udHMsIGNob29zZSBhbiBpbnRlcnBvbGF0ZWQgZm9udCAgICovCi0gIC8qICAgIGRlc2lnbiB0aHJvdWdoIGRlc2lnbiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgKG11c3QgYmUgZXF1YWwgdG8gICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYXhlcyBpbiB0aGUgZm9udCkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyAgICAgOjogQW4gYXJyYXkgb2YgZGVzaWduIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIE11bHRpcGxlIE1hc3RlcnMgYW5kIEdYIHZhciBmb250cywgY2hvb3NlIGFuIGludGVycG9sYXRlZCBmb250ICovCi0gIC8qICAgIGRlc2lnbiB0aHJvdWdoIG5vcm1hbGl6ZWQgYmxlbmQgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgKG11c3QgYmUgZXF1YWwgdG8gICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYXhlcyBpbiB0aGUgZm9udCkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyAgICAgOjogVGhlIGRlc2lnbiBjb29yZGluYXRlcyBhcnJheSAoZWFjaCBlbGVtZW50IG11c3QgYmUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGJldHdlZW4gMCBhbmQgMS4wKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgYW5vdGhlciBuYW1lIG9mIEBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUTU1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODEzZWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bW9kYXBpLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA2LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUTU9EQVBJX0hfXwotI2RlZmluZSBfX0ZUTU9EQVBJX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vZHVsZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyB0byBhZGQsIHVwZ3JhZGUsIGFuZCByZW1vdmUgbW9kdWxlcyBmcm9tIEZyZWVUeXBlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBtYW5hZ2UgbW9kdWxlcyB3aXRoaW4gRnJlZVR5cGUuICAqLwotICAvKiAgICBNb2R1bGVzIGNhbiBiZSBhZGRlZCwgdXBncmFkZWQsIGFuZCByZW1vdmVkIGF0IHJ1bnRpbWUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogbW9kdWxlIGJpdCBmbGFncyAqLwotI2RlZmluZSBGVF9NT0RVTEVfRk9OVF9EUklWRVIgICAgICAgICAxICAvKiB0aGlzIG1vZHVsZSBpcyBhIGZvbnQgZHJpdmVyICAqLwotI2RlZmluZSBGVF9NT0RVTEVfUkVOREVSRVIgICAgICAgICAgICAyICAvKiB0aGlzIG1vZHVsZSBpcyBhIHJlbmRlcmVyICAgICAqLwotI2RlZmluZSBGVF9NT0RVTEVfSElOVEVSICAgICAgICAgICAgICA0ICAvKiB0aGlzIG1vZHVsZSBpcyBhIGdseXBoIGhpbnRlciAqLwotI2RlZmluZSBGVF9NT0RVTEVfU1RZTEVSICAgICAgICAgICAgICA4ICAvKiB0aGlzIG1vZHVsZSBpcyBhIHN0eWxlciAgICAgICAqLwotCi0jZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUgICAgIDB4MTAwICAgLyogdGhlIGRyaXZlciBzdXBwb3J0cyAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGFibGUgZm9udHMgICAgICAgICAgICovCi0jZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfTk9fT1VUTElORVMgIDB4MjAwICAgLyogdGhlIGRyaXZlciBkb2VzIG5vdCAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCB2ZWN0b3Igb3V0bGluZXMgICovCi0jZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiAgIDB4NDAwICAgLyogdGhlIGRyaXZlciBwcm92aWRlcyBpdHMgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3duIGhpbnRlciAgICAgICAgICAgICAgICovCi0KLQotICAvKiBkZXByZWNhdGVkIHZhbHVlcyAqLwotI2RlZmluZSBmdF9tb2R1bGVfZm9udF9kcml2ZXIgICAgICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIKLSNkZWZpbmUgZnRfbW9kdWxlX3JlbmRlcmVyICAgICAgICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSCi0jZGVmaW5lIGZ0X21vZHVsZV9oaW50ZXIgICAgICAgICAgICAgIEZUX01PRFVMRV9ISU5URVIKLSNkZWZpbmUgZnRfbW9kdWxlX3N0eWxlciAgICAgICAgICAgICAgRlRfTU9EVUxFX1NUWUxFUgotCi0jZGVmaW5lIGZ0X21vZHVsZV9kcml2ZXJfc2NhbGFibGUgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUKLSNkZWZpbmUgZnRfbW9kdWxlX2RyaXZlcl9ub19vdXRsaW5lcyAgRlRfTU9EVUxFX0RSSVZFUl9OT19PVVRMSU5FUwotI2RlZmluZSBmdF9tb2R1bGVfZHJpdmVyX2hhc19oaW50ZXIgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIKLQotCi0gIHR5cGVkZWYgRlRfUG9pbnRlciAgRlRfTW9kdWxlX0ludGVyZmFjZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIChub3QgY3JlYXRlKSBhIG5ldyBtb2R1bGUgb2JqZWN0LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSA6OiBUaGUgbW9kdWxlIHRvIGluaXRpYWxpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX01vZHVsZV9Db25zdHJ1Y3RvcikoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZmluYWxpemUgKG5vdCBkZXN0cm95KSBhIGdpdmVuIG1vZHVsZSBvYmplY3QuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgOjogVGhlIG1vZHVsZSB0byBmaW5hbGl6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX01vZHVsZV9EZXN0cnVjdG9yKSggRlRfTW9kdWxlICBtb2R1bGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBxdWVyeSBhIGdpdmVuIG1vZHVsZSBmb3IgYSBzcGVjaWZpYyBpbnRlcmZhY2UuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSA6OiBUaGUgbW9kdWxlIHRvIGZpbmFsaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZSA6OiAgIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgaW4gdGhlIG1vZHVsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX01vZHVsZV9JbnRlcmZhY2UKLSAgKCpGVF9Nb2R1bGVfUmVxdWVzdGVyKSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG5hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtb2R1bGUgY2xhc3MgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9mbGFncyAgICA6OiBCaXQgZmxhZ3MgZGVzY3JpYmluZyB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX3NpemUgICAgIDo6IFRoZSBzaXplIG9mIG9uZSBtb2R1bGUgb2JqZWN0L2luc3RhbmNlIGluICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX25hbWUgICAgIDo6IFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfdmVyc2lvbiAgOjogVGhlIHZlcnNpb24sIGFzIGEgMTYuMTYgZml4ZWQgbnVtYmVyICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIChtYWpvci5taW5vcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfcmVxdWlyZXMgOjogVGhlIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhpcyBtb2R1bGUgcmVxdWlyZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGFzIGEgMTYuMTYgZml4ZWQgbnVtYmVyIChtYWpvci5taW5vcikuICBTdGFydHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhdCB2ZXJzaW9uIDIuMCwgaS5lLiwgMHgyMDAwMC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX2luaXQgICAgIDo6IFRoZSBpbml0aWFsaXppbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfZG9uZSAgICAgOjogVGhlIGZpbmFsaXppbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9pbnRlcmZhY2UgICA6OiBUaGUgaW50ZXJmYWNlIHJlcXVlc3RpbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01vZHVsZV9DbGFzc18KLSAgewotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgbW9kdWxlX2ZsYWdzOwotICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgbW9kdWxlX3NpemU7Ci0gICAgY29uc3QgRlRfU3RyaW5nKiAgICAgICBtb2R1bGVfbmFtZTsKLSAgICBGVF9GaXhlZCAgICAgICAgICAgICAgIG1vZHVsZV92ZXJzaW9uOwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgICAgbW9kdWxlX3JlcXVpcmVzOwotCi0gICAgY29uc3Qgdm9pZCogICAgICAgICAgICBtb2R1bGVfaW50ZXJmYWNlOwotCi0gICAgRlRfTW9kdWxlX0NvbnN0cnVjdG9yICBtb2R1bGVfaW5pdDsKLSAgICBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgIG1vZHVsZV9kb25lOwotICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgZ2V0X2ludGVyZmFjZTsKLQotICB9IEZUX01vZHVsZV9DbGFzczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0FkZF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkZHMgYSBuZXcgbW9kdWxlIHRvIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIGNsYXNzIGRlc2NyaXB0b3IgZm9yIHRoZSBtb2R1bGUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBtb2R1bGUgYWxyZWFkeSBleGlzdHMgYnkgdGhhdCBuYW1lLCAqLwotICAvKiAgICBvciBpZiB0aGUgbW9kdWxlIHJlcXVpcmVzIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGlzIHRvbyBncmVhdC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9BZGRfTW9kdWxlKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluZHMgYSBtb2R1bGUgYnkgaXRzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfbmFtZSA6OiBUaGUgbW9kdWxlJ3MgbmFtZSAoYXMgYW4gQVNDSUkgc3RyaW5nKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIG1vZHVsZSBoYW5kbGUuICAwIGlmIG5vbmUgd2FzIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSdzIGludGVybmFsIG1vZHVsZXMgYXJlbid0IGRvY3VtZW50ZWQgdmVyeSB3ZWxsLCBhbmQgeW91ICAgKi8KLSAgLyogICAgc2hvdWxkIGxvb2sgdXAgdGhlIHNvdXJjZSBjb2RlIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX01vZHVsZSApCi0gIEZUX0dldF9Nb2R1bGUoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX25hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbW92ZV9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbW92ZXMgYSBnaXZlbiBtb2R1bGUgZnJvbSBhIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSAgOjogQSBoYW5kbGUgdG8gYSBtb2R1bGUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtb2R1bGUgb2JqZWN0IGlzIGRlc3Ryb3llZCBieSB0aGUgZnVuY3Rpb24gaW4gY2FzZSBvZiBzdWNjZXNzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1JlbW92ZV9Nb2R1bGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZSAgIG1vZHVsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlICAgICovCi0gIC8qICAgIGZyb20gYSBnaXZlbiBtZW1vcnkgb2JqZWN0LiAgSXQgaXMgdGh1cyBwb3NzaWJsZSB0byB1c2UgbGlicmFyaWVzICAqLwotICAvKiAgICB3aXRoIGRpc3RpbmN0IG1lbW9yeSBhbGxvY2F0b3JzIHdpdGhpbiB0aGUgc2FtZSBwcm9ncmFtLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICA6OiBBIGhhbmRsZSB0byB0aGUgb3JpZ2luYWwgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbGlicmFyeSA6OiBBIHBvaW50ZXIgdG8gaGFuZGxlIG9mIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9OZXdfTGlicmFyeSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgICphbGlicmFyeSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZHMgYSBnaXZlbiBsaWJyYXJ5IG9iamVjdC4gIFRoaXMgY2xvc2VzIGFsbCBkcml2ZXJzIGFuZCAgICAgICovCi0gIC8qICAgIGRpc2NhcmRzIGFsbCByZXNvdXJjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfTGlicmFyeSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0vKiAqLwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0RlYnVnSG9va19GdW5jKSggdm9pZCogIGFyZyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0RlYnVnX0hvb2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0cyBhIGRlYnVnIGhvb2sgZnVuY3Rpb24gZm9yIGRlYnVnZ2luZyB0aGUgaW50ZXJwcmV0ZXIgb2YgYSBmb250ICovCi0gIC8qICAgIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvb2tfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBkZWJ1ZyBob29rLiAgWW91IHNob3VsZCB1c2UgdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcyBkZWZpbmVkIGluIGBmdG9ianMuaCcsIGUuZy4sICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgRlRfREVCVUdfSE9PS19UUlVFVFlQRScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWJ1Z19ob29rIDo6IFRoZSBmdW5jdGlvbiB1c2VkIHRvIGRlYnVnIHRoZSBpbnRlcnByZXRlci4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdXJyZW50bHksIGZvdXIgZGVidWcgaG9vayBzbG90cyBhcmUgYXZhaWxhYmxlLCBidXQgb25seSB0d28gKGZvciAgKi8KLSAgLyogICAgdGhlIFRydWVUeXBlIGFuZCB0aGUgVHlwZSAxIGludGVycHJldGVyKSBhcmUgZGVmaW5lZC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSB0aGUgaW50ZXJuYWwgaGVhZGVycyBvZiBGcmVlVHlwZSBhcmUgbm8gbG9uZ2VyIGluc3RhbGxlZCwgICAgKi8KLSAgLyogICAgdGhlIHN5bWJvbCBgRlRfREVCVUdfSE9PS19UUlVFVFlQRScgaXNuJ3QgYXZhaWxhYmxlIHB1YmxpY2x5LiAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgYSBidWcgYW5kIHdpbGwgYmUgZml4ZWQgaW4gYSBmb3J0aGNvbWluZyByZWxlYXNlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU2V0X0RlYnVnX0hvb2soIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGhvb2tfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9EZWJ1Z0hvb2tfRnVuYyAgZGVidWdfaG9vayApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWRkcyB0aGUgc2V0IG9mIGRlZmF1bHQgZHJpdmVycyB0byBhIGdpdmVuIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgb25seSB1c2VmdWwgd2hlbiB5b3UgY3JlYXRlIGEgbGlicmFyeSBvYmplY3Qgd2l0aCAgICAgICAgICAqLwotICAvKiAgICBARlRfTmV3X0xpYnJhcnkgKHVzdWFsbHkgdG8gcGx1ZyBhIGN1c3RvbSBtZW1vcnkgbWFuYWdlcikuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgIHRydWV0eXBlX2VuZ2luZQotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgVGhlIFRydWVUeXBlIEVuZ2luZQotICAgKgotICAgKiBAYWJzdHJhY3Q6Ci0gICAqICAgVHJ1ZVR5cGUgYnl0ZWNvZGUgc3VwcG9ydC4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBhIGZ1bmN0aW9uIHVzZWQgdG8gcXVlcnkgdGhlIGxldmVsIG9mIFRydWVUeXBlCi0gICAqICAgYnl0ZWNvZGUgc3VwcG9ydCBjb21waWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICBAZW51bToKLSAgICogICAgIEZUX1RydWVUeXBlRW5naW5lVHlwZQotICAgKgotICAgKiAgQGRlc2NyaXB0aW9uOgotICAgKiAgICAgQSBsaXN0IG9mIHZhbHVlcyBkZXNjcmliaW5nIHdoaWNoIGtpbmQgb2YgVHJ1ZVR5cGUgYnl0ZWNvZGUKLSAgICogICAgIGVuZ2luZSBpcyBpbXBsZW1lbnRlZCBpbiBhIGdpdmVuIEZUX0xpYnJhcnkgaW5zdGFuY2UuICBJdCBpcyB1c2VkCi0gICAqICAgICBieSB0aGUgQEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSBmdW5jdGlvbi4KLSAgICoKLSAgICogIEB2YWx1ZXM6Ci0gICAqICAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9OT05FIDo6Ci0gICAqICAgICAgIFRoZSBsaWJyYXJ5IGRvZXNuJ3QgaW1wbGVtZW50IGFueSBraW5kIG9mIGJ5dGVjb2RlIGludGVycHJldGVyLgotICAgKgotICAgKiAgICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfVU5QQVRFTlRFRCA6OgotICAgKiAgICAgICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIGEgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdGhhdCBkb2Vzbid0Ci0gICAqICAgICAgIHN1cHBvcnQgdGhlIHBhdGVudGVkIG9wZXJhdGlvbnMgb2YgdGhlIFRydWVUeXBlIHZpcnR1YWwgbWFjaGluZS4KLSAgICoKLSAgICogICAgICAgSXRzIG1haW4gdXNlIGlzIHRvIGxvYWQgY2VydGFpbiBBc2lhbiBmb250cyB3aGljaCBwb3NpdGlvbiBhbmQKLSAgICogICAgICAgc2NhbGUgZ2x5cGggY29tcG9uZW50cyB3aXRoIGJ5dGVjb2RlIGluc3RydWN0aW9ucy4gIEl0IHByb2R1Y2VzCi0gICAqICAgICAgIGJhZCBvdXRwdXQgZm9yIG1vc3Qgb3RoZXIgZm9udHMuCi0gICAqCi0gICAqICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1BBVEVOVEVEIDo6Ci0gICAqICAgICAgIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgYSBieXRlY29kZSBpbnRlcnByZXRlciB0aGF0IGNvdmVycwotICAgKiAgICAgICB0aGUgZnVsbCBpbnN0cnVjdGlvbiBzZXQgb2YgdGhlIFRydWVUeXBlIHZpcnR1YWwgbWFjaGluZS4KLSAgICogICAgICAgU2VlIHRoZSBmaWxlIGBkb2NzL1BBVEVOVFMnIGZvciBsZWdhbCBhc3BlY3RzLgotICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAgICAyLjIKLSAgICoKLSAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlXwotICB7Ci0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfTk9ORSA9IDAsCi0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfVU5QQVRFTlRFRCwKLSAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9QQVRFTlRFRAotCi0gIH0gRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICBAZnVuYzoKLSAgICogICAgIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZQotICAgKgotICAgKiAgQGRlc2NyaXB0aW9uOgotICAgKiAgICAgUmV0dXJuIGEgQEZUX1RydWVUeXBlRW5naW5lVHlwZSB2YWx1ZSB0byBpbmRpY2F0ZSB3aGljaCBsZXZlbCBvZgotICAgKiAgICAgdGhlIFRydWVUeXBlIHZpcnR1YWwgbWFjaGluZSBhIGdpdmVuIGxpYnJhcnkgaW5zdGFuY2Ugc3VwcG9ydHMuCi0gICAqCi0gICAqICBAaW5wdXQ6Ci0gICAqICAgICBsaWJyYXJ5IDo6Ci0gICAqICAgICAgIEEgbGlicmFyeSBpbnN0YW5jZS4KLSAgICoKLSAgICogIEByZXR1cm46Ci0gICAqICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hpY2ggbGV2ZWwgaXMgc3VwcG9ydGVkLgotICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAgMi4yCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX1RydWVUeXBlRW5naW5lVHlwZSApCi0gIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUTU9EQVBJX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDExNWRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RlcnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1vZGVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgbW9kdWxlIGVycm9yIG9mZnNldHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIEZyZWVUeXBlIG1vZHVsZSBlcnJvciBvZmZzZXRzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBsb3dlciBieXRlIGdpdmVzIHRoZSBlcnJvciBjb2RlLCB0aGUgaGlnaGVyIGJ5dGUgZ2l2ZXMgdGhlICAgICAgICAqLwotICAvKiBtb2R1bGUuICBUaGUgYmFzZSBtb2R1bGUgaGFzIGVycm9yIG9mZnNldCAwLiAgRm9yIGV4YW1wbGUsIHRoZSBlcnJvciAgKi8KLSAgLyogYEZUX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0JyBoYXMgdmFsdWUgMHgwMDMsIHRoZSBlcnJvciAgICAgICAgICAgICAgICovCi0gIC8qIGBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdCcgaGFzIHZhbHVlIDB4MTEwMywgdGhlIGVycm9yICAgICAgICAgICAgICAqLwotICAvKiBgVDFfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDEyMDMsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVuZGVmaW5lIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGluIGZ0b3B0aW9uLmggICAqLwotICAvKiB0byBtYWtlIHRoZSBoaWdoZXIgYnl0ZSBhbHdheXMgemVybyAoZGlzYWJsaW5nIHRoZSBtb2R1bGUgZXJyb3IgICAgICAgKi8KLSAgLyogbWVjaGFuaXNtKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBhIG1vZHVsZSBlcnJvciBtZXNzYWdlIHRhYmxlIGVhc2lseSAgICAgKi8KLSAgLyogd2l0aCBzb21ldGhpbmcgbGlrZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICN1bmRlZiBfX0ZUTU9ERVJSX0hfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjZGVmaW5lIEZUX01PREVSUkRFRiggZSwgdiwgcyApICB7IEZUX01vZF9FcnJfICMjIGUsIHMgfSwgICAgICAgICAqLwotICAvKiAgICAgI2RlZmluZSBGVF9NT0RFUlJfU1RBUlRfTElTVCAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNkZWZpbmUgRlRfTU9ERVJSX0VORF9MSVNUICAgICAgIHsgMCwgMCB9IH07ICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY29uc3Qgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGludCAgICAgICAgICBtb2RfZXJyX29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBjb25zdCBjaGFyKiAgbW9kX2Vycl9tc2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIH0gZnRfbW9kX2Vycm9yc1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUbyB1c2Ugc3VjaCBhIHRhYmxlLCBhbGwgZXJyb3JzIG11c3QgYmUgQU5EZWQgd2l0aCAweEZGMDAgdG8gcmVtb3ZlICAgKi8KLSAgLyogdGhlIGVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRNT0RFUlJfSF9fCi0jZGVmaW5lIF9fRlRNT0RFUlJfSF9fCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNFVFVQIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX05FRURfRVhURVJOX0MKLQotI2lmbmRlZiBGVF9NT0RFUlJERUYKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKLSNkZWZpbmUgRlRfTU9ERVJSREVGKCBlLCB2LCBzICkgIEZUX01vZF9FcnJfICMjIGUgPSB2LAotI2Vsc2UKLSNkZWZpbmUgRlRfTU9ERVJSREVGKCBlLCB2LCBzICkgIEZUX01vZF9FcnJfICMjIGUgPSAwLAotI2VuZGlmCi0KLSNkZWZpbmUgRlRfTU9ERVJSX1NUQVJUX0xJU1QgIGVudW0gewotI2RlZmluZSBGVF9NT0RFUlJfRU5EX0xJU1QgICAgRlRfTW9kX0Vycl9NYXggfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX05FRURfRVhURVJOX0MKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9NT0RFUlJERUYgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgIExJU1QgTU9EVUxFIEVSUk9SIEJBU0VTICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBGVF9NT0RFUlJfU1RBUlRfTElTVAotICBGVF9NT0RFUlJfU1RBUlRfTElTVAotI2VuZGlmCi0KLQotICBGVF9NT0RFUlJERUYoIEJhc2UsICAgICAgMHgwMDAsICJiYXNlIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEF1dG9maXQsICAgMHgxMDAsICJhdXRvZml0dGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEJERiwgICAgICAgMHgyMDAsICJCREYgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggQ2FjaGUsICAgICAweDMwMCwgImNhY2hlIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIENGRiwgICAgICAgMHg0MDAsICJDRkYgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggQ0lELCAgICAgICAweDUwMCwgIkNJRCBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBHemlwLCAgICAgIDB4NjAwLCAiR3ppcCBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBMWlcsICAgICAgIDB4NzAwLCAiTFpXIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIE9UdmFsaWQsICAgMHg4MDAsICJPcGVuVHlwZSB2YWxpZGF0aW9uIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFBDRiwgICAgICAgMHg5MDAsICJQQ0YgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggUEZSLCAgICAgICAweEEwMCwgIlBGUiBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBQU2F1eCwgICAgIDB4QjAwLCAiUFMgYXV4aWxpYXJ5IG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFBTaGludGVyLCAgMHhDMDAsICJQUyBoaW50ZXIgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggUFNuYW1lcywgICAweEQwMCwgIlBTIG5hbWVzIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFJhc3RlciwgICAgMHhFMDAsICJyYXN0ZXIgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggU0ZOVCwgICAgICAweEYwMCwgIlNGTlQgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggU21vb3RoLCAgIDB4MTAwMCwgInNtb290aCByYXN0ZXIgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggVHJ1ZVR5cGUsIDB4MTEwMCwgIlRydWVUeXBlIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFR5cGUxLCAgICAweDEyMDAsICJUeXBlIDEgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggVHlwZTQyLCAgIDB4MTMwMCwgIlR5cGUgNDIgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggV2luZm9udHMsIDB4MTQwMCwgIldpbmRvd3MgRk9OL0ZOVCBtb2R1bGUiICkKLQotCi0jaWZkZWYgRlRfTU9ERVJSX0VORF9MSVNUCi0gIEZUX01PREVSUl9FTkRfTElTVAotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZkZWYgRlRfTkVFRF9FWFRFUk5fQwotICB9Ci0jZW5kaWYKLQotI3VuZGVmIEZUX01PREVSUl9TVEFSVF9MSVNUCi0jdW5kZWYgRlRfTU9ERVJSX0VORF9MSVNUCi0jdW5kZWYgRlRfTU9ERVJSREVGCi0jdW5kZWYgRlRfTkVFRF9FWFRFUk5fQwotCi0KLSNlbmRpZiAvKiBfX0ZUTU9ERVJSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3R2YWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczMzg4Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3R2YWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG90dmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIE9wZW5UeXBlIHRhYmxlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFdhcm5pbmc6IFRoaXMgbW9kdWxlIG1pZ2h0IGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IGxpYnJhcnkgaW4gdGhlICAgICAgICovCi0vKiAgICAgICAgICBmdXR1cmUgdG8gYXZvaWQgYSB0aWdodCBkZXBlbmRlbmN5IGJldHdlZW4gRnJlZVR5cGUgYW5kIHRoZSAgICAqLwotLyogICAgICAgICAgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRPVFZBTF9IX18KLSNkZWZpbmUgX19GVE9UVkFMX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdF92YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPcGVuVHlwZSBWYWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBBUEkgdG8gdmFsaWRhdGUgT3BlblR5cGUgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9ucyB0byB2YWxpZGF0ZSAgICAgKi8KLSAgLyogICAgc29tZSBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsIEpTVEYsIE1BVEgpLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBlbnVtOgotICAqICAgIEZUX1ZBTElEQVRFX09UWFhYCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlZCB3aXRoIEBGVF9PcGVuVHlwZV9WYWxpZGF0ZSB0bwotICAqICAgIGluZGljYXRlIHdoaWNoIE9wZW5UeXBlIHRhYmxlcyBzaG91bGQgYmUgdmFsaWRhdGVkLgotICAqCi0gICogQHZhbHVlczoKLSAgKiAgICBGVF9WQUxJREFURV9CQVNFIDo6Ci0gICogICAgICBWYWxpZGF0ZSBCQVNFIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfR0RFRiA6OgotICAqICAgICAgVmFsaWRhdGUgR0RFRiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0dQT1MgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEdQT1MgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9HU1VCIDo6Ci0gICogICAgICBWYWxpZGF0ZSBHU1VCIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfSlNURiA6OgotICAqICAgICAgVmFsaWRhdGUgSlNURiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX01BVEggOjoKLSAgKiAgICAgIFZhbGlkYXRlIE1BVEggdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9PVCA6OgotICAqICAgICAgVmFsaWRhdGUgYWxsIE9wZW5UeXBlIHRhYmxlcyAoQkFTRSwgR0RFRiwgR1BPUywgR1NVQiwgSlNURiwgTUFUSCkuCi0gICoKLSAgKi8KLSNkZWZpbmUgRlRfVkFMSURBVEVfQkFTRSAgMHgwMTAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dERUYgIDB4MDIwMAotI2RlZmluZSBGVF9WQUxJREFURV9HUE9TICAweDA0MDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfR1NVQiAgMHgwODAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0pTVEYgIDB4MTAwMAotI2RlZmluZSBGVF9WQUxJREFURV9NQVRIICAweDIwMDAKLQotI2RlZmluZSBGVF9WQUxJREFURV9PVCAgRlRfVkFMSURBVEVfQkFTRSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0dERUYgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9HUE9TIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfR1NVQiB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0pTVEYgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9NQVRICi0KLSAgLyogKi8KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfT3BlblR5cGVfVmFsaWRhdGUKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBWYWxpZGF0ZSB2YXJpb3VzIE9wZW5UeXBlIHRhYmxlcyB0byBhc3N1cmUgdGhhdCBhbGwgb2Zmc2V0cyBhbmQKLSAgKiAgICBpbmRpY2VzIGFyZSB2YWxpZC4gIFRoZSBpZGVhIGlzIHRoYXQgYSBoaWdoZXItbGV2ZWwgbGlicmFyeSB3aGljaAotICAqICAgIGFjdHVhbGx5IGRvZXMgdGhlIHRleHQgbGF5b3V0IGNhbiBhY2Nlc3MgdGhvc2UgdGFibGVzIHdpdGhvdXQKLSAgKiAgICBlcnJvciBjaGVja2luZyAod2hpY2ggY2FuIGJlIHF1aXRlIHRpbWUgY29uc3VtaW5nKS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB2YWxpZGF0aW9uX2ZsYWdzIDo6Ci0gICogICAgICAgQSBiaXQgZmllbGQgd2hpY2ggc3BlY2lmaWVzIHRoZSB0YWJsZXMgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCi0gICogICAgICAgQEZUX1ZBTElEQVRFX09UWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIEJBU0VfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEJBU0UgdGFibGUuCi0gICoKLSAgKiAgICBHREVGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBHREVGIHRhYmxlLgotICAqCi0gICogICAgR1BPU190YWJsZSA6OgotICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUgR1BPUyB0YWJsZS4KLSAgKgotICAqICAgIEdTVUJfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEdTVUIgdGFibGUuCi0gICoKLSAgKiAgICBKU1RGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBKU1RGIHRhYmxlLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIE9wZW5UeXBlIGZvbnRzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgKiAgIG90aGVyd2lzZS4KLSAgKgotICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGZpdmUgdGFibGVzIHdpdGgKLSAgKiAgIEBGVF9PcGVuVHlwZV9GcmVlLiAgQSBOVUxMIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIKLSAgKiAgIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIG9yIHRoZSBhcHBsaWNhdGlvbiBoYXNuJ3QgYXNrZWQgZm9yCi0gICogICB2YWxpZGF0aW9uLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3BlblR5cGVfVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqQkFTRV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR0RFRl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1BPU190YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1NVQl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqSlNURl90YWJsZSApOwotCi0gIC8qICovCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX09wZW5UeXBlX0ZyZWUKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBGcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5IE9wZW5UeXBlIHZhbGlkYXRvci4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB0YWJsZSA6OgotICAqICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCBpcyBhbGxvY2F0ZWQgYnkKLSAgKiAgICAgICBARlRfT3BlblR5cGVfVmFsaWRhdGUuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIGZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkKLSAgKiAgIEBGVF9PcGVuVHlwZV9WYWxpZGF0ZSBvbmx5LgotICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9PcGVuVHlwZV9GcmVlKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlICk7Ci0KLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVE9UVkFMX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczZTY0Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG91dGxuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBmb3IgdGhlIEZUX091dGxpbmUgdHlwZSB1c2VkIHRvIHN0b3JlIGdseXBoIHNoYXBlcyBvZiAgICAgICAgKi8KLS8qICAgIG1vc3Qgc2NhbGFibGUgZm9udCBmb3JtYXRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggYnkgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRPVVRMTl9IX18KLSNkZWZpbmUgX19GVE9VVExOX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE91dGxpbmUgUHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZ1bmN0aW9ucyB0byBjcmVhdGUsIHRyYW5zZm9ybSwgYW5kIHJlbmRlciB2ZWN0b3JpYWwgZ2x5cGggaW1hZ2VzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyByb3V0aW5lcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBzY2FsYWJsZSAqLwotICAvKiAgICBnbHlwaCBpbWFnZXMga25vd24gYXMgYG91dGxpbmVzJy4gIFRoZXNlIGNhbiBhbHNvIGJlIG1lYXN1cmVkLCAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtZWQsIGFuZCBjb252ZXJ0ZWQgaW50byBiaXRtYXBzIGFuZCBwaXhtYXBzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfRkxBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9SZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTW92ZVRvX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0xpbmVUb19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Db25pY1RvX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ3ViaWNUb19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXYWxrcyBvdmVyIGFuIG91dGxpbmUncyBzdHJ1Y3R1cmUgdG8gZGVjb21wb3NlIGl0IGludG8gaW5kaXZpZHVhbCAgKi8KLSAgLyogICAgc2VnbWVudHMgYW5kIELDqXppZXIgYXJjcy4gIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBhYmxlIHRvIGVtaXQgICAgICAqLwotICAvKiAgICBgbW92ZSB0bycgYW5kIGBjbG9zZSB0bycgb3BlcmF0aW9ucyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIGVuZCAgKi8KLSAgLyogICAgb2YgbmV3IGNvbnRvdXJzIGluIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdW5jX2ludGVyZmFjZSA6OiBBIHRhYmxlIG9mIGBlbWl0dGVycycsIGkuZSwuIGZ1bmN0aW9uIHBvaW50ZXJzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyBkZWNvbXBvc2l0aW9uIHRvIGluZGljYXRlIHBhdGggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB3aGljaCBpcyBwYXNzZWQgdG8gZWFjaCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVyIGR1cmluZyB0aGUgZGVjb21wb3NpdGlvbi4gIEl0IGNhbiBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgZHVyaW5nIHRoZSAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRGVjb21wb3NlKCBGVF9PdXRsaW5lKiAgICAgICAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX091dGxpbmVfRnVuY3MqICBmdW5jX2ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGVzIGEgbmV3IG91dGxpbmUgb2YgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QgZnJvbSB3aGVyZSB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgb3V0bGluZSBpcyBhbGxvY2F0ZWQuICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgbmV3ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG91dGxpbmUgd2lsbCAqbm90KiBuZWNlc3NhcmlseSBiZSAqZnJlZWQqLCB3aGVuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBkZXN0cm95aW5nIHRoZSBsaWJyYXJ5LCBieSBARlRfRG9uZV9GcmVlVHlwZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bVBvaW50cyAgIDo6IFRoZSBtYXhpbWFsIG51bWJlciBvZiBwb2ludHMgd2l0aGluIHRoZSBvdXRsaW5lLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtQ29udG91cnMgOjogVGhlIG1heGltYWwgbnVtYmVyIG9mIGNvbnRvdXJzIHdpdGhpbiB0aGUgb3V0bGluZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5vdXRsaW5lICAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyBvdXRsaW5lLiAgTlVMTCBpbiBjYXNlIG9mICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZWFzb24gd2h5IHRoaXMgZnVuY3Rpb24gdGFrZXMgYSBgbGlicmFyeScgcGFyYW1ldGVyIGlzIHNpbXBseSAqLwotICAvKiAgICB0byB1c2UgdGhlIGxpYnJhcnkncyBtZW1vcnkgYWxsb2NhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX05ldyggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApOwotCi0KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfTmV3X0ludGVybmFsKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bVBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBudW1Db250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICphbm91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3lzIGFuIG91dGxpbmUgY3JlYXRlZCB3aXRoIEBGVF9PdXRsaW5lX05ldy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0IHVzZWQgdG8gYWxsb2NhdGUgdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBvdXRsaW5lIG9iamVjdCB0byBiZSBkaXNjYXJkZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBvdXRsaW5lJ3MgYG93bmVyJyBmaWVsZCBpcyBub3Qgc2V0LCBvbmx5IHRoZSBvdXRsaW5lICAgICAgICAqLwotICAvKiAgICBkZXNjcmlwdG9yIHdpbGwgYmUgcmVsZWFzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZWFzb24gd2h5IHRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gYGxpYnJhcnknIHBhcmFtZXRlciBpcyAgICAgICAqLwotICAvKiAgICBzaW1wbHkgdG8gdXNlIGZ0X21lbV9mcmVlKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0RvbmUoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9Eb25lX0ludGVybmFsKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0NoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB0aGUgY29udGVudHMgb2YgYW4gb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0NoZWNrKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQ0JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJucyBhbiBvdXRsaW5lJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwgICovCi0gIC8qICAgIHRoZSBvdXRsaW5lJ3MgcG9pbnRzLCBpbmNsdWRpbmcgQsOpemllciBjb250cm9sIHBvaW50cy4gIFRob3VnaCBpdCAgKi8KLSAgLyogICAgY29pbmNpZGVzIHdpdGggdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBmb3IgbW9zdCBnbHlwaHMsIGl0IGNhbiBiZSAgICovCi0gIC8qICAgIHNsaWdodGx5IGxhcmdlciBpbiBzb21lIHNpdHVhdGlvbnMgKGxpa2Ugd2hlbiByb3RhdGluZyBhbiBvdXRsaW5lICAqLwotICAvKiAgICB3aGljaCBjb250YWlucyBCw6l6aWVyIG91dHNpZGUgYXJjcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94IGlzIHZlcnkgZmFzdCwgd2hpbGUgZ2V0dGluZyB0aGUgYm91bmRpbmcgKi8KLSAgLyogICAgYm94IGNhbiB0YWtlIG11Y2ggbW9yZSB0aW1lIGFzIGl0IG5lZWRzIHRvIHdhbGsgb3ZlciBhbGwgc2VnbWVudHMgICovCi0gIC8qICAgIGFuZCBhcmNzIGluIHRoZSBvdXRsaW5lLiAgVG8gZ2V0IHRoZSBsYXR0ZXIsIHlvdSBjYW4gdXNlIHRoZSAgICAgICAqLwotICAvKiAgICBgZnRiYm94JyBjb21wb25lbnQgd2hpY2ggaXMgZGVkaWNhdGVkIHRvIHRoaXMgc2luZ2xlIHRhc2suICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2JveCAgIDo6IFRoZSBvdXRsaW5lJ3MgY29udHJvbCBib3guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX091dGxpbmVfR2V0X0NCb3goIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAgICAgICAqYWNib3ggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFwcGxpZXMgYSBzaW1wbGUgdHJhbnNsYXRpb24gdG8gdGhlIHBvaW50cyBvZiBhbiBvdXRsaW5lLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhPZmZzZXQgOjogVGhlIGhvcml6b250YWwgb2Zmc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeU9mZnNldCA6OiBUaGUgdmVydGljYWwgb2Zmc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgeE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICB5T2Zmc2V0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb3BpZXMgYW4gb3V0bGluZSBpbnRvIGFub3RoZXIgb25lLiAgQm90aCBvYmplY3RzIG11c3QgaGF2ZSB0aGUgICAgKi8KLSAgLyogICAgc2FtZSBzaXplcyAobnVtYmVyIG9mIHBvaW50cyAmIG51bWJlciBvZiBjb250b3Vycykgd2hlbiB0aGlzICAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9uIGlzIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNvdXJjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhcmdldCA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfQ29weSggY29uc3QgRlRfT3V0bGluZSogIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lICAgICAgICAqdGFyZ2V0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcHBsaWVzIGEgc2ltcGxlIDJ4MiBtYXRyaXggdG8gYWxsIG9mIGFuIG91dGxpbmUncyBwb2ludHMuICBVc2VmdWwgKi8KLSAgLyogICAgZm9yIGFwcGx5aW5nIHJvdGF0aW9ucywgc2xhbnRpbmcsIGZsaXBwaW5nLCBldGMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4ICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiB1c2UgQEZUX091dGxpbmVfVHJhbnNsYXRlIGlmIHlvdSBuZWVkIHRvIHRyYW5zbGF0ZSB0aGUgICAgICovCi0gIC8qICAgIG91dGxpbmUncyBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgIG1hdHJpeCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9FbWJvbGRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW1ib2xkZW5zIGFuIG91dGxpbmUuICBUaGUgbmV3IG91dGxpbmUgd2lsbCBiZSBhdCBtb3N0IDQgdGltZXMgICAgICovCi0gIC8qICAgIGBzdHJlbmd0aCcgcGl4ZWxzIHdpZGVyIGFuZCBoaWdoZXIuICBZb3UgbWF5IHRoaW5rIG9mIHRoZSBsZWZ0IGFuZCAqLwotICAvKiAgICBib3R0b20gYm9yZGVycyBhcyB1bmNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5lZ2F0aXZlIGBzdHJlbmd0aCcgdmFsdWVzIHRvIHJlZHVjZSB0aGUgb3V0bGluZSB0aGlja25lc3MgYXJlICAgICAqLwotICAvKiAgICBwb3NzaWJsZSBhbHNvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkLiAgRXhwcmVzc2VkIGluICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgMjYuNiBwaXhlbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHVzZWQgYWxnb3JpdGhtIHRvIGluY3JlYXNlIG9yIGRlY3JlYXNlIHRoZSB0aGlja25lc3Mgb2YgdGhlICAgICovCi0gIC8qICAgIGdseXBoIGRvZXNuJ3QgY2hhbmdlIHRoZSBudW1iZXIgb2YgcG9pbnRzOyB0aGlzIG1lYW5zIHRoYXQgY2VydGFpbiAqLwotICAvKiAgICBzaXR1YXRpb25zIGxpa2UgYWN1dGUgYW5nbGVzIG9yIGludGVyc2VjdGlvbnMgYXJlIHNvbWV0aW1lcyAgICAgICAgKi8KLSAgLyogICAgaGFuZGxlZCBpbmNvcnJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFeGFtcGxlIGNhbGw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX0xvYWRfR2x5cGgoIGZhY2UsIGluZGV4LCBGVF9MT0FEX0RFRkFVTFQgKTsgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBpZiAoIGZhY2UtPnNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9PdXRsaW5lX0VtYm9sZGVuKCAmZmFjZS0+c2xvdC0+b3V0bGluZSwgc3RyZW5ndGggKTsgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0VtYm9sZGVuKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHN0cmVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXZlcnNlcyB0aGUgZHJhd2luZyBkaXJlY3Rpb24gb2YgYW4gb3V0bGluZS4gIFRoaXMgaXMgdXNlZCB0byAgICAgKi8KLSAgLyogICAgZW5zdXJlIGNvbnNpc3RlbnQgZmlsbCBjb252ZW50aW9ucyBmb3IgbWlycm9yZWQgZ2x5cGhzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbnMgdG9nZ2xlcyB0aGUgYml0IGZsYWcgQEZUX09VVExJTkVfUkVWRVJTRV9GSUxMIGluICAgICovCi0gIC8qICAgIHRoZSBvdXRsaW5lJ3MgYGZsYWdzJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgc2hvdWxkbid0IGJlIHVzZWQgYnkgYSBub3JtYWwgY2xpZW50IGFwcGxpY2F0aW9uLCB1bmxlc3MgaXQgICAgICovCi0gIC8qICAgIGtub3dzIHdoYXQgaXQgaXMgZG9pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3V0bGluZV9SZXZlcnNlKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVycyBhbiBvdXRsaW5lIHdpdGhpbiBhIGJpdG1hcC4gIFRoZSBvdXRsaW5lJ3MgaW1hZ2UgaXMgc2ltcGx5ICovCi0gIC8qICAgIE9SLWVkIHRvIHRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJpdG1hcCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBDUkVBVEUgdGhlIGJpdG1hcCwgaXQgb25seSByZW5kZXJzIGFuICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgaW1hZ2Ugd2l0aGluIHRoZSBvbmUgeW91IHBhc3MgdG8gaXQhICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgd2lsbCB1c2UgdGhlIHJhc3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZWZhdWx0IGdseXBoIGZvcm1hdC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9HZXRfQml0bWFwKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQml0bWFwICAqYWJpdG1hcCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9SZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVycyBhbiBvdXRsaW5lIHdpdGhpbiBhIGJpdG1hcCB1c2luZyB0aGUgY3VycmVudCBzY2FuLWNvbnZlcnQuICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb25zIHVzZXMgYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIGFzIGFuIGFyZ3VtZW50LCAqLwotICAvKiAgICBhbGxvd2luZyBhZHZhbmNlZCBmZWF0dXJlcyBsaWtlIGRpcmVjdCBjb21wb3NpdGlvbiwgdHJhbnNsdWNlbmN5LCAgKi8KLSAgLyogICAgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJhbXMgIDo6IEEgcG9pbnRlciB0byBhbiBARlRfUmFzdGVyX1BhcmFtcyBzdHJ1Y3R1cmUgdXNlZCB0byAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBkZXNjcmliZSB0aGUgcmVuZGVyaW5nIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBhbmQgaG93IEBGVF9SYXN0ZXJfUGFyYW1zIHdvcmtzICovCi0gIC8qICAgIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZpZWxkIGBwYXJhbXMuc291cmNlJyB3aWxsIGJlIHNldCB0byBgb3V0bGluZScgYmVmb3JlIHRoZSBzY2FuICovCi0gIC8qICAgIGNvbnZlcnRlciBpcyBjYWxsZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHZhbHVlIHlvdSBnaXZlIHRvIGl0IGlzICAqLwotICAvKiAgICBhY3R1YWxseSBpZ25vcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX1JlbmRlciggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZW51bToKLSAgKiAgIEZUX09yaWVudGF0aW9uCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBBIGxpc3Qgb2YgdmFsdWVzIHVzZWQgdG8gZGVzY3JpYmUgYW4gb3V0bGluZSdzIGNvbnRvdXIgb3JpZW50YXRpb24uCi0gICoKLSAgKiAgIFRoZSBUcnVlVHlwZSBhbmQgUG9zdHNjcmlwdCBzcGVjaWZpY2F0aW9ucyB1c2UgZGlmZmVyZW50IGNvbnZlbnRpb25zCi0gICogICB0byBkZXRlcm1pbmUgd2hldGhlciBvdXRsaW5lIGNvbnRvdXJzIHNob3VsZCBiZSBmaWxsZWQgb3IgdW5maWxsZWQuCi0gICoKLSAgKiBAdmFsdWVzOgotICAqICAgRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgOjoKLSAgKiAgICAgQWNjb3JkaW5nIHRvIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLCBjbG9ja3dpc2UgY29udG91cnMgbXVzdAotICAqICAgICBiZSBmaWxsZWQsIGFuZCBjb3VudGVyLWNsb2Nrd2lzZSBvbmVzIG11c3QgYmUgdW5maWxsZWQuCi0gICoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQgOjoKLSAgKiAgICAgQWNjb3JkaW5nIHRvIHRoZSBQb3N0c2NyaXB0IHNwZWNpZmljYXRpb24sIGNvdW50ZXItY2xvY2t3aXNlIGNvbnRvdXJzCi0gICogICAgIG11c3QgYmUgZmlsbGVkLCBhbmQgY2xvY2t3aXNlIG9uZXMgbXVzdCBiZSB1bmZpbGxlZC4KLSAgKgotICAqICAgRlRfT1JJRU5UQVRJT05fRklMTF9SSUdIVCA6OgotICAqICAgICBUaGlzIGlzIGlkZW50aWNhbCB0byBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUsIGJ1dCBpcyB1c2VkIHRvCi0gICogICAgIHJlbWVtYmVyIHRoYXQgaW4gVHJ1ZVR5cGUsIGV2ZXJ5dGhpbmcgdGhhdCBpcyB0byB0aGUgcmlnaHQgb2YKLSAgKiAgICAgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGEgY29udG91ciBtdXN0IGJlIGZpbGxlZC4KLSAgKgotICAqICAgRlRfT1JJRU5UQVRJT05fRklMTF9MRUZUIDo6Ci0gICogICAgIFRoaXMgaXMgaWRlbnRpY2FsIHRvIEBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBULCBidXQgaXMgdXNlZCB0bwotICAqICAgICByZW1lbWJlciB0aGF0IGluIFBvc3RzY3JpcHQsIGV2ZXJ5dGhpbmcgdGhhdCBpcyB0byB0aGUgbGVmdCBvZgotICAqICAgICB0aGUgZHJhd2luZyBkaXJlY3Rpb24gb2YgYSBjb250b3VyIG11c3QgYmUgZmlsbGVkLgotICAqCi0gICogICBGVF9PUklFTlRBVElPTl9OT05FIDo6Ci0gICogICAgIFRoZSBvcmllbnRhdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gIFRoYXQgaXMsIGRpZmZlcmVudCBwYXJ0cyBvZgotICAqICAgICB0aGUgZ2x5cGggaGF2ZSBkaWZmZXJlbnQgb3JpZW50YXRpb24uCi0gICoKLSAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9PcmllbnRhdGlvbl8KLSAgewotICAgIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFICAgPSAwLAotICAgIEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQgPSAxLAotICAgIEZUX09SSUVOVEFUSU9OX0ZJTExfUklHSFQgPSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSwKLSAgICBGVF9PUklFTlRBVElPTl9GSUxMX0xFRlQgID0gRlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCwKLSAgICBGVF9PUklFTlRBVElPTl9OT05FCi0KLSAgfSBGVF9PcmllbnRhdGlvbjsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgVGhpcyBmdW5jdGlvbiBhbmFseXplcyBhIGdseXBoIG91dGxpbmUgYW5kIHRyaWVzIHRvIGNvbXB1dGUgaXRzCi0gICogICBmaWxsIG9yaWVudGF0aW9uIChzZWUgQEZUX09yaWVudGF0aW9uKS4gIFRoaXMgaXMgZG9uZSBieSBjb21wdXRpbmcKLSAgKiAgIHRoZSBkaXJlY3Rpb24gb2YgZWFjaCBnbG9iYWwgaG9yaXpvbnRhbCBhbmQvb3IgdmVydGljYWwgZXh0cmVtYQotICAqICAgd2l0aGluIHRoZSBvdXRsaW5lLgotICAqCi0gICogICBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgZm9yIGVtcHR5Ci0gICogICBvdXRsaW5lcy4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgIG91dGxpbmUgOjoKLSAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIFRoZSBvcmllbnRhdGlvbi4KLSAgKgotICAqLwotICBGVF9FWFBPUlQoIEZUX09yaWVudGF0aW9uICkKLSAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24oIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRPVVRMTl9IX18gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGZyLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGZyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODAxZmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHBmci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cGZyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBQRlItc3BlY2lmaWMgZGF0YSAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUUEZSX0hfXwotI2RlZmluZSBfX0ZUUEZSX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwZnJfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQRlIgRm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQRlIvVHJ1ZURvYyBzcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIFBGUi1zcGVjaWZpYyBmdW5jdGlvbnMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0dldF9QRlJfTWV0cmljcwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFJldHVybiB0aGUgb3V0bGluZSBhbmQgbWV0cmljcyByZXNvbHV0aW9ucyBvZiBhIGdpdmVuIFBGUiBmYWNlLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjogSGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLiAgSXQgY2FuIGJlIGEgbm9uLVBGUiBmYWNlLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBhb3V0bGluZV9yZXNvbHV0aW9uIDo6Ci0gICogICAgICBPdXRsaW5lIHJlc29sdXRpb24uICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGZhY2UtPnVuaXRzX3Blcl9FTScuCi0gICogICAgICBPcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBOVUxMKS4KLSAgKgotICAqICAgIGFtZXRyaWNzX3Jlc29sdXRpb24gOjoKLSAgKiAgICAgIE1ldHJpY3MgcmVzb2x1dGlvbi4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgb3V0bGluZV9yZXNvbHV0aW9uJwotICAqICAgICAgZm9yIG5vbi1QRlIgZm9udHMuICBPcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBOVUxMKS4KLSAgKgotICAqICAgIGFtZXRyaWNzX3hfc2NhbGUgOjoKLSAgKiAgICAgIEEgMTYuMTYgZml4ZWQtcG9pbnQgbnVtYmVyIHVzZWQgdG8gc2NhbGUgZGlzdGFuY2UgZXhwcmVzc2VkCi0gICogICAgICBpbiBtZXRyaWNzIHVuaXRzIHRvIGRldmljZSBzdWItcGl4ZWxzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCi0gICogICAgICBgZmFjZS0+c2l6ZS0+eF9zY2FsZScsIGJ1dCBmb3IgbWV0cmljcyBvbmx5LiAgT3B0aW9uYWwgKHBhcmFtZXRlcgotICAqICAgICAgY2FuIGJlIE5VTEwpCi0gICoKLSAgKiAgICBhbWV0cmljc195X3NjYWxlIDo6Ci0gICogICAgICBTYW1lIGFzIGBhbWV0cmljc194X3NjYWxlJyBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICogICAgICBvcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBOVUxMKQotICAqCi0gICogQHJldHVybjoKLSAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBJZiB0aGUgaW5wdXQgZmFjZSBpcyBub3QgYSBQRlIsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZXJyb3IuCi0gICogICBIb3dldmVyLCBpbiBhbGwgY2FzZXMsIGl0IHdpbGwgcmV0dXJuIHZhbGlkIHZhbHVlcy4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9QRlJfTWV0cmljcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW91dGxpbmVfcmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFtZXRyaWNzX3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICphbWV0cmljc194X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYW1ldHJpY3NfeV9zY2FsZSApOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0dldF9QRlJfS2VybmluZwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFJldHVybiB0aGUga2VybmluZyBwYWlyIGNvcnJlc3BvbmRpbmcgdG8gdHdvIGdseXBocyBpbiBhIFBGUiBmYWNlLgotICAqICAgIFRoZSBkaXN0YW5jZSBpcyBleHByZXNzZWQgaW4gbWV0cmljcyB1bml0cywgdW5saWtlIHRoZSByZXN1bHQgb2YKLSAgKiAgICBARlRfR2V0X0tlcm5pbmcuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSAgOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICBsZWZ0ICA6OiBJbmRleCBvZiB0aGUgbGVmdCBnbHlwaC4KLSAgKgotICAqICAgIHJpZ2h0IDo6IEluZGV4IG9mIHRoZSByaWdodCBnbHlwaC4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYXZlY3RvciA6OiBBIGtlcm5pbmcgdmVjdG9yLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIGRpc3RhbmNlcyBpbiBvcmlnaW5hbCBQRlIgbWV0cmljcwotICAqICAgIHVuaXRzLiAgVGhpcyBpcyB1bmxpa2UgQEZUX0dldF9LZXJuaW5nIHdpdGggdGhlIEBGVF9LRVJOSU5HX1VOU0NBTEVECi0gICogICAgbW9kZSwgd2hpY2ggYWx3YXlzIHJldHVybnMgZGlzdGFuY2VzIGNvbnZlcnRlZCB0byBvdXRsaW5lIHVuaXRzLgotICAqCi0gICogICAgWW91IGNhbiB1c2UgdGhlIHZhbHVlIG9mIHRoZSBgeF9zY2FsZScgYW5kIGB5X3NjYWxlJyBwYXJhbWV0ZXJzCi0gICogICAgcmV0dXJuZWQgYnkgQEZUX0dldF9QRlJfTWV0cmljcyB0byBzY2FsZSB0aGVzZSB0byBkZXZpY2Ugc3ViLXBpeGVscy4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9QRlJfS2VybmluZyggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgKmF2ZWN0b3IgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfUEZSX0FkdmFuY2UKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXR1cm4gYSBnaXZlbiBnbHlwaCBhZHZhbmNlLCBleHByZXNzZWQgaW4gb3JpZ2luYWwgbWV0cmljcyB1bml0cywKLSAgKiAgICBmcm9tIGEgUEZSIGZvbnQuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgZ2luZGV4IDo6IFRoZSBnbHlwaCBpbmRleC4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYWFkdmFuY2UgOjogVGhlIGdseXBoIGFkdmFuY2UgaW4gbWV0cmljcyB1bml0cy4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgIFlvdSBjYW4gdXNlIHRoZSBgeF9zY2FsZScgb3IgYHlfc2NhbGUnIHJlc3VsdHMgb2YgQEZUX0dldF9QRlJfTWV0cmljcwotICAqICAgIHRvIGNvbnZlcnQgdGhlIGFkdmFuY2UgdG8gZGV2aWNlIHN1Yi1waXhlbHMgKGkuZS4sIDEvNjR0aCBvZiBwaXhlbHMpLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1BGUl9BZHZhbmNlKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICphYWR2YW5jZSApOwotCi0gLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUUEZSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWQ4MjhlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRyZW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHJlbmRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgcmVuZGVyZXIgbW9kdWxlcyBwdWJsaWMgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwNSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFJFTkRFUl9IX18KLSNkZWZpbmUgX19GVFJFTkRFUl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0jaW5jbHVkZSBGVF9HTFlQSF9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogY3JlYXRlIGEgbmV3IGdseXBoIG9iamVjdCAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfR2x5cGhfSW5pdEZ1bmMpKCBGVF9HbHlwaCAgICAgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgLyogZGVzdHJveXMgYSBnaXZlbiBnbHlwaCBvYmplY3QgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfR2x5cGhfRG9uZUZ1bmMpKCBGVF9HbHlwaCAgZ2x5cGggKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jKSggRlRfR2x5cGggICAgICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgZGVsdGEgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9HbHlwaF9HZXRCQm94RnVuYykoIEZUX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3gqICBhYmJveCApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HbHlwaF9Db3B5RnVuYykoIEZUX0dseXBoICAgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggICB0YXJnZXQgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfR2x5cGhfUHJlcGFyZUZ1bmMpKCBGVF9HbHlwaCAgICAgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLS8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgRlRfR2x5cGhfSW5pdF9GdW5jICAgICAgIEZUX0dseXBoX0luaXRGdW5jCi0jZGVmaW5lIEZUX0dseXBoX0RvbmVfRnVuYyAgICAgICBGVF9HbHlwaF9Eb25lRnVuYwotI2RlZmluZSBGVF9HbHlwaF9UcmFuc2Zvcm1fRnVuYyAgRlRfR2x5cGhfVHJhbnNmb3JtRnVuYwotI2RlZmluZSBGVF9HbHlwaF9CQm94X0Z1bmMgICAgICAgRlRfR2x5cGhfR2V0QkJveEZ1bmMKLSNkZWZpbmUgRlRfR2x5cGhfQ29weV9GdW5jICAgICAgIEZUX0dseXBoX0NvcHlGdW5jCi0jZGVmaW5lIEZUX0dseXBoX1ByZXBhcmVfRnVuYyAgICBGVF9HbHlwaF9QcmVwYXJlRnVuYwotCi0KLSAgc3RydWN0ICBGVF9HbHlwaF9DbGFzc18KLSAgewotICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgIGdseXBoX3NpemU7Ci0gICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICAgZ2x5cGhfZm9ybWF0OwotICAgIEZUX0dseXBoX0luaXRGdW5jICAgICAgIGdseXBoX2luaXQ7Ci0gICAgRlRfR2x5cGhfRG9uZUZ1bmMgICAgICAgZ2x5cGhfZG9uZTsKLSAgICBGVF9HbHlwaF9Db3B5RnVuYyAgICAgICBnbHlwaF9jb3B5OwotICAgIEZUX0dseXBoX1RyYW5zZm9ybUZ1bmMgIGdseXBoX3RyYW5zZm9ybTsKLSAgICBGVF9HbHlwaF9HZXRCQm94RnVuYyAgICBnbHlwaF9iYm94OwotICAgIEZUX0dseXBoX1ByZXBhcmVGdW5jICAgIGdseXBoX3ByZXBhcmU7Ci0gIH07Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUmVuZGVyZXJfUmVuZGVyRnVuYykoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYykoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIGRlbHRhICk7Ci0KLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9SZW5kZXJlcl9HZXRDQm94RnVuYykoIEZUX1JlbmRlcmVyICAgcmVuZGVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94KiAgICAgIGNib3ggKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYykoIEZUX1JlbmRlcmVyICByZW5kZXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBtb2RlX3RhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBtb2RlX3B0ciApOwotCi0vKiBkZXByZWNhdGVkIGlkZW50aWZpZXJzICovCi0jZGVmaW5lIEZUUmVuZGVyZXJfcmVuZGVyICBGVF9SZW5kZXJlcl9SZW5kZXJGdW5jCi0jZGVmaW5lIEZUUmVuZGVyZXJfdHJhbnNmb3JtICBGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jCi0jZGVmaW5lIEZUUmVuZGVyZXJfZ2V0Q0JveCAgRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMKLSNkZWZpbmUgRlRSZW5kZXJlcl9zZXRNb2RlICBGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyZXJfQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlbmRlcmVyIG1vZHVsZSBjbGFzcyBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgICAgIDo6IFRoZSByb290IEBGVF9Nb2R1bGVfQ2xhc3MgZmllbGRzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9mb3JtYXQgICAgOjogVGhlIGdseXBoIGltYWdlIGZvcm1hdCB0aGlzIHJlbmRlcmVyIGhhbmRsZXMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlbmRlcl9nbHlwaCAgICA6OiBBIG1ldGhvZCB1c2VkIHRvIHJlbmRlciB0aGUgaW1hZ2UgdGhhdCBpcyBpbiBhICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gZ2x5cGggc2xvdCBpbnRvIGEgYml0bWFwLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybV9nbHlwaCA6OiBBIG1ldGhvZCB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgaW1hZ2UgdGhhdCBpcyBpbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYSBnaXZlbiBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9nbHlwaF9jYm94ICA6OiBBIG1ldGhvZCB1c2VkIHRvIGFjY2VzcyB0aGUgZ2x5cGgncyBjYm94LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2V0X21vZGUgICAgICAgIDo6IEEgbWV0aG9kIHVzZWQgdG8gcGFzcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfY2xhc3MgICAgOjogRm9yIEBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSByZW5kZXJlcnMgb25seS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBwb2ludGVyIHRvIGl0cyByYXN0ZXIncyBjbGFzcy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgICAgICAgICAgOjogRm9yIEBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSByZW5kZXJlcnMgb25seS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJhc3RlciAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsIGlmIGFueS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1JlbmRlcmVyX0NsYXNzXwotICB7Ci0gICAgRlRfTW9kdWxlX0NsYXNzICAgICAgICAgICAgcm9vdDsKLQotICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgICAgIGdseXBoX2Zvcm1hdDsKLQotICAgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMgICAgIHJlbmRlcl9nbHlwaDsKLSAgICBGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jICB0cmFuc2Zvcm1fZ2x5cGg7Ci0gICAgRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMgICAgZ2V0X2dseXBoX2Nib3g7Ci0gICAgRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMgICAgc2V0X21vZGU7Ci0KLSAgICBGVF9SYXN0ZXJfRnVuY3MqICAgICAgICAgICByYXN0ZXJfY2xhc3M7Ci0KLSAgfSBGVF9SZW5kZXJlcl9DbGFzczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlcyB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgYSBnaXZlbiBnbHlwaCBmb3JtYXQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0ICA6OiBUaGUgZ2x5cGggZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSByZW5kZXJlciBoYW5kbGUuICAwIGlmIG5vbmUgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIG1vZHVsZSBhbHJlYWR5IGV4aXN0cyBieSB0aGF0IG5hbWUsICovCi0gIC8qICAgIG9yIGlmIHRoZSBtb2R1bGUgcmVxdWlyZXMgYSB2ZXJzaW9uIG9mIEZyZWVUeXBlIHRoYXQgaXMgdG9vIGdyZWF0LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gYWRkIGEgbmV3IHJlbmRlcmVyLCBzaW1wbHkgdXNlIEBGVF9BZGRfTW9kdWxlLiAgVG8gcmV0cmlldmUgYSAgICovCi0gIC8qICAgIHJlbmRlcmVyIGJ5IGl0cyBuYW1lLCB1c2UgQEZUX0dldF9Nb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9SZW5kZXJlciApCi0gIEZUX0dldF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX0Zvcm1hdCAgZm9ybWF0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRzIHRoZSBjdXJyZW50IHJlbmRlcmVyIHRvIHVzZSwgYW5kIHNldCBhZGRpdGlvbmFsIG1vZGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZW5kZXJlciAgIDo6IEEgaGFuZGxlIHRvIHRoZSByZW5kZXJlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1ldGVycyA6OiBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gY2FzZSBvZiBzdWNjZXNzLCB0aGUgcmVuZGVyZXIgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgZ2x5cGggICAgICovCi0gIC8qICAgIGltYWdlcyBpbiB0aGUgcmVuZGVyZXIncyBrbm93biBmb3JtYXQgaW50byBiaXRtYXBzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgY3VycmVudCByZW5kZXJlciBmb3Igb3RoZXIgZm9ybWF0cy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1JlbmRlcmVyKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcmVyICAgIHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1ldGVycyApOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUUkVOREVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHNpemVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyZGYxNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNpemVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc2l6ZSBvYmplY3RzIG1hbmFnZW1lbnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMywgMjAwNCwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUeXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIG5vcm1hbGx5IG5vdCBuZWVkIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMuICAgKi8KLSAgLyogSG93ZXZlciwgdGhleSBoYXZlIGJlZW4gcGxhY2VkIGluIGEgcHVibGljIEFQSSBmb3IgdGhlIHJhcmUgY2FzZXMgICAgICovCi0gIC8qIHdoZXJlIHRoZXkgYXJlIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUU0laRVNfSF9fCi0jZGVmaW5lIF9fRlRTSVpFU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplc19tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaXplIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYW5hZ2luZyBtdWx0aXBsZSBzaXplcyBwZXIgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIGNyZWF0aW5nIGEgbmV3IGZhY2Ugb2JqZWN0IChlLmcuLCB3aXRoIEBGVF9OZXdfRmFjZSksIGFuICAgICAgKi8KLSAgLyogICAgQEZUX1NpemUgb2JqZWN0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgdXNlZCB0byBzdG9yZSBhbGwgICAgICovCi0gIC8qICAgIHBpeGVsLXNpemUgZGVwZW5kZW50IGluZm9ybWF0aW9uLCBhdmFpbGFibGUgaW4gdGhlIGBmYWNlLT5zaXplJyAgICAqLwotICAvKiAgICBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IGlzIGhvd2V2ZXIgcG9zc2libGUgdG8gY3JlYXRlIG1vcmUgc2l6ZXMgZm9yIGEgZ2l2ZW4gZmFjZSwgICAgICAqLwotICAvKiAgICBtb3N0bHkgaW4gb3JkZXIgdG8gbWFuYWdlIHNldmVyYWwgY2hhcmFjdGVyIHBpeGVsIHNpemVzIG9mIHRoZSAgICAgKi8KLSAgLyogICAgc2FtZSBmb250IGZhbWlseSBhbmQgc3R5bGUuICBTZWUgQEZUX05ld19TaXplIGFuZCBARlRfRG9uZV9TaXplLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgQEZUX1NldF9QaXhlbF9TaXplcyBhbmQgQEZUX1NldF9DaGFyX1NpemUgb25seSAgICAgICAgICAgKi8KLSAgLyogICAgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBgYWN0aXZlJyBzaXplOyB5b3UgdGh1cyBuZWVkICAgICovCi0gIC8qICAgIHRvIHVzZSBARlRfQWN0aXZhdGVfU2l6ZSB0byBjaGFuZ2UgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgOTklIG9mIGFwcGxpY2F0aW9ucyB3b24ndCBuZWVkIHRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZSwgICAgICAgICovCi0gIC8qICAgIGVzcGVjaWFsbHkgaWYgdGhleSB1c2UgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSwgc28gYmUgY2F1dGlvdXMgICAgICAqLwotICAvKiAgICB3aGVuIHVzaW5nIHRoZXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IHNpemUgb2JqZWN0IGZyb20gYSBnaXZlbiBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNpemUgOjogQSBoYW5kbGUgdG8gYSBuZXcgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IG5lZWQgdG8gY2FsbCBARlRfQWN0aXZhdGVfU2l6ZSBpbiBvcmRlciB0byBzZWxlY3QgdGhlIG5ldyBzaXplICovCi0gIC8qICAgIGZvciB1cGNvbWluZyBjYWxscyB0byBARlRfU2V0X1BpeGVsX1NpemVzLCBARlRfU2V0X0NoYXJfU2l6ZSwgICAgICAqLwotICAvKiAgICBARlRfTG9hZF9HbHlwaCwgQEZUX0xvYWRfQ2hhciwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9OZXdfU2l6ZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICBGVF9TaXplKiAgc2l6ZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZCBhIGdpdmVuIHNpemUgb2JqZWN0LiAgTm90ZSB0aGF0IEBGVF9Eb25lX0ZhY2UgICAgICAgICAgICAgICovCi0gIC8qICAgIGF1dG9tYXRpY2FsbHkgZGlzY2FyZHMgYWxsIHNpemUgb2JqZWN0cyBhbGxvY2F0ZWQgd2l0aCAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTmV3X1NpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Eb25lX1NpemUoIEZUX1NpemUgIHNpemUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0FjdGl2YXRlX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEV2ZW4gdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBzZXZlcmFsIHNpemUgb2JqZWN0cyBmb3IgYSAgICAqLwotICAvKiAgICBnaXZlbiBmYWNlIChzZWUgQEZUX05ld19TaXplIGZvciBkZXRhaWxzKSwgZnVuY3Rpb25zIGxpa2UgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xvYWRfR2x5cGggb3IgQEZUX0xvYWRfQ2hhciBvbmx5IHVzZSB0aGUgbGFzdC1jcmVhdGVkIG9uZSB0byAgICovCi0gIC8qICAgIGRldGVybWluZSB0aGUgYGN1cnJlbnQgY2hhcmFjdGVyIHBpeGVsIHNpemUnLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBgYWN0aXZhdGUnIGEgcHJldmlvdXNseSBjcmVhdGVkIHNpemUgICovCi0gIC8qICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBmYWNlJyBpcyB0aGUgc2l6ZSdzIHBhcmVudCBmYWNlIG9iamVjdCwgdGhpcyBmdW5jdGlvbiBjaGFuZ2VzICAqLwotICAvKiAgICB0aGUgdmFsdWUgb2YgYGZhY2UtPnNpemUnIHRvIHRoZSBpbnB1dCBzaXplIGhhbmRsZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9BY3RpdmF0ZV9TaXplKCBGVF9TaXplICBzaXplICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUU0laRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwM2NiY2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c25hbWVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTaW1wbGUgaW50ZXJmYWNlIHRvIGFjY2VzcyBTRk5UIG5hbWUgdGFibGVzICh3aGljaCBhcmUgdXNlZCAgICAgICAgICAqLwotLyogICAgdG8gaG9sZCBmb250IG5hbWVzLCBjb3B5cmlnaHQgaW5mbywgbm90aWNlcywgZXRjLikgKHNwZWNpZmljYXRpb24pLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGlzIF9ub3RfIHVzZWQgdG8gcmV0cmlldmUgZ2x5cGggbmFtZXMhICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUX1NGTlRfTkFNRVNfSF9fCi0jZGVmaW5lIF9fRlRfU0ZOVF9OQU1FU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZm50X25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTRk5UIE5hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBY2Nlc3MgdGhlIG5hbWVzIGVtYmVkZGVkIGluIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmaWxlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gYWxsb3cgdGhlIGluY2x1c2lvbiBvZiAgICAgKi8KLSAgLyogICAgYSBzcGVjaWFsIGBuYW1lcyB0YWJsZScgaW4gZm9udCBmaWxlcy4gIFRoaXMgdGFibGUgY29udGFpbnMgICAgICAgICovCi0gIC8qICAgIHRleHR1YWwgKGFuZCBpbnRlcm5hdGlvbmFsaXplZCkgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBmb250LCAgICAqLwotICAvKiAgICBsaWtlIGZhbWlseSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlbSBpZiBhdmFpbGFibGUuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoaXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBnbHlwaCBuYW1lcyEgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnROYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYW4gU0ZOVCBgbmFtZScgdGFibGUgZW50cnkuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBsYXRmb3JtX2lkIDo6IFRoZSBwbGF0Zm9ybSBJRCBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW5jb2RpbmdfaWQgOjogVGhlIGVuY29kaW5nIElEIGZvciBgc3RyaW5nJy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsYW5ndWFnZV9pZCA6OiBUaGUgbGFuZ3VhZ2UgSUQgZm9yIGBzdHJpbmcnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWVfaWQgICAgIDo6IEFuIGlkZW50aWZpZXIgZm9yIGBzdHJpbmcnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nICAgICAgOjogVGhlIGBuYW1lJyBzdHJpbmcuICBOb3RlIHRoYXQgaXRzIGZvcm1hdCBkaWZmZXJzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgKHBsYXRmb3JtLGVuY29kaW5nKSBwYWlyLiAgSXQgY2FuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBiZSBhIFBhc2NhbCBTdHJpbmcsIGEgVVRGLTE2IG9uZSwgZXRjLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEdlbmVyYWxseSBzcGVha2luZywgdGhlIHN0cmluZyBpcyBub3QgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB6ZXJvLXRlcm1pbmF0ZWQuICBQbGVhc2UgcmVmZXIgdG8gdGhlIFRydWVUeXBlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmdfbGVuICA6OiBUaGUgbGVuZ3RoIG9mIGBzdHJpbmcnIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQb3NzaWJsZSB2YWx1ZXMgZm9yIGBwbGF0Zm9ybV9pZCcsIGBlbmNvZGluZ19pZCcsIGBsYW5ndWFnZV9pZCcsICAgKi8KLSAgLyogICAgYW5kIGBuYW1lX2lkJyBhcmUgZ2l2ZW4gaW4gdGhlIGZpbGUgYHR0bmFtZWlkLmgnLiAgRm9yIGRldGFpbHMgICAgICovCi0gIC8qICAgIHBsZWFzZSByZWZlciB0byB0aGUgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIGFsc28gQFRUX1BMQVRGT1JNX1hYWCwgQFRUX0FQUExFX0lEX1hYWCwgQFRUX01BQ19JRF9YWFgsICAgICAgICovCi0gIC8qICAgIEBUVF9JU09fSURfWFhYLCBhbmQgQFRUX01TX0lEX1hYWC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NmbnROYW1lXwotICB7Ci0gICAgRlRfVVNob3J0ICBwbGF0Zm9ybV9pZDsKLSAgICBGVF9VU2hvcnQgIGVuY29kaW5nX2lkOwotICAgIEZUX1VTaG9ydCAgbGFuZ3VhZ2VfaWQ7Ci0gICAgRlRfVVNob3J0ICBuYW1lX2lkOwotCi0gICAgRlRfQnl0ZSogICBzdHJpbmc7ICAgICAgLyogdGhpcyBzdHJpbmcgaXMgKm5vdCogbnVsbC10ZXJtaW5hdGVkISAqLwotICAgIEZUX1VJbnQgICAgc3RyaW5nX2xlbjsgIC8qIGluIGJ5dGVzICovCi0KLSAgfSBGVF9TZm50TmFtZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X05hbWVfQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIG5hbWUgc3RyaW5ncyBpbiB0aGUgU0ZOVCBgbmFtZScgdGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgYG5hbWUnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50ICkKLSAgRlRfR2V0X1NmbnRfTmFtZV9Db3VudCggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1NmbnRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmVzIGEgc3RyaW5nIG9mIHRoZSBTRk5UIGBuYW1lJyB0YWJsZSBmb3IgYSBnaXZlbiBpbmRleC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggICA6OiBUaGUgaW5kZXggb2YgdGhlIGBuYW1lJyBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbmFtZSA6OiBUaGUgaW5kZXhlZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYHN0cmluZycgYXJyYXkgcmV0dXJuZWQgaW4gdGhlIGBhbmFtZScgc3RydWN0dXJlIGlzIG5vdCAgICAgICAgKi8KLSAgLyogICAgbnVsbC10ZXJtaW5hdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2UgQEZUX0dldF9TZm50X05hbWVfQ291bnQgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlICAgKi8KLSAgLyogICAgYG5hbWUnIHRhYmxlIGVudHJpZXMsIHRoZW4gZG8gYSBsb29wIHVudGlsIHlvdSBnZXQgdGhlIHJpZ2h0ICAgICAgICovCi0gIC8qICAgIHBsYXRmb3JtLCBlbmNvZGluZywgYW5kIG5hbWUgSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9TZm50X05hbWUoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1NmbnROYW1lICAqYW5hbWUgKTsKLQotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVF9TRk5UX05BTUVTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmUzMTIwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN0cm9rZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgcGF0aCBzdHJva2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDggYnkgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVF9TVFJPS0VfSF9fCi0jZGVmaW5lIF9fRlRfU1RST0tFX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfR0xZUEhfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAc2VjdGlvbjoKLSAgKiAgICBnbHlwaF9zdHJva2VyCi0gICoKLSAgKiBAdGl0bGU6Ci0gICogICAgR2x5cGggU3Ryb2tlcgotICAqCi0gICogQGFic3RyYWN0OgotICAqICAgIEdlbmVyYXRpbmcgYm9yZGVyZWQgYW5kIHN0cm9rZWQgZ2x5cGhzLgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFRoaXMgY29tcG9uZW50IGdlbmVyYXRlcyBzdHJva2VkIG91dGxpbmVzIG9mIGEgZ2l2ZW4gdmVjdG9yaWFsCi0gICogICAgZ2x5cGguICBJdCBhbHNvIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIGBvdXRzaWRlJyBhbmQvb3IgdGhlCi0gICogICAgYGluc2lkZScgYm9yZGVycyBvZiB0aGUgc3Ryb2tlLgotICAqCi0gICogICAgVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGdlbmVyYXRlIGBib3JkZXJlZCcgZ2x5cGgsIGkuZS4sIGdseXBocwotICAqICAgIGRpc3BsYXllZCB3aXRoIGEgY29sb3VyZWQgKGFuZCBhbnRpLWFsaWFzZWQpIGJvcmRlciBhcm91bmQgdGhlaXIKLSAgKiAgICBzaGFwZS4KLSAgKi8KLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAdHlwZToKLSAgKiAgIEZUX1N0cm9rZXIKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIE9wYXF1ZSBoYW5kbGVyIHRvIGEgcGF0aCBzdHJva2VyIG9iamVjdC4KLSAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU3Ryb2tlclJlY18qICBGVF9TdHJva2VyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX1N0cm9rZXJfTGluZUpvaW4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZXNlIHZhbHVlcyBkZXRlcm1pbmUgaG93IHR3byBqb2luaW5nIGxpbmVzIGFyZSByZW5kZXJlZAotICAgKiAgIGluIGEgc3Ryb2tlci4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX1JPVU5EIDo6Ci0gICAqICAgICBVc2VkIHRvIHJlbmRlciByb3VuZGVkIGxpbmUgam9pbnMuICBDaXJjdWxhciBhcmNzIGFyZSB1c2VkCi0gICAqICAgICB0byBqb2luIHR3byBsaW5lcyBzbW9vdGhseS4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX0JFVkVMIDo6Ci0gICAqICAgICBVc2VkIHRvIHJlbmRlciBiZXZlbGVkIGxpbmUgam9pbnM7IGkuZS4sIHRoZSB0d28gam9pbmluZyBsaW5lcwotICAgKiAgICAgYXJlIGV4dGVuZGVkIHVudGlsIHRoZXkgaW50ZXJzZWN0LgotICAgKgotICAgKiAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVIgOjoKLSAgICogICAgIFNhbWUgYXMgYmV2ZWxlZCByZW5kZXJpbmcsIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgbGluZQotICAgKiAgICAgYnJlYWsgaXMgYWRkZWQgaWYgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHR3byBqb2luaW5nIGxpbmVzCi0gICAqICAgICBpcyB0b28gY2xvc2VkICh0aGlzIGlzIHVzZWZ1bCB0byBhdm9pZCB1bnBsZWFzYW50IHNwaWtlcwotICAgKiAgICAgaW4gYmV2ZWxlZCByZW5kZXJpbmcpLgotICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9TdHJva2VyX0xpbmVKb2luXwotICB7Ci0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9ST1VORCA9IDAsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9CRVZFTCwKLSAgICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSCi0KLSAgfSBGVF9TdHJva2VyX0xpbmVKb2luOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX1N0cm9rZXJfTGluZUNhcAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlc2UgdmFsdWVzIGRldGVybWluZSBob3cgdGhlIGVuZCBvZiBvcGVuZWQgc3ViLXBhdGhzIGFyZQotICAgKiAgIHJlbmRlcmVkIGluIGEgc3Ryb2tlLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX1NUUk9LRVJfTElORUNBUF9CVVRUIDo6Ci0gICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgZnVsbCBzdG9wIG9uIHRoZSBsYXN0Ci0gICAqICAgICBwb2ludCBpdHNlbGYuCi0gICAqCi0gICAqICAgRlRfU1RST0tFUl9MSU5FQ0FQX1JPVU5EIDo6Ci0gICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgaGFsZi1jaXJjbGUgYXJvdW5kIHRoZQotICAgKiAgICAgbGFzdCBwb2ludC4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFIDo6Ci0gICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgc3F1YXJlIGFyb3VuZCB0aGUKLSAgICogICAgIGxhc3QgcG9pbnQuCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1N0cm9rZXJfTGluZUNhcF8KLSAgewotICAgIEZUX1NUUk9LRVJfTElORUNBUF9CVVRUID0gMCwKLSAgICBGVF9TVFJPS0VSX0xJTkVDQVBfUk9VTkQsCi0gICAgRlRfU1RST0tFUl9MSU5FQ0FQX1NRVUFSRQotCi0gIH0gRlRfU3Ryb2tlcl9MaW5lQ2FwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX1N0cm9rZXJCb3JkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBzZWxlY3QgYSBnaXZlbiBzdHJva2UgYm9yZGVyCi0gICAqICAgaW4gQEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzIGFuZCBARlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfU1RST0tFUl9CT1JERVJfTEVGVCA6OgotICAgKiAgICAgU2VsZWN0IHRoZSBsZWZ0IGJvcmRlciwgcmVsYXRpdmUgdG8gdGhlIGRyYXdpbmcgZGlyZWN0aW9uLgotICAgKgotICAgKiAgIEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUIDo6Ci0gICAqICAgICBTZWxlY3QgdGhlIHJpZ2h0IGJvcmRlciwgcmVsYXRpdmUgdG8gdGhlIGRyYXdpbmcgZGlyZWN0aW9uLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBBcHBsaWNhdGlvbnMgYXJlIGdlbmVyYWxseSBpbnRlcmVzdGVkIGluIHRoZSBgaW5zaWRlJyBhbmQgYG91dHNpZGUnCi0gICAqICAgYm9yZGVycy4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGRpcmVjdCBtYXBwaW5nIGJldHdlZW4gdGhlc2UgYW5kIHRoZQotICAgKiAgIGBsZWZ0JyBhbmQgYHJpZ2h0JyBvbmVzLCBzaW5jZSB0aGlzIHJlYWxseSBkZXBlbmRzIG9uIHRoZSBnbHlwaCdzCi0gICAqICAgZHJhd2luZyBvcmllbnRhdGlvbiwgd2hpY2ggdmFyaWVzIGJldHdlZW4gZm9udCBmb3JtYXRzLgotICAgKgotICAgKiAgIFlvdSBjYW4gaG93ZXZlciB1c2UgQEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyIGFuZAotICAgKiAgIEBGVF9PdXRsaW5lX0dldE91dHNpZGVCb3JkZXIgdG8gZ2V0IHRoZXNlLgotICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9TdHJva2VyQm9yZGVyXwotICB7Ci0gICAgRlRfU1RST0tFUl9CT1JERVJfTEVGVCA9IDAsCi0gICAgRlRfU1RST0tFUl9CT1JERVJfUklHSFQKLQotICB9IEZUX1N0cm9rZXJCb3JkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICBgaW5zaWRlJyBib3JkZXJzIG9mIGEgZ2l2ZW4gb3V0bGluZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG91dGxpbmUgOjoKLSAgICogICAgIFRoZSBzb3VyY2Ugb3V0bGluZSBoYW5kbGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIGJvcmRlciBpbmRleC4gIEBGVF9TVFJPS0VSX0JPUkRFUl9MRUZUIGZvciBlbXB0eSBvciBpbnZhbGlkCi0gICAqICAgb3V0bGluZXMuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX1N0cm9rZXJCb3JkZXIgKQotICBGVF9PdXRsaW5lX0dldEluc2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICBgb3V0c2lkZScgYm9yZGVycyBvZiBhIGdpdmVuIG91dGxpbmUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBvdXRsaW5lIDo6Ci0gICAqICAgICBUaGUgc291cmNlIG91dGxpbmUgaGFuZGxlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSBib3JkZXIgaW5kZXguICBARlRfU1RST0tFUl9CT1JERVJfTEVGVCBmb3IgZW1wdHkgb3IgaW52YWxpZAotICAgKiAgIG91dGxpbmVzLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9TdHJva2VyQm9yZGVyICkKLSAgRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX05ldwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ3JlYXRlIGEgbmV3IHN0cm9rZXIgb2JqZWN0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbGlicmFyeSA6OgotICAgKiAgICAgRnJlZVR5cGUgbGlicmFyeSBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYXN0cm9rZXIgOjoKLSAgICogICAgIEEgbmV3IHN0cm9rZXIgb2JqZWN0IGhhbmRsZS4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX05ldyggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAqYXN0cm9rZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9TZXQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJlc2V0IGEgc3Ryb2tlciBvYmplY3QncyBhdHRyaWJ1dGVzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICByYWRpdXMgOjoKLSAgICogICAgIFRoZSBib3JkZXIgcmFkaXVzLgotICAgKgotICAgKiAgIGxpbmVfY2FwIDo6Ci0gICAqICAgICBUaGUgbGluZSBjYXAgc3R5bGUuCi0gICAqCi0gICAqICAgbGluZV9qb2luIDo6Ci0gICAqICAgICBUaGUgbGluZSBqb2luIHN0eWxlLgotICAgKgotICAgKiAgIG1pdGVyX2xpbWl0IDo6Ci0gICAqICAgICBUaGUgbWl0ZXIgbGltaXQgZm9yIHRoZSBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSIHN0eWxlLAotICAgKiAgICAgZXhwcmVzc2VkIGFzIDE2LjE2IGZpeGVkIHBvaW50IHZhbHVlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgcmFkaXVzIGlzIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB1bml0cyB0aGF0IHRoZSBvdXRsaW5lCi0gICAqICAgY29vcmRpbmF0ZXMuCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TdHJva2VyX1NldCggRlRfU3Ryb2tlciAgICAgICAgICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJfTGluZUNhcCAgIGxpbmVfY2FwLAotICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlcl9MaW5lSm9pbiAgbGluZV9qb2luLAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICAgICAgICAgbWl0ZXJfbGltaXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9SZXdpbmQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJlc2V0IGEgc3Ryb2tlciBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBpdHMgYXR0cmlidXRlcy4KLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgYmVnaW5uaW5nIGEgbmV3Ci0gICAqICAgc2VyaWVzIG9mIGNhbGxzIHRvIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBvcgotICAgKiAgIEBGVF9TdHJva2VyX0VuZFN1YlBhdGguCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9SZXdpbmQoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZCB0byBwYXJzZSBhIHdob2xlIG91dGxpbmUgd2l0aAotICAgKiAgIHRoZSBzdHJva2VyLiAgVGhlIHJlc3VsdGluZyBvdXRsaW5lKHMpIGNhbiBiZSByZXRyaWV2ZWQKLSAgICogICBsYXRlciBieSBmdW5jdGlvbnMgbGlrZSBARlRfU3Ryb2tlcl9HZXRDb3VudHMgYW5kIEBGVF9TdHJva2VyX0V4cG9ydC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBvdXRsaW5lLgotICAgKgotICAgKiAgIG9wZW5lZCA6OgotICAgKiAgICAgQSBib29sZWFuLiAgSWYgMSwgdGhlIG91dGxpbmUgaXMgdHJlYXRlZCBhcyBhbiBvcGVuIHBhdGggaW5zdGVhZAotICAgKiAgICAgb2YgYSBjbG9zZWQgb25lLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIGBvcGVuZWQnIGlzIDAgKHRoZSBkZWZhdWx0KSwgdGhlIG91dGxpbmUgaXMgdHJlYXRlZCBhcyBhIGNsb3NlZAotICAgKiAgIHBhdGgsIGFuZCB0aGUgc3Ryb2tlciB3aWxsIGdlbmVyYXRlIHR3byBkaXN0aW5jdCBgYm9yZGVyJyBvdXRsaW5lcy4KLSAgICoKLSAgICogICBJZiBgb3BlbmVkJyBpcyAxLCB0aGUgb3V0bGluZSBpcyBwcm9jZXNzZWQgYXMgYW4gb3BlbiBwYXRoLCBhbmQgdGhlCi0gICAqICAgc3Ryb2tlciB3aWxsIGdlbmVyYXRlIGEgc2luZ2xlIGBzdHJva2UnIG91dGxpbmUuCi0gICAqCi0gICAqICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfU3Ryb2tlcl9SZXdpbmQgYXV0b21hdGljYWxseS4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBvcGVuZWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFN0YXJ0IGEgbmV3IHN1Yi1wYXRoIGluIHRoZSBzdHJva2VyLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICB0byA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBzdGFydCB2ZWN0b3IuCi0gICAqCi0gICAqICAgb3BlbiA6OgotICAgKiAgICAgQSBib29sZWFuLiAgSWYgMSwgdGhlIHN1Yi1wYXRoIGlzIHRyZWF0ZWQgYXMgYW4gb3BlbiBvbmUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0byBzdHJva2UgYSBwYXRoIHRoYXQgaXMKLSAgICogICBub3Qgc3RvcmVkIGFzIGFuIEBGVF9PdXRsaW5lIG9iamVjdC4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgb3BlbiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0VuZFN1YlBhdGgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENsb3NlIHRoZSBjdXJyZW50IHN1Yi1wYXRoIGluIHRoZSBzdHJva2VyLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGguCi0gICAqICAgSWYgdGhlIHN1YnBhdGggd2FzIG5vdCBgb3BlbmVkJywgdGhpcyBmdW5jdGlvbiB3aWxsIGBkcmF3JyBhCi0gICAqICAgc2luZ2xlIGxpbmUgc2VnbWVudCB0byB0aGUgc3RhcnQgcG9zaXRpb24gd2hlbiBuZWVkZWQuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoKCBGVF9TdHJva2VyICBzdHJva2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfTGluZVRvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBgRHJhdycgYSBzaW5nbGUgbGluZSBzZWdtZW50IGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKLSAgICogICBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICB0byA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBwb2ludC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZXR3ZWVuIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBhbmQKLSAgICogICBARlRfU3Ryb2tlcl9FbmRTdWJQYXRoLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfTGluZVRvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9Db25pY1RvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBgRHJhdycgYSBzaW5nbGUgcXVhZHJhdGljIELDqXppZXIgaW4gdGhlIHN0cm9rZXIncyBjdXJyZW50IHN1Yi1wYXRoLAotICAgKiAgIGZyb20gdGhlIGxhc3QgcG9zaXRpb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGNvbnRyb2wgOjoKLSAgICogICAgIEEgcG9pbnRlciB0byBhIELDqXppZXIgY29udHJvbCBwb2ludC4KLSAgICoKLSAgICogICB0byA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBwb2ludC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZXR3ZWVuIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBhbmQKLSAgICogICBARlRfU3Ryb2tlcl9FbmRTdWJQYXRoLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQ29uaWNUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfQ3ViaWNUbwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgYERyYXcnIGEgc2luZ2xlIGN1YmljIELDqXppZXIgaW4gdGhlIHN0cm9rZXIncyBjdXJyZW50IHN1Yi1wYXRoLAotICAgKiAgIGZyb20gdGhlIGxhc3QgcG9zaXRpb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGNvbnRyb2wxIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IELDqXppZXIgY29udHJvbCBwb2ludC4KLSAgICoKLSAgICogICBjb250cm9sMiA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHNlY29uZCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuCi0gICAqCi0gICAqICAgdG8gOjoKLSAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcG9pbnQuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmV0d2VlbiBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggYW5kCi0gICAqICAgQEZUX1N0cm9rZXJfRW5kU3ViUGF0aC4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0N1YmljVG8oIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIHlvdSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgeW91ciBwYXRocwotICAgKiAgIHdpdGggdGhlIHN0cm9rZXIuICBJdCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHBvaW50cyBhbmQKLSAgICogICBjb250b3VycyBuZWNlc3NhcnkgdG8gZXhwb3J0IG9uZSBvZiB0aGUgYGJvcmRlcicgb3IgYHN0cm9rZScKLSAgICogICBvdXRsaW5lcyBnZW5lcmF0ZWQgYnkgdGhlIHN0cm9rZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGJvcmRlciA6OgotICAgKiAgICAgVGhlIGJvcmRlciBpbmRleC4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBhbnVtX3BvaW50cyA6OgotICAgKiAgICAgVGhlIG51bWJlciBvZiBwb2ludHMuCi0gICAqCi0gICAqICAgYW51bV9jb250b3VycyA6OgotICAgKiAgICAgVGhlIG51bWJlciBvZiBjb250b3Vycy4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBXaGVuIGFuIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBjbG9zZWQnLCB0aGUgc3Ryb2tlciBnZW5lcmF0ZXMKLSAgICogICB0d28gaW5kZXBlbmRlbnQgYGJvcmRlcicgb3V0bGluZXMsIG5hbWVkIGBsZWZ0JyBhbmQgYHJpZ2h0Jy4KLSAgICoKLSAgICogICBXaGVuIHRoZSBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgb3BlbmVkJywgdGhlIHN0cm9rZXIgbWVyZ2VzCi0gICAqICAgdGhlIGBib3JkZXInIG91dGxpbmVzIHdpdGggY2Fwcy4gIFRoZSBgbGVmdCcgYm9yZGVyIHJlY2VpdmVzIGFsbAotICAgKiAgIHBvaW50cywgd2hpbGUgdGhlIGByaWdodCcgYm9yZGVyIGJlY29tZXMgZW1wdHkuCi0gICAqCi0gICAqICAgVXNlIHRoZSBmdW5jdGlvbiBARlRfU3Ryb2tlcl9HZXRDb3VudHMgaW5zdGVhZCBpZiB5b3Ugd2FudCB0bwotICAgKiAgIHJldHJpZXZlIHRoZSBjb3VudHMgYXNzb2NpYXRlZCB0byBib3RoIGJvcmRlcnMuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMoIEZUX1N0cm9rZXIgICAgICAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICphbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgKmFudW1fY29udG91cnMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgdG8KLSAgICogICBleHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgYm9yZGVyIHRvIHlvdXIgb3duIEBGVF9PdXRsaW5lCi0gICAqICAgc3RydWN0dXJlLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgYXBwZW5kIHRoZSBib3JkZXIgcG9pbnRzIGFuZAotICAgKiAgIGNvbnRvdXJzIHRvIHlvdXIgb3V0bGluZSwgYnV0IHdpbGwgbm90IHRyeSB0byByZXNpemUgaXRzCi0gICAqICAgYXJyYXlzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBib3JkZXIgOjoKLSAgICogICAgIFRoZSBib3JkZXIgaW5kZXguCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHRhcmdldCBvdXRsaW5lIGhhbmRsZS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgQWx3YXlzIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgdG8KLSAgICogICBnZXQgc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHlvdXIgQEZUX091dGxpbmUgb2JqZWN0IHRvCi0gICAqICAgcmVjZWl2ZSBhbGwgbmV3IGRhdGEuCi0gICAqCi0gICAqICAgV2hlbiBhbiBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgY2xvc2VkJywgdGhlIHN0cm9rZXIgZ2VuZXJhdGVzCi0gICAqICAgdHdvIGluZGVwZW5kZW50IGBib3JkZXInIG91dGxpbmVzLCBuYW1lZCBgbGVmdCcgYW5kIGByaWdodCcKLSAgICoKLSAgICogICBXaGVuIHRoZSBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgb3BlbmVkJywgdGhlIHN0cm9rZXIgbWVyZ2VzCi0gICAqICAgdGhlIGBib3JkZXInIG91dGxpbmVzIHdpdGggY2Fwcy4gVGhlIGBsZWZ0JyBib3JkZXIgcmVjZWl2ZXMgYWxsCi0gICAqICAgcG9pbnRzLCB3aGlsZSB0aGUgYHJpZ2h0JyBib3JkZXIgYmVjb21lcyBlbXB0eS4KLSAgICoKLSAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0V4cG9ydCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvCi0gICAqICAgcmV0cmlldmUgYWxsIGJvcmRlcnMgYXQgb25jZS4KLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBGVF9TdHJva2VyICAgICAgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlckJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0dldENvdW50cwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UgeW91IGhhdmUgZmluaXNoZWQgcGFyc2luZyB5b3VyIHBhdGhzCi0gICAqICAgd2l0aCB0aGUgc3Ryb2tlci4gIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBwb2ludHMgYW5kCi0gICAqICAgY29udG91cnMgbmVjZXNzYXJ5IHRvIGV4cG9ydCBhbGwgcG9pbnRzL2JvcmRlcnMgZnJvbSB0aGUgc3Ryb2tlZAotICAgKiAgIG91dGxpbmUvcGF0aC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYW51bV9wb2ludHMgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgcG9pbnRzLgotICAgKgotICAgKiAgIGFudW1fY29udG91cnMgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgY29udG91cnMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0dldENvdW50cyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgKmFudW1fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAqYW51bV9jb250b3VycyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0V4cG9ydAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0bwotICAgKiAgIGV4cG9ydCB0aGUgYWxsIGJvcmRlcnMgdG8geW91ciBvd24gQEZUX091dGxpbmUgc3RydWN0dXJlLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgYXBwZW5kIHRoZSBib3JkZXIgcG9pbnRzIGFuZAotICAgKiAgIGNvbnRvdXJzIHRvIHlvdXIgb3V0bGluZSwgYnV0IHdpbGwgbm90IHRyeSB0byByZXNpemUgaXRzCi0gICAqICAgYXJyYXlzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBvdXRsaW5lIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IG91dGxpbmUgaGFuZGxlLgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9FeHBvcnQoIEZUX1N0cm9rZXIgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9Eb25lCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBEZXN0cm95IGEgc3Ryb2tlciBvYmplY3QuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBBIHN0cm9rZXIgaGFuZGxlLiAgQ2FuIGJlIE5VTEwuCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TdHJva2VyX0RvbmUoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfR2x5cGhfU3Ryb2tlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBTdHJva2UgYSBnaXZlbiBvdXRsaW5lIGdseXBoIG9iamVjdCB3aXRoIGEgZ2l2ZW4gc3Ryb2tlci4KLSAgICoKLSAgICogQGlub3V0OgotICAgKiAgIHBnbHlwaCA6OgotICAgKiAgICAgU291cmNlIGdseXBoIGhhbmRsZSBvbiBpbnB1dCwgbmV3IGdseXBoIGhhbmRsZSBvbiBvdXRwdXQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBBIHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGRlc3Ryb3kgOjoKLSAgICogICAgIEEgQm9vbGVhbi4gIElmIDEsIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0IGlzIGRlc3Ryb3llZAotICAgKiAgICAgb24gc3VjY2Vzcy4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIHNvdXJjZSBnbHlwaCBpcyB1bnRvdWNoZWQgaW4gY2FzZSBvZiBlcnJvci4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9TdHJva2UoIEZUX0dseXBoICAgICpwZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGRlc3Ryb3kgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfR2x5cGhfU3Ryb2tlQm9yZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBTdHJva2UgYSBnaXZlbiBvdXRsaW5lIGdseXBoIG9iamVjdCB3aXRoIGEgZ2l2ZW4gc3Ryb2tlciwgYnV0Ci0gICAqICAgb25seSByZXR1cm4gZWl0aGVyIGl0cyBpbnNpZGUgb3Igb3V0c2lkZSBib3JkZXIuCi0gICAqCi0gICAqIEBpbm91dDoKLSAgICogICBwZ2x5cGggOjoKLSAgICogICAgIFNvdXJjZSBnbHlwaCBoYW5kbGUgb24gaW5wdXQsIG5ldyBnbHlwaCBoYW5kbGUgb24gb3V0cHV0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBpbnNpZGUgOjoKLSAgICogICAgIEEgQm9vbGVhbi4gIElmIDEsIHJldHVybiB0aGUgaW5zaWRlIGJvcmRlciwgb3RoZXJ3aXNlCi0gICAqICAgICB0aGUgb3V0c2lkZSBib3JkZXIuCi0gICAqCi0gICAqICAgZGVzdHJveSA6OgotICAgKiAgICAgQSBCb29sZWFuLiAgSWYgMSwgdGhlIHNvdXJjZSBnbHlwaCBvYmplY3QgaXMgZGVzdHJveWVkCi0gICAqICAgICBvbiBzdWNjZXNzLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgc291cmNlIGdseXBoIGlzIHVudG91Y2hlZCBpbiBjYXNlIG9mIGVycm9yLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1N0cm9rZUJvcmRlciggRlRfR2x5cGggICAgKnBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgaW5zaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBkZXN0cm95ICk7Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUX1NUUk9LRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk4NGJmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeW50aC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN5bnRoZXNpemluZyBjb2RlIGZvciBlbWJvbGRlbmluZyBhbmQgc2xhbnRpbmcgICAgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDAxLCAyMDAzLCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqICAgICAgICBXQVJOSU5HLCBUSElTIElTIEFMUEhBIENPREUsIFRISVMgQVBJICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiAgICBJUyBEVUUgVE8gQ0hBTkdFIFVOVElMIFNUUklDVExZIE5PVElGSUVEIEJZIFRIRSAgICAqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgICAgICAgICBGUkVFVFlQRSBERVZFTE9QTUVOVCBURUFNICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNZTlRIX0hfXwotI2RlZmluZSBfX0ZUU1lOVEhfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qIE1ha2Ugc3VyZSBzbG90IG93bnMgc2xvdC0+Yml0bWFwLiAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhTbG90X093bl9CaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gIC8qIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSEgIENvcHkgdGhlIGNvZGUgdG8gKi8KLSAgLyogeW91ciBhcHBsaWNhdGlvbiBhbmQgbW9kaWZ5IGl0IHRvIHN1aXQgeW91ciBuZWVkLiAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9HbHlwaFNsb3RfRW1ib2xkZW4oIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfR2x5cGhTbG90X09ibGlxdWUoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFNZTlRIX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHN5c3RlbS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHN5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWNkMDE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN5c3RlbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgZGVmaW5pdGlvbiAoc3BlY2lmaWNhdGlvbikuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNZU1RFTV9IX18KLSNkZWZpbmUgX19GVFNZU1RFTV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3lzdGVtX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU3lzdGVtIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSG93IEZyZWVUeXBlIG1hbmFnZXMgbWVtb3J5IGFuZCBpL28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHZhcmlvdXMgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBtZW1vcnkgICAgICAgICAqLwotICAvKiAgIG1hbmFnZW1lbnQgYW5kIGkvbyBhY2Nlc3MuICBZb3UgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgICAgICAgICAgICAgKi8KLSAgLyogICBpbmZvcm1hdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgYSBjdXN0b20gbWVtb3J5IG1hbmFnZXIgb3IgeW91IG93biAgICovCi0gIC8qICAgaS9vIHN0cmVhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9NZW1vcnkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gbWVtb3J5IG1hbmFnZXIgb2JqZWN0LCBkZWZpbmVkIHdpdGggYW4KLSAgICogICBARlRfTWVtb3J5UmVjIHN0cnVjdHVyZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX01lbW9yeVJlY18qICBGVF9NZW1vcnk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfQWxsb2NfRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIGFsbG9jYXRlIGBzaXplJyBieXRlcyBmcm9tIGBtZW1vcnknLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbWVtb3J5IDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIG1lbW9yeSBtYW5hZ2VyLgotICAgKgotICAgKiAgIHNpemUgOjoKLSAgICogICAgIFRoZSBzaXplIGluIGJ5dGVzIHRvIGFsbG9jYXRlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEFkZHJlc3Mgb2YgbmV3IG1lbW9yeSBibG9jay4gIDAgaW4gY2FzZSBvZiBmYWlsdXJlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkKgotICAoKkZUX0FsbG9jX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfRnJlZV9GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVsZWFzZSBhIGdpdmVuIGJsb2NrIG9mIG1lbW9yeS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG1lbW9yeSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBtZW1vcnkgbWFuYWdlci4KLSAgICoKLSAgICogICBibG9jayA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBtZW1vcnkgYmxvY2suCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9GcmVlX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfUmVhbGxvY19GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmUtYWxsb2NhdGUgYSBnaXZlbiBibG9jayBvZiBtZW1vcnkuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBtZW1vcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgbWVtb3J5IG1hbmFnZXIuCi0gICAqCi0gICAqICAgY3VyX3NpemUgOjoKLSAgICogICAgIFRoZSBibG9jaydzIGN1cnJlbnQgc2l6ZSBpbiBieXRlcy4KLSAgICoKLSAgICogICBuZXdfc2l6ZSA6OgotICAgKiAgICAgVGhlIGJsb2NrJ3MgcmVxdWVzdGVkIG5ldyBzaXplLgotICAgKgotICAgKiAgIGJsb2NrIDo6Ci0gICAqICAgICBUaGUgYmxvY2sncyBjdXJyZW50IGFkZHJlc3MuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgTmV3IGJsb2NrIGFkZHJlc3MuICAwIGluIGNhc2Ugb2YgbWVtb3J5IHNob3J0YWdlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJbiBjYXNlIG9mIGVycm9yLCB0aGUgb2xkIGJsb2NrIG11c3Qgc3RpbGwgYmUgYXZhaWxhYmxlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkKgotICAoKkZUX1JlYWxsb2NfRnVuYykoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBuZXdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX01lbW9yeVJlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdpdmVuIG1lbW9yeSBtYW5hZ2VyIHRvIEZyZWVUeXBlIDIuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgdXNlciA6OgotICAgKiAgICAgQSBnZW5lcmljIHR5cGVsZXNzIHBvaW50ZXIgZm9yIHVzZXIgZGF0YS4KLSAgICoKLSAgICogICBhbGxvYyA6OgotICAgKiAgICAgQSBwb2ludGVyIHR5cGUgdG8gYW4gYWxsb2NhdGlvbiBmdW5jdGlvbi4KLSAgICoKLSAgICogICBmcmVlIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdHlwZSB0byBhbiBtZW1vcnkgZnJlZWluZyBmdW5jdGlvbi4KLSAgICoKLSAgICogICByZWFsbG9jIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdHlwZSB0byBhIHJlYWxsb2NhdGlvbiBmdW5jdGlvbi4KLSAgICoKLSAgICovCi0gIHN0cnVjdCAgRlRfTWVtb3J5UmVjXwotICB7Ci0gICAgdm9pZCogICAgICAgICAgICB1c2VyOwotICAgIEZUX0FsbG9jX0Z1bmMgICAgYWxsb2M7Ci0gICAgRlRfRnJlZV9GdW5jICAgICBmcmVlOwotICAgIEZUX1JlYWxsb2NfRnVuYyAgcmVhbGxvYzsKLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEkgLyBPICAgTSBBIE4gQSBHIEUgTSBFIE4gVCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX1N0cmVhbQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBoYW5kbGUgdG8gYW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU3RyZWFtUmVjXyogIEZUX1N0cmVhbTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfU3RyZWFtRGVzYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSB1bmlvbiB0eXBlIHVzZWQgdG8gc3RvcmUgZWl0aGVyIGEgbG9uZyBvciBhIHBvaW50ZXIuICBUaGlzIGlzIHVzZWQKLSAgICogICB0byBzdG9yZSBhIGZpbGUgZGVzY3JpcHRvciBvciBhIGBGSUxFKicgaW4gYW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB1bmlvbiAgRlRfU3RyZWFtRGVzY18KLSAgewotICAgIGxvbmcgICB2YWx1ZTsKLSAgICB2b2lkKiAgcG9pbnRlcjsKLQotICB9IEZUX1N0cmVhbURlc2M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfU3RyZWFtX0lvRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHNlZWsgYW5kIHJlYWQgZGF0YSBmcm9tIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3RyZWFtIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIHN0cmVhbS4KLSAgICoKLSAgICogICBvZmZzZXQgOjoKLSAgICogICAgIFRoZSBvZmZzZXQgb2YgcmVhZCBpbiBzdHJlYW0gKGFsd2F5cyBmcm9tIHN0YXJ0KS4KLSAgICoKLSAgICogICBidWZmZXIgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRoZSByZWFkIGJ1ZmZlci4KLSAgICoKLSAgICogICBjb3VudCA6OgotICAgKiAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGVmZmVjdGl2ZWx5IHJlYWQgYnkgdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgdG8gcGVyZm9ybSBhIHNlZWsgb3Igc2tpcCBvcGVyYXRpb24KLSAgICogICB3aXRoIGEgYGNvdW50JyBvZiAwLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nCi0gICgqRlRfU3RyZWFtX0lvRnVuYykoIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBjb3VudCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIEZUX1N0cmVhbV9DbG9zZUZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBjbG9zZSBhIGdpdmVuIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgc3RyZWFtIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1N0cmVhbV9DbG9zZUZ1bmMpKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVF9TdHJlYW1SZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgYmFzZSA6OgotICAgKiAgICAgRm9yIG1lbW9yeS1iYXNlZCBzdHJlYW1zLCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBzdHJlYW0KLSAgICogICAgIGJ5dGUgaW4gbWVtb3J5LiAgVGhpcyBmaWVsZCBzaG91bGQgYWx3YXlzIGJlIHNldCB0byBOVUxMIGZvcgotICAgKiAgICAgZGlzay1iYXNlZCBzdHJlYW1zLgotICAgKgotICAgKiAgIHNpemUgOjoKLSAgICogICAgIFRoZSBzdHJlYW0gc2l6ZSBpbiBieXRlcy4KLSAgICoKLSAgICogICBwb3MgOjoKLSAgICogICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLgotICAgKgotICAgKiAgIGRlc2NyaXB0b3IgOjoKLSAgICogICAgIFRoaXMgZmllbGQgaXMgYSB1bmlvbiB0aGF0IGNhbiBob2xkIGFuIGludGVnZXIgb3IgYSBwb2ludGVyLiAgSXQgaXMKLSAgICogICAgIHVzZWQgYnkgc3RyZWFtIGltcGxlbWVudGF0aW9ucyB0byBzdG9yZSBmaWxlIGRlc2NyaXB0b3JzIG9yIGBGSUxFKicKLSAgICogICAgIHBvaW50ZXJzLgotICAgKgotICAgKiAgIHBhdGhuYW1lIDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSBGcmVlVHlwZS4gIEhvd2V2ZXIsIGl0IGlzIG9mdGVuCi0gICAqICAgICB1c2VmdWwgZHVyaW5nIGRlYnVnZ2luZyB0byB1c2UgaXQgdG8gc3RvcmUgdGhlIHN0cmVhbSdzIGZpbGVuYW1lCi0gICAqICAgICAod2hlcmUgYXZhaWxhYmxlKS4KLSAgICoKLSAgICogICByZWFkIDo6Ci0gICAqICAgICBUaGUgc3RyZWFtJ3MgaW5wdXQgZnVuY3Rpb24uCi0gICAqCi0gICAqICAgY2xvc2UgOjoKLSAgICogICAgIFRoZSBzdHJlYW07cyBjbG9zZSBmdW5jdGlvbi4KLSAgICoKLSAgICogICBtZW1vcnkgOjoKLSAgICogICAgIFRoZSBtZW1vcnkgbWFuYWdlciB0byB1c2UgdG8gcHJlbG9hZCBmcmFtZXMuICBUaGlzIGlzIHNldAotICAgKiAgICAgaW50ZXJuYWxseSBieSBGcmVlVHlwZSBhbmQgc2hvdWxkbid0IGJlIHRvdWNoZWQgYnkgc3RyZWFtCi0gICAqICAgICBpbXBsZW1lbnRhdGlvbnMuCi0gICAqCi0gICAqICAgY3Vyc29yIDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIHNldCBhbmQgdXNlZCBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIHdoZW4gcGFyc2luZwotICAgKiAgICAgZnJhbWVzLgotICAgKgotICAgKiAgIGxpbWl0IDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIHNldCBhbmQgdXNlZCBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIHdoZW4gcGFyc2luZwotICAgKiAgICAgZnJhbWVzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1N0cmVhbVJlY18KLSAgewotICAgIHVuc2lnbmVkIGNoYXIqICAgICAgIGJhc2U7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgICBwb3M7Ci0KLSAgICBGVF9TdHJlYW1EZXNjICAgICAgICBkZXNjcmlwdG9yOwotICAgIEZUX1N0cmVhbURlc2MgICAgICAgIHBhdGhuYW1lOwotICAgIEZUX1N0cmVhbV9Jb0Z1bmMgICAgIHJlYWQ7Ci0gICAgRlRfU3RyZWFtX0Nsb3NlRnVuYyAgY2xvc2U7Ci0KLSAgICBGVF9NZW1vcnkgICAgICAgICAgICBtZW1vcnk7Ci0gICAgdW5zaWduZWQgY2hhciogICAgICAgY3Vyc29yOwotICAgIHVuc2lnbmVkIGNoYXIqICAgICAgIGxpbWl0OwotCi0gIH0gRlRfU3RyZWFtUmVjOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUU1lTVEVNX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHRyaWdvbi5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHRyaWdvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjc3ZDJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHRyaWdvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEsIDIwMDMsIDIwMDUsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFRSSUdPTl9IX18KLSNkZWZpbmUgX19GVFRSSUdPTl9IX18KLQotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9BbmdsZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gbW9kZWwgYW5nbGUgdmFsdWVzIGluIEZyZWVUeXBlLiAgTm90ZSB0aGF0IHRoZQotICAgKiAgIGFuZ2xlIGlzIGEgMTYuMTYgZml4ZWQgZmxvYXQgdmFsdWUgZXhwcmVzc2VkIGluIGRlZ3JlZXMuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0ZpeGVkICBGVF9BbmdsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9BTkdMRV9QSQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIGFuZ2xlIHBpIGV4cHJlc3NlZCBpbiBARlRfQW5nbGUgdW5pdHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9BTkdMRV9QSSAgKCAxODBMIDw8IDE2ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9BTkdMRV8yUEkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBhbmdsZSAyKnBpIGV4cHJlc3NlZCBpbiBARlRfQW5nbGUgdW5pdHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9BTkdMRV8yUEkgICggRlRfQU5HTEVfUEkgKiAyICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9BTkdMRV9QSTIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBhbmdsZSBwaS8yIGV4cHJlc3NlZCBpbiBARlRfQW5nbGUgdW5pdHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9BTkdMRV9QSTIgICggRlRfQU5HTEVfUEkgLyAyICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9BTkdMRV9QSTQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBhbmdsZSBwaS80IGV4cHJlc3NlZCBpbiBARlRfQW5nbGUgdW5pdHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9BTkdMRV9QSTQgICggRlRfQU5HTEVfUEkgLyA0ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TaW4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgc2ludXMgb2YgYSBnaXZlbiBhbmdsZSBpbiBmaXhlZCBwb2ludCBmb3JtYXQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZSA6OgotICAgKiAgICAgVGhlIGlucHV0IGFuZ2xlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSBzaW51cyB2YWx1ZS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgeW91IG5lZWQgYm90aCB0aGUgc2ludXMgYW5kIGNvc2ludXMgZm9yIGEgZ2l2ZW4gYW5nbGUsIHVzZSB0aGUKLSAgICogICBmdW5jdGlvbiBARlRfVmVjdG9yX1VuaXQuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0ZpeGVkICkKLSAgRlRfU2luKCBGVF9BbmdsZSAgYW5nbGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9Db3MKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgY29zaW51cyBvZiBhIGdpdmVuIGFuZ2xlIGluIGZpeGVkIHBvaW50IGZvcm1hdC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIGNvc2ludXMgdmFsdWUuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIHlvdSBuZWVkIGJvdGggdGhlIHNpbnVzIGFuZCBjb3NpbnVzIGZvciBhIGdpdmVuIGFuZ2xlLCB1c2UgdGhlCi0gICAqICAgZnVuY3Rpb24gQEZUX1ZlY3Rvcl9Vbml0LgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCi0gIEZUX0NvcyggRlRfQW5nbGUgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVGFuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIHRhbmdlbnQgb2YgYSBnaXZlbiBhbmdsZSBpbiBmaXhlZCBwb2ludCBmb3JtYXQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZSA6OgotICAgKiAgICAgVGhlIGlucHV0IGFuZ2xlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSB0YW5nZW50IHZhbHVlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCi0gIEZUX1RhbiggRlRfQW5nbGUgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfQXRhbjIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgYXJjLXRhbmdlbnQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHZlY3RvciAoeCx5KSBpbgotICAgKiAgIHRoZSAyZCBwbGFuZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHggOjoKLSAgICogICAgIFRoZSBob3Jpem9udGFsIHZlY3RvciBjb29yZGluYXRlLgotICAgKgotICAgKiAgIHkgOjoKLSAgICogICAgIFRoZSB2ZXJ0aWNhbCB2ZWN0b3IgY29vcmRpbmF0ZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgYXJjLXRhbmdlbnQgdmFsdWUgKGkuZS4gYW5nbGUpLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9BbmdsZSApCi0gIEZUX0F0YW4yKCBGVF9GaXhlZCAgeCwKLSAgICAgICAgICAgIEZUX0ZpeGVkICB5ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfQW5nbGVfRGlmZgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFuZ2xlcy4gIFRoZSByZXN1bHQgaXMgYWx3YXlzCi0gICAqICAgY29uc3RyYWluZWQgdG8gdGhlIF0tUEkuLlBJXSBpbnRlcnZhbC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGFuZ2xlMSA6OgotICAgKiAgICAgRmlyc3QgYW5nbGUuCi0gICAqCi0gICAqICAgYW5nbGUyIDo6Ci0gICAqICAgICBTZWNvbmQgYW5nbGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgQ29uc3RyYWluZWQgdmFsdWUgb2YgYHZhbHVlMi12YWx1ZTEnLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9BbmdsZSApCi0gIEZUX0FuZ2xlX0RpZmYoIEZUX0FuZ2xlICBhbmdsZTEsCi0gICAgICAgICAgICAgICAgIEZUX0FuZ2xlICBhbmdsZTIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9WZWN0b3JfVW5pdAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSB1bml0IHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gYW5nbGUuICBBZnRlciB0aGUKLSAgICogICBjYWxsLCB0aGUgdmFsdWUgb2YgYHZlYy54JyB3aWxsIGJlIGBzaW4oYW5nbGUpJywgYW5kIHRoZSB2YWx1ZSBvZgotICAgKiAgIGB2ZWMueScgd2lsbCBiZSBgY29zKGFuZ2xlKScuCi0gICAqCi0gICAqICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG8gcmV0cmlldmUgYm90aCB0aGUgc2ludXMgYW5kIGNvc2ludXMgb2YgYQotICAgKiAgIGdpdmVuIGFuZ2xlIHF1aWNrbHkuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgdmVjIDo6Ci0gICAqICAgICBUaGUgYWRkcmVzcyBvZiB0YXJnZXQgdmVjdG9yLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIGFuZ2xlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVmVjdG9yX1VuaXQoIEZUX1ZlY3RvciogIHZlYywKLSAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX1JvdGF0ZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUm90YXRlIGEgdmVjdG9yIGJ5IGEgZ2l2ZW4gYW5nbGUuCi0gICAqCi0gICAqIEBpbm91dDoKLSAgICogICB2ZWMgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRhcmdldCB2ZWN0b3IuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZSA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgYW5nbGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfUm90YXRlKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX0xlbmd0aAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgYSBnaXZlbiB2ZWN0b3IuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICB2ZWMgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRhcmdldCB2ZWN0b3IuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIHZlY3RvciBsZW5ndGgsIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB1bml0cyB0aGF0IHRoZSBvcmlnaW5hbAotICAgKiAgIHZlY3RvciBjb29yZGluYXRlcy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9WZWN0b3JfTGVuZ3RoKCBGVF9WZWN0b3IqICB2ZWMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9WZWN0b3JfUG9sYXJpemUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENvbXB1dGUgYm90aCB0aGUgbGVuZ3RoIGFuZCBhbmdsZSBvZiBhIGdpdmVuIHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2Ygc291cmNlIHZlY3Rvci4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBsZW5ndGggOjoKLSAgICogICAgIFRoZSB2ZWN0b3IgbGVuZ3RoLgotICAgKgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgdmVjdG9yIGFuZ2xlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVmVjdG9yX1BvbGFyaXplKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAqbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgKmFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENvbXB1dGUgdmVjdG9yIGNvb3JkaW5hdGVzIGZyb20gYSBsZW5ndGggYW5kIGFuZ2xlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2Ygc291cmNlIHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGxlbmd0aCA6OgotICAgKiAgICAgVGhlIHZlY3RvciBsZW5ndGguCi0gICAqCi0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSB2ZWN0b3IgYW5nbGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRUUklHT05fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjBhYTU0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzaW1wbGUgdHlwZXMgZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDA0LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUVFlQRVNfSF9fCi0jZGVmaW5lIF9fRlRUWVBFU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmFzaWMgRGF0YSBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJhc2ljIGRhdGEgdHlwZXMgZGVmaW5lZCBieSB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBiYXNpYyBkYXRhIHR5cGVzIGRlZmluZWQgYnkgRnJlZVR5cGUgMiwgICovCi0gIC8qICAgIHJhbmdpbmcgZnJvbSBzaW1wbGUgc2NhbGFyIHR5cGVzIHRvIGJpdG1hcCBkZXNjcmlwdG9ycy4gIE1vcmUgICAgICAqLwotICAvKiAgICBmb250LXNwZWNpZmljIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CeXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QdHJEaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VGV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GMkRvdDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVW5pdFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyNkRvdDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZW5lcmljX0ZpbmFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QaXhlbF9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGFsZXR0ZV9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JTUFHRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIG9mIHVuc2lnbmVkIGNoYXIsIHVzZWQgZm9yIHNpbXBsZSBib29sZWFucy4gIEFzIHVzdWFsLCAgICovCi0gIC8qICAgIHZhbHVlcyAxIGFuZCAwIHJlcHJlc2VudCB0cnVlIGFuZCBmYWxzZSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBGVF9Cb29sOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaWduZWQgMTYtYml0IGludGVnZXIgdXNlZCB0byBzdG9yZSBhIGRpc3RhbmNlIGluIG9yaWdpbmFsIGZvbnQgICovCi0gIC8qICAgIHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX0ZXb3JkOyAgIC8qIGRpc3RhbmNlIGluIEZVbml0cyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgdXNlZCB0byBzdG9yZSBhIGRpc3RhbmNlIGluIG9yaWdpbmFsICAgICovCi0gIC8qICAgIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRlRfVUZXb3JkOyAgLyogdW5zaWduZWQgZGlzdGFuY2UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHR5cGVkZWYgZm9yIHRoZSBfc2lnbmVkXyBjaGFyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgY2hhciAgRlRfQ2hhcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHR5cGVkZWYgZm9yIHRoZSBfdW5zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBGVF9CeXRlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBjb25zdGFudCBtZW1vcnkgYXJlYXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGNvbnN0IEZUX0J5dGUqICBGVF9CeXRlczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgMzJiaXQgdGFncyAoYXMgdXNlZCBpbiB0aGUgU0ZOVCBmb3JtYXQpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9VSW50MzIgIEZUX1RhZzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHR5cGVkZWYgZm9yIHRoZSBjaGFyIHR5cGUsIHVzdWFsbHkgdXNlZCBmb3Igc3RyaW5ncy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBjaGFyICBGVF9TdHJpbmc7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHNpZ25lZCBzaG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9TaG9ydDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgdW5zaWduZWQgc2hvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRlRfVVNob3J0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciB0aGUgaW50IHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBpbnQgIEZUX0ludDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgdGhlIHVuc2lnbmVkIGludCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgIEZUX1VJbnQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHNpZ25lZCBsb25nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX0xvbmc7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHVuc2lnbmVkIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUxvbmc7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GMkRvdDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpZ25lZCAyLjE0IGZpeGVkIGZsb2F0IHR5cGUgdXNlZCBmb3IgdW5pdCB2ZWN0b3JzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9GMkRvdDE0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRjI2RG90NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaWduZWQgMjYuNiBmaXhlZCBmbG9hdCB0eXBlIHVzZWQgZm9yIHZlY3RvcmlhbCBwaXhlbCAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfRjI2RG90NjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZpeGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHN0b3JlIDE2LjE2IGZpeGVkIGZsb2F0IHZhbHVlcywgbGlrZSBzY2FsaW5nICAqLwotICAvKiAgICB2YWx1ZXMgb3IgbWF0cml4IGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX0ZpeGVkOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEZyZWVUeXBlIGVycm9yIGNvZGUgdHlwZS4gIEEgdmFsdWUgb2YgMCBpcyBhbHdheXMgaW50ZXJwcmV0ZWQgICovCi0gIC8qICAgIGFzIGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBpbnQgIEZUX0Vycm9yOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgYSB0eXBlbGVzcyBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQqICBGVF9Qb2ludGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBBTlNJIEMgYHNpemVfdCcgdHlwZSwgaS5lLiwgdGhlIGxhcmdlc3QgICovCi0gIC8qICAgIF91bnNpZ25lZF8gaW50ZWdlciB0eXBlIHVzZWQgdG8gZXhwcmVzcyBhIGZpbGUgc2l6ZSBvciBwb3NpdGlvbiwgICAqLwotICAvKiAgICBvciBhIG1lbW9yeSBibG9jayBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2l6ZV90ICBGVF9PZmZzZXQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QdHJEaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEFOU0kgQyBgcHRyZGlmZl90JyB0eXBlLCBpLmUuLCB0aGUgICAgICAgKi8KLSAgLyogICAgbGFyZ2VzdCBfc2lnbmVkXyBpbnRlZ2VyIHR5cGUgdXNlZCB0byBleHByZXNzIHRoZSBkaXN0YW5jZSAgICAgICAgICovCi0gIC8qICAgIGJldHdlZW4gdHdvIHBvaW50ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBmdF9wdHJkaWZmX3QgIEZUX1B0ckRpc3Q7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Vbml0VmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJEIHZlY3RvciB1bml0IHZlY3Rvci4gIFVzZXMgICAgKi8KLSAgLyogICAgRlRfRjJEb3QxNCB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeCA6OiBIb3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5IDo6IFZlcnRpY2FsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Vbml0VmVjdG9yXwotICB7Ci0gICAgRlRfRjJEb3QxNCAgeDsKLSAgICBGVF9GMkRvdDE0ICB5OwotCi0gIH0gRlRfVW5pdFZlY3RvcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMngyIG1hdHJpeC4gIENvZWZmaWNpZW50cyBhcmUgICAqLwotICAvKiAgICBpbiAxNi4xNiBmaXhlZCBmbG9hdCBmb3JtYXQuICBUaGUgY29tcHV0YXRpb24gcGVyZm9ybWVkIGlzOiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICB4JyA9IHgqeHggKyB5Knh5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgeScgPSB4Knl4ICsgeSp5eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHh4IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeHkgOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5eCA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHl5IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01hdHJpeF8KLSAgewotICAgIEZUX0ZpeGVkICB4eCwgeHk7Ci0gICAgRlRfRml4ZWQgIHl4LCB5eTsKLQotICB9IEZUX01hdHJpeDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWQtb25seSBiaW5hcnkgZGF0YSByZXByZXNlbnRlZCBhcyBhIHBvaW50ZXIgYW5kIGEgbGVuZ3RoLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvaW50ZXIgOjogVGhlIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoICA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfRGF0YV8KLSAgewotICAgIGNvbnN0IEZUX0J5dGUqICBwb2ludGVyOwotICAgIEZUX0ludCAgICAgICAgICBsZW5ndGg7Ci0KLSAgfSBGVF9EYXRhOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpY19GaW5hbGl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzY3JpYmVzIGEgZnVuY3Rpb24gdXNlZCB0byBkZXN0cm95IHRoZSBgY2xpZW50JyBkYXRhIG9mIGFueSAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIG9iamVjdC4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIEBGVF9HZW5lcmljIHR5cGUgZm9yICAqLwotICAvKiAgICBkZXRhaWxzIG9mIHVzYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWRkcmVzcyBvZiB0aGUgRnJlZVR5cGUgb2JqZWN0IHdoaWNoIGlzIHVuZGVyIGZpbmFsaXphdGlvbi4gICAgKi8KLSAgLyogICAgSXRzIGNsaWVudCBkYXRhIGlzIGFjY2Vzc2VkIHRocm91Z2ggaXRzIGBnZW5lcmljJyBmaWVsZC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQgICgqRlRfR2VuZXJpY19GaW5hbGl6ZXIpKHZvaWQqICBvYmplY3QpOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBvZnRlbiBuZWVkIHRvIGFzc29jaWF0ZSB0aGVpciBvd24gZGF0YSB0byBhICAgICovCi0gIC8qICAgIHZhcmlldHkgb2YgRnJlZVR5cGUgY29yZSBvYmplY3RzLiAgRm9yIGV4YW1wbGUsIGEgdGV4dCBsYXlvdXQgQVBJICAqLwotICAvKiAgICBtaWdodCB3YW50IHRvIGFzc29jaWF0ZSBhIGdseXBoIGNhY2hlIHRvIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vc3QgRnJlZVR5cGUgb2JqZWN0IGNvbnRhaW5zIGEgYGdlbmVyaWMnIGZpZWxkLCBvZiB0eXBlICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZW5lcmljLCB3aGljaCB1c2FnZSBpcyBsZWZ0IHRvIGNsaWVudCBhcHBsaWNhdGlvbnMgYW5kIGZvbnQgICAgKi8KLSAgLyogICAgc2VydmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhIHBvaW50ZXIgdG8gY2xpZW50LXNwZWNpZmljIGRhdGEsIGFzIHdlbGwgKi8KLSAgLyogICAgYXMgdGhlIGFkZHJlc3Mgb2YgYSBgZmluYWxpemVyJyBmdW5jdGlvbiwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgYnkgICovCi0gIC8qICAgIEZyZWVUeXBlIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQgKGZvciBleGFtcGxlLCB0aGUgcHJldmlvdXMgICAqLwotICAvKiAgICBjbGllbnQgZXhhbXBsZSB3b3VsZCBwdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdseXBoIGNhY2hlIGRlc3RydWN0b3IgKi8KLSAgLyogICAgaW4gdGhlIGBmaW5hbGl6ZXInIGZpZWxkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byBhbnkgY2xpZW50LXNwZWNpZmllZCBkYXRhLiBUaGlzICovCi0gIC8qICAgICAgICAgICAgICAgICBmaWVsZCBpcyBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmluYWxpemVyIDo6IEEgcG9pbnRlciB0byBhIGBnZW5lcmljIGZpbmFsaXplcicgZnVuY3Rpb24sIHdoaWNoICAgICovCi0gIC8qICAgICAgICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLiAgSWYgdGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgZmllbGQgaXMgc2V0IHRvIE5VTEwsIG5vIGNvZGUgd2lsbCBiZSBjYWxsZWQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9HZW5lcmljXwotICB7Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgIGRhdGE7Ci0gICAgRlRfR2VuZXJpY19GaW5hbGl6ZXIgIGZpbmFsaXplcjsKLQotICB9IEZUX0dlbmVyaWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NQUtFX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGNvbnZlcnRzIGZvdXItbGV0dGVyIHRhZ3Mgd2hpY2ggYXJlIHVzZWQgdG8gbGFiZWwgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgdGFibGVzIGludG8gYW4gdW5zaWduZWQgbG9uZyB0byBiZSB1c2VkIHdpdGhpbiBGcmVlVHlwZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHByb2R1Y2VkIHZhbHVlcyAqbXVzdCogYmUgMzJiaXQgaW50ZWdlcnMuICBEb24ndCByZWRlZmluZSB0aGlzICovCi0gIC8qICAgIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfTUFLRV9UQUcoIF94MSwgX3gyLCBfeDMsIF94NCApIFwKLSAgICAgICAgICAoICggKEZUX1VMb25nKV94MSA8PCAyNCApIHwgICAgIFwKLSAgICAgICAgICAgICggKEZUX1VMb25nKV94MiA8PCAxNiApIHwgICAgIFwKLSAgICAgICAgICAgICggKEZUX1VMb25nKV94MyA8PCAgOCApIHwgICAgIFwKLSAgICAgICAgICAgICAgKEZUX1VMb25nKV94NCAgICAgICAgICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBMIEkgUyBUICAgTSBBIE4gQSBHIEUgTSBFIE4gVCAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdF9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3ROb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBNYW55IGVsZW1lbnRzIGFuZCBvYmplY3RzIGluIEZyZWVUeXBlIGFyZSBsaXN0ZWQgdGhyb3VnaCBhbiAgICAgICAqLwotICAvKiAgICAgQEZUX0xpc3QgcmVjb3JkIChzZWUgQEZUX0xpc3RSZWMpLiAgQXMgaXRzIG5hbWUgc3VnZ2VzdHMsIGFuICAgICAgKi8KLSAgLyogICAgIEZUX0xpc3ROb2RlIGlzIGEgaGFuZGxlIHRvIGEgc2luZ2xlIGxpc3QgZWxlbWVudC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9MaXN0Tm9kZVJlY18qICBGVF9MaXN0Tm9kZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgbGlzdCByZWNvcmQgKHNlZSBARlRfTGlzdFJlYykuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlzdFJlY18qICBGVF9MaXN0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdE5vZGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgc2luZ2xlIGxpc3QgZWxlbWVudC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHJldiA6OiBUaGUgcHJldmlvdXMgZWxlbWVudCBpbiB0aGUgbGlzdC4gIE5VTEwgaWYgZmlyc3QuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXh0IDo6IFRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGxpc3QuICBOVUxMIGlmIGxhc3QuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGEgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBsaXN0ZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0xpc3ROb2RlUmVjXwotICB7Ci0gICAgRlRfTGlzdE5vZGUgIHByZXY7Ci0gICAgRlRfTGlzdE5vZGUgIG5leHQ7Ci0gICAgdm9pZCogICAgICAgIGRhdGE7Ci0KLSAgfSBGVF9MaXN0Tm9kZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIHNpbXBsZSBkb3VibHktbGlua2VkIGxpc3QuICBUaGVzZSBhcmUgICAqLwotICAvKiAgICB1c2VkIGluIG1hbnkgcGFydHMgb2YgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWFkIDo6IFRoZSBoZWFkIChmaXJzdCBlbGVtZW50KSBvZiBkb3VibHktbGlua2VkIGxpc3QuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhaWwgOjogVGhlIHRhaWwgKGxhc3QgZWxlbWVudCkgb2YgZG91Ymx5LWxpbmtlZCBsaXN0LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0xpc3RSZWNfCi0gIHsKLSAgICBGVF9MaXN0Tm9kZSAgaGVhZDsKLSAgICBGVF9MaXN0Tm9kZSAgdGFpbDsKLQotICB9IEZUX0xpc3RSZWM7Ci0KLQotICAvKiAqLwotCi0jZGVmaW5lIEZUX0lTX0VNUFRZKCBsaXN0ICkgICggKGxpc3QpLmhlYWQgPT0gMCApCi0KLSAgLyogcmV0dXJuIGJhc2UgZXJyb3IgY29kZSAod2l0aG91dCBtb2R1bGUtc3BlY2lmaWMgcHJlZml4KSAqLwotI2RlZmluZSBGVF9FUlJPUl9CQVNFKCB4ICkgICAgKCAoeCkgJiAweEZGICkKLQotICAvKiByZXR1cm4gbW9kdWxlIGVycm9yIGNvZGUgKi8KLSNkZWZpbmUgRlRfRVJST1JfTU9EVUxFKCB4ICkgICggKHgpICYgMHhGRjAwVSApCi0KLSNkZWZpbmUgRlRfQk9PTCggeCApICAoIChGVF9Cb29sKSggeCApICkKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFRZUEVTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTFiMGM0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnR3aW5mbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHdpbmZudC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgV2luZG93cyBmbnQtc3BlY2lmaWMgZGF0YS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFdJTkZOVF9IX18KLSNkZWZpbmUgX19GVFdJTkZOVF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2luZm50X2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93IEZOVCBGaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93cyBGTlQgc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBXaW5kb3dzIEZOVCBzcGVjaWZpYyAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9XaW5GTlRfSURfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGNoYXJzZXQnIGJ5dGUgaW4KLSAgICogICBARlRfV2luRk5UX0hlYWRlclJlYy4gIEV4YWN0IG1hcHBpbmcgdGFibGVzIGZvciB0aGUgdmFyaW91cyBjcFhYWFgKLSAgICogICBlbmNvZGluZ3MgKGV4Y2VwdCBmb3IgY3AxMzYxKSBjYW4gYmUgZm91bmQgYXQgZnRwOi8vZnRwLnVuaWNvZGUub3JnCi0gICAqICAgaW4gdGhlIE1BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1Mgc3ViZGlyZWN0b3J5LiAgY3AxMzYxIGlzCi0gICAqICAgcm91Z2hseSBhIHN1cGVyc2V0IG9mIE1BUFBJTkdTL09CU09MRVRFL0VBU1RBU0lBL0tTQy9KT0hBQi5UWFQuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfV2luRk5UX0lEX0RFRkFVTFQgOjoKLSAgICogICAgIFRoaXMgaXMgdXNlZCBmb3IgZm9udCBlbnVtZXJhdGlvbiBhbmQgZm9udCBjcmVhdGlvbiBhcyBhCi0gICAqICAgICBgZG9uJ3QgY2FyZScgdmFsdWUuICBWYWxpZCBmb250IGZpbGVzIGRvbid0IGNvbnRhaW4gdGhpcyB2YWx1ZS4KLSAgICogICAgIFdoZW4gcXVlcnlpbmcgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBmb250Ci0gICAqICAgICB0aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZCBpbnRvIGEgc3BlY2lmaWVkIGRldmljZSBjb250ZXh0LCB0aGlzCi0gICAqICAgICByZXR1cm4gdmFsdWUgKG9mIHRoZSByZWxhdGVkIFdpbmRvd3MgQVBJKSBzaW1wbHkgZGVub3RlcyBmYWlsdXJlLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9TWU1CT0wgOjoKLSAgICogICAgIFRoZXJlIGlzIG5vIGtub3duIG1hcHBpbmcgdGFibGUgYXZhaWxhYmxlLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9NQUMgOjoKLSAgICogICAgIE1hYyBSb21hbiBlbmNvZGluZy4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfT0VNIDo6Ci0gICAqICAgICBGcm9tIE1pY2hhZWwgUMO2dHRnZW4gPG1pY2hhZWxAcG9ldHRnZW4uZGU+OgotICAgKgotICAgKiAgICAgICBUaGUgYFdpbmRvd3MgRm9udCBNYXBwaW5nJyBhcnRpY2xlIHNheXMgdGhhdCBGVF9XaW5GTlRfSURfT0VNCi0gICAqICAgICAgIGlzIHVzZWQgZm9yIHRoZSBjaGFyc2V0IG9mIHZlY3RvciBmb250cywgbGlrZSBgbW9kZXJuLmZvbicsCi0gICAqICAgICAgIGByb21hbi5mb24nLCBhbmQgYHNjcmlwdC5mb24nIG9uIFdpbmRvd3MuCi0gICAqCi0gICAqICAgICAgIFRoZSBgQ3JlYXRlRm9udCcgZG9jdW1lbnRhdGlvbiBzYXlzOiBUaGUgRlRfV2luRk5UX0lEX09FTSB2YWx1ZQotICAgKiAgICAgICBzcGVjaWZpZXMgYSBjaGFyYWN0ZXIgc2V0IHRoYXQgaXMgb3BlcmF0aW5nLXN5c3RlbSBkZXBlbmRlbnQuCi0gICAqCi0gICAqICAgICAgIFRoZSBgSUZJTUVUUklDUycgZG9jdW1lbnRhdGlvbiBmcm9tIHRoZSBgV2luZG93cyBEcml2ZXIKLSAgICogICAgICAgRGV2ZWxvcG1lbnQgS2l0JyBzYXlzOiBUaGlzIGZvbnQgc3VwcG9ydHMgYW4gT0VNLXNwZWNpZmljCi0gICAqICAgICAgIGNoYXJhY3RlciBzZXQuICBUaGUgT0VNIGNoYXJhY3RlciBzZXQgaXMgc3lzdGVtIGRlcGVuZGVudC4KLSAgICoKLSAgICogICAgICAgSW4gZ2VuZXJhbCBPRU0sIGFzIG9wcG9zZWQgdG8gQU5TSSAoaS5lLiwgY3AxMjUyKSwgZGVub3RlcyB0aGUKLSAgICogICAgICAgc2Vjb25kIGRlZmF1bHQgY29kZXBhZ2UgdGhhdCBtb3N0IGludGVybmF0aW9uYWwgdmVyc2lvbnMgb2YKLSAgICogICAgICAgV2luZG93cyBoYXZlLiAgSXQgaXMgb25lIG9mIHRoZSBPRU0gY29kZXBhZ2VzIGZyb20KLSAgICoKLSAgICogICAgICAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZ2xvYmFsZGV2L3JlZmVyZW5jZS9jcGhvbWUubXNweCwKLSAgICoKLSAgICogICAgICAgYW5kIGlzIHVzZWQgZm9yIHRoZSBgRE9TIGJveGVzJywgdG8gc3VwcG9ydCBsZWdhY3kgYXBwbGljYXRpb25zLgotICAgKiAgICAgICBBIEdlcm1hbiBXaW5kb3dzIHZlcnNpb24gZm9yIGV4YW1wbGUgdXN1YWxseSB1c2VzIEFOU0kgY29kZXBhZ2UKLSAgICogICAgICAgMTI1MiBhbmQgT0VNIGNvZGVwYWdlIDg1MC4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1A4NzQgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgVGhhaSBUSVMgNjIwIGFuZCBJU08gODg1OS0xMS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1A5MzIgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgSmFwYW5lc2UgU2hpZnQtSklTICh3aXRoIG1pbm9yIGRldmlhdGlvbnMpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDkzNiA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBzaW1wbGlmaWVkIENoaW5lc2UgR0IgMjMxMi0xOTgwICh3aXRoIGRpZmZlcmVudAotICAgKiAgICAgb3JkZXJpbmcgYW5kIG1pbm9yIGRldmlhdGlvbnMpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDk0OSA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBLb3JlYW4gSGFuZ3VsIEtTIEMgNTYwMS0xOTg3ICh3aXRoIGRpZmZlcmVudAotICAgKiAgICAgb3JkZXJpbmcgYW5kIG1pbm9yIGRldmlhdGlvbnMpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDk1MCA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiB0cmFkaXRpb25hbCBDaGluZXNlIEJpZyA1IEVUZW4gKHdpdGggZGlmZmVyZW50Ci0gICAqICAgICBvcmRlcmluZyBhbmQgbWlub3IgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1MCA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBFYXN0IEV1cm9wZWFuIElTTyA4ODU5LTIgKHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50Ci0gICAqICAgICBvcmRlcmluZykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1MSA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBSdXNzaWFuIElTTyA4ODU5LTUgKHdpdGggZGlmZmVyZW50IG9yZGVyaW5nKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjUyIDo6Ci0gICAqICAgICBBTlNJIGVuY29kaW5nLiAgQSBzdXBlcnNldCBvZiBJU08gODg1OS0xLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTMgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgR3JlZWsgSVNPIDg4NTktNyAod2l0aCBtaW5vciBtb2RpZmljYXRpb25zKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU0IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIFR1cmtpc2ggSVNPIDg4NTktOS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU1IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIEhlYnJldyBJU08gODg1OS04ICh3aXRoIHNvbWUgbW9kaWZpY2F0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1NiA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBBcmFiaWMgSVNPIDg4NTktNiAod2l0aCBkaWZmZXJlbnQgb3JkZXJpbmcpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTcgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgQmFsdGljIElTTyA4ODU5LTEzICh3aXRoIHNvbWUgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1OCA6OgotICAgKiAgICAgRm9yIFZpZXRuYW1lc2UuICBUaGlzIGVuY29kaW5nIGRvZXNuJ3QgY292ZXIgYWxsIG5lY2Vzc2FyeQotICAgKiAgICAgY2hhcmFjdGVycy4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMzYxIDo6Ci0gICAqICAgICBLb3JlYW4gKEpvaGFiKS4KLSAgICovCi0KLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1MiAgICAwCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9ERUZBVUxUICAgMQotI2RlZmluZSBGVF9XaW5GTlRfSURfU1lNQk9MICAgIDIKLSNkZWZpbmUgRlRfV2luRk5UX0lEX01BQyAgICAgIDc3Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDkzMiAgIDEyOAotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1A5NDkgICAxMjkKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTM2MSAgMTMwCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDkzNiAgIDEzNAotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1A5NTAgICAxMzYKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1MyAgMTYxCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTQgIDE2MgotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjU4ICAxNjMKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1NSAgMTc3Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTYgIDE3OAotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjU3ICAxODYKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1MSAgMjA0Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDg3NCAgIDIyMgotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUwICAyMzgKLSNkZWZpbmUgRlRfV2luRk5UX0lEX09FTSAgICAgMjU1Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9XaW5GTlRfSGVhZGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaW5kb3dzIEZOVCBIZWFkZXIgaW5mby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9XaW5GTlRfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICB2ZXJzaW9uOwotICAgIEZUX1VMb25nICAgZmlsZV9zaXplOwotICAgIEZUX0J5dGUgICAgY29weXJpZ2h0WzYwXTsKLSAgICBGVF9VU2hvcnQgIGZpbGVfdHlwZTsKLSAgICBGVF9VU2hvcnQgIG5vbWluYWxfcG9pbnRfc2l6ZTsKLSAgICBGVF9VU2hvcnQgIHZlcnRpY2FsX3Jlc29sdXRpb247Ci0gICAgRlRfVVNob3J0ICBob3Jpem9udGFsX3Jlc29sdXRpb247Ci0gICAgRlRfVVNob3J0ICBhc2NlbnQ7Ci0gICAgRlRfVVNob3J0ICBpbnRlcm5hbF9sZWFkaW5nOwotICAgIEZUX1VTaG9ydCAgZXh0ZXJuYWxfbGVhZGluZzsKLSAgICBGVF9CeXRlICAgIGl0YWxpYzsKLSAgICBGVF9CeXRlICAgIHVuZGVybGluZTsKLSAgICBGVF9CeXRlICAgIHN0cmlrZV9vdXQ7Ci0gICAgRlRfVVNob3J0ICB3ZWlnaHQ7Ci0gICAgRlRfQnl0ZSAgICBjaGFyc2V0OwotICAgIEZUX1VTaG9ydCAgcGl4ZWxfd2lkdGg7Ci0gICAgRlRfVVNob3J0ICBwaXhlbF9oZWlnaHQ7Ci0gICAgRlRfQnl0ZSAgICBwaXRjaF9hbmRfZmFtaWx5OwotICAgIEZUX1VTaG9ydCAgYXZnX3dpZHRoOwotICAgIEZUX1VTaG9ydCAgbWF4X3dpZHRoOwotICAgIEZUX0J5dGUgICAgZmlyc3RfY2hhcjsKLSAgICBGVF9CeXRlICAgIGxhc3RfY2hhcjsKLSAgICBGVF9CeXRlICAgIGRlZmF1bHRfY2hhcjsKLSAgICBGVF9CeXRlICAgIGJyZWFrX2NoYXI7Ci0gICAgRlRfVVNob3J0ICBieXRlc19wZXJfcm93OwotICAgIEZUX1VMb25nICAgZGV2aWNlX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGZhY2VfbmFtZV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBiaXRzX3BvaW50ZXI7Ci0gICAgRlRfVUxvbmcgICBiaXRzX29mZnNldDsKLSAgICBGVF9CeXRlICAgIHJlc2VydmVkOwotICAgIEZUX1VMb25nICAgZmxhZ3M7Ci0gICAgRlRfVVNob3J0ICBBX3NwYWNlOwotICAgIEZUX1VTaG9ydCAgQl9zcGFjZTsKLSAgICBGVF9VU2hvcnQgIENfc3BhY2U7Ci0gICAgRlRfVVNob3J0ICBjb2xvcl90YWJsZV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICByZXNlcnZlZDFbNF07Ci0KLSAgfSBGVF9XaW5GTlRfSGVhZGVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfV2luRk5UX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gQEZUX1dpbkZOVF9IZWFkZXJSZWMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9XaW5GTlRfSGVhZGVyUmVjXyogIEZUX1dpbkZOVF9IZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9XaW5GTlRfSGVhZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgUmV0cmlldmUgYSBXaW5kb3dzIEZOVCBmb250IGluZm8gaGVhZGVyLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIGFoZWFkZXIgOjogVGhlIFdpbkZOVCBoZWFkZXIuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggV2luZG93cyBGTlQgZmFjZXMsIHJldHVybmluZyBhbiBlcnJvcgotICAgKiAgIG90aGVyd2lzZS4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfV2luRk5UX0hlYWRlciggRlRfRmFjZSAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9XaW5GTlRfSGVhZGVyUmVjICAqYWhlYWRlciApOwotCi0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFdJTkZOVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0eGY4Ni5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHhmODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4MmFiYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0eGY4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR4Zjg2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBYMTEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRYRjg2X0hfXwotI2RlZmluZSBfX0ZUWEY4Nl9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb250X2Zvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGb250IEZvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBHZXR0aW5nIHRoZSBmb250IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgc2luZ2xlIGZ1bmN0aW9uIGluIHRoaXMgc2VjdGlvbiBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGZvbnQgICAgICovCi0gIC8qICAgZm9ybWF0LiAgTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IG5lZWRlZCBub3JtYWxseTsgICAgICAgICAqLwotICAvKiAgIGhvd2V2ZXIsIHRoZXJlIGFyZSBzcGVjaWFsIGNhc2VzIChsaWtlIGluIFBERiBkZXZpY2VzKSB3aGVyZSBpdCBpcyAgKi8KLSAgLyogICBpbXBvcnRhbnQgdG8gZGlmZmVyZW50aWF0ZSwgaW4gc3BpdGUgb2YgRnJlZVR5cGUncyB1bmlmb3JtIEFQSS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfR2V0X1gxMV9Gb250X0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGZvcm1hdCBvZiBhIGdpdmVuIGZhY2UsIHVzaW5nIHZhbHVlcyAqLwotICAvKiAgIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGFuIFgxMSBGT05UX1BST1BFUlRZLiAgUG9zc2libGUgdmFsdWVzIGFyZSAgICAgKi8KLSAgLyogICBgVHJ1ZVR5cGUnLCBgVHlwZSAxJywgYEJERicsIGBQQ0YnLCBgVHlwZSA0MicsIGBDSUQgVHlwZSAxJywgYENGRicsICovCi0gIC8qICAgYFBGUicsIGFuZCBgV2luZG93cyBGTlQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgSW5wdXQgZmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZvbnQgZm9ybWF0IHN0cmluZy4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggY29uc3QgY2hhciogKQotICBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICk7Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUWEY4Nl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwMDQwMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYXV0b2hpbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgYGF1dG9oaW50JyBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGF1dG8taGludGVyIGlzIHVzZWQgdG8gbG9hZCBhbmQgYXV0b21hdGljYWxseSBoaW50IGdseXBocyBpZiBhICAgICovCi0gIC8qIGZvcm1hdC1zcGVjaWZpYyBoaW50ZXIgaXNuJ3QgYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FVVE9ISU5UX0hfXwotI2RlZmluZSBfX0FVVE9ISU5UX0hfXwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHNtYWxsIHRlY2huaWNhbCBub3RlIHJlZ2FyZGluZyBhdXRvbWF0aWMgaGludGluZyBpbiBvcmRlciB0byAgICAgICAgKi8KLSAgLyogY2xhcmlmeSB0aGlzIG1vZHVsZSBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbiBhdXRvbWF0aWMgaGludGVyIG1pZ2h0IGNvbXB1dGUgdHdvIGtpbmRzIG9mIGRhdGEgZm9yIGEgZ2l2ZW4gZmFjZTogKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gZ2xvYmFsIGhpbnRzOiBVc3VhbGx5IHNvbWUgbWV0cmljcyB0aGF0IGRlc2NyaWJlIGdsb2JhbCBwcm9wZXJ0aWVzICAqLwotICAvKiAgICAgICAgICAgICAgICAgb2YgdGhlIGZhY2UuICBJdCBpcyBjb21wdXRlZCBieSBzY2FubmluZyBtb3JlIG9yIGxlc3MgKi8KLSAgLyogICAgICAgICAgICAgICAgIGFnZ3Jlc3NpdmVseSB0aGUgZ2x5cGhzIGluIHRoZSBmYWNlLCBhbmQgdGh1cyBjYW4gYmUgICovCi0gIC8qICAgICAgICAgICAgICAgICB2ZXJ5IHNsb3cgdG8gY29tcHV0ZSAoZXZlbiBpZiB0aGUgc2l6ZSBvZiBnbG9iYWwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgaGludHMgaXMgcmVhbGx5IHNtYWxsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gZ2x5cGggaGludHM6ICBUaGVzZSBkZXNjcmliZSBzb21lIGltcG9ydGFudCBmZWF0dXJlcyBvZiB0aGUgZ2x5cGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgb3V0bGluZSwgYXMgd2VsbCBhcyBob3cgdG8gYWxpZ24gdGhlbS4gIFRoZXkgYXJlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGdlbmVyYWxseSBtdWNoIGZhc3RlciB0byBjb21wdXRlIHRoYW4gZ2xvYmFsIGhpbnRzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgY3VycmVudCBGcmVlVHlwZSBhdXRvLWhpbnRlciBkb2VzIGEgcHJldHR5IGdvb2Qgam9iIHdoaWxlICAgICAgICAgKi8KLSAgLyogcGVyZm9ybWluZyBmYXN0IGNvbXB1dGF0aW9ucyBmb3IgYm90aCBnbG9iYWwgYW5kIGdseXBoIGhpbnRzLiAgICAgICAgICovCi0gIC8qIEhvd2V2ZXIsIHdlIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gaW50cm9kdWNpbmcgbW9yZSBjb21wbGV4IGFuZCAgICAgICAqLwotICAvKiBwb3dlcmZ1bCBhbGdvcml0aG1zIGluIHRoZSBmdXR1cmUsIGxpa2UgdGhlIG9uZSBkZXNjcmliZWQgaW4gdGhlIEpvaG4gKi8KLSAgLyogRC4gSG9iYnkgcGFwZXIsIHdoaWNoIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgYSBsb3QgbW9yZSBob3JzZXBvd2VyLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCZWNhdXNlIGEgc3VmZmljaWVudGx5IHNvcGhpc3RpY2F0ZWQgZm9udCBtYW5hZ2VtZW50IHN5c3RlbSB3b3VsZCAgICAgKi8KLSAgLyogdHlwaWNhbGx5IGltcGxlbWVudCBhbiBMUlUgY2FjaGUgb2Ygb3BlbmVkIGZhY2Ugb2JqZWN0cyB0byByZWR1Y2UgICAgICovCi0gIC8qIG1lbW9yeSB1c2FnZSwgaXQgaXMgYSBnb29kIGlkZWEgdG8gYmUgYWJsZSB0byBhdm9pZCByZWNvbXB1dGluZyAgICAgICAqLwotICAvKiBnbG9iYWwgaGludHMgZXZlcnkgdGltZSB0aGUgc2FtZSBmYWNlIGlzIHJlLW9wZW5lZC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdlIHRodXMgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBjYWNoZSBnbG9iYWwgaGludHMgb3V0c2lkZSBvZiB0aGUgZmFjZSAqLwotICAvKiBvYmplY3QsIGluIG9yZGVyIHRvIHNwZWVkIHVwIGZvbnQgcmUtb3BlbmluZyB0aW1lLiAgT2YgY291cnNlLCB0aGlzICAgKi8KLSAgLyogZmVhdHVyZSBpcyBwdXJlbHkgb3B0aW9uYWwsIHNvIG1vc3QgY2xpZW50IHByb2dyYW1zIHdvbid0IGV2ZW4gbm90aWNlICovCi0gIC8qIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSSBpbml0aWFsbHkgdGhvdWdodCB0aGF0IGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoZSBnbHlwaCAgICovCi0gIC8qIGhpbnRzIHRvby4gIEhvd2V2ZXIsIG15IGdlbmVyYWwgaWRlYSBub3cgaXMgdGhhdCBpZiB5b3UgcmVhbGx5IG5lZWQgICAqLwotICAvKiB0byBjYWNoZSB0aGVzZSB0b28sIHlvdSBhcmUgc2ltcGx5IGluIG5lZWQgb2YgYSBuZXcgZm9udCBmb3JtYXQsICAgICAgKi8KLSAgLyogd2hlcmUgYWxsIHRoaXMgaW5mb3JtYXRpb24gY291bGQgYmUgc3RvcmVkIHdpdGhpbiB0aGUgZm9udCBmaWxlIGFuZCAgICovCi0gIC8qIGRlY29kZWQgb24gdGhlIGZseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICB0eXBlZGVmIHN0cnVjdCBGVF9BdXRvSGludGVyUmVjXyAgKkZUX0F1dG9IaW50ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbEdldEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZXMgdGhlIGdsb2JhbCBoaW50cyBjb21wdXRlZCBmb3IgYSBnaXZlbiBmYWNlIG9iamVjdCB0aGUgICAgKi8KLSAgLyogICAgcmVzdWx0aW5nIGRhdGEgaXMgZGlzc29jaWF0ZWQgZnJvbSB0aGUgZmFjZSBhbmQgd2lsbCBzdXJ2aXZlIGEgICAgICovCi0gIC8qICAgIGNhbGwgdG8gRlRfRG9uZV9GYWNlKCkuICBJdCBtdXN0IGJlIGRpc2NhcmRlZCB0aHJvdWdoIHRoZSBBUEkgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50ZXIgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgYXV0by1oaW50ZXIuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdsb2JhbF9oaW50cyAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBnbG9iYWwgaGludHMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2xvYmFsX2xlbiAgICA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZ2xvYmFsIGhpbnRzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9BdXRvSGludGVyX0dsb2JhbEdldEZ1bmMpKCBGVF9BdXRvSGludGVyICBoaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICBnbG9iYWxfaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyogICAgICAgICAgZ2xvYmFsX2xlbiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxEb25lRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZHMgdGhlIGdsb2JhbCBoaW50cyByZXRyaWV2ZWQgdGhyb3VnaCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYygpLiAgVGhpcyBpcyB0aGUgb25seSB3YXkgdGhlc2UgaGludHMgICAqLwotICAvKiAgICBhcmUgZnJlZWQgZnJvbSBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50ZXIgOjogQSBoYW5kbGUgdG8gdGhlIGF1dG8taGludGVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdsb2JhbCA6OiBBIHBvaW50ZXIgdG8gcmV0cmlldmVkIGdsb2JhbCBoaW50cyB0byBkaXNjYXJkLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfQXV0b0hpbnRlcl9HbG9iYWxEb25lRnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgZ2xvYmFsICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbFJlc2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjb21wdXRlIHRoZSBnbG9iYWwgbWV0cmljcyBpbiBhIGdpdmVuICAgKi8KLSAgLyogICAgZm9udC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gZ2xvYmFsIGZvbnQgZGF0YSBjaGFuZ2VzIChlLmcuIE11bHRpcGxlICovCi0gIC8qICAgIE1hc3RlcnMgZm9udHMgd2hlcmUgYmxlbmQgY29vcmRpbmF0ZXMgY2hhbmdlKS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRlciA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGF1dG8taGludGVyLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9BdXRvSGludGVyX0dsb2JhbFJlc2V0RnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2x5cGhMb2FkRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkLCBzY2FsZSwgYW5kIGF1dG9tYXRpY2FsbHkgaGludCBhICAgICAqLwotICAvKiAgICBnbHlwaCBmcm9tIGEgZ2l2ZW4gZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogVGhlIGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBjYXBhYmxlIG9mIGxvYWRpbmcgY29tcG9zaXRlIGdseXBocyBieSBoaW50aW5nICAgICovCi0gIC8qICAgIGVhY2ggc3ViLWdseXBoIGluZGVwZW5kZW50bHkgKHdoaWNoIGltcHJvdmVzIHF1YWxpdHkpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgd2lsbCBjYWxsIHRoZSBmb250IGRyaXZlciB3aXRoIEZUX0xvYWRfR2x5cGgoKSwgd2l0aCAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fU0NBTEUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0F1dG9IaW50ZXJfR2x5cGhMb2FkRnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICAgbG9hZF9mbGFncyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9TZXJ2aWNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGF1dG8taGludGVyIG1vZHVsZSdzIGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQXV0b0hpbnRlcl9TZXJ2aWNlUmVjXwotICB7Ci0gICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxSZXNldEZ1bmMgIHJlc2V0X2ZhY2U7Ci0gICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxHZXRGdW5jICAgIGdldF9nbG9iYWxfaGludHM7Ci0gICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxEb25lRnVuYyAgIGRvbmVfZ2xvYmFsX2hpbnRzOwotICAgIEZUX0F1dG9IaW50ZXJfR2x5cGhMb2FkRnVuYyAgICBsb2FkX2dseXBoOwotCi0gIH0gRlRfQXV0b0hpbnRlcl9TZXJ2aWNlUmVjLCAqRlRfQXV0b0hpbnRlcl9TZXJ2aWNlOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fQVVUT0hJTlRfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkZWYzNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2FsYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBcml0aG1ldGljIGNvbXB1dGF0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA4IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQ0FMQ19IX18KLSNkZWZpbmUgX19GVENBTENfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GaXhlZFNxcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgc3F1YXJlIHJvb3Qgb2YgYSAxNi4xNiBmaXhlZCBwb2ludCB2YWx1ZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4IDo6IFRoZSB2YWx1ZSB0byBjb21wdXRlIHRoZSByb290IGZvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGBzcXJ0KHgpJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB2ZXJ5IGZhc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0ludDMyICkKLSAgRlRfU3FydEZpeGVkKCBGVF9JbnQzMiAgeCApOwotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TcXJ0MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgc3F1YXJlIHJvb3Qgb2YgYW4gSW50MzIgaW50ZWdlciAod2hpY2ggd2lsbCBiZSAgICAgICAgKi8KLSAgLyogICAgaGFuZGxlZCBhcyBhbiB1bnNpZ25lZCBsb25nIHZhbHVlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeCA6OiBUaGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgcm9vdCBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgc3FydCh4KScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0ludDMyICkKLSAgRlRfU3FydDMyKCBGVF9JbnQzMiAgeCApOwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX011bERpdigpIGFuZCBGVF9NdWxGaXgoKSBhcmUgZGVjbGFyZWQgaW4gZnJlZXR5cGUuaC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bERpdl9Ob19Sb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiBgKGEqYikvYycgICAqLwotICAvKiAgICAod2l0aG91dCByb3VuZGluZykgd2l0aCBtYXhpbWFsIGFjY3VyYWN5IChpdCB1c2VzIGEgNjQtYml0ICAgICAgICAgKi8KLSAgLyogICAgaW50ZXJtZWRpYXRlIGludGVnZXIgd2hlbmV2ZXIgbmVjZXNzYXJ5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzbid0IG5lY2Vzc2FyaWx5IGFzIGZhc3QgYXMgc29tZSBwcm9jZXNzb3Igc3BlY2lmaWMgKi8KLSAgLyogICAgb3BlcmF0aW9ucywgYnV0IGlzIGF0IGxlYXN0IGNvbXBsZXRlbHkgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA6OiBUaGUgZmlyc3QgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjIDo6IFRoZSBkaXZpc29yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSpiKS9jJy4gIFRoaXMgZnVuY3Rpb24gbmV2ZXIgdHJhcHMgd2hlbiB0cnlpbmcgdG8gKi8KLSAgLyogICAgZGl2aWRlIGJ5IHplcm87IGl0IHNpbXBseSByZXR1cm5zIGBNYXhJbnQnIG9yIGBNaW5JbnQnIGRlcGVuZGluZyAgICovCi0gIC8qICAgIG9uIHRoZSBzaWducyBvZiBgYScgYW5kIGBiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfTG9uZyApCi0gIEZUX011bERpdl9Ob19Sb3VuZCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGMgKTsKLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoKLSAgICogIEEgdmFyaWFudCBvZiBGVF9NYXRyaXhfTXVsdGlwbHkgd2hpY2ggc2NhbGVzIGl0cyByZXN1bHQgYWZ0ZXJ3YXJkcy4KLSAgICogIFRoZSBpZGVhIGlzIHRoYXQgYm90aCBgYScgYW5kIGBiJyBhcmUgc2NhbGVkIGJ5IGZhY3RvcnMgb2YgMTAgc28gdGhhdAotICAgKiAgdGhlIHZhbHVlcyBhcmUgYXMgcHJlY2lzZSBhcyBwb3NzaWJsZSB0byBnZXQgYSBjb3JyZWN0IHJlc3VsdCBkdXJpbmcKLSAgICogIHRoZSA2NGJpdCBtdWx0aXBsaWNhdGlvbi4gIExldCBgc2EnIGFuZCBgc2InIGJlIHRoZSBzY2FsaW5nIGZhY3RvcnMgb2YKLSAgICogIGBhJyBhbmQgYGInLCByZXNwZWN0aXZlbHksIHRoZW4gdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSByZXN1bHQgaXMKLSAgICogIGBzYSpzYicuCi0gICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZCggY29uc3QgRlRfTWF0cml4KiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4ICAgICAgICAqYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgc2NhbGluZyApOwotCi0KLSAgLyoKLSAgICogIEEgdmFyaWFudCBvZiBGVF9WZWN0b3JfVHJhbnNmb3JtLiAgU2VlIGNvbW1lbnRzIGZvcgotICAgKiAgRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZC4KLSAgICovCi0KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1ZlY3Rvcl9UcmFuc2Zvcm1fU2NhbGVkKCBGVF9WZWN0b3IqICAgICAgICB2ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgICBzY2FsaW5nICk7Ci0KLQotICAvKgotICAgKiAgUmV0dXJuIC0xLCAwLCBvciArMSwgZGVwZW5kaW5nIG9uIHRoZSBvcmllbnRhdGlvbiBvZiBhIGdpdmVuIGNvcm5lci4KLSAgICogIFdlIHVzZSB0aGUgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtLCB3aXRoIHBvc2l0aXZlIHZlcnRpY2FsIHZhbHVlcwotICAgKiAgZ29pbmcgdXB3YXJkcy4gIFRoZSBmdW5jdGlvbiByZXR1cm5zICsxIGlmIHRoZSBjb3JuZXIgdHVybnMgdG8gdGhlCi0gICAqICBsZWZ0LCAtMSB0byB0aGUgcmlnaHQsIGFuZCAwIGZvciB1bmRlY2lkYWJsZSBjYXNlcy4KLSAgICovCi0gIEZUX0JBU0UoIEZUX0ludCApCi0gIGZ0X2Nvcm5lcl9vcmllbnRhdGlvbiggRlRfUG9zICBpbl94LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgaW5feSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF94LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3kgKTsKLQotICAvKgotICAgKiAgUmV0dXJuIFRSVUUgaWYgYSBjb3JuZXIgaXMgZmxhdCBvciBuZWFybHkgZmxhdC4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgKiAgc2F5aW5nIHRoYXQgdGhlIGFuZ2xlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYGluJyBhbmQgYG91dCcgdmVjdG9ycyBpcwotICAgKiAgdmVyeSBzbWFsbC4KLSAgICovCi0gIEZUX0JBU0UoIEZUX0ludCApCi0gIGZ0X2Nvcm5lcl9pc19mbGF0KCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGluX3ksCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF94LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApOwotCi0KLSNkZWZpbmUgSU5UX1RPX0YyNkRPVDYoIHggKSAgICAoIChGVF9Mb25nKSh4KSA8PCA2ICApCi0jZGVmaW5lIElOVF9UT19GMkRPVDE0KCB4ICkgICAgKCAoRlRfTG9uZykoeCkgPDwgMTQgKQotI2RlZmluZSBJTlRfVE9fRklYRUQoIHggKSAgICAgICggKEZUX0xvbmcpKHgpIDw8IDE2ICkKLSNkZWZpbmUgRjJET1QxNF9UT19GSVhFRCggeCApICAoIChGVF9Mb25nKSh4KSA8PCAyICApCi0jZGVmaW5lIEZMT0FUX1RPX0ZJWEVEKCB4ICkgICAgKCAoRlRfTG9uZykoIHggKiA2NTUzNi4wICkgKQotCi0jZGVmaW5lIFJPVU5EX0YyNkRPVDYoIHggKSAgICAgKCB4ID49IDAgPyAoICAgICggKHgpICsgMzIgKSAmIC02NCApICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIC0oICggMzIgLSAoeCkgKSAmIC02NCApICkgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRDQUxDX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwYWY0Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRlYnVnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIElNUE9SVEFOVDogQSBkZXNjcmlwdGlvbiBvZiBGcmVlVHlwZSdzIGRlYnVnZ2luZyBzdXBwb3J0IGNhbiBiZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgIGZvdW5kIGluIGBkb2NzL0RFQlVHLlRYVCcuICBSZWFkIGl0IGlmIHlvdSBuZWVkIHRvIHVzZSBvciAgICovCi0vKiAgICAgICAgICAgICB1bmRlcnN0YW5kIHRoaXMgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUREVCVUdfSF9fCi0jZGVmaW5lIF9fRlRERUJVR19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogZm9yY2UgdGhlIGRlZmluaXRpb24gb2YgRlRfREVCVUdfTEVWRUxfRVJST1IgaWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLSAgLyogaXMgYWxyZWFkeSBkZWZpbmVkOyB0aGlzIHNpbXBsaWZpZXMgdGhlIGZvbGxvd2luZyAjaWZkZWZzICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotI3VuZGVmICBGVF9ERUJVR19MRVZFTF9FUlJPUgotI2RlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGUgdHJhY2UgZW51bXMgYXMgd2VsbCBhcyB0aGUgdHJhY2UgbGV2ZWxzIGFycmF5IHdoZW4gdGhleSAgICAqLwotICAvKiBhcmUgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotI2RlZmluZSBGVF9UUkFDRV9ERUYoIHggKSAgdHJhY2VfICMjIHggLAotCi0gIC8qIGRlZmluaW5nIHRoZSBlbnVtZXJhdGlvbiAqLwotICB0eXBlZGVmIGVudW0gIEZUX1RyYWNlXwotICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICi0gICAgdHJhY2VfY291bnQKLQotICB9IEZUX1RyYWNlOwotCi0KLSAgLyogZGVmaW5pbmcgdGhlIGFycmF5IG9mIHRyYWNlIGxldmVscywgcHJvdmlkZWQgYnkgYHNyYy9iYXNlL2Z0ZGVidWcuYycgKi8KLSAgZXh0ZXJuIGludCAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2NvdW50XTsKLQotI3VuZGVmIEZUX1RSQUNFX0RFRgotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoZSBGVF9UUkFDRSBtYWNybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJTVBPUlRBTlQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggY29tcG9uZW50IG11c3QgZGVmaW5lIHRoZSBtYWNybyBGVF9DT01QT05FTlQgdG8gYSB2YWxpZCBGVF9UcmFjZSAqLwotICAvKiB2YWx1ZSBiZWZvcmUgdXNpbmcgYW55IFRSQUNFIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCBmdF90cmFjZV9sZXZlbHNbRlRfQ09NUE9ORU5UXSA+PSBsZXZlbCApIFwKLSAgICAgICAgICAgICAgRlRfTWVzc2FnZSB2YXJmb3JtYXQ7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSB3aGlsZSAoIDAgKQotCi0jZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICBkbyA7IHdoaWxlICggMCApICAgICAgLyogbm90aGluZyAqLwotCi0jZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9UcmFjZV9HZXRfQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdHJhY2UgY29tcG9uZW50cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbnVtYmVyIG9mIHRyYWNlIGNvbXBvbmVudHMuICAwIGlmIEZyZWVUeXBlIDIgaXMgbm90IGJ1aWx0IHdpdGggKi8KLSAgLyogICAgRlRfREVCVUdfTEVWRUxfVFJBQ0UgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY2VzcyBlbGVtZW50cyBvZiAgICAgICovCi0gIC8qICAgIHRoZSBpbnRlcm5hbCBgZnRfdHJhY2VfbGV2ZWxzJyBhcnJheSBieSBhbiBpbmRleC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfSW50ICkKLSAgRlRfVHJhY2VfR2V0X0NvdW50KCB2b2lkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9UcmFjZV9HZXRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIG5hbWUgb2YgYSB0cmFjZSBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgaW5kZXggb2YgdGhlIHRyYWNlIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbmFtZSBvZiB0aGUgdHJhY2UgY29tcG9uZW50LiAgVGhpcyBpcyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkICAgKi8KLSAgLyogICAgQyBzdHJpbmcsIHNvIGRvIG5vdCBmcmVlIGl0IGFmdGVyIHVzZS4gIE5VTEwgaWYgRnJlZVR5cGUgMiBpcyBub3QgICovCi0gIC8qICAgIGJ1aWx0IHdpdGggRlRfREVCVUdfTEVWRUxfVFJBQ0UgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBARlRfVHJhY2VfR2V0X0NvdW50IHRvIGdldCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFjZSAgICAgICAqLwotICAvKiAgICBjb21wb25lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjb250cm9sIEZyZWVUeXBlIDIncyAgICAqLwotICAvKiAgICBkZWJ1ZyBsZXZlbCBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIGNvbnN0IGNoYXIgKiApCi0gIEZUX1RyYWNlX0dldF9OYW1lKCBGVF9JbnQgIGlkeCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBZb3UgbmVlZCB0d28gb3BlbmluZyBhbmQgY2xvc2luZyBwYXJlbnRoZXNlcyEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEV4YW1wbGU6IEZUX1RSQUNFMCgoICJWYWx1ZSBpcyAlaSIsIGZvbyApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3V0cHV0IG9mIHRoZSBGVF9UUkFDRVggbWFjcm9zIGlzIHNlbnQgdG8gc3RkZXJyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGVF9UUkFDRTAoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMCwgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0UxKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDEsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFMiggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCAyLCB2YXJmb3JtYXQgKQotI2RlZmluZSBGVF9UUkFDRTMoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMywgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0U0KCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDQsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFNSggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA1LCB2YXJmb3JtYXQgKQotI2RlZmluZSBGVF9UUkFDRTYoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggNiwgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0U3KCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDcsIHZhcmZvcm1hdCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGUgRlRfRVJST1IgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3V0cHV0IG9mIHRoaXMgbWFjcm8gaXMgc2VudCB0byBzdGRlcnIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0KLSNkZWZpbmUgRlRfRVJST1IoIHZhcmZvcm1hdCApICBGVF9NZXNzYWdlICB2YXJmb3JtYXQKLQotI2Vsc2UgIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0jZGVmaW5lIEZUX0VSUk9SKCB2YXJmb3JtYXQgKSAgZG8gOyB3aGlsZSAoIDAgKSAgICAgIC8qIG5vdGhpbmcgKi8KLQotI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIEZUX0FTU0VSVCBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKLQotI2RlZmluZSBGVF9BU1NFUlQoIGNvbmRpdGlvbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCAhKCBjb25kaXRpb24gKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIEZUX1BhbmljKCAiYXNzZXJ0aW9uIGZhaWxlZCBvbiBsaW5lICVkIG9mIGZpbGUgJXNcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBfX0ZJTEVfXyApOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotI2Vsc2UgLyogIUZUX0RFQlVHX0xFVkVMX0VSUk9SICovCi0KLSNkZWZpbmUgRlRfQVNTRVJUKCBjb25kaXRpb24gKSAgZG8gOyB3aGlsZSAoIDAgKQotCi0jZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX0VSUk9SICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBgRlRfTWVzc2FnZScgYW5kIGBGVF9QYW5pYycgd2hlbiBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgotCi0jaW5jbHVkZSAic3RkaW8uaCIgIC8qIGZvciB2ZnByaW50ZigpICovCi0KLSAgLyogcHJpbnQgYSBtZXNzYWdlICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9NZXNzYWdlKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgICAuLi4gKTsKLQotICAvKiBwcmludCBhIG1lc3NhZ2UgYW5kIGV4aXQgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1BhbmljKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgLi4uICk7Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X2RlYnVnX2luaXQoIHZvaWQgKTsKLQotCi0jaWYgZGVmaW5lZCggX01TQ19WRVIgKSAgICAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0KLSAgLyogV2UgZGlzYWJsZSB0aGUgd2FybmluZyBgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCcgaGVyZSAqLwotICAvKiBpbiBvcmRlciB0byBjb21waWxlIGNsZWFubHkgd2l0aCB0aGUgbWF4aW11bSBsZXZlbCBvZiB3YXJuaW5ncy4gICovCi0jcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTI3ICkKLQotI2VuZGlmIC8qIF9NU0NfVkVSICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVERFQlVHX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzc4NjRhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRyaXZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNiwgMjAwOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVERSSVZFUl9IX18KLSNkZWZpbmUgX19GVERSSVZFUl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0ZhY2VfSW5pdEZ1bmMpKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIHR5cGVmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbWV0ZXJzICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfRmFjZV9Eb25lRnVuYykoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TaXplX0luaXRGdW5jKSggRlRfU2l6ZSAgc2l6ZSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1NpemVfRG9uZUZ1bmMpKCBGVF9TaXplICBzaXplICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2xvdF9Jbml0RnVuYykoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1Nsb3RfRG9uZUZ1bmMpKCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TaXplX1JlcXVlc3RGdW5jKSggRlRfU2l6ZSAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TaXplX1NlbGVjdEZ1bmMpKCBGVF9TaXplICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc2l6ZV9pbmRleCApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NpemVfUmVzZXRQb2ludHNGdW5jKSggRlRfU2l6ZSAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGhvcnpfcmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHZlcnRfcmVzb2x1dGlvbiApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TaXplX1Jlc2V0UGl4ZWxzRnVuYykoIEZUX1NpemUgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHBpeGVsX2hlaWdodCApOwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTICovCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1Nsb3RfTG9hZEZ1bmMpKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpGVF9DaGFyTWFwX0NoYXJJbmRleEZ1bmMpKCBGVF9DaGFyTWFwICBjaGFybWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGNoYXJjb2RlICk7Ci0KLSAgdHlwZWRlZiBGVF9Mb25nCi0gICgqRlRfQ2hhck1hcF9DaGFyTmV4dEZ1bmMpKCBGVF9DaGFyTWFwICBjaGFybWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgY2hhcmNvZGUgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfRmFjZV9HZXRLZXJuaW5nRnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBrZXJuaW5nICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0ZhY2VfQXR0YWNoRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRHJpdmVyX0NsYXNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbnQgZHJpdmVyIGNsYXNzLiAgVGhpcyBzdHJ1Y3R1cmUgbW9zdGx5IGNvbnRhaW5zIHBvaW50ZXJzIHRvICovCi0gIC8qICAgIGRyaXZlciBtZXRob2RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICAgICAgICAgICAgOjogVGhlIHBhcmVudCBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9vYmplY3Rfc2l6ZSA6OiBUaGUgc2l6ZSBvZiBhIGZhY2Ugb2JqZWN0IGluIGJ5dGVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplX29iamVjdF9zaXplIDo6IFRoZSBzaXplIG9mIGEgc2l6ZSBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3Rfb2JqZWN0X3NpemUgOjogVGhlIHNpemUgb2YgYSBnbHlwaCBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5pdF9mYWNlICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIGZhY2UgY29uc3RydWN0b3IuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkb25lX2ZhY2UgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgZmFjZSBkZXN0cnVjdG9yLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluaXRfc2l6ZSAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzaXplIGNvbnN0cnVjdG9yLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9uZV9zaXplICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIHNpemUgZGVzdHJ1Y3Rvci4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbml0X3Nsb3QgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgc2xvdCBjb25zdHJ1Y3Rvci4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRvbmVfc2xvdCAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzbG90IGRlc3RydWN0b3IuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZ2x5cGggICAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdG8gbG9hZCBhIGdseXBoIHRvIGEgc2xvdC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgbWFuZGF0b3J5ISAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9rZXJuaW5nICAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdG8gcmV0dXJuIHRoZSB1bnNjYWxlZCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5pbmcgZm9yIGEgZ2l2ZW4gcGFpciBvZiBnbHlwaHMuICBDYW4gYmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gMCBpZiB0aGUgZm9ybWF0IGRvZXNuJ3Qgc3VwcG9ydCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXR0YWNoX2ZpbGUgICAgICA6OiBUaGlzIGZ1bmN0aW9uIGhhbmRsZSBpcyB1c2VkIHRvIHJlYWQgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBkYXRhIGZvciBhIGZhY2UgZnJvbSBhbm90aGVyICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUvc3RyZWFtLiAgRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBhZGQgZGF0YSBmcm9tIEFGTSBvciBQRk0gZmlsZXMgb24gYSBUeXBlIDEgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwgb3IgYSBDSURNYXAgb24gYSBDSUQta2V5ZWQgZmFjZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2V0X2FkdmFuY2VzICAgICA6OiBBIGZ1bmN0aW9uIGhhbmRsZSB1c2VkIHRvIHJldHVybiBhZHZhbmNlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIG9mIGBjb3VudCcgZ2x5cGhzIChpbiBmb250IHVuaXRzKSwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IGBmaXJzdCcuICBUaGUgYHZlcnRpY2FsJyBmbGFnIG11c3QgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gZ2V0IHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0cy4gIFRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYGFkdmFuY2VzJyBidWZmZXIgaXMgY2FsbGVyLWFsbG9jYXRlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQuICBUaGUgaWRlYSBvZiB0aGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcyB0byBiZSBhYmxlIHRvIHBlcmZvcm0gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLWluZGVwZW5kZW50IHRleHQgbGF5b3V0IHdpdGhvdXQgbG9hZGluZyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGEgc2luZ2xlIGdseXBoIGltYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcXVlc3Rfc2l6ZSAgICAgOjogQSBoYW5kbGUgdG8gYSBmdW5jdGlvbiB1c2VkIHRvIHJlcXVlc3QgdGhlIG5ldyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzaXplLiAgQ2FuIGJlIHNldCB0byAwIGlmIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nIGRvbmUgaW4gdGhlIGJhc2UgbGF5ZXIgc3VmZmljZXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZWxlY3Rfc2l6ZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgZnVuY3Rpb24gdXNlZCB0byBzZWxlY3QgYSBuZXcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCBzaXplLiAgSXQgaXMgdXNlZCBvbmx5IGlmICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyBpcyBzZXQuICBDYW4gYmUgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIDAgaWYgdGhlIHNjYWxpbmcgZG9uZSBpbiB0aGUgYmFzZSBsYXllciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzdWZmaWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb3N0IGZ1bmN0aW9uIHBvaW50ZXJzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYGxvYWRfZ2x5cGgnLCBjYW4gYmUgKi8KLSAgLyogICAgc2V0IHRvIDAgdG8gaW5kaWNhdGUgYSBkZWZhdWx0IGJlaGF2aW91ci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfRHJpdmVyX0NsYXNzUmVjXwotICB7Ci0gICAgRlRfTW9kdWxlX0NsYXNzICAgICAgICAgICByb290OwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgICBmYWNlX29iamVjdF9zaXplOwotICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICAgc2l6ZV9vYmplY3Rfc2l6ZTsKLSAgICBGVF9Mb25nICAgICAgICAgICAgICAgICAgIHNsb3Rfb2JqZWN0X3NpemU7Ci0KLSAgICBGVF9GYWNlX0luaXRGdW5jICAgICAgICAgIGluaXRfZmFjZTsKLSAgICBGVF9GYWNlX0RvbmVGdW5jICAgICAgICAgIGRvbmVfZmFjZTsKLQotICAgIEZUX1NpemVfSW5pdEZ1bmMgICAgICAgICAgaW5pdF9zaXplOwotICAgIEZUX1NpemVfRG9uZUZ1bmMgICAgICAgICAgZG9uZV9zaXplOwotCi0gICAgRlRfU2xvdF9Jbml0RnVuYyAgICAgICAgICBpbml0X3Nsb3Q7Ci0gICAgRlRfU2xvdF9Eb25lRnVuYyAgICAgICAgICBkb25lX3Nsb3Q7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotICAgIEZUX1NpemVfUmVzZXRQb2ludHNGdW5jICAgc2V0X2NoYXJfc2l6ZXM7Ci0gICAgRlRfU2l6ZV9SZXNldFBpeGVsc0Z1bmMgICBzZXRfcGl4ZWxfc2l6ZXM7Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KLQotICAgIEZUX1Nsb3RfTG9hZEZ1bmMgICAgICAgICAgbG9hZF9nbHlwaDsKLQotICAgIEZUX0ZhY2VfR2V0S2VybmluZ0Z1bmMgICAgZ2V0X2tlcm5pbmc7Ci0gICAgRlRfRmFjZV9BdHRhY2hGdW5jICAgICAgICBhdHRhY2hfZmlsZTsKLSAgICBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAgIGdldF9hZHZhbmNlczsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4yICovCi0gICAgRlRfU2l6ZV9SZXF1ZXN0RnVuYyAgICAgICByZXF1ZXN0X3NpemU7Ci0gICAgRlRfU2l6ZV9TZWxlY3RGdW5jICAgICAgICBzZWxlY3Rfc2l6ZTsKLQotICB9IEZUX0RyaXZlcl9DbGFzc1JlYywgKkZUX0RyaXZlcl9DbGFzczsKLQotCi0gIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCBhcyBzdHVicyBmb3IgYHNldF9jaGFyX3NpemVzJyBhbmQKLSAgICogIGBzZXRfcGl4ZWxfc2l6ZXMnOyB0aGUgY29kZSB1c2VzIGByZXF1ZXN0X3NpemUnIGFuZCBgc2VsZWN0X3NpemUnCi0gICAqICBmdW5jdGlvbnMgaW5zdGVhZC4KLSAgICoKLSAgICogIEltcGxlbWVudGF0aW9uIGlzIGluIGBzcmMvYmFzZS9mdG9ianMuYycuCi0gICAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgZnRfc3R1Yl9zZXRfY2hhcl9zaXplcyggRlRfU2l6ZSAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaG9yel9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHZlcnRfcmVzICk7Ci0KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBmdF9zdHViX3NldF9waXhlbF9zaXplcyggRlRfU2l6ZSAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgaGVpZ2h0ICk7Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZURFJJVkVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQ3YzBiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdsb2Fkci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEdMT0FEUl9IX18KLSNkZWZpbmUgX19GVEdMT0FEUl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBsb2FkZXIgaXMgYW4gaW50ZXJuYWwgb2JqZWN0IHVzZWQgdG8gbG9hZCBzZXZlcmFsIGdseXBocyAqLwotICAvKiAgICB0b2dldGhlciAoZm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIGNvbXBvc2l0ZXMpLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ2x5cGggbG9hZGVyIGltcGxlbWVudGF0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBoaWdoLWxldmVsIEFQSSwgKi8KLSAgLyogICAgaGVuY2UgdGhlIGZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaExvYWRlclJlY18qICBGVF9HbHlwaExvYWRlciA7Ci0KLQotI2lmIDAgIC8qIG1vdmVkIHRvIGZyZWV0eXBlLmggaW4gdmVyc2lvbiAyLjIgKi8KLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9XT1JEUyAgICAgICAgICAxCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTICAgICAgMgotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1JPVU5EX1hZX1RPX0dSSUQgICAgICAgIDQKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19TQ0FMRSAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfWFlfU0NBTEUgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHXzJYMiAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUyAgICAgIDB4MjAwCi0jZW5kaWYKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TdWJHbHlwaFJlY18KLSAgewotICAgIEZUX0ludCAgICAgaW5kZXg7Ci0gICAgRlRfVVNob3J0ICBmbGFnczsKLSAgICBGVF9JbnQgICAgIGFyZzE7Ci0gICAgRlRfSW50ICAgICBhcmcyOwotICAgIEZUX01hdHJpeCAgdHJhbnNmb3JtOwotCi0gIH0gRlRfU3ViR2x5cGhSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhMb2FkUmVjXwotICB7Ci0gICAgRlRfT3V0bGluZSAgIG91dGxpbmU7ICAgICAgIC8qIG91dGxpbmUgICAgICAgICAgICAgKi8KLSAgICBGVF9WZWN0b3IqICAgZXh0cmFfcG9pbnRzOyAgLyogZXh0cmEgcG9pbnRzIHRhYmxlICAqLwotICAgIEZUX1ZlY3RvciogICBleHRyYV9wb2ludHMyOyAvKiBzZWNvbmQgZXh0cmEgcG9pbnRzIHRhYmxlICovCi0gICAgRlRfVUludCAgICAgIG51bV9zdWJnbHlwaHM7IC8qIG51bWJlciBvZiBzdWJnbHlwaHMgKi8KLSAgICBGVF9TdWJHbHlwaCAgc3ViZ2x5cGhzOyAgICAgLyogc3ViZ2x5cGhzICAgICAgICAgICAqLwotCi0gIH0gRlRfR2x5cGhMb2FkUmVjLCAqRlRfR2x5cGhMb2FkOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoTG9hZGVyUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnk7Ci0gICAgRlRfVUludCAgICAgICAgICBtYXhfcG9pbnRzOwotICAgIEZUX1VJbnQgICAgICAgICAgbWF4X2NvbnRvdXJzOwotICAgIEZUX1VJbnQgICAgICAgICAgbWF4X3N1YmdseXBoczsKLSAgICBGVF9Cb29sICAgICAgICAgIHVzZV9leHRyYTsKLQotICAgIEZUX0dseXBoTG9hZFJlYyAgYmFzZTsKLSAgICBGVF9HbHlwaExvYWRSZWMgIGN1cnJlbnQ7Ci0KLSAgICB2b2lkKiAgICAgICAgICAgIG90aGVyOyAgICAgICAgICAgIC8qIGZvciBwb3NzaWJsZSBmdXR1cmUgZXh0ZW5zaW9uPyAqLwotCi0gIH0gRlRfR2x5cGhMb2FkZXJSZWM7Ci0KLQotICAvKiBjcmVhdGUgbmV3IGVtcHR5IGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX05ldyggRlRfTWVtb3J5ICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhMb2FkZXIgICphbG9hZGVyICk7Ci0KLSAgLyogYWRkIGFuIGV4dHJhIHBvaW50cyB0YWJsZSB0byBhIGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogZGVzdHJveSBhIGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfRG9uZSggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOwotCi0gIC8qIHJlc2V0IGEgZ2x5cGggbG9hZGVyIChmcmVlcyBldmVyeXRoaW5nIGludCBpdCkgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1Jlc2V0KCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogcmV3aW5kIGEgZ2x5cGggbG9hZGVyICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKLQotICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byBhZGQgYG5fcG9pbnRzJyBhbmQgYG5fY29udG91cnMnICovCi0gIC8qIHRvIHRoZSBnbHlwaCBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX2NvbnRvdXJzICk7Ci0KLQotI2RlZmluZSBGVF9HTFlQSExPQURFUl9DSEVDS19QKCBfbG9hZGVyLCBfY291bnQgKSAgICAgICAgICAgICAgICAgICAgXAotICAgKCAoX2NvdW50KSA9PSAwIHx8IChpbnQpKChfbG9hZGVyKS0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzICAgICsgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfbG9hZGVyKS0+Y3VycmVudC5vdXRsaW5lLm5fcG9pbnRzICsgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfY291bnQpKSA8PSAoaW50KShfbG9hZGVyKS0+bWF4X3BvaW50cyApCi0KLSNkZWZpbmUgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfQyggX2xvYWRlciwgX2NvdW50ICkgICAgICAgICAgICAgICAgICAgICBcCi0gICggKF9jb3VudCkgPT0gMCB8fCAoaW50KSgoX2xvYWRlciktPmJhc2Uub3V0bGluZS5uX2NvbnRvdXJzICAgICsgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9sb2FkZXIpLT5jdXJyZW50Lm91dGxpbmUubl9jb250b3VycyArICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChfY291bnQpKSA8PSAoaW50KShfbG9hZGVyKS0+bWF4X2NvbnRvdXJzICkKLQotI2RlZmluZSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIF9sb2FkZXIsIF9wb2ludHMsX2NvbnRvdXJzICkgICAgICBcCi0gICggKCBGVF9HTFlQSExPQURFUl9DSEVDS19QKCBfbG9hZGVyLCBfcG9pbnRzICkgICAmJiAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0dMWVBITE9BREVSX0NIRUNLX0MoIF9sb2FkZXIsIF9jb250b3VycyApICkgICAgICAgICAgICAgICAgICAgXAotICAgID8gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgOiBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggKF9sb2FkZXIpLCAoX3BvaW50cyksIChfY29udG91cnMpICkgKQotCi0KLSAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gYWRkIGBuX3N1YnMnIHN1Yi1nbHlwaHMgdG8gKi8KLSAgLyogYSBnbHlwaCBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9DaGVja1N1YkdseXBocyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX3N1YnMgKTsKLQotICAvKiBwcmVwYXJlIGEgZ2x5cGggbG9hZGVyLCBpLmUuIGVtcHR5IHRoZSBjdXJyZW50IGdseXBoICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9QcmVwYXJlKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogYWRkIHRoZSBjdXJyZW50IGdseXBoIHRvIHRoZSBiYXNlIGdseXBoICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9BZGQoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKLQotICAvKiBjb3B5IHBvaW50cyBmcm9tIG9uZSBnbHlwaCBsb2FkZXIgdG8gYW5vdGhlciAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NvcHlQb2ludHMoIEZUX0dseXBoTG9hZGVyICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoTG9hZGVyICBzb3VyY2UgKTsKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVEdMT0FEUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxMGNhOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtZW1vcnkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBtZW1vcnkgbWFuYWdlbWVudCBtYWNyb3MgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRNRU1PUllfSF9fCi0jZGVmaW5lIF9fRlRNRU1PUllfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NFVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBzZXQgYW4gaW1wbGljaXQgYGVycm9yJyB2YXJpYWJsZSB0byBhIGdpdmVuICAqLwotICAvKiAgICBleHByZXNzaW9uJ3MgdmFsdWUgKHVzdWFsbHkgYSBmdW5jdGlvbiBjYWxsKSwgYW5kIGNvbnZlcnQgaXQgdG8gYSAgKi8KLSAgLyogICAgYm9vbGVhbiB3aGljaCBpcyBzZXQgd2hlbmV2ZXIgdGhlIHZhbHVlIGlzICE9IDAuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9TRVRfRVJST1IKLSNkZWZpbmUgRlRfU0VUX0VSUk9SKCBleHByZXNzaW9uICkgXAotICAgICAgICAgICggKCBlcnJvciA9IChleHByZXNzaW9uKSApICE9IDAgKQotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiAgQysrIHJlZnVzZXMgdG8gaGFuZGxlIHN0YXRlbWVudHMgbGlrZSBwID0gKHZvaWQqKWFueXRoaW5nOyB3aGVyZSBgcCcKLSAgICogIGlzIGEgdHlwZWQgcG9pbnRlci4gIFNpbmNlIHdlIGRvbid0IGhhdmUgYSBgdHlwZW9mJyBvcGVyYXRvciBpbgotICAgKiAgc3RhbmRhcmQgQysrLCB3ZSBoYXZlIHRvIHVzZSB1Z2x5IGNhc3RzLgotICAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0FTU0lHTlAoIHAsIHZhbCApICAqKCh2b2lkKiopJihwKSkgPSAodmFsKQotI2Vsc2UKLSNkZWZpbmUgRlRfQVNTSUdOUCggcCwgdmFsICkgIChwKSA9ICh2YWwpCi0jZW5kaWYKLQotCi0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLQotICBGVF9CQVNFKCBjb25zdCBjaGFyKiApICBfZnRfZGVidWdfZmlsZTsKLSAgRlRfQkFTRSggbG9uZyApICAgICAgICAgX2Z0X2RlYnVnX2xpbmVubzsKLQotI2RlZmluZSBGVF9ERUJVR19JTk5FUiggZXhwICkgICggX2Z0X2RlYnVnX2ZpbGUgICA9IF9fRklMRV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnRfZGVidWdfbGluZW5vID0gX19MSU5FX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHApICkKLQotI2RlZmluZSBGVF9BU1NJR05QX0lOTkVSKCBwLCBleHAgKSAgKCBfZnRfZGVidWdfZmlsZSAgID0gX19GSUxFX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Z0X2RlYnVnX2xpbmVubyA9IF9fTElORV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FTU0lHTlAoIHAsIGV4cCApICkKLQotI2Vsc2UgLyogIUZUX0RFQlVHX01FTU9SWSAqLwotCi0jZGVmaW5lIEZUX0RFQlVHX0lOTkVSKCBleHAgKSAgICAgICAoZXhwKQotI2RlZmluZSBGVF9BU1NJR05QX0lOTkVSKCBwLCBleHAgKSAgRlRfQVNTSUdOUCggcCwgZXhwICkKLQotI2VuZGlmIC8qICFGVF9ERUJVR19NRU1PUlkgKi8KLQotCi0gIC8qCi0gICAqICBUaGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgcmV0dXJuIGEgcG9pbnRlciwgYW5kIHRoZSBlcnJvciBjb2RlCi0gICAqICBpcyB3cml0dGVuIHRvIHRocm91Z2ggdGhlIGBwX2Vycm9yJyBwYXJhbWV0ZXIuICBTZWUgYmVsb3cgZm9yCi0gICAqICBmb3IgZG9jdW1lbnRhdGlvbi4KLSAgICovCi0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKTsKLQotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX3JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBpdGVtX3NpemUsCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGN1cl9jb3VudCwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jaywKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcXJlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgaXRlbV9zaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICk7Ci0KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X21lbV9mcmVlKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIFAgKTsKLQotCi0jZGVmaW5lIEZUX01FTV9BTExPQyggcHRyLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9hbGxvYyggbWVtb3J5LCAoc2l6ZSksICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fRlJFRSggcHRyICkgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnRfbWVtX2ZyZWUoIG1lbW9yeSwgKHB0cikgKTsgXAotICAgICAgICAgICAgKHB0cikgPSBOVUxMOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0jZGVmaW5lIEZUX01FTV9ORVcoIHB0ciApICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9BTExPQyggcHRyLCBzaXplb2YgKCAqKHB0cikgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1JFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcmVhbGxvYyggbWVtb3J5LCAxLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJzeiksIChuZXdzeiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyKSwgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RQUxMT0MoIHB0ciwgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcWFsbG9jKCBtZW1vcnksIChzaXplKSwgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RTkVXKCBwdHIgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fUUFMTE9DKCBwdHIsIHNpemVvZiAoICoocHRyKSApICkKLQotI2RlZmluZSBGVF9NRU1fUVJFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksIDEsICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJzeiksIChuZXdzeiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUVJFTkVXX0FSUkFZKCBwdHIsIGN1cnN6LCBuZXdzeiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgc2l6ZW9mICggKihwdHIpICksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnN6KSwgKG5ld3N6KSwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyKSwgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9BTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3JlYWxsb2MoIG1lbW9yeSwgKGl0ZW1fc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAoY291bnQpLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9SRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCBuZXdjbnQsIGl0bXN6ICkgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcmVhbGxvYyggbWVtb3J5LCAoaXRtc3opLCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZGNudCksIChuZXdjbnQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUUFMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgKGl0ZW1fc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKGNvdW50KSwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1FSRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCBuZXdjbnQsIGl0bXN6KSAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgKGl0bXN6KSwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2xkY250KSwgKG5ld2NudCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICZlcnJvciApICkKLQotCi0jZGVmaW5lIEZUX01FTV9TRVRfRVJST1IoIGNvbmQgKSAgKCAoY29uZCksIGVycm9yICE9IDAgKQotCi0KLSNkZWZpbmUgRlRfTUVNX1NFVCggZGVzdCwgYnl0ZSwgY291bnQgKSAgICAgZnRfbWVtc2V0KCBkZXN0LCBieXRlLCBjb3VudCApCi0KLSNkZWZpbmUgRlRfTUVNX0NPUFkoIGRlc3QsIHNvdXJjZSwgY291bnQgKSAgZnRfbWVtY3B5KCBkZXN0LCBzb3VyY2UsIGNvdW50ICkKLQotI2RlZmluZSBGVF9NRU1fTU9WRSggZGVzdCwgc291cmNlLCBjb3VudCApICBmdF9tZW1tb3ZlKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkKLQotCi0jZGVmaW5lIEZUX01FTV9aRVJPKCBkZXN0LCBjb3VudCApICBGVF9NRU1fU0VUKCBkZXN0LCAwLCBjb3VudCApCi0KLSNkZWZpbmUgRlRfWkVSTyggcCApICAgICAgICAgICAgICAgIEZUX01FTV9aRVJPKCBwLCBzaXplb2YgKCAqKHApICkgKQotCi0KLSNkZWZpbmUgRlRfQVJSQVlfWkVSTyggZGVzdCwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fWkVSTyggZGVzdCwgKGNvdW50KSAqIHNpemVvZiAoICooZGVzdCkgKSApCi0KLSNkZWZpbmUgRlRfQVJSQVlfQ09QWSggZGVzdCwgc291cmNlLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9DT1BZKCBkZXN0LCBzb3VyY2UsIChjb3VudCkgKiBzaXplb2YgKCAqKGRlc3QpICkgKQotCi0jZGVmaW5lIEZUX0FSUkFZX01PVkUoIGRlc3QsIHNvdXJjZSwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fTU9WRSggZGVzdCwgc291cmNlLCAoY291bnQpICogc2l6ZW9mICggKihkZXN0KSApICkKLQotCi0gIC8qCi0gICAqICBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZHJlc3NhYmxlIGVsZW1lbnRzIGluIGFuIGFycmF5LgotICAgKiAgV2UgbGltaXQgb3Vyc2VsdmVzIHRvIElOVF9NQVgsIHJhdGhlciB0aGFuIFVJTlRfTUFYLCB0byBhdm9pZAotICAgKiAgYW55IHByb2JsZW1zLgotICAgKi8KLSNkZWZpbmUgRlRfQVJSQVlfTUFYKCBwdHIgKSAgICAgICAgICAgKCBGVF9JTlRfTUFYIC8gc2l6ZW9mICggKihwdHIpICkgKQotCi0jZGVmaW5lIEZUX0FSUkFZX0NIRUNLKCBwdHIsIGNvdW50ICkgICggKGNvdW50KSA8PSBGVF9BUlJBWV9NQVgoIHB0ciApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFjcm9zIGV4cGVjdCB0aGF0IHRoZWlyIHBvaW50ZXIgYXJndW1lbnQgaXMgICovCi0gIC8qIF90eXBlZF8gaW4gb3JkZXIgdG8gYXV0b21hdGljYWxseSBjb21wdXRlIGFycmF5IGVsZW1lbnQgc2l6ZXMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBGVF9NRU1fTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksIHNpemVvZiAoICoocHRyKSApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKGNvdW50KSwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUkVORVdfQVJSQVkoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksIHNpemVvZiAoICoocHRyKSApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnN6KSwgKG5ld3N6KSwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1FORVdfQVJSQVkoIHB0ciwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksIHNpemVvZiAoICoocHRyKSApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIChjb3VudCksICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RUkVORVdfQVJSQVkoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9xcmVhbGxvYyggbWVtb3J5LCBzaXplb2YgKCAqKHB0cikgKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3Vyc3opLCAobmV3c3opLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAmZXJyb3IgKSApCi0KLQotI2RlZmluZSBGVF9BTExPQyggcHRyLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX0FMTE9DKCBwdHIsIHNpemUgKSApCi0KLSNkZWZpbmUgRlRfUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSApCi0KLSNkZWZpbmUgRlRfQUxMT0NfTVVMVCggcHRyLCBjb3VudCwgaXRlbV9zaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX0FMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICkKLQotI2RlZmluZSBGVF9SRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCBuZXdjbnQsIGl0bXN6ICkgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Y250LCBpdG1zeiApICkKLQotI2RlZmluZSBGVF9RQUxMT0MoIHB0ciwgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9RQUxMT0MoIHB0ciwgc2l6ZSApICkKLQotI2RlZmluZSBGVF9RUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUVJFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgKQotCi0jZGVmaW5lIEZUX1FBTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUUFMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICkKLQotI2RlZmluZSBGVF9RUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgbmV3Y250LCBpdG1zeiApICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FSRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Y250LCBpdG1zeiApICkKLQotI2RlZmluZSBGVF9GUkVFKCBwdHIgKSAgRlRfTUVNX0ZSRUUoIHB0ciApCi0KLSNkZWZpbmUgRlRfTkVXKCBwdHIgKSAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX05FVyggcHRyICkgKQotCi0jZGVmaW5lIEZUX05FV19BUlJBWSggcHRyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9ORVdfQVJSQVkoIHB0ciwgY291bnQgKSApCi0KLSNkZWZpbmUgRlRfUkVORVdfQVJSQVkoIHB0ciwgY3VyY250LCBuZXdjbnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUkVORVdfQVJSQVkoIHB0ciwgY3VyY250LCBuZXdjbnQgKSApCi0KLSNkZWZpbmUgRlRfUU5FVyggcHRyICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FORVcoIHB0ciApICkKLQotI2RlZmluZSBGVF9RTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgKQotCi0jZGVmaW5lIEZUX1FSRU5FV19BUlJBWSggcHRyLCBjdXJjbnQsIG5ld2NudCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1JFTkVXX0FSUkFZKCBwdHIsIGN1cmNudCwgbmV3Y250ICkgKQotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKLSAgICAgICAgICAgIHZvaWQqICAgICAqUCApOwotCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfUUFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUsCi0gICAgICAgICAgICAgdm9pZCogICAgICpwICk7Ci0KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9SZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgRlRfTG9uZyAgICBjdXJyZW50LAotICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUsCi0gICAgICAgICAgICAgIHZvaWQqICAgICAqUCApOwotCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfUVJlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgRlRfTG9uZyAgICBjdXJyZW50LAotICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgdm9pZCogICAgICpwICk7Ci0KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX0ZyZWUoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICB2b2lkKiAgICAgKlAgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyAqLwotCi0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9zdHJkdXAoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzdHIsCi0gICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgICpwX2Vycm9yICk7Ci0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9kdXAoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBhZGRyZXNzLAotICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgRlRfRXJyb3IgICAgKnBfZXJyb3IgKTsKLQotI2RlZmluZSBGVF9NRU1fU1RSRFVQKCBkc3QsIHN0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKGRzdCkgPSAoY2hhciopZnRfbWVtX3N0cmR1cCggbWVtb3J5LCAoY29uc3QgY2hhciopKHN0ciksICZlcnJvciApCi0KLSNkZWZpbmUgRlRfU1RSRFVQKCBkc3QsIHN0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9TVFJEVVAoIGRzdCwgc3RyICkgKQotCi0jZGVmaW5lIEZUX01FTV9EVVAoIGRzdCwgYWRkcmVzcywgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChkc3QpID0gZnRfbWVtX2R1cCggbWVtb3J5LCAoYWRkcmVzcyksIChGVF9VTG9uZykoc2l6ZSksICZlcnJvciApCi0KLSNkZWZpbmUgRlRfRFVQKCBkc3QsIGFkZHJlc3MsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fRFVQKCBkc3QsIGFkZHJlc3MsIHNpemUgKSApCi0KLQotICAvKiBSZXR1cm4gPj0gMSBpZiBhIHRydW5jYXRpb24gb2NjdXJzLiAgICAgICAgICAgICovCi0gIC8qIFJldHVybiAwIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGZpdHMgdGhlIGJ1ZmZlci4gKi8KLSAgLyogVGhpcyBpcyAqbm90KiB0aGUgc2FtZSBhcyBzdHJsY3B5KCkuICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBmdF9tZW1fc3RyY3B5biggY2hhciogICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzcmMsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSApOwotCi0jZGVmaW5lIEZUX1NUUkNQWU4oIGRzdCwgc3JjLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmdF9tZW1fc3RyY3B5biggKGNoYXIqKWRzdCwgKGNvbnN0IGNoYXIqKShzcmMpLCAoRlRfVUxvbmcpKHNpemUpICkKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVE1FTU9SWV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjcyMjRhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvYmpzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGJhc2UgY2xhc3NlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDggYnkgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhbGwgaW50ZXJuYWwgRnJlZVR5cGUgY2xhc3Nlcy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRPQkpTX0hfXwotI2RlZmluZSBfX0ZUT0JKU19IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9SRU5ERVJfSAotI2luY2x1ZGUgRlRfU0laRVNfSAotI2luY2x1ZGUgRlRfTENEX0ZJTFRFUl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfR0xZUEhfTE9BREVSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9BVVRPSElOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSNpbmNsdWRlIEZUX0lOQ1JFTUVOVEFMX0gKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIGdlbmVyaWMgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgIDAKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgKHZvaWQqKTAKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWluIGFuZCBtYXggZnVuY3Rpb25zIG1pc3NpbmcgaW4gQy4gIEFzIHVzdWFsLCBiZSBjYXJlZnVsIG5vdCB0byAgKi8KLSAgLyogd3JpdGUgdGhpbmdzIGxpa2UgRlRfTUlOKCBhKyssIGIrKyApIHRvIGF2b2lkIHNpZGUgZWZmZWN0cy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NSU4oIGEsIGIgKSAgKCAoYSkgPCAoYikgPyAoYSkgOiAoYikgKQotI2RlZmluZSBGVF9NQVgoIGEsIGIgKSAgKCAoYSkgPiAoYikgPyAoYSkgOiAoYikgKQotCi0jZGVmaW5lIEZUX0FCUyggYSApICAgICAoIChhKSA8IDAgPyAtKGEpIDogKGEpICkKLQotCi0jZGVmaW5lIEZUX1BBRF9GTE9PUiggeCwgbiApICAoICh4KSAmIH4oKG4pLTEpICkKLSNkZWZpbmUgRlRfUEFEX1JPVU5EKCB4LCBuICkgIEZUX1BBRF9GTE9PUiggKHgpICsgKChuKS8yKSwgbiApCi0jZGVmaW5lIEZUX1BBRF9DRUlMKCB4LCBuICkgICBGVF9QQURfRkxPT1IoICh4KSArICgobiktMSksIG4gKQotCi0jZGVmaW5lIEZUX1BJWF9GTE9PUiggeCApICAgICAoICh4KSAmIH42MyApCi0jZGVmaW5lIEZUX1BJWF9ST1VORCggeCApICAgICBGVF9QSVhfRkxPT1IoICh4KSArIDMyICkKLSNkZWZpbmUgRlRfUElYX0NFSUwoIHggKSAgICAgIEZUX1BJWF9GTE9PUiggKHgpICsgNjMgKQotCi0KLSAgLyoKLSAgICogIFJldHVybiB0aGUgaGlnaGVzdCBwb3dlciBvZiAyIHRoYXQgaXMgPD0gdmFsdWU7IHRoaXMgY29ycmVzcG9uZCB0bwotICAgKiAgdGhlIGhpZ2hlc3QgYml0IGluIGEgZ2l2ZW4gMzItYml0IHZhbHVlLgotICAgKi8KLSAgRlRfQkFTRSggRlRfVUludDMyICkKLSAgZnRfaGlnaHBvdzIoIEZUX1VJbnQzMiAgdmFsdWUgKTsKLQotCi0gIC8qCi0gICAqICBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24gZnVuY3Rpb25zIC0tIHNpbmNlIHRoZXNlIGFyZSB1c2VkIHRvIHBhcnNlCi0gICAqICBmb250IGZpbGVzLCB3ZSBtdXN0IG5vdCB1c2UgdGhvc2UgaW4gPGN0eXBlcy5oPiB3aGljaCBhcmUKLSAgICogIGxvY2FsZS1kZXBlbmRlbnQKLSAgICovCi0jZGVmaW5lICBmdF9pc2RpZ2l0KCB4ICkgICAoICggKHVuc2lnbmVkKSh4KSAtICcwJyApIDwgMTBVICkKLQotI2RlZmluZSAgZnRfaXN4ZGlnaXQoIHggKSAgKCAoICh1bnNpZ25lZCkoeCkgLSAnMCcgKSA8IDEwVSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkKSh4KSAtICdhJyApIDwgNlUgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAodW5zaWduZWQpKHgpIC0gJ0EnICkgPCA2VSAgKQotCi0gIC8qIHRoZSBuZXh0IHR3byBtYWNyb3MgYXNzdW1lIEFTQ0lJIHJlcHJlc2VudGF0aW9uICovCi0jZGVmaW5lICBmdF9pc3VwcGVyKCB4ICkgICggKCAodW5zaWduZWQpKHgpIC0gJ0EnICkgPCAyNlUgKQotI2RlZmluZSAgZnRfaXNsb3dlciggeCApICAoICggKHVuc2lnbmVkKSh4KSAtICdhJyApIDwgMjZVICkKLQotI2RlZmluZSAgZnRfaXNhbHBoYSggeCApICAoIGZ0X2lzdXBwZXIoIHggKSB8fCBmdF9pc2xvd2VyKCB4ICkgKQotI2RlZmluZSAgZnRfaXNhbG51bSggeCApICAoIGZ0X2lzZGlnaXQoIHggKSB8fCBmdF9pc2FscGhhKCB4ICkgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgQyBIIEEgUiBNIEEgUCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGhhbmRsZSB0byBpbnRlcm5hbCBjaGFybWFwIG9iamVjdCAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9DTWFwUmVjXyogICAgICAgICAgICAgIEZUX0NNYXA7Ci0KLSAgLyogaGFuZGxlIHRvIGNoYXJtYXAgY2xhc3Mgc3RydWN0dXJlICovCi0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IEZUX0NNYXBfQ2xhc3NSZWNfKiAgRlRfQ01hcF9DbGFzczsKLQotICAvKiBpbnRlcm5hbCBjaGFybWFwIG9iamVjdCBzdHJ1Y3R1cmUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0NNYXBSZWNfCi0gIHsKLSAgICBGVF9DaGFyTWFwUmVjICBjaGFybWFwOwotICAgIEZUX0NNYXBfQ2xhc3MgIGNsYXp6OwotCi0gIH0gRlRfQ01hcFJlYzsKLQotICAvKiB0eXBlY2FzZSBhbnkgcG9pbnRlciB0byBhIGNoYXJtYXAgaGFuZGxlICovCi0jZGVmaW5lIEZUX0NNQVAoIHggKSAgICAgICAgICAgICAgKChGVF9DTWFwKSggeCApKQotCi0gIC8qIG9idmlvdXMgbWFjcm9zICovCi0jZGVmaW5lIEZUX0NNQVBfUExBVEZPUk1fSUQoIHggKSAgRlRfQ01BUCggeCApLT5jaGFybWFwLnBsYXRmb3JtX2lkCi0jZGVmaW5lIEZUX0NNQVBfRU5DT0RJTkdfSUQoIHggKSAgRlRfQ01BUCggeCApLT5jaGFybWFwLmVuY29kaW5nX2lkCi0jZGVmaW5lIEZUX0NNQVBfRU5DT0RJTkcoIHggKSAgICAgRlRfQ01BUCggeCApLT5jaGFybWFwLmVuY29kaW5nCi0jZGVmaW5lIEZUX0NNQVBfRkFDRSggeCApICAgICAgICAgRlRfQ01BUCggeCApLT5jaGFybWFwLmZhY2UKLQotCi0gIC8qIGNsYXNzIG1ldGhvZCBkZWZpbml0aW9ucyAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfQ01hcF9Jbml0RnVuYykoIEZUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGluaXRfZGF0YSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0NNYXBfRG9uZUZ1bmMpKCBGVF9DTWFwICBjbWFwICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50Ci0gICgqRlRfQ01hcF9DaGFySW5kZXhGdW5jKSggRlRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50Ci0gICgqRlRfQ01hcF9DaGFyTmV4dEZ1bmMpKCBGVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqYWNoYXJfY29kZSApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0NNYXBfQ2hhclZhckluZGV4RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DTWFwICAgIHVuaWNvZGVfY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIHZhcmlhbnRfc2VsZWN0b3IgKTsKLQotICB0eXBlZGVmIEZUX0Jvb2wKLSAgKCpGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jKSggRlRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICB2YXJpYW50X3NlbGVjdG9yICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50MzIgKgotICAoKkZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSggRlRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW0gKTsKLQotICB0eXBlZGVmIEZUX1VJbnQzMiAqCi0gICgqRlRfQ01hcF9DaGFyVmFyaWFudExpc3RGdW5jKSggRlRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50MzIgKgotICAoKkZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIHZhcmlhbnRfc2VsZWN0b3IgKTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9DTWFwX0NsYXNzUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgICBzaXplOwotICAgIEZUX0NNYXBfSW5pdEZ1bmMgICAgICAgaW5pdDsKLSAgICBGVF9DTWFwX0RvbmVGdW5jICAgICAgIGRvbmU7Ci0gICAgRlRfQ01hcF9DaGFySW5kZXhGdW5jICBjaGFyX2luZGV4OwotICAgIEZUX0NNYXBfQ2hhck5leHRGdW5jICAgY2hhcl9uZXh0OwotICAgIC8qIFN1YnNlcXVlbnQgZW50cmllcyBhcmUgc3BlY2lhbCBvbmVzIGZvciBmb3JtYXQgMTQgLS0gdGhlIHZhcmlhbnQgKi8KLSAgICAvKiBzZWxlY3RvciBzdWJ0YWJsZSB3aGljaCBiZWhhdmVzIGxpa2Ugbm8gb3RoZXIgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMgICAgICBjaGFyX3Zhcl9pbmRleDsKLSAgICBGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jICBjaGFyX3Zhcl9kZWZhdWx0OwotICAgIEZUX0NNYXBfVmFyaWFudExpc3RGdW5jICAgICAgIHZhcmlhbnRfbGlzdDsKLSAgICBGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMgICBjaGFydmFyaWFudF9saXN0OwotICAgIEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYyAgIHZhcmlhbnRjaGFyX2xpc3Q7Ci0KLSAgfSBGVF9DTWFwX0NsYXNzUmVjOwotCi0KLSAgLyogY3JlYXRlIGEgbmV3IGNoYXJtYXAgYW5kIGFkZCBpdCB0byBjaGFybWFwLT5mYWNlICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfQ01hcF9OZXcoIEZUX0NNYXBfQ2xhc3MgIGNsYXp6LAotICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgaW5pdF9kYXRhLAotICAgICAgICAgICAgICAgRlRfQ2hhck1hcCAgICAgY2hhcm1hcCwKLSAgICAgICAgICAgICAgIEZUX0NNYXAgICAgICAgKmFjbWFwICk7Ci0KLSAgLyogZGVzdHJveSBhIGNoYXJtYXAgYW5kIHJlbW92ZSBpdCBmcm9tIGZhY2UncyBsaXN0ICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9DTWFwX0RvbmUoIEZUX0NNYXAgIGNtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWxSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmaWVsZHMgb2YgZWFjaCBGVF9GYWNlICAgICAgICAqLwotICAvKiAgICBvYmplY3QuICBUaGVzZSBmaWVsZHMgbWF5IGNoYW5nZSBiZXR3ZWVuIGRpZmZlcmVudCByZWxlYXNlcyBvZiAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3BvaW50cyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG1heGltYWwgbnVtYmVyIG9mIHBvaW50cyB1c2VkIHRvIHN0b3JlIHRoZSB2ZWN0b3JpYWwgb3V0bGluZSAqLwotICAvKiAgICAgIG9mIGFueSBnbHlwaCBpbiB0aGlzIGZhY2UuICBJZiB0aGlzIHZhbHVlIGNhbm5vdCBiZSBrbm93biBpbiAgICAgKi8KLSAgLyogICAgICBhZHZhbmNlLCBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIDAuICovCi0gIC8qICAgICAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2NvbnRvdXJzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG1heGltYWwgbnVtYmVyIG9mIGNvbnRvdXJzIHVzZWQgdG8gc3RvcmUgdGhlIHZlY3RvcmlhbCAgICAgICAqLwotICAvKiAgICAgIG91dGxpbmUgb2YgYW55IGdseXBoIGluIHRoaXMgZmFjZS4gIElmIHRoaXMgdmFsdWUgY2Fubm90IGJlICAgICAgKi8KLSAgLyogICAgICBrbm93biBpbiBhZHZhbmNlLCBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgdGhpcyBzaG91bGQgYmUgICovCi0gIC8qICAgICAgc2V0IHRvIDAuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtX21hdHJpeCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSAyeDIgbWF0cml4IG9mIDE2LjE2IGNvZWZmaWNpZW50cyB1c2VkIHRvIHRyYW5zZm9ybSBnbHlwaCAgICAgICAqLwotICAvKiAgICAgIG91dGxpbmVzIGFmdGVyIHRoZXkgYXJlIGxvYWRlZCBmcm9tIHRoZSBmb250LiAgT25seSB1c2VkIGJ5IHRoZSAgKi8KLSAgLyogICAgICBjb252ZW5pZW5jZSBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1fZGVsdGEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIHRyYW5zbGF0aW9uIHZlY3RvciB1c2VkIHRvIHRyYW5zZm9ybSBnbHlwaCBvdXRsaW5lcyBhZnRlciB0aGV5ICovCi0gIC8qICAgICAgYXJlIGxvYWRlZCBmcm9tIHRoZSBmb250LiAgT25seSB1c2VkIGJ5IHRoZSBjb252ZW5pZW5jZSAgICAgICAgICAqLwotICAvKiAgICAgIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybV9mbGFncyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNvbWUgZmxhZ3MgdXNlZCB0byBjbGFzc2lmeSB0aGUgdHJhbnNmb3JtLiAgT25seSB1c2VkIGJ5IHRoZSAgICAgKi8KLSAgLyogICAgICBjb252ZW5pZW5jZSBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZXJ2aWNlcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGNhY2hlIGZvciBmcmVxdWVudGx5IHVzZWQgc2VydmljZXMuICBJdCBzaG91bGQgYmUgb25seSAgICAgICAgICovCi0gIC8qICAgICAgYWNjZXNzZWQgd2l0aCB0aGUgbWFjcm8gYEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UnLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5jcmVtZW50YWxfaW50ZXJmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgbm9uLW51bGwsIHRoZSBpbnRlcmZhY2UgdGhyb3VnaCB3aGljaCBnbHlwaCBkYXRhIGFuZCBtZXRyaWNzICAqLwotICAvKiAgICAgIGFyZSBsb2FkZWQgaW5jcmVtZW50YWxseSBmb3IgZmFjZXMgdGhhdCBkbyBub3QgcHJvdmlkZSBhbGwgb2YgICAgKi8KLSAgLyogICAgICB0aGlzIGRhdGEgd2hlbiBmaXJzdCBvcGVuZWQuICBUaGlzIGZpZWxkIGV4aXN0cyBvbmx5IGlmICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgaXMgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaWdub3JlX3VucGF0ZW50ZWRfaGludGVyIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBib29sZWFuIGZsYWcgaW5zdHJ1Y3RzIHRoZSBnbHlwaCBsb2FkZXIgdG8gaWdub3JlIHRoZSAgICAgICAqLwotICAvKiAgICAgIG5hdGl2ZSBmb250IGhpbnRlciwgaWYgb25lIGlzIGZvdW5kLiAgVGhpcyBpcyBleGNsdXNpdmVseSB1c2VkICAgKi8KLSAgLyogICAgICBpbiB0aGUgY2FzZSB3aGVuIHRoZSB1bnBhdGVudGVkIGhpbnRlciBpcyBjb21waWxlZCB3aXRoaW4gdGhlICAgICovCi0gIC8qICAgICAgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ZhY2VfSW50ZXJuYWxSZWNfCi0gIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLSAgICBGVF9VU2hvcnQgICAgICAgICAgIHJlc2VydmVkMTsKLSAgICBGVF9TaG9ydCAgICAgICAgICAgIHJlc2VydmVkMjsKLSNlbmRpZgotICAgIEZUX01hdHJpeCAgICAgICAgICAgdHJhbnNmb3JtX21hdHJpeDsKLSAgICBGVF9WZWN0b3IgICAgICAgICAgIHRyYW5zZm9ybV9kZWx0YTsKLSAgICBGVF9JbnQgICAgICAgICAgICAgIHRyYW5zZm9ybV9mbGFnczsKLQotICAgIEZUX1NlcnZpY2VDYWNoZVJlYyAgc2VydmljZXM7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjKiAgaW5jcmVtZW50YWxfaW50ZXJmYWNlOwotI2VuZGlmCi0KLSAgICBGVF9Cb29sICAgICAgICAgICAgIGlnbm9yZV91bnBhdGVudGVkX2hpbnRlcjsKLQotICB9IEZUX0ZhY2VfSW50ZXJuYWxSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TbG90X0ludGVybmFsUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfR2x5cGhTbG90ICAgKi8KLSAgLyogICAgb2JqZWN0LiAgVGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgYmV0d2VlbiBkaWZmZXJlbnQgcmVsZWFzZXMgb2YgICAgICovCi0gIC8qICAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciAgICAgICAgICAgIDo6IFRoZSBnbHlwaCBsb2FkZXIgb2JqZWN0IHVzZWQgdG8gbG9hZCBvdXRsaW5lcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgICAgICAgIDo6IFBvc3NpYmxlIHZhbHVlcyBhcmUgemVybyBvciAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HTFlQSF9PV05fQklUTUFQLiAgVGhlIGxhdHRlciBpbmRpY2F0ZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgRlRfR2x5cGhTbG90IHN0cnVjdHVyZSBvd25zIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfdHJhbnNmb3JtZWQgOjogQm9vbGVhbi4gIFNldCB0byBUUlVFIHdoZW4gdGhlIGxvYWRlZCBnbHlwaCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdHJhbnNmb3JtZWQgdGhyb3VnaCBhIHNwZWNpZmljICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb250IHRyYW5zZm9ybWF0aW9uLiAgVGhpcyBpcyBfbm90XyB0aGUgc2FtZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZhY2UgdHJhbnNmb3JtIHNldCB0aHJvdWdoICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NldF9UcmFuc2Zvcm0oKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfbWF0cml4ICAgICAgOjogVGhlIDJ4MiBtYXRyaXggY29ycmVzcG9uZGluZyB0byB0aGUgZ2x5cGggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLCBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfZGVsdGEgICAgICAgOjogVGhlIDJkIHRyYW5zbGF0aW9uIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnbHlwaCB0cmFuc2Zvcm1hdGlvbiwgaWYgbmVjZXNzYXJ5LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaGludHMgICAgICAgOjogRm9ybWF0LXNwZWNpZmljIGdseXBoIGhpbnRzIG1hbmFnZW1lbnQuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEZUX0dMWVBIX09XTl9CSVRNQVAgIDB4MQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TbG90X0ludGVybmFsUmVjXwotICB7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlcjsKLSAgICBGVF9VSW50ICAgICAgICAgZmxhZ3M7Ci0gICAgRlRfQm9vbCAgICAgICAgIGdseXBoX3RyYW5zZm9ybWVkOwotICAgIEZUX01hdHJpeCAgICAgICBnbHlwaF9tYXRyaXg7Ci0gICAgRlRfVmVjdG9yICAgICAgIGdseXBoX2RlbHRhOwotICAgIHZvaWQqICAgICAgICAgICBnbHlwaF9oaW50czsKLQotICB9IEZUX0dseXBoU2xvdF9JbnRlcm5hbFJlYzsKLQotCi0jaWYgMAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfSW50ZXJuYWxSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmaWVsZHMgb2YgZWFjaCBGVF9TaXplICAgICAgICAqLwotICAvKiAgICBvYmplY3QuICBDdXJyZW50bHksIGl0J3MgZW1wdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TaXplX0ludGVybmFsUmVjXwotICB7Ci0gICAgLyogZW1wdHkgKi8KLQotICB9IEZUX1NpemVfSW50ZXJuYWxSZWM7Ci0KLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgIE0gTyBEIFUgTCBFIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIG1vZHVsZSBvYmplY3QgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbGF6eiAgIDo6IEEgcG9pbnRlciB0byB0aGUgbW9kdWxlJ3MgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZW5lcmljIDo6IEEgZ2VuZXJpYyBzdHJ1Y3R1cmUgZm9yIHVzZXItbGV2ZWwgZXh0ZW5zaWJpbGl0eSAoPykuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Nb2R1bGVSZWNfCi0gIHsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6ejsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5OwotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9HZW5lcmljICAgICAgICBnZW5lcmljOwotCi0gIH0gRlRfTW9kdWxlUmVjOwotCi0KLSAgLyogdHlwZWNhc3QgYW4gb2JqZWN0IHRvIGEgRlRfTW9kdWxlICovCi0jZGVmaW5lIEZUX01PRFVMRSggeCApICAgICAgICAgICgoRlRfTW9kdWxlKSggeCApKQotI2RlZmluZSBGVF9NT0RVTEVfQ0xBU1MoIHggKSAgICBGVF9NT0RVTEUoIHggKS0+Y2xhenoKLSNkZWZpbmUgRlRfTU9EVUxFX0xJQlJBUlkoIHggKSAgRlRfTU9EVUxFKCB4ICktPmxpYnJhcnkKLSNkZWZpbmUgRlRfTU9EVUxFX01FTU9SWSggeCApICAgRlRfTU9EVUxFKCB4ICktPm1lbW9yeQotCi0KLSNkZWZpbmUgRlRfTU9EVUxFX0lTX0RSSVZFUiggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIgKQotCi0jZGVmaW5lIEZUX01PRFVMRV9JU19SRU5ERVJFUiggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9SRU5ERVJFUiApCi0KLSNkZWZpbmUgRlRfTU9EVUxFX0lTX0hJTlRFUiggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfSElOVEVSICkKLQotI2RlZmluZSBGVF9NT0RVTEVfSVNfU1RZTEVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9TVFlMRVIgKQotCi0jZGVmaW5lIEZUX0RSSVZFUl9JU19TQ0FMQUJMRSggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUgKQotCi0jZGVmaW5lIEZUX0RSSVZFUl9VU0VTX09VVExJTkVTKCB4ICkgICEoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9EUklWRVJfTk9fT1VUTElORVMgKQotCi0jZGVmaW5lIEZUX0RSSVZFUl9IQVNfSElOVEVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluZHMgYSBtb2R1bGUgYW5kIHJldHVybnMgaXRzIHNwZWNpZmljIGludGVyZmFjZSBhcyBhIHR5cGVsZXNzICAgICovCi0gIC8qICAgIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX25hbWUgOjogVGhlIG1vZHVsZSdzIG5hbWUgKGFzIGFuIEFTQ0lJIHN0cmluZykuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCBiZXR0ZXIgYmUgZmFtaWxpYXIgd2l0aCBGcmVlVHlwZSBpbnRlcm5hbHMgdG8ga25vdyAgICAgICovCi0gIC8qICAgIHdoaWNoIG1vZHVsZSB0byBsb29rIGZvciwgYW5kIHdoYXQgaXRzIGludGVyZmFjZSBpcyA6LSkgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggY29uc3Qgdm9pZCogKQotICBGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kX25hbWUgKTsKLQotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzZXJ2aWNlX2lkICk7Ci0KLSAvKiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgIEZBQ0UsIFNJWkUgJiBHTFlQSCBTTE9UIE9CSkVDVFMgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGEgZmV3IG1hY3JvcyB1c2VkIHRvIHBlcmZvcm0gZWFzeSB0eXBlY2FzdHMgd2l0aCBtaW5pbWFsIGJyYWluIGRhbWFnZSAqLwotCi0jZGVmaW5lIEZUX0ZBQ0UoIHggKSAgICAgICAgICAoKEZUX0ZhY2UpKHgpKQotI2RlZmluZSBGVF9TSVpFKCB4ICkgICAgICAgICAgKChGVF9TaXplKSh4KSkKLSNkZWZpbmUgRlRfU0xPVCggeCApICAgICAgICAgICgoRlRfR2x5cGhTbG90KSh4KSkKLQotI2RlZmluZSBGVF9GQUNFX0RSSVZFUiggeCApICAgRlRfRkFDRSggeCApLT5kcml2ZXIKLSNkZWZpbmUgRlRfRkFDRV9MSUJSQVJZKCB4ICkgIEZUX0ZBQ0VfRFJJVkVSKCB4ICktPnJvb3QubGlicmFyeQotI2RlZmluZSBGVF9GQUNFX01FTU9SWSggeCApICAgRlRfRkFDRSggeCApLT5tZW1vcnkKLSNkZWZpbmUgRlRfRkFDRV9TVFJFQU0oIHggKSAgIEZUX0ZBQ0UoIHggKS0+c3RyZWFtCi0KLSNkZWZpbmUgRlRfU0laRV9GQUNFKCB4ICkgICAgIEZUX1NJWkUoIHggKS0+ZmFjZQotI2RlZmluZSBGVF9TTE9UX0ZBQ0UoIHggKSAgICAgRlRfU0xPVCggeCApLT5mYWNlCi0KLSNkZWZpbmUgRlRfRkFDRV9TTE9UKCB4ICkgICAgIEZUX0ZBQ0UoIHggKS0+Z2x5cGgKLSNkZWZpbmUgRlRfRkFDRV9TSVpFKCB4ICkgICAgIEZUX0ZBQ0UoIHggKS0+c2l6ZQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgZ2x5cGggc2xvdCBmb3IgYSAgICAgICovCi0gIC8qICAgIGdpdmVuIGZhY2Ugb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsICAgICAqLwotICAvKiAgICBzbG90cy4gIEFsbCBvZiB0aGVtIGFyZSBhdXRvbWF0aWNhbGx5IGRpc2NhcmRlZCB3aGVuIHRoZSBmYWNlIGlzICAgKi8KLSAgLyogICAgZGVzdHJveWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgOjogQSBoYW5kbGUgdG8gYSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNsb3QgOjogQSBoYW5kbGUgdG8gYSBuZXcgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX05ld19HbHlwaFNsb3QoIEZUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgKmFzbG90ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95cyBhIGdpdmVuIGdseXBoIHNsb3QuICBSZW1lbWJlciBob3dldmVyIHRoYXQgYWxsIHNsb3RzIGFyZSAgKi8KLSAgLyogICAgYXV0b21hdGljYWxseSBkZXN0cm95ZWQgd2l0aCBpdHMgcGFyZW50LiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBpcyAgICovCi0gIC8qICAgIG5vdCBhbHdheXMgbWFuZGF0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX0RvbmVfR2x5cGhTbG90KCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotIC8qICovCi0KLSNkZWZpbmUgRlRfUkVRVUVTVF9XSURUSCggcmVxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChyZXEpLT5ob3JpUmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgPyAoRlRfUG9zKSggKHJlcSktPndpZHRoICogKHJlcSktPmhvcmlSZXNvbHV0aW9uICsgMzYgKSAvIDcyIFwKLSAgICAgICAgICAgICAgOiAocmVxKS0+d2lkdGggKQotCi0jZGVmaW5lIEZUX1JFUVVFU1RfSEVJR0hUKCByZXEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHJlcSktPnZlcnRSZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgPyAoRlRfUG9zKSggKHJlcSktPmhlaWdodCAqIChyZXEpLT52ZXJ0UmVzb2x1dGlvbiArIDM2ICkgLyA3MiBcCi0gICAgICAgICAgICAgIDogKHJlcSktPmhlaWdodCApCi0KLQotICAvKiBTZXQgdGhlIG1ldHJpY3MgYWNjb3JkaW5nIHRvIGEgYml0bWFwIHN0cmlrZS4gKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1NlbGVjdF9NZXRyaWNzKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBzdHJpa2VfaW5kZXggKTsKLQotCi0gIC8qIFNldCB0aGUgbWV0cmljcyBhY2NvcmRpbmcgdG8gYSBzaXplIHJlcXVlc3QuICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9SZXF1ZXN0X01ldHJpY3MoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0KLSAgLyogTWF0Y2ggYSBzaXplIHJlcXVlc3QgYWdhaW5zdCBgYXZhaWxhYmxlX3NpemVzJy4gKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9NYXRjaF9TaXplKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIGlnbm9yZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICBzaXplX2luZGV4ICk7Ci0KLQotICAvKiBVc2UgdGhlIGhvcml6b250YWwgbWV0cmljcyB0byBzeW50aGVzaXplIHRoZSB2ZXJ0aWNhbCBtZXRyaWNzLiAqLwotICAvKiBJZiBgYWR2YW5jZScgaXMgemVybywgaXQgaXMgYWxzbyBzeW50aGVzaXplZC4gICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfc3ludGhlc2l6ZV92ZXJ0aWNhbF9tZXRyaWNzKCBGVF9HbHlwaF9NZXRyaWNzKiAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgYWR2YW5jZSApOwotCi0KLSAgLyogRnJlZSB0aGUgYml0bWFwIG9mIGEgZ2l2ZW4gZ2x5cGhzbG90IHdoZW4gbmVlZGVkIChpLmUuLCBvbmx5IHdoZW4gaXQgKi8KLSAgLyogd2FzIGFsbG9jYXRlZCB3aXRoIGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXApLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICAvKiBBbGxvY2F0ZSBhIG5ldyBiaXRtYXAgYnVmZmVyIGluIGEgZ2x5cGggc2xvdC4gKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgc2l6ZSApOwotCi0KLSAgLyogU2V0IHRoZSBiaXRtYXAgYnVmZmVyIGluIGEgZ2x5cGggc2xvdCB0byBhIGdpdmVuIHBvaW50ZXIuICBUaGUgYnVmZmVyICovCi0gIC8qIHdpbGwgbm90IGJlIGZyZWVkIGJ5IGEgbGF0ZXIgY2FsbCB0byBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAuICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfZ2x5cGhzbG90X3NldF9iaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgYnVmZmVyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgUiBFIE4gRCBFIFIgRSBSIFMgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9SRU5ERVJFUiggeCApICAgICAgKChGVF9SZW5kZXJlcikoIHggKSkKLSNkZWZpbmUgRlRfR0xZUEgoIHggKSAgICAgICAgICgoRlRfR2x5cGgpKCB4ICkpCi0jZGVmaW5lIEZUX0JJVE1BUF9HTFlQSCggeCApICAoKEZUX0JpdG1hcEdseXBoKSggeCApKQotI2RlZmluZSBGVF9PVVRMSU5FX0dMWVBIKCB4ICkgKChGVF9PdXRsaW5lR2x5cGgpKCB4ICkpCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfUmVuZGVyZXJSZWNfCi0gIHsKLSAgICBGVF9Nb2R1bGVSZWMgICAgICAgICAgICByb290OwotICAgIEZUX1JlbmRlcmVyX0NsYXNzKiAgICAgIGNsYXp6OwotICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgIGdseXBoX2Zvcm1hdDsKLSAgICBGVF9HbHlwaF9DbGFzcyAgICAgICAgICBnbHlwaF9jbGFzczsKLQotICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgIHJhc3RlcjsKLSAgICBGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMgICByYXN0ZXJfcmVuZGVyOwotICAgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMgIHJlbmRlcjsKLQotICB9IEZUX1JlbmRlcmVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgRiBPIE4gVCAgIEQgUiBJIFYgRSBSIFMgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogdHlwZWNhc3QgYSBtb2R1bGUgaW50byBhIGRyaXZlciBlYXNpbHkgKi8KLSNkZWZpbmUgRlRfRFJJVkVSKCB4ICkgICAgICAgICgoRlRfRHJpdmVyKSh4KSkKLQotICAvKiB0eXBlY2FzdCBhIG1vZHVsZSBhcyBhIGRyaXZlciwgYW5kIGdldCBpdHMgZHJpdmVyIGNsYXNzICovCi0jZGVmaW5lIEZUX0RSSVZFUl9DTEFTUyggeCApICBGVF9EUklWRVIoIHggKS0+Y2xhenoKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RyaXZlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByb290IGZvbnQgZHJpdmVyIGNsYXNzLiAgQSBmb250IGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgICAgICAqLwotICAvKiAgICBtYW5hZ2luZyBhbmQgbG9hZGluZyBmb250IGZpbGVzIG9mIGEgZ2l2ZW4gZm9ybWF0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgcm9vdCAgICAgICAgIDo6IENvbnRhaW5zIHRoZSBmaWVsZHMgb2YgdGhlIHJvb3QgbW9kdWxlIGNsYXNzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjbGF6eiAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBmb250IGRyaXZlcidzIGNsYXNzLiAgTm90ZSB0aGF0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgTk9UIHJvb3QuY2xhenouICBgY2xhc3MnIHdhc24ndCB1c2VkICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBhcyBpdCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gQysrLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZmFjZXNfbGlzdCAgIDo6IFRoZSBsaXN0IG9mIGZhY2VzIGN1cnJlbnRseSBvcGVuZWQgYnkgdGhpcyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZXh0ZW5zaW9ucyAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgZHJpdmVyJ3MgZXh0ZW5zaW9ucyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgaWYgdGhleSBhcmUgc3VwcG9ydGVkIHRocm91Z2ggdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX0VYVEVOU0lPTlMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGdseXBoX2xvYWRlciA6OiBUaGUgZ2x5cGggbG9hZGVyIGZvciBhbGwgZmFjZXMgbWFuYWdlZCBieSB0aGlzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLiAgVGhpcyBvYmplY3QgaXNuJ3QgZGVmaW5lZCBmb3IgdW5zY2FsYWJsZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Ecml2ZXJSZWNfCi0gIHsKLSAgICBGVF9Nb2R1bGVSZWMgICAgIHJvb3Q7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6ejsKLQotICAgIEZUX0xpc3RSZWMgICAgICAgZmFjZXNfbGlzdDsKLSAgICB2b2lkKiAgICAgICAgICAgIGV4dGVuc2lvbnM7Ci0KLSAgICBGVF9HbHlwaExvYWRlciAgIGdseXBoX2xvYWRlcjsKLQotICB9IEZUX0RyaXZlclJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEwgSSBCIFIgQSBSIEkgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFRoaXMgaG9vayBpcyB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBkZWJ1Z2dlci4gIEl0IG11c3QgYmUgc2V0IHRvIGFuICovCi0gIC8qIGFsdGVybmF0ZSB0cnVldHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUgICAgICAgICAgICAwCi0KLQotICAvKiBTZXQgdGhpcyBkZWJ1ZyBob29rIHRvIGEgbm9uLW51bGwgcG9pbnRlciB0byBmb3JjZSB1bnBhdGVudGVkIGhpbnRpbmcgKi8KLSAgLyogZm9yIGFsbCBmYWNlcyB3aGVuIGJvdGggVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSIGFuZCAgICAgICAgICAgICAgICovCi0gIC8qIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HIGFyZSBkZWZpbmVkLiAgVGhpcyBpcyBvbmx5IHVzZWQgICAqLwotICAvKiBkdXJpbmcgZGVidWdnaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfREVCVUdfSE9PS19VTlBBVEVOVEVEX0hJTlRJTkcgIDEKLQotCi0gIHR5cGVkZWYgdm9pZCAgKCpGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYykoIEZUX0JpdG1hcCogICAgICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnlSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZSBsaWJyYXJ5IGNsYXNzLiAgVGhpcyBpcyB0aGUgcm9vdCBvZiBhbGwgRnJlZVR5cGUgICAgICAqLwotICAvKiAgICBkYXRhLiAgVXNlIEZUX05ld19MaWJyYXJ5KCkgdG8gY3JlYXRlIGEgbGlicmFyeSBvYmplY3QsIGFuZCAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9MaWJyYXJ5KCkgdG8gZGlzY2FyZCBpdCBhbmQgYWxsIGNoaWxkIG9iamVjdHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgICAgICA6OiBUaGUgbGlicmFyeSdzIG1lbW9yeSBvYmplY3QuICBNYW5hZ2VzIG1lbW9yeSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2VuZXJpYyAgICAgICAgICA6OiBDbGllbnQgZGF0YSB2YXJpYWJsZS4gIFVzZWQgdG8gZXh0ZW5kIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgTGlicmFyeSBjbGFzcyBieSBoaWdoZXIgbGV2ZWxzIGFuZCBjbGllbnRzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbl9tYWpvciAgICA6OiBUaGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uX21pbm9yICAgIDo6IFRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb25fcGF0Y2ggICAgOjogVGhlIGN1cnJlbnQgcGF0Y2ggbGV2ZWwgb2YgdGhlIGxpYnJhcnkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX21vZHVsZXMgICAgICA6OiBUaGUgbnVtYmVyIG9mIG1vZHVsZXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoaXMgbGlicmFyeS4gIFRoaXMgaXMgc2V0IHRvIDAgZm9yIG5ldyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcy4gIE5ldyBtb2R1bGVzIGFyZSBhZGRlZCB0aHJvdWdoIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBGVF9BZGRfTW9kdWxlKCkgQVBJIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVzICAgICAgICAgIDo6IEEgdGFibGUgdXNlZCB0byBzdG9yZSBoYW5kbGVzIHRvIHRoZSBjdXJyZW50bHkgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkIG1vZHVsZXMuIE5vdGUgdGhhdCBlYWNoIGZvbnQgZHJpdmVyICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgYSBsaXN0IG9mIGl0cyBvcGVuZWQgZmFjZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyZXJzICAgICAgICA6OiBUaGUgbGlzdCBvZiByZW5kZXJlcnMgY3VycmVudGx5IHJlZ2lzdGVyZWQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3VyX3JlbmRlcmVyICAgICA6OiBUaGUgY3VycmVudCBvdXRsaW5lIHJlbmRlcmVyLiAgVGhpcyBpcyBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgdXNlZCB0byBhdm9pZCBwYXJzaW5nIHRoZSBsaXN0IG9uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY2FsbCB0byBGVF9PdXRsaW5lX1JlbmRlcigpLiAgSXQgaXMgYSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUgZm9ybWF0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXV0b19oaW50ZXIgICAgICA6OiBYWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcG9vbCAgICAgIDo6IFRoZSByYXN0ZXIgb2JqZWN0J3MgcmVuZGVyIHBvb2wuICBUaGlzIGNhbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBpZGVhbGx5IGJlIGNoYW5nZWQgZHluYW1pY2FsbHkgYXQgcnVuLXRpbWUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcG9vbF9zaXplIDo6IFRoZSBzaXplIG9mIHRoZSByZW5kZXIgcG9vbCBpbiBieXRlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlYnVnX2hvb2tzICAgICAgOjogWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0xpYnJhcnlSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OyAgICAgICAgICAgLyogbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyICovCi0KLSAgICBGVF9HZW5lcmljICAgICAgICAgZ2VuZXJpYzsKLQotICAgIEZUX0ludCAgICAgICAgICAgICB2ZXJzaW9uX21ham9yOwotICAgIEZUX0ludCAgICAgICAgICAgICB2ZXJzaW9uX21pbm9yOwotICAgIEZUX0ludCAgICAgICAgICAgICB2ZXJzaW9uX3BhdGNoOwotCi0gICAgRlRfVUludCAgICAgICAgICAgIG51bV9tb2R1bGVzOwotICAgIEZUX01vZHVsZSAgICAgICAgICBtb2R1bGVzW0ZUX01BWF9NT0RVTEVTXTsgIC8qIG1vZHVsZSBvYmplY3RzICAqLwotCi0gICAgRlRfTGlzdFJlYyAgICAgICAgIHJlbmRlcmVyczsgICAgICAgIC8qIGxpc3Qgb2YgcmVuZGVyZXJzICAgICAgICAqLwotICAgIEZUX1JlbmRlcmVyICAgICAgICBjdXJfcmVuZGVyZXI7ICAgICAvKiBjdXJyZW50IG91dGxpbmUgcmVuZGVyZXIgKi8KLSAgICBGVF9Nb2R1bGUgICAgICAgICAgYXV0b19oaW50ZXI7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgcmFzdGVyX3Bvb2w7ICAgICAgLyogc2Nhbi1saW5lIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVuZGVyIHBvb2wgICAgICAgICAgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgcmFzdGVyX3Bvb2xfc2l6ZTsgLyogc2l6ZSBvZiByZW5kZXIgcG9vbCBpbiBieXRlcyAqLwotCi0gICAgRlRfRGVidWdIb29rX0Z1bmMgIGRlYnVnX2hvb2tzWzRdOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLSAgICBGVF9MY2RGaWx0ZXIgICAgICAgICAgICAgbGNkX2ZpbHRlcjsKLSAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgbGNkX2V4dHJhOyAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIHBpeGVscyAqLwotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgICBsY2Rfd2VpZ2h0c1s3XTsgICAvKiBmaWx0ZXIgd2VpZ2h0cywgaWYgYW55ICovCi0gICAgRlRfQml0bWFwX0xjZEZpbHRlckZ1bmMgIGxjZF9maWx0ZXJfZnVuYzsgIC8qIGZpbHRlcmluZyBjYWxsYmFjayAgICAgKi8KLSNlbmRpZgotCi0gIH0gRlRfTGlicmFyeVJlYzsKLQotCi0gIEZUX0JBU0UoIEZUX1JlbmRlcmVyICkKLSAgRlRfTG9va3VwX1JlbmRlcmVyKCBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhfRm9ybWF0ICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUqICAgICBub2RlICk7Ci0KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSApOwotCi0gIHR5cGVkZWYgY29uc3QgY2hhcioKLSAgKCpGVF9GYWNlX0dldFBvc3RzY3JpcHROYW1lRnVuYykoIEZUX0ZhY2UgIGZhY2UgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfRmFjZV9HZXRHbHlwaE5hbWVGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0ZhY2VfR2V0R2x5cGhOYW1lSW5kZXhGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fTk9fREVGQVVMVF9TWVNURU0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGVzIGEgbmV3IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHBvaW50ZXIgdG8gdGhlIG5ldyBtZW1vcnkgb2JqZWN0LiAgMCBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX01lbW9yeSApCi0gIEZUX05ld19NZW1vcnkoIHZvaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpc2NhcmRzIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX0RvbmVfTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fTk9fREVGQVVMVF9TWVNURU0gKi8KLQotCi0gIC8qIERlZmluZSBkZWZhdWx0IHJhc3RlcidzIGludGVyZmFjZS4gIFRoZSBkZWZhdWx0IHJhc3RlciBpcyBsb2NhdGVkIGluICAqLwotICAvKiBgc3JjL2Jhc2UvZnRyYXN0ZXIuYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENsaWVudCBhcHBsaWNhdGlvbnMgY2FuIHJlZ2lzdGVyIG5ldyByYXN0ZXJzIHRocm91Z2ggdGhlICAgICAgICAgICAgICAqLwotICAvKiBGVF9TZXRfUmFzdGVyKCkgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmbmRlZiBGVF9OT19ERUZBVUxUX1JBU1RFUgotICBGVF9FWFBPUlRfVkFSKCBGVF9SYXN0ZXJfRnVuY3MgKSAgZnRfZGVmYXVsdF9yYXN0ZXI7Ci0jZW5kaWYKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUT0JKU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTczYzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyZm9yay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEVtYmVkZGVkIHJlc291cmNlIGZvcmtzIGFjY2Vzc29yIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8gYW5kIFJlZGhhdCBLLksuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERldmVsb3BtZW50IG9mIHRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBzdXBwb3J0IG9mICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbmZvcm1hdGlvbi10ZWNobm9sb2d5IFByb21vdGlvbiBBZ2VuY3ksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRSRk9SS19IX18KLSNkZWZpbmUgX19GVFJGT1JLX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiBOdW1iZXIgb2YgZ3Vlc3NpbmcgcnVsZXMgc3VwcG9ydGVkIGluIGBGVF9SYWNjZXNzX0d1ZXNzJy4gICAgICAgICAgICAqLwotICAvKiBEb24ndCBmb3JnZXQgdG8gaW5jcmVtZW50IHRoZSBudW1iZXIgaWYgeW91IGFkZCBhIG5ldyBndWVzc2luZyBydWxlLiAqLwotI2RlZmluZSBGVF9SQUNDRVNTX05fUlVMRVMgIDkKLQotCi0gIC8qIEEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgcmVmZXJlbmNlIGluIGEgcmVzb3VyY2UgYnkgaXRzIHJlc291cmNlIElEICovCi0gIC8qIGFuZCBpbnRlcm5hbCBvZmZzZXQuICBUaGUgYFBPU1QnIHJlc291cmNlIGV4cGVjdHMgdG8gYmUgY29uY2F0ZW5hdGVkICovCi0gIC8qIGJ5IHRoZSBvcmRlciBvZiByZXNvdXJjZSBJRHMgaW5zdGVhZCBvZiBpdHMgYXBwZWFyYW5jZSBpbiB0aGUgZmlsZS4gICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1JGb3JrX1JlZl8KLSAgewotICAgIEZUX1VTaG9ydCAgcmVzX2lkOwotICAgIEZUX1VMb25nICAgb2Zmc2V0OwotCi0gIH0gRlRfUkZvcmtfUmVmOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFjY2Vzc19HdWVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR3Vlc3MgYSBmaWxlIG5hbWUgYW5kIG9mZnNldCB3aGVyZSB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgICAgICovCi0gIC8qICAgIHN0b3JlZC4gIFRoZSBtYWNybyBGVF9SQUNDRVNTX05fUlVMRVMgaG9sZHMgdGhlIG51bWJlciBvZiAgICAgICAgICAqLwotICAvKiAgICBndWVzc2luZyBydWxlczsgIHRoZSBndWVzc2VkIHJlc3VsdCBmb3IgdGhlIE50aCBydWxlIGlzICAgICAgICAgICAgKi8KLSAgLyogICAgcmVwcmVzZW50ZWQgYXMgYSB0cmlwbGV0OiBhIG5ldyBmaWxlIG5hbWUgKG5ld19uYW1lc1tOXSksIGEgZmlsZSAgICovCi0gIC8qICAgIG9mZnNldCAob2Zmc2V0c1tOXSksIGFuZCBhbiBlcnJvciBjb2RlIChlcnJvcnNbTl0pLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgZmlsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzb3VyY2UgZm9yay4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2VfbmFtZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSAoYmFzZSkgZmlsZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3JrIHVzZWQgZm9yIHNvbWUgICAgICAgICAgKi8KLSAgLyogICAgICBndWVzc2luZyBydWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmV3X25hbWVzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gYXJyYXkgb2YgZ3Vlc3NlZCBmaWxlIG5hbWVzIGluIHdoaWNoIHRoZSByZXNvdXJjZSBmb3JrcyBtYXkgICAqLwotICAvKiAgICAgIGV4aXN0LiAgSWYgYG5ld19uYW1lc1tOXScgaXMgTlVMTCwgdGhlIGd1ZXNzZWQgZmlsZSBuYW1lIGlzICAgICAgKi8KLSAgLyogICAgICBlcXVhbCB0byBgYmFzZV9uYW1lJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXRzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiBhcnJheSBvZiBndWVzc2VkIGZpbGUgb2Zmc2V0cy4gIGBvZmZzZXRzW05dJyBob2xkcyB0aGUgZmlsZSAgICovCi0gIC8qICAgICAgb2Zmc2V0IG9mIHRoZSBwb3NzaWJsZSBzdGFydCBvZiB0aGUgcmVzb3VyY2UgZm9yayBpbiBmaWxlICAgICAgICAqLwotICAvKiAgICAgIGBuZXdfbmFtZXNbTl0nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVycm9ycyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIGFycmF5IG9mIEZyZWVUeXBlIGVycm9yIGNvZGVzLiAgYGVycm9yc1tOXScgaXMgdGhlIGVycm9yICAgICAgKi8KLSAgLyogICAgICBjb2RlIG9mIE50aCBndWVzc2luZyBydWxlIGZ1bmN0aW9uLiAgSWYgYGVycm9yc1tOXScgaXMgbm90ICAgICAgICovCi0gIC8qICAgICAgRlRfRXJyX09rLCBgbmV3X25hbWVzW05dJyBhbmQgYG9mZnNldHNbTl0nIGFyZSBtZWFuaW5nbGVzcy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1JhY2Nlc3NfR3Vlc3MoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICBjaGFyKiogICAgICBuZXdfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgIG9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgIGVycm9ycyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoZWFkZXIgb2YgcmVzb3VyY2UgZm9yay4gIFRoZSAgICAgICAgICovCi0gIC8qICAgIGluZm9ybWF0aW9uIGluY2x1ZGVzIHRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwICAgICAgICAqLwotICAvKiAgICBzdGFydHMsIGFuZCB0aGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLiAgICAgICAgKi8KLSAgLyogICAgYEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzJyByZXF1aXJlcyB0aGVzZSB0d28gZGF0YS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBmaWxlIHN0cmVhbSBjb250YWluaW5nIHRoZSByZXNvdXJjZSBmb3JrLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmZvcmtfb2Zmc2V0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBmb3JrIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hcF9vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJkYXRhX3BvcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgRlRfRXJyX09rIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZm9ya19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKm1hcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJkYXRhX3BvcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBkYXRhIG9mZnNldHMgZm9yIGEgdGFnIGluIGEgcmVzb3VyY2UgZm9yay4gIE9mZnNldHMgYXJlICAgICovCi0gIC8qICAgIHN0b3JlZCBpbiBhbiBhcnJheSBiZWNhdXNlLCBpbiBzb21lIGNhc2VzLCByZXNvdXJjZXMgaW4gYSByZXNvdXJjZSAqLwotICAvKiAgICBmb3JrIGhhdmUgdGhlIHNhbWUgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGZpbGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIGZvcmsuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXBfb2Zmc2V0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIG1hcCBzdGFydHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZGF0YV9wb3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgcmVzb3VyY2UgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHN0cmVhbSBvZmZzZXRzIGZvciB0aGUgcmVzb3VyY2UgZGF0YSBzcGVjaWZpZWQgYnkgYHRhZycuICAgICAqLwotICAvKiAgICAgIFRoaXMgYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiwgc28geW91IGhhdmUgdG8gY2FsbCAgICAgKi8KLSAgLyogICAgICBAZnRfbWVtX2ZyZWUgYWZ0ZXIgdXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbGVuZ3RoIG9mIG9mZnNldHMgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIEZUX0Vycl9PayBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm9ybWFsbHkgeW91IHNob3VsZCB1c2UgYEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8nIHRvIGdldCB0aGUgICAgICovCi0gIC8qICAgIHZhbHVlIGZvciBgbWFwX29mZnNldCcgYW5kIGByZGF0YV9wb3MnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIG1hcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZGF0YV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgKipvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqY291bnQgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUUkZPUktfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiM2U4Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c2Vydi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgc2VydmljZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRWFjaCBtb2R1bGUgY2FuIGV4cG9ydCBvbmUgb3IgbW9yZSBgc2VydmljZXMnLiAgRWFjaCBzZXJ2aWNlIGlzICAgICAgKi8KLSAgLyogIGlkZW50aWZpZWQgYnkgYSBjb25zdGFudCBzdHJpbmcgYW5kIG1vZGVsZWQgYnkgYSBwb2ludGVyOyB0aGUgbGF0dGVyICovCi0gIC8qICBnZW5lcmFsbHkgY29ycmVzcG9uZHMgdG8gYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBmdW5jdGlvbiBwb2ludGVycy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE5vdGUgdGhhdCBhIHNlcnZpY2UncyBkYXRhIGNhbm5vdCBiZSBhIG1lcmUgZnVuY3Rpb24gcG9pbnRlciBiZWNhdXNlICovCi0gIC8qICBpbiBDIGl0IGlzIHBvc3NpYmxlIHRoYXQgZnVuY3Rpb24gcG9pbnRlcnMgbWlnaHQgYmUgaW1wbGVtZW50ZWQgICAgICAqLwotICAvKiAgZGlmZmVyZW50bHkgdGhhbiBkYXRhIHBvaW50ZXJzIChlLmcuIDQ4IGJpdHMgaW5zdGVhZCBvZiAzMikuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNFUlZfSF9fCi0jZGVmaW5lIF9fRlRTRVJWX0hfXwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jaWYgZGVmaW5lZCggX01TQ19WRVIgKSAgICAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0KLSAgLyogd2UgZGlzYWJsZSB0aGUgd2FybmluZyBgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCcgaGVyZSAqLwotICAvKiBpbiBvcmRlciB0byBjb21waWxlIGNsZWFubHkgd2l0aCB0aGUgbWF4aW11bSBsZXZlbCBvZiB3YXJuaW5ncyAgICovCi0jcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTI3ICkKLQotI2VuZGlmIC8qIF9NU0NfVkVSICovCi0KLSAgLyoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbG9vayB1cCBhIHNlcnZpY2UgZnJvbSBhIGZhY2UncyBkcml2ZXIgbW9kdWxlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogICBpZCA6OgotICAgKiAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmljZSBhcyBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlJ3MKLSAgICogICAgIGhlYWRlciBmaWxlcyAoZS5nLiBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgd2hpY2ggZXhwYW5kcyB0bwotICAgKiAgICAgYG11bHRpLW1hc3RlcnMnKS4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aAotICAgKiAgICAgYEZUX1NFUlZJQ0VfSURfJy4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBwdHIgOjoKLSAgICogICAgIEEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgc2VydmljZSBwb2ludGVyLiAgV2lsbCBiZSBOVUxMCi0gICAqICAgICBpZiBub3QgZm91bmQuCi0gICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgICBtb2R1bGUgPSBGVF9NT0RVTEUoIEZUX0ZBQ0UoIGZhY2UgKS0+ZHJpdmVyICk7ICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICAgX3RtcF8gID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciogIF9wcHRyXyA9IChGVF9Qb2ludGVyKikmKHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgX3RtcF8gPSBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkICk7IFwKLSAgICAqX3BwdHJfID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZWxzZSAvKiAhQysrICovCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgIG1vZHVsZSA9IEZUX01PRFVMRSggRlRfRkFDRSggZmFjZSApLT5kcml2ZXIgKTsgICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICBfdG1wXyAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIF90bXBfID0gbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggbW9kdWxlLCBGVF9TRVJWSUNFX0lEXyAjIyBpZCApOyBcCi0gICAgcHRyID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2VuZGlmIC8qICFDKysgKi8KLQotICAvKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbG9vayB1cCBhIHNlcnZpY2UgZnJvbSBhbGwgbW9kdWxlcy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGZhY2UgOjoKLSAgICogICAgIFRoZSBzb3VyY2UgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqICAgaWQgOjoKLSAgICogICAgIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNlcnZpY2UgYXMgZGVmaW5lZCBpbiB0aGUgc2VydmljZSdzCi0gICAqICAgICBoZWFkZXIgZmlsZXMgKGUuZy4gRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTIHdoaWNoIGV4cGFuZHMgdG8KLSAgICogICAgIGBtdWx0aS1tYXN0ZXJzJykuICBJdCBpcyBhdXRvbWF0aWNhbGx5IHByZWZpeGVkIHdpdGgKLSAgICogICAgIGBGVF9TRVJWSUNFX0lEXycuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgcHRyIDo6Ci0gICAqICAgICBBIHZhcmlhYmxlIHRoYXQgcmVjZWl2ZXMgdGhlIHNlcnZpY2UgcG9pbnRlci4gIFdpbGwgYmUgTlVMTAotICAgKiAgICAgaWYgbm90IGZvdW5kLgotICAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0jZGVmaW5lIEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSggZmFjZSwgcHRyLCBpZCApICAgICAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Nb2R1bGUgICAgbW9kdWxlID0gRlRfTU9EVUxFKCBGVF9GQUNFKCBmYWNlICktPmRyaXZlciApOyAgICBcCi0gICAgRlRfUG9pbnRlciAgIF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1BvaW50ZXIqICBfcHB0cl8gPSAoRlRfUG9pbnRlciopJihwdHIpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF90bXBfID0gZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkICk7IFwKLSAgICAqX3BwdHJfID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZWxzZSAvKiAhQysrICovCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgIG1vZHVsZSA9IEZUX01PRFVMRSggRlRfRkFDRSggZmFjZSApLT5kcml2ZXIgKTsgICAgIFwKLSAgICBGVF9Qb2ludGVyICBfdG1wXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfdG1wXyA9IGZ0X21vZHVsZV9nZXRfc2VydmljZSggbW9kdWxlLCBGVF9TRVJWSUNFX0lEXyAjIyBpZCApOyBcCi0gICAgcHRyICAgPSBfdG1wXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2VuZGlmIC8qICFDKysgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgIFMgRSBSIFYgSSBDIEUgICBEIEUgUyBDIFIgSSBQIFQgTyBSIFMgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIF9kZXNjcmliZV8gYSBnaXZlbiBzZXJ2aWNlCi0gICAqICB0byB0aGUgbGlicmFyeS4gIFRoaXMgaXMgdXNlZnVsIHRvIGJ1aWxkIHNpbXBsZSBzdGF0aWMgc2VydmljZSBsaXN0cy4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TZXJ2aWNlRGVzY1JlY18KLSAgewotICAgIGNvbnN0IGNoYXIqICBzZXJ2X2lkOyAgICAgLyogc2VydmljZSBuYW1lICAgICAgICAgKi8KLSAgICBjb25zdCB2b2lkKiAgc2Vydl9kYXRhOyAgIC8qIHNlcnZpY2UgcG9pbnRlci9kYXRhICovCi0KLSAgfSBGVF9TZXJ2aWNlRGVzY1JlYzsKLQotICB0eXBlZGVmIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjKiAgRlRfU2VydmljZURlc2M7Ci0KLQotICAvKgotICAgKiAgUGFyc2UgYSBsaXN0IG9mIEZUX1NlcnZpY2VEZXNjUmVjIGRlc2NyaXB0b3JzIGFuZCBsb29rIGZvcgotICAgKiAgYSBzcGVjaWZpYyBzZXJ2aWNlIGJ5IElELiAgTm90ZSB0aGF0IHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlCi0gICAqICBhcnJheSBtdXN0IGJlIHsgTlVMTCwgTlVMTCB9LCBhbmQgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkCi0gICAqICByZXR1cm4gTlVMTCBpZiB0aGUgc2VydmljZSBpc24ndCBhdmFpbGFibGUuCi0gICAqCi0gICAqICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IG1vZHVsZXMgdG8gaW1wbGVtZW50IHRoZWlyCi0gICAqICBgZ2V0X3NlcnZpY2UnIG1ldGhvZC4KLSAgICovCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBGVF9TZXJ2aWNlRGVzYyAgc2VydmljZV9kZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgIHNlcnZpY2VfaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICBTIEUgUiBWIEkgQyBFIFMgICBDIEEgQyBIIEUgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAqICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIGEgY2FjaGUgZm9yIHNldmVyYWwgZnJlcXVlbnRseSB1c2VkCi0gICAqICBzZXJ2aWNlcy4gIEl0IGlzIHRoZSB0eXBlIG9mIGBmYWNlLT5pbnRlcm5hbC0+c2VydmljZXMnLiAgWW91Ci0gICAqICBzaG91bGQgb25seSB1c2UgRlRfRkFDRV9MT09LVVBfU0VSVklDRSB0byBhY2Nlc3MgaXQuCi0gICAqCi0gICAqICBBbGwgZmllbGRzIHNob3VsZCBoYXZlIHRoZSB0eXBlIEZUX1BvaW50ZXIgdG8gcmVsYXggY29tcGlsYXRpb24KLSAgICogIGRlcGVuZGVuY2llcy4gIFdlIGFzc3VtZSB0aGUgZGV2ZWxvcGVyIGlzbid0IGNvbXBsZXRlbHkgc3R1cGlkLgotICAgKgotICAgKiAgRWFjaCBmaWVsZCBtdXN0IGJlIG5hbWVkIGBzZXJ2aWNlX1hYWFgnIHdoZXJlIGBYWFgnIGNvcnJlc3BvbmRzIHRvCi0gICAqICB0aGUgY29ycmVjdCBGVF9TRVJWSUNFX0lEX1hYWFggbWFjcm8uICBTZWUgdGhlIGRlZmluaXRpb24gb2YKLSAgICogIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UgYmVsb3cgaG93IHRoaXMgaXMgaW1wbGVtZW50ZWQuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2VydmljZUNhY2hlUmVjXwotICB7Ci0gICAgRlRfUG9pbnRlciAgc2VydmljZV9QT1NUU0NSSVBUX0ZPTlRfTkFNRTsKLSAgICBGVF9Qb2ludGVyICBzZXJ2aWNlX01VTFRJX01BU1RFUlM7Ci0gICAgRlRfUG9pbnRlciAgc2VydmljZV9HTFlQSF9ESUNUOwotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfUEZSX01FVFJJQ1M7Ci0gICAgRlRfUG9pbnRlciAgc2VydmljZV9XSU5GTlQ7Ci0KLSAgfSBGVF9TZXJ2aWNlQ2FjaGVSZWMsICpGVF9TZXJ2aWNlQ2FjaGU7Ci0KLQotICAvKgotICAgKiAgQSBtYWdpYyBudW1iZXIgdXNlZCB3aXRoaW4gdGhlIHNlcnZpY2VzIGNhY2hlLgotICAgKi8KLSNkZWZpbmUgRlRfU0VSVklDRV9VTkFWQUlMQUJMRSAgKChGVF9Qb2ludGVyKS0yKSAgLyogbWFnaWMgbnVtYmVyICovCi0KLQotICAvKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRkFDRV9MT09LVVBfU0VSVklDRQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBtYWNybyBpcyB1c2VkIHRvIGxvb2t1cCBhIHNlcnZpY2UgZnJvbSBhIGZhY2UncyBkcml2ZXIgbW9kdWxlCi0gICAqICAgdXNpbmcgaXRzIGNhY2hlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZTo6Ci0gICAqICAgICBUaGUgc291cmNlIGZhY2UgaGFuZGxlIGNvbnRhaW5pbmcgdGhlIGNhY2hlLgotICAgKgotICAgKiAgIGZpZWxkIDo6Ci0gICAqICAgICBUaGUgZmllbGQgbmFtZSBpbiB0aGUgY2FjaGUuCi0gICAqCi0gICAqICAgaWQgOjoKLSAgICogICAgIFRoZSBzZXJ2aWNlIElELgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHB0ciA6OgotICAgKiAgICAgQSB2YXJpYWJsZSByZWNlaXZpbmcgdGhlIHNlcnZpY2UgZGF0YS4gIE5VTEwgaWYgbm90IGF2YWlsYWJsZS4KLSAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotI2RlZmluZSBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1BvaW50ZXIgICBzdmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1BvaW50ZXIqICBQcHRyID0gKEZUX1BvaW50ZXIqKSYocHRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN2YyA9IEZUX0ZBQ0UoIGZhY2UgKS0+aW50ZXJuYWwtPnNlcnZpY2VzLiBzZXJ2aWNlXyAjIyBpZDsgXAotICAgIGlmICggc3ZjID09IEZUX1NFUlZJQ0VfVU5BVkFJTEFCTEUgKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgc3ZjID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKCBzdmMgPT0gTlVMTCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHN2YywgaWQgKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRkFDRSggZmFjZSApLT5pbnRlcm5hbC0+c2VydmljZXMuIHNlcnZpY2VfICMjIGlkID0gICAgXAotICAgICAgICAoRlRfUG9pbnRlcikoIHN2YyAhPSBOVUxMID8gc3ZjICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlRfU0VSVklDRV9VTkFWQUlMQUJMRSApOyAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpQcHRyID0gc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2Vsc2UgLyogIUMrKyAqLwotCi0jZGVmaW5lIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciAgc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ZjID0gRlRfRkFDRSggZmFjZSApLT5pbnRlcm5hbC0+c2VydmljZXMuIHNlcnZpY2VfICMjIGlkOyBcCi0gICAgaWYgKCBzdmMgPT0gRlRfU0VSVklDRV9VTkFWQUlMQUJMRSApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBzdmMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAoIHN2YyA9PSBOVUxMICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc3ZjLCBpZCApOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GQUNFKCBmYWNlICktPmludGVybmFsLT5zZXJ2aWNlcy4gc2VydmljZV8gIyMgaWQgPSAgICBcCi0gICAgICAgIChGVF9Qb2ludGVyKSggc3ZjICE9IE5VTEwgPyBzdmMgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9TRVJWSUNFX1VOQVZBSUxBQkxFICk7ICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHRyID0gc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZW5kaWYgLyogIUMrKyAqLwotCi0gIC8qCi0gICAqICBBIG1hY3JvIHVzZWQgdG8gZGVmaW5lIG5ldyBzZXJ2aWNlIHN0cnVjdHVyZSB0eXBlcy4KLSAgICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0UoIG5hbWUgKSAgICAgICAgICAgIFwKLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2VydmljZV8gIyMgbmFtZSAjIyBSZWNfIFwKLSAgICBGVF9TZXJ2aWNlXyAjIyBuYW1lICMjIFJlYyA7ICAgICAgICAgICAgIFwKLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2VydmljZV8gIyMgbmFtZSAjIyBSZWNfIFwKLSAgICBjb25zdCAqIEZUX1NlcnZpY2VfICMjIG5hbWUgOyAgICAgICAgICAgIFwKLSAgc3RydWN0IEZUX1NlcnZpY2VfICMjIG5hbWUgIyMgUmVjXwotCi0gIC8qICovCi0KLSAgLyoKLSAgICogIFRoZSBoZWFkZXIgZmlsZXMgY29udGFpbmluZyB0aGUgc2VydmljZXMuCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfQkRGX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfQ0lEX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9IICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0Lmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfR1hfVkFMSURBVEVfSCAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z3h2YWwuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9LRVJOSU5HX0ggICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19IICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9PUEVOVFlQRV9WQUxJREFURV9IICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BGUl9IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSCAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19IICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9IICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1NGTlRfSCAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9UUlVFVFlQRV9FTkdJTkVfSCAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1RUX0NNQVBfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1dJTkZOVF9IICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1hGUkVFODZfTkFNRV9IICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnhmODZubS5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSCAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oPgotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFNFUlZfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MWViNzIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3RyZWFtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTdHJlYW0gaGFuZGxpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDA0LCAyMDA1LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUU1RSRUFNX0hfXwotI2RlZmluZSBfX0ZUU1RSRUFNX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogZm9ybWF0IG9mIGFuIDgtYml0IGZyYW1lX29wIHZhbHVlOiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYml0ICA3NjU0MzIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB4eHh4eHhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogcyBpcyBzZXQgdG8gMSBpZiB0aGUgdmFsdWUgaXMgc2lnbmVkLiAgICAgICAgKi8KLSAgLyogZSBpcyBzZXQgdG8gMSBpZiB0aGUgdmFsdWUgaXMgbGl0dGxlLWVuZGlhbi4gKi8KLSAgLyogeHh4IGlzIGEgY29tbWFuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBGVF9GUkFNRV9PUF9TSElGVCAgICAgICAgIDIKLSNkZWZpbmUgRlRfRlJBTUVfT1BfU0lHTkVEICAgICAgICAxCi0jZGVmaW5lIEZUX0ZSQU1FX09QX0xJVFRMRSAgICAgICAgMgotI2RlZmluZSBGVF9GUkFNRV9PUF9DT01NQU5EKCB4ICkgICggeCA+PiBGVF9GUkFNRV9PUF9TSElGVCApCi0KLSNkZWZpbmUgRlRfTUFLRV9GUkFNRV9PUCggY29tbWFuZCwgbGl0dGxlLCBzaWduICkgXAotICAgICAgICAgICggKCBjb21tYW5kIDw8IEZUX0ZSQU1FX09QX1NISUZUICkgfCAoIGxpdHRsZSA8PCAxICkgfCBzaWduICkKLQotI2RlZmluZSBGVF9GUkFNRV9PUF9FTkQgICAgMAotI2RlZmluZSBGVF9GUkFNRV9PUF9TVEFSVCAgMSAgLyogc3RhcnQgYSBuZXcgZnJhbWUgICAgICovCi0jZGVmaW5lIEZUX0ZSQU1FX09QX0JZVEUgICAyICAvKiByZWFkIDEtYnl0ZSB2YWx1ZSAgICAgKi8KLSNkZWZpbmUgRlRfRlJBTUVfT1BfU0hPUlQgIDMgIC8qIHJlYWQgMi1ieXRlIHZhbHVlICAgICAqLwotI2RlZmluZSBGVF9GUkFNRV9PUF9MT05HICAgNCAgLyogcmVhZCA0LWJ5dGUgdmFsdWUgICAgICovCi0jZGVmaW5lIEZUX0ZSQU1FX09QX09GRjMgICA1ICAvKiByZWFkIDMtYnl0ZSB2YWx1ZSAgICAgKi8KLSNkZWZpbmUgRlRfRlJBTUVfT1BfQllURVMgIDYgIC8qIHJlYWQgYSBieXRlcyBzZXF1ZW5jZSAqLwotCi0KLSAgdHlwZWRlZiBlbnVtICBGVF9GcmFtZV9PcF8KLSAgewotICAgIGZ0X2ZyYW1lX2VuZCAgICAgICA9IDAsCi0gICAgZnRfZnJhbWVfc3RhcnQgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU1RBUlQsIDAsIDAgKSwKLQotICAgIGZ0X2ZyYW1lX2J5dGUgICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0JZVEUsICAwLCAwICksCi0gICAgZnRfZnJhbWVfc2NoYXIgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfQllURSwgIDAsIDEgKSwKLQotICAgIGZ0X2ZyYW1lX3VzaG9ydF9iZSA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NIT1JULCAwLCAwICksCi0gICAgZnRfZnJhbWVfc2hvcnRfYmUgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU0hPUlQsIDAsIDEgKSwKLSAgICBmdF9mcmFtZV91c2hvcnRfbGUgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9TSE9SVCwgMSwgMCApLAotICAgIGZ0X2ZyYW1lX3Nob3J0X2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NIT1JULCAxLCAxICksCi0KLSAgICBmdF9mcmFtZV91bG9uZ19iZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9MT05HLCAwLCAwICksCi0gICAgZnRfZnJhbWVfbG9uZ19iZSAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfTE9ORywgMCwgMSApLAotICAgIGZ0X2ZyYW1lX3Vsb25nX2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0xPTkcsIDEsIDAgKSwKLSAgICBmdF9mcmFtZV9sb25nX2xlICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9MT05HLCAxLCAxICksCi0KLSAgICBmdF9mcmFtZV91b2ZmM19iZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9PRkYzLCAwLCAwICksCi0gICAgZnRfZnJhbWVfb2ZmM19iZSAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfT0ZGMywgMCwgMSApLAotICAgIGZ0X2ZyYW1lX3VvZmYzX2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX09GRjMsIDEsIDAgKSwKLSAgICBmdF9mcmFtZV9vZmYzX2xlICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9PRkYzLCAxLCAxICksCi0KLSAgICBmdF9mcmFtZV9ieXRlcyAgICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9CWVRFUywgMCwgMCApLAotICAgIGZ0X2ZyYW1lX3NraXAgICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0JZVEVTLCAwLCAxICkKLQotICB9IEZUX0ZyYW1lX09wOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ZyYW1lX0ZpZWxkXwotICB7Ci0gICAgRlRfQnl0ZSAgICB2YWx1ZTsKLSAgICBGVF9CeXRlICAgIHNpemU7Ci0gICAgRlRfVVNob3J0ICBvZmZzZXQ7Ci0KLSAgfSBGVF9GcmFtZV9GaWVsZDsKLQotCi0gIC8qIENvbnN0cnVjdCBhbiBGVF9GcmFtZV9GaWVsZCBvdXQgb2YgYSBzdHJ1Y3R1cmUgdHlwZSBhbmQgYSBmaWVsZCBuYW1lLiAqLwotICAvKiBUaGUgc3RydWN0dXJlIHR5cGUgbXVzdCBiZSBzZXQgaW4gdGhlIEZUX1NUUlVDVFVSRSBtYWNybyBiZWZvcmUgICAgICAgKi8KLSAgLyogY2FsbGluZyB0aGUgRlRfRlJBTUVfU1RBUlQoKSBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9GSUVMRF9TSVpFKCBmICkgXAotICAgICAgICAgIChGVF9CeXRlKXNpemVvZiAoICgoRlRfU1RSVUNUVVJFKikwKS0+ZiApCi0KLSNkZWZpbmUgRlRfRklFTERfU0laRV9ERUxUQSggZiApIFwKLSAgICAgICAgICAoRlRfQnl0ZSlzaXplb2YgKCAoKEZUX1NUUlVDVFVSRSopMCktPmZbMF0gKQotCi0jZGVmaW5lIEZUX0ZJRUxEX09GRlNFVCggZiApIFwKLSAgICAgICAgICAoRlRfVVNob3J0KSggb2Zmc2V0b2YoIEZUX1NUUlVDVFVSRSwgZiApICkKLQotI2RlZmluZSBGVF9GUkFNRV9GSUVMRCggZnJhbWVfb3AsIGZpZWxkICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnJhbWVfb3AsICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRSggZmllbGQgKSwgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBmaWVsZCApICAgICAgXAotICAgICAgICAgIH0KLQotI2RlZmluZSBGVF9NQUtFX0VNUFRZX0ZJRUxEKCBmcmFtZV9vcCApICB7IGZyYW1lX29wLCAwLCAwIH0KLQotI2RlZmluZSBGVF9GUkFNRV9TVEFSVCggc2l6ZSApICAgeyBmdF9mcmFtZV9zdGFydCwgMCwgc2l6ZSB9Ci0jZGVmaW5lIEZUX0ZSQU1FX0VORCAgICAgICAgICAgICB7IGZ0X2ZyYW1lX2VuZCwgMCwgMCB9Ci0KLSNkZWZpbmUgRlRfRlJBTUVfTE9ORyggZiApICAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9sb25nX2JlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfVUxPTkcoIGYgKSAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91bG9uZ19iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1NIT1JUKCBmICkgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfc2hvcnRfYmUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9VU0hPUlQoIGYgKSAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3VzaG9ydF9iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX09GRjMoIGYgKSAgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfb2ZmM19iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1VPRkYzKCBmICkgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdW9mZjNfYmUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9CWVRFKCBmICkgICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX2J5dGUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9DSEFSKCBmICkgICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3NjaGFyLCBmICkKLQotI2RlZmluZSBGVF9GUkFNRV9MT05HX0xFKCBmICkgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX2xvbmdfbGUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9VTE9OR19MRSggZiApICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3Vsb25nX2xlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfU0hPUlRfTEUoIGYgKSAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9zaG9ydF9sZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1VTSE9SVF9MRSggZiApICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdXNob3J0X2xlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfT0ZGM19MRSggZiApICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9vZmYzX2xlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfVU9GRjNfTEUoIGYgKSAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91b2ZmM19sZSwgZiApCi0KLSNkZWZpbmUgRlRfRlJBTUVfU0tJUF9MT05HICAgICAgIHsgZnRfZnJhbWVfbG9uZ19iZSwgMCwgMCB9Ci0jZGVmaW5lIEZUX0ZSQU1FX1NLSVBfU0hPUlQgICAgICB7IGZ0X2ZyYW1lX3Nob3J0X2JlLCAwLCAwIH0KLSNkZWZpbmUgRlRfRlJBTUVfU0tJUF9CWVRFICAgICAgIHsgZnRfZnJhbWVfYnl0ZSwgMCwgMCB9Ci0KLSNkZWZpbmUgRlRfRlJBTUVfQllURVMoIGZpZWxkLCBjb3VudCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZ0X2ZyYW1lX2J5dGVzLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvdW50LCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggZmllbGQgKSAgIFwKLSAgICAgICAgICB9Ci0KLSNkZWZpbmUgRlRfRlJBTUVfU0tJUF9CWVRFUyggY291bnQgKSAgeyBmdF9mcmFtZV9za2lwLCBjb3VudCwgMCB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEludGVnZXIgZXh0cmFjdGlvbiBtYWNyb3MgLS0gdGhlIGBidWZmZXInIHBhcmFtZXRlciBtdXN0IEFMV0FZUyBiZSBvZiAqLwotICAvKiB0eXBlIGBjaGFyKicgb3IgZXF1aXZhbGVudCAoMS1ieXRlIGVsZW1lbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgRlRfQllURV8oIHAsIGkgKSAgKCAoKGNvbnN0IEZUX0J5dGUqKShwKSlbKGkpXSApCi0jZGVmaW5lIEZUX0lOVDhfKCBwLCBpICkgICggKChjb25zdCBGVF9DaGFyKikocCkpWyhpKV0gKQotCi0jZGVmaW5lIEZUX0lOVDE2KCB4ICkgICAoIChGVF9JbnQxNikoeCkgICkKLSNkZWZpbmUgRlRfVUlOVDE2KCB4ICkgICggKEZUX1VJbnQxNikoeCkgKQotI2RlZmluZSBGVF9JTlQzMiggeCApICAgKCAoRlRfSW50MzIpKHgpICApCi0jZGVmaW5lIEZUX1VJTlQzMiggeCApICAoIChGVF9VSW50MzIpKHgpICkKLQotI2RlZmluZSBGVF9CWVRFX0kxNiggcCwgaSwgcyApICAoIEZUX0lOVDE2KCAgRlRfQllURV8oIHAsIGkgKSApIDw8IChzKSApCi0jZGVmaW5lIEZUX0JZVEVfVTE2KCBwLCBpLCBzICkgICggRlRfVUlOVDE2KCBGVF9CWVRFXyggcCwgaSApICkgPDwgKHMpICkKLSNkZWZpbmUgRlRfQllURV9JMzIoIHAsIGksIHMgKSAgKCBGVF9JTlQzMiggIEZUX0JZVEVfKCBwLCBpICkgKSA8PCAocykgKQotI2RlZmluZSBGVF9CWVRFX1UzMiggcCwgaSwgcyApICAoIEZUX1VJTlQzMiggRlRfQllURV8oIHAsIGkgKSApIDw8IChzKSApCi0KLSNkZWZpbmUgRlRfSU5UOF9JMTYoIHAsIGksIHMgKSAgKCBGVF9JTlQxNiggIEZUX0lOVDhfKCBwLCBpICkgKSA8PCAocykgKQotI2RlZmluZSBGVF9JTlQ4X1UxNiggcCwgaSwgcyApICAoIEZUX1VJTlQxNiggRlRfSU5UOF8oIHAsIGkgKSApIDw8IChzKSApCi0jZGVmaW5lIEZUX0lOVDhfSTMyKCBwLCBpLCBzICkgICggRlRfSU5UMzIoICBGVF9JTlQ4XyggcCwgaSApICkgPDwgKHMpICkKLSNkZWZpbmUgRlRfSU5UOF9VMzIoIHAsIGksIHMgKSAgKCBGVF9VSU5UMzIoIEZUX0lOVDhfKCBwLCBpICkgKSA8PCAocykgKQotCi0KLSNkZWZpbmUgRlRfUEVFS19TSE9SVCggcCApICBGVF9JTlQxNiggRlRfSU5UOF9JMTYoIHAsIDAsIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX0kxNiggcCwgMSwgMCkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVVNIT1JUKCBwICkgIEZUX1VJTlQxNiggRlRfQllURV9VMTYoIHAsIDAsIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UxNiggcCwgMSwgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX0xPTkcoIHAgKSAgRlRfSU5UMzIoIEZUX0lOVDhfSTMyKCBwLCAwLCAyNCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfSTMyKCBwLCAxLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfSTMyKCBwLCAyLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfSTMyKCBwLCAzLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX1VMT05HKCBwICkgIEZUX1VJTlQzMiggRlRfQllURV9VMzIoIHAsIDAsIDI0ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAyLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDMsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfT0ZGMyggcCApICBGVF9JTlQzMiggRlRfSU5UOF9JMzIoIHAsIDAsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9JMzIoIHAsIDEsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9JMzIoIHAsIDIsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVU9GRjMoIHAgKSAgRlRfVUlOVDMyKCBGVF9CWVRFX1UzMiggcCwgMCwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfU0hPUlRfTEUoIHAgKSAgRlRfSU5UMTYoIEZUX0lOVDhfSTE2KCBwLCAxLCA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfSTE2KCBwLCAwLCAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVVNIT1JUX0xFKCBwICkgIEZUX1VJTlQxNiggRlRfQllURV9VMTYoIHAsIDEsIDggKSB8ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMTYoIHAsIDAsIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19MT05HX0xFKCBwICkgIEZUX0lOVDMyKCBGVF9JTlQ4X0kzMiggcCwgMywgMjQgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX0kzMiggcCwgMiwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX0kzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX0kzMiggcCwgMCwgIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19VTE9OR19MRSggcCApICBGVF9VSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAzLCAyNCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAwLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX09GRjNfTEUoIHAgKSAgRlRfSU5UMzIoIEZUX0lOVDhfSTMyKCBwLCAyLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfSTMyKCBwLCAxLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfSTMyKCBwLCAwLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX1VPRkYzX0xFKCBwICkgIEZUX1VJTlQzMiggRlRfQllURV9VMzIoIHAsIDIsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAwLCAgMCApICkKLQotCi0jZGVmaW5lIEZUX05FWFRfQ0hBUiggYnVmZmVyICkgICAgICAgXAotICAgICAgICAgICggKHNpZ25lZCBjaGFyKSpidWZmZXIrKyApCi0KLSNkZWZpbmUgRlRfTkVYVF9CWVRFKCBidWZmZXIgKSAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBjaGFyKSpidWZmZXIrKyApCi0KLSNkZWZpbmUgRlRfTkVYVF9TSE9SVCggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChzaG9ydCkoIGJ1ZmZlciArPSAyLCBGVF9QRUVLX1NIT1JUKCBidWZmZXIgLSAyICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9VU0hPUlQoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgc2hvcnQpKCBidWZmZXIgKz0gMiwgRlRfUEVFS19VU0hPUlQoIGJ1ZmZlciAtIDIgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX09GRjMoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChsb25nKSggYnVmZmVyICs9IDMsIEZUX1BFRUtfT0ZGMyggYnVmZmVyIC0gMyApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVU9GRjMoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDMsIEZUX1BFRUtfVU9GRjMoIGJ1ZmZlciAtIDMgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX0xPTkcoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfTE9ORyggYnVmZmVyIC0gNCApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVUxPTkcoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfVUxPTkcoIGJ1ZmZlciAtIDQgKSApICkKLQotCi0jZGVmaW5lIEZUX05FWFRfU0hPUlRfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoc2hvcnQpKCBidWZmZXIgKz0gMiwgRlRfUEVFS19TSE9SVF9MRSggYnVmZmVyIC0gMiApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVVNIT1JUX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHVuc2lnbmVkIHNob3J0KSggYnVmZmVyICs9IDIsIEZUX1BFRUtfVVNIT1JUX0xFKCBidWZmZXIgLSAyICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9PRkYzX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAobG9uZykoIGJ1ZmZlciArPSAzLCBGVF9QRUVLX09GRjNfTEUoIGJ1ZmZlciAtIDMgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX1VPRkYzX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgbG9uZykoIGJ1ZmZlciArPSAzLCBGVF9QRUVLX1VPRkYzX0xFKCBidWZmZXIgLSAzICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9MT05HX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAobG9uZykoIGJ1ZmZlciArPSA0LCBGVF9QRUVLX0xPTkdfTEUoIGJ1ZmZlciAtIDQgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX1VMT05HX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgbG9uZykoIGJ1ZmZlciArPSA0LCBGVF9QRUVLX1VMT05HX0xFKCBidWZmZXIgLSA0ICkgKSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggR0VUX3h4eHgoKSBtYWNybyB1c2VzIGFuIGltcGxpY2l0IGBzdHJlYW0nIHZhcmlhYmxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAwCi0jZGVmaW5lIEZUX0dFVF9NQUNSTyggdHlwZSApICAgIEZUX05FWFRfICMjIHR5cGUgKCBzdHJlYW0tPmN1cnNvciApCi0KLSNkZWZpbmUgRlRfR0VUX0NIQVIoKSAgICAgICBGVF9HRVRfTUFDUk8oIENIQVIgKQotI2RlZmluZSBGVF9HRVRfQllURSgpICAgICAgIEZUX0dFVF9NQUNSTyggQllURSApCi0jZGVmaW5lIEZUX0dFVF9TSE9SVCgpICAgICAgRlRfR0VUX01BQ1JPKCBTSE9SVCApCi0jZGVmaW5lIEZUX0dFVF9VU0hPUlQoKSAgICAgRlRfR0VUX01BQ1JPKCBVU0hPUlQgKQotI2RlZmluZSBGVF9HRVRfT0ZGMygpICAgICAgIEZUX0dFVF9NQUNSTyggT0ZGMyApCi0jZGVmaW5lIEZUX0dFVF9VT0ZGMygpICAgICAgRlRfR0VUX01BQ1JPKCBVT0ZGMyApCi0jZGVmaW5lIEZUX0dFVF9MT05HKCkgICAgICAgRlRfR0VUX01BQ1JPKCBMT05HICkKLSNkZWZpbmUgRlRfR0VUX1VMT05HKCkgICAgICBGVF9HRVRfTUFDUk8oIFVMT05HICkKLSNkZWZpbmUgRlRfR0VUX1RBRzQoKSAgICAgICBGVF9HRVRfTUFDUk8oIFVMT05HICkKLQotI2RlZmluZSBGVF9HRVRfU0hPUlRfTEUoKSAgIEZUX0dFVF9NQUNSTyggU0hPUlRfTEUgKQotI2RlZmluZSBGVF9HRVRfVVNIT1JUX0xFKCkgIEZUX0dFVF9NQUNSTyggVVNIT1JUX0xFICkKLSNkZWZpbmUgRlRfR0VUX0xPTkdfTEUoKSAgICBGVF9HRVRfTUFDUk8oIExPTkdfTEUgKQotI2RlZmluZSBGVF9HRVRfVUxPTkdfTEUoKSAgIEZUX0dFVF9NQUNSTyggVUxPTkdfTEUgKQotCi0jZWxzZQotI2RlZmluZSBGVF9HRVRfTUFDUk8oIGZ1bmMsIHR5cGUgKSAgICAgICAgKCAodHlwZSlmdW5jKCBzdHJlYW0gKSApCi0KLSNkZWZpbmUgRlRfR0VUX0NIQVIoKSAgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRDaGFyLCBGVF9DaGFyICkKLSNkZWZpbmUgRlRfR0VUX0JZVEUoKSAgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRDaGFyLCBGVF9CeXRlICkKLSNkZWZpbmUgRlRfR0VUX1NIT1JUKCkgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRTaG9ydCwgRlRfU2hvcnQgKQotI2RlZmluZSBGVF9HRVRfVVNIT1JUKCkgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFNob3J0LCBGVF9VU2hvcnQgKQotI2RlZmluZSBGVF9HRVRfT0ZGMygpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldE9mZnNldCwgRlRfTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9VT0ZGMygpICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0T2Zmc2V0LCBGVF9VTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9MT05HKCkgICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0TG9uZywgRlRfTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9VTE9ORygpICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0TG9uZywgRlRfVUxvbmcgKQotI2RlZmluZSBGVF9HRVRfVEFHNCgpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldExvbmcsIEZUX1VMb25nICkKLQotI2RlZmluZSBGVF9HRVRfU0hPUlRfTEUoKSAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFNob3J0TEUsIEZUX1Nob3J0ICkKLSNkZWZpbmUgRlRfR0VUX1VTSE9SVF9MRSgpICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRTaG9ydExFLCBGVF9VU2hvcnQgKQotI2RlZmluZSBGVF9HRVRfTE9OR19MRSgpICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldExvbmdMRSwgRlRfTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9VTE9OR19MRSgpICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0TG9uZ0xFLCBGVF9VTG9uZyApCi0jZW5kaWYKLQotI2RlZmluZSBGVF9SRUFEX01BQ1JPKCBmdW5jLCB0eXBlLCB2YXIgKSAgICAgICAgXAotICAgICAgICAgICggdmFyID0gKHR5cGUpZnVuYyggc3RyZWFtLCAmZXJyb3IgKSwgXAotICAgICAgICAgICAgZXJyb3IgIT0gRlRfRXJyX09rICkKLQotI2RlZmluZSBGVF9SRUFEX0JZVEUoIHZhciApICAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkQ2hhciwgRlRfQnl0ZSwgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9DSEFSKCB2YXIgKSAgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZENoYXIsIEZUX0NoYXIsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfU0hPUlQoIHZhciApICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRTaG9ydCwgRlRfU2hvcnQsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVVNIT1JUKCB2YXIgKSAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRTaG9ydCwgRlRfVVNob3J0LCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX09GRjMoIHZhciApICAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkT2Zmc2V0LCBGVF9Mb25nLCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX1VPRkYzKCB2YXIgKSAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkT2Zmc2V0LCBGVF9VTG9uZywgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9MT05HKCB2YXIgKSAgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZExvbmcsIEZUX0xvbmcsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVUxPTkcoIHZhciApICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRMb25nLCBGVF9VTG9uZywgdmFyICkKLQotI2RlZmluZSBGVF9SRUFEX1NIT1JUX0xFKCB2YXIgKSAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkU2hvcnRMRSwgRlRfU2hvcnQsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVVNIT1JUX0xFKCB2YXIgKSAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRTaG9ydExFLCBGVF9VU2hvcnQsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfTE9OR19MRSggdmFyICkgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRMb25nTEUsIEZUX0xvbmcsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVUxPTkdfTEUoIHZhciApICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRMb25nTEUsIEZUX1VMb25nLCB2YXIgKQotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTQotCi0gIC8qIGluaXRpYWxpemUgYSBzdHJlYW0gZm9yIHJlYWRpbmcgYSByZWd1bGFyIHN5c3RlbSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3BlbiggRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fTk9fREVGQVVMVF9TWVNURU0gKi8KLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyAoaW5wdXQpIHN0cmVhbSBmcm9tIGFuIEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fTmV3KCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9PcGVuX0FyZ3MqICBhcmdzLAotICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICphc3RyZWFtICk7Ci0KLSAgLyogZnJlZSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU3RyZWFtX0ZyZWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBleHRlcm5hbCApOwotCi0gIC8qIGluaXRpYWxpemUgYSBzdHJlYW0gZm9yIHJlYWRpbmcgaW4tbWVtb3J5IGRhdGEgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgc2l6ZSApOwotCi0gIC8qIGNsb3NlIGEgc3RyZWFtIChkb2VzIG5vdCBkZXN0cm95IHRoZSBzdHJlYW0gc3RydWN0dXJlKSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU3RyZWFtX0Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgLyogc2VlayB3aXRoaW4gYSBzdHJlYW0uIHBvc2l0aW9uIGlzIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9TZWVrKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgcG9zICk7Ci0KLSAgLyogc2tpcCBieXRlcyBpbiBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9Ta2lwKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgZGlzdGFuY2UgKTsKLQotICAvKiByZXR1cm4gY3VycmVudCBzdHJlYW0gcG9zaXRpb24gKi8KLSAgRlRfQkFTRSggRlRfTG9uZyApCi0gIEZUX1N0cmVhbV9Qb3MoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgLyogcmVhZCBieXRlcyBmcm9tIGEgc3RyZWFtIGludG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIsIHJldHVybnMgYW4gKi8KLSAgLyogZXJyb3IgaWYgbm90IGFsbCBieXRlcyBjb3VsZCBiZSByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fUmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiByZWFkIGJ5dGVzIGZyb20gYSBzdHJlYW0gYXQgYSBnaXZlbiBwb3NpdGlvbiAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcywKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiB0cnkgdG8gcmVhZCBieXRlcyBhdCB0aGUgZW5kIG9mIGEgc3RyZWFtOyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzICovCi0gIC8qIHJlYWxseSBhdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fVHJ5UmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiBFbnRlciBhIGZyYW1lIG9mIGBjb3VudCcgY29uc2VjdXRpdmUgYnl0ZXMgaW4gYSBzdHJlYW0uICBSZXR1cm5zIGFuICovCi0gIC8qIGVycm9yIGlmIHRoZSBmcmFtZSBjb3VsZCBub3QgYmUgcmVhZC9hY2Nlc3NlZC4gIFRoZSBjYWxsZXIgY2FuIHVzZSAgKi8KLSAgLyogdGhlIEZUX1N0cmVhbV9HZXRfWFhYIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBmcmFtZSBkYXRhIHdpdGhvdXQgICAgICAqLwotICAvKiBlcnJvciBjaGVja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWW91IG11c3QgX2Fsd2F5c18gY2FsbCBGVF9TdHJlYW1fRXhpdEZyYW1lKCkgb25jZSB5b3UgaGF2ZSBlbnRlcmVkICAqLwotICAvKiBhIHN0cmVhbSBmcmFtZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fRW50ZXJGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICk7Ci0KLSAgLyogZXhpdCBhIHN0cmVhbSBmcmFtZSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU3RyZWFtX0V4aXRGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiBFeHRyYWN0IGEgc3RyZWFtIGZyYW1lLiAgSWYgdGhlIHN0cmVhbSBpcyBkaXNrLWJhc2VkLCBhIGhlYXAgYmxvY2sgKi8KLSAgLyogaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgYnl0ZXMgYXJlIHJlYWQgaW50byBpdC4gIElmIHRoZSBzdHJlYW0gICovCi0gIC8qIGlzIG1lbW9yeS1iYXNlZCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgc2V0IGEgcG9pbnRlciB0byB0aGUgZGF0YS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXNlZnVsIHRvIG9wdGltaXplIGFjY2VzcyB0byBtZW1vcnktYmFzZWQgc3RyZWFtcyB0cmFuc3BhcmVudGx5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGwgZXh0cmFjdGVkIGZyYW1lcyBtdXN0IGJlIGBmcmVlZCcgd2l0aCBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uICAgKi8KLSAgLyogRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApOwotCi0gIC8qIHJlbGVhc2UgYW4gZXh0cmFjdCBmcmFtZSAoc2VlIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUpICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMgKTsKLQotICAvKiByZWFkIGEgYnl0ZSBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KLSAgRlRfQkFTRSggRlRfQ2hhciApCi0gIEZUX1N0cmVhbV9HZXRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAxNi1iaXQgYmlnLWVuZGlhbiBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9TaG9ydCApCi0gIEZUX1N0cmVhbV9HZXRTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiByZWFkIGEgMjQtYml0IGJpZy1lbmRpYW4gaW50ZWdlciBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KLSAgRlRfQkFTRSggRlRfTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRPZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgLyogcmVhZCBhIDMyLWJpdCBiaWctZW5kaWFuIGludGVnZXIgZnJvbSBhbiBlbnRlcmVkIGZyYW1lICovCi0gIEZUX0JBU0UoIEZUX0xvbmcgKQotICBGVF9TdHJlYW1fR2V0TG9uZyggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiByZWFkIGEgMTYtYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KLSAgRlRfQkFTRSggRlRfU2hvcnQgKQotICBGVF9TdHJlYW1fR2V0U2hvcnRMRSggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiByZWFkIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KLSAgRlRfQkFTRSggRlRfTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRMb25nTEUoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICAvKiByZWFkIGEgYnl0ZSBmcm9tIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX0NoYXIgKQotICBGVF9TdHJlYW1fUmVhZENoYXIoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLQotICAvKiByZWFkIGEgMTYtYml0IGJpZy1lbmRpYW4gaW50ZWdlciBmcm9tIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX1Nob3J0ICkKLSAgRlRfU3RyZWFtX1JlYWRTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLQotICAvKiByZWFkIGEgMjQtYml0IGJpZy1lbmRpYW4gaW50ZWdlciBmcm9tIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX0xvbmcgKQotICBGVF9TdHJlYW1fUmVhZE9mZnNldCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogcmVhZCBhIDMyLWJpdCBiaWctZW5kaWFuIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9Mb25nICkKLSAgRlRfU3RyZWFtX1JlYWRMb25nKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogcmVhZCBhIDE2LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9TaG9ydCApCi0gIEZUX1N0cmVhbV9SZWFkU2hvcnRMRSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOwotCi0gIC8qIHJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyIGZyb20gYSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfTG9uZyApCi0gIEZUX1N0cmVhbV9SZWFkTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLQotICAvKiBSZWFkIGEgc3RydWN0dXJlIGZyb20gYSBzdHJlYW0uICBUaGUgc3RydWN0dXJlIG11c3QgYmUgZGVzY3JpYmVkICovCi0gIC8qIGJ5IGFuIGFycmF5IG9mIEZUX0ZyYW1lX0ZpZWxkIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fUmVhZEZpZWxkcyggRlRfU3RyZWFtICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9GcmFtZV9GaWVsZCogIGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgc3RydWN0dXJlICk7Ci0KLQotI2RlZmluZSBGVF9TVFJFQU1fUE9TKCkgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TdHJlYW1fUG9zKCBzdHJlYW0gKQotCi0jZGVmaW5lIEZUX1NUUkVBTV9TRUVLKCBwb3NpdGlvbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgcG9zaXRpb24gKSApCi0KLSNkZWZpbmUgRlRfU1RSRUFNX1NLSVAoIGRpc3RhbmNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fU2tpcCggc3RyZWFtLCBkaXN0YW5jZSApICkKLQotI2RlZmluZSBGVF9TVFJFQU1fUkVBRCggYnVmZmVyLCBjb3VudCApICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKWJ1ZmZlciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICkgKQotCi0jZGVmaW5lIEZUX1NUUkVBTV9SRUFEX0FUKCBwb3NpdGlvbiwgYnVmZmVyLCBjb3VudCApICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggRlRfU3RyZWFtX1JlYWRBdCggc3RyZWFtLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKWJ1ZmZlciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICkgKQotCi0jZGVmaW5lIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggZmllbGRzLCBvYmplY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggRlRfU3RyZWFtX1JlYWRGaWVsZHMoIHN0cmVhbSwgZmllbGRzLCBvYmplY3QgKSApCi0KLQotI2RlZmluZSBGVF9GUkFNRV9FTlRFUiggc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfREVCVUdfSU5ORVIoIEZUX1N0cmVhbV9FbnRlckZyYW1lKCBzdHJlYW0sIHNpemUgKSApICkKLQotI2RlZmluZSBGVF9GUkFNRV9FWElUKCkgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX0V4aXRGcmFtZSggc3RyZWFtICkgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX0VYVFJBQ1QoIHNpemUsIGJ5dGVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSggc3RyZWFtLCBzaXplLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKikmKGJ5dGVzKSApICkgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX1JFTEVBU0UoIGJ5dGVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKSYoYnl0ZXMpICkgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRTVFJFQU1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM4YTQ2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHJhY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcmFjaW5nIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBkZWZpbml0aW9ucyBvZiB0cmFjZSBsZXZlbHMgZm9yIEZyZWVUeXBlIDIgKi8KLQotICAvKiB0aGUgZmlyc3QgbGV2ZWwgbXVzdCBhbHdheXMgYmUgYHRyYWNlX2FueScgKi8KLUZUX1RSQUNFX0RFRiggYW55ICkKLQotICAvKiBiYXNlIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggY2FsYyApICAgICAgLyogY2FsY3VsYXRpb25zICAgICAgICAgICAgKGZ0Y2FsYy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIG1lbW9yeSApICAgIC8qIG1lbW9yeSBtYW5hZ2VyICAgICAgICAgIChmdG9ianMuYykgICAqLwotRlRfVFJBQ0VfREVGKCBzdHJlYW0gKSAgICAvKiBzdHJlYW0gbWFuYWdlciAgICAgICAgICAoZnRzdHJlYW0uYykgKi8KLUZUX1RSQUNFX0RFRiggaW8gKSAgICAgICAgLyogaS9vIGludGVyZmFjZSAgICAgICAgICAgKGZ0c3lzdGVtLmMpICovCi1GVF9UUkFDRV9ERUYoIGxpc3QgKSAgICAgIC8qIGxpc3QgbWFuYWdlbWVudCAgICAgICAgIChmdGxpc3QuYykgICAqLwotRlRfVFJBQ0VfREVGKCBpbml0ICkgICAgICAvKiBpbml0aWFsaXphdGlvbiAgICAgICAgICAoZnRpbml0LmMpICAgKi8KLUZUX1RSQUNFX0RFRiggb2JqcyApICAgICAgLyogYmFzZSBvYmplY3RzICAgICAgICAgICAgKGZ0b2Jqcy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIG91dGxpbmUgKSAgIC8qIG91dGxpbmUgbWFuYWdlbWVudCAgICAgIChmdG91dGxuLmMpICAqLwotRlRfVFJBQ0VfREVGKCBnbHlwaCApICAgICAvKiBnbHlwaCBtYW5hZ2VtZW50ICAgICAgICAoZnRnbHlwaC5jKSAgKi8KLQotRlRfVFJBQ0VfREVGKCByYXN0ZXIgKSAgICAvKiBtb25vY2hyb21lIHJhc3Rlcml6ZXIgICAoZnRyYXN0ZXIuYykgKi8KLUZUX1RSQUNFX0RFRiggc21vb3RoICkgICAgLyogYW50aS1hbGlhc2luZyByYXN0ZXIgICAgKGZ0Z3JheXMuYykgICovCi1GVF9UUkFDRV9ERUYoIG1tICkgICAgICAgIC8qIE1NIGludGVyZmFjZSAgICAgICAgICAgIChmdG1tLmMpICAgICAqLwotRlRfVFJBQ0VfREVGKCByYWNjZXNzICkgICAvKiByZXNvdXJjZSBmb3JrIGFjY2Vzc29yICAoZnRyZm9yay5jKSAgKi8KLQotICAvKiBDYWNoZSBzdWItc3lzdGVtICovCi1GVF9UUkFDRV9ERUYoIGNhY2hlICkgICAgIC8qIGNhY2hlIHN1Yi1zeXN0ZW0gICAgICAgIChmdGNhY2hlLmMsIGV0Yy4pICovCi0KLSAgLyogU0ZOVCBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBzZm9ianMgKSAgICAvKiBTRk5UIG9iamVjdCBoYW5kbGVyICAgICAoc2ZvYmpzLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRjbWFwICkgICAgLyogY2hhcm1hcCBoYW5kbGVyICAgICAgICAgKHR0Y21hcC5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0a2VybiApICAgIC8qIGtlcm5pbmcgaGFuZGxlciAgICAgICAgICh0dGtlcm4uYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dGxvYWQgKSAgICAvKiBiYXNpYyBUcnVlVHlwZSB0YWJsZXMgICAodHRsb2FkLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRtdHggKSAgICAgLyogbWV0cmljcy1yZWxhdGVkIHRhYmxlcyAgKHR0bXR4LmMpICAgICovCi1GVF9UUkFDRV9ERUYoIHR0cG9zdCApICAgIC8qIFBTIHRhYmxlIHByb2Nlc3NpbmcgICAgICh0dHBvc3QuYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dHNiaXQgKSAgICAvKiBUcnVlVHlwZSBzYml0IGhhbmRsaW5nICAodHRzYml0LmMpICAgKi8KLQotICAvKiBUcnVlVHlwZSBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCB0dGRyaXZlciApICAvKiBUVCBmb250IGRyaXZlciAgICAgICAgICAodHRkcml2ZXIuYykgKi8KLUZUX1RSQUNFX0RFRiggdHRnbG9hZCApICAgLyogVFQgZ2x5cGggbG9hZGVyICAgICAgICAgKHR0Z2xvYWQuYykgICovCi1GVF9UUkFDRV9ERUYoIHR0aW50ZXJwICkgIC8qIGJ5dGVjb2RlIGludGVycHJldGVyICAgICh0dGludGVycC5jKSAqLwotRlRfVFJBQ0VfREVGKCB0dG9ianMgKSAgICAvKiBUVCBvYmplY3RzIG1hbmFnZXIgICAgICAodHRvYmpzLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRwbG9hZCApICAgLyogVFQgZGF0YS9wcm9ncmFtIGxvYWRlciAgKHR0cGxvYWQuYykgICovCi1GVF9UUkFDRV9ERUYoIHR0Z3h2YXIgKSAgIC8qIFRydWVUeXBlIEdYIHZhciBoYW5kbGVyICh0dGd4dmFyLmMpICAqLwotCi0gIC8qIFR5cGUgMSBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCB0MWRyaXZlciApCi1GVF9UUkFDRV9ERUYoIHQxZ2xvYWQgKQotRlRfVFJBQ0VfREVGKCB0MWhpbnQgKQotRlRfVFJBQ0VfREVGKCB0MWxvYWQgKQotRlRfVFJBQ0VfREVGKCB0MW9ianMgKQotRlRfVFJBQ0VfREVGKCB0MXBhcnNlICkKLQotICAvKiBQb3N0U2NyaXB0IGhlbHBlciBtb2R1bGUgYHBzYXV4JyAqLwotRlRfVFJBQ0VfREVGKCB0MWRlY29kZSApCi1GVF9UUkFDRV9ERUYoIHBzb2JqcyApCi0KLSAgLyogUG9zdFNjcmlwdCBoaW50aW5nIG1vZHVsZSBgcHNoaW50ZXInICovCi1GVF9UUkFDRV9ERUYoIHBzaHJlYyApCi1GVF9UUkFDRV9ERUYoIHBzaGFsZ28xICkKLUZUX1RSQUNFX0RFRiggcHNoYWxnbzIgKQotCi0gIC8qIFR5cGUgMiBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBjZmZkcml2ZXIgKQotRlRfVFJBQ0VfREVGKCBjZmZnbG9hZCApCi1GVF9UUkFDRV9ERUYoIGNmZmxvYWQgKQotRlRfVFJBQ0VfREVGKCBjZmZvYmpzICkKLUZUX1RSQUNFX0RFRiggY2ZmcGFyc2UgKQotCi0gIC8qIFR5cGUgNDIgZHJpdmVyIGNvbXBvbmVudCAqLwotRlRfVFJBQ0VfREVGKCB0NDIgKQotCi0gIC8qIENJRCBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBjaWRhZm0gKQotRlRfVFJBQ0VfREVGKCBjaWRkcml2ZXIgKQotRlRfVFJBQ0VfREVGKCBjaWRnbG9hZCApCi1GVF9UUkFDRV9ERUYoIGNpZGxvYWQgKQotRlRfVFJBQ0VfREVGKCBjaWRvYmpzICkKLUZUX1RSQUNFX0RFRiggY2lkcGFyc2UgKQotCi0gIC8qIFdpbmRvd3MgZm9udCBjb21wb25lbnQgKi8KLUZUX1RSQUNFX0RFRiggd2luZm50ICkKLQotICAvKiBQQ0YgZm9udCBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIHBjZmRyaXZlciApCi1GVF9UUkFDRV9ERUYoIHBjZnJlYWQgKQotCi0gIC8qIEJERiBmb250IGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggYmRmZHJpdmVyICkKLUZUX1RSQUNFX0RFRiggYmRmbGliICkKLQotICAvKiBQRlIgZm9udCBjb21wb25lbnQgKi8KLUZUX1RSQUNFX0RFRiggcGZyICkKLQotICAvKiBPcGVuVHlwZSB2YWxpZGF0aW9uIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggb3R2bW9kdWxlICkKLUZUX1RSQUNFX0RFRiggb3R2Y29tbW9uICkKLUZUX1RSQUNFX0RFRiggb3R2YmFzZSApCi1GVF9UUkFDRV9ERUYoIG90dmdkZWYgKQotRlRfVFJBQ0VfREVGKCBvdHZncG9zICkKLUZUX1RSQUNFX0RFRiggb3R2Z3N1YiApCi1GVF9UUkFDRV9ERUYoIG90dmpzdGYgKQotRlRfVFJBQ0VfREVGKCBvdHZtYXRoICkKLQotICAvKiBUcnVlVHlwZUdYL0FBVCB2YWxpZGF0aW9uIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggZ3h2bW9kdWxlICkKLUZUX1RSQUNFX0RFRiggZ3h2Y29tbW9uICkKLUZUX1RSQUNFX0RFRiggZ3h2ZmVhdCApCi1GVF9UUkFDRV9ERUYoIGd4dm1vcnQgKQotRlRfVFJBQ0VfREVGKCBneHZtb3J4ICkKLUZUX1RSQUNFX0RFRiggZ3h2YnNsbiApCi1GVF9UUkFDRV9ERUYoIGd4dmp1c3QgKQotRlRfVFJBQ0VfREVGKCBneHZrZXJuICkKLUZUX1RSQUNFX0RFRiggZ3h2b3BiZCApCi1GVF9UUkFDRV9ERUYoIGd4dnRyYWsgKQotRlRfVFJBQ0VfREVGKCBneHZwcm9wICkKLUZUX1RSQUNFX0RFRiggZ3h2bGNhciApCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGNkODVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dmFsaWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB2YWxpZGF0aW9uIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUVkFMSURfSF9fCi0jZGVmaW5lIF9fRlRWQUxJRF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9IICAgLyogZm9yIGZ0X3NldGptcCBhbmQgZnRfbG9uZ2ptcCAqLwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgViBBIEwgSSBEIEEgVCBJIE8gTiAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGhhbmRsZSB0byBhIHZhbGlkYXRpb24gb2JqZWN0ICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1ZhbGlkYXRvclJlY18gdm9sYXRpbGUqICBGVF9WYWxpZGF0b3I7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSB0aHJlZSBkaXN0aW5jdCB2YWxpZGF0aW9uIGxldmVscyBkZWZpbmVkIGhlcmU6ICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfVkFMSURBVEVfREVGQVVMVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQSB0YWJsZSB0aGF0IHBhc3NlcyB0aGlzIHZhbGlkYXRpb24gbGV2ZWwgY2FuIGJlIHVzZWQgcmVsaWFibHkgYnkgICAqLwotICAvKiAgIEZyZWVUeXBlLiAgSXQgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgYWxsIG9mZnNldHMgaGF2ZSBiZWVuIGNoZWNrZWQgdG8gKi8KLSAgLyogICBwcmV2ZW50IG91dC1vZi1ib3VuZCByZWFkcywgdGhhdCBhcnJheSBjb3VudHMgYXJlIGNvcnJlY3QsIGV0Yy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9WQUxJREFURV9USUdIVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBIHRhYmxlIHRoYXQgcGFzc2VzIHRoaXMgdmFsaWRhdGlvbiBsZXZlbCBjYW4gYmUgdXNlZCByZWxpYWJseSBhbmQgICovCi0gIC8qICAgZG9lc24ndCBjb250YWluIGludmFsaWQgZGF0YS4gIEZvciBleGFtcGxlLCBhIGNoYXJtYXAgdGFibGUgdGhhdCAgICAqLwotICAvKiAgIHJldHVybnMgaW52YWxpZCBnbHlwaCBpbmRpY2VzIHdpbGwgbm90IHBhc3MsIGV2ZW4gdGhvdWdoIGl0IGNhbiAgICAgKi8KLSAgLyogICBiZSB1c2VkIHdpdGggRnJlZVR5cGUgaW4gZGVmYXVsdCBtb2RlICh0aGUgbGlicmFyeSB3aWxsIHNpbXBseSAgICAgICovCi0gIC8qICAgcmV0dXJuIGFuIGVycm9yIGxhdGVyIHdoZW4gdHJ5aW5nIHRvIGxvYWQgdGhlIGdseXBoKS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJdCBhbHNvIGNoZWNrcyB0aGF0IGZpZWxkcyB3aGljaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiwgNCwgb3IgOCwgICovCi0gIC8qICAgZG9uJ3QgaGF2ZSBpbmNvcnJlY3QgdmFsdWVzLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfVkFMSURBVEVfUEFSQU5PSUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgT25seSBmb3IgZm9udCBkZWJ1Z2dpbmcuICBDaGVja3MgdGhhdCBhIHRhYmxlIGZvbGxvd3MgdGhlICAgICAgICAgICAqLwotICAvKiAgIHNwZWNpZmljYXRpb24gYnkgMTAwJS4gIFZlcnkgZmV3IGZvbnRzIHdpbGwgYmUgYWJsZSB0byBwYXNzIHRoaXMgICAgKi8KLSAgLyogICBsZXZlbCBhbnl3YXkgYnV0IGl0IGNhbiBiZSB1c2VmdWwgZm9yIGNlcnRhaW4gdG9vbHMgbGlrZSBmb250ICAgICAgICovCi0gIC8qICAgZWRpdG9ycy9jb252ZXJ0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9WYWxpZGF0aW9uTGV2ZWxfCi0gIHsKLSAgICBGVF9WQUxJREFURV9ERUZBVUxUID0gMCwKLSAgICBGVF9WQUxJREFURV9USUdIVCwKLSAgICBGVF9WQUxJREFURV9QQVJBTk9JRAotCi0gIH0gRlRfVmFsaWRhdGlvbkxldmVsOwotCi0KLSAgLyogdmFsaWRhdG9yIHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfVmFsaWRhdG9yUmVjXwotICB7Ci0gICAgY29uc3QgRlRfQnl0ZSogICAgICBiYXNlOyAgICAgICAgLyogYWRkcmVzcyBvZiB0YWJsZSBpbiBtZW1vcnkgICAgICAgKi8KLSAgICBjb25zdCBGVF9CeXRlKiAgICAgIGxpbWl0OyAgICAgICAvKiBgYmFzZScgKyBzaXplb2YodGFibGUpIGluIG1lbW9yeSAqLwotICAgIEZUX1ZhbGlkYXRpb25MZXZlbCAgbGV2ZWw7ICAgICAgIC8qIHZhbGlkYXRpb24gbGV2ZWwgICAgICAgICAgICAgICAgICovCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgLyogZXJyb3IgcmV0dXJuZWQuIDAgbWVhbnMgc3VjY2VzcyAgKi8KLQotICAgIGZ0X2ptcF9idWYgICAgICAgICAganVtcF9idWZmZXI7IC8qIHVzZWQgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyAgICAgICovCi0KLSAgfSBGVF9WYWxpZGF0b3JSZWM7Ci0KLQotI2RlZmluZSBGVF9WQUxJREFUT1IoIHggKSAgKChGVF9WYWxpZGF0b3IpKCB4ICkpCi0KLQotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfdmFsaWRhdG9yX2luaXQoIEZUX1ZhbGlkYXRvciAgICAgICAgdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdGlvbkxldmVsICBsZXZlbCApOwotCi0gIC8qIERvIG5vdCB1c2UgdGhpcy4gSXQncyBicm9rZW4gYW5kIHdpbGwgY2F1c2UgeW91ciB2YWxpZGF0b3IgdG8gY3Jhc2ggKi8KLSAgLyogaWYgeW91IHJ1biBpdCBvbiBhbiBpbnZhbGlkIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBmdF92YWxpZGF0b3JfcnVuKCBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgLyogU2V0cyB0aGUgZXJyb3IgZmllbGQgaW4gYSB2YWxpZGF0b3IsIHRoZW4gY2FsbHMgYGxvbmdqbXAnIHRvIHJldHVybiAqLwotICAvKiB0byBoaWdoLWxldmVsIGNhbGxlci4gIFVzaW5nIGBzZXRqbXAvbG9uZ2ptcCcgYXZvaWRzIG1hbnkgc3R1cGlkICAgICovCi0gIC8qIGVycm9yIGNoZWNrcyB3aXRoaW4gdGhlIHZhbGlkYXRpb24gcm91dGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfdmFsaWRhdG9yX2Vycm9yKCBGVF9WYWxpZGF0b3IgIHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgICAgZXJyb3IgKTsKLQotCi0gIC8qIENhbGxzIGZ0X3ZhbGlkYXRlX2Vycm9yLiAgQXNzdW1lcyB0aGF0IHRoZSBgdmFsaWQnIGxvY2FsIHZhcmlhYmxlICovCi0gIC8qIGhvbGRzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCB2YWxpZGF0b3Igb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVzZSBwcmVwcm9jZXNzb3IgcHJlc2NhbiB0byBwYXNzIEZUX0VSUl9QUkVGSVguICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0lOVkFMSUQoIF9wcmVmaXgsIF9lcnJvciApICBGVF9JTlZBTElEXyggX3ByZWZpeCwgX2Vycm9yICkKLSNkZWZpbmUgRlRfSU5WQUxJRF8oIF9wcmVmaXgsIF9lcnJvciApIFwKLSAgICAgICAgICBmdF92YWxpZGF0b3JfZXJyb3IoIHZhbGlkLCBfcHJlZml4ICMjIF9lcnJvciApCi0KLSAgLyogY2FsbGVkIHdoZW4gYSBicm9rZW4gdGFibGUgaXMgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRF9UT09fU0hPUlQgXAotICAgICAgICAgIEZUX0lOVkFMSUQoIEZUX0VSUl9QUkVGSVgsIEludmFsaWRfVGFibGUgKQotCi0gIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgb2Zmc2V0IGlzIGRldGVjdGVkICovCi0jZGVmaW5lIEZUX0lOVkFMSURfT0ZGU0VUIFwKLSAgICAgICAgICBGVF9JTlZBTElEKCBGVF9FUlJfUFJFRklYLCBJbnZhbGlkX09mZnNldCApCi0KLSAgLyogY2FsbGVkIHdoZW4gYW4gaW52YWxpZCBmb3JtYXQvdmFsdWUgaXMgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRF9GT1JNQVQgXAotICAgICAgICAgIEZUX0lOVkFMSUQoIEZUX0VSUl9QUkVGSVgsIEludmFsaWRfVGFibGUgKQotCi0gIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgZ2x5cGggaW5kZXggaXMgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRF9HTFlQSF9JRCBcCi0gICAgICAgICAgRlRfSU5WQUxJRCggRlRfRVJSX1BSRUZJWCwgSW52YWxpZF9HbHlwaF9JbmRleCApCi0KLSAgLyogY2FsbGVkIHdoZW4gYW4gaW52YWxpZCBmaWVsZCB2YWx1ZSBpcyBkZXRlY3RlZCAqLwotI2RlZmluZSBGVF9JTlZBTElEX0RBVEEgXAotICAgICAgICAgIEZUX0lOVkFMSUQoIEZUX0VSUl9QUkVGSVgsIEludmFsaWRfVGFibGUgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRWQUxJRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkNWRjNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBpbnRlcm5hbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW50ZXJuYWwgaGVhZGVyIGZpbGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBpbmNsdWRlZCBieSBgZnQyYnVpbGQuaCcuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRG8gbm90IGluY2x1ZGUgaXQgbWFudWFsbHkhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX0lOVEVSTkFMX09CSkVDVFNfSCAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1NUUkVBTV9IICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfTUVNT1JZX0ggICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9ERUJVR19IICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfQ0FMQ19IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfRFJJVkVSX0ggICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9UUkFDRV9IICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfR0xZUEhfTE9BREVSX0ggICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9TRk5UX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfU0VSVklDRV9IICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfUkZPUktfSCAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0ggICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oPgotCi0jZGVmaW5lIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0ggICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19IICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaD4KLQotI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9IICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSCAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0dMT0JBTFNfSCAgPGZyZWV0eXBlL2ludGVybmFsL3BzZ2xvYmFsLmg+Ci0KLSNkZWZpbmUgRlRfSU5URVJOQUxfQVVUT0hJTlRfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oPgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wY2Z0eXBlcy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wY2Z0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI3OTZmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcGNmdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qICBwY2Z0eXBlcy5oCi0KLSAgRnJlZVR5cGUgZm9udCBkcml2ZXIgZm9yIHBjZiBmb250cwotCi0gIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBieQotICBGcmFuY2VzY28gWmFwcGEgTmFyZGVsbGkKLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQotb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKLWluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKLXRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKLWNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwotZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLWFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotCi1USEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCi1BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAotT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgotVEhFIFNPRlRXQVJFLgotKi8KLQotCi0jaWZuZGVmIF9fUENGVFlQRVNfSF9fCi0jZGVmaW5lIF9fUENGVFlQRVNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgUENGX1B1YmxpY19GYWNlUmVjXwotICB7Ci0gICAgRlRfRmFjZVJlYyAgICByb290OwotICAgIEZUX1N0cmVhbVJlYyAgZ3ppcF9zdHJlYW07Ci0gICAgRlRfU3RyZWFtICAgICBnemlwX3NvdXJjZTsKLQotICAgIGNoYXIqICAgICAgICAgY2hhcnNldF9lbmNvZGluZzsKLSAgICBjaGFyKiAgICAgICAgIGNoYXJzZXRfcmVnaXN0cnk7Ci0KLSAgfSBQQ0ZfUHVibGljX0ZhY2VSZWMsICpQQ0ZfUHVibGljX0ZhY2U7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgIC8qIF9fUENGVFlQRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjdhNDIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsODcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYXV4LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXhpbGlhcnkgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMgcmVsYXRlZCB0byBQb3N0U2NyaXB0IGZvbnRzICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiwgMjAwOCBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU0FVWF9IX18KLSNkZWZpbmUgX19QU0FVWF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNfVGFibGVSZWNfKiAgICAgICAgICAgICAgUFNfVGFibGU7Ci0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IFBTX1RhYmxlX0Z1bmNzUmVjXyogIFBTX1RhYmxlX0Z1bmNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfVGFibGVfRnVuY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgdG8gbWFuYWdlIFBTX1RhYmxlIG9iamVjdHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfaW5pdCAgICA6OiBVc2VkIHRvIGluaXRpYWxpemUgYSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZV9kb25lICAgIDo6IEZpbmFsaXplcyByZXNwLiBkZXN0cm95IGEgZ2l2ZW4gdGFibGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlX2FkZCAgICAgOjogQWRkcyBhIG5ldyBvYmplY3QgdG8gYSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfcmVsZWFzZSA6OiBSZWxlYXNlcyB0YWJsZSBkYXRhLCB0aGVuIGZpbmFsaXplcyBpdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfVGFibGVfRnVuY3NSZWNfCi0gIHsKLSAgICBGVF9FcnJvcgotICAgICgqaW5pdCkoIFBTX1RhYmxlICAgdGFibGUsCi0gICAgICAgICAgICAgRlRfSW50ICAgICBjb3VudCwKLSAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0gICAgdm9pZAotICAgICgqZG9uZSkoIFBTX1RhYmxlICB0YWJsZSApOwotCi0gICAgRlRfRXJyb3IKLSAgICAoKmFkZCkoIFBTX1RhYmxlICAgIHRhYmxlLAotICAgICAgICAgICAgRlRfSW50ICAgICAgaWR4LAotICAgICAgICAgICAgdm9pZCogICAgICAgb2JqZWN0LAotICAgICAgICAgICAgRlRfUHRyRGlzdCAgbGVuZ3RoICk7Ci0KLSAgICB2b2lkCi0gICAgKCpyZWxlYXNlKSggUFNfVGFibGUgIHRhYmxlICk7Ci0KLSAgfSBQU19UYWJsZV9GdW5jc1JlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1RhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgUFNfVGFibGUgaXMgYSBzaW1wbGUgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpbiAqLwotICAvKiAgICBhIHNpbmdsZSBtZW1vcnkgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibG9jayAgICAgOjogVGhlIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSBncm93aGVhcCdzIGJsb2NrLiAgVGhpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGNhbiBjaGFuZ2UgYmV0d2VlbiB0d28gb2JqZWN0IGFkZHMsIGR1ZSB0byAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICByZWFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Vyc29yICAgIDo6IFRoZSBjdXJyZW50IHRvcCBvZiB0aGUgZ3JvdyBoZWFwIHdpdGhpbiBpdHMgYmxvY2suICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXBhY2l0eSAgOjogVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgaGVhcCBibG9jay4gIEluY3JlbWVudHMgYnkgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIDFrQnl0ZSBjaHVua3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfZWxlbXMgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRhYmxlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9lbGVtcyA6OiBUaGUgY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGFibGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZWxlbWVudHMgIDo6IEEgdGFibGUgb2YgZWxlbWVudCBhZGRyZXNzZXMgd2l0aGluIHRoZSBibG9jay4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGhzICAgOjogQSB0YWJsZSBvZiBlbGVtZW50IHNpemVzIHdpdGhpbiB0aGUgYmxvY2suICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgKGFsbG9jL3JlYWxsb2MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNzICAgICA6OiBBIHRhYmxlIG9mIG1ldGhvZCBwb2ludGVycyBmb3IgdGhpcyBvYmplY3QuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1RhYmxlUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIGJsb2NrOyAgICAgICAgICAvKiBjdXJyZW50IG1lbW9yeSBibG9jayAgICAgICAgICAgKi8KLSAgICBGVF9PZmZzZXQgICAgICAgICAgY3Vyc29yOyAgICAgICAgIC8qIGN1cnJlbnQgY3Vyc29yIGluIG1lbW9yeSBibG9jayAqLwotICAgIEZUX09mZnNldCAgICAgICAgICBjYXBhY2l0eTsgICAgICAgLyogY3VycmVudCBzaXplIG9mIG1lbW9yeSBibG9jayAgICovCi0gICAgRlRfTG9uZyAgICAgICAgICAgIGluaXQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICAgbWF4X2VsZW1zOwotICAgIEZUX0ludCAgICAgICAgICAgICBudW1fZWxlbXM7Ci0gICAgRlRfQnl0ZSoqICAgICAgICAgIGVsZW1lbnRzOyAgICAgICAvKiBhZGRyZXNzZXMgb2YgdGFibGUgZWxlbWVudHMgKi8KLSAgICBGVF9QdHJEaXN0KiAgICAgICAgbGVuZ3RoczsgICAgICAgIC8qIGxlbmd0aHMgb2YgdGFibGUgZWxlbWVudHMgICAqLwotCi0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKLSAgICBQU19UYWJsZV9GdW5jc1JlYyAgZnVuY3M7Ci0KLSAgfSBQU19UYWJsZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgVDEgRklFTERTICYgVE9LRU5TICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0IFBTX1BhcnNlclJlY18qICBQU19QYXJzZXI7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfVG9rZW5SZWNfKiAgIFQxX1Rva2VuOwotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0ZpZWxkUmVjXyogICBUMV9GaWVsZDsKLQotCi0gIC8qIHNpbXBsZSBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gaWRlbnRpZnkgdG9rZW4gdHlwZXMgKi8KLSAgdHlwZWRlZiBlbnVtICBUMV9Ub2tlblR5cGVfCi0gIHsKLSAgICBUMV9UT0tFTl9UWVBFX05PTkUgPSAwLAotICAgIFQxX1RPS0VOX1RZUEVfQU5ZLAotICAgIFQxX1RPS0VOX1RZUEVfU1RSSU5HLAotICAgIFQxX1RPS0VOX1RZUEVfQVJSQVksCi0gICAgVDFfVE9LRU5fVFlQRV9LRVksIC8qIGFrYSBgbmFtZScgKi8KLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUMV9UT0tFTl9UWVBFX01BWAotCi0gIH0gVDFfVG9rZW5UeXBlOwotCi0KLSAgLyogYSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gaWRlbnRpZnkgdG9rZW5zICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9Ub2tlblJlY18KLSAgewotICAgIEZUX0J5dGUqICAgICAgc3RhcnQ7ICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRva2VuIGluIGlucHV0IHN0cmVhbSAqLwotICAgIEZUX0J5dGUqICAgICAgbGltaXQ7ICAgLyogZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSB0b2tlbiAgICAgICAgICAqLwotICAgIFQxX1Rva2VuVHlwZSAgdHlwZTsgICAgLyogdHlwZSBvZiB0b2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIH0gVDFfVG9rZW5SZWM7Ci0KLQotICAvKiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gaWRlbnRpZnkgb2JqZWN0IGZpZWxkcyAqLwotICB0eXBlZGVmIGVudW0gIFQxX0ZpZWxkVHlwZV8KLSAgewotICAgIFQxX0ZJRUxEX1RZUEVfTk9ORSA9IDAsCi0gICAgVDFfRklFTERfVFlQRV9CT09MLAotICAgIFQxX0ZJRUxEX1RZUEVfSU5URUdFUiwKLSAgICBUMV9GSUVMRF9UWVBFX0ZJWEVELAotICAgIFQxX0ZJRUxEX1RZUEVfRklYRURfMTAwMCwKLSAgICBUMV9GSUVMRF9UWVBFX1NUUklORywKLSAgICBUMV9GSUVMRF9UWVBFX0tFWSwKLSAgICBUMV9GSUVMRF9UWVBFX0JCT1gsCi0gICAgVDFfRklFTERfVFlQRV9JTlRFR0VSX0FSUkFZLAotICAgIFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVksCi0gICAgVDFfRklFTERfVFlQRV9DQUxMQkFDSywKLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUMV9GSUVMRF9UWVBFX01BWAotCi0gIH0gVDFfRmllbGRUeXBlOwotCi0KLSAgdHlwZWRlZiBlbnVtICBUMV9GaWVsZExvY2F0aW9uXwotICB7Ci0gICAgVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk8sCi0gICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9ESUNULAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfSU5GTywKLSAgICBUMV9GSUVMRF9MT0NBVElPTl9QUklWQVRFLAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1gsCi0gICAgVDFfRklFTERfTE9DQVRJT05fTE9BREVSLAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZBQ0UsCi0gICAgVDFfRklFTERfTE9DQVRJT05fQkxFTkQsCi0KLSAgICAvKiBkbyBub3QgcmVtb3ZlICovCi0gICAgVDFfRklFTERfTE9DQVRJT05fTUFYCi0KLSAgfSBUMV9GaWVsZExvY2F0aW9uOwotCi0KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfRmllbGRfUGFyc2VGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBwYXJzZXIgKTsKLQotCi0gIC8qIHN0cnVjdHVyZSB0eXBlIHVzZWQgdG8gbW9kZWwgb2JqZWN0IGZpZWxkcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDFfRmllbGRSZWNfCi0gIHsKLSAgICBjb25zdCBjaGFyKiAgICAgICAgIGlkZW50OyAgICAgICAgLyogZmllbGQgaWRlbnRpZmllciAgICAgICAgICAgICAgICovCi0gICAgVDFfRmllbGRMb2NhdGlvbiAgICBsb2NhdGlvbjsKLSAgICBUMV9GaWVsZFR5cGUgICAgICAgIHR5cGU7ICAgICAgICAgLyogdHlwZSBvZiBmaWVsZCAgICAgICAgICAgICAgICAgICovCi0gICAgVDFfRmllbGRfUGFyc2VGdW5jICByZWFkZXI7Ci0gICAgRlRfVUludCAgICAgICAgICAgICBvZmZzZXQ7ICAgICAgIC8qIG9mZnNldCBvZiBmaWVsZCBpbiBvYmplY3QgICAgICAqLwotICAgIEZUX0J5dGUgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAvKiBzaXplIG9mIGZpZWxkIGluIGJ5dGVzICAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgIGFycmF5X21heDsgICAgLyogbWF4aW1hbCBudW1iZXIgb2YgZWxlbWVudHMgZm9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICAgY291bnRfb2Zmc2V0OyAvKiBvZmZzZXQgb2YgZWxlbWVudCBjb3VudCBmb3IgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJyYXlzICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVUludCAgICAgICAgICAgICBkaWN0OyAgICAgICAgIC8qIHdoZXJlIHdlIGV4cGVjdCBpdCAgICAgICAgICAgICAqLwotICB9IFQxX0ZpZWxkUmVjOwotCi0jZGVmaW5lIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKCAxIDw8IDAgKSAvKiBhbHNvIEZvbnRJbmZvIGFuZCBGREFycmF5ICovCi0jZGVmaW5lIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSAgKCAxIDw8IDEgKQotCi0KLQotI2RlZmluZSBUMV9ORVdfU0lNUExFX0ZJRUxEKCBfaWRlbnQsIF90eXBlLCBfZm5hbWUsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRSggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2RpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgVDFfTkVXX0NBTExCQUNLX0ZJRUxEKCBfaWRlbnQsIF9yZWFkZXIsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgVDFfRklFTERfVFlQRV9DQUxMQkFDSywgICAgIFwKLSAgICAgICAgICAgIChUMV9GaWVsZF9QYXJzZUZ1bmMpX3JlYWRlciwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9kaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgVDFfTkVXX1RBQkxFX0ZJRUxEKCBfaWRlbnQsIF90eXBlLCBfZm5hbWUsIF9tYXgsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFX0RFTFRBKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9tYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBudW1fICMjIF9mbmFtZSApLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jZGVmaW5lIFQxX05FV19UQUJMRV9GSUVMRDIoIF9pZGVudCwgX3R5cGUsIF9mbmFtZSwgX21heCwgX2RpY3QgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIF9mbmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFX0RFTFRBKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfbWF4LCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSwKLQotCi0jZGVmaW5lIFQxX0ZJRUxEX0JPT0woIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0JPT0wsIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX05VTSggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0lOVEVHRVIsIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0ZJWEVEKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRCwgX2ZuYW1lLCBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfRklYRURfMTAwMCggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0ZJWEVEXzEwMDAsIF9mbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9TVFJJTkcoIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX1NUUklORywgX2ZuYW1lLCBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfS0VZKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9LRVksIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0JCT1goIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0JCT1gsIF9mbmFtZSwgX2RpY3QgKQotCi0KLSNkZWZpbmUgVDFfRklFTERfTlVNX1RBQkxFKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1RBQkxFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0ZJWEVEX1RBQkxFKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgIFwKLSAgICAgICAgICBUMV9ORVdfVEFCTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX05VTV9UQUJMRTIoIF9pZGVudCwgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKSAgICAgICAgIFwKLSAgICAgICAgICBUMV9ORVdfVEFCTEVfRklFTEQyKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9GSVhFRF9UQUJMRTIoIF9pZGVudCwgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKSAgICAgXAotICAgICAgICAgIFQxX05FV19UQUJMRV9GSUVMRDIoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9DQUxMQkFDSyggX2lkZW50LCBfbmFtZSwgX2RpY3QgKSAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX0NBTExCQUNLX0ZJRUxEKCBfaWRlbnQsIF9uYW1lLCBfZGljdCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgUEFSU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBQU19QYXJzZXJfRnVuY3NSZWNfKiAgUFNfUGFyc2VyX0Z1bmNzOwotCi0gIHR5cGVkZWYgc3RydWN0ICBQU19QYXJzZXJfRnVuY3NSZWNfCi0gIHsKLSAgICB2b2lkCi0gICAgKCppbml0KSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgRlRfQnl0ZSogICBiYXNlLAotICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0gICAgdm9pZAotICAgICgqc2tpcF9zcGFjZXMpKCBQU19QYXJzZXIgIHBhcnNlciApOwotICAgIHZvaWQKLSAgICAoKnNraXBfUFNfdG9rZW4pKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0gICAgRlRfTG9uZwotICAgICgqdG9faW50KSggUFNfUGFyc2VyICBwYXJzZXIgKTsKLSAgICBGVF9GaXhlZAotICAgICgqdG9fZml4ZWQpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKTsKLQotICAgIEZUX0Vycm9yCi0gICAgKCp0b19ieXRlcykoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIG1heF9ieXRlcywKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyogICBwbnVtX2J5dGVzLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGRlbGltaXRlcnMgKTsKLQotICAgIEZUX0ludAotICAgICgqdG9fY29vcmRfYXJyYXkpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIGNvb3JkcyApOwotICAgIEZUX0ludAotICAgICgqdG9fZml4ZWRfYXJyYXkpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKTsKLQotICAgIHZvaWQKLSAgICAoKnRvX3Rva2VuKSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgIFQxX1Rva2VuICAgdG9rZW4gKTsKLSAgICB2b2lkCi0gICAgKCp0b190b2tlbl9hcnJheSkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9Ub2tlbiAgIHRva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBtYXhfdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgIHBudW1fdG9rZW5zICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqbG9hZF9maWVsZCkoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqbG9hZF9maWVsZF90YWJsZSkoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICk7Ci0KLSAgfSBQU19QYXJzZXJfRnVuY3NSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFBTX1BhcnNlciBpcyBhbiBvYmplY3QgdXNlZCB0byBwYXJzZSBhIFR5cGUgMSBmb250IHZlcnkgcXVpY2tseS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJzb3IgOjogVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2UgICA6OiBTdGFydCBvZiB0aGUgcHJvY2Vzc2VkIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGltaXQgIDo6IEVuZCBvZiB0aGUgcHJvY2Vzc2VkIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlcnJvciAgOjogVGhlIGxhc3QgZXJyb3IgcmV0dXJuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zIChhbGxvYy9yZWFsbG9jKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY3MgIDo6IEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciB0aGUgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfUGFyc2VyUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICBjdXJzb3I7Ci0gICAgRlRfQnl0ZSogICBiYXNlOwotICAgIEZUX0J5dGUqICAgbGltaXQ7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotICAgIFBTX1BhcnNlcl9GdW5jc1JlYyAgZnVuY3M7Ci0KLSAgfSBQU19QYXJzZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgVDEgQlVJTERFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0J1aWxkZXJSZWNfKiAgVDFfQnVpbGRlcjsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0NoZWNrX1BvaW50c19GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgY291bnQgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9CdWlsZGVyX0FkZF9Qb2ludF9GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgZmxhZyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0FkZF9Qb2ludDFfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0FkZF9Db250b3VyX0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlQxX0J1aWxkZXJfU3RhcnRfUG9pbnRfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5ICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfQnVpbGRlcl9DbG9zZV9Db250b3VyX0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMV9CdWlsZGVyX0Z1bmNzUmVjXyogIFQxX0J1aWxkZXJfRnVuY3M7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0J1aWxkZXJfRnVuY3NSZWNfCi0gIHsKLSAgICB2b2lkCi0gICAgKCppbml0KSggVDFfQnVpbGRlciAgICBidWlsZGVyLAotICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgaGludGluZyApOwotCi0gICAgdm9pZAotICAgICgqZG9uZSkoIFQxX0J1aWxkZXIgICBidWlsZGVyICk7Ci0KLSAgICBUMV9CdWlsZGVyX0NoZWNrX1BvaW50c19GdW5jICAgY2hlY2tfcG9pbnRzOwotICAgIFQxX0J1aWxkZXJfQWRkX1BvaW50X0Z1bmMgICAgICBhZGRfcG9pbnQ7Ci0gICAgVDFfQnVpbGRlcl9BZGRfUG9pbnQxX0Z1bmMgICAgIGFkZF9wb2ludDE7Ci0gICAgVDFfQnVpbGRlcl9BZGRfQ29udG91cl9GdW5jICAgIGFkZF9jb250b3VyOwotICAgIFQxX0J1aWxkZXJfU3RhcnRfUG9pbnRfRnVuYyAgICBzdGFydF9wb2ludDsKLSAgICBUMV9CdWlsZGVyX0Nsb3NlX0NvbnRvdXJfRnVuYyAgY2xvc2VfY29udG91cjsKLQotICB9IFQxX0J1aWxkZXJfRnVuY3NSZWM7Ci0KLQotICAvKiBhbiBlbnVtZXJhdGlvbiB0eXBlIHRvIGhhbmRsZSBjaGFyc3RyaW5nIHBhcnNpbmcgc3RhdGVzICovCi0gIHR5cGVkZWYgZW51bSAgVDFfUGFyc2VTdGF0ZV8KLSAgewotICAgIFQxX1BhcnNlX1N0YXJ0LAotICAgIFQxX1BhcnNlX0hhdmVfV2lkdGgsCi0gICAgVDFfUGFyc2VfSGF2ZV9Nb3ZldG8sCi0gICAgVDFfUGFyc2VfSGF2ZV9QYXRoCi0KLSAgfSBUMV9QYXJzZVN0YXRlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0dXJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQnVpbGRlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIGdseXBoIGxvYWRpbmcgdG8gc3RvcmUgaXRzIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgIDo6IFRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyICAgICAgIDo6IFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlICAgICAgICAgOjogVGhlIGJhc2UgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cnJlbnQgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3BvaW50cyAgIDo6IG1heGltdW0gcG9pbnRzIGluIGJ1aWxkZXIgb3V0bGluZSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfY29udG91cnMgOjogTWF4aW1hbCBudW1iZXIgb2YgY29udG91cnMgaW4gYnVpbGRlciBvdXRsaW5lLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhc3QgICAgICAgICA6OiBUaGUgbGFzdCBwb2ludCBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zX3ggICAgICAgIDo6IFRoZSBob3Jpem9udGFsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3NfeSAgICAgICAgOjogVGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfYmVhcmluZyA6OiBUaGUgbGVmdCBzaWRlIGJlYXJpbmcgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSAgICAgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2UgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYm94ICAgICAgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcnNlX3N0YXRlICA6OiBBbiBlbnVtZXJhdGlvbiB3aGljaCBjb250cm9scyB0aGUgY2hhcnN0cmluZyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcGFyc2luZyBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfcG9pbnRzICA6OiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgbm8gcG9pbnRzIGFyZSBsb2FkZWQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9fcmVjdXJzZSAgIDo6IFNldCBidXQgbm90IHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNzX29ubHkgOjogQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gY29tcHV0ZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRoZSBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGgsIG5vdCBsb2FkIGFsbCBvZiBpdHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY3MgICAgICAgIDo6IEFuIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciB0aGUgYnVpbGRlci4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDFfQnVpbGRlclJlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnk7Ci0gICAgRlRfRmFjZSAgICAgICAgIGZhY2U7Ci0gICAgRlRfR2x5cGhTbG90ICAgIGdseXBoOwotICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXI7Ci0gICAgRlRfT3V0bGluZSogICAgIGJhc2U7Ci0gICAgRlRfT3V0bGluZSogICAgIGN1cnJlbnQ7Ci0KLSAgICBGVF9WZWN0b3IgICAgICAgbGFzdDsKLQotICAgIEZUX1BvcyAgICAgICAgICBwb3NfeDsKLSAgICBGVF9Qb3MgICAgICAgICAgcG9zX3k7Ci0KLSAgICBGVF9WZWN0b3IgICAgICAgbGVmdF9iZWFyaW5nOwotICAgIEZUX1ZlY3RvciAgICAgICBhZHZhbmNlOwotCi0gICAgRlRfQkJveCAgICAgICAgIGJib3g7ICAgICAgICAgIC8qIGJvdW5kaW5nIGJveCAqLwotICAgIFQxX1BhcnNlU3RhdGUgICBwYXJzZV9zdGF0ZTsKLSAgICBGVF9Cb29sICAgICAgICAgbG9hZF9wb2ludHM7Ci0gICAgRlRfQm9vbCAgICAgICAgIG5vX3JlY3Vyc2U7Ci0gICAgRlRfQm9vbCAgICAgICAgIHNoaWZ0OwotCi0gICAgRlRfQm9vbCAgICAgICAgIG1ldHJpY3Nfb25seTsKLQotICAgIHZvaWQqICAgICAgICAgICBoaW50c19mdW5jczsgICAgLyogaGludGVyLXNwZWNpZmljICovCi0gICAgdm9pZCogICAgICAgICAgIGhpbnRzX2dsb2JhbHM7ICAvKiBoaW50ZXItc3BlY2lmaWMgKi8KLQotICAgIFQxX0J1aWxkZXJfRnVuY3NSZWMgIGZ1bmNzOwotCi0gIH0gVDFfQnVpbGRlclJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBUMSBERUNPREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgMAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX1NVQlJTX0NBTExTIGRldGFpbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5lc3RlZCBzdWItcm91dGluZSAgICovCi0gIC8qIGNhbGxzIGR1cmluZyBnbHlwaCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVDFfTUFYX1NVQlJTX0NBTExTICA4Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9DSEFSU1RSSU5HX09QRVJBTkRTIGlzIHRoZSBjaGFyc3RyaW5nIHN0YWNrJ3MgY2FwYWNpdHkuICBBICAgICAqLwotICAvKiBtaW5pbXVtIG9mIDE2IGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EUyAgMzIKLQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9EZWNvZGVyX1pvbmVSZWNfCi0gIHsKLSAgICBGVF9CeXRlKiAgY3Vyc29yOwotICAgIEZUX0J5dGUqICBiYXNlOwotICAgIEZUX0J5dGUqICBsaW1pdDsKLQotICB9IFQxX0RlY29kZXJfWm9uZVJlYywgKlQxX0RlY29kZXJfWm9uZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0RlY29kZXJSZWNfKiAgICAgICAgICAgICAgVDFfRGVjb2RlcjsKLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVDFfRGVjb2Rlcl9GdW5jc1JlY18qICBUMV9EZWNvZGVyX0Z1bmNzOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlQxX0RlY29kZXJfQ2FsbGJhY2spKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCApOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0RlY29kZXJfRnVuY3NSZWNfCi0gIHsKLSAgICBGVF9FcnJvcgotICAgICgqaW5pdCkoIFQxX0RlY29kZXIgICAgICAgICAgIGRlY29kZXIsCi0gICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICBGVF9TaXplICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgICAgIHNsb3QsCi0gICAgICAgICAgICAgRlRfQnl0ZSoqICAgICAgICAgICAgZ2x5cGhfbmFtZXMsCi0gICAgICAgICAgICAgUFNfQmxlbmQgICAgICAgICAgICAgYmxlbmQsCi0gICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgICAgaGludGluZywKLSAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICAgICBoaW50X21vZGUsCi0gICAgICAgICAgICAgVDFfRGVjb2Rlcl9DYWxsYmFjayAgY2FsbGJhY2sgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBUMV9EZWNvZGVyICBkZWNvZGVyICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqcGFyc2VfY2hhcnN0cmluZ3MpKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZW4gKTsKLQotICB9IFQxX0RlY29kZXJfRnVuY3NSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfRGVjb2RlclJlY18KLSAgewotICAgIFQxX0J1aWxkZXJSZWMgICAgICAgIGJ1aWxkZXI7Ci0KLSAgICBGVF9Mb25nICAgICAgICAgICAgICBzdGFja1tUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFNdOwotICAgIEZUX0xvbmcqICAgICAgICAgICAgIHRvcDsKLQotICAgIFQxX0RlY29kZXJfWm9uZVJlYyAgIHpvbmVzW1QxX01BWF9TVUJSU19DQUxMUyArIDFdOwotICAgIFQxX0RlY29kZXJfWm9uZSAgICAgIHpvbmU7Ci0KLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgICBwc25hbWVzOyAgICAgIC8qIGZvciBzZWFjICovCi0gICAgRlRfVUludCAgICAgICAgICAgICAgbnVtX2dseXBoczsKLSAgICBGVF9CeXRlKiogICAgICAgICAgICBnbHlwaF9uYW1lczsKLQotICAgIEZUX0ludCAgICAgICAgICAgICAgIGxlbklWOyAgICAgICAgLyogaW50ZXJuYWwgZm9yIHN1YiByb3V0aW5lIGNhbGxzICovCi0gICAgRlRfVUludCAgICAgICAgICAgICAgbnVtX3N1YnJzOwotICAgIEZUX0J5dGUqKiAgICAgICAgICAgIHN1YnJzOwotICAgIEZUX1B0ckRpc3QqICAgICAgICAgIHN1YnJzX2xlbjsgICAgLyogYXJyYXkgb2Ygc3VicnMgbGVuZ3RoIChvcHRpb25hbCkgKi8KLQotICAgIEZUX01hdHJpeCAgICAgICAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgIGZvbnRfb2Zmc2V0OwotCi0gICAgRlRfSW50ICAgICAgICAgICAgICAgZmxleF9zdGF0ZTsKLSAgICBGVF9JbnQgICAgICAgICAgICAgICBudW1fZmxleF92ZWN0b3JzOwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgIGZsZXhfdmVjdG9yc1s3XTsKLQotICAgIFBTX0JsZW5kICAgICAgICAgICAgIGJsZW5kOyAgICAgICAvKiBmb3IgbXVsdGlwbGUgbWFzdGVyIHN1cHBvcnQgKi8KLQotICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgIGhpbnRfbW9kZTsKLQotICAgIFQxX0RlY29kZXJfQ2FsbGJhY2sgIHBhcnNlX2NhbGxiYWNrOwotICAgIFQxX0RlY29kZXJfRnVuY3NSZWMgIGZ1bmNzOwotCi0gICAgRlRfSW50KiAgICAgICAgICAgICAgYnVpbGRjaGFyOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIGxlbl9idWlsZGNoYXI7Ci0KLSAgfSBUMV9EZWNvZGVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGTSBQQVJTRVIgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgQUZNX1BhcnNlclJlY18qICBBRk1fUGFyc2VyOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fUGFyc2VyX0Z1bmNzUmVjXwotICB7Ci0gICAgRlRfRXJyb3IKLSAgICAoKmluaXQpKCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBBRk1fUGFyc2VyICBwYXJzZXIgKTsKLQotICAgIEZUX0Vycm9yCi0gICAgKCpwYXJzZSkoIEFGTV9QYXJzZXIgIHBhcnNlciApOwotCi0gIH0gQUZNX1BhcnNlcl9GdW5jc1JlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0IEFGTV9TdHJlYW1SZWNfKiAgQUZNX1N0cmVhbTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFGTV9QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEFGTV9QYXJzZXIgaXMgYSBwYXJzZXIgZm9yIHRoZSBBRk0gZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zIChhbGxvYyBhbmQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgcmVhbGxvYykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICA6OiBUaGlzIGlzIGFuIG9wYXF1ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9udEluZm8gIDo6IFRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZXRfaW5kZXggOjogQSB1c2VyIHByb3ZpZGVkIGZ1bmN0aW9uIHRvIGdldCBhIGdseXBoIGluZGV4IGJ5IGl0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQUZNX1BhcnNlclJlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5OwotICAgIEFGTV9TdHJlYW0gICAgc3RyZWFtOwotCi0gICAgQUZNX0ZvbnRJbmZvICBGb250SW5mbzsKLQotICAgIEZUX0ludAotICAgICgqZ2V0X2luZGV4KSggY29uc3QgY2hhciogIG5hbWUsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbGVuLAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHVzZXJfZGF0YSApOwotCi0gICAgdm9pZCogICAgICAgICB1c2VyX2RhdGE7Ci0KLSAgfSBBRk1fUGFyc2VyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgVFlQRTEgQ0hBUk1BUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVDFfQ01hcF9DbGFzc2VzUmVjXyogIFQxX0NNYXBfQ2xhc3NlczsKLQotICB0eXBlZGVmIHN0cnVjdCBUMV9DTWFwX0NsYXNzZXNSZWNfCi0gIHsKLSAgICBGVF9DTWFwX0NsYXNzICBzdGFuZGFyZDsKLSAgICBGVF9DTWFwX0NsYXNzICBleHBlcnQ7Ci0gICAgRlRfQ01hcF9DbGFzcyAgY3VzdG9tOwotICAgIEZUX0NNYXBfQ2xhc3MgIHVuaWNvZGU7Ci0KLSAgfSBUMV9DTWFwX0NsYXNzZXNSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBQU0F1eCBNb2R1bGUgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNBdXhfU2VydmljZVJlY18KLSAgewotICAgIC8qIGRvbid0IHVzZSBgUFNfVGFibGVfRnVuY3MnIGFuZCBmcmllbmRzIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzICovCi0gICAgY29uc3QgUFNfVGFibGVfRnVuY3NSZWMqICAgIHBzX3RhYmxlX2Z1bmNzOwotICAgIGNvbnN0IFBTX1BhcnNlcl9GdW5jc1JlYyogICBwc19wYXJzZXJfZnVuY3M7Ci0gICAgY29uc3QgVDFfQnVpbGRlcl9GdW5jc1JlYyogIHQxX2J1aWxkZXJfZnVuY3M7Ci0gICAgY29uc3QgVDFfRGVjb2Rlcl9GdW5jc1JlYyogIHQxX2RlY29kZXJfZnVuY3M7Ci0KLSAgICB2b2lkCi0gICAgKCp0MV9kZWNyeXB0KSggRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICBzZWVkICk7Ci0KLSAgICBUMV9DTWFwX0NsYXNzZXMgIHQxX2NtYXBfY2xhc3NlczsKLQotICAgIC8qIGZpZWxkcyBhZnRlciB0aGlzIGNvbW1lbnQgbGluZSB3ZXJlIGFkZGVkIGFmdGVyIHZlcnNpb24gMi4xLjEwICovCi0gICAgY29uc3QgQUZNX1BhcnNlcl9GdW5jc1JlYyogIGFmbV9wYXJzZXJfZnVuY3M7Ci0KLSAgfSBQU0F1eF9TZXJ2aWNlUmVjLCAqUFNBdXhfU2VydmljZTsKLQotICAvKiBiYWNrd2FyZHMtY29tcGF0aWJsZSB0eXBlIGRlZmluaXRpb24gKi8KLSAgdHlwZWRlZiBQU0F1eF9TZXJ2aWNlUmVjICAgUFNBdXhfSW50ZXJmYWNlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICBTb21lIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSVNfUFNfTkVXTElORSggY2ggKSBcCi0gICggKGNoKSA9PSAnXHInIHx8ICAgICAgICAgXAotICAgIChjaCkgPT0gJ1xuJyApCi0KLSNkZWZpbmUgSVNfUFNfU1BBQ0UoIGNoICkgIFwKLSAgKCAoY2gpID09ICcgJyAgICAgICAgIHx8IFwKLSAgICBJU19QU19ORVdMSU5FKCBjaCApIHx8IFwKLSAgICAoY2gpID09ICdcdCcgICAgICAgIHx8IFwKLSAgICAoY2gpID09ICdcZicgICAgICAgIHx8IFwKLSAgICAoY2gpID09ICdcMCcgKQotCi0jZGVmaW5lIElTX1BTX1NQRUNJQUwoIGNoICkgICAgICAgXAotICAoIChjaCkgPT0gJy8nICAgICAgICAgICAgICAgIHx8IFwKLSAgICAoY2gpID09ICcoJyB8fCAoY2gpID09ICcpJyB8fCBcCi0gICAgKGNoKSA9PSAnPCcgfHwgKGNoKSA9PSAnPicgfHwgXAotICAgIChjaCkgPT0gJ1snIHx8IChjaCkgPT0gJ10nIHx8IFwKLSAgICAoY2gpID09ICd7JyB8fCAoY2gpID09ICd9JyB8fCBcCi0gICAgKGNoKSA9PSAnJScgICAgICAgICAgICAgICAgKQotCi0jZGVmaW5lIElTX1BTX0RFTElNKCBjaCApICBcCi0gICggSVNfUFNfU1BBQ0UoIGNoICkgICB8fCBcCi0gICAgSVNfUFNfU1BFQ0lBTCggY2ggKSApCi0KLSNkZWZpbmUgSVNfUFNfRElHSVQoIGNoICkgICAgICAgIFwKLSAgKCAoY2gpID49ICcwJyAmJiAoY2gpIDw9ICc5JyApCi0KLSNkZWZpbmUgSVNfUFNfWERJR0lUKCBjaCApICAgICAgICAgICAgXAotICAoIElTX1BTX0RJR0lUKCBjaCApICAgICAgICAgICAgICB8fCBcCi0gICAgKCAoY2gpID49ICdBJyAmJiAoY2gpIDw9ICdGJyApIHx8IFwKLSAgICAoIChjaCkgPj0gJ2EnICYmIChjaCkgPD0gJ2YnICkgKQotCi0jZGVmaW5lIElTX1BTX0JBU0U4NSggY2ggKSAgICAgICBcCi0gICggKGNoKSA+PSAnIScgJiYgKGNoKSA8PSAndScgKQotCi0jZGVmaW5lIElTX1BTX1RPS0VOKCBjdXIsIGxpbWl0LCB0b2tlbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICggKGNoYXIpKGN1cilbMF0gPT0gKHRva2VuKVswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgKCAoY3VyKSArIHNpemVvZiAoICh0b2tlbikgKSA9PSAobGltaXQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAoIChjdXIpICsgc2l6ZW9mKCAodG9rZW4pICkgPCAobGltaXQpICAgICAgICAgICYmICAgICAgICAgICAgICAgICBcCi0gICAgICAgIElTX1BTX0RFTElNKCAoY3VyKVtzaXplb2YgKCAodG9rZW4pICkgLSAxXSApICkgKSAgICAgICAgICAgICAmJiBcCi0gICAgZnRfc3RybmNtcCggKGNoYXIqKShjdXIpLCAodG9rZW4pLCBzaXplb2YgKCAodG9rZW4pICkgLSAxICkgPT0gMCApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19QU0FVWF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDUyYzAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoaW50cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEludGVyZmFjZSB0byBQb3N0c2NyaXB0LXNwZWNpZmljIChUeXBlIDEgYW5kIFR5cGUgMikgaGludHMgICAgICAgICAgICovCi0vKiAgICByZWNvcmRlcnMgKHNwZWNpZmljYXRpb24gb25seSkuICBUaGVzZSBhcmUgdXNlZCB0byBzdXBwb3J0IG5hdGl2ZSAgICAqLwotLyogICAgVDEvVDIgaGludHMgaW4gdGhlIGB0eXBlMScsIGBjaWQnLCBhbmQgYGNmZicgZm9udCBkcml2ZXJzLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU0hJTlRTX0hfXwotI2RlZmluZSBfX1BTSElOVFNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgSU5URVJOQUwgUkVQUkVTRU5UQVRJT04gT0YgR0xPQkFMUyAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNIX0dsb2JhbHNSZWNfKiAgUFNIX0dsb2JhbHM7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlBTSF9HbG9iYWxzX05ld0Z1bmMpKCBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUHJpdmF0ZSogICBwcml2YXRlX2RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzKiAgYWdsb2JhbHMgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqUFNIX0dsb2JhbHNfU2V0U2NhbGVGdW5jKSggUFNIX0dsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHhfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHlfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHhfZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHlfZGVsdGEgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpQU0hfR2xvYmFsc19EZXN0cm95RnVuYykoIFBTSF9HbG9iYWxzICBnbG9iYWxzICk7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0dsb2JhbHNfRnVuY3NSZWNfCi0gIHsKLSAgICBQU0hfR2xvYmFsc19OZXdGdW5jICAgICAgIGNyZWF0ZTsKLSAgICBQU0hfR2xvYmFsc19TZXRTY2FsZUZ1bmMgIHNldF9zY2FsZTsKLSAgICBQU0hfR2xvYmFsc19EZXN0cm95RnVuYyAgIGRlc3Ryb3k7Ci0KLSAgfSBQU0hfR2xvYmFsc19GdW5jc1JlYywgKlBTSF9HbG9iYWxzX0Z1bmNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgUFVCTElDIFRZUEUgMSBISU5UUyBSRUNPUkRFUiAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgVDFfSGludHMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgaXMgYSBoYW5kbGUgdG8gYW4gb3BhcXVlIHN0cnVjdHVyZSB1c2VkIHRvIHJlY29yZCBnbHlwaCBoaW50cwotICAgKiAgIGZyb20gYSBUeXBlIDEgY2hhcmFjdGVyIGdseXBoIGNoYXJhY3RlciBzdHJpbmcuCi0gICAqCi0gICAqICAgVGhlIG1ldGhvZHMgdXNlZCB0byBvcGVyYXRlIG9uIHRoaXMgb2JqZWN0IGFyZSBkZWZpbmVkIGJ5IHRoZQotICAgKiAgIEBUMV9IaW50c19GdW5jc1JlYyBzdHJ1Y3R1cmUuICBSZWNvcmRpbmcgZ2x5cGggaGludHMgaXMgbm9ybWFsbHkKLSAgICogICBhY2hpZXZlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgotICAgKgotICAgKiAgIC0gT3BlbiBhIG5ldyBoaW50IHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBvcGVuJyBtZXRob2QuCi0gICAqICAgICBUaGlzIHJld2luZHMgdGhlIHJlY29yZGVyIGFuZCBwcmVwYXJlIGl0IGZvciBuZXcgaW5wdXQuCi0gICAqCi0gICAqICAgLSBGb3IgZWFjaCBoaW50IGZvdW5kIGluIHRoZSBnbHlwaCBjaGFyc3RyaW5nLCBjYWxsIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqICAgICBtZXRob2QgKGBzdGVtJywgYHN0ZW0zJywgb3IgYHJlc2V0JykuICBOb3RlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIGRvCi0gICAqICAgICBub3QgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAqCi0gICAqICAgLSBDbG9zZSB0aGUgcmVjb3JkaW5nIHNlc3Npb24gYnkgY2FsbGluZyB0aGUgYGNsb3NlJyBtZXRob2QuICBJdAotICAgKiAgICAgcmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoZSBoaW50cyB3ZXJlIGludmFsaWQgb3Igc29tZXRoaW5nCi0gICAqICAgICBzdHJhbmdlIGhhcHBlbmVkIChlLmcuLCBtZW1vcnkgc2hvcnRhZ2UpLgotICAgKgotICAgKiAgIFRoZSBoaW50cyBhY2N1bXVsYXRlZCBpbiB0aGUgb2JqZWN0IGNhbiBsYXRlciBiZSB1c2VkIGJ5IHRoZQotICAgKiAgIFBvc3RTY3JpcHQgaGludGVyLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfSGludHNSZWNfKiAgVDFfSGludHM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBUMV9IaW50c19GdW5jcwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBwb2ludGVyIHRvIHRoZSBAVDFfSGludHNfRnVuY3NSZWMgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyB0aGUgQVBJIG9mCi0gICAqICAgYSBnaXZlbiBAVDFfSGludHMgb2JqZWN0LgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVDFfSGludHNfRnVuY3NSZWNfKiAgVDFfSGludHNfRnVuY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfT3BlbkZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDFfSGludHMgY2xhc3MgdXNlZCB0byBwcmVwYXJlIGl0IGZvciBhIG5ldyBUeXBlIDEKLSAgICogICBoaW50cyByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAxIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSBAVDFfSGludHNfQ2xvc2VGdW5jIG1ldGhvZCBpbiBvcmRlciB0bwotICAgKiAgIGNsb3NlIGFuIG9wZW5lZCByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQxX0hpbnRzX09wZW5GdW5jKSggVDFfSGludHMgIGhpbnRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfU2V0U3RlbUZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDFfSGludHMgY2xhc3MgdXNlZCB0byByZWNvcmQgYSBuZXcgaG9yaXpvbnRhbCBvcgotICAgKiAgIHZlcnRpY2FsIHN0ZW0uICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUeXBlIDEgYGhzdGVtJyBhbmQgYHZzdGVtJwotICAgKiAgIG9wZXJhdG9ycy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAxIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGRpbWVuc2lvbiA6OgotICAgKiAgICAgMCBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoaHN0ZW0pLCAxIGZvciB2ZXJ0aWNhbCBvbmVzICh2c3RlbSkuCi0gICAqCi0gICAqICAgY29vcmRzIDo6Ci0gICAqICAgICBBcnJheSBvZiAyIGludGVnZXJzLCB1c2VkIGFzIChwb3NpdGlvbixsZW5ndGgpIHN0ZW0gZGVzY3JpcHRvci4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCi0gICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCi0gICAqCi0gICAqICAgYGNvb3Jkc1swXScgaXMgdGhlIGFic29sdXRlIHN0ZW0gcG9zaXRpb24gKGxvd2VzdCBjb29yZGluYXRlKTsKLSAgICogICBgY29vcmRzWzFdJyBpcyB0aGUgbGVuZ3RoLgotICAgKgotICAgKiAgIFRoZSBsZW5ndGggY2FuIGJlIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZWl0aGVyIC0yMCBvcgotICAgKiAgIC0yMS4gIEl0IGlzIGludGVycHJldGVkIGFzIGEgYGdob3N0JyBzdGVtLCBhY2NvcmRpbmcgdG8gdGhlIFR5cGUgMQotICAgKiAgIHNwZWNpZmljYXRpb24uCi0gICAqCi0gICAqICAgSWYgdGhlIGxlbmd0aCBpcyAtMjEgKGNvcnJlc3BvbmRpbmcgdG8gYSBib3R0b20gZ2hvc3Qgc3RlbSksIHRoZW4KLSAgICogICB0aGUgcmVhbCBzdGVtIHBvc2l0aW9uIGlzIGBjb29yZHNbMF0rY29vcmRzWzFdJy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQxX0hpbnRzX1NldFN0ZW1GdW5jKSggVDFfSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMV9IaW50c19TZXRTdGVtM0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDFfSGludHMgY2xhc3MgdXNlZCB0byByZWNvcmQgdGhyZWUKLSAgICogICBjb3VudGVyLWNvbnRyb2xsZWQgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzdGVtcyBhdCBvbmNlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZGltZW5zaW9uIDo6Ci0gICAqICAgICAwIGZvciBob3Jpem9udGFsIHN0ZW1zLCAxIGZvciB2ZXJ0aWNhbCBvbmVzLgotICAgKgotICAgKiAgIGNvb3JkcyA6OgotICAgKiAgICAgQW4gYXJyYXkgb2YgNiBpbnRlZ2VycywgaG9sZGluZyAzIChwb3NpdGlvbixsZW5ndGgpIHBhaXJzIGZvciB0aGUKLSAgICogICAgIGNvdW50ZXItY29udHJvbGxlZCBzdGVtcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCi0gICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCi0gICAqCi0gICAqICAgVGhlIGxlbmd0aHMgY2Fubm90IGJlIG5lZ2F0aXZlIChnaG9zdCBzdGVtcyBhcmUgbmV2ZXIKLSAgICogICBjb3VudGVyLWNvbnRyb2xsZWQpLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfSGludHNfU2V0U3RlbTNGdW5jKSggVDFfSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX1Jlc2V0RnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMV9IaW50cyBjbGFzcyB1c2VkIHRvIHJlc2V0IHRoZSBzdGVtcyBoaW50cyBpbiBhCi0gICAqICAgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBlbmRfcG9pbnQgOjoKLSAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCBpbiB0aGUgaW5wdXQgZ2x5cGggaW4gd2hpY2ggdGhlCi0gICAqICAgICBwcmV2aW91c2x5IGRlZmluZWQgaGludHMgYXBwbHkuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9IaW50c19SZXNldEZ1bmMpKCBUMV9IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX0Nsb3NlRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMV9IaW50cyBjbGFzcyB1c2VkIHRvIGNsb3NlIGEgaGludCByZWNvcmRpbmcKLSAgICogICBzZXNzaW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZW5kX3BvaW50IDo6Ci0gICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGlucHV0IGdseXBoLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUKLSAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9IaW50c19DbG9zZUZ1bmMpKCBUMV9IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX0FwcGx5RnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMV9IaW50cyBjbGFzcyB1c2VkIHRvIGFwcGx5IGhpbnRzIHRvIHRoZQotICAgKiAgIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4gIE11c3QgYmUgY2FsbGVkIG9uY2UgYWxsIGhpbnRzIGhhdmUgYmVlbgotICAgKiAgIHJlY29yZGVkLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiAgIGdsb2JhbHMgOjoKLSAgICogICAgIFRoZSBoaW50ZXIgZ2xvYmFscyBmb3IgdGhpcyBmb250LgotICAgKgotICAgKiAgIGhpbnRfbW9kZSA6OgotICAgKiAgICAgSGludGluZyBpbmZvcm1hdGlvbi4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBPbiBpbnB1dCwgYWxsIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUgYXJlIGluIGZvbnQgY29vcmRpbmF0ZXMuIE9uCi0gICAqICAgb3V0cHV0LCB0aGV5IGFyZSBpbiAxLzY0dGggb2YgcGl4ZWxzLgotICAgKgotICAgKiAgIFRoZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlIGBnbG9iYWxzJyBvYmplY3Qgd2hpY2gKLSAgICogICBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZm9udCBhcyB0aGUgZ2x5cGguCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVDFfSGludHNfQXBwbHlGdW5jKSggVDFfSGludHMgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICAgICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgVDFfSGludHNfRnVuY3NSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSBBUEkgdG8gQFQxX0hpbnRzIG9iamVjdHMuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUMSBIaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBvcGVuIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gb3BlbiBhIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiAgIGNsb3NlIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogICBzdGVtIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gc2V0IGEgc2ltcGxlIHN0ZW0uCi0gICAqCi0gICAqICAgc3RlbTMgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgY291bnRlci1jb250cm9sbGVkIHN0ZW1zLgotICAgKgotICAgKiAgIHJlc2V0IDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gcmVzZXQgc3RlbSBoaW50cy4KLSAgICoKLSAgICogICBhcHBseSA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IHRoZSBoaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBvdXRsaW5lLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0hpbnRzX0Z1bmNzUmVjXwotICB7Ci0gICAgVDFfSGludHMgICAgICAgICAgICAgICBoaW50czsKLSAgICBUMV9IaW50c19PcGVuRnVuYyAgICAgIG9wZW47Ci0gICAgVDFfSGludHNfQ2xvc2VGdW5jICAgICBjbG9zZTsKLSAgICBUMV9IaW50c19TZXRTdGVtRnVuYyAgIHN0ZW07Ci0gICAgVDFfSGludHNfU2V0U3RlbTNGdW5jICBzdGVtMzsKLSAgICBUMV9IaW50c19SZXNldEZ1bmMgICAgIHJlc2V0OwotICAgIFQxX0hpbnRzX0FwcGx5RnVuYyAgICAgYXBwbHk7Ci0KLSAgfSBUMV9IaW50c19GdW5jc1JlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgIFBVQkxJQyBUWVBFIDIgSElOVFMgUkVDT1JERVIgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIFQyX0hpbnRzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIGlzIGEgaGFuZGxlIHRvIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNvcmQgZ2x5cGggaGludHMKLSAgICogICBmcm9tIGEgVHlwZSAyIGNoYXJhY3RlciBnbHlwaCBjaGFyYWN0ZXIgc3RyaW5nLgotICAgKgotICAgKiAgIFRoZSBtZXRob2RzIHVzZWQgdG8gb3BlcmF0ZSBvbiB0aGlzIG9iamVjdCBhcmUgZGVmaW5lZCBieSB0aGUKLSAgICogICBAVDJfSGludHNfRnVuY3NSZWMgc3RydWN0dXJlLiAgUmVjb3JkaW5nIGdseXBoIGhpbnRzIGlzIG5vcm1hbGx5Ci0gICAqICAgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHNjaGVtZToKLSAgICoKLSAgICogICAtIE9wZW4gYSBuZXcgaGludCByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSBgb3BlbicgbWV0aG9kLgotICAgKiAgICAgVGhpcyByZXdpbmRzIHRoZSByZWNvcmRlciBhbmQgcHJlcGFyZSBpdCBmb3IgbmV3IGlucHV0LgotICAgKgotICAgKiAgIC0gRm9yIGVhY2ggaGludCBmb3VuZCBpbiB0aGUgZ2x5cGggY2hhcnN0cmluZywgY2FsbCB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgICAgbWV0aG9kIChgc3RlbXMnLCBgaGludG1hc2snLCBgY291bnRlcnMnKS4gIE5vdGUgdGhhdCB0aGVzZQotICAgKiAgICAgZnVuY3Rpb25zIGRvIG5vdCByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICoKLSAgICogICAtIENsb3NlIHRoZSByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSBgY2xvc2UnIG1ldGhvZC4gIEl0Ci0gICAqICAgICByZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhlIGhpbnRzIHdlcmUgaW52YWxpZCBvciBzb21ldGhpbmcKLSAgICogICAgIHN0cmFuZ2UgaGFwcGVuZWQgKGUuZy4sIG1lbW9yeSBzaG9ydGFnZSkuCi0gICAqCi0gICAqICAgVGhlIGhpbnRzIGFjY3VtdWxhdGVkIGluIHRoZSBvYmplY3QgY2FuIGxhdGVyIGJlIHVzZWQgYnkgdGhlCi0gICAqICAgUG9zdHNjcmlwdCBoaW50ZXIuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBUMl9IaW50c1JlY18qICBUMl9IaW50czsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIFQyX0hpbnRzX0Z1bmNzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHBvaW50ZXIgdG8gdGhlIEBUMl9IaW50c19GdW5jc1JlYyBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZSBBUEkgb2YKLSAgICogICBhIGdpdmVuIEBUMl9IaW50cyBvYmplY3QuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMl9IaW50c19GdW5jc1JlY18qICBUMl9IaW50c19GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19PcGVuRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHByZXBhcmUgaXQgZm9yIGEgbmV3IFR5cGUgMgotICAgKiAgIGhpbnRzIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFlvdSBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIEBUMl9IaW50c19DbG9zZUZ1bmMgbWV0aG9kIGluIG9yZGVyIHRvCi0gICAqICAgY2xvc2UgYW4gb3BlbmVkIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDJfSGludHNfT3BlbkZ1bmMpKCBUMl9IaW50cyAgaGludHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19TdGVtc0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBzZXQgdGhlIHRhYmxlIG9mIHN0ZW1zIGluCi0gICAqICAgZWl0aGVyIHRoZSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGRpbWVuc2lvbi4gIEVxdWl2YWxlbnQgdG8gdGhlCi0gICAqICAgYGhzdGVtJywgYHZzdGVtJywgYGhzdGVtaG0nLCBhbmQgYHZzdGVtaG0nIFR5cGUgMiBvcGVyYXRvcnMuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMiBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBkaW1lbnNpb24gOjoKLSAgICogICAgIDAgZm9yIGhvcml6b250YWwgc3RlbXMgKGhzdGVtKSwgMSBmb3IgdmVydGljYWwgb25lcyAodnN0ZW0pLgotICAgKgotICAgKiAgIGNvdW50IDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIHN0ZW1zLgotICAgKgotICAgKiAgIGNvb3JkcyA6OgotICAgKiAgICAgQW4gYXJyYXkgb2YgYGNvdW50JyAocG9zaXRpb24sbGVuZ3RoKSBwYWlycy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCi0gICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCi0gICAqCi0gICAqICAgVGhlcmUgYXJlIGAyKmNvdW50JyBlbGVtZW50cyBpbiB0aGUgYGNvb3JkcycgYXJyYXkuICBFYWNoIGV2ZW4KLSAgICogICBlbGVtZW50IGlzIGFuIGFic29sdXRlIHBvc2l0aW9uIGluIGZvbnQgdW5pdHMsIGVhY2ggb2RkIGVsZW1lbnQgaXMgYQotICAgKiAgIGxlbmd0aCBpbiBmb250IHVuaXRzLgotICAgKgotICAgKiAgIEEgbGVuZ3RoIGNhbiBiZSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGVpdGhlciAtMjAgb3IKLSAgICogICAtMjEuICBJdCBpcyBpbnRlcnByZXRlZCBhcyBhIGBnaG9zdCcgc3RlbSwgYWNjb3JkaW5nIHRvIHRoZSBUeXBlIDEKLSAgICogICBzcGVjaWZpY2F0aW9uLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDJfSGludHNfU3RlbXNGdW5jKSggVDJfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRpbmF0ZXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19NYXNrRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCBhIGdpdmVuIGhpbnRtYXNrICh0aGlzCi0gICAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGBoaW50bWFzaycgVHlwZSAyIG9wZXJhdG9yKS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGVuZF9wb2ludCA6OgotICAgKiAgICAgVGhlIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQKLSAgICogICAgIG9yIGFjdGl2YXRlZCBoaW50cyBhcHBseS4KLSAgICoKLSAgICogICBiaXRfY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaGludCBtYXNrLgotICAgKgotICAgKiAgIGJ5dGVzIDo6Ci0gICAqICAgICBBbiBhcnJheSBvZiBieXRlcyBtb2RlbGxpbmcgdGhlIGhpbnQgbWFzay4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAotICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCi0gICAqCi0gICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0Ci0gICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAotICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KLSAgICoKLSAgICogICBUaGUgYGJ5dGVzJyBhcnJheSBjYW4gY29tZSBkaXJlY3RseSBmcm9tIHRoZSBUeXBlIDIgY2hhcnN0cmluZyBhbmQKLSAgICogICByZXNwZWN0cyB0aGUgc2FtZSBmb3JtYXQuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMl9IaW50c19NYXNrRnVuYykoIFQyX0hpbnRzICAgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGJ5dGVzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDJfSGludHNfQ291bnRlckZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBzZXQgYSBnaXZlbiBjb3VudGVyIG1hc2sKLSAgICogICAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYGhpbnRtYXNrJyBUeXBlIDIgb3BlcmF0b3IpLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZW5kX3BvaW50IDo6Ci0gICAqICAgICBBIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQgb3IKLSAgICogICAgIGFjdGl2ZSBoaW50cyBhcHBseS4KLSAgICoKLSAgICogICBiaXRfY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaGludCBtYXNrLgotICAgKgotICAgKiAgIGJ5dGVzIDo6Ci0gICAqICAgICBBbiBhcnJheSBvZiBieXRlcyBtb2RlbGxpbmcgdGhlIGhpbnQgbWFzay4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAotICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCi0gICAqCi0gICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0Ci0gICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAotICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KLSAgICoKLSAgICogICAgVGhlIGBieXRlcycgYXJyYXkgY2FuIGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUgVHlwZSAyIGNoYXJzdHJpbmcgYW5kCi0gICAqICAgIHJlc3BlY3RzIHRoZSBzYW1lIGZvcm1hdC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQyX0hpbnRzX0NvdW50ZXJGdW5jKSggVDJfSGludHMgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX0Nsb3NlRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIGNsb3NlIGEgaGludCByZWNvcmRpbmcKLSAgICogICBzZXNzaW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZW5kX3BvaW50IDo6Ci0gICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGlucHV0IGdseXBoLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUKLSAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMl9IaW50c19DbG9zZUZ1bmMpKCBUMl9IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX0FwcGx5RnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIGFwcGx5IGhpbnRzIHRvIHRoZQotICAgKiAgIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4gIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgY2xvc2UnCi0gICAqICAgbWV0aG9kLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiAgIGdsb2JhbHMgOjoKLSAgICogICAgIFRoZSBoaW50ZXIgZ2xvYmFscyBmb3IgdGhpcyBmb250LgotICAgKgotICAgKiAgIGhpbnRfbW9kZSA6OgotICAgKiAgICAgSGludGluZyBpbmZvcm1hdGlvbi4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBPbiBpbnB1dCwgYWxsIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUgYXJlIGluIGZvbnQgY29vcmRpbmF0ZXMuIE9uCi0gICAqICAgb3V0cHV0LCB0aGV5IGFyZSBpbiAxLzY0dGggb2YgcGl4ZWxzLgotICAgKgotICAgKiAgIFRoZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlIGBnbG9iYWxzJyBvYmplY3Qgd2hpY2gKLSAgICogICBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZm9udCB0aGFuIHRoZSBnbHlwaC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMl9IaW50c19BcHBseUZ1bmMpKCBUMl9IaW50cyAgICAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBUMl9IaW50c19GdW5jc1JlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIEFQSSB0byBAVDJfSGludHMgb2JqZWN0cy4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFQyIGhpbnRzIHJlY29yZGVyIG9iamVjdC4KLSAgICoKLSAgICogICBvcGVuIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gb3BlbiBhIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiAgIGNsb3NlIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogICBzdGVtcyA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNldCB0aGUgZGltZW5zaW9uJ3Mgc3RlbXMgdGFibGUuCi0gICAqCi0gICAqICAgaGludG1hc2sgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgaGludCBtYXNrcy4KLSAgICoKLSAgICogICBjb3VudGVyIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gc2V0IGNvdW50ZXIgbWFza3MuCi0gICAqCi0gICAqICAgYXBwbHkgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0aGUgaGludHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMl9IaW50c19GdW5jc1JlY18KLSAgewotICAgIFQyX0hpbnRzICAgICAgICAgICAgICBoaW50czsKLSAgICBUMl9IaW50c19PcGVuRnVuYyAgICAgb3BlbjsKLSAgICBUMl9IaW50c19DbG9zZUZ1bmMgICAgY2xvc2U7Ci0gICAgVDJfSGludHNfU3RlbXNGdW5jICAgIHN0ZW1zOwotICAgIFQyX0hpbnRzX01hc2tGdW5jICAgICBoaW50bWFzazsKLSAgICBUMl9IaW50c19Db3VudGVyRnVuYyAgY291bnRlcjsKLSAgICBUMl9IaW50c19BcHBseUZ1bmMgICAgYXBwbHk7Ci0KLSAgfSBUMl9IaW50c19GdW5jc1JlYzsKLQotCi0gIC8qICovCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIaW50ZXJfSW50ZXJmYWNlXwotICB7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgICgqZ2V0X2dsb2JhbHNfZnVuY3MpKCBGVF9Nb2R1bGUgIG1vZHVsZSApOwotICAgIFQxX0hpbnRzX0Z1bmNzICAgICAoKmdldF90MV9mdW5jcykgICAgICggRlRfTW9kdWxlICBtb2R1bGUgKTsKLSAgICBUMl9IaW50c19GdW5jcyAgICAgKCpnZXRfdDJfZnVuY3MpICAgICAoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLSAgfSBQU0hpbnRlcl9JbnRlcmZhY2U7Ci0KLSAgdHlwZWRlZiBQU0hpbnRlcl9JbnRlcmZhY2UqICBQU0hpbnRlcl9TZXJ2aWNlOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fUFNISU5UU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3ZmM2MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIEJERiBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVkJERl9IX18KLSNkZWZpbmUgX19TVkJERl9IX18KLQotI2luY2x1ZGUgRlRfQkRGX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9CREYgICJiZGYiCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0JERl9HZXRDaGFyc2V0SWRGdW5jKSggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfcmVnaXN0cnkgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfQkRGX0dldFByb3BlcnR5RnVuYykoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3BlcnR5ICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggQkRGICkKLSAgewotICAgIEZUX0JERl9HZXRDaGFyc2V0SWRGdW5jICBnZXRfY2hhcnNldF9pZDsKLSAgICBGVF9CREZfR2V0UHJvcGVydHlGdW5jICAgZ2V0X3Byb3BlcnR5OwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWQkRGX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2ZlZjYyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2Y2lkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgQ0lEIGZvbnQgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNyBieSBEZXJlayBDbGVnZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZDSURfSF9fCi0jZGVmaW5lIF9fU1ZDSURfSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9DSUQgICJDSUQiCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0NJRF9HZXRSZWdpc3RyeU9yZGVyaW5nU3VwcGxlbWVudEZ1bmMpKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqb3JkZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqc3VwcGxlbWVudCApOwotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBDSUQgKQotICB7Ci0gICAgRlRfQ0lEX0dldFJlZ2lzdHJ5T3JkZXJpbmdTdXBwbGVtZW50RnVuYyAgZ2V0X3JvczsKLSAgfTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVkNJRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlNTZiMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmdsZGljdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIGRpY3Rpb25hcnkgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVkdMRElDVF9IX18KLSNkZWZpbmUgX19TVkdMRElDVF9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKgotICAgKiAgQSBzZXJ2aWNlIHVzZWQgdG8gcmV0cmlldmUgZ2x5cGggbmFtZXMsIGFzIHdlbGwgYXMgdG8gZmluZCB0aGUKLSAgICogIGluZGV4IG9mIGEgZ2l2ZW4gZ2x5cGggbmFtZSBpbiBhIGZvbnQuCi0gICAqCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCAgImdseXBoLWRpY3QiCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBHbHlwaERpY3QgKQotICB7Ci0gICAgRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jICAgIGdldF9uYW1lOwotICAgIEZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jICBuYW1lX2luZGV4OyAgLyogb3B0aW9uYWwgKi8KLSAgfTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVkdMRElDVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGFiNTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmd4dmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoc3BlY2lmaWNhdGlvbikuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQsIDIwMDUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZHWFZBTF9IX18KLSNkZWZpbmUgX19TVkdYVkFMX0hfXwotCi0jaW5jbHVkZSBGVF9HWF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9HWF9WQUxJREFURSAgICAgICAgICAgInRydWV0eXBlZ3gtdmFsaWRhdGUiCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfQ0xBU1NJQ0tFUk5fVkFMSURBVEUgICJjbGFzc2lja2Vybi12YWxpZGF0ZSIKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqZ3h2X3ZhbGlkYXRlX2Z1bmMpKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBneF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZXNbRlRfVkFMSURBVEVfR1hfTEVOR1RIXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICB0YWJsZV9sZW5ndGggKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpja2Vybl92YWxpZGF0ZV9mdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBja2Vybl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICpja2Vybl90YWJsZSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIEdYdmFsaWRhdGUgKQotICB7Ci0gICAgZ3h2X3ZhbGlkYXRlX2Z1bmMgIHZhbGlkYXRlOwotICB9OwotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBDS0VSTnZhbGlkYXRlICkKLSAgewotICAgIGNrZXJuX3ZhbGlkYXRlX2Z1bmMgIHZhbGlkYXRlOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWR1hWQUxfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmtlcm4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ4OGFkZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZrZXJuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBLZXJuaW5nIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZLRVJOX0hfXwotI2RlZmluZSBfX1NWS0VSTl9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfS0VSTklORyAgImtlcm5pbmciCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfS2VybmluZ19UcmFja0dldEZ1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgIHBvaW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWtlcm5pbmcgKTsKLQotICBGVF9ERUZJTkVfU0VSVklDRSggS2VybmluZyApCi0gIHsKLSAgICBGVF9LZXJuaW5nX1RyYWNrR2V0RnVuYyAgZ2V0X3RyYWNrOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWS0VSTl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTllYzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdm1tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIE11bHRpcGxlIE1hc3RlcnMgYW5kIEdYIHZhciBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVk1NX0hfXwotI2RlZmluZSBfX1NWTU1fSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIEEgc2VydmljZSB1c2VkIHRvIG1hbmFnZSBtdWx0aXBsZS1tYXN0ZXJzIGRhdGEgaW4gYSBnaXZlbiBmYWNlLgotICAgKgotICAgKiAgU2VlIHRoZSByZWxhdGVkIEFQSXMgaW4gYGZ0bW0uaCcgKEZUX01VTFRJUExFX01BU1RFUlNfSCkuCi0gICAqCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUyAgIm11bHRpLW1hc3RlcnMiCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfR2V0X01NX0Z1bmMpKCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfTXVsdGlfTWFzdGVyKiAgbWFzdGVyICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0dldF9NTV9WYXJfRnVuYykoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICptYXN0ZXIgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2V0X01NX0Rlc2lnbl9GdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NldF9NTV9CbGVuZF9GdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBNdWx0aU1hc3RlcnMgKQotICB7Ci0gICAgRlRfR2V0X01NX0Z1bmMgICAgICAgICAgZ2V0X21tOwotICAgIEZUX1NldF9NTV9EZXNpZ25fRnVuYyAgIHNldF9tbV9kZXNpZ247Ci0gICAgRlRfU2V0X01NX0JsZW5kX0Z1bmMgICAgc2V0X21tX2JsZW5kOwotICAgIEZUX0dldF9NTV9WYXJfRnVuYyAgICAgIGdldF9tbV92YXI7Ci0gICAgRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYyAgc2V0X3Zhcl9kZXNpZ247Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1NWTU1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2b3R2YWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBiYmQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZvdHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBPcGVuVHlwZSB2YWxpZGF0aW9uIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZPVFZBTF9IX18KLSNkZWZpbmUgX19TVk9UVkFMX0hfXwotCi0jaW5jbHVkZSBGVF9PUEVOVFlQRV9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9PUEVOVFlQRV9WQUxJREFURSAgIm9wZW50eXBlLXZhbGlkYXRlIgotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKm90dl92YWxpZGF0ZV9mdW5jKSggRlRfRmFjZSB2b2xhdGlsZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIG90X2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAqYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmdkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICpncG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAqZ3N1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmpzdGYgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBPVHZhbGlkYXRlICkKLSAgewotICAgIG90dl92YWxpZGF0ZV9mdW5jICB2YWxpZGF0ZTsKLSAgfTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVk9UVkFMX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjI3ODZmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2cGZyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJbnRlcm5hbCBQRlIgc2VydmljZSBmdW5jdGlvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWUEZSX0hfXwotI2RlZmluZSBfX1NWUEZSX0hfXwotCi0jaW5jbHVkZSBGVF9QRlJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BGUl9NRVRSSUNTICAicGZyLW1ldHJpY3MiCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUEZSX0dldE1ldHJpY3NGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmF4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYXlfc2NhbGUgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUEZSX0dldEtlcm5pbmdGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgKmF2ZWN0b3IgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUEZSX0dldEFkdmFuY2VGdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAqYWFkdmFuY2UgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQZnJNZXRyaWNzICkKLSAgewotICAgIEZUX1BGUl9HZXRNZXRyaWNzRnVuYyAgZ2V0X21ldHJpY3M7Ci0gICAgRlRfUEZSX0dldEtlcm5pbmdGdW5jICBnZXRfa2VybmluZzsKLSAgICBGVF9QRlJfR2V0QWR2YW5jZUZ1bmMgIGdldF9hZHZhbmNlOwotCi0gIH07Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1NWUEZSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJkYTY4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2cG9zdG5tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgUG9zdFNjcmlwdCBuYW1lIHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWUE9TVE5NX0hfXwotI2RlZmluZSBfX1NWUE9TVE5NX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKgotICAgKiAgQSB0cml2aWFsIHNlcnZpY2UgdXNlZCB0byByZXRyaWV2ZSB0aGUgUG9zdFNjcmlwdCBuYW1lIG9mIGEgZ2l2ZW4KLSAgICogIGZvbnQgd2hlbiBhdmFpbGFibGUuICBUaGUgYGdldF9uYW1lJyBmaWVsZCBzaG91bGQgbmV2ZXIgYmUgTlVMTC4KLSAgICoKLSAgICogIFRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGNhbiByZXR1cm4gTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoZQotICAgKiAgUG9zdFNjcmlwdCBuYW1lIGlzIG5vdCBhdmFpbGFibGUuCi0gICAqCi0gICAqICBUaGUgbmFtZSBpcyBvd25lZCBieSB0aGUgZmFjZSBhbmQgd2lsbCBiZSBkZXN0cm95ZWQgd2l0aCBpdC4KLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSAgInBvc3RzY3JpcHQtZm9udC1uYW1lIgotCi0KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKkZUX1BzTmFtZV9HZXRGdW5jKSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFBzRm9udE5hbWUgKQotICB7Ci0gICAgRlRfUHNOYW1lX0dldEZ1bmMgIGdldF9wc19mb250X25hbWU7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZQT1NUTk1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZTI1ZWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2cHNjbWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgUG9zdFNjcmlwdCBjaGFybWFwIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWUFNDTUFQX0hfXwotI2RlZmluZSBfX1NWUFNDTUFQX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9DTUFQUyAgInBvc3RzY3JpcHQtY21hcHMiCi0KLQotICAvKgotICAgKiAgQWRvYmUgZ2x5cGggbmFtZSB0byB1bmljb2RlIHZhbHVlLgotICAgKi8KLSAgdHlwZWRlZiBGVF9VSW50MzIKLSAgKCpQU19Vbmljb2RlX1ZhbHVlRnVuYykoIGNvbnN0IGNoYXIqICBnbHlwaF9uYW1lICk7Ci0KLSAgLyoKLSAgICogIE1hY2ludG9zaCBuYW1lIGlkIHRvIGdseXBoIG5hbWUuICBOVUxMIGlmIGludmFsaWQgaW5kZXguCi0gICAqLwotICB0eXBlZGVmIGNvbnN0IGNoYXIqCi0gICgqUFNfTWFjaW50b3NoX05hbWVGdW5jKSggRlRfVUludCAgbmFtZV9pbmRleCApOwotCi0gIC8qCi0gICAqICBBZG9iZSBzdGFuZGFyZCBzdHJpbmcgSUQgdG8gZ2x5cGggbmFtZS4gIE5VTEwgaWYgaW52YWxpZCBpbmRleC4KLSAgICovCi0gIHR5cGVkZWYgY29uc3QgY2hhcioKLSAgKCpQU19BZG9iZV9TdGRfU3RyaW5nc0Z1bmMpKCBGVF9VSW50ICBzdHJpbmdfaW5kZXggKTsKLQotCi0gIC8qCi0gICAqICBTaW1wbGUgdW5pY29kZSAtPiBnbHlwaCBpbmRleCBjaGFybWFwIGJ1aWx0IGZyb20gZm9udCBnbHlwaCBuYW1lcwotICAgKiAgdGFibGUuCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfVW5pTWFwXwotICB7Ci0gICAgRlRfVUludDMyICB1bmljb2RlOyAgICAgIC8qIGJpdCAzMSBzZXQ6IGlzIGdseXBoIHZhcmlhbnQgKi8KLSAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4OwotCi0gIH0gUFNfVW5pTWFwOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNfVW5pY29kZXNSZWNfKiAgUFNfVW5pY29kZXM7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1VuaWNvZGVzUmVjXwotICB7Ci0gICAgRlRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VSW50ICAgICBudW1fbWFwczsKLSAgICBQU19VbmlNYXAqICBtYXBzOwotCi0gIH0gUFNfVW5pY29kZXNSZWM7Ci0KLQotICAvKgotICAgKiAgQSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgZ2x5cGggbmFtZSBmb3IgYSBnaXZlbiBpbmRleC4gIFJldHVybnMKLSAgICogIE5VTEwgaWYgaW52YWxpZCBpbmRleC4KLSAgICovCi0gIHR5cGVkZWYgY29uc3QgY2hhcioKLSAgKCpQU19HZXRHbHlwaE5hbWVGdW5jKSggRlRfUG9pbnRlciAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgc3RyaW5nX2luZGV4ICk7Ci0KLSAgLyoKLSAgICogIEEgZnVuY3Rpb24gdXNlZCB0byByZWxlYXNlIHRoZSBnbHlwaCBuYW1lIHJldHVybmVkIGJ5Ci0gICAqICBQU19HZXRHbHlwaE5hbWVGdW5jLCB3aGVuIG5lZWRlZAotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqUFNfRnJlZUdseXBoTmFtZUZ1bmMpKCBGVF9Qb2ludGVyICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG5hbWUgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqUFNfVW5pY29kZXNfSW5pdEZ1bmMpKCBGVF9NZW1vcnkgICAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfVW5pY29kZXMgICAgICAgICAgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgIG51bV9nbHlwaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQU19HZXRHbHlwaE5hbWVGdW5jICAgZ2V0X2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQU19GcmVlR2x5cGhOYW1lRnVuYyAgZnJlZV9nbHlwaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgICAgICAgIGdseXBoX2RhdGEgKTsKLQotICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpQU19Vbmljb2Rlc19DaGFySW5kZXhGdW5jKSggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgdW5pY29kZSApOwotCi0gIHR5cGVkZWYgRlRfVUxvbmcKLSAgKCpQU19Vbmljb2Rlc19DaGFyTmV4dEZ1bmMpKCBQU19Vbmljb2RlcyAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnVuaWNvZGUgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQc0NNYXBzICkKLSAgewotICAgIFBTX1VuaWNvZGVfVmFsdWVGdW5jICAgICAgIHVuaWNvZGVfdmFsdWU7Ci0KLSAgICBQU19Vbmljb2Rlc19Jbml0RnVuYyAgICAgICB1bmljb2Rlc19pbml0OwotICAgIFBTX1VuaWNvZGVzX0NoYXJJbmRleEZ1bmMgIHVuaWNvZGVzX2NoYXJfaW5kZXg7Ci0gICAgUFNfVW5pY29kZXNfQ2hhck5leHRGdW5jICAgdW5pY29kZXNfY2hhcl9uZXh0OwotCi0gICAgUFNfTWFjaW50b3NoX05hbWVGdW5jICAgICAgbWFjaW50b3NoX25hbWU7Ci0gICAgUFNfQWRvYmVfU3RkX1N0cmluZ3NGdW5jICAgYWRvYmVfc3RkX3N0cmluZ3M7Ci0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQqICAgICAgYWRvYmVfc3RkX2VuY29kaW5nOwotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiAgICAgIGFkb2JlX2V4cGVydF9lbmNvZGluZzsKLSAgfTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVlBTQ01BUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmNWRiOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnBzaW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFBvc3RTY3JpcHQgaW5mbyBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVlBTSU5GT19IX18KLSNkZWZpbmUgX19TVlBTSU5GT19IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTyAgInBvc3RzY3JpcHQtaW5mbyIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpQU19HZXRGb250SW5mb0Z1bmMpKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEluZm9SZWMqICBhZm9udF9pbmZvICk7Ci0KLSAgdHlwZWRlZiBGVF9JbnQKLSAgKCpQU19IYXNHbHlwaE5hbWVzRnVuYykoIEZUX0ZhY2UgICBmYWNlICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlBTX0dldEZvbnRQcml2YXRlRnVuYykoIEZUX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX1ByaXZhdGVSZWMqICBhZm9udF9wcml2YXRlICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggUHNJbmZvICkKLSAgewotICAgIFBTX0dldEZvbnRJbmZvRnVuYyAgICAgcHNfZ2V0X2ZvbnRfaW5mbzsKLSAgICBQU19IYXNHbHlwaE5hbWVzRnVuYyAgIHBzX2hhc19nbHlwaF9uYW1lczsKLSAgICBQU19HZXRGb250UHJpdmF0ZUZ1bmMgIHBzX2dldF9mb250X3ByaXZhdGU7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZQU0lORk9fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhODVkOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZzZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBTRk5UIHRhYmxlIGxvYWRpbmcgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZTRk5UX0hfXwotI2RlZmluZSBfX1NWU0ZOVF9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlLgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUgICJzZm50LXRhYmxlIgotCi0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfTG9hZF9TZm50X1RhYmxlKCkuCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU0ZOVF9UYWJsZUxvYWRGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfR2V0X1NmbnRfVGFibGUoKS4KLSAgICovCi0gIHR5cGVkZWYgdm9pZCoKLSAgKCpGVF9TRk5UX1RhYmxlR2V0RnVuYykoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2ZudF9UYWcgIHRhZyApOwotCi0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfU2ZudF9UYWJsZV9JbmZvKCkuCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU0ZOVF9UYWJsZUluZm9GdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggU0ZOVF9UYWJsZSApCi0gIHsKLSAgICBGVF9TRk5UX1RhYmxlTG9hZEZ1bmMgIGxvYWRfdGFibGU7Ci0gICAgRlRfU0ZOVF9UYWJsZUdldEZ1bmMgICBnZXRfdGFibGU7Ci0gICAgRlRfU0ZOVF9UYWJsZUluZm9GdW5jICB0YWJsZV9pbmZvOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWU0ZOVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwMmQxNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnN0dGNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFRydWVUeXBlL3NmbnQgY21hcCBleHRyYSBpbmZvcm1hdGlvbiBzZXJ2aWNlLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkaGF0IEsuSy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBEZXZlbG9wbWVudCBvZiB0aGlzIHNlcnZpY2UgaXMgc3VwcG9ydCBvZgotICAgSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gKi8KLQotI2lmbmRlZiBfX1NWVFRDTUFQX0hfXwotI2RlZmluZSBfX1NWVFRDTUFQX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1RUX0NNQVAgInR0LWNtYXBzIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfQ01hcEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBUcnVlVHlwZS9zZm50IHNwZWNpZmljIGNtYXAgaW5mb3JtYXRpb24gICovCi0gIC8qICAgIHdoaWNoIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBnZW5lcmljIEBGVF9DaGFyTWFwIHN0cnVjdHVyZS4gIFRoaXMgICAqLwotICAvKiAgICBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIEBGVF9HZXRfVFRfQ01hcF9JbmZvIGZ1bmN0aW9uLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsYW5ndWFnZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbGFuZ3VhZ2UgSUQgdXNlZCBpbiBNYWMgZm9udHMuICBEZWZpbml0aW9ucyBvZiB2YWx1ZXMgYXJlIGluICovCi0gIC8qICAgICAgZnJlZXR5cGUvdHRuYW1laWQuaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXBJbmZvXwotICB7Ci0gICAgRlRfVUxvbmcgbGFuZ3VhZ2U7Ci0gICAgRlRfTG9uZyAgZm9ybWF0OwotCi0gIH0gVFRfQ01hcEluZm87Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfQ01hcF9JbmZvX0dldEZ1bmMpKCBGVF9DaGFyTWFwICAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFRUQ01hcHMgKQotICB7Ci0gICAgVFRfQ01hcF9JbmZvX0dldEZ1bmMgIGdldF9jbWFwX2luZm87Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1NWVFRDTUFQX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0ZW5nLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlMDJhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2dHRlbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgVHJ1ZVR5cGUgZW5naW5lIHF1ZXJ5IHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWVFRFTkdfSF9fCi0jZGVmaW5lIF9fU1ZUVEVOR19IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9NT0RVTEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlLgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1RSVUVUWVBFX0VOR0lORSAgInRydWV0eXBlLWVuZ2luZSIKLQotICAvKgotICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUKLSAgICovCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFRydWVUeXBlRW5naW5lICkKLSAgewotICAgIEZUX1RydWVUeXBlRW5naW5lVHlwZSAgZW5naW5lX3R5cGU7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZUVEVOR19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3ZDQ4NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnR0Z2x5Zi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFRydWVUeXBlIGdseXBoIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDcgYnkgRGF2aWQgVHVybmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19TVlRUR0xZRl9IX18KLSNkZWZpbmUgX19TVlRUR0xZRl9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9UVF9HTFlGICJ0dC1nbHlmIgotCi0KLSAgdHlwZWRlZiBGVF9VTG9uZwotICAoKlRUX0dseWZfR2V0TG9jYXRpb25GdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKnBzaXplICk7Ci0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFRUR2x5ZiApCi0gIHsKLSAgICBUVF9HbHlmX0dldExvY2F0aW9uRnVuYyAgZ2V0X2xvY2F0aW9uOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19TVlRUR0xZRl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmNzc2NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdndpbmZudC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFdpbmRvd3MgRk5UL0ZPTlQgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVldJTkZOVF9IX18KLSNkZWZpbmUgX19TVldJTkZOVF9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9XSU5GT05UU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1dJTkZOVCAgIndpbmZvbnRzIgotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9XaW5GbnRfR2V0SGVhZGVyRnVuYykoIEZUX0ZhY2UgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfV2luRk5UX0hlYWRlclJlYyAgKmFoZWFkZXIgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBXaW5GbnQgKQotICB7Ci0gICAgRlRfV2luRm50X0dldEhlYWRlckZ1bmMgIGdldF9oZWFkZXI7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZXSU5GTlRfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2eGY4Nm5tLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2eGY4Nm5tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNWQ4ODQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnhmODZubS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Z4Zjg2bm0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBYRnJlZTg2IHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZYRjg2Tk1fSF9fCi0jZGVmaW5lIF9fU1ZYRjg2Tk1fSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIEEgdHJpdmlhbCBzZXJ2aWNlIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIG9mIGEgZmFjZSdzIGZvbnQgZHJpdmVyLAotICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBYRnJlZTg2IG5vbWVuY2xhdHVyZS4gIE5vdGUgdGhhdCB0aGUgc2VydmljZSBkYXRhCi0gICAqICBpcyBhIHNpbXBsZSBjb25zdGFudCBzdHJpbmcgcG9pbnRlci4KLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9YRjg2X05BTUUgICJ4Zjg2LWRyaXZlci1uYW1lIgotCi0jZGVmaW5lIEZUX1hGODZfRk9STUFUX1RSVUVUWVBFICAiVHJ1ZVR5cGUiCi0jZGVmaW5lIEZUX1hGODZfRk9STUFUX1RZUEVfMSAgICAiVHlwZSAxIgotI2RlZmluZSBGVF9YRjg2X0ZPUk1BVF9CREYgICAgICAgIkJERiIKLSNkZWZpbmUgRlRfWEY4Nl9GT1JNQVRfUENGICAgICAgICJQQ0YiCi0jZGVmaW5lIEZUX1hGODZfRk9STUFUX1RZUEVfNDIgICAiVHlwZSA0MiIKLSNkZWZpbmUgRlRfWEY4Nl9GT1JNQVRfQ0lEICAgICAgICJDSUQgVHlwZSAxIgotI2RlZmluZSBGVF9YRjg2X0ZPUk1BVF9DRkYgICAgICAgIkNGRiIKLSNkZWZpbmUgRlRfWEY4Nl9GT1JNQVRfUEZSICAgICAgICJQRlIiCi0jZGVmaW5lIEZUX1hGODZfRk9STUFUX1dJTkZOVCAgICAiV2luZG93cyBGTlQiCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZYRjg2Tk1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZThmNjg0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIGBzZm50JyBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NGTlRfSF9fCi0jZGVmaW5lIF9fU0ZOVF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Jbml0X0ZhY2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaXJzdCBwYXJ0IG9mIHRoZSBTRk5UIGZhY2Ugb2JqZWN0IGluaXRpYWxpemF0aW9uLiAgVGhpcyBmaW5kcyAgICAgKi8KLSAgLyogICAgdGhlIGZhY2UgaW4gYSBTRk5UIGZpbGUgb3IgY29sbGVjdGlvbiwgYW5kIGxvYWQgaXRzIGZvcm1hdCB0YWcgaW4gICovCi0gIC8qICAgIGZhY2UtPmZvcm1hdF90YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UgYXJlIG9wZW5pbmcgYSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogT3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgYXQgdGhlIGZvbnQgZmlsZSdzIG9yaWdpbi4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGZvbnRzIGVtYmVkZGVkIGluIGEgYFRydWVUeXBlICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbGxlY3Rpb24nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25jZSB0aGUgZm9ybWF0IHRhZyBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlIGZvbnQgZHJpdmVyLCBpdCAgICAgICovCi0gIC8qICAgIHNob3VsZCB0aGVuIGNhbGwgdGhlIFRUX0xvYWRfRmFjZV9GdW5jKCkgY2FsbGJhY2sgdG8gcmVhZCB0aGUgcmVzdCAqLwotICAvKiAgICBvZiB0aGUgU0ZOVCB0YWJsZXMgaW4gdGhlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Jbml0X0ZhY2VfRnVuYykoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2Vjb25kIHBhcnQgb2YgdGhlIFNGTlQgZmFjZSBvYmplY3QgaW5pdGlhbGl6YXRpb24uICBUaGlzIGxvYWRzICAgICovCi0gIC8qICAgIHRoZSBjb21tb24gU0ZOVCB0YWJsZXMgKGhlYWQsIE9TLzIsIG1heHAsIG1ldHJpY3MsIGV0Yy4pIGluIHRoZSAgICAqLwotICAvKiAgICBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3BhcmFtcyA6OiBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJhbXMgICAgIDo6IE9wdGlvbmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIFRUX0luaXRfRmFjZV9GdW5jKCkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX0ZhY2VfRnVuYykoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRG9uZV9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBjYWxsYmFjayB1c2VkIHRvIGRlbGV0ZSB0aGUgY29tbW9uIFNGTlQgZGF0YSBmcm9tIGEgZmFjZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBkZXN0cm95IHRoZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUVF9Eb25lX0ZhY2VfRnVuYykoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9TRk5UX0hlYWRlclJlY19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIGhlYWRlciBvZiBhIFNGTlQgZm9udCBmaWxlLiAgU3VwcG9ydHMgY29sbGVjdGlvbnMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBUcnVlVHlwZSBmb250LCBpZiB3ZSBhcmUgb3BlbmluZyBhICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZm50ICAgICAgIDo6IFRoZSBTRk5UIGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBmb250IGZpbGUncyBvcmlnaW4uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyBmb250cyBlbWJlZGRlZCBpbiBhIGBUcnVlVHlwZSAgICAgICAgICAgICAqLwotICAvKiAgICBjb2xsZWN0aW9uJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoYXQgdGhlIGhlYWRlciBpcyB2YWxpZCBieSBsb29raW5nIGF0IHRoZSAgICAqLwotICAvKiAgICB2YWx1ZXMgb2YgYHNlYXJjaF9yYW5nZScsIGBlbnRyeV9zZWxlY3RvcicsIGFuZCBgcmFuZ2Vfc2hpZnQnLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX1NGTlRfSGVhZGVyUmVjX0Z1bmMpKCBUVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGTlRfSGVhZGVyICBzZm50ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0RpcmVjdG9yeV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgdGFibGUgZGlyZWN0b3J5IGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2ZudCAgIDo6IFRoZSBTRk5UIGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBvbiB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgNC1ieXRlIGZvbnQgICovCi0gIC8qICAgIGZvcm1hdCB0YWcuICBUaGlzIGlzIHRoZSBjYXNlIGp1c3QgYWZ0ZXIgYSBjYWxsIHRvICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0Zvcm1hdF9UYWcoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX0RpcmVjdG9yeV9GdW5jKSggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGTlRfSGVhZGVyICBzZm50ICk7Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfQW55X0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgYW55IGZvbnQgdGFibGUgaW50byBjbGllbnQgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBUaGUgZmFjZSBvYmplY3QgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IFRoZSB0YWcgb2YgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWUgMCBpZiB5b3Ugd2FudCAgICovCi0gIC8qICAgICAgICAgICAgICB0byBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZSwgZWxzZSBzZXQgdGhpcyBwYXJhbWV0ZXIgICAqLwotICAvKiAgICAgICAgICAgICAgdG8gYSB2YWxpZCBUcnVlVHlwZSB0YWJsZSB0YWcgdGhhdCB5b3UgY2FuIGZvcmdlIHdpdGggICAgKi8KLSAgLyogICAgICAgICAgICAgIHRoZSBNQUtFX1RUX1RBRyBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXQgOjogVGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgdGFibGUgKG9yIHRoZSBmaWxlIGlmICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHRhZyA9PSAwKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGRlY2lzaW9uIHZhcmlhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmIGxlbmd0aCA9PSBOVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSB3aG9sZSB0YWJsZS4gIFJldHVybnMgYW4gZXJyb3IgaWYgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgb2Zmc2V0JyA9PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoID09IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBFeGl0cyBpbW1lZGlhdGVseTsgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuICovCi0gIC8qICAgICAgICAgICAgICAgICAgdGFibGUgb3Igb2YgdGhlIGZvbnQgZmlsZSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAqLwotICAvKiAgICAgICAgICAgICAgICAgIGB0YWcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggIT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSBuZXh0IGBsZW5ndGgnIGJ5dGVzIG9mIHRhYmxlIG9yIGZvbnQsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCBvZmZzZXQgYG9mZnNldCcgKGluIHRhYmxlIG9yIGZvbnQgdG9vKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyIDo6IFRoZSBhZGRyZXNzIG9mIHRhcmdldCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9BbnlfRnVuYykoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlICAgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0ZpbmRfU0JpdF9JbWFnZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrIHdoZXRoZXIgYW4gZW1iZWRkZWQgYml0bWFwIChhbiBgc2JpdCcpIGV4aXN0cyBmb3IgYSBnaXZlbiAgICAqLwotICAvKiAgICBnbHlwaCwgYXQgYSBnaXZlbiBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaWtlX2luZGV4ICA6OiBUaGUgY3VycmVudCBzdHJpa2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXJhbmdlICAgICAgICA6OiBUaGUgU0JpdCByYW5nZSBjb250YWluaW5nIHRoZSBnbHlwaCBpbmRleC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc3RyaWtlICAgICAgIDo6IFRoZSBTQml0IHN0cmlrZSBjb250YWluaW5nIHRoZSBnbHlwaCBpbmRleC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnbHlwaF9vZmZzZXQgOjogVGhlIG9mZnNldCBvZiB0aGUgZ2x5cGggZGF0YSBpbiBgRUJEVCcgdGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTRk5UX0Vycl9JbnZhbGlkX0FyZ3VtZW50IGlmIG5vIHNiaXQgZXhpc3RzIGZvciB0aGUgcmVxdWVzdGVkICAgICAgKi8KLSAgLyogICAgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfRmluZF9TQml0X0ltYWdlX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1JhbmdlICAgKmFyYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfU3RyaWtlICAqYXN0cmlrZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAqYWdseXBoX29mZnNldCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9TQml0X01ldHJpY3NfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBiaWcgbWV0cmljcyBmb3IgYSBnaXZlbiBlbWJlZGRlZCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYW5nZSAgICAgICA6OiBUaGUgU0JpdCByYW5nZSBjb250YWluaW5nIHRoZSBnbHlwaC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaWdfbWV0cmljcyA6OiBBIGJpZyBTQml0IG1ldHJpY3Mgc3RydWN0dXJlIGZvciB0aGUgZ2x5cGguICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIHBvc2l0aW9uZWQgYXQgdGhlIGdseXBoJ3Mgb2Zmc2V0IHdpdGhpbiAgKi8KLSAgLyogICAgdGhlIGBFQkRUJyB0YWJsZSBiZWZvcmUgdGhlIGNhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgaW1hZ2UgZm9ybWF0IHVzZXMgdmFyaWFibGUgbWV0cmljcywgdGhlIHN0cmVhbSBjdXJzb3IgaXMgICAgKi8KLSAgLyogICAgcG9zaXRpb25lZCBqdXN0IGFmdGVyIHRoZSBtZXRyaWNzIGhlYWRlciBpbiB0aGUgYEVCRFQnIHRhYmxlIG9uICAgICovCi0gIC8qICAgIGZ1bmN0aW9uIGV4aXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfU0JpdF9NZXRyaWNzX0Z1bmMpKCBGVF9TdHJlYW0gICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSAgICByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzICBtZXRyaWNzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX1NCaXRfSW1hZ2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIGEgZ2l2ZW4gZ2x5cGggc2JpdCBpbWFnZSBmcm9tIHRoZSBmb250IHJlc291cmNlLiAgVGhpcyBhbHNvICAgKi8KLSAgLyogICAgcmV0dXJucyBpdHMgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaWtlX2luZGV4IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHN0cmlrZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGN1cnJlbnQgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGN1cnJlbnQgbG9hZCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtYXAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgcGl4bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtZXRyaWNzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgYmlnIHNiaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaCBpbWFnZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyBhbiBlcnJvciBpZiBubyAgICAgKi8KLSAgLyogICAgZ2x5cGggc2JpdCBleGlzdHMgZm9yIHRoZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBtYXAuYnVmZmVyJyBmaWVsZCBpcyBhbHdheXMgZnJlZWQgYmVmb3JlIHRoZSBnbHlwaCBpcyBsb2FkZWQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9TQml0X0ltYWdlX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAgICAgICAgICAqYW1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgKmFtZXRyaWNzICk7Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NldF9TQml0X1N0cmlrZV9PbGRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlbGVjdCBhbiBzYml0IHN0cmlrZSBmb3IgYSBnaXZlbiBzaXplIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVxICAgICAgICAgICA6OiBUaGUgc2l6ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXN0cmlrZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIHNiaXQgc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCi0gIC8qICAgIHNiaXQgc3RyaWtlIGV4aXN0cyBmb3IgdGhlIHNlbGVjdGVkIHBwZW0gdmFsdWVzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX1NldF9TQml0X1N0cmlrZV9PbGRGdW5jKSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICB4X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHlfcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgYXN0cmlrZV9pbmRleCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfQ2hhck1hcF9Mb2FkX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgYSBnaXZlbiBUcnVlVHlwZSBjaGFyYWN0ZXIgbWFwIGludG8gbWVtb3J5LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGN1cnJlbnQgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbWFwICAgOjogQSBwb2ludGVyIHRvIGEgY21hcCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBpbiB1c2UgKGkuZS4sICAgICAgKi8KLSAgLyogICAgb3BlbmVkKS4gIEluIGNhc2Ugb2YgZXJyb3IsIGFsbCBwYXJ0aWFsbHkgYWxsb2NhdGVkIHRhYmxlcyBhcmUgICAgICovCi0gIC8qICAgIHJlbGVhc2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0NoYXJNYXBfTG9hZF9GdW5jKSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBpbnB1dCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfQ2hhck1hcF9GcmVlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYSBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbWFwIDo6IEEgaGFuZGxlIHRvIGEgY21hcCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9DaGFyTWFwX0ZyZWVfRnVuYykoIFRUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgY21hcCApOwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TZXRfU0JpdF9TdHJpa2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWxlY3QgYW4gc2JpdCBzdHJpa2UgZm9yIGEgZ2l2ZW4gc2l6ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcSAgICAgICAgICAgOjogVGhlIHNpemUgcmVxdWVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzdHJpa2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBzYml0IHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLwotICAvKiAgICBzYml0IHN0cmlrZSBleGlzdHMgZm9yIHRoZSBzZWxlY3RlZCBwcGVtIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9TZXRfU0JpdF9TdHJpa2VfRnVuYykoIFRUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICBhc3RyaWtlX2luZGV4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX1N0cmlrZV9NZXRyaWNzX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBtZXRyaWNzIG9mIGEgZ2l2ZW4gc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCAgOjogVGhlIHN0cmlrZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3MgICAgICAgOjogdGhlIG1ldHJpY3Mgb2YgdGhlIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLwotICAvKiAgICBzdWNoIHNiaXQgc3RyaWtlIGV4aXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX1N0cmlrZV9NZXRyaWNzX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfUFNfTmFtZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTbmFtZSA6OiBUaGUgYWRkcmVzcyBvZiBhIHN0cmluZyBwb2ludGVyLiAgV2lsbCBiZSBOVUxMIGluIGNhc2UgICAqLwotICAvKiAgICAgICAgICAgICAgb2YgZXJyb3IsIG90aGVyd2lzZSBpdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGdseXBoIG5hbWUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBZb3UgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmchICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0dldF9QU19OYW1lX0Z1bmMpKCBUVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiogIFBTbmFtZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9NZXRyaWNzX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhIG1ldHJpY3MgdGFibGUsIHdoaWNoIGlzIGEgdGFibGUgd2l0aCBhIGhvcml6b250YWwgYW5kIGEgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCA6OiBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCB0aGUgdmVydGljYWwgb25lLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX01ldHJpY3NfRnVuYykoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICB2ZXJ0aWNhbCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2V0X01ldHJpY3NfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBoZWFkZXIgaW4gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIHZlcnRpY2FsIG1ldHJpY3MuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0dldF9NZXRyaWNzX0Z1bmMpKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICB2ZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICBhYmVhcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgYWFkdmFuY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgYSBnaXZlbiBUcnVlVHlwZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZ1bmN0aW9uIHVzZXMgYGZhY2UtPmdvdG9fdGFibGUnIHRvIHNlZWsgdGhlIHN0cmVhbSB0byB0aGUgICAgICovCi0gIC8qICAgIHN0YXJ0IG9mIHRoZSB0YWJsZSwgZXhjZXB0IHdoaWxlIGxvYWRpbmcgdGhlIGZvbnQgZGlyZWN0b3J5LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfVGFibGVfRnVuYykoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZSBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUVF9GcmVlX1RhYmxlX0Z1bmMpKCBUVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgIFRUX0ZhY2VfR2V0S2VybmluZ0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXR1cm4gdGhlIGhvcml6b250YWwga2VybmluZyB2YWx1ZSBiZXR3ZWVuIHR3byBnbHlwaHMuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KLSAgICogICAgbGVmdF9nbHlwaCAgOjogVGhlIGxlZnQgZ2x5cGggaW5kZXguCi0gICAqICAgIHJpZ2h0X2dseXBoIDo6IFRoZSByaWdodCBnbHlwaCBpbmRleC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgVGhlIGtlcm5pbmcgdmFsdWUgaW4gZm9udCB1bml0cy4KLSAgICovCi0gIHR5cGVkZWYgRlRfSW50Ci0gICgqVFRfRmFjZV9HZXRLZXJuaW5nRnVuYykoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHJpZ2h0X2dseXBoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTRk5UX0ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBob2xkcyBwb2ludGVycyB0byB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gbG9hZCBhbmQgICAgKi8KLSAgLyogICAgZnJlZSB0aGUgYmFzaWMgdGFibGVzIHRoYXQgYXJlIHJlcXVpcmVkIGluIGEgYHNmbnQnIGZvbnQgZmlsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2hlY2sgdGhlIHZhcmlvdXMgeHh4X0Z1bmMoKSBkZXNjcmlwdGlvbnMgZm9yIGRldGFpbHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgU0ZOVF9JbnRlcmZhY2VfCi0gIHsKLSAgICBUVF9Mb2FkZXJfR290b1RhYmxlRnVuYyAgICAgIGdvdG9fdGFibGU7Ci0KLSAgICBUVF9Jbml0X0ZhY2VfRnVuYyAgICAgICAgICAgIGluaXRfZmFjZTsKLSAgICBUVF9Mb2FkX0ZhY2VfRnVuYyAgICAgICAgICAgIGxvYWRfZmFjZTsKLSAgICBUVF9Eb25lX0ZhY2VfRnVuYyAgICAgICAgICAgIGRvbmVfZmFjZTsKLSAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgICAgICAgIGdldF9pbnRlcmZhY2U7Ci0KLSAgICBUVF9Mb2FkX0FueV9GdW5jICAgICAgICAgICAgIGxvYWRfYW55OwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0gICAgVFRfTG9hZF9TRk5UX0hlYWRlclJlY19GdW5jICBsb2FkX3NmbnRfaGVhZGVyOwotICAgIFRUX0xvYWRfRGlyZWN0b3J5X0Z1bmMgICAgICAgbG9hZF9kaXJlY3Rvcnk7Ci0jZW5kaWYKLQotICAgIC8qIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IGBsb2FkX2ZhY2UnIGJ1dCB0aGV5IGNhbiBhbHNvICAqLwotICAgIC8qIGJlIGNhbGxlZCBmcm9tIGV4dGVybmFsIG1vZHVsZXMsIGlmIHRoZXJlIGlzIGEgbmVlZCB0byBkbyBzbyAqLwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9oZWFkOwotICAgIFRUX0xvYWRfTWV0cmljc19GdW5jICAgICAgICAgbG9hZF9oaGVhOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9jbWFwOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9tYXhwOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9vczI7Ci0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX3Bvc3Q7Ci0KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfbmFtZTsKLSAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICAgICAgIGZyZWVfbmFtZTsKLQotICAgIC8qIG9wdGlvbmFsIHRhYmxlcyAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9oZG14X3N0dWI7Ci0gICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICBmcmVlX2hkbXhfc3R1YjsKLSNlbmRpZgotCi0gICAgLyogdGhpcyBmaWVsZCB3YXMgY2FsbGVkIGBsb2FkX2tlcm5pbmcnIHVwIHRvIHZlcnNpb24gMi4xLjEwICovCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2tlcm47Ci0KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfZ2FzcDsKLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfcGNsdDsKLQotICAgIC8qIHNlZSBgdHRsb2FkLmgnOyB0aGlzIGZpZWxkIHdhcyBjYWxsZWQgYGxvYWRfYml0bWFwX2hlYWRlcicgdXAgdG8gKi8KLSAgICAvKiB2ZXJzaW9uIDIuMS4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2JoZWQ7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotICAgIC8qIHNlZSBgdHRzYml0LmgnICovCi0gICAgVFRfU2V0X1NCaXRfU3RyaWtlX09sZEZ1bmMgICBzZXRfc2JpdF9zdHJpa2Vfc3R1YjsKLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfc2JpdHNfc3R1YjsKLQotICAgIC8qCi0gICAgICogIFRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBhcHBlYXJlZCBpbiB2ZXJzaW9uIDIuMS44LCBhbmQgd2VyZSBwbGFjZWQKLSAgICAgKiAgYmV0d2VlbiBgbG9hZF9zYml0cycgYW5kIGBsb2FkX3NiaXRfaW1hZ2UnLiAgV2Ugc3VwcG9ydCB0aGVtIGFzIGEKLSAgICAgKiAgc3BlY2lhbCBleGNlcHRpb24gc2luY2UgdGhleSBhcmUgdXNlZCBieSBYZm9udCBsaWJyYXJ5IHdpdGhpbiB0aGUKLSAgICAgKiAgWC5PcmcgeHNlcnZlciwgYW5kIGJlY2F1c2UgdGhlIHByb2JhYmlsaXR5IHRoYXQgb3RoZXIgcm9ndWUgY2xpZW50cwotICAgICAqICB1c2UgdGhlIG90aGVyIHZlcnNpb24gMi4xLjcgZmllbGRzIGJlbG93IGlzIF9leHRyZW1lbHlfIGxvdy4KLSAgICAgKgotICAgICAqICBOb3RlIHRoYXQgdGhpcyBmb3JjZXMgdXMgdG8gZGlzYWJsZSBhbiBpbnRlcmVzdGluZyBtZW1vcnktc2F2aW5nCi0gICAgICogIG9wdGltaXphdGlvbiB0aG91Z2guLi4KLSAgICAgKi8KLQotICAgIFRUX0ZpbmRfU0JpdF9JbWFnZV9GdW5jICAgICAgZmluZF9zYml0X2ltYWdlOwotICAgIFRUX0xvYWRfU0JpdF9NZXRyaWNzX0Z1bmMgICAgbG9hZF9zYml0X21ldHJpY3M7Ci0KLSNlbmRpZgotCi0gICAgVFRfTG9hZF9TQml0X0ltYWdlX0Z1bmMgICAgICBsb2FkX3NiaXRfaW1hZ2U7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLSAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICAgICAgIGZyZWVfc2JpdHNfc3R1YjsKLSNlbmRpZgotCi0gICAgLyogc2VlIGB0dHBvc3QuaCcgKi8KLSAgICBUVF9HZXRfUFNfTmFtZV9GdW5jICAgICAgICAgIGdldF9wc25hbWU7Ci0gICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICBmcmVlX3BzbmFtZXM7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLSAgICBUVF9DaGFyTWFwX0xvYWRfRnVuYyAgICAgICAgIGxvYWRfY2hhcm1hcF9zdHViOwotICAgIFRUX0NoYXJNYXBfRnJlZV9GdW5jICAgICAgICAgZnJlZV9jaGFybWFwX3N0dWI7Ci0jZW5kaWYKLQotICAgIC8qIHN0YXJ0aW5nIGhlcmUsIHRoZSBzdHJ1Y3R1cmUgZGlmZmVycyBmcm9tIHZlcnNpb24gMi4xLjcgKi8KLQotICAgIC8qIHRoaXMgZmllbGQgd2FzIGludHJvZHVjZWQgaW4gdmVyc2lvbiAyLjEuOCwgbmFtZWQgYGdldF9wc25hbWUnICovCi0gICAgVFRfRmFjZV9HZXRLZXJuaW5nRnVuYyAgICAgICBnZXRfa2VybmluZzsKLQotICAgIC8qIG5ldyBlbGVtZW50cyBpbnRyb2R1Y2VkIGFmdGVyIHZlcnNpb24gMi4xLjEwICovCi0KLSAgICAvKiBsb2FkIHRoZSBmb250IGRpcmVjdG9yeSwgaS5lLiwgdGhlIG9mZnNldCB0YWJsZSBhbmQgKi8KLSAgICAvKiB0aGUgdGFibGUgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfZm9udF9kaXI7Ci0gICAgVFRfTG9hZF9NZXRyaWNzX0Z1bmMgICAgICAgICBsb2FkX2htdHg7Ci0KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfZWJsYzsKLSAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICAgICAgIGZyZWVfZWJsYzsKLQotICAgIFRUX1NldF9TQml0X1N0cmlrZV9GdW5jICAgICAgc2V0X3NiaXRfc3RyaWtlOwotICAgIFRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYyAgbG9hZF9zdHJpa2VfbWV0cmljczsKLQotICAgIFRUX0dldF9NZXRyaWNzX0Z1bmMgICAgICAgICAgZ2V0X21ldHJpY3M7Ci0KLSAgfSBTRk5UX0ludGVyZmFjZTsKLQotCi0gIC8qIHRyYW5zaXRpb25hbCAqLwotICB0eXBlZGVmIFNGTlRfSW50ZXJmYWNlKiAgIFNGTlRfU2VydmljZTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1NGTlRfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDdjNmQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxdHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCYXNpYyBUeXBlMS9UeXBlMiB0eXBlIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24gICAgICAqLwotLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UMVRZUEVTX0hfXwotI2RlZmluZSBfX1QxVFlQRVNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgIFJFUVVJUkVEIFRZUEUxL1RZUEUyIFRBQkxFUyBERUZJTklUSU9OUyAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FbmNvZGluZ1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyBhIGN1c3RvbSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY2hhcnMgIDo6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIGNvZGVzIGluIHRoZSBlbmNvZGluZy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBVc3VhbGx5IDI1Ni4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb2RlX2ZpcnN0IDo6IFRoZSBsb3dlc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGVuY29kaW5nLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvZGVfbGFzdCAgOjogVGhlIGhpZ2hlc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGVuY29kaW5nLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9pbmRleCA6OiBBbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIGdseXBoIGluZGljZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX25hbWUgIDo6IEFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9FbmNvZGluZ1JlY1JlY18KLSAgewotICAgIEZUX0ludCAgICAgICBudW1fY2hhcnM7Ci0gICAgRlRfSW50ICAgICAgIGNvZGVfZmlyc3Q7Ci0gICAgRlRfSW50ICAgICAgIGNvZGVfbGFzdDsKLQotICAgIEZUX1VTaG9ydCogICBjaGFyX2luZGV4OwotICAgIEZUX1N0cmluZyoqICBjaGFyX25hbWU7Ci0KLSAgfSBUMV9FbmNvZGluZ1JlYywgKlQxX0VuY29kaW5nOwotCi0KLSAgdHlwZWRlZiBlbnVtICBUMV9FbmNvZGluZ1R5cGVfCi0gIHsKLSAgICBUMV9FTkNPRElOR19UWVBFX05PTkUgPSAwLAotICAgIFQxX0VOQ09ESU5HX1RZUEVfQVJSQVksCi0gICAgVDFfRU5DT0RJTkdfVFlQRV9TVEFOREFSRCwKLSAgICBUMV9FTkNPRElOR19UWVBFX0lTT0xBVElOMSwKLSAgICBUMV9FTkNPRElOR19UWVBFX0VYUEVSVAotCi0gIH0gVDFfRW5jb2RpbmdUeXBlOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0ZvbnRSZWNfCi0gIHsKLSAgICBQU19Gb250SW5mb1JlYyAgIGZvbnRfaW5mbzsgICAgICAgICAvKiBmb250IGluZm8gZGljdGlvbmFyeSAqLwotICAgIFBTX1ByaXZhdGVSZWMgICAgcHJpdmF0ZV9kaWN0OyAgICAgIC8qIHByaXZhdGUgZGljdGlvbmFyeSAgICovCi0gICAgRlRfU3RyaW5nKiAgICAgICBmb250X25hbWU7ICAgICAgICAgLyogdG9wLWxldmVsIGRpY3Rpb25hcnkgKi8KLQotICAgIFQxX0VuY29kaW5nVHlwZSAgZW5jb2RpbmdfdHlwZTsKLSAgICBUMV9FbmNvZGluZ1JlYyAgIGVuY29kaW5nOwotCi0gICAgRlRfQnl0ZSogICAgICAgICBzdWJyc19ibG9jazsKLSAgICBGVF9CeXRlKiAgICAgICAgIGNoYXJzdHJpbmdzX2Jsb2NrOwotICAgIEZUX0J5dGUqICAgICAgICAgZ2x5cGhfbmFtZXNfYmxvY2s7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgIG51bV9zdWJyczsKLSAgICBGVF9CeXRlKiogICAgICAgIHN1YnJzOwotICAgIEZUX1B0ckRpc3QqICAgICAgc3VicnNfbGVuOwotCi0gICAgRlRfSW50ICAgICAgICAgICBudW1fZ2x5cGhzOwotICAgIEZUX1N0cmluZyoqICAgICAgZ2x5cGhfbmFtZXM7ICAgICAgIC8qIGFycmF5IG9mIGdseXBoIG5hbWVzICAgICAgICovCi0gICAgRlRfQnl0ZSoqICAgICAgICBjaGFyc3RyaW5nczsgICAgICAgLyogYXJyYXkgb2YgZ2x5cGggY2hhcnN0cmluZ3MgKi8KLSAgICBGVF9QdHJEaXN0KiAgICAgIGNoYXJzdHJpbmdzX2xlbjsKLQotICAgIEZUX0J5dGUgICAgICAgICAgcGFpbnRfdHlwZTsKLSAgICBGVF9CeXRlICAgICAgICAgIGZvbnRfdHlwZTsKLSAgICBGVF9NYXRyaXggICAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICAgZm9udF9vZmZzZXQ7Ci0gICAgRlRfQkJveCAgICAgICAgICBmb250X2Jib3g7Ci0gICAgRlRfTG9uZyAgICAgICAgICBmb250X2lkOwotCi0gICAgRlRfRml4ZWQgICAgICAgICBzdHJva2Vfd2lkdGg7Ci0KLSAgfSBUMV9Gb250UmVjLCAqVDFfRm9udDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfU3VicnNSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgIG51bV9zdWJyczsKLSAgICBGVF9CeXRlKiogIGNvZGU7Ci0KLSAgfSBDSURfU3VicnNSZWMsICpDSURfU3VicnM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgQUZNIEZPTlQgSU5GT1JNQVRJT04gU1RSVUNUVVJFUyAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9UcmFja0tlcm5SZWNfCi0gIHsKLSAgICBGVF9JbnQgICAgZGVncmVlOwotICAgIEZUX0ZpeGVkICBtaW5fcHRzaXplOwotICAgIEZUX0ZpeGVkICBtaW5fa2VybjsKLSAgICBGVF9GaXhlZCAgbWF4X3B0c2l6ZTsKLSAgICBGVF9GaXhlZCAgbWF4X2tlcm47Ci0KLSAgfSBBRk1fVHJhY2tLZXJuUmVjLCAqQUZNX1RyYWNrS2VybjsKLQotICB0eXBlZGVmIHN0cnVjdCAgQUZNX0tlcm5QYWlyUmVjXwotICB7Ci0gICAgRlRfSW50ICBpbmRleDE7Ci0gICAgRlRfSW50ICBpbmRleDI7Ci0gICAgRlRfSW50ICB4OwotICAgIEZUX0ludCAgeTsKLQotICB9IEFGTV9LZXJuUGFpclJlYywgKkFGTV9LZXJuUGFpcjsKLQotICB0eXBlZGVmIHN0cnVjdCAgQUZNX0ZvbnRJbmZvUmVjXwotICB7Ci0gICAgRlRfQm9vbCAgICAgICAgSXNDSURGb250OwotICAgIEZUX0JCb3ggICAgICAgIEZvbnRCQm94OwotICAgIEZUX0ZpeGVkICAgICAgIEFzY2VuZGVyOwotICAgIEZUX0ZpeGVkICAgICAgIERlc2NlbmRlcjsKLSAgICBBRk1fVHJhY2tLZXJuICBUcmFja0tlcm5zOyAgIC8qIGZyZWUgaWYgbm9uLU5VTEwgKi8KLSAgICBGVF9JbnQgICAgICAgICBOdW1UcmFja0tlcm47Ci0gICAgQUZNX0tlcm5QYWlyICAgS2VyblBhaXJzOyAgICAvKiBmcmVlIGlmIG5vbi1OVUxMICovCi0gICAgRlRfSW50ICAgICAgICAgTnVtS2VyblBhaXI7Ci0KLSAgfSBBRk1fRm9udEluZm9SZWMsICpBRk1fRm9udEluZm87Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgT1JJR0lOQUwgVDFfRkFDRSBDTEFTUyBERUZJTklUSU9OICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICB0eXBlZGVmIHN0cnVjdCBUMV9GYWNlUmVjXyogICBUMV9GYWNlOwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZVJlY18qICBDSURfRmFjZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9GYWNlUmVjXwotICB7Ci0gICAgRlRfRmFjZVJlYyAgICAgIHJvb3Q7Ci0gICAgVDFfRm9udFJlYyAgICAgIHR5cGUxOwotICAgIGNvbnN0IHZvaWQqICAgICBwc25hbWVzOwotICAgIGNvbnN0IHZvaWQqICAgICBwc2F1eDsKLSAgICBjb25zdCB2b2lkKiAgICAgYWZtX2RhdGE7Ci0gICAgRlRfQ2hhck1hcFJlYyAgIGNoYXJtYXByZWNzWzJdOwotICAgIEZUX0NoYXJNYXAgICAgICBjaGFybWFwc1syXTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotICAgIFBTX1VuaWNvZGVzICAgICB1bmljb2RlX21hcDsKLSNlbmRpZgotCi0gICAgLyogc3VwcG9ydCBmb3IgTXVsdGlwbGUgTWFzdGVycyBmb250cyAqLwotICAgIFBTX0JsZW5kICAgICAgICBibGVuZDsKLQotICAgIC8qIHVuZG9jdW1lbnRlZCwgb3B0aW9uYWw6IGluZGljZXMgb2Ygc3Vicm91dGluZXMgdGhhdCBleHByZXNzICAgICAgKi8KLSAgICAvKiB0aGUgTm9ybWFsaXplRGVzaWduVmVjdG9yIGFuZCB0aGUgQ29udmVydERlc2lnblZlY3RvciBwcm9jZWR1cmUsICovCi0gICAgLyogcmVzcGVjdGl2ZWx5LCBhcyBUeXBlIDIgY2hhcnN0cmluZ3M7IC0xIGlmIGtleXdvcmRzIG5vdCBwcmVzZW50ICAqLwotICAgIEZUX0ludCAgICAgICAgICAgbmR2X2lkeDsKLSAgICBGVF9JbnQgICAgICAgICAgIGNkdl9pZHg7Ci0KLSAgICAvKiB1bmRvY3VtZW50ZWQsIG9wdGlvbmFsOiBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBsZW5fYnVpbGRjaGFyICovCi0gICAgLyogZm9yIFR5cGUgMiBmb250czsgbWFuaXB1bGF0ZWQgYnkgb3RoZXJzdWJycyAxOSwgMjQsIGFuZCAyNSAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgbGVuX2J1aWxkY2hhcjsKLSAgICBGVF9JbnQqICAgICAgICAgIGJ1aWxkY2hhcjsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xIC0gaW50ZXJmYWNlIHRvIFBvc3RTY3JpcHQgaGludGVyICovCi0gICAgY29uc3Qgdm9pZCogICAgIHBzaGludGVyOwotCi0gIH0gVDFfRmFjZVJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZVJlY18KLSAgewotICAgIEZUX0ZhY2VSZWMgICAgICAgcm9vdDsKLSAgICB2b2lkKiAgICAgICAgICAgIHBzbmFtZXM7Ci0gICAgdm9pZCogICAgICAgICAgICBwc2F1eDsKLSAgICBDSURfRmFjZUluZm9SZWMgIGNpZDsKLSAgICB2b2lkKiAgICAgICAgICAgIGFmbV9kYXRhOwotICAgIENJRF9TdWJycyAgICAgICAgc3VicnM7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMSAtIGludGVyZmFjZSB0byBQb3N0U2NyaXB0IGhpbnRlciAqLwotICAgIHZvaWQqICAgICAgICAgICAgcHNoaW50ZXI7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMS44LCBidXQgd2FzIG9yaWdpbmFsbHkgcG9zaXRpb25lZCBhZnRlciBgYWZtX2RhdGEnICovCi0gICAgRlRfQnl0ZSogICAgICAgICBiaW5hcnlfZGF0YTsgLyogdXNlZCBpZiBoZXggZGF0YSBoYXMgYmVlbiBjb252ZXJ0ZWQgKi8KLSAgICBGVF9TdHJlYW0gICAgICAgIGNpZF9zdHJlYW07Ci0KLSAgfSBDSURfRmFjZVJlYzsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1QxVFlQRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWZjMjdmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgU0ZOVC9UcnVlVHlwZSB0eXBlIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24gICAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggYnkgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRUWVBFU19IX18KLSNkZWZpbmUgX19UVFRZUEVTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICBSRVFVSVJFRCBUUlVFVFlQRS9PUEVOVFlQRSBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUQ19IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLiAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgb2Zmc2V0cyBvZiAgICAqLwotICAvKiAgICB0aGUgZm9udCBoZWFkZXJzIG9mIGVhY2ggZGlzdGluY3QgVHJ1ZVR5cGUgZmFjZSBpbiB0aGUgZmlsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgICAgIDo6IE11c3QgYmUgYHR0YyAnIHRvIGluZGljYXRlIGEgVHJ1ZVR5cGUgY29sbGVjdGlvbi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgICA6OiBUaGUgbnVtYmVyIG9mIGZhY2VzIGluIHRoZSBjb2xsZWN0aW9uLiAgVGhlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBzYXlzIHRoaXMgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGxvbmcsIGJ1dCAqLwotICAvKiAgICAgICAgICAgICAgIHdlIHVzZSBhIHNpZ25lZCBsb25nIHNpbmNlIHdlIG5lZWQgdGhlIHZhbHVlIC0xIGZvciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBzcGVjaWZpYyBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXRzIDo6IFRoZSBvZmZzZXRzIG9mIHRoZSBmb250IGhlYWRlcnMsIG9uZSBwZXIgZmFjZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVENfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICB0YWc7Ci0gICAgRlRfRml4ZWQgICB2ZXJzaW9uOwotICAgIEZUX0xvbmcgICAgY291bnQ7Ci0gICAgRlRfVUxvbmcqICBvZmZzZXRzOwotCi0gIH0gVFRDX0hlYWRlclJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlRfSGVhZGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlQgZmlsZSBmb3JtYXQgaGVhZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdF90YWcgICAgIDo6IFRoZSBmb250IGZvcm1hdCB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3RhYmxlcyAgICAgOjogVGhlIG51bWJlciBvZiB0YWJsZXMgaW4gZmlsZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZWFyY2hfcmFuZ2UgICA6OiBNdXN0IGJlIGAxNiAqIChtYXggcG93ZXIgb2YgMiA8PSBudW1fdGFibGVzKScuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVudHJ5X3NlbGVjdG9yIDo6IE11c3QgYmUgbG9nMiBvZiBgc2VhcmNoX3JhbmdlIC8gMTYnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFuZ2Vfc2hpZnQgICAgOjogTXVzdCBiZSBgbnVtX3RhYmxlcyAqIDE2IC0gc2VhcmNoX3JhbmdlJy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgU0ZOVF9IZWFkZXJSZWNfCi0gIHsKLSAgICBGVF9VTG9uZyAgIGZvcm1hdF90YWc7Ci0gICAgRlRfVVNob3J0ICBudW1fdGFibGVzOwotICAgIEZUX1VTaG9ydCAgc2VhcmNoX3JhbmdlOwotICAgIEZUX1VTaG9ydCAgZW50cnlfc2VsZWN0b3I7Ci0gICAgRlRfVVNob3J0ICByYW5nZV9zaGlmdDsKLQotICAgIEZUX1VMb25nICAgb2Zmc2V0OyAgLyogbm90IGluIGZpbGUgKi8KLQotICB9IFNGTlRfSGVhZGVyUmVjLCAqU0ZOVF9IZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9UYWJsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBnaXZlbiB0YWJsZSBvZiBhIFRydWVUeXBlIGZvbnQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUYWcgICAgICA6OiBBIGZvdXItYnl0ZXMgdGFnIGRlc2NyaWJpbmcgdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrU3VtIDo6IFRoZSB0YWJsZSBjaGVja3N1bS4gIFRoaXMgdmFsdWUgY2FuIGJlIGlnbm9yZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT2Zmc2V0ICAgOjogVGhlIG9mZnNldCBvZiB0aGUgdGFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFRydWVUeXBlICovCi0gIC8qICAgICAgICAgICAgICAgIGZvbnQgaW4gaXRzIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGVuZ3RoICAgOjogVGhlIHRhYmxlIGxlbmd0aCAoaW4gYnl0ZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfVGFibGVSZWNfCi0gIHsKLSAgICBGVF9VTG9uZyAgVGFnOyAgICAgICAgLyogICAgICAgIHRhYmxlIHR5cGUgKi8KLSAgICBGVF9VTG9uZyAgQ2hlY2tTdW07ICAgLyogICAgdGFibGUgY2hlY2tzdW0gKi8KLSAgICBGVF9VTG9uZyAgT2Zmc2V0OyAgICAgLyogdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgICBGVF9VTG9uZyAgTGVuZ3RoOyAgICAgLyogICAgICB0YWJsZSBsZW5ndGggKi8KLQotICB9IFRUX1RhYmxlUmVjLCAqVFRfVGFibGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb25nTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyB0aGUgbG9uZyBtZXRyaWNzIG9mIHRoZSBgaG10eCcgYW5kIGB2bXR4JyAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgdGFibGVzLiAgVGhlIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB3aWR0aCBvciBoZWlnaHQgZm9yIHRoZSBnbHlwaC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZWFyaW5nIDo6IFRoZSBsZWZ0LXNpZGUgb3IgdG9wLXNpZGUgYmVhcmluZyBmb3IgdGhlIGdseXBoLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Mb25nTWV0cmljc1JlY18KLSAgewotICAgIEZUX1VTaG9ydCAgYWR2YW5jZTsKLSAgICBGVF9TaG9ydCAgIGJlYXJpbmc7Ci0KLSAgfSBUVF9Mb25nTWV0cmljc1JlYywgKlRUX0xvbmdNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2hvcnRNZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgdHlwZSB0byBtb2RlbCB0aGUgc2hvcnQgbWV0cmljcyBvZiB0aGUgYGhtdHgnIGFuZCBgdm10eCcgICovCi0gIC8qICAgIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9TaG9ydCAgVFRfU2hvcnRNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTmFtZUVudHJ5UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgVHJ1ZVR5cGUgbmFtZSByZWNvcmRzLiAgTmFtZSByZWNvcmRzIGFyZSB1c2VkICovCi0gIC8qICAgIHRvIHN0b3JlIGltcG9ydGFudCBzdHJpbmdzIGxpa2UgZmFtaWx5IG5hbWUsIHN0eWxlIG5hbWUsICAgICAgICAgICAqLwotICAvKiAgICBjb3B5cmlnaHQsIGV0Yy4gaW4gX2xvY2FsaXplZF8gdmVyc2lvbnMgKGkuZS4sIGxhbmd1YWdlLCBlbmNvZGluZywgKi8KLSAgLyogICAgZXRjKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGxhdGZvcm1JRCAgIDo6IFRoZSBJRCBvZiB0aGUgbmFtZSdzIGVuY29kaW5nIHBsYXRmb3JtLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZ0lEICAgOjogVGhlIHBsYXRmb3JtLXNwZWNpZmljIElEIGZvciB0aGUgbmFtZSdzIGVuY29kaW5nLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhbmd1YWdlSUQgICA6OiBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgSUQgZm9yIHRoZSBuYW1lJ3MgbGFuZ3VhZ2UuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZUlEICAgICAgIDo6IFRoZSBJRCBzcGVjaWZ5aW5nIHdoYXQga2luZCBvZiBuYW1lIHRoaXMgaXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmdMZW5ndGggOjogVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZ09mZnNldCA6OiBUaGUgb2Zmc2V0IHRvIHRoZSBzdHJpbmcgaW4gdGhlIGBuYW1lJyB0YWJsZS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgc3RyaW5nJ3MgYnl0ZXMuICBOb3RlIHRoYXQgdGhlc2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBhcmUgdXN1YWxseSBVVEYtMTYgZW5jb2RlZCBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX05hbWVFbnRyeVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgcGxhdGZvcm1JRDsKLSAgICBGVF9VU2hvcnQgIGVuY29kaW5nSUQ7Ci0gICAgRlRfVVNob3J0ICBsYW5ndWFnZUlEOwotICAgIEZUX1VTaG9ydCAgbmFtZUlEOwotICAgIEZUX1VTaG9ydCAgc3RyaW5nTGVuZ3RoOwotICAgIEZUX1VMb25nICAgc3RyaW5nT2Zmc2V0OwotCi0gICAgLyogdGhpcyBsYXN0IGZpZWxkIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzcGVjICovCi0gICAgLyogYnV0IHVzZWQgYnkgdGhlIEZyZWVUeXBlIGVuZ2luZSAgICAgICAgICAgICovCi0KLSAgICBGVF9CeXRlKiAgIHN0cmluZzsKLQotICB9IFRUX05hbWVFbnRyeVJlYywgKlRUX05hbWVFbnRyeTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX05hbWVUYWJsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSBuYW1lIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgICAgICAgIDo6IFRoZSBmb3JtYXQgb2YgdGhlIG5hbWUgdGFibGUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtTmFtZVJlY29yZHMgOjogVGhlIG51bWJlciBvZiBuYW1lcyBpbiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdG9yYWdlT2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBuYW1lIHRhYmxlIGluIHRoZSBgbmFtZScgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lcyAgICAgICAgICA6OiBBbiBhcnJheSBvZiBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgICAgIDo6IHRoZSBmaWxlJ3MgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX05hbWVUYWJsZVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgICAgICAgIGZvcm1hdDsKLSAgICBGVF9VSW50ICAgICAgICAgICBudW1OYW1lUmVjb3JkczsKLSAgICBGVF9VSW50ICAgICAgICAgICBzdG9yYWdlT2Zmc2V0OwotICAgIFRUX05hbWVFbnRyeVJlYyogIG5hbWVzOwotICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbTsKLQotICB9IFRUX05hbWVUYWJsZVJlYywgKlRUX05hbWVUYWJsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICBPUFRJT05BTCBUUlVFVFlQRS9PUEVOVFlQRSBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dhc3BSYW5nZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdGlueSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIGdhc3AgcmFuZ2UgYWNjb3JkaW5nIHRvIHRoZSAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhQUEVNICA6OiBUaGUgbWF4aW11bSBwcGVtIHZhbHVlIHRvIHdoaWNoIGBnYXNwRmxhZycgYXBwbGllcy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdhc3BGbGFnIDo6IEEgZmxhZyBkZXNjcmliaW5nIHRoZSBncmlkLWZpdHRpbmcgYW5kIGFudGktYWxpYXNpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICBtb2RlcyB0byBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9HYXNwUmFuZ2VSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIG1heFBQRU07Ci0gICAgRlRfVVNob3J0ICBnYXNwRmxhZzsKLQotICB9IFRUX0dhc3BSYW5nZVJlYywgKlRUX0dhc3BSYW5nZTsKLQotCi0jZGVmaW5lIFRUX0dBU1BfR1JJREZJVCAgMHgwMQotI2RlZmluZSBUVF9HQVNQX0RPR1JBWSAgIDB4MDIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dhc3BSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSBgZ2FzcCcgdGFibGUgdXNlZCB0byBzcGVjaWZ5ICAgICAqLwotICAvKiAgICBncmlkLWZpdHRpbmcgYW5kIGFudGktYWxpYXNpbmcgYmVoYXZpb3VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uICAgIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bVJhbmdlcyAgOjogVGhlIG51bWJlciBvZiBnYXNwIHJhbmdlcyBpbiB0YWJsZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2FzcFJhbmdlcyA6OiBBbiBhcnJheSBvZiBnYXNwIHJhbmdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfR2FzcF8KLSAgewotICAgIEZUX1VTaG9ydCAgICAgdmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgICAgIG51bVJhbmdlczsKLSAgICBUVF9HYXNwUmFuZ2UgIGdhc3BSYW5nZXM7Ci0KLSAgfSBUVF9HYXNwUmVjOwotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9IZG14RW50cnlSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNtYWxsIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBwcmUtY29tcHV0ZWQgd2lkdGhzIG9mIGEgZ2l2ZW4gKi8KLSAgLyogICAgc2l6ZS4gIFRoZXkgYXJlIGZvdW5kIGluIHRoZSBgaGRteCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHBlbSAgICAgIDo6IFRoZSBwaXhlbHMgcGVyIEVNIHZhbHVlIGF0IHdoaWNoIHRoZXNlIG1ldHJpY3MgYXBwbHkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfd2lkdGggOjogVGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBmb3IgdGhpcyBtZXRyaWMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRocyAgICA6OiBBbiBhcnJheSBvZiB3aWR0aHMuICBOb3RlOiBUaGVzZSBhcmUgOC1iaXQgYnl0ZXMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hkbXhFbnRyeVJlY18KLSAgewotICAgIEZUX0J5dGUgICBwcGVtOwotICAgIEZUX0J5dGUgICBtYXhfd2lkdGg7Ci0gICAgRlRfQnl0ZSogIHdpZHRoczsKLQotICB9IFRUX0hkbXhFbnRyeVJlYywgKlRUX0hkbXhFbnRyeTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0hkbXhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIGBoZG14JyB0YWJsZSwgd2hpY2ggY29udGFpbnMgICAgICAgICAqLwotICAvKiAgICBwcmUtY29tcHV0ZWQgd2lkdGhzIGZvciBhIHNldCBvZiBnaXZlbiBzaXplcy9kaW1lbnNpb25zLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uICAgICA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9yZWNvcmRzIDo6IFRoZSBudW1iZXIgb2YgaGRteCByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVjb3JkcyAgICAgOjogQW4gYXJyYXkgb2YgaGRteCByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfSGRteFJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgICAgdmVyc2lvbjsKLSAgICBGVF9TaG9ydCAgICAgIG51bV9yZWNvcmRzOwotICAgIFRUX0hkbXhFbnRyeSAgcmVjb3JkczsKLQotICB9IFRUX0hkbXhSZWMsICpUVF9IZG14OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfS2VybjBfUGFpclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIGtlcm5pbmcgcGFpciBmb3IgdGhlIGtlcm5pbmcgdGFibGUgICAgICovCi0gIC8qICAgIGZvcm1hdCAwLiAgVGhlIGVuZ2luZSBub3cgbG9hZHMgdGhpcyB0YWJsZSBpZiBpdCBmaW5kcyBvbmUgaW4gdGhlICAqLwotICAvKiAgICBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0ICA6OiBUaGUgaW5kZXggb2YgdGhlIGxlZnQgZ2x5cGggaW4gcGFpci4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJpZ2h0IDo6IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGggaW4gcGFpci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmFsdWUgOjogVGhlIGtlcm5pbmcgZGlzdGFuY2UuICBBIHBvc2l0aXZlIHZhbHVlIHNwYWNlcyB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgIGdseXBocywgYSBuZWdhdGl2ZSBvbmUgbWFrZXMgdGhlbSBjbG9zZXIuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0tlcm4wX1BhaXJSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIGxlZnQ7ICAgLyogaW5kZXggb2YgbGVmdCAgZ2x5cGggaW4gcGFpciAqLwotICAgIEZUX1VTaG9ydCAgcmlnaHQ7ICAvKiBpbmRleCBvZiByaWdodCBnbHlwaCBpbiBwYWlyICovCi0gICAgRlRfRldvcmQgICB2YWx1ZTsgIC8qIGtlcm5pbmcgdmFsdWUgICAgICAgICAgICAgICAgKi8KLQotICB9IFRUX0tlcm4wX1BhaXJSZWMsICpUVF9LZXJuMF9QYWlyOwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgIEVNQkVEREVEIEJJVE1BUFMgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X01ldHJpY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGJpZyBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggYml0bWFwICAgKi8KLSAgLyogICAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250LiAgVGhlc2UgYXJlIHVzdWFsbHkgZm91bmQgaW4gdGhlICAgICovCi0gIC8qICAgIGBFQkRUJyAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgICAgICA6OiBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgICAgIDo6IFRoZSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpQmVhcmluZ1ggOjogVGhlIGhvcml6b250YWwgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlCZWFyaW5nWSA6OiBUaGUgaG9yaXpvbnRhbCB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUFkdmFuY2UgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0QmVhcmluZ1ggOjogVGhlIHZlcnRpY2FsIGxlZnQgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRCZWFyaW5nWSA6OiBUaGUgdmVydGljYWwgdG9wIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEFkdmFuY2UgIDo6IFRoZSB2ZXJ0aWNhbCBhZHZhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9NZXRyaWNzUmVjXwotICB7Ci0gICAgRlRfQnl0ZSAgaGVpZ2h0OwotICAgIEZUX0J5dGUgIHdpZHRoOwotCi0gICAgRlRfQ2hhciAgaG9yaUJlYXJpbmdYOwotICAgIEZUX0NoYXIgIGhvcmlCZWFyaW5nWTsKLSAgICBGVF9CeXRlICBob3JpQWR2YW5jZTsKLQotICAgIEZUX0NoYXIgIHZlcnRCZWFyaW5nWDsKLSAgICBGVF9DaGFyICB2ZXJ0QmVhcmluZ1k7Ci0gICAgRlRfQnl0ZSAgdmVydEFkdmFuY2U7Ci0KLSAgfSBUVF9TQml0X01ldHJpY3NSZWMsICpUVF9TQml0X01ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X1NtYWxsTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIHNtYWxsIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCBiaXRtYXAgKi8KLSAgLyogICAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250LiAgVGhlc2UgYXJlIHVzdWFsbHkgZm91bmQgaW4gdGhlICAgICovCi0gIC8qICAgIGBFQkRUJyAoTWljcm9zb2Z0KSBvciB0aGUgYGJkYXQnIChBcHBsZSkgdGFibGUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgIDo6IFRoZSBnbHlwaCBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgOjogVGhlIGdseXBoIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZWFyaW5nWCA6OiBUaGUgbGVmdC1zaWRlIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJlYXJpbmdZIDo6IFRoZSB0b3Atc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSAgOjogVGhlIGFkdmFuY2Ugd2lkdGggb3IgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TbWFsbF9NZXRyaWNzXwotICB7Ci0gICAgRlRfQnl0ZSAgaGVpZ2h0OwotICAgIEZUX0J5dGUgIHdpZHRoOwotCi0gICAgRlRfQ2hhciAgYmVhcmluZ1g7Ci0gICAgRlRfQ2hhciAgYmVhcmluZ1k7Ci0gICAgRlRfQnl0ZSAgYWR2YW5jZTsKLQotICB9IFRUX1NCaXRfU21hbGxNZXRyaWNzUmVjLCAqVFRfU0JpdF9TbWFsbE1ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSB0ZXh0IGxpbmUgbWV0cmljcyBvZiBhIGdpdmVuICAgICAgKi8KLSAgLyogICAgYml0bWFwIHN0cmlrZSwgZm9yIGVpdGhlciBhIGhvcml6b250YWwgb3IgdmVydGljYWwgbGF5b3V0LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNjZW5kZXIgICAgICAgICAgICAgICAgOjogVGhlIGFzY2VuZGVyIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZXNjZW5kZXIgICAgICAgICAgICAgICA6OiBUaGUgZGVzY2VuZGVyIGluIHBpeGVscy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF93aWR0aCAgICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIGdseXBoIHdpZHRoIGluIHBpeGVscy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfc2xvcGVfZW51bWVyYXRvciAgOjogUmlzZSBvZiB0aGUgY2FyZXQgc2xvcGUsIHR5cGljYWxseSBzZXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIDEgZm9yIG5vbi1pdGFsaWMgZm9udHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfc2xvcGVfZGVub21pbmF0b3IgOjogUmlzZSBvZiB0aGUgY2FyZXQgc2xvcGUsIHR5cGljYWxseSBzZXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIDAgZm9yIG5vbi1pdGFsaWMgZm9udHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfb2Zmc2V0ICAgICAgICAgICAgOjogT2Zmc2V0IGluIHBpeGVscyB0byBtb3ZlIHRoZSBjYXJldCBmb3IgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlciBwb3NpdGlvbmluZy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX29yaWdpbl9TQiAgICAgICAgICAgOjogTWluaW11bSBvZiBob3JpQmVhcmluZ1ggKHJlc3AuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRCZWFyaW5nWSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fYWR2YW5jZV9TQiAgICAgICAgICA6OiBNaW5pbXVtIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBhZHZhbmNlIC0gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBob3JpQmVhcmluZ1ggKyB3aWR0aCApICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBhZHZhbmNlIC0gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHZlcnRCZWFyaW5nWSArIGhlaWdodCApICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2JlZm9yZV9CTCAgICAgICAgICAgOjogTWF4aW11bSBvZiBob3JpQmVhcmluZ1kgKHJlc3AuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRCZWFyaW5nWSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX2FmdGVyX0JMICAgICAgICAgICAgOjogTWluaW11bSBvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcmlCZWFyaW5nWSAtIGhlaWdodCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1ggLSB3aWR0aCAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYWRzICAgICAgICAgICAgICAgICAgICA6OiBVbnVzZWQgKHRvIG1ha2UgdGhlIHNpemUgb2YgdGhlIHJlY29yZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtdWx0aXBsZSBvZiAzMiBiaXRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9MaW5lTWV0cmljc1JlY18KLSAgewotICAgIEZUX0NoYXIgIGFzY2VuZGVyOwotICAgIEZUX0NoYXIgIGRlc2NlbmRlcjsKLSAgICBGVF9CeXRlICBtYXhfd2lkdGg7Ci0gICAgRlRfQ2hhciAgY2FyZXRfc2xvcGVfbnVtZXJhdG9yOwotICAgIEZUX0NoYXIgIGNhcmV0X3Nsb3BlX2Rlbm9taW5hdG9yOwotICAgIEZUX0NoYXIgIGNhcmV0X29mZnNldDsKLSAgICBGVF9DaGFyICBtaW5fb3JpZ2luX1NCOwotICAgIEZUX0NoYXIgIG1pbl9hZHZhbmNlX1NCOwotICAgIEZUX0NoYXIgIG1heF9iZWZvcmVfQkw7Ci0gICAgRlRfQ2hhciAgbWluX2FmdGVyX0JMOwotICAgIEZUX0NoYXIgIHBhZHNbMl07Ci0KLSAgfSBUVF9TQml0X0xpbmVNZXRyaWNzUmVjLCAqVFRfU0JpdF9MaW5lTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfUmFuZ2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgVHJ1ZVR5cGUvT3BlblR5cGUgc3ViSW5kZXhUYWJsZSBhcyBkZWZpbmVkIGluIHRoZSBgRUJMQycgICAgICAgICAqLwotICAvKiAgICAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaXJzdF9nbHlwaCAgIDo6IFRoZSBmaXJzdCBnbHlwaCBpbmRleCBpbiB0aGUgcmFuZ2UuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhc3RfZ2x5cGggICAgOjogVGhlIGxhc3QgZ2x5cGggaW5kZXggaW4gdGhlIHJhbmdlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5kZXhfZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIGluZGV4IHRhYmxlLiAgVmFsaWQgdmFsdWVzIGFyZSAxICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdG8gNS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1hZ2VfZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIGBFQkRUJyBpbWFnZSBkYXRhLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbWFnZV9vZmZzZXQgIDo6IFRoZSBvZmZzZXQgdG8gaW1hZ2UgZGF0YSBpbiBgRUJEVCcuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGltYWdlX3NpemUgICAgOjogRm9yIGluZGV4IGZvcm1hdHMgMiBhbmQgNS4gIFRoaXMgaXMgdGhlIHNpemUgaW4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIGVhY2ggZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpZ19tZXRyaWNzICAgOjogRm9yIGluZGV4IGZvcm1hdHMgMiBhbmQgNS4gIFRoaXMgaXMgdGhlIGJpZyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MgZm9yIGVhY2ggZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9nbHlwaHMgICAgOjogRm9yIGluZGV4IGZvcm1hdHMgNCBhbmQgNS4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIGdseXBocyBpbiB0aGUgY29kZSBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX29mZnNldHMgOjogRm9yIGluZGV4IGZvcm1hdHMgMSBhbmQgMy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfY29kZXMgICA6OiBGb3IgaW5kZXggZm9ybWF0cyA0IGFuZCA1LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZV9vZmZzZXQgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIGluZGV4IHRhYmxlIGluIHRoZSBgRUJMQycgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIE9ubHkgdXNlZCBkdXJpbmcgc3RyaWtlIGxvYWRpbmcuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9SYW5nZVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgICAgICAgICAgZmlyc3RfZ2x5cGg7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICBsYXN0X2dseXBoOwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgICBpbmRleF9mb3JtYXQ7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICBpbWFnZV9mb3JtYXQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICBpbWFnZV9vZmZzZXQ7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgIGltYWdlX3NpemU7Ci0gICAgVFRfU0JpdF9NZXRyaWNzUmVjICBtZXRyaWNzOwotICAgIEZUX1VMb25nICAgICAgICAgICAgbnVtX2dseXBoczsKLQotICAgIEZUX1VMb25nKiAgICAgICAgICAgZ2x5cGhfb2Zmc2V0czsKLSAgICBGVF9VU2hvcnQqICAgICAgICAgIGdseXBoX2NvZGVzOwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICB0YWJsZV9vZmZzZXQ7Ci0KLSAgfSBUVF9TQml0X1JhbmdlUmVjLCAqVFRfU0JpdF9SYW5nZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfU3RyaWtlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZGVzY3JpYmUgYSBnaXZlbiBiaXRtYXAgc3RyaWtlIGluIHRoZSBgRUJMQycgICAgICAqLwotICAvKiAgICAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIG51bV9pbmRleF9yYW5nZXMgOjogVGhlIG51bWJlciBvZiBpbmRleCByYW5nZXMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgaW5kZXhfcmFuZ2VzICAgICA6OiBBbiBhcnJheSBvZiBnbHlwaCBpbmRleCByYW5nZXMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjb2xvcl9yZWYgICAgICAgIDo6IFVudXNlZC4gIGBjb2xvcl9yZWYnIGlzIHB1dCBpbiBmb3IgZnV0dXJlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudHMsIGJ1dCB0aGVzZSBmaWVsZHMgYXJlIGFscmVhZHkgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgaW4gdXNlIGJ5IG90aGVyIHBsYXRmb3JtcyAoZS5nLiBOZXd0b24pLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBwbGVhc2Ugc2VlICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vZm9udHMuYXBwbGUuY29tLyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUUmVmTWFuL1JNMDYvQ2hhcDZibG9jLmh0bWwgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGhvcmkgICAgICAgICAgICAgOjogVGhlIGxpbmUgbWV0cmljcyBmb3IgaG9yaXpvbnRhbCBsYXlvdXRzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgdmVydCAgICAgICAgICAgICA6OiBUaGUgbGluZSBtZXRyaWNzIGZvciB2ZXJ0aWNhbCBsYXlvdXRzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydF9nbHlwaCAgICAgIDo6IFRoZSBsb3dlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGVuZF9nbHlwaCAgICAgICAgOjogVGhlIGhpZ2hlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeF9wcGVtICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB5X3BwZW0gICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgdmVydGljYWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGJpdF9kZXB0aCAgICAgICAgOjogVGhlIGJpdCBkZXB0aC4gIFZhbGlkIHZhbHVlcyBhcmUgMSwgMiwgNCwgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGFuZCA4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZsYWdzICAgICAgICAgICAgOjogSXMgdGhpcyBhIHZlcnRpY2FsIG9yIGhvcml6b250YWwgc3RyaWtlPyAgRm9yICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMsIHBsZWFzZSBzZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vZm9udHMuYXBwbGUuY29tLyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUUmVmTWFuL1JNMDYvQ2hhcDZibG9jLmh0bWwgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TdHJpa2VSZWNfCi0gIHsKLSAgICBGVF9JbnQgICAgICAgICAgICAgICAgICBudW1fcmFuZ2VzOwotICAgIFRUX1NCaXRfUmFuZ2UgICAgICAgICAgIHNiaXRfcmFuZ2VzOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgIHJhbmdlc19vZmZzZXQ7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICBjb2xvcl9yZWY7Ci0KLSAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICBob3JpOwotICAgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWMgIHZlcnQ7Ci0KLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICBzdGFydF9nbHlwaDsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICBlbmRfZ2x5cGg7Ci0KLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB4X3BwZW07Ci0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeV9wcGVtOwotCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgYml0X2RlcHRoOwotICAgIEZUX0NoYXIgICAgICAgICAgICAgICAgIGZsYWdzOwotCi0gIH0gVFRfU0JpdF9TdHJpa2VSZWMsICpUVF9TQml0X1N0cmlrZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfQ29tcG9uZW50UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIGNvbXBvdW5kIHNiaXQgZWxlbWVudC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2NvZGUgOjogVGhlIGVsZW1lbnQncyBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9vZmZzZXQgICA6OiBUaGUgZWxlbWVudCdzIGxlZnQgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X29mZnNldCAgIDo6IFRoZSBlbGVtZW50J3MgdG9wIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X0NvbXBvbmVudFJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgZ2x5cGhfY29kZTsKLSAgICBGVF9DaGFyICAgIHhfb2Zmc2V0OwotICAgIEZUX0NoYXIgICAgeV9vZmZzZXQ7Ci0KLSAgfSBUVF9TQml0X0NvbXBvbmVudFJlYywgKlRUX1NCaXRfQ29tcG9uZW50OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9TY2FsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCBkZXNjcmliZSBhIGdpdmVuIGJpdG1hcCBzY2FsaW5nIHRhYmxlLCBhcyBkZWZpbmVkICovCi0gIC8qICAgIGluIHRoZSBgRUJTQycgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmkgICAgICAgICAgICAgIDo6IFRoZSBob3Jpem9udGFsIGxpbmUgbWV0cmljcy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydCAgICAgICAgICAgICAgOjogVGhlIHZlcnRpY2FsIGxpbmUgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3BwZW0gICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfcHBlbSAgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgdmVydGljYWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9wcGVtX3N1YnN0aXR1dGUgOjogU3Vic3RpdHV0aW9uIHhfcHBlbSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW1fc3Vic3RpdHV0ZSA6OiBTdWJzdGl0dXRpb24geV9wcGVtIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X1NjYWxlUmVjXwotICB7Ci0gICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgaG9yaTsKLSAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICB2ZXJ0OwotCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeF9wcGVtOwotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHlfcHBlbTsKLQotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHhfcHBlbV9zdWJzdGl0dXRlOwotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHlfcHBlbV9zdWJzdGl0dXRlOwotCi0gIH0gVFRfU0JpdF9TY2FsZVJlYywgKlRUX1NCaXRfU2NhbGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICBQT1NUU0NSSVBUIEdMWVBIIE5BTUVTIFNVUFBPUlQgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qb3N0XzIwUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQb3N0c2NyaXB0IG5hbWVzIHN1Yi10YWJsZSwgZm9ybWF0IDIuMC4gIFN0b3JlcyB0aGUgUFMgbmFtZSBvZiAgICAgKi8KLSAgLyogICAgZWFjaCBnbHlwaCBpbiB0aGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2dseXBocyAgICA6OiBUaGUgbnVtYmVyIG9mIG5hbWVkIGdseXBocyBpbiB0aGUgdGFibGUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fbmFtZXMgICAgIDo6IFRoZSBudW1iZXIgb2YgUFMgbmFtZXMgc3RvcmVkIGluIHRoZSB0YWJsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGljZXMgOjogVGhlIGluZGljZXMgb2YgdGhlIGdseXBocyBpbiB0aGUgbmFtZXMgYXJyYXlzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfbmFtZXMgICA6OiBUaGUgUFMgbmFtZXMgbm90IGluIE1hYyBFbmNvZGluZy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF8yMFJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgIG51bV9nbHlwaHM7Ci0gICAgRlRfVVNob3J0ICAgbnVtX25hbWVzOwotICAgIEZUX1VTaG9ydCogIGdseXBoX2luZGljZXM7Ci0gICAgRlRfQ2hhcioqICAgZ2x5cGhfbmFtZXM7Ci0KLSAgfSBUVF9Qb3N0XzIwUmVjLCAqVFRfUG9zdF8yMDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Bvc3RfMjVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgc3ViLXRhYmxlLCBmb3JtYXQgMi41LiAgU3RvcmVzIHRoZSBQUyBuYW1lIG9mICAgICAqLwotICAvKiAgICBlYWNoIGdseXBoIGluIHRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldHMgICAgOjogQW4gYXJyYXkgb2Ygc2lnbmVkIG9mZnNldHMgaW4gYSBub3JtYWwgTWFjICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIFBvc3RzY3JpcHQgbmFtZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0XzI1XwotICB7Ci0gICAgRlRfVVNob3J0ICBudW1fZ2x5cGhzOwotICAgIEZUX0NoYXIqICAgb2Zmc2V0czsKLQotICB9IFRUX1Bvc3RfMjVSZWMsICpUVF9Qb3N0XzI1OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdF9OYW1lc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUG9zdHNjcmlwdCBuYW1lcyB0YWJsZSwgZWl0aGVyIGZvcm1hdCAyLjAgb3IgMi41LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVkICAgIDo6IEEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBQUyBuYW1lcyBhcmUgbG9hZGVkLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfMjAgOjogVGhlIHN1Yi10YWJsZSB1c2VkIGZvciBmb3JtYXQgMi4wLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdF8yNSA6OiBUaGUgc3ViLXRhYmxlIHVzZWQgZm9yIGZvcm1hdCAyLjUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfTmFtZXNSZWNfCi0gIHsKLSAgICBGVF9Cb29sICBsb2FkZWQ7Ci0KLSAgICB1bmlvbgotICAgIHsKLSAgICAgIFRUX1Bvc3RfMjBSZWMgIGZvcm1hdF8yMDsKLSAgICAgIFRUX1Bvc3RfMjVSZWMgIGZvcm1hdF8yNTsKLQotICAgIH0gbmFtZXM7Ci0KLSAgfSBUVF9Qb3N0X05hbWVzUmVjLCAqVFRfUG9zdF9OYW1lczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgR1ggVkFSSUFUSU9OIFRBQkxFIFNVUFBPUlQgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICB0eXBlZGVmIHN0cnVjdCBHWF9CbGVuZFJlY18gICpHWF9CbGVuZDsKLSNlbmRpZgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgRU1CRURERUQgQkRGIFBST1BFUlRJRVMgVEFCTEUgU1VQUE9SVCAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiBUaGVzZSB0eXBlcyBhcmUgdXNlZCB0byBzdXBwb3J0IGEgYEJERiAnIHRhYmxlIHRoYXQgaXNuJ3QgcGFydCBvZiB0aGUKLSAgICogb2ZmaWNpYWwgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gIEl0IGlzIG1haW5seSB1c2VkIGluIFNGTlQtYmFzZWQKLSAgICogYml0bWFwIGZvbnRzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgZnJvbSBhIHNldCBvZiBCREYgZm9udHMuCi0gICAqCi0gICAqIFRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGlzIGFzIGZvbGxvd3MuCi0gICAqCi0gICAqICAgVVNIT1JUICAgdmVyc2lvbiAgICAgIGBCREYgJyB0YWJsZSB2ZXJzaW9uIG51bWJlciwgc2hvdWxkIGJlIDB4MDAwMS4KLSAgICogICBVU0hPUlQgICBzdHJpa2VDb3VudCAgTnVtYmVyIG9mIHN0cmlrZXMgKGJpdG1hcCBzaXplcykgaW4gdGhpcyB0YWJsZS4KLSAgICogICBVTE9ORyAgICBzdHJpbmdUYWJsZSAgT2Zmc2V0IChmcm9tIHN0YXJ0IG9mIEJERiB0YWJsZSkgdG8gc3RyaW5nCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLgotICAgKgotICAgKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGFuIGFycmF5IG9mIGBzdHJpa2VDb3VudCcgZGVzY3JpcHRvcnMsIGhhdmluZyB0aGUKLSAgICogZm9sbG93aW5nIGZvcm1hdC4KLSAgICoKLSAgICogICBVU0hPUlQgICBwcGVtICAgICAgICAgVmVydGljYWwgcGl4ZWxzIHBlciBFTSBmb3IgdGhpcyBzdHJpa2UuCi0gICAqICAgVVNIT1JUICAgbnVtSXRlbXMgICAgIE51bWJlciBvZiBpdGVtcyBmb3IgdGhpcyBzdHJpa2UgKHByb3BlcnRpZXMgYW5kCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21zKS4gIE1heGltdW0gaXMgMjU1LgotICAgKgotICAgKiBUaGlzIGFycmF5IGluIHR1cm4gaXMgZm9sbG93ZWQgYnkgYHN0cmlrZUNvdW50JyB2YWx1ZSBzZXRzLiAgRWFjaAotICAgKiBgdmFsdWUgc2V0JyBpcyBhbiBhcnJheSBvZiBgbnVtSXRlbXMnIGl0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQuCi0gICAqCi0gICAqICAgVUxPTkcgICAgaXRlbV9uYW1lICAgIE9mZnNldCBpbiBzdHJpbmcgdGFibGUgdG8gaXRlbSBuYW1lLgotICAgKiAgIFVTSE9SVCAgIGl0ZW1fdHlwZSAgICBUaGUgaXRlbSB0eXBlLiAgUG9zc2libGUgdmFsdWVzIGFyZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0+IHN0cmluZyAoZS5nLiwgQ09NTUVOVCkKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiBhdG9tICAgKGUuZy4sIEZPTlQgb3IgZXZlbiBTSVpFKQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID0+IGludDMyCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPT4gdWludDMyCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgPT4gQSBmbGFnIHRvIGluZGljYXRlIGEgcHJvcGVydGllcy4gIFRoaXMKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBPUmVkIHdpdGggdGhlIGFib3ZlIHZhbHVlcy4KLSAgICogICBVTE9ORyAgICBpdGVtX3ZhbHVlICAgRm9yIHN0cmluZ3MgID0+IE9mZnNldCBpbnRvIHN0cmluZyB0YWJsZSB3aXRob3V0Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBkb3VibGUgcXVvdGVzLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYXRvbXMgICAgPT4gT2Zmc2V0IGludG8gc3RyaW5nIHRhYmxlLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgaW50ZWdlcnMgPT4gRGlyZWN0IHZhbHVlLgotICAgKgotICAgKiBBbGwgc3RyaW5ncyBpbiB0aGUgc3RyaW5nIHRhYmxlIGNvbnNpc3Qgb2YgYnl0ZXMgYW5kIGFyZQotICAgKiB6ZXJvLXRlcm1pbmF0ZWQuCi0gICAqCi0gICAqLwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQkRGUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICB0YWJsZTsKLSAgICBGVF9CeXRlKiAgIHRhYmxlX2VuZDsKLSAgICBGVF9CeXRlKiAgIHN0cmluZ3M7Ci0gICAgRlRfVUludDMyICBzdHJpbmdzX3NpemU7Ci0gICAgRlRfVUludCAgICBudW1fc3RyaWtlczsKLSAgICBGVF9Cb29sICAgIGxvYWRlZDsKLQotICB9IFRUX0JERlJlYywgKlRUX0JERjsKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fQkRGICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgT1JJR0lOQUwgVFRfRkFDRSBDTEFTUyBERUZJTklUSU9OICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIHN0cnVjdHVyZS9jbGFzcyBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBpdCBpcyBjb21tb24gdG8gdGhlICAgICAgKi8KLSAgLyogZm9sbG93aW5nIGZvcm1hdHM6IFRURiwgT3BlblR5cGUtVFQsIGFuZCBPcGVuVHlwZS1DRkYuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBjbGFzc2VzIFRUX1NpemUgYW5kIFRUX0dseXBoU2xvdCBhcmUgbm90ICAgICAgKi8KLSAgLyogc2hhcmVkIGJldHdlZW4gZm9udCBkcml2ZXJzLCBhbmQgYXJlIHRodXMgZGVmaW5lZCBpbiBgdHRvYmpzLmgnLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgZmFjZS9mb250IG9iamVjdC4gIEEgVFRfRmFjZSBlbmNhcHN1bGF0ZXMgICAqLwotICAvKiAgICB0aGUgcmVzb2x1dGlvbiBhbmQgc2NhbGluZyBpbmRlcGVuZGVudCBwYXJ0cyBvZiBhIFRydWVUeXBlIGZvbnQgICAgKi8KLSAgLyogICAgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRUX0ZhY2Ugc3RydWN0dXJlIGlzIGFsc28gdXNlZCBhcyBhIGBwYXJlbnQgY2xhc3MnIGZvciB0aGUgICAgICovCi0gIC8qICAgIE9wZW5UeXBlLUNGRiBjbGFzcyAoVDJfRmFjZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVFRfRmFjZVJlY18qICBUVF9GYWNlOwotCi0KLSAgLyogYSBmdW5jdGlvbiB0eXBlIHVzZWQgZm9yIHRoZSB0cnVldHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBob29rcyAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfSW50ZXJwcmV0ZXIpKCB2b2lkKiAgZXhlY19jb250ZXh0ICk7Ci0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotICB0eXBlZGVmIHN0cnVjdCBUVF9Mb2FkZXJSZWNfKiAgVFRfTG9hZGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZGVyX0dvdG9UYWJsZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2Vla3MgYSBzdHJlYW0gdG8gdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4gVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgICAgOjogQSA0LWJ5dGUgdGFnIHVzZWQgdG8gbmFtZSB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aCA6OiBUaGUgbGVuZ3RoIG9mIHRoZSB0YWJsZSBpbiBieXRlcy4gIFNldCB0byAwIGlmIG5vdCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBmb250IGZpbGUncyBvcmlnaW4uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkZXJfR290b1RhYmxlRnVuYykoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZGVyX1N0YXJ0R2x5cGhGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2Vla3MgYSBzdHJlYW0gdG8gdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4gZ2x5cGggZWxlbWVudCwgYW5kIG9wZW5zIGEgICovCi0gIC8qICAgIGZyYW1lIGZvciBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciAgICAgIDo6IFRoZSBjdXJyZW50IFRydWVUeXBlIGdseXBoIGxvYWRlciBvYmplY3QuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCB0byBhY2Nlc3MuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXQgICAgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBnbHlwaCBhY2NvcmRpbmcgdG8gdGhlICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYGxvY2F0aW9ucycgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBieXRlX2NvdW50ICA6OiBUaGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vcm1hbGx5IGVxdWl2YWxlbnQgdG8gRlRfU1RSRUFNX1NFRUsob2Zmc2V0KSAgICAgKi8KLSAgLyogICAgZm9sbG93ZWQgYnkgRlRfRlJBTUVfRU5URVIoYnl0ZV9jb3VudCkgd2l0aCB0aGUgbG9hZGVyJ3Mgc3RyZWFtLCAgICovCi0gIC8qICAgIGJ1dCBhbHRlcm5hdGl2ZSBmb3JtYXRzIChlLmcuIGNvbXByZXNzZWQgb25lcykgbWlnaHQgdXNlIHNvbWV0aGluZyAqLwotICAvKiAgICBkaWZmZXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkZXJfU3RhcnRHbHlwaEZ1bmMpKCBUVF9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgYnl0ZV9jb3VudCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVhZHMgb25lIGdseXBoIGVsZW1lbnQgKGl0cyBoZWFkZXIsIGEgc2ltcGxlIGdseXBoLCBvciBhICAgICAgICAgICovCi0gIC8qICAgIGNvbXBvc2l0ZSkgZnJvbSB0aGUgbG9hZGVyJ3MgY3VycmVudCBzdHJlYW0gZnJhbWUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciA6OiBUaGUgY3VycmVudCBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jKSggVFRfTG9hZGVyICBsb2FkZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlcl9FbmRHbHlwaEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENsb3NlcyB0aGUgY3VycmVudCBsb2FkZXIgc3RyZWFtIGZyYW1lIGZvciB0aGUgZ2x5cGguICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciA6OiBUaGUgY3VycmVudCBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVFRfTG9hZGVyX0VuZEdseXBoRnVuYykoIFRUX0xvYWRlciAgbG9hZGVyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIEZhY2UgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUcnVlVHlwZSBmYWNlIGNsYXNzLiAgVGhlc2Ugb2JqZWN0cyBtb2RlbCB0aGUgcmVzb2x1dGlvbiBhbmQgICAqLwotICAvKiAgICBwb2ludC1zaXplIGluZGVwZW5kZW50IGRhdGEgZm91bmQgaW4gYSBUcnVlVHlwZSBmb250IGZpbGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb290ICAgICAgICAgICAgICAgICA6OiBUaGUgYmFzZSBGVF9GYWNlIHN0cnVjdHVyZSwgbWFuYWdlZCBieSB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dGNfaGVhZGVyICAgICAgICAgICA6OiBUaGUgVHJ1ZVR5cGUgY29sbGVjdGlvbiBoZWFkZXIsIHVzZWQgd2hlbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgaXMgYSBgdHRjJyByYXRoZXIgdGhhbiBhIGB0dGYnLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBvcmRpbmFyeSBmb250IGZpbGVzLCB0aGUgZmllbGQgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdHRjX2hlYWRlci5jb3VudCcgaXMgc2V0IHRvIDAuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdF90YWcgICAgICAgICAgIDo6IFRoZSBmb250IGZvcm1hdCB0YWcuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3RhYmxlcyAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBUcnVlVHlwZSB0YWJsZXMgaW4gdGhpcyBmb250ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlyX3RhYmxlcyAgICAgICAgICAgOjogVGhlIGRpcmVjdG9yeSBvZiBUcnVlVHlwZSB0YWJsZXMgZm9yIHRoaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVhZGVyICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBmb250IGhlYWRlciAoYGhlYWQnIHRhYmxlKS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgb24gZm9udCBvcGVuaW5nLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaXpvbnRhbCAgICAgICAgICAgOjogVGhlIGZvbnQncyBob3Jpem9udGFsIGhlYWRlciAoYGhoZWEnICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKS4gIFRoaXMgZmllbGQgYWxzbyBjb250YWlucyB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIGhvcml6b250YWwgbWV0cmljcyB0YWJsZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGBobXR4JykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfcHJvZmlsZSAgICAgICAgICA6OiBUaGUgZm9udCdzIG1heGltdW0gcHJvZmlsZSB0YWJsZS4gIFJlYWQgb24gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBvcGVuaW5nLiAgTm90ZSB0aGF0IHNvbWUgbWF4aW11bSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBjYW5ub3QgYmUgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIFdlIHRodXMgZGVmaW5lIGFkZGl0aW9uYWwgZmllbGRzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgdG8gaG9sZCB0aGUgY29tcHV0ZWQgbWF4aW1hLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbF9pbmZvICAgICAgICA6OiBBIGJvb2xlYW4gd2hpY2ggaXMgc2V0IHdoZW4gdGhlIGZvbnQgZmlsZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdmVydGljYWwgbWV0cmljcy4gIElmIG5vdCwgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIHRoZSBgdmVydGljYWwnIGZpZWxkIGlzICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgdmVydGljYWwgaGVhZGVyIChgdmhlYScgdGFibGUpLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGFsc28gY29udGFpbnMgdGhlIGFzc29jaWF0ZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgbWV0cmljcyB0YWJsZSAoYHZtdHgnKSwgaWYgZm91bmQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEFOVDogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmllbGQgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgaWYgdGhlIGB2ZXJ0aWNhbEluZm8nIGZpZWxkIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fbmFtZXMgICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIG5hbWUgcmVjb3JkcyB3aXRoaW4gdGhpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lX3RhYmxlICAgICAgICAgICA6OiBUaGUgdGFibGUgb2YgbmFtZSByZWNvcmRzIChgbmFtZScpLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9zMiAgICAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgT1MvMiB0YWJsZSAoYE9TLzInKS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zdHNjcmlwdCAgICAgICAgICAgOjogVGhlIGZvbnQncyBQb3N0U2NyaXB0IHRhYmxlIChgcG9zdCcgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKS4gIFRoZSBQb3N0U2NyaXB0IGdseXBoIG5hbWVzIGFyZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgbG9hZGVkIGJ5IHRoZSBkcml2ZXIgb24gZmFjZSBvcGVuaW5nLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSBgdHRwb3N0JyBtb2R1bGUgZm9yIG1vcmUgZGV0YWlscy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbWFwX3RhYmxlICAgICAgICAgICA6OiBBZGRyZXNzIG9mIHRoZSBmYWNlJ3MgYGNtYXAnIFNGTlQgdGFibGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbWVtb3J5IChpdCdzIGFuIGV4dHJhY3RlZCBmcmFtZSkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbWFwX3NpemUgICAgICAgICAgICA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYGNtYXBfdGFibGUnICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnb3RvX3RhYmxlICAgICAgICAgICA6OiBBIGZ1bmN0aW9uIGNhbGxlZCBieSBlYWNoIFRydWVUeXBlIHRhYmxlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyIHRvIHBvc2l0aW9uIGEgc3RyZWFtJ3MgY3Vyc29yIHRvICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdGFydCBvZiBhIGdpdmVuIHRhYmxlIGFjY29yZGluZyB0byAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgdGFnLiAgSXQgZGVmYXVsdHMgdG8gVFRfR290b19GYWNlIGJ1dCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGRpZmZlcmVudCBmb3Igc3RyYW5nZSBmb3JtYXRzIChlLmcuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgNDIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNjZXNzX2dseXBoX2ZyYW1lICAgOjogQSBmdW5jdGlvbiB1c2VkIHRvIGFjY2VzcyB0aGUgZnJhbWUgb2YgYSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGdseXBoIHdpdGhpbiB0aGUgZmFjZSdzIGZvbnQgZmlsZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9yZ2V0X2dseXBoX2ZyYW1lICAgOjogQSBmdW5jdGlvbiB1c2VkIHRvIGZvcmdldCB0aGUgZnJhbWUgb2YgYSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGdseXBoIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gbG9hZGVkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVhZF9nbHlwaF9oZWFkZXIgICAgOjogQSBmdW5jdGlvbiB1c2VkIHRvIHJlYWQgYSBnbHlwaCBoZWFkZXIuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgY2FsbGVkIGJldHdlZW4gYW4gYGFjY2VzcycgYW5kICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZm9yZ2V0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlYWRfc2ltcGxlX2dseXBoICAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byByZWFkIGEgc2ltcGxlIGdseXBoLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgaGVhZGVyIHdhcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCwgYW5kIGJlZm9yZSB0aGUgYGZvcmdldCcuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWFkX2NvbXBvc2l0ZV9nbHlwaCA6OiBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVhZCBhIGNvbXBvc2l0ZSBnbHlwaC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGhlYWRlciB3YXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIGFuZCBiZWZvcmUgdGhlIGBmb3JnZXQnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2ZudCAgICAgICAgICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBTRk5UIHNlcnZpY2UuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc25hbWVzICAgICAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIFBvc3RTY3JpcHQgbmFtZXMgc2VydmljZS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhkbXggICAgICAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgaG9yaXpvbnRhbCBkZXZpY2UgbWV0cmljcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYGhkbXgnIHRhYmxlKS4gIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwgaW4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnYXNwICAgICAgICAgICAgICAgICA6OiBUaGUgZ3JpZC1maXR0aW5nIGFuZCBzY2FsaW5nIHByb3BlcnRpZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKGBnYXNwJykuICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGNsdCAgICAgICAgICAgICAgICAgOjogVGhlIGBwY2x0JyBTRk5UIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fc2JpdF9zdHJpa2VzICAgICA6OiBUaGUgbnVtYmVyIG9mIHNiaXQgc3RyaWtlcywgaS5lLiwgYml0bWFwICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXMsIGVtYmVkZGVkIGluIHRoaXMgZm9udC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0X3N0cmlrZXMgICAgICAgICA6OiBBbiBhcnJheSBvZiBzYml0IHN0cmlrZXMgZW1iZWRkZWQgaW4gdGhpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwgaW4gYSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3NiaXRfc2NhbGVzICAgICAgOjogVGhlIG51bWJlciBvZiBzYml0IHNjYWxlcyBmb3IgdGhpcyBmb250LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0X3NjYWxlcyAgICAgICAgICA6OiBBcnJheSBvZiBzYml0IHNjYWxlcyBlbWJlZGRlZCBpbiB0aGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwgaW4gYSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zdHNjcmlwdF9uYW1lcyAgICAgOjogQSB0YWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBQb3N0c2NyaXB0IG5hbWVzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mICB0aGUgZ2x5cGhzIGZvciB0aGlzIGZvbnQuICBTZWUgdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlICBgdHRjb25maWcuaCcgZm9yIGNvbW1lbnRzIG9uIHRoZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTIG9wdGlvbi4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fbG9jYXRpb25zICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGdseXBoIGxvY2F0aW9ucyBpbiB0aGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgZmlsZS4gIFRoaXMgc2hvdWxkIGJlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbCB0byB0aGUgbnVtYmVyIG9mIGdseXBocy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2xvY2F0aW9ucyAgICAgIDo6IEFuIGFycmF5IG9mIGxvbmdzLiAgVGhlc2UgYXJlIG9mZnNldHMgdG8gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBkYXRhIHdpdGhpbiB0aGUgYGdseWYnIHRhYmxlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnQgZmFjZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlmX2xlbiAgICAgICAgICAgICA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBgZ2x5ZicgdGFibGUuICBOZWVkZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1hbGZvcm1lZCBgbG9jYScgdGFibGVzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb250X3Byb2dyYW1fc2l6ZSAgICA6OiBTaXplIGluIGJ5dGVjb2RlcyBvZiB0aGUgZmFjZSdzIGZvbnQgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS4gIDAgaWYgbm9uZSBkZWZpbmVkLiAgSWdub3JlZCBmb3IgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udF9wcm9ncmFtICAgICAgICAgOjogVGhlIGZhY2UncyBmb250IHByb2dyYW0gKGJ5dGVjb2RlIHN0cmVhbSkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIGF0IGxvYWQgdGltZSwgYWxzbyB1c2VkIGR1cmluZyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCByZW5kZXJpbmcuICBDb21lcyBmcm9tIHRoZSBgZnBnbScgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udCBmb250cy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdnRfcHJvZ3JhbV9zaXplICAgICA6OiBUaGUgc2l6ZSBpbiBieXRlY29kZXMgb2YgdGhlIGZhY2UncyBjdnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdnRfcHJvZ3JhbSAgICAgICAgICA6OiBUaGUgZmFjZSdzIGN2dCBwcm9ncmFtIChieXRlY29kZSBzdHJlYW0pICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgZWFjaCB0aW1lIGFuIGluc3RhbmNlL3NpemUgaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQvcmVzZXQuICBDb21lcyBmcm9tIHRoZSBgcHJlcCcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN2dF9zaXplICAgICAgICAgICAgIDo6IFNpemUgb2YgdGhlIGNvbnRyb2wgdmFsdWUgdGFibGUgKGluICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzKS4gICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN2dCAgICAgICAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3Mgb3JpZ2luYWwgY29udHJvbCB2YWx1ZSB0YWJsZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29yZGluYXRlcyBhcmUgZXhwcmVzc2VkIGluIHVuc2NhbGVkIGZvbnQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMuICBDb21lcyBmcm9tIHRoZSBgY3Z0ICcgdGFibGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2tlcm5fcGFpcnMgICAgICAgOjogVGhlIG51bWJlciBvZiBrZXJuaW5nIHBhaXJzIHByZXNlbnQgaW4gdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZS4gIFRoZSBlbmdpbmUgb25seSBsb2FkcyB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBob3Jpem9udGFsIGZvcm1hdCAwIGtlcm4gdGFibGUgaXQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZHMgaW4gdGhlIGZvbnQgZmlsZS4gIElnbm9yZWQgZm9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2Vybl90YWJsZV9pbmRleCAgICAgOjogVGhlIGluZGV4IG9mIHRoZSBrZXJuaW5nIHRhYmxlIGluIHRoZSBmb250ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5pbmcgZGlyZWN0b3J5LiAgSWdub3JlZCBmb3IgVHlwZSAyICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGludGVycHJldGVyICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlcnMgZmllbGQgaXMgYWxzbyB1c2VkIHRvIGhvb2sgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlYnVnZ2VyIGluIGB0dGRlYnVnJy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1bnBhdGVudGVkX2hpbnRpbmcgICA6OiBJZiB0cnVlLCB1c2Ugb25seSB1bnBhdGVudGVkIG1ldGhvZHMgaW4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkb2JsZW5kICAgICAgICAgICAgICA6OiBBIGJvb2xlYW4gd2hpY2ggaXMgc2V0IGlmIHRoZSBmb250IHNob3VsZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYmxlbmRlZCAodGhpcyBpcyBmb3IgR1ggdmFyKS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibGVuZCAgICAgICAgICAgICAgICA6OiBDb250YWlucyB0aGUgZGF0YSBuZWVkZWQgdG8gY29udHJvbCBHWCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9uIHRhYmxlcyAocmF0aGVyIGxpa2UgTXVsdGlwbGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc3RlciBkYXRhKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXh0cmEgICAgICAgICAgICAgICAgOjogUmVzZXJ2ZWQgZm9yIHRoaXJkLXBhcnR5IGZvbnQgZHJpdmVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0X25hbWUgICAgICA6OiBUaGUgUFMgbmFtZSBvZiB0aGUgZm9udC4gIFVzZWQgYnkgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHNjcmlwdCBuYW1lIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfRmFjZVJlY18KLSAgewotICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICByb290OwotCi0gICAgVFRDX0hlYWRlclJlYyAgICAgICAgIHR0Y19oZWFkZXI7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgZm9ybWF0X3RhZzsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgbnVtX3RhYmxlczsKLSAgICBUVF9UYWJsZSAgICAgICAgICAgICAgZGlyX3RhYmxlczsKLQotICAgIFRUX0hlYWRlciAgICAgICAgICAgICBoZWFkZXI7ICAgICAgIC8qIFRydWVUeXBlIGhlYWRlciB0YWJsZSAgICAgICAgICAqLwotICAgIFRUX0hvcmlIZWFkZXIgICAgICAgICBob3Jpem9udGFsOyAgIC8qIFRydWVUeXBlIGhvcml6b250YWwgaGVhZGVyICAgICAqLwotCi0gICAgVFRfTWF4UHJvZmlsZSAgICAgICAgIG1heF9wcm9maWxlOwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBtYXhfY29tcG9uZW50czsgIC8qIHN0dWJiZWQgdG8gMCAqLwotI2VuZGlmCi0KLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgdmVydGljYWxfaW5mbzsKLSAgICBUVF9WZXJ0SGVhZGVyICAgICAgICAgdmVydGljYWw7ICAgICAvKiBUVCBWZXJ0aWNhbCBoZWFkZXIsIGlmIHByZXNlbnQgKi8KLQotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBudW1fbmFtZXM7ICAgIC8qIG51bWJlciBvZiBuYW1lIHJlY29yZHMgICovCi0gICAgVFRfTmFtZVRhYmxlUmVjICAgICAgIG5hbWVfdGFibGU7ICAgLyogbmFtZSB0YWJsZSAgICAgICAgICAgICAgKi8KLQotICAgIFRUX09TMiAgICAgICAgICAgICAgICBvczI7ICAgICAgICAgIC8qIFRydWVUeXBlIE9TLzIgdGFibGUgICAgICAgICAgICAqLwotICAgIFRUX1Bvc3RzY3JpcHQgICAgICAgICBwb3N0c2NyaXB0OyAgIC8qIFRydWVUeXBlIFBvc3RzY3JpcHQgdGFibGUgICAgICAqLwotCi0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGNtYXBfdGFibGU7ICAgLyogZXh0cmFjdGVkIGBjbWFwJyB0YWJsZSAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBjbWFwX3NpemU7Ci0KLSAgICBUVF9Mb2FkZXJfR290b1RhYmxlRnVuYyAgIGdvdG9fdGFibGU7Ci0KLSAgICBUVF9Mb2FkZXJfU3RhcnRHbHlwaEZ1bmMgIGFjY2Vzc19nbHlwaF9mcmFtZTsKLSAgICBUVF9Mb2FkZXJfRW5kR2x5cGhGdW5jICAgIGZvcmdldF9nbHlwaF9mcmFtZTsKLSAgICBUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYyAgIHJlYWRfZ2x5cGhfaGVhZGVyOwotICAgIFRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jICAgcmVhZF9zaW1wbGVfZ2x5cGg7Ci0gICAgVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMgICByZWFkX2NvbXBvc2l0ZV9nbHlwaDsKLQotICAgIC8qIGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgU0ZOVF9JbnRlcmZhY2UgdGFibGUgdXNlZCB0byBsb2FkICovCi0gICAgLyogdGhlIGJhc2ljIFRydWVUeXBlIHRhYmxlcyBpbiB0aGUgZmFjZSBvYmplY3QgICAgICAgICAgICAgICAgKi8KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgc2ZudDsKLQotICAgIC8qIGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgRlRfU2VydmljZV9Qc0NNYXBzUmVjIHRhYmxlIHVzZWQgdG8gKi8KLSAgICAvKiBoYW5kbGUgZ2x5cGggbmFtZXMgPC0+IHVuaWNvZGUgJiBNYWMgdmFsdWVzICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCogICAgICAgICAgICAgICAgIHBzbmFtZXM7Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogT3B0aW9uYWwgVHJ1ZVR5cGUvT3BlblR5cGUgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBob3Jpem9udGFsIGRldmljZSBtZXRyaWNzICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0gICAgVFRfSGRteFJlYyAgICAgICAgICAgIGhkbXg7Ci0jZW5kaWYKLQotICAgIC8qIGdyaWQtZml0dGluZyBhbmQgc2NhbGluZyB0YWJsZSAqLwotICAgIFRUX0dhc3BSZWMgICAgICAgICAgICBnYXNwOyAgICAgICAgICAgICAgICAgLyogdGhlIGBnYXNwJyB0YWJsZSAqLwotCi0gICAgLyogUENMIDUgdGFibGUgKi8KLSAgICBUVF9QQ0xUICAgICAgICAgICAgICAgcGNsdDsKLQotICAgIC8qIGVtYmVkZGVkIGJpdG1hcHMgc3VwcG9ydCAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBudW1fc2JpdF9zdHJpa2VzOwotICAgIFRUX1NCaXRfU3RyaWtlICAgICAgICBzYml0X3N0cmlrZXM7Ci0jZW5kaWYKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgICBudW1fc2JpdF9zY2FsZXM7Ci0gICAgVFRfU0JpdF9TY2FsZSAgICAgICAgIHNiaXRfc2NhbGVzOwotCi0gICAgLyogcG9zdHNjcmlwdCBuYW1lcyB0YWJsZSAqLwotICAgIFRUX1Bvc3RfTmFtZXNSZWMgICAgICBwb3N0c2NyaXB0X25hbWVzOwotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRydWVUeXBlLXNwZWNpZmljIGZpZWxkcyAoaWdub3JlZCBieSB0aGUgT1RGLVR5cGUyIGRyaXZlcikgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogdGhlIGdseXBoIGxvY2F0aW9ucyAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBudW1fbG9jYXRpb25zX3N0dWI7Ci0gICAgRlRfTG9uZyogICAgICAgICAgICAgIGdseXBoX2xvY2F0aW9uc19zdHViOwotI2VuZGlmCi0KLSAgICAvKiB0aGUgZm9udCBwcm9ncmFtLCBpZiBhbnkgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgZm9udF9wcm9ncmFtX3NpemU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGZvbnRfcHJvZ3JhbTsKLQotICAgIC8qIHRoZSBjdnQgcHJvZ3JhbSwgaWYgYW55ICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGN2dF9wcm9ncmFtX3NpemU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGN2dF9wcm9ncmFtOwotCi0gICAgLyogdGhlIG9yaWdpbmFsLCB1bnNjYWxlZCwgY29udHJvbCB2YWx1ZSB0YWJsZSAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBjdnRfc2l6ZTsKLSAgICBGVF9TaG9ydCogICAgICAgICAgICAgY3Z0OwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0gICAgLyogdGhlIGZvcm1hdCAwIGtlcm5pbmcgdGFibGUsIGlmIGFueSAqLwotICAgIEZUX0ludCAgICAgICAgICAgICAgICBudW1fa2Vybl9wYWlyczsKLSAgICBGVF9JbnQgICAgICAgICAgICAgICAga2Vybl90YWJsZV9pbmRleDsKLSAgICBUVF9LZXJuMF9QYWlyICAgICAgICAga2Vybl9wYWlyczsKLSNlbmRpZgotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciB0byB1c2UuICBUaGlzIGlzIGFsc28gKi8KLSAgICAvKiB1c2VkIHRvIGhvb2sgdGhlIGRlYnVnZ2VyIGZvciB0aGUgYHR0ZGVidWcnIHV0aWxpdHkuICAgICAgICAqLwotICAgIFRUX0ludGVycHJldGVyICAgICAgICBpbnRlcnByZXRlcjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgLyogVXNlIHVucGF0ZW50ZWQgaGludGluZyBvbmx5LiAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICAgICB1bnBhdGVudGVkX2hpbnRpbmc7Ci0jZW5kaWYKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogT3RoZXIgdGFibGVzIG9yIGZpZWxkcy4gVGhpcyBpcyB1c2VkIGJ5IGRlcml2YXRpdmUgZm9ybWF0cyBsaWtlICAgICAqLwotICAgIC8qIE9wZW5UeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgRlRfR2VuZXJpYyAgICAgICAgICAgIGV4dHJhOwotCi0gICAgY29uc3QgY2hhciogICAgICAgICAgIHBvc3RzY3JpcHRfbmFtZTsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xLjgsIGJ1dCB3YXMgb3JpZ2luYWxseSBwbGFjZWQgYWZ0ZXIgKi8KLSAgICAvKiBgZ2x5cGhfbG9jYXRpb25zX3N0dWInICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGdseWZfbGVuOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjEuOCwgYnV0IHdhcyBvcmlnaW5hbGx5IHBsYWNlZCBiZWZvcmUgYGV4dHJhJyAqLwotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgZG9ibGVuZDsKLSAgICBHWF9CbGVuZCAgICAgICAgICAgICAgYmxlbmQ7Ci0jZW5kaWYKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4yICovCi0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgaG9yel9tZXRyaWNzOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBob3J6X21ldHJpY3Nfc2l6ZTsKLQotICAgIEZUX0J5dGUqICAgICAgICAgICAgICB2ZXJ0X21ldHJpY3M7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIHZlcnRfbWV0cmljc19zaXplOwotCi0gICAgRlRfVUludCAgICAgICAgICAgICAgIG51bV9sb2NhdGlvbnM7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGdseXBoX2xvY2F0aW9uczsKLQotICAgIEZUX0J5dGUqICAgICAgICAgICAgICBoZG14X3RhYmxlOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBoZG14X3RhYmxlX3NpemU7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgIGhkbXhfcmVjb3JkX2NvdW50OwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBoZG14X3JlY29yZF9zaXplOwotICAgIEZUX0J5dGUqICAgICAgICAgICAgICBoZG14X3JlY29yZF9zaXplczsKLQotICAgIEZUX0J5dGUqICAgICAgICAgICAgICBzYml0X3RhYmxlOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBzYml0X3RhYmxlX3NpemU7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgIHNiaXRfbnVtX3N0cmlrZXM7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAga2Vybl90YWJsZTsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAga2Vybl90YWJsZV9zaXplOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICBudW1fa2Vybl90YWJsZXM7Ci0gICAgRlRfVUludDMyICAgICAgICAgICAgIGtlcm5fYXZhaWxfYml0czsKLSAgICBGVF9VSW50MzIgICAgICAgICAgICAga2Vybl9vcmRlcl9iaXRzOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSAgICBUVF9CREZSZWMgICAgICAgICAgICAgYmRmOwotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fQkRGICovCi0KLSAgICAvKiBzaW5jZSAyLjMuMCAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBob3J6X21ldHJpY3Nfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgICAgICAgICAgICB2ZXJ0X21ldHJpY3Nfb2Zmc2V0OwotCi0gIH0gVFRfRmFjZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUVF9HbHlwaFpvbmVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBBIGdseXBoIHpvbmUgaXMgdXNlZCB0byBsb2FkLCBzY2FsZSBhbmQgaGludCBnbHlwaCBvdXRsaW5lICAgICAgICAqLwotICAvKiAgICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbWVtb3J5ICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBtYXhfcG9pbnRzICAgOjogVGhlIG1heGltYWwgc2l6ZSBpbiBwb2ludHMgb2YgdGhlIHpvbmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG1heF9jb250b3VycyA6OiBNYXggc2l6ZSBpbiBsaW5rcyBjb250b3VycyBvZiB0aGUgem9uZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbl9wb2ludHMgICAgIDo6IFRoZSBjdXJyZW50IG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHpvbmUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBuX2NvbnRvdXJzICAgOjogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNvbnRvdXJzIGluIHRoZSB6b25lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG9yZyAgICAgICAgICA6OiBUaGUgb3JpZ2luYWwgZ2x5cGggY29vcmRpbmF0ZXMgKGZvbnQgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdW5pdHMvc2NhbGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGN1ciAgICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBjb29yZGluYXRlcyAoc2NhbGVkL2hpbnRlZCkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgdGFncyAgICAgICAgIDo6IFRoZSBwb2ludCBjb250cm9sIHRhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjb250b3VycyAgICAgOjogVGhlIGNvbnRvdXJzIGVuZCBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGZpcnN0X3BvaW50ICA6OiBPZmZzZXQgb2YgdGhlIGN1cnJlbnQgc3ViZ2x5cGgncyBmaXJzdCBwb2ludC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfR2x5cGhab25lUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5OwotICAgIEZUX1VTaG9ydCAgIG1heF9wb2ludHM7Ci0gICAgRlRfVVNob3J0ICAgbWF4X2NvbnRvdXJzOwotICAgIEZUX1VTaG9ydCAgIG5fcG9pbnRzOyAgICAvKiBudW1iZXIgb2YgcG9pbnRzIGluIHpvbmUgICAgKi8KLSAgICBGVF9TaG9ydCAgICBuX2NvbnRvdXJzOyAgLyogbnVtYmVyIG9mIGNvbnRvdXJzICAgICAgICAgICovCi0KLSAgICBGVF9WZWN0b3IqICBvcmc7ICAgICAgICAgLyogb3JpZ2luYWwgcG9pbnQgY29vcmRpbmF0ZXMgICovCi0gICAgRlRfVmVjdG9yKiAgY3VyOyAgICAgICAgIC8qIGN1cnJlbnQgcG9pbnQgY29vcmRpbmF0ZXMgICAqLwotICAgIEZUX1ZlY3RvciogIG9ydXM7ICAgICAgICAvKiBvcmlnaW5hbCAodW5zY2FsZWQpIHBvaW50IGNvb3JkaW5hdGVzICovCi0KLSAgICBGVF9CeXRlKiAgICB0YWdzOyAgICAgICAgLyogY3VycmVudCB0b3VjaCBmbGFncyAgICAgICAgICovCi0gICAgRlRfVVNob3J0KiAgY29udG91cnM7ICAgIC8qIGNvbnRvdXIgZW5kIHBvaW50cyAgICAgICAgICAqLwotCi0gICAgRlRfVVNob3J0ICAgZmlyc3RfcG9pbnQ7IC8qIG9mZnNldCBvZiBmaXJzdCAoIzApIHBvaW50ICAqLwotCi0gIH0gVFRfR2x5cGhab25lUmVjLCAqVFRfR2x5cGhab25lOwotCi0KLSAgLyogaGFuZGxlIHRvIGV4ZWN1dGlvbiBjb250ZXh0ICovCi0gIHR5cGVkZWYgc3RydWN0IFRUX0V4ZWNDb250ZXh0UmVjXyogIFRUX0V4ZWNDb250ZXh0OwotCi0gIC8qIGdseXBoIGxvYWRlciBzdHJ1Y3R1cmUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0xvYWRlclJlY18KLSAgewotICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZTsKLSAgICBGVF9TaXplICAgICAgICAgIHNpemU7Ci0gICAgRlRfR2x5cGhTbG90ICAgICBnbHlwaDsKLSAgICBGVF9HbHlwaExvYWRlciAgIGdsb2FkZXI7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIGxvYWRfZmxhZ3M7Ci0gICAgRlRfVUludCAgICAgICAgICBnbHlwaF9pbmRleDsKLQotICAgIEZUX1N0cmVhbSAgICAgICAgc3RyZWFtOwotICAgIEZUX0ludCAgICAgICAgICAgYnl0ZV9sZW47Ci0KLSAgICBGVF9TaG9ydCAgICAgICAgIG5fY29udG91cnM7Ci0gICAgRlRfQkJveCAgICAgICAgICBiYm94OwotICAgIEZUX0ludCAgICAgICAgICAgbGVmdF9iZWFyaW5nOwotICAgIEZUX0ludCAgICAgICAgICAgYWR2YW5jZTsKLSAgICBGVF9JbnQgICAgICAgICAgIGxpbmVhcjsKLSAgICBGVF9Cb29sICAgICAgICAgIGxpbmVhcl9kZWY7Ci0gICAgRlRfQm9vbCAgICAgICAgICBwcmVzZXJ2ZV9wcHM7Ci0gICAgRlRfVmVjdG9yICAgICAgICBwcDE7Ci0gICAgRlRfVmVjdG9yICAgICAgICBwcDI7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIGdseWZfb2Zmc2V0OwotCi0gICAgLyogdGhlIHpvbmUgd2hlcmUgd2UgbG9hZCBvdXIgZ2x5cGhzICovCi0gICAgVFRfR2x5cGhab25lUmVjICBiYXNlOwotICAgIFRUX0dseXBoWm9uZVJlYyAgem9uZTsKLQotICAgIFRUX0V4ZWNDb250ZXh0ICAgZXhlYzsKLSAgICBGVF9CeXRlKiAgICAgICAgIGluc3RydWN0aW9uczsKLSAgICBGVF9VTG9uZyAgICAgICAgIGluc19wb3M7Ci0KLSAgICAvKiBmb3IgcG9zc2libGUgZXh0ZW5zaWJpbGl0eSBpbiBvdGhlciBmb3JtYXRzICovCi0gICAgdm9pZCogICAgICAgICAgICBvdGhlcjsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xLjggKi8KLSAgICBGVF9JbnQgICAgICAgICAgIHRvcF9iZWFyaW5nOwotICAgIEZUX0ludCAgICAgICAgICAgdmFkdmFuY2U7Ci0gICAgRlRfVmVjdG9yICAgICAgICBwcDM7Ci0gICAgRlRfVmVjdG9yICAgICAgICBwcDQ7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMi4xICovCi0gICAgRlRfQnl0ZSogICAgICAgICBjdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgICBsaW1pdDsKLQotICB9IFRUX0xvYWRlclJlYzsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUVFlQRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMTFmMzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxdGFibGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCYXNpYyBUeXBlIDEvVHlwZSAyIHRhYmxlcyBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAqLwotLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiwgMjAwOCBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UMVRBQkxFU19IX18KLSNkZWZpbmUgX19UMVRBQkxFU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBlMV90YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUeXBlIDEgVGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUeXBlIDEgKFBvc3RTY3JpcHQpIHNwZWNpZmljIGZvbnQgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgVHlwZSAxLXNwZWNpZmljIHRhYmxlcywgICAgKi8KLSAgLyogICAgaW5jbHVkaW5nIHN0cnVjdHVyZXMgcmVsYXRlZCB0byBvdGhlciBQb3N0U2NyaXB0IGZvbnQgZm9ybWF0cy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIE5vdGUgdGhhdCB3ZSBzZXBhcmF0ZSBmb250IGRhdGEgaW4gUFNfRm9udEluZm9SZWMgYW5kIFBTX1ByaXZhdGVSZWMgKi8KLSAgLyogc3RydWN0dXJlcyBpbiBvcmRlciB0byBzdXBwb3J0IE11bHRpcGxlIE1hc3RlciBmb250cy4gICAgICAgICAgICAgICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRm9udEluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFR5cGUxL1R5cGUyIEZvbnRJbmZvIGRpY3Rpb25hcnkuICBOb3RlICovCi0gIC8qICAgIHRoYXQgZm9yIE11bHRpcGxlIE1hc3RlciBmb250cywgZWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biAgICAgICAgICAqLwotICAvKiAgICBGb250SW5mbyBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19Gb250SW5mb1JlY18KLSAgewotICAgIEZUX1N0cmluZyogIHZlcnNpb247Ci0gICAgRlRfU3RyaW5nKiAgbm90aWNlOwotICAgIEZUX1N0cmluZyogIGZ1bGxfbmFtZTsKLSAgICBGVF9TdHJpbmcqICBmYW1pbHlfbmFtZTsKLSAgICBGVF9TdHJpbmcqICB3ZWlnaHQ7Ci0gICAgRlRfTG9uZyAgICAgaXRhbGljX2FuZ2xlOwotICAgIEZUX0Jvb2wgICAgIGlzX2ZpeGVkX3BpdGNoOwotICAgIEZUX1Nob3J0ICAgIHVuZGVybGluZV9wb3NpdGlvbjsKLSAgICBGVF9VU2hvcnQgICB1bmRlcmxpbmVfdGhpY2tuZXNzOwotCi0gIH0gUFNfRm9udEluZm9SZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Gb250SW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFBTX0ZvbnRJbmZvUmVjXyogIFBTX0ZvbnRJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRm9udEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQFBTX0ZvbnRJbmZvUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICovCi0gIC8qICAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAqLwotICAvKiAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgUFNfRm9udEluZm9SZWMgIFQxX0ZvbnRJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUHJpdmF0ZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFR5cGUxL1R5cGUyIHByaXZhdGUgZGljdGlvbmFyeS4gIE5vdGUgICovCi0gIC8qICAgIHRoYXQgZm9yIE11bHRpcGxlIE1hc3RlciBmb250cywgZWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biBQcml2YXRlICAqLwotICAvKiAgICBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19Qcml2YXRlUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICB1bmlxdWVfaWQ7Ci0gICAgRlRfSW50ICAgICBsZW5JVjsKLQotICAgIEZUX0J5dGUgICAgbnVtX2JsdWVfdmFsdWVzOwotICAgIEZUX0J5dGUgICAgbnVtX290aGVyX2JsdWVzOwotICAgIEZUX0J5dGUgICAgbnVtX2ZhbWlseV9ibHVlczsKLSAgICBGVF9CeXRlICAgIG51bV9mYW1pbHlfb3RoZXJfYmx1ZXM7Ci0KLSAgICBGVF9TaG9ydCAgIGJsdWVfdmFsdWVzWzE0XTsKLSAgICBGVF9TaG9ydCAgIG90aGVyX2JsdWVzWzEwXTsKLQotICAgIEZUX1Nob3J0ICAgZmFtaWx5X2JsdWVzICAgICAgWzE0XTsKLSAgICBGVF9TaG9ydCAgIGZhbWlseV9vdGhlcl9ibHVlc1sxMF07Ci0KLSAgICBGVF9GaXhlZCAgIGJsdWVfc2NhbGU7Ci0gICAgRlRfSW50ICAgICBibHVlX3NoaWZ0OwotICAgIEZUX0ludCAgICAgYmx1ZV9mdXp6OwotCi0gICAgRlRfVVNob3J0ICBzdGFuZGFyZF93aWR0aFsxXTsKLSAgICBGVF9VU2hvcnQgIHN0YW5kYXJkX2hlaWdodFsxXTsKLQotICAgIEZUX0J5dGUgICAgbnVtX3NuYXBfd2lkdGhzOwotICAgIEZUX0J5dGUgICAgbnVtX3NuYXBfaGVpZ2h0czsKLSAgICBGVF9Cb29sICAgIGZvcmNlX2JvbGQ7Ci0gICAgRlRfQm9vbCAgICByb3VuZF9zdGVtX3VwOwotCi0gICAgRlRfU2hvcnQgICBzbmFwX3dpZHRocyBbMTNdOyAgLyogaW5jbHVkaW5nIHN0ZCB3aWR0aCAgKi8KLSAgICBGVF9TaG9ydCAgIHNuYXBfaGVpZ2h0c1sxM107ICAvKiBpbmNsdWRpbmcgc3RkIGhlaWdodCAqLwotCi0gICAgRlRfRml4ZWQgICBleHBhbnNpb25fZmFjdG9yOwotCi0gICAgRlRfTG9uZyAgICBsYW5ndWFnZV9ncm91cDsKLSAgICBGVF9Mb25nICAgIHBhc3N3b3JkOwotCi0gICAgRlRfU2hvcnQgICBtaW5fZmVhdHVyZVsyXTsKLQotICB9IFBTX1ByaXZhdGVSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEBQU19Qcml2YXRlUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFBTX1ByaXZhdGVSZWNfKiAgUFNfUHJpdmF0ZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQFBTX1ByaXZhdGVSZWMuICBJdCBpcyBkZXByZWNhdGVkIGJ1dCAgICAqLwotICAvKiAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAgKi8KLSAgLyogICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIFBTX1ByaXZhdGVSZWMgIFQxX1ByaXZhdGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CbGVuZF9GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNldCBvZiBmbGFncyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gYmxlbmQgZGljdGlvbmFyeSAoZm9udCBpbmZvIG9yIHByaXZhdGUpLiAgVXNlZCB0byBzdXBwb3J0ICAgICovCi0gIC8qICAgIE11bHRpcGxlIE1hc3RlcnMgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBUMV9CbGVuZF9GbGFnc18KLSAgewotICAgIC8qIyByZXF1aXJlZCBmaWVsZHMgaW4gYSBGb250SW5mbyBibGVuZCBkaWN0aW9uYXJ5ICovCi0gICAgVDFfQkxFTkRfVU5ERVJMSU5FX1BPU0lUSU9OID0gMCwKLSAgICBUMV9CTEVORF9VTkRFUkxJTkVfVEhJQ0tORVNTLAotICAgIFQxX0JMRU5EX0lUQUxJQ19BTkdMRSwKLQotICAgIC8qIyByZXF1aXJlZCBmaWVsZHMgaW4gYSBQcml2YXRlIGJsZW5kIGRpY3Rpb25hcnkgKi8KLSAgICBUMV9CTEVORF9CTFVFX1ZBTFVFUywKLSAgICBUMV9CTEVORF9PVEhFUl9CTFVFUywKLSAgICBUMV9CTEVORF9TVEFOREFSRF9XSURUSCwKLSAgICBUMV9CTEVORF9TVEFOREFSRF9IRUlHSFQsCi0gICAgVDFfQkxFTkRfU1RFTV9TTkFQX1dJRFRIUywKLSAgICBUMV9CTEVORF9TVEVNX1NOQVBfSEVJR0hUUywKLSAgICBUMV9CTEVORF9CTFVFX1NDQUxFLAotICAgIFQxX0JMRU5EX0JMVUVfU0hJRlQsCi0gICAgVDFfQkxFTkRfRkFNSUxZX0JMVUVTLAotICAgIFQxX0JMRU5EX0ZBTUlMWV9PVEhFUl9CTFVFUywKLSAgICBUMV9CTEVORF9GT1JDRV9CT0xELAotCi0gICAgLyojIG5ldmVyIHJlbW92ZSAqLwotICAgIFQxX0JMRU5EX01BWAotCi0gIH0gVDFfQmxlbmRfRmxhZ3M7Ci0KLSAgLyogKi8KLQotCi0gIC8qIyBiYWNrd2FyZHMgY29tcGF0aWJsZSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSB0MV9ibGVuZF91bmRlcmxpbmVfcG9zaXRpb24gICBUMV9CTEVORF9VTkRFUkxJTkVfUE9TSVRJT04KLSNkZWZpbmUgdDFfYmxlbmRfdW5kZXJsaW5lX3RoaWNrbmVzcyAgVDFfQkxFTkRfVU5ERVJMSU5FX1RISUNLTkVTUwotI2RlZmluZSB0MV9ibGVuZF9pdGFsaWNfYW5nbGUgICAgICAgICBUMV9CTEVORF9JVEFMSUNfQU5HTEUKLSNkZWZpbmUgdDFfYmxlbmRfYmx1ZV92YWx1ZXMgICAgICAgICAgVDFfQkxFTkRfQkxVRV9WQUxVRVMKLSNkZWZpbmUgdDFfYmxlbmRfb3RoZXJfYmx1ZXMgICAgICAgICAgVDFfQkxFTkRfT1RIRVJfQkxVRVMKLSNkZWZpbmUgdDFfYmxlbmRfc3RhbmRhcmRfd2lkdGhzICAgICAgVDFfQkxFTkRfU1RBTkRBUkRfV0lEVEgKLSNkZWZpbmUgdDFfYmxlbmRfc3RhbmRhcmRfaGVpZ2h0ICAgICAgVDFfQkxFTkRfU1RBTkRBUkRfSEVJR0hUCi0jZGVmaW5lIHQxX2JsZW5kX3N0ZW1fc25hcF93aWR0aHMgICAgIFQxX0JMRU5EX1NURU1fU05BUF9XSURUSFMKLSNkZWZpbmUgdDFfYmxlbmRfc3RlbV9zbmFwX2hlaWdodHMgICAgVDFfQkxFTkRfU1RFTV9TTkFQX0hFSUdIVFMKLSNkZWZpbmUgdDFfYmxlbmRfYmx1ZV9zY2FsZSAgICAgICAgICAgVDFfQkxFTkRfQkxVRV9TQ0FMRQotI2RlZmluZSB0MV9ibGVuZF9ibHVlX3NoaWZ0ICAgICAgICAgICBUMV9CTEVORF9CTFVFX1NISUZUCi0jZGVmaW5lIHQxX2JsZW5kX2ZhbWlseV9ibHVlcyAgICAgICAgIFQxX0JMRU5EX0ZBTUlMWV9CTFVFUwotI2RlZmluZSB0MV9ibGVuZF9mYW1pbHlfb3RoZXJfYmx1ZXMgICBUMV9CTEVORF9GQU1JTFlfT1RIRVJfQkxVRVMKLSNkZWZpbmUgdDFfYmxlbmRfZm9yY2VfYm9sZCAgICAgICAgICAgVDFfQkxFTkRfRk9SQ0VfQk9MRAotI2RlZmluZSB0MV9ibGVuZF9tYXggICAgICAgICAgICAgICAgICBUMV9CTEVORF9NQVgKLQotCi0gIC8qIG1heGltdW0gbnVtYmVyIG9mIE11bHRpcGxlIE1hc3RlcnMgZGVzaWducywgYXMgZGVmaW5lZCBpbiB0aGUgc3BlYyAqLwotI2RlZmluZSBUMV9NQVhfTU1fREVTSUdOUyAgICAgMTYKLQotICAvKiBtYXhpbXVtIG51bWJlciBvZiBNdWx0aXBsZSBNYXN0ZXJzIGF4ZXMsIGFzIGRlZmluZWQgaW4gdGhlIHNwZWMgKi8KLSNkZWZpbmUgVDFfTUFYX01NX0FYSVMgICAgICAgIDQKLQotICAvKiBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGRlc2lnbiBtYXAgKi8KLSNkZWZpbmUgVDFfTUFYX01NX01BUF9QT0lOVFMgIDIwCi0KLQotICAvKiB0aGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBCbGVuZERlc2lnbk1hcCBlbnRyeSBmb3IgYW4gYXhpcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfRGVzaWduTWFwXwotICB7Ci0gICAgRlRfQnl0ZSAgICBudW1fcG9pbnRzOwotICAgIEZUX0xvbmcqICAgZGVzaWduX3BvaW50czsKLSAgICBGVF9GaXhlZCogIGJsZW5kX3BvaW50czsKLQotICB9IFBTX0Rlc2lnbk1hcFJlYywgKlBTX0Rlc2lnbk1hcDsKLQotICAvKiBiYWNrd2FyZHMtY29tcGF0aWJsZSBkZWZpbml0aW9uICovCi0gIHR5cGVkZWYgUFNfRGVzaWduTWFwUmVjICBUMV9EZXNpZ25NYXA7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNfQmxlbmRSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9kZXNpZ25zOwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX2F4aXM7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgIGF4aXNfbmFtZXNbVDFfTUFYX01NX0FYSVNdOwotICAgIEZUX0ZpeGVkKiAgICAgICAgZGVzaWduX3Bvc1tUMV9NQVhfTU1fREVTSUdOU107Ci0gICAgUFNfRGVzaWduTWFwUmVjICBkZXNpZ25fbWFwW1QxX01BWF9NTV9BWElTXTsKLQotICAgIEZUX0ZpeGVkKiAgICAgICAgd2VpZ2h0X3ZlY3RvcjsKLSAgICBGVF9GaXhlZCogICAgICAgIGRlZmF1bHRfd2VpZ2h0X3ZlY3RvcjsKLQotICAgIFBTX0ZvbnRJbmZvICAgICAgZm9udF9pbmZvc1tUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotICAgIFBTX1ByaXZhdGUgICAgICAgcHJpdmF0ZXMgIFtUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotCi0gICAgRlRfVUxvbmcgICAgICAgICBibGVuZF9iaXRmbGFnczsKLQotICAgIEZUX0JCb3gqICAgICAgICAgYmJveGVzICAgIFtUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotCi0gICAgLyogc2luY2UgMi4zLjAgKi8KLQotICAgIC8qIHVuZG9jdW1lbnRlZCwgb3B0aW9uYWw6IHRoZSBkZWZhdWx0IGRlc2lnbiBpbnN0YW5jZTsgICAqLwotICAgIC8qIGNvcnJlc3BvbmRzIHRvIGRlZmF1bHRfd2VpZ2h0X3ZlY3RvciAtLSAgICAgICAgICAgICAgICAqLwotICAgIC8qIG51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3IgPT0gMCBtZWFucyBpdCBpcyBub3QgcHJlc2VudCAqLwotICAgIC8qIGluIHRoZSBmb250IGFuZCBhc3NvY2lhdGVkIG1ldHJpY3MgZmlsZXMgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgZGVmYXVsdF9kZXNpZ25fdmVjdG9yW1QxX01BWF9NTV9ERVNJR05TXTsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3I7Ci0KLSAgfSBQU19CbGVuZFJlYywgKlBTX0JsZW5kOwotCi0KLSAgLyogYmFja3dhcmRzLWNvbXBhdGlibGUgZGVmaW5pdGlvbiAqLwotICB0eXBlZGVmIFBTX0JsZW5kUmVjICBUMV9CbGVuZDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlRGljdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGRhdGEgaW4gYSBDSUQgdG9wLWxldmVsIGRpY3Rpb25hcnkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9GYWNlRGljdFJlY18KLSAgewotICAgIFBTX1ByaXZhdGVSZWMgIHByaXZhdGVfZGljdDsKLQotICAgIEZUX1VJbnQgICAgICAgIGxlbl9idWlsZGNoYXI7Ci0gICAgRlRfRml4ZWQgICAgICAgZm9yY2Vib2xkX3RocmVzaG9sZDsKLSAgICBGVF9Qb3MgICAgICAgICBzdHJva2Vfd2lkdGg7Ci0gICAgRlRfRml4ZWQgICAgICAgZXhwYW5zaW9uX2ZhY3RvcjsKLQotICAgIEZUX0J5dGUgICAgICAgIHBhaW50X3R5cGU7Ci0gICAgRlRfQnl0ZSAgICAgICAgZm9udF90eXBlOwotICAgIEZUX01hdHJpeCAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgIGZvbnRfb2Zmc2V0OwotCi0gICAgRlRfVUludCAgICAgICAgbnVtX3N1YnJzOwotICAgIEZUX1VMb25nICAgICAgIHN1YnJtYXBfb2Zmc2V0OwotICAgIEZUX0ludCAgICAgICAgIHNkX2J5dGVzOwotCi0gIH0gQ0lEX0ZhY2VEaWN0UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VEaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VEaWN0UmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZURpY3RSZWNfKiAgQ0lEX0ZhY2VEaWN0OwotCi0gIC8qICovCi0KLQotICAvKiBiYWNrd2FyZHMtY29tcGF0aWJsZSBkZWZpbml0aW9uICovCi0gIHR5cGVkZWYgQ0lEX0ZhY2VEaWN0UmVjICBDSURfRm9udERpY3Q7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZUluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBDSUQgRmFjZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZUluZm9SZWNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICAgICAgY2lkX2ZvbnRfbmFtZTsKLSAgICBGVF9GaXhlZCAgICAgICAgY2lkX3ZlcnNpb247Ci0gICAgRlRfSW50ICAgICAgICAgIGNpZF9mb250X3R5cGU7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgcmVnaXN0cnk7Ci0gICAgRlRfU3RyaW5nKiAgICAgIG9yZGVyaW5nOwotICAgIEZUX0ludCAgICAgICAgICBzdXBwbGVtZW50OwotCi0gICAgUFNfRm9udEluZm9SZWMgIGZvbnRfaW5mbzsKLSAgICBGVF9CQm94ICAgICAgICAgZm9udF9iYm94OwotICAgIEZUX1VMb25nICAgICAgICB1aWRfYmFzZTsKLQotICAgIEZUX0ludCAgICAgICAgICBudW1feHVpZDsKLSAgICBGVF9VTG9uZyAgICAgICAgeHVpZFsxNl07Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgY2lkbWFwX29mZnNldDsKLSAgICBGVF9JbnQgICAgICAgICAgZmRfYnl0ZXM7Ci0gICAgRlRfSW50ICAgICAgICAgIGdkX2J5dGVzOwotICAgIEZUX1VMb25nICAgICAgICBjaWRfY291bnQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgbnVtX2RpY3RzOwotICAgIENJRF9GYWNlRGljdCAgICBmb250X2RpY3RzOwotCi0gICAgRlRfVUxvbmcgICAgICAgIGRhdGFfb2Zmc2V0OwotCi0gIH0gQ0lEX0ZhY2VJbmZvUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VJbmZvUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZUluZm9SZWNfKiAgQ0lEX0ZhY2VJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAQ0lEX0ZhY2VJbmZvUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICovCi0gIC8qICAga2VwdCB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgICAqLwotICAvKiAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgQ0lEX0ZhY2VJbmZvUmVjICBDSURfSW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9IYXNfUFNfR2x5cGhfTmFtZXMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXR1cm4gdHJ1ZSBpZiBhIGdpdmVuIGZhY2UgcHJvdmlkZXMgcmVsaWFibGUgUG9zdHNjcmlwdCBnbHlwaAotICAgKiAgICBuYW1lcy4gIFRoaXMgaXMgc2ltaWxhciB0byB1c2luZyB0aGUgQEZUX0hBU19HTFlQSF9OQU1FUyBtYWNybywKLSAgICogICAgZXhjZXB0IHRoYXQgY2VydGFpbiBmb250cyAobW9zdGx5IFRydWVUeXBlKSBjb250YWluIGluY29ycmVjdAotICAgKiAgICBnbHlwaCBuYW1lIHRhYmxlcy4KLSAgICoKLSAgICogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGNhbGxlciBpcyBzdXJlIHRoYXQgdGhlIGdseXBoCi0gICAqICAgIG5hbWVzIHJldHVybmVkIGJ5IEBGVF9HZXRfR2x5cGhfTmFtZSBhcmUgcmVsaWFibGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBmYWNlIGhhbmRsZQotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBCb29sZWFuLiAgVHJ1ZSBpZiBnbHlwaCBuYW1lcyBhcmUgcmVsaWFibGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0ludCApCi0gIEZUX0hhc19QU19HbHlwaF9OYW1lcyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9QU19Gb250X0luZm8KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAgICogICAgUG9zdHNjcmlwdCBmb250LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgOjoKLSAgICogICAgICAgUG9zdHNjcmlwdCBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgYWZvbnRfaW5mbyA6OgotICAgKiAgICAgICBPdXRwdXQgZm9udCBpbmZvIHN0cnVjdHVyZSBwb2ludGVyLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgVGhlIHN0cmluZyBwb2ludGVycyB3aXRoaW4gdGhlIGZvbnQgaW5mbyBzdHJ1Y3R1cmUgYXJlIG93bmVkIGJ5Ci0gICAqICAgIHRoZSBmYWNlIGFuZCBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0c2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKLSAgICogICAgcmV0dXJuIHRoZSBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yIGNvZGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1BTX0ZvbnRfSW5mbyggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvICBhZm9udF9pbmZvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1BTX0ZvbnRfUHJpdmF0ZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIFJldHJpZXZlIHRoZSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCi0gICAqICAgIFBvc3RzY3JpcHQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIFBvc3RzY3JpcHQgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIGFmb250X3ByaXZhdGUgOjoKLSAgICogICAgICAgT3V0cHV0IHByaXZhdGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgcG9pbnRlci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIFRoZSBzdHJpbmcgcG9pbnRlcnMgd2l0aGluIHRoZSBmb250IGluZm8gc3RydWN0dXJlIGFyZSBvd25lZCBieQotICAgKiAgICB0aGUgZmFjZSBhbmQgZG9uJ3QgbmVlZCB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICAgKgotICAgKiAgICBJZiB0aGUgZm9udCdzIGZvcm1hdCBpcyBub3QgUG9zdHNjcmlwdC1iYXNlZCwgdGhpcyBmdW5jdGlvbiB3aWxsCi0gICAqICAgIHJldHVybiB0aGUgYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50JyBlcnJvciBjb2RlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9QU19Gb250X1ByaXZhdGUoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTX1ByaXZhdGUgIGFmb250X3ByaXZhdGUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVDFUQUJMRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmggYi9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZGRiYTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG5hbWVpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgbmFtZSBJRCBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMiwgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVE5BTUVJRF9IX18KLSNkZWZpbmUgX19UVE5BTUVJRF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRydWV0eXBlX3RhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zc2libGUgdmFsdWVzIGZvciB0aGUgYHBsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaW4gdGhlIG5hbWUgICAgICAgICovCi0gIC8qIHJlY29yZHMgb2YgdGhlIFRURiBgbmFtZScgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfUExBVEZPUk1fWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYHBsYXRmb3JtX2lkJyBpZGVudGlmaWVyIGNvZGUgaW4KLSAgICogICBARlRfQ2hhck1hcFJlYyBhbmQgQEZUX1NmbnROYW1lIHN0cnVjdHVyZXMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERSA6OgotICAgKiAgICAgVXNlZCBieSBBcHBsZSB0byBpbmRpY2F0ZSBhIFVuaWNvZGUgY2hhcmFjdGVyIG1hcCBhbmQvb3IgbmFtZSBlbnRyeS4KLSAgICogICAgIFNlZSBAVFRfQVBQTEVfSURfWFhYIGZvciBjb3JyZXNwb25kaW5nIGBlbmNvZGluZ19pZCcgdmFsdWVzLiAgTm90ZQotICAgKiAgICAgdGhhdCBuYW1lIGVudHJpZXMgaW4gdGhpcyBmb3JtYXQgYXJlIGNvZGVkIGFzIGJpZy1lbmRpYW4gVUNTLTIKLSAgICogICAgIGNoYXJhY3RlciBjb2RlcyBfb25seV8uCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fTUFDSU5UT1NIIDo6Ci0gICAqICAgICBVc2VkIGJ5IEFwcGxlIHRvIGluZGljYXRlIGEgTWFjT1Mtc3BlY2lmaWMgY2hhcm1hcCBhbmQvb3IgbmFtZSBlbnRyeS4KLSAgICogICAgIFNlZSBAVFRfTUFDX0lEX1hYWCBmb3IgY29ycmVzcG9uZGluZyBgZW5jb2RpbmdfaWQnIHZhbHVlcy4gIE5vdGUgdGhhdAotICAgKiAgICAgbW9zdCBUcnVlVHlwZSBmb250cyBjb250YWluIGFuIEFwcGxlIHJvbWFuIGNoYXJtYXAgdG8gYmUgdXNhYmxlIG9uCi0gICAqICAgICBNYWNPUyBzeXN0ZW1zIChldmVuIGlmIHRoZXkgY29udGFpbiBhIE1pY3Jvc29mdCBjaGFybWFwIGFzIHdlbGwpLgotICAgKgotICAgKiAgIFRUX1BMQVRGT1JNX0lTTyA6OgotICAgKiAgICAgVGhpcyB2YWx1ZSB3YXMgdXNlZCB0byBzcGVjaWZ5IFVuaWNvZGUgY2hhcm1hcHMuICBJdCBpcyBob3dldmVyCi0gICAqICAgICBub3cgZGVwcmVjYXRlZC4gIFNlZSBAVFRfSVNPX0lEX1hYWCBmb3IgYSBsaXN0IG9mIGNvcnJlc3BvbmRpbmcKLSAgICogICAgIGBlbmNvZGluZ19pZCcgdmFsdWVzLgotICAgKgotICAgKiAgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCA6OgotICAgKiAgICAgVXNlZCBieSBNaWNyb3NvZnQgdG8gaW5kaWNhdGUgV2luZG93cy1zcGVjaWZpYyBjaGFybWFwcy4gIFNlZQotICAgKiAgICAgQFRUX01TX0lEX1hYWCBmb3IgYSBsaXN0IG9mIGNvcnJlc3BvbmRpbmcgYGVuY29kaW5nX2lkJyB2YWx1ZXMuCi0gICAqICAgICBOb3RlIHRoYXQgbW9zdCBmb250cyBjb250YWluIGEgVW5pY29kZSBjaGFybWFwIHVzaW5nCi0gICAqICAgICAoVFRfUExBVEZPUk1fTUlDUk9TT0ZULCBAVFRfTVNfSURfVU5JQ09ERV9DUykuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fQ1VTVE9NIDo6Ci0gICAqICAgICBVc2VkIHRvIGluZGljYXRlIGFwcGxpY2F0aW9uLXNwZWNpZmljIGNoYXJtYXBzLgotICAgKgotICAgKiAgIFRUX1BMQVRGT1JNX0FET0JFIDo6Ci0gICAqICAgICBUaGlzIHZhbHVlIGlzbid0IHBhcnQgb2YgYW55IGZvbnQgZm9ybWF0IHNwZWNpZmljYXRpb24sIGJ1dCBpcyB1c2VkCi0gICAqICAgICBieSBGcmVlVHlwZSB0byByZXBvcnQgQWRvYmUtc3BlY2lmaWMgY2hhcm1hcHMgaW4gYW4gQEZUX0NoYXJNYXBSZWMKLSAgICogICAgIHN0cnVjdHVyZS4gIFNlZSBAVFRfQURPQkVfSURfWFhYLgotICAgKi8KLQotI2RlZmluZSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFICAwCi0jZGVmaW5lIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCAgICAgIDEKLSNkZWZpbmUgVFRfUExBVEZPUk1fSVNPICAgICAgICAgICAgMiAvKiBkZXByZWNhdGVkICovCi0jZGVmaW5lIFRUX1BMQVRGT1JNX01JQ1JPU09GVCAgICAgIDMKLSNkZWZpbmUgVFRfUExBVEZPUk1fQ1VTVE9NICAgICAgICAgNAotI2RlZmluZSBUVF9QTEFURk9STV9BRE9CRSAgICAgICAgICA3IC8qIGFydGlmaWNpYWwgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9BUFBMRV9JRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgZW5jb2RpbmdfaWQnIGZvcgotICAgKiAgIEBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFIGNoYXJtYXBzIGFuZCBuYW1lIGVudHJpZXMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfQVBQTEVfSURfREVGQVVMVCA6OgotICAgKiAgICAgVW5pY29kZSB2ZXJzaW9uIDEuMC4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9VTklDT0RFXzFfMSA6OgotICAgKiAgICAgVW5pY29kZSAxLjE7IHNwZWNpZmllcyBIYW5ndWwgY2hhcmFjdGVycyBzdGFydGluZyBhdCBVKzM0eHguCi0gICAqCi0gICAqICAgVFRfQVBQTEVfSURfSVNPXzEwNjQ2IDo6Ci0gICAqICAgICBEZXByZWNhdGVkIChpZGVudGljYWwgdG8gcHJlY2VkaW5nKS4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9VTklDT0RFXzJfMCA6OgotICAgKiAgICAgVW5pY29kZSAyLjAgYW5kIGJleW9uZCAoVVRGLTE2IEJNUCBvbmx5KS4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9VTklDT0RFXzMyIDo6Ci0gICAqICAgICBVbmljb2RlIDMuMSBhbmQgYmV5b25kLCB1c2luZyBVVEYtMzIuCi0gICAqCi0gICAqICAgVFRfQVBQTEVfSURfVkFSSUFOVF9TRUxFQ1RPUiA6OgotICAgKiAgICAgRnJvbSBBZG9iZSwgbm90IEFwcGxlLiAgTm90IGEgbm9ybWFsIGNtYXAuICBTcGVjaWZpZXMgdmFyaWF0aW9ucwotICAgKiAgICAgb24gYSByZWFsIGNtYXAuCi0gICAqLwotCi0jZGVmaW5lIFRUX0FQUExFX0lEX0RFRkFVTFQgICAgICAgICAgIDAgLyogVW5pY29kZSAxLjAgKi8KLSNkZWZpbmUgVFRfQVBQTEVfSURfVU5JQ09ERV8xXzEgICAgICAgMSAvKiBzcGVjaWZ5IEhhbmd1bCBhdCBVKzM0eHggKi8KLSNkZWZpbmUgVFRfQVBQTEVfSURfSVNPXzEwNjQ2ICAgICAgICAgMiAvKiBkZXByZWNhdGVkICovCi0jZGVmaW5lIFRUX0FQUExFX0lEX1VOSUNPREVfMl8wICAgICAgIDMgLyogb3IgbGF0ZXIgKi8KLSNkZWZpbmUgVFRfQVBQTEVfSURfVU5JQ09ERV8zMiAgICAgICAgNCAvKiAyLjAgb3IgbGF0ZXIsIGZ1bGwgcmVwZXJ0b2lyZSAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9WQVJJQU5UX1NFTEVDVE9SICA1IC8qIHZhcmlhdGlvbiBzZWxlY3RvciBkYXRhICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfTUFDX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSCBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIFRUX01BQ19JRF9ST01BTiA6OgotICAgKiAgIFRUX01BQ19JRF9KQVBBTkVTRSA6OgotICAgKiAgIFRUX01BQ19JRF9UUkFESVRJT05BTF9DSElORVNFIDo6Ci0gICAqICAgVFRfTUFDX0lEX0tPUkVBTiA6OgotICAgKiAgIFRUX01BQ19JRF9BUkFCSUMgOjoKLSAgICogICBUVF9NQUNfSURfSEVCUkVXIDo6Ci0gICAqICAgVFRfTUFDX0lEX0dSRUVLIDo6Ci0gICAqICAgVFRfTUFDX0lEX1JVU1NJQU4gOjoKLSAgICogICBUVF9NQUNfSURfUlNZTUJPTCA6OgotICAgKiAgIFRUX01BQ19JRF9ERVZBTkFHQVJJIDo6Ci0gICAqICAgVFRfTUFDX0lEX0dVUk1VS0hJIDo6Ci0gICAqICAgVFRfTUFDX0lEX0dVSkFSQVRJIDo6Ci0gICAqICAgVFRfTUFDX0lEX09SSVlBIDo6Ci0gICAqICAgVFRfTUFDX0lEX0JFTkdBTEkgOjoKLSAgICogICBUVF9NQUNfSURfVEFNSUwgOjoKLSAgICogICBUVF9NQUNfSURfVEVMVUdVIDo6Ci0gICAqICAgVFRfTUFDX0lEX0tBTk5BREEgOjoKLSAgICogICBUVF9NQUNfSURfTUFMQVlBTEFNIDo6Ci0gICAqICAgVFRfTUFDX0lEX1NJTkhBTEVTRSA6OgotICAgKiAgIFRUX01BQ19JRF9CVVJNRVNFIDo6Ci0gICAqICAgVFRfTUFDX0lEX0tITUVSIDo6Ci0gICAqICAgVFRfTUFDX0lEX1RIQUkgOjoKLSAgICogICBUVF9NQUNfSURfTEFPVElBTiA6OgotICAgKiAgIFRUX01BQ19JRF9HRU9SR0lBTiA6OgotICAgKiAgIFRUX01BQ19JRF9BUk1FTklBTiA6OgotICAgKiAgIFRUX01BQ19JRF9NQUxESVZJQU4gOjoKLSAgICogICBUVF9NQUNfSURfU0lNUExJRklFRF9DSElORVNFIDo6Ci0gICAqICAgVFRfTUFDX0lEX1RJQkVUQU4gOjoKLSAgICogICBUVF9NQUNfSURfTU9OR09MSUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0dFRVogOjoKLSAgICogICBUVF9NQUNfSURfU0xBVklDIDo6Ci0gICAqICAgVFRfTUFDX0lEX1ZJRVROQU1FU0UgOjoKLSAgICogICBUVF9NQUNfSURfU0lOREhJIDo6Ci0gICAqICAgVFRfTUFDX0lEX1VOSU5URVJQIDo6Ci0gICAqLwotCi0jZGVmaW5lIFRUX01BQ19JRF9ST01BTiAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBUVF9NQUNfSURfSkFQQU5FU0UgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFRfTUFDX0lEX1RSQURJVElPTkFMX0NISU5FU0UgICAyCi0jZGVmaW5lIFRUX01BQ19JRF9LT1JFQU4gICAgICAgICAgICAgICAgMwotI2RlZmluZSBUVF9NQUNfSURfQVJBQklDICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVFRfTUFDX0lEX0hFQlJFVyAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFRUX01BQ19JRF9HUkVFSyAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBUVF9NQUNfSURfUlVTU0lBTiAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgVFRfTUFDX0lEX1JTWU1CT0wgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFRUX01BQ19JRF9ERVZBTkFHQVJJICAgICAgICAgICAgOQotI2RlZmluZSBUVF9NQUNfSURfR1VSTVVLSEkgICAgICAgICAgICAgMTAKLSNkZWZpbmUgVFRfTUFDX0lEX0dVSkFSQVRJICAgICAgICAgICAgIDExCi0jZGVmaW5lIFRUX01BQ19JRF9PUklZQSAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBUVF9NQUNfSURfQkVOR0FMSSAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgVFRfTUFDX0lEX1RBTUlMICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIFRUX01BQ19JRF9URUxVR1UgICAgICAgICAgICAgICAxNQotI2RlZmluZSBUVF9NQUNfSURfS0FOTkFEQSAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgVFRfTUFDX0lEX01BTEFZQUxBTSAgICAgICAgICAgIDE3Ci0jZGVmaW5lIFRUX01BQ19JRF9TSU5IQUxFU0UgICAgICAgICAgICAxOAotI2RlZmluZSBUVF9NQUNfSURfQlVSTUVTRSAgICAgICAgICAgICAgMTkKLSNkZWZpbmUgVFRfTUFDX0lEX0tITUVSICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFRUX01BQ19JRF9USEFJICAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBUVF9NQUNfSURfTEFPVElBTiAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgVFRfTUFDX0lEX0dFT1JHSUFOICAgICAgICAgICAgIDIzCi0jZGVmaW5lIFRUX01BQ19JRF9BUk1FTklBTiAgICAgICAgICAgICAyNAotI2RlZmluZSBUVF9NQUNfSURfTUFMRElWSUFOICAgICAgICAgICAgMjUKLSNkZWZpbmUgVFRfTUFDX0lEX1NJTVBMSUZJRURfQ0hJTkVTRSAgIDI1Ci0jZGVmaW5lIFRUX01BQ19JRF9USUJFVEFOICAgICAgICAgICAgICAyNgotI2RlZmluZSBUVF9NQUNfSURfTU9OR09MSUFOICAgICAgICAgICAgMjcKLSNkZWZpbmUgVFRfTUFDX0lEX0dFRVogICAgICAgICAgICAgICAgIDI4Ci0jZGVmaW5lIFRUX01BQ19JRF9TTEFWSUMgICAgICAgICAgICAgICAyOQotI2RlZmluZSBUVF9NQUNfSURfVklFVE5BTUVTRSAgICAgICAgICAgMzAKLSNkZWZpbmUgVFRfTUFDX0lEX1NJTkRISSAgICAgICAgICAgICAgIDMxCi0jZGVmaW5lIFRUX01BQ19JRF9VTklOVEVSUCAgICAgICAgICAgICAzMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX0lTT19JRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgZW5jb2RpbmdfaWQnIGZvcgotICAgKiAgIEBUVF9QTEFURk9STV9JU08gY2hhcm1hcHMgYW5kIG5hbWUgZW50cmllcy4KLSAgICoKLSAgICogICBUaGVpciB1c2UgaXMgbm93IGRlcHJlY2F0ZWQuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfSVNPX0lEXzdCSVRfQVNDSUkgOjoKLSAgICogICAgIEFTQ0lJLgotICAgKiAgIFRUX0lTT19JRF8xMDY0NiA6OgotICAgKiAgICAgSVNPLzEwNjQ2LgotICAgKiAgIFRUX0lTT19JRF84ODU5XzEgOjoKLSAgICogICAgIEFsc28ga25vd24gYXMgTGF0aW4tMS4KLSAgICovCi0KLSNkZWZpbmUgVFRfSVNPX0lEXzdCSVRfQVNDSUkgIDAKLSNkZWZpbmUgVFRfSVNPX0lEXzEwNjQ2ICAgICAgIDEKLSNkZWZpbmUgVFRfSVNPX0lEXzg4NTlfMSAgICAgIDIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9NU19JRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgZW5jb2RpbmdfaWQnIGZvcgotICAgKiAgIEBUVF9QTEFURk9STV9NSUNST1NPRlQgY2hhcm1hcHMgYW5kIG5hbWUgZW50cmllcy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9NU19JRF9TWU1CT0xfQ1MgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIE1pY3Jvc29mdCBzeW1ib2wgZW5jb2RpbmcuIFNlZQotICAgKiAgICAgQEZUX0VOQ09ESU5HX01TX1NZTUJPTC4KLSAgICoKLSAgICogICBUVF9NU19JRF9VTklDT0RFX0NTIDo6Ci0gICAqICAgICBDb3JyZXNwb25kcyB0byBhIE1pY3Jvc29mdCBXR0w0IGNoYXJtYXAsIG1hdGNoaW5nIFVuaWNvZGUuICBTZWUKLSAgICogICAgIEBGVF9FTkNPRElOR19VTklDT0RFLgotICAgKgotICAgKiAgIFRUX01TX0lEX1NKSVMgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIFNKSVMgSmFwYW5lc2UgZW5jb2RpbmcuICBTZWUgQEZUX0VOQ09ESU5HX1NKSVMuCi0gICAqCi0gICAqICAgVFRfTVNfSURfR0IyMzEyIDo6Ci0gICAqICAgICBDb3JyZXNwb25kcyB0byBTaW1wbGlmaWVkIENoaW5lc2UgYXMgdXNlZCBpbiBNYWlubGFuZCBDaGluYS4gIFNlZQotICAgKiAgICAgQEZUX0VOQ09ESU5HX0dCMjMxMi4KLSAgICoKLSAgICogICBUVF9NU19JRF9CSUdfNSA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gVHJhZGl0aW9uYWwgQ2hpbmVzZSBhcyB1c2VkIGluIFRhaXdhbiBhbmQgSG9uZyBLb25nLgotICAgKiAgICAgU2VlIEBGVF9FTkNPRElOR19CSUc1LgotICAgKgotICAgKiAgIFRUX01TX0lEX1dBTlNVTkcgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIEtvcmVhbiBXYW5zdW5nIGVuY29kaW5nLiAgU2VlIEBGVF9FTkNPRElOR19XQU5TVU5HLgotICAgKgotICAgKiAgIFRUX01TX0lEX0pPSEFCIDo6Ci0gICAqICAgICBDb3JyZXNwb25kcyB0byBKb2hhYiBlbmNvZGluZy4gIFNlZSBARlRfRU5DT0RJTkdfSk9IQUIuCi0gICAqCi0gICAqICAgVFRfTVNfSURfVUNTXzQgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIFVDUy00IG9yIFVURi0zMiBjaGFybWFwcy4gIFRoaXMgaGFzIGJlZW4gYWRkZWQgdG8KLSAgICogICAgIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS40IChtaWQtMjAwMS4pCi0gICAqLwotCi0jZGVmaW5lIFRUX01TX0lEX1NZTUJPTF9DUyAgICAwCi0jZGVmaW5lIFRUX01TX0lEX1VOSUNPREVfQ1MgICAxCi0jZGVmaW5lIFRUX01TX0lEX1NKSVMgICAgICAgICAyCi0jZGVmaW5lIFRUX01TX0lEX0dCMjMxMiAgICAgICAzCi0jZGVmaW5lIFRUX01TX0lEX0JJR181ICAgICAgICA0Ci0jZGVmaW5lIFRUX01TX0lEX1dBTlNVTkcgICAgICA1Ci0jZGVmaW5lIFRUX01TX0lEX0pPSEFCICAgICAgICA2Ci0jZGVmaW5lIFRUX01TX0lEX1VDU180ICAgICAgIDEwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfQURPQkVfSURfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKLSAgICogICBAVFRfUExBVEZPUk1fQURPQkUgY2hhcm1hcHMuICBUaGlzIGlzIGEgRnJlZVR5cGUtc3BlY2lmaWMgZXh0ZW5zaW9uIQotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIFRUX0FET0JFX0lEX1NUQU5EQVJEIDo6Ci0gICAqICAgICBBZG9iZSBzdGFuZGFyZCBlbmNvZGluZy4KLSAgICogICBUVF9BRE9CRV9JRF9FWFBFUlQgOjoKLSAgICogICAgIEFkb2JlIGV4cGVydCBlbmNvZGluZy4KLSAgICogICBUVF9BRE9CRV9JRF9DVVNUT00gOjoKLSAgICogICAgIEFkb2JlIGN1c3RvbSBlbmNvZGluZy4KLSAgICogICBUVF9BRE9CRV9JRF9MQVRJTl8xIDo6Ci0gICAqICAgICBBZG9iZSBMYXRpbiAxIGVuY29kaW5nLgotICAgKi8KLQotI2RlZmluZSBUVF9BRE9CRV9JRF9TVEFOREFSRCAgMAotI2RlZmluZSBUVF9BRE9CRV9JRF9FWFBFUlQgICAgMQotI2RlZmluZSBUVF9BRE9CRV9JRF9DVVNUT00gICAgMgotI2RlZmluZSBUVF9BRE9CRV9JRF9MQVRJTl8xICAgMwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGxhbmd1YWdlIGlkZW50aWZpZXIgZmllbGQgaW4gdGhlIG5hbWUgcmVjb3JkcyAgKi8KLSAgLyogb2YgdGhlIFRURiBgbmFtZScgdGFibGUgaWYgdGhlIGBwbGF0Zm9ybScgaWRlbnRpZmllciBjb2RlIGlzICAgICAgICAgICovCi0gIC8qIFRUX1BMQVRGT1JNX01BQ0lOVE9TSC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGNhbm9uaWNhbCBzb3VyY2UgZm9yIHRoZSBBcHBsZSBhc3NpZ25lZCBMYW5ndWFnZSBJRCdzIGlzIGF0ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHA6Ly9mb250cy5hcHBsZS5jb20vVFRSZWZNYW4vUk0wNi9DaGFwNm5hbWUuaHRtbCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfRU5HTElTSCAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZSRU5DSCAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRVJNQU4gICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVRBTElBTiAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RVVENIICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TV0VESVNIICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU1BBTklTSCAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RBTklTSCAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QT1JUVUdVRVNFICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTk9SV0VHSUFOICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVBBTkVTRSAgICAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfQVJBQklDICAgICAgICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZJTk5JU0ggICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSUNFTEFORElDICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTFRFU0UgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UVVJLSVNIICAgICAgICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ1JPQVRJQU4gICAgICAgICAgICAgICAgICAgICAxOAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwgICAgICAgICAgMTkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VUkRVICAgICAgICAgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSElOREkgICAgICAgICAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LT1JFQU4gICAgICAgICAgICAgICAgICAgICAgIDIzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTElUSFVBTklBTiAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BPTElTSCAgICAgICAgICAgICAgICAgICAgICAgMjUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9IVU5HQVJJQU4gICAgICAgICAgICAgICAgICAgIDI2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfRVNUT05JQU4gICAgICAgICAgICAgICAgICAgICAyNwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xFVFRJU0ggICAgICAgICAgICAgICAgICAgICAgMjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQUFNSVNLICAgICAgICAgICAgICAgICAgICAgIDI5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfRkFFUk9FU0UgICAgICAgICAgICAgICAgICAgICAzMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZBUlNJICAgICAgICAgICAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVVNTSUFOICAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ0hJTkVTRV9TSU1QTElGSUVEICAgICAgICAgICAzMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZMRU1JU0ggICAgICAgICAgICAgICAgICAgICAgMzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JUklTSCAgICAgICAgICAgICAgICAgICAgICAgIDM1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQUxCQU5JQU4gICAgICAgICAgICAgICAgICAgICAzNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JPTUFOSUFOICAgICAgICAgICAgICAgICAgICAgMzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DWkVDSCAgICAgICAgICAgICAgICAgICAgICAgIDM4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0xPVkFLICAgICAgICAgICAgICAgICAgICAgICAzOQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NMT1ZFTklBTiAgICAgICAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ZSURESVNIICAgICAgICAgICAgICAgICAgICAgIDQxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0VSQklBTiAgICAgICAgICAgICAgICAgICAgICA0MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BQ0VET05JQU4gICAgICAgICAgICAgICAgICAgNDMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CVUxHQVJJQU4gICAgICAgICAgICAgICAgICAgIDQ0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVUtSQUlOSUFOICAgICAgICAgICAgICAgICAgICA0NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JZRUxPUlVTU0lBTiAgICAgICAgICAgICAgICAgNDYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VWkJFSyAgICAgICAgICAgICAgICAgICAgICAgIDQ3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FaQUtIICAgICAgICAgICAgICAgICAgICAgICA0OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JICAgICAgICAgICAgICAgICAgNDkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSV9DWVJJTExJQ19TQ1JJUFQgIDQ5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQVpFUkJBSUpBTklfQVJBQklDX1NDUklQVCAgICA1MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FSTUVOSUFOICAgICAgICAgICAgICAgICAgICAgNTEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRU9SR0lBTiAgICAgICAgICAgICAgICAgICAgIDUyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTU9MREFWSUFOICAgICAgICAgICAgICAgICAgICA1MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tJUkdISVogICAgICAgICAgICAgICAgICAgICAgNTQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQUpJS0kgICAgICAgICAgICAgICAgICAgICAgIDU1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVFVSS01FTiAgICAgICAgICAgICAgICAgICAgICA1NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTkdPTElBTiAgICAgICAgICAgICAgICAgICAgNTcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUFOX1NDUklQVCAgIDU3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTU9OR09MSUFOX0NZUklMTElDX1NDUklQVCAgICA1OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BBU0hUTyAgICAgICAgICAgICAgICAgICAgICAgNTkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LVVJESVNIICAgICAgICAgICAgICAgICAgICAgIDYwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FTSE1JUkkgICAgICAgICAgICAgICAgICAgICA2MQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NJTkRISSAgICAgICAgICAgICAgICAgICAgICAgNjIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USUJFVEFOICAgICAgICAgICAgICAgICAgICAgIDYzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTkVQQUxJICAgICAgICAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NBTlNLUklUICAgICAgICAgICAgICAgICAgICAgNjUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQVJBVEhJICAgICAgICAgICAgICAgICAgICAgIDY2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQkVOR0FMSSAgICAgICAgICAgICAgICAgICAgICA2NwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FTU0FNRVNFICAgICAgICAgICAgICAgICAgICAgNjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HVUpBUkFUSSAgICAgICAgICAgICAgICAgICAgIDY5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfUFVOSkFCSSAgICAgICAgICAgICAgICAgICAgICA3MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgNzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWUFMQU0gICAgICAgICAgICAgICAgICAgIDcyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FOTkFEQSAgICAgICAgICAgICAgICAgICAgICA3MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBTUlMICAgICAgICAgICAgICAgICAgICAgICAgNzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9URUxVR1UgICAgICAgICAgICAgICAgICAgICAgIDc1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0lOSEFMRVNFICAgICAgICAgICAgICAgICAgICA3NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JVUk1FU0UgICAgICAgICAgICAgICAgICAgICAgNzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LSE1FUiAgICAgICAgICAgICAgICAgICAgICAgIDc4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTEFPICAgICAgICAgICAgICAgICAgICAgICAgICA3OQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1ZJRVROQU1FU0UgICAgICAgICAgICAgICAgICAgODAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JTkRPTkVTSUFOICAgICAgICAgICAgICAgICAgIDgxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfVEFHQUxPRyAgICAgICAgICAgICAgICAgICAgICA4MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTEFZX1JPTUFOX1NDUklQVCAgICAgICAgICAgODMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWV9BUkFCSUNfU0NSSVBUICAgICAgICAgIDg0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQU1IQVJJQyAgICAgICAgICAgICAgICAgICAgICA4NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RJR1JJTllBICAgICAgICAgICAgICAgICAgICAgODYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HQUxMQSAgICAgICAgICAgICAgICAgICAgICAgIDg3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU09NQUxJICAgICAgICAgICAgICAgICAgICAgICA4OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NXQUhJTEkgICAgICAgICAgICAgICAgICAgICAgODkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVUFOREEgICAgICAgICAgICAgICAgICAgICAgIDkwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfUlVOREkgICAgICAgICAgICAgICAgICAgICAgICA5MQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NIRVdBICAgICAgICAgICAgICAgICAgICAgICAgOTIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBR0FTWSAgICAgICAgICAgICAgICAgICAgIDkzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfRVNQRVJBTlRPICAgICAgICAgICAgICAgICAgICA5NAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1dFTFNIICAgICAgICAgICAgICAgICAgICAgICAxMjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CQVNRVUUgICAgICAgICAgICAgICAgICAgICAgMTI5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ0FUQUxBTiAgICAgICAgICAgICAgICAgICAgIDEzMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xBVElOICAgICAgICAgICAgICAgICAgICAgICAxMzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9RVUVDSFVBICAgICAgICAgICAgICAgICAgICAgMTMyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1VBUkFOSSAgICAgICAgICAgICAgICAgICAgIDEzMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FZTUFSQSAgICAgICAgICAgICAgICAgICAgICAxMzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQVRBUiAgICAgICAgICAgICAgICAgICAgICAgMTM1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVUlHSFVSICAgICAgICAgICAgICAgICAgICAgIDEzNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RaT05HS0hBICAgICAgICAgICAgICAgICAgICAxMzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVZBTkVTRSAgICAgICAgICAgICAgICAgICAgMTM4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU1VOREFORVNFICAgICAgICAgICAgICAgICAgIDEzOQotCi0KLSNpZiAwICAvKiB0aGVzZSBzZWVtIHRvIGJlIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkICovCi0KLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQ09UVElTSF9HQUVMSUMgICAgICAgICAgICAgMTQwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgIDE0MQotCi0jZW5kaWYKLQotCi0gIC8qIFRoZSBmb2xsb3dpbmcgY29kZXMgYXJlIG5ldyBhcyBvZiAyMDAwLTAzLTEwICovCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR0FMSUNJQU4gICAgICAgICAgICAgICAgICAgIDE0MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FGUklLQUFOUyAgICAgICAgICAgICAgICAgICAxNDEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CUkVUT04gICAgICAgICAgICAgICAgICAgICAgMTQyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSU5VS1RJVFVUICAgICAgICAgICAgICAgICAgIDE0MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQyAgICAgICAgICAgICAxNDQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQU5YX0dBRUxJQyAgICAgICAgICAgICAgICAgMTQ1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgIDE0NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RPTkdBTiAgICAgICAgICAgICAgICAgICAgICAxNDcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFS19QT0xZVE9OSUMgICAgICAgICAgICAgMTQ4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1JFRUxBTkRJQyAgICAgICAgICAgICAgICAgIDE0OQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JX1JPTUFOX1NDUklQVCAgICAxNTAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMgICovCi0gIC8qIG9mIHRoZSBUVEYgYG5hbWUnIHRhYmxlIGlmIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcyAgICAgICAgICAqLwotICAvKiBUVF9QTEFURk9STV9NSUNST1NPRlQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBjYW5vbmljYWwgc291cmNlIGZvciB0aGUgTVMgYXNzaWduZWQgTENJRCdzIChzZWVtcyB0bykgYmUgYXQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZ2xvYmFsZGV2L3JlZmVyZW5jZS9sY2lkLWFsbC5tc3B4ICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCB1c2VkIHRvIGJlIGF0IHZhcmlvdXMgcGxhY2VzLCBhbW9uZyB0aGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvT1RTUEVDL2xjaWQtY3AudHh0ICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9nbG9iYWxkZXYvcmVmZXJlbmNlL2xvY2xhbmdob21lLmFzcCAgICAgICAgKi8KLSAgLyogICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL3N1cHBvcnQva2IvYXJ0aWNsZXMvUTIyNC84LzA0LkFTUCAgICAgICovCi0gIC8qICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL3Bhc3Nwb3J0MjUvICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgTkVUX1Bhc3Nwb3J0X1ZCU2NyaXB0X0RvY3VtZW50YXRpb24vU2luZ2xlX1NpZ25fSW4vICAgICAgICAgKi8KLSAgLyogICAgICAgICAgIEFkdmFuY2VkX1NpbmdsZV9TaWduX0luL0xvY2FsaXphdGlvbl9hbmRfTENJRHMuYXNwICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBIb3BlZnVsbHksIGl0IHNlZW1zIG5vdyB0aGF0IHRoZSBHbG9iYWxkZXYgc2l0ZSBwcmV2YWlscy4uLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVkIGJ5IEFudG9pbmUsIDIwMDQtMDItMTcpICAgICovCi0KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19HRU5FUkFMICAgICAgICAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19TQVVESV9BUkFCSUEgICAgICAgICAgICAgICAweDA0MDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19JUkFRICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19FR1lQVCAgICAgICAgICAgICAgICAgICAgICAweDBjMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19MSUJZQSAgICAgICAgICAgICAgICAgICAgICAweDEwMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19BTEdFUklBICAgICAgICAgICAgICAgICAgICAweDE0MDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19NT1JPQ0NPICAgICAgICAgICAgICAgICAgICAweDE4MDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19UVU5JU0lBICAgICAgICAgICAgICAgICAgICAweDFjMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19PTUFOICAgICAgICAgICAgICAgICAgICAgICAweDIwMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19ZRU1FTiAgICAgICAgICAgICAgICAgICAgICAweDI0MDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19TWVJJQSAgICAgICAgICAgICAgICAgICAgICAweDI4MDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19KT1JEQU4gICAgICAgICAgICAgICAgICAgICAweDJjMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19MRUJBTk9OICAgICAgICAgICAgICAgICAgICAweDMwMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19LVVdBSVQgICAgICAgICAgICAgICAgICAgICAweDM0MDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19VQUUgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19CQUhSQUlOICAgICAgICAgICAgICAgICAgICAweDNjMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSQUJJQ19RQVRBUiAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0JVTEdBUklBTl9CVUxHQVJJQSAgICAgICAgICAgICAgICAweDA0MDIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NBVEFMQU5fU1BBSU4gICAgICAgICAgICAgICAgICAgICAweDA0MDMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfR0VORVJBTCAgICAgICAgICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfVEFJV0FOICAgICAgICAgICAgICAgICAgICAweDA0MDQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfUFJDICAgICAgICAgICAgICAgICAgICAgICAweDA4MDQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfSE9OR19LT05HICAgICAgICAgICAgICAgICAweDBjMDQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfU0lOR0FQT1JFICAgICAgICAgICAgICAgICAweDEwMDQKLQotI2lmIDEgIC8qIHRoaXMgbG9va3MgbGlrZSB0aGUgY29ycmVjdCB2YWx1ZSAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9NQUNBVSAgICAgICAgICAgICAgICAgICAgIDB4MTQwNAotI2Vsc2UgIC8qIGJ1dCBiZXdhcmUsIE1pY3Jvc29mdCBtYXkgY2hhbmdlIGl0cyBtaW5kLi4uCi0gICAgICAgICAgdGhlIG1vc3QgcmVjZW50IFdvcmQgcmVmZXJlbmNlIGhhcyB0aGUgZm9sbG93aW5nOiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9NQUNBVSAgVFRfTVNfTEFOR0lEX0NISU5FU0VfSE9OR19LT05HCi0jZW5kaWYKLQotI2lmIDAgIC8qIHVzZWQgb25seSB3aXRoIC5ORVQgYGN1bHR1cmVzJzsgY29tbWVudGVkIG91dCAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfQ0hJTkVTRV9UUkFESVRJT05BTCAgICAgICAgICAgICAgIDB4N0MwNAotI2VuZGlmCi0KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NaRUNIX0NaRUNIX1JFUFVCTElDICAgICAgICAgICAgICAweDA0MDUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0RBTklTSF9ERU5NQVJLICAgICAgICAgICAgICAgICAgICAweDA0MDYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9HRVJNQU5ZICAgICAgICAgICAgICAgICAgICAweDA0MDcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9TV0lUWkVSTEFORCAgICAgICAgICAgICAgICAweDA4MDcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9BVVNUUklBICAgICAgICAgICAgICAgICAgICAweDBjMDcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9MVVhFTUJPVVJHICAgICAgICAgICAgICAgICAweDEwMDcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFUk1BTl9MSUVDSFRFTlNURUkgICAgICAgICAgICAgICAweDE0MDcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dSRUVLX0dSRUVDRSAgICAgICAgICAgICAgICAgICAgICAweDA0MDgKLQotICAvKiBkb24ndCBhc2sgd2hhdCB0aGlzIG9uZSBtZWFucy4uLiBJdCBpcyBjb21tZW50ZWQgb3V0IGN1cnJlbnRseS4gKi8KLSNpZiAwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9HUkVFS19HUkVFQ0UyICAgICAgICAgICAgICAgICAgICAgMHgyMDA4Ci0jZW5kaWYKLQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9HRU5FUkFMICAgICAgICAgICAgICAgICAgIDB4MDAwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9VTklURURfU1RBVEVTICAgICAgICAgICAgIDB4MDQwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9VTklURURfS0lOR0RPTSAgICAgICAgICAgIDB4MDgwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9BVVNUUkFMSUEgICAgICAgICAgICAgICAgIDB4MGMwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9DQU5BREEgICAgICAgICAgICAgICAgICAgIDB4MTAwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9ORVdfWkVBTEFORCAgICAgICAgICAgICAgIDB4MTQwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9JUkVMQU5EICAgICAgICAgICAgICAgICAgIDB4MTgwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgIDB4MWMwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9KQU1BSUNBICAgICAgICAgICAgICAgICAgIDB4MjAwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9DQVJJQkJFQU4gICAgICAgICAgICAgICAgIDB4MjQwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9CRUxJWkUgICAgICAgICAgICAgICAgICAgIDB4MjgwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9UUklOSURBRCAgICAgICAgICAgICAgICAgIDB4MmMwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9aSU1CQUJXRSAgICAgICAgICAgICAgICAgIDB4MzAwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9QSElMSVBQSU5FUyAgICAgICAgICAgICAgIDB4MzQwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9JTkRPTkVTSUEgICAgICAgICAgICAgICAgIDB4MzgwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9IT05HX0tPTkcgICAgICAgICAgICAgICAgIDB4M2MwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4NDAwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9NQUxBWVNJQSAgICAgICAgICAgICAgICAgIDB4NDQwOQotI2RlZmluZSBUVF9NU19MQU5HSURfRU5HTElTSF9TSU5HQVBPUkUgICAgICAgICAgICAgICAgIDB4NDgwOQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9TUEFJTl9UUkFESVRJT05BTF9TT1JUICAgIDB4MDQwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9NRVhJQ08gICAgICAgICAgICAgICAgICAgIDB4MDgwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9TUEFJTl9JTlRFUk5BVElPTkFMX1NPUlQgIDB4MGMwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9HVUFURU1BTEEgICAgICAgICAgICAgICAgIDB4MTAwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9DT1NUQV9SSUNBICAgICAgICAgICAgICAgIDB4MTQwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QQU5BTUEgICAgICAgICAgICAgICAgICAgIDB4MTgwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMgICAgICAgIDB4MWMwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9WRU5FWlVFTEEgICAgICAgICAgICAgICAgIDB4MjAwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9DT0xPTUJJQSAgICAgICAgICAgICAgICAgIDB4MjQwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QRVJVICAgICAgICAgICAgICAgICAgICAgIDB4MjgwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9BUkdFTlRJTkEgICAgICAgICAgICAgICAgIDB4MmMwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9FQ1VBRE9SICAgICAgICAgICAgICAgICAgIDB4MzAwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9DSElMRSAgICAgICAgICAgICAgICAgICAgIDB4MzQwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9VUlVHVUFZICAgICAgICAgICAgICAgICAgIDB4MzgwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QQVJBR1VBWSAgICAgICAgICAgICAgICAgIDB4M2MwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9CT0xJVklBICAgICAgICAgICAgICAgICAgIDB4NDAwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9FTF9TQUxWQURPUiAgICAgICAgICAgICAgIDB4NDQwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9IT05EVVJBUyAgICAgICAgICAgICAgICAgIDB4NDgwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9OSUNBUkFHVUEgICAgICAgICAgICAgICAgIDB4NGMwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9QVUVSVE9fUklDTyAgICAgICAgICAgICAgIDB4NTAwYQotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9VTklURURfU1RBVEVTICAgICAgICAgICAgIDB4NTQwYQotICAvKiBUaGUgZm9sbG93aW5nIElEIGJsYXRhbnRseSB2aW9sYXRlIE1TIHNwZWNzIGJ5IHVzaW5nIGEgKi8KLSAgLyogc3VibGFuZ3VhZ2UgPiAweDFGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TUEFOSVNIX0xBVElOX0FNRVJJQ0EgICAgICAgICAgICAgMHhFNDBhVQotI2RlZmluZSBUVF9NU19MQU5HSURfRklOTklTSF9GSU5MQU5EICAgICAgICAgICAgICAgICAgIDB4MDQwYgotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0ZSQU5DRSAgICAgICAgICAgICAgICAgICAgIDB4MDQwYwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0JFTEdJVU0gICAgICAgICAgICAgICAgICAgIDB4MDgwYwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0NBTkFEQSAgICAgICAgICAgICAgICAgICAgIDB4MGMwYwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1NXSVRaRVJMQU5EICAgICAgICAgICAgICAgIDB4MTAwYwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0xVWEVNQk9VUkcgICAgICAgICAgICAgICAgIDB4MTQwYwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX01PTkFDTyAgICAgICAgICAgICAgICAgICAgIDB4MTgwYwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1dFU1RfSU5ESUVTICAgICAgICAgICAgICAgIDB4MWMwYwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1JFVU5JT04gICAgICAgICAgICAgICAgICAgIDB4MjAwYwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX0NPTkdPICAgICAgICAgICAgICAgICAgICAgIDB4MjQwYwotICAvKiB3aGljaCB3YXMgZm9ybWVybHk6ICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfWkFJUkUgIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ09OR08KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9TRU5FR0FMICAgICAgICAgICAgICAgICAgICAweDI4MGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DQU1FUk9PTiAgICAgICAgICAgICAgICAgICAweDJjMGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DT1RFX0RfSVZPSVJFICAgICAgICAgICAgICAweDMwMGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9NQUxJICAgICAgICAgICAgICAgICAgICAgICAweDM0MGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9NT1JPQ0NPICAgICAgICAgICAgICAgICAgICAweDM4MGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9IQUlUSSAgICAgICAgICAgICAgICAgICAgICAweDNjMGMKLSAgLyogYW5kIGFub3RoZXIgdmlvbGF0aW9uIG9mIHRoZSBzcGVjIChzZWUgMHhFNDBhVSkgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9OT1JUSF9BRlJJQ0EgICAgICAgICAgICAgICAweEU0MGNVCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9IRUJSRVdfSVNSQUVMICAgICAgICAgICAgICAgICAgICAgMHgwNDBkCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9IVU5HQVJJQU5fSFVOR0FSWSAgICAgICAgICAgICAgICAgMHgwNDBlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JQ0VMQU5ESUNfSUNFTEFORCAgICAgICAgICAgICAgICAgMHgwNDBmCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JVEFMSUFOX0lUQUxZICAgICAgICAgICAgICAgICAgICAgMHgwNDEwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JVEFMSUFOX1NXSVRaRVJMQU5EICAgICAgICAgICAgICAgMHgwODEwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9KQVBBTkVTRV9KQVBBTiAgICAgICAgICAgICAgICAgICAgMHgwNDExCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LT1JFQU5fRVhURU5ERURfV0FOU1VOR19LT1JFQSAgICAgMHgwNDEyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LT1JFQU5fSk9IQUJfS09SRUEgICAgICAgICAgICAgICAgMHgwODEyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9EVVRDSF9ORVRIRVJMQU5EUyAgICAgICAgICAgICAgICAgMHgwNDEzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9EVVRDSF9CRUxHSVVNICAgICAgICAgICAgICAgICAgICAgMHgwODEzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9OT1JXRUdJQU5fTk9SV0FZX0JPS01BTCAgICAgICAgICAgMHgwNDE0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9OT1JXRUdJQU5fTk9SV0FZX05ZTk9SU0sgICAgICAgICAgMHgwODE0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QT0xJU0hfUE9MQU5EICAgICAgICAgICAgICAgICAgICAgMHgwNDE1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QT1JUVUdVRVNFX0JSQVpJTCAgICAgICAgICAgICAgICAgMHgwNDE2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QT1JUVUdVRVNFX1BPUlRVR0FMICAgICAgICAgICAgICAgMHgwODE2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9SSEFFVE9fUk9NQU5JQ19TV0lUWkVSTEFORCAgICAgICAgMHgwNDE3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ST01BTklBTl9ST01BTklBICAgICAgICAgICAgICAgICAgMHgwNDE4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9NT0xEQVZJQU5fTU9MREFWSUEgICAgICAgICAgICAgICAgMHgwODE4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9SVVNTSUFOX1JVU1NJQSAgICAgICAgICAgICAgICAgICAgMHgwNDE5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9SVVNTSUFOX01PTERBVklBICAgICAgICAgICAgICAgICAgMHgwODE5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DUk9BVElBTl9DUk9BVElBICAgICAgICAgICAgICAgICAgMHgwNDFhCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVJCSUFOX1NFUkJJQV9MQVRJTiAgICAgICAgICAgICAgMHgwODFhCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVJCSUFOX1NFUkJJQV9DWVJJTExJQyAgICAgICAgICAgMHgwYzFhCi0KLSNpZiAwICAvKiB0aGlzIHVzZWQgdG8gYmUgdGhpcyB2YWx1ZSwgYnV0IGl0IGxvb2tzIGxpa2Ugd2Ugd2VyZSB3cm9uZyAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfQk9TTklBTl9CT1NOSUFfSEVSWkVHT1ZJTkEgICAgICAgIDB4MTAxYQotI2Vsc2UgIC8qIGN1cnJlbnQgc291cmNlcyBzYXkgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NST0FUSUFOX0JPU05JQV9IRVJaRUdPVklOQSAgICAgICAweDEwMWEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0JPU05JQU5fQk9TTklBX0hFUlpFR09WSU5BICAgICAgICAweDE0MWEKLSAgICAgICAvKiBhbmQgWFBzcDIgUGxhdGZvcm0gU0RLIGFkZGVkICgyMDA0LTA3LTI2KSAqLwotICAgICAgIC8qIE5hbWVzIGFyZSBzaG9ydGVuZWQgdG8gYmUgc2lnbmlmaWNhbnQgd2l0aGluIDQwIGNoYXJzLiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9CT1NOSUFfSEVSWl9MQVRJTiAgICAgICAgIDB4MTgxYQotI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9CT1NOSUFfSEVSWl9DWVJJTExJQyAgICAgIDB4MTgxYQotI2VuZGlmCi0KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NMT1ZBS19TTE9WQUtJQSAgICAgICAgICAgICAgICAgICAweDA0MWIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FMQkFOSUFOX0FMQkFOSUEgICAgICAgICAgICAgICAgICAweDA0MWMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NXRURJU0hfU1dFREVOICAgICAgICAgICAgICAgICAgICAweDA0MWQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NXRURJU0hfRklOTEFORCAgICAgICAgICAgICAgICAgICAweDA4MWQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RIQUlfVEhBSUxBTkQgICAgICAgICAgICAgICAgICAgICAweDA0MWUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RVUktJU0hfVFVSS0VZICAgICAgICAgICAgICAgICAgICAweDA0MWYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1VSRFVfUEFLSVNUQU4gICAgICAgICAgICAgICAgICAgICAweDA0MjAKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1VSRFVfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgICAweDA4MjAKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0lORE9ORVNJQU5fSU5ET05FU0lBICAgICAgICAgICAgICAweDA0MjEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1VLUkFJTklBTl9VS1JBSU5FICAgICAgICAgICAgICAgICAweDA0MjIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0JFTEFSVVNJQU5fQkVMQVJVUyAgICAgICAgICAgICAgICAweDA0MjMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NMT1ZFTkVfU0xPVkVOSUEgICAgICAgICAgICAgICAgICAweDA0MjQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VTVE9OSUFOX0VTVE9OSUEgICAgICAgICAgICAgICAgICAweDA0MjUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0xBVFZJQU5fTEFUVklBICAgICAgICAgICAgICAgICAgICAweDA0MjYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0xJVEhVQU5JQU5fTElUSFVBTklBICAgICAgICAgICAgICAweDA0MjcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NMQVNTSUNfTElUSFVBTklBTl9MSVRIVUFOSUEgICAgICAweDA4MjcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RBSklLX1RBSklLSVNUQU4gICAgICAgICAgICAgICAgICAweDA0MjgKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZBUlNJX0lSQU4gICAgICAgICAgICAgICAgICAgICAgICAweDA0MjkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1ZJRVROQU1FU0VfVklFVF9OQU0gICAgICAgICAgICAgICAweDA0MmEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FSTUVOSUFOX0FSTUVOSUEgICAgICAgICAgICAgICAgICAweDA0MmIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FaRVJJX0FaRVJCQUlKQU5fTEFUSU4gICAgICAgICAgICAweDA0MmMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FaRVJJX0FaRVJCQUlKQU5fQ1lSSUxMSUMgICAgICAgICAweDA4MmMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0JBU1FVRV9TUEFJTiAgICAgICAgICAgICAgICAgICAgICAweDA0MmQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NPUkJJQU5fR0VSTUFOWSAgICAgICAgICAgICAgICAgICAweDA0MmUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX01BQ0VET05JQU5fTUFDRURPTklBICAgICAgICAgICAgICAweDA0MmYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NVVFVfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgICAweDA0MzAKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RTT05HQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAweDA0MzEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RTV0FOQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAweDA0MzIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1ZFTkRBX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAweDA0MzMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1hIT1NBX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAweDA0MzQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1pVTFVfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgICAweDA0MzUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FGUklLQUFOU19TT1VUSF9BRlJJQ0EgICAgICAgICAgICAweDA0MzYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dFT1JHSUFOX0dFT1JHSUEgICAgICAgICAgICAgICAgICAweDA0MzcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZBRVJPRVNFX0ZBRVJPRV9JU0xBTkRTICAgICAgICAgICAweDA0MzgKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0hJTkRJX0lORElBICAgICAgICAgICAgICAgICAgICAgICAweDA0MzkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX01BTFRFU0VfTUFMVEEgICAgICAgICAgICAgICAgICAgICAweDA0M2EKLSAgLyogQWRkZWQgYnkgWFBzcDIgUGxhdGZvcm0gU0RLICgyMDA0LTA3LTI2KSAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9OT1JUSEVSTl9OT1JXQVkgICAgICAgICAgICAgIDB4MDQzYgotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9OT1JUSEVSTl9TV0VERU4gICAgICAgICAgICAgIDB4MDgzYgotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9OT1JUSEVSTl9GSU5MQU5EICAgICAgICAgICAgIDB4MEMzYgotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9MVUxFX05PUldBWSAgICAgICAgICAgICAgICAgIDB4MTAzYgotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9MVUxFX1NXRURFTiAgICAgICAgICAgICAgICAgIDB4MTQzYgotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9TT1VUSEVSTl9OT1JXQVkgICAgICAgICAgICAgIDB4MTgzYgotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9TT1VUSEVSTl9TV0VERU4gICAgICAgICAgICAgIDB4MUMzYgotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9TS09MVF9GSU5MQU5EICAgICAgICAgICAgICAgIDB4MjAzYgotI2RlZmluZSBUVF9NU19MQU5HSURfU0FNSV9JTkFSSV9GSU5MQU5EICAgICAgICAgICAgICAgIDB4MjQzYgotICAvKiAuLi4gYW5kIHdlIGFsc28ga2VlcCBvdXIgb2xkIGlkZW50aWZpZXIuLi4gKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBQU1JX0xBUE9OSUEgICAgICAgICAgICAgICAgICAgICAweDA0M2IKLQotI2lmIDAgLyogdGhpcyBzZWVtcyB0byBiZSBhIHByZXZpb3VzIGludmVyc2lvbiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfSVJJU0hfR0FFTElDX0lSRUxBTkQgICAgICAgICAgICAgIDB4MDQzYwotI2RlZmluZSBUVF9NU19MQU5HSURfU0NPVFRJU0hfR0FFTElDX1VOSVRFRF9LSU5HRE9NICAgIDB4MDgzYwotI2Vsc2UKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQ19VTklURURfS0lOR0RPTSAgICAweDA4M2MKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0lSSVNIX0dBRUxJQ19JUkVMQU5EICAgICAgICAgICAgICAweDA0M2MKLSNlbmRpZgotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ZSURESVNIX0dFUk1BTlkgICAgICAgICAgICAgICAgICAgMHgwNDNkCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxBWV9NQUxBWVNJQSAgICAgICAgICAgICAgICAgICAgMHgwNDNlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxBWV9CUlVORUlfREFSVVNTQUxBTSAgICAgICAgICAgMHgwODNlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVpBS19LQVpBS1NUQU4gICAgICAgICAgICAgICAgICAgMHgwNDNmCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LSVJHSElaX0tJUkdISVpTVEFOIC8qIEN5cmlsbGljKi8gMHgwNDQwCi0gIC8qIGFsaWFzIGRlY2xhcmVkIGluIFdpbmRvd3MgMjAwMCAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfS0lSR0hJWl9LSVJHSElaX1JFUFVCTElDIFwKLSAgICAgICAgICBUVF9NU19MQU5HSURfS0lSR0hJWl9LSVJHSElaU1RBTgotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TV0FISUxJX0tFTllBICAgICAgICAgICAgICAgICAgICAgMHgwNDQxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UVVJLTUVOX1RVUktNRU5JU1RBTiAgICAgICAgICAgICAgMHgwNDQyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VWkJFS19VWkJFS0lTVEFOX0xBVElOICAgICAgICAgICAgMHgwNDQzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VWkJFS19VWkJFS0lTVEFOX0NZUklMTElDICAgICAgICAgMHgwODQzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQVRBUl9UQVRBUlNUQU4gICAgICAgICAgICAgICAgICAgMHgwNDQ0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9CRU5HQUxJX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDQ1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9CRU5HQUxJX0JBTkdMQURFU0ggICAgICAgICAgICAgICAgMHgwODQ1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QVU5KQUJJX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDQ2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QVU5KQUJJX0FSQUJJQ19QQUtJU1RBTiAgICAgICAgICAgMHgwODQ2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HVUpBUkFUSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgMHgwNDQ3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9PUklZQV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDQ4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1JTF9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDQ5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9URUxVR1VfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDRhCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQU5OQURBX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDRiCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxBWUFMQU1fSU5ESUEgICAgICAgICAgICAgICAgICAgMHgwNDRjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BU1NBTUVTRV9JTkRJQSAgICAgICAgICAgICAgICAgICAgMHgwNDRkCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQVJBVEhJX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDRlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQU5TS1JJVF9JTkRJQSAgICAgICAgICAgICAgICAgICAgMHgwNDRmCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUEgLyogQ3lyaWxsaWMgKi8gMHgwNDUwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUFfTU9OR09MSUFOICAgICAgMHgwODUwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUJFVEFOX0NISU5BICAgICAgICAgICAgICAgICAgICAgMHgwNDUxCi0gIC8qIERvbid0IHVzZSB0aGUgbmV4dCBjb25zdGFudCEgIEl0IGhhcyAgICAgICAgICAgICovCi0gIC8qICAgKDEpIHRoZSB3cm9uZyBzcGVsbGluZyAoRHpvbmdoa2EpICAgICAgICAgICAgICovCi0gIC8qICAgKDIpIE1pY3Jvc29mdCBkb2Vzbid0IG9mZmljaWFsbHkgZGVmaW5lIGl0IC0tICovCi0gIC8qICAgICAgIGF0IGxlYXN0IGl0IGlzIG5vdCBpbiB0aGUgTGlzdCBvZiBMb2NhbCAgICovCi0gIC8qICAgICAgIElEIFZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgKDMpIER6b25na2hhIGlzIG5vdCB0aGUgc2FtZSBsYW5ndWFnZSBhcyAgICAgICovCi0gIC8qICAgICAgIFRpYmV0YW4sIHNvIG1lcmdpbmcgaXQgaXMgd3JvbmcgYW55d2F5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRUX01TX0xBTkdJRF9USUJFVEFOX0JIVVRBTiBpcyBjb3JyZWN0LCBCVFcuICAgICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9EWk9OR0hLQV9CSFVUQU4gICAgICAgICAgICAgICAgICAgMHgwODUxCi0KLSNpZiAwCi0gIC8qIHRoZSBmb2xsb3dpbmcgdXNlZCB0byBiZSBkZWZpbmVkICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUJFVEFOX0JIVVRBTiAgICAgICAgICAgICAgICAgICAgMHgwNDUxCi0gIC8qIC4uLiBidXQgaXQgd2FzIGNoYW5nZWQ7ICovCi0jZWxzZQotICAvKiBTbyB3ZSB3aWxsIGNvbnRpbnVlIHRvICNkZWZpbmUgaXQsIGJ1dCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUJFVEFOX0JIVVRBTiAgIFRUX01TX0xBTkdJRF9EWk9OR0hLQV9CSFVUQU4KLSNlbmRpZgotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9XRUxTSF9XQUxFUyAgICAgICAgICAgICAgICAgICAgICAgMHgwNDUyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LSE1FUl9DQU1CT0RJQSAgICAgICAgICAgICAgICAgICAgMHgwNDUzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9MQU9fTEFPUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDU0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9CVVJNRVNFX01ZQU5NQVIgICAgICAgICAgICAgICAgICAgMHgwNDU1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HQUxJQ0lBTl9TUEFJTiAgICAgICAgICAgICAgICAgICAgMHgwNDU2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9LT05LQU5JX0lORElBICAgICAgICAgICAgICAgICAgICAgMHgwNDU3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQU5JUFVSSV9JTkRJQSAgLyogQmVuZ2FsaSAqLyAgICAgMHgwNDU4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9TSU5ESElfSU5ESUEgLyogQXJhYmljICovICAgICAgICAgMHgwNDU5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9TSU5ESElfUEFLSVNUQU4gICAgICAgICAgICAgICAgICAgMHgwODU5Ci0gIC8qIE1pc3NpbmcgYSBMQ0lEIGZvciBTaW5kaGkgaW4gRGV2YW5hZ2FyaSBzY3JpcHQgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NZUklBQ19TWVJJQSAgICAgICAgICAgICAgICAgICAgICAweDA0NWEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NJTkhBTEVTRV9TUklfTEFOS0EgICAgICAgICAgICAgICAweDA0NWIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NIRVJPS0VFX1VOSVRFRF9TVEFURVMgICAgICAgICAgICAweDA0NWMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0lOVUtUSVRVVF9DQU5BREEgICAgICAgICAgICAgICAgICAweDA0NWQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0FNSEFSSUNfRVRISU9QSUEgICAgICAgICAgICAgICAgICAweDA0NWUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RBTUFaSUdIVF9NT1JPQ0NPIC8qIEFyYWJpYyAqLyAgICAweDA0NWYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RBTUFaSUdIVF9NT1JPQ0NPX0xBVElOICAgICAgICAgICAweDA4NWYKLSAgLyogTWlzc2luZyBhIExDSUQgZm9yIFRpZmluYWdoIHNjcmlwdCAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfS0FTSE1JUklfUEFLSVNUQU4gLyogQXJhYmljICovICAgIDB4MDQ2MAotICAvKiBTcGVsbGVkIHRoaXMgd2F5IGJ5IFhQc3AyIFBsYXRmb3JtIFNESyAoMjAwNC0wNy0yNikgKi8KLSAgLyogc2NyaXB0IGlzIHlldCB1bmNsZWFyLi4uIG1pZ2h0IGJlIEFyYWJpYywgTmFnYXJpIG9yIFNoYXJhZGEgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBU0hNSVJJX1NBU0lBICAgICAgICAgICAgICAgICAgICAweDA4NjAKLSAgLyogLi4uIGFuZCBhbGlhc2VkIChieSBNUykgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBU0hNSVJJX0lORElBIFRUX01TX0xBTkdJRF9LQVNITUlSSV9TQVNJQQotI2RlZmluZSBUVF9NU19MQU5HSURfTkVQQUxJX05FUEFMICAgICAgICAgICAgICAgICAgICAgIDB4MDQ2MQotI2RlZmluZSBUVF9NU19MQU5HSURfTkVQQUxJX0lORElBICAgICAgICAgICAgICAgICAgICAgIDB4MDg2MQotI2RlZmluZSBUVF9NU19MQU5HSURfRlJJU0lBTl9ORVRIRVJMQU5EUyAgICAgICAgICAgICAgIDB4MDQ2MgotI2RlZmluZSBUVF9NU19MQU5HSURfUEFTSFRPX0FGR0hBTklTVEFOICAgICAgICAgICAgICAgIDB4MDQ2MwotI2RlZmluZSBUVF9NU19MQU5HSURfRklMSVBJTk9fUEhJTElQUElORVMgICAgICAgICAgICAgIDB4MDQ2NAotI2RlZmluZSBUVF9NU19MQU5HSURfREhJVkVISV9NQUxESVZFUyAgICAgICAgICAgICAgICAgIDB4MDQ2NQotICAvKiBhbGlhcyBkZWNsYXJlZCBpbiBXaW5kb3dzIDIwMDAgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0RJVkVISV9NQUxESVZFUyAgVFRfTVNfTEFOR0lEX0RISVZFSElfTUFMRElWRVMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VET19OSUdFUklBICAgICAgICAgICAgICAgICAgICAgICAweDA0NjYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZVTEZVTERFX05JR0VSSUEgICAgICAgICAgICAgICAgICAweDA0NjcKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0hBVVNBX05JR0VSSUEgICAgICAgICAgICAgICAgICAgICAweDA0NjgKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0lCSUJJT19OSUdFUklBICAgICAgICAgICAgICAgICAgICAweDA0NjkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1lPUlVCQV9OSUdFUklBICAgICAgICAgICAgICAgICAgICAweDA0NmEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1FVRUNIVUFfQk9MSVZJQSAgICAgICAgICAgICAgICAgICAweDA0NmIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1FVRUNIVUFfRUNVQURPUiAgICAgICAgICAgICAgICAgICAweDA4NmIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1FVRUNIVUFfUEVSVSAgICAgICAgICAgICAgICAgICAgICAweDBjNmIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUEVESV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAweDA0NmMKLSAgLyogQWxzbyBzcGVsbGVkIGJ5IFhQc3AyIFBsYXRmb3JtIFNESyAoMjAwNC0wNy0yNikgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NPVEhPX1NPVVRIRVJOX1NPVVRIX0FGUklDQSBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX1NFUEVESV9TT1VUSF9BRlJJQ0EKLSAgLyogbGFuZ3VhZ2UgY29kZXMgMHgwNDZkLCAweDA0NmUgYW5kIDB4MDQ2ZiBhcmUgKHN0aWxsKSB1bmtub3duLiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfSUdCT19OSUdFUklBICAgICAgICAgICAgICAgICAgICAgIDB4MDQ3MAotI2RlZmluZSBUVF9NU19MQU5HSURfS0FOVVJJX05JR0VSSUEgICAgICAgICAgICAgICAgICAgIDB4MDQ3MQotI2RlZmluZSBUVF9NU19MQU5HSURfT1JPTU9fRVRISU9QSUEgICAgICAgICAgICAgICAgICAgIDB4MDQ3MgotI2RlZmluZSBUVF9NU19MQU5HSURfVElHUklHTkFfRVRISU9QSUEgICAgICAgICAgICAgICAgIDB4MDQ3MwotI2RlZmluZSBUVF9NU19MQU5HSURfVElHUklHTkFfRVJZVEhSRUEgICAgICAgICAgICAgICAgIDB4MDg3MwotICAvKiBhbHNvIHNwZWxsZWQgaW4gdGhlIGBQYXNzcG9ydCBTREsnIGxpc3QgYXM6ICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USUdSSUdOQV9FUllUUkVBICBUVF9NU19MQU5HSURfVElHUklHTkFfRVJZVEhSRUEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0dVQVJBTklfUEFSQUdVQVkgICAgICAgICAgICAgICAgICAweDA0NzQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0hBV0FJSUFOX1VOSVRFRF9TVEFURVMgICAgICAgICAgICAweDA0NzUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0xBVElOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NzYKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NPTUFMSV9TT01BTElBICAgICAgICAgICAgICAgICAgICAweDA0NzcKLSAgLyogTm90ZTogWWkgZG9lcyBub3QgaGF2ZSBhIChwcm9wZXIpIElTTyA2MzktMiBjb2RlLCBzaW5jZSBpdCBpcyBtb3N0bHkgKi8KLSAgLyogICAgICAgbm90IHdyaXR0ZW4gKGJ1dCBPVE9IIHRoZSBwZWN1bGlhciB3cml0aW5nIHN5c3RlbSBpcyB3b3J0aCAgICAgKi8KLSAgLyogICAgICAgc3R1ZHlpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1lJX0NISU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NzgKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1BBUElBTUVOVFVfTkVUSEVSTEFORFNfQU5USUxMRVMgICAweDA0NzkKLSAgLyogbGFuZ3VhZ2UgY29kZXMgZnJvbSAweDA0N2EgdG8gMHgwNDdmIGFyZSAoc3RpbGwpIHVua25vd24uICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VSUdIVVJfQ0hJTkEgICAgICAgICAgICAgICAgICAgICAgMHgwNDgwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQU9SSV9ORVdfWkVBTEFORCAgICAgICAgICAgICAgICAgMHgwNDgxCi0KLSNpZiAwICAvKiBub3QgZGVlbWVkIHVzZWZ1bCBmb3IgZm9udHMgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0hVTUFOX0lOVEVSRkFDRV9ERVZJQ0UgICAgICAgICAgICAweDA0ZmYKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGBuYW1lJyBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMgb2YgKi8KLSAgLyogdGhlIFRURiBgbmFtZScgdGFibGUuICBUaGVzZSB2YWx1ZXMgYXJlIHBsYXRmb3JtIGluZGVwZW5kZW50LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9OQU1FX0lEX0NPUFlSSUdIVCAgICAgICAgICAgIDAKLSNkZWZpbmUgVFRfTkFNRV9JRF9GT05UX0ZBTUlMWSAgICAgICAgICAxCi0jZGVmaW5lIFRUX05BTUVfSURfRk9OVF9TVUJGQU1JTFkgICAgICAgMgotI2RlZmluZSBUVF9OQU1FX0lEX1VOSVFVRV9JRCAgICAgICAgICAgIDMKLSNkZWZpbmUgVFRfTkFNRV9JRF9GVUxMX05BTUUgICAgICAgICAgICA0Ci0jZGVmaW5lIFRUX05BTUVfSURfVkVSU0lPTl9TVFJJTkcgICAgICAgNQotI2RlZmluZSBUVF9OQU1FX0lEX1BTX05BTUUgICAgICAgICAgICAgIDYKLSNkZWZpbmUgVFRfTkFNRV9JRF9UUkFERU1BUksgICAgICAgICAgICA3Ci0KLSAgLyogdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGZyb20gdGhlIE9wZW5UeXBlIHNwZWMgKi8KLSNkZWZpbmUgVFRfTkFNRV9JRF9NQU5VRkFDVFVSRVIgICAgICAgICA4Ci0jZGVmaW5lIFRUX05BTUVfSURfREVTSUdORVIgICAgICAgICAgICAgOQotI2RlZmluZSBUVF9OQU1FX0lEX0RFU0NSSVBUSU9OICAgICAgICAgIDEwCi0jZGVmaW5lIFRUX05BTUVfSURfVkVORE9SX1VSTCAgICAgICAgICAgMTEKLSNkZWZpbmUgVFRfTkFNRV9JRF9ERVNJR05FUl9VUkwgICAgICAgICAxMgotI2RlZmluZSBUVF9OQU1FX0lEX0xJQ0VOU0UgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFRUX05BTUVfSURfTElDRU5TRV9VUkwgICAgICAgICAgMTQKLSAgLyogbnVtYmVyIDE1IGlzIHJlc2VydmVkICovCi0jZGVmaW5lIFRUX05BTUVfSURfUFJFRkVSUkVEX0ZBTUlMWSAgICAgMTYKLSNkZWZpbmUgVFRfTkFNRV9JRF9QUkVGRVJSRURfU1VCRkFNSUxZICAxNwotI2RlZmluZSBUVF9OQU1FX0lEX01BQ19GVUxMX05BTUUgICAgICAgIDE4Ci0KLSAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIG5ldyBhcyBvZiAyMDAwLTAxLTIxICovCi0jZGVmaW5lIFRUX05BTUVfSURfU0FNUExFX1RFWFQgICAgICAgICAgMTkKLQotICAvKiBUaGlzIGlzIG5ldyBpbiBPcGVuVHlwZSAxLjMgKi8KLSNkZWZpbmUgVFRfTkFNRV9JRF9DSURfRklOREZPTlRfTkFNRSAgICAyMAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCaXQgbWFzayB2YWx1ZXMgZm9yIHRoZSBVbmljb2RlIFJhbmdlcyBmcm9tIHRoZSBUVEYgYE9TMiAnIHRhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVwZGF0ZWQgMDItSnVsLTIwMDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBHZW5lcmFsIFNjcmlwdHMgQXJlYSAqLwotCi0gIC8qIEJpdCAgMCAgIEJhc2ljIExhdGluICovCi0jZGVmaW5lIFRUX1VDUl9CQVNJQ19MQVRJTiAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgMCkgLyogVSswMDIwLVUrMDA3RSAqLwotICAvKiBCaXQgIDEgICBDMSBDb250cm9scyBhbmQgTGF0aW4tMSBTdXBwbGVtZW50ICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTjFfU1VQUExFTUVOVCAgICAgICAgICAgICAgICgxTCA8PCAgMSkgLyogVSswMDgwLVUrMDBGRiAqLwotICAvKiBCaXQgIDIgICBMYXRpbiBFeHRlbmRlZC1BICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BICAgICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVSswMTAwLVUrMDE3RiAqLwotICAvKiBCaXQgIDMgICBMYXRpbiBFeHRlbmRlZC1CICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9CICAgICAgICAgICAgICAgICgxTCA8PCAgMykgLyogVSswMTgwLVUrMDI0RiAqLwotICAvKiBCaXQgIDQgICBJUEEgRXh0ZW5zaW9ucyAqLwotI2RlZmluZSBUVF9VQ1JfSVBBX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAoMUwgPDwgIDQpIC8qIFUrMDI1MC1VKzAyQUYgKi8KLSAgLyogQml0ICA1ICAgU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzICovCi0jZGVmaW5lIFRUX1VDUl9TUEFDSU5HX01PRElGSUVSICAgICAgICAgICAgICAgICgxTCA8PCAgNSkgLyogVSswMkIwLVUrMDJGRiAqLwotICAvKiBCaXQgIDYgICBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTICAgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzAzMDAtVSswMzZGICovCi0gIC8qIEJpdCAgNyAgIEdyZWVrIGFuZCBDb3B0aWMgKi8KLSNkZWZpbmUgVFRfVUNSX0dSRUVLICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA3KSAvKiBVKzAzNzAtVSswM0ZGICovCi0gIC8qIEJpdCAgOCBpcyByZXNlcnZlZCAod2FzOiBHcmVlayBTeW1ib2xzIGFuZCBDb3B0aWMpICovCi0gIC8qIEJpdCAgOSAgIEN5cmlsbGljICAgICAgICAgICAgICAgKyAqLwotICAvKiAgICAgICAgICBDeXJpbGxpYyBTdXBwbGVtZW50YXJ5ICAgKi8KLSNkZWZpbmUgVFRfVUNSX0NZUklMTElDICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA5KSAvKiBVKzA0MDAtVSswNEZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSswNTAwLVUrMDUyRiAqLwotICAvKiBCaXQgMTAgICBBcm1lbmlhbiAqLwotI2RlZmluZSBUVF9VQ1JfQVJNRU5JQU4gICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTApIC8qIFUrMDUzMC1VKzA1OEYgKi8KLSAgLyogQml0IDExICAgSGVicmV3ICovCi0jZGVmaW5lIFRUX1VDUl9IRUJSRVcgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMSkgLyogVSswNTkwLVUrMDVGRiAqLwotICAvKiBCaXQgMTIgaXMgcmVzZXJ2ZWQgKHdhczogSGVicmV3IEV4dGVuZGVkKSAqLwotICAvKiBCaXQgMTMgICBBcmFiaWMgKi8KLSNkZWZpbmUgVFRfVUNSX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzA2MDAtVSswNkZGICovCi0gIC8qIEJpdCAxNCBpcyByZXNlcnZlZCAod2FzOiBBcmFiaWMgRXh0ZW5kZWQpICovCi0gIC8qIEJpdCAxNSAgIERldmFuYWdhcmkgKi8KLSNkZWZpbmUgVFRfVUNSX0RFVkFOQUdBUkkgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzA5MDAtVSswOTdGICovCi0gIC8qIEJpdCAxNiAgIEJlbmdhbGkgKi8KLSNkZWZpbmUgVFRfVUNSX0JFTkdBTEkgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAvKiBVKzA5ODAtVSswOUZGICovCi0gIC8qIEJpdCAxNyAgIEd1cm11a2hpICovCi0jZGVmaW5lIFRUX1VDUl9HVVJNVUtISSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLyogVSswQTAwLVUrMEE3RiAqLwotICAvKiBCaXQgMTggICBHdWphcmF0aSAqLwotI2RlZmluZSBUVF9VQ1JfR1VKQVJBVEkgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMEE4MC1VKzBBRkYgKi8KLSAgLyogQml0IDE5ICAgT3JpeWEgKi8KLSNkZWZpbmUgVFRfVUNSX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVKzBCMDAtVSswQjdGICovCi0gIC8qIEJpdCAyMCAgIFRhbWlsICovCi0jZGVmaW5lIFRUX1VDUl9UQU1JTCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLyogVSswQjgwLVUrMEJGRiAqLwotICAvKiBCaXQgMjEgICBUZWx1Z3UgKi8KLSNkZWZpbmUgVFRfVUNSX1RFTFVHVSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKiBVKzBDMDAtVSswQzdGICovCi0gIC8qIEJpdCAyMiAgIEthbm5hZGEgKi8KLSNkZWZpbmUgVFRfVUNSX0tBTk5BREEgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIyKSAvKiBVKzBDODAtVSswQ0ZGICovCi0gIC8qIEJpdCAyMyAgIE1hbGF5YWxhbSAqLwotI2RlZmluZSBUVF9VQ1JfTUFMQVlBTEFNICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpIC8qIFUrMEQwMC1VKzBEN0YgKi8KLSAgLyogQml0IDI0ICAgVGhhaSAqLwotI2RlZmluZSBUVF9VQ1JfVEhBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qIFUrMEUwMC1VKzBFN0YgKi8KLSAgLyogQml0IDI1ICAgTGFvICovCi0jZGVmaW5lIFRUX1VDUl9MQU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLyogVSswRTgwLVUrMEVGRiAqLwotICAvKiBCaXQgMjYgICBHZW9yZ2lhbiAqLwotI2RlZmluZSBUVF9VQ1JfR0VPUkdJQU4gICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjYpIC8qIFUrMTBBMC1VKzEwRkYgKi8KLSAgLyogQml0IDI3IGlzIHJlc2VydmVkICh3YXMgR2VvcmdpYW4gRXh0ZW5kZWQpICovCi0gIC8qIEJpdCAyOCAgIEhhbmd1bCBKYW1vICovCi0jZGVmaW5lIFRUX1VDUl9IQU5HVUxfSkFNTyAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOCkgLyogVSsxMTAwLVUrMTFGRiAqLwotICAvKiBCaXQgMjkgICBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BRERJVElPTkFMICAgICAgICgxTCA8PCAyOSkgLyogVSsxRTAwLVUrMUVGRiAqLwotICAvKiBCaXQgMzAgICBHcmVlayBFeHRlbmRlZCAqLwotI2RlZmluZSBUVF9VQ1JfR1JFRUtfRVhURU5ERUQgICAgICAgICAgICAgICAgICAoMUwgPDwgMzApIC8qIFUrMUYwMC1VKzFGRkYgKi8KLQotICAvKiBTeW1ib2xzIEFyZWEgKi8KLQotICAvKiBCaXQgMzEgICBHZW5lcmFsIFB1bmN0dWF0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9HRU5FUkFMX1BVTkNUVUFUSU9OICAgICAgICAgICAgICgxTCA8PCAzMSkgLyogVSsyMDAwLVUrMjA2RiAqLwotICAvKiBCaXQgMzIgICBTdXBlcnNjcmlwdHMgQW5kIFN1YnNjcmlwdHMgKi8KLSNkZWZpbmUgVFRfVUNSX1NVUEVSU0NSSVBUU19TVUJTQ1JJUFRTICAgICAgICAgKDFMIDw8ICAwKSAvKiBVKzIwNzAtVSsyMDlGICovCi0gIC8qIEJpdCAzMyAgIEN1cnJlbmN5IFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX0NVUlJFTkNZX1NZTUJPTFMgICAgICAgICAgICAgICAgKDFMIDw8ICAxKSAvKiBVKzIwQTAtVSsyMENGICovCi0gIC8qIEJpdCAzNCAgIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBGb3IgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ1NfU1lNQiAgICAgICAoMUwgPDwgIDIpIC8qIFUrMjBEMC1VKzIwRkYgKi8KLSAgLyogQml0IDM1ICAgTGV0dGVybGlrZSBTeW1ib2xzICovCi0jZGVmaW5lIFRUX1VDUl9MRVRURVJMSUtFX1NZTUJPTFMgICAgICAgICAgICAgICgxTCA8PCAgMykgLyogVSsyMTAwLVUrMjE0RiAqLwotICAvKiBCaXQgMzYgICBOdW1iZXIgRm9ybXMgKi8KLSNkZWZpbmUgVFRfVUNSX05VTUJFUl9GT1JNUyAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA0KSAvKiBVKzIxNTAtVSsyMThGICovCi0gIC8qIEJpdCAzNyAgIEFycm93cyAgICAgICAgICAgICAgICArICovCi0gIC8qICAgICAgICAgIFN1cHBsZW1lbnRhbCBBcnJvd3MtQSArICovCi0gIC8qICAgICAgICAgIFN1cHBsZW1lbnRhbCBBcnJvd3MtQiAgICovCi0jZGVmaW5lIFRUX1VDUl9BUlJPV1MgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNSkgLyogVSsyMTkwLVUrMjFGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMjdGMC1VKzI3RkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI5MDAtVSsyOTdGICovCi0gIC8qIEJpdCAzOCAgIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgICAgICAgICAgICAgICArICovCi0gIC8qICAgICAgICAgIFN1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzICArICovCi0gIC8qICAgICAgICAgIE1pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQSArICovCi0gIC8qICAgICAgICAgIE1pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQiAgICovCi0jZGVmaW5lIFRUX1VDUl9NQVRIRU1BVElDQUxfT1BFUkFUT1JTICAgICAgICAgICgxTCA8PCAgNikgLyogVSsyMjAwLVUrMjJGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkEwMC1VKzJBRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI3QzAtVSsyN0VGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyOTgwLVUrMjlGRiAqLwotICAvKiBCaXQgMzkgTWlzY2VsbGFuZW91cyBUZWNobmljYWwgKi8KLSNkZWZpbmUgVFRfVUNSX01JU0NFTExBTkVPVVNfVEVDSE5JQ0FMICAgICAgICAgKDFMIDw8ICA3KSAvKiBVKzIzMDAtVSsyM0ZGICovCi0gIC8qIEJpdCA0MCAgIENvbnRyb2wgUGljdHVyZXMgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTlRST0xfUElDVFVSRVMgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzI0MDAtVSsyNDNGICovCi0gIC8qIEJpdCA0MSAgIE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9PQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOSkgLyogVSsyNDQwLVUrMjQ1RiAqLwotICAvKiBCaXQgNDIgICBFbmNsb3NlZCBBbHBoYW51bWVyaWNzICovCi0jZGVmaW5lIFRUX1VDUl9FTkNMT1NFRF9BTFBIQU5VTUVSSUNTICAgICAgICAgICgxTCA8PCAxMCkgLyogVSsyNDYwLVUrMjRGRiAqLwotICAvKiBCaXQgNDMgICBCb3ggRHJhd2luZyAqLwotI2RlZmluZSBUVF9VQ1JfQk9YX0RSQVdJTkcgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qIFUrMjUwMC1VKzI1N0YgKi8KLSAgLyogQml0IDQ0ICAgQmxvY2sgRWxlbWVudHMgKi8KLSNkZWZpbmUgVFRfVUNSX0JMT0NLX0VMRU1FTlRTICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSAvKiBVKzI1ODAtVSsyNTlGICovCi0gIC8qIEJpdCA0NSAgIEdlb21ldHJpYyBTaGFwZXMgKi8KLSNkZWZpbmUgVFRfVUNSX0dFT01FVFJJQ19TSEFQRVMgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzI1QTAtVSsyNUZGICovCi0gIC8qIEJpdCA0NiAgIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfTUlTQ0VMTEFORU9VU19TWU1CT0xTICAgICAgICAgICAoMUwgPDwgMTQpIC8qIFUrMjYwMC1VKzI2RkYgKi8KLSAgLyogQml0IDQ3ICAgRGluZ2JhdHMgKi8KLSNkZWZpbmUgVFRfVUNSX0RJTkdCQVRTICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzI3MDAtVSsyN0JGICovCi0KLSAgLyogQ0pLIFBob25ldGljcyBhbmQgU3ltYm9scyBBcmVhICovCi0KLSAgLyogQml0IDQ4ICAgQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9DSktfU1lNQk9MUyAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNikgLyogVSszMDAwLVUrMzAzRiAqLwotICAvKiBCaXQgNDkgICBIaXJhZ2FuYSAqLwotI2RlZmluZSBUVF9VQ1JfSElSQUdBTkEgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTcpIC8qIFUrMzA0MC1VKzMwOUYgKi8KLSAgLyogQml0IDUwICAgS2F0YWthbmEgICAgICAgICAgICAgICAgICAgICArICovCi0gIC8qICAgICAgICAgIEthdGFrYW5hIFBob25ldGljIEV4dGVuc2lvbnMgICAqLwotI2RlZmluZSBUVF9VQ1JfS0FUQUtBTkEgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMzBBMC1VKzMwRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzMxRjAtVSszMUZGICovCi0gIC8qIEJpdCA1MSAgIEJvcG9tb2ZvICAgICAgICAgICsgKi8KLSAgLyogICAgICAgICAgQm9wb21vZm8gRXh0ZW5kZWQgICAqLwotI2RlZmluZSBUVF9VQ1JfQk9QT01PRk8gICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTkpIC8qIFUrMzEwMC1VKzMxMkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzMxQTAtVSszMUJGICovCi0gIC8qIEJpdCA1MiAgIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8gKi8KLSNkZWZpbmUgVFRfVUNSX0hBTkdVTF9DT01QQVRJQklMSVRZX0pBTU8gICAgICAgKDFMIDw8IDIwKSAvKiBVKzMxMzAtVSszMThGICovCi0gIC8qIEJpdCA1MyAgIEthbmJ1biAqLwotI2RlZmluZSBUVF9VQ1JfQ0pLX01JU0MgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC8qIFUrMzE5MC1VKzMxOUYgKi8KLSNkZWZpbmUgVFRfVUNSX0tBTkJVTiAgVFRfVUNSX0NKS19NSVNDCi0gIC8qIEJpdCA1NCAgIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMgKi8KLSNkZWZpbmUgVFRfVUNSX0VOQ0xPU0VEX0NKS19MRVRURVJTX01PTlRIUyAgICAgKDFMIDw8IDIyKSAvKiBVKzMyMDAtVSszMkZGICovCi0gIC8qIEJpdCA1NSAgIENKSyBDb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWSAgICAgICAgICAgICAgICgxTCA8PCAyMykgLyogVSszMzAwLVUrMzNGRiAqLwotCi0gIC8qIEhhbmd1bCBTeWxsYWJsZXMgQXJlYSAqLwotCi0gIC8qIEJpdCA1NiAgIEhhbmd1bCAqLwotI2RlZmluZSBUVF9VQ1JfSEFOR1VMICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qIFUrQUMwMC1VK0Q3QTMgKi8KLQotICAvKiBTdXJyb2dhdGVzIEFyZWEgKi8KLQotICAvKiBCaXQgNTcgICBIaWdoIFN1cnJvZ2F0ZXMgICAgICAgICAgICAgKyAqLwotICAvKiAgICAgICAgICBIaWdoIFByaXZhdGUgVXNlIFN1cnJvZ2F0ZXMgKyAqLwotICAvKiAgICAgICAgICBMb3cgU3Vycm9nYXRlcyAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9VQ1JfU1VSUk9HQVRFUyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjUpIC8qIFUrRDgwMC1VK0RCN0YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0RCODAtVStEQkZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStEQzAwLVUrREZGRiAqLwotICAvKiBBY2NvcmRpbmcgdG8gT3BlblR5cGUgc3BlY3Mgdi4xLjMrLCBzZXR0aW5nIGJpdCA1NyBpbXBsaWVzIHRoYXQgdGhlcmUgKi8KLSAgLyogaXMgYXQgbGVhc3Qgb25lIGNvZGVwb2ludCBiZXlvbmQgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSB0aGF0IGlzICovCi0gIC8qIHN1cHBvcnRlZCBieSB0aGlzIGZvbnQuICBTbyBpdCByZWFsbHkgbWVhbnM6ICAgICAgICAgICAgPj0gVSsxMDAwMCAgICAqLwotCi0gIC8qIEJpdCA1OCBpcyByZXNlcnZlZCBmb3IgVW5pY29kZSBTdWJSYW5nZXMgKi8KLQotICAvKiBDSksgSWRlb2dyYXBocyBBcmVhICovCi0KLSAgLyogQml0IDU5ICAgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyAgICAgICAgICAgICArICovCi0gIC8qICAgICAgICAgIENKSyBSYWRpY2FscyBTdXBwbGVtZW50ICAgICAgICAgICAgKyAqLwotICAvKiAgICAgICAgICBLYW5neGkgUmFkaWNhbHMgICAgICAgICAgICAgICAgICAgICsgKi8KLSAgLyogICAgICAgICAgSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyArICovCi0gIC8qICAgICAgICAgIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEgICAqLwotICAvKiAgICAgICAgICBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBICsgKi8KLSAgLyogICAgICAgICAgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQiArICovCi0gIC8qICAgICAgICAgIEthbmJ1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9VQ1JfQ0pLX1VOSUZJRURfSURFT0dSQVBIUyAgICAgICAgICAoMUwgPDwgMjcpIC8qIFUrNEUwMC1VKzlGRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzJFODAtVSsyRUZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRjAwLVUrMkZERiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkZGMC1VKzJGRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzM0MDAtVSs0REI1ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzIwMDAwLVUrMkE2REYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMzE5MC1VKzMxOUYgKi8KLQotICAvKiBQcml2YXRlIFVzZSBBcmVhICovCi0KLSAgLyogQml0IDYwICAgUHJpdmF0ZSBVc2UgKi8KLSNkZWZpbmUgVFRfVUNSX1BSSVZBVEVfVVNFICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAvKiBVK0UwMDAtVStGOEZGICovCi0KLSAgLyogQ29tcGF0aWJpbGl0eSBBcmVhIGFuZCBTcGVjaWFscyAqLwotCi0gIC8qIEJpdCA2MSAgIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgICAgICAgICAgICArICovCi0gIC8qICAgICAgICAgIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCAgICovCi0jZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9JREVPR1JBUEhTICAgICgxTCA8PCAyOSkgLyogVStGOTAwLVUrRkFGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsyRjgwMC1VKzJGQTFGKi8KLSAgLyogQml0IDYyICAgQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMgKi8KLSNkZWZpbmUgVFRfVUNSX0FMUEhBQkVUSUNfUFJFU0VOVEFUSU9OX0ZPUk1TICAgKDFMIDw8IDMwKSAvKiBVK0ZCMDAtVStGQjRGICovCi0gIC8qIEJpdCA2MyAgIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSAqLwotI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQSAgICAgICAgICAoMUwgPDwgMzEpIC8qIFUrRkI1MC1VK0ZERkYgKi8KLSAgLyogQml0IDY0ICAgQ29tYmluaW5nIEhhbGYgTWFya3MgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19IQUxGX01BUktTICAgICAgICAgICAgKDFMIDw8ICAwKSAvKiBVK0ZFMjAtVStGRTJGICovCi0gIC8qIEJpdCA2NSAgIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCi0jZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9GT1JNUyAgICAgICAgICgxTCA8PCAgMSkgLyogVStGRTMwLVUrRkU0RiAqLwotICAvKiBCaXQgNjYgICBTbWFsbCBGb3JtIFZhcmlhbnRzICovCi0jZGVmaW5lIFRUX1VDUl9TTUFMTF9GT1JNX1ZBUklBTlRTICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVStGRTUwLVUrRkU2RiAqLwotICAvKiBCaXQgNjcgICBBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUIgKi8KLSNkZWZpbmUgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05TX0IgICAgICAgICAgKDFMIDw8ICAzKSAvKiBVK0ZFNzAtVStGRUZFICovCi0gIC8qIEJpdCA2OCAgIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zICovCi0jZGVmaW5lIFRUX1VDUl9IQUxGV0lEVEhfRlVMTFdJRFRIX0ZPUk1TICAgICAgICgxTCA8PCAgNCkgLyogVStGRjAwLVUrRkZFRiAqLwotICAvKiBCaXQgNjkgICBTcGVjaWFscyAqLwotI2RlZmluZSBUVF9VQ1JfU1BFQ0lBTFMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qIFUrRkZGMC1VK0ZGRkQgKi8KLSAgLyogQml0IDcwICAgVGliZXRhbiAqLwotI2RlZmluZSBUVF9VQ1JfVElCRVRBTiAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDYpIC8qIFUrMEYwMC1VKzBGRkYgKi8KLSAgLyogQml0IDcxICAgU3lyaWFjICovCi0jZGVmaW5lIFRUX1VDUl9TWVJJQUMgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNykgLyogVSswNzAwLVUrMDc0RiAqLwotICAvKiBCaXQgNzIgICBUaGFhbmEgKi8KLSNkZWZpbmUgVFRfVUNSX1RIQUFOQSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzA3ODAtVSswN0JGICovCi0gIC8qIEJpdCA3MyAgIFNpbmhhbGEgKi8KLSNkZWZpbmUgVFRfVUNSX1NJTkhBTEEgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA5KSAvKiBVKzBEODAtVSswREZGICovCi0gIC8qIEJpdCA3NCAgIE15YW5tYXIgKi8KLSNkZWZpbmUgVFRfVUNSX01ZQU5NQVIgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEwKSAvKiBVKzEwMDAtVSsxMDlGICovCi0gIC8qIEJpdCA3NSAgIEV0aGlvcGljICovCi0jZGVmaW5lIFRUX1VDUl9FVEhJT1BJQyAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMSkgLyogVSsxMjAwLVUrMTM3RiAqLwotICAvKiBCaXQgNzYgICBDaGVyb2tlZSAqLwotI2RlZmluZSBUVF9VQ1JfQ0hFUk9LRUUgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrMTNBMC1VKzEzRkYgKi8KLSAgLyogQml0IDc3ICAgVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyAqLwotI2RlZmluZSBUVF9VQ1JfQ0FOQURJQU5fQUJPUklHSU5BTF9TWUxMQUJJQ1MgICAoMUwgPDwgMTMpIC8qIFUrMTQwMC1VKzE2N0YgKi8KLSAgLyogQml0IDc4ICAgT2doYW0gKi8KLSNkZWZpbmUgVFRfVUNSX09HSEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE0KSAvKiBVKzE2ODAtVSsxNjlGICovCi0gIC8qIEJpdCA3OSAgIFJ1bmljICovCi0jZGVmaW5lIFRUX1VDUl9SVU5JQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNSkgLyogVSsxNkEwLVUrMTZGRiAqLwotICAvKiBCaXQgODAgICBLaG1lciAqLwotI2RlZmluZSBUVF9VQ1JfS0hNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTYpIC8qIFUrMTc4MC1VKzE3RkYgKi8KLSAgLyogQml0IDgxICAgTW9uZ29saWFuICovCi0jZGVmaW5lIFRUX1VDUl9NT05HT0xJQU4gICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLyogVSsxODAwLVUrMThBRiAqLwotICAvKiBCaXQgODIgICBCcmFpbGxlIFBhdHRlcm5zICovCi0jZGVmaW5lIFRUX1VDUl9CUkFJTExFICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOCkgLyogVSsyODAwLVUrMjhGRiAqLwotICAvKiBCaXQgODMgICBZaSBTeWxsYWJsZXMgKyAqLwotICAvKiAgICAgICAgICBZaSBSYWRpY2FscyAgICAqLwotI2RlZmluZSBUVF9VQ1JfWUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTkpIC8qIFUrQTAwMC1VK0E0OEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0E0OTAtVStBNENGICovCi0gIC8qIEJpdCA4NCAgIFRhZ2Fsb2cgICsgKi8KLSAgLyogICAgICAgICAgSGFudW5vbyAgKyAqLwotICAvKiAgICAgICAgICBCdWhpZCAgICArICovCi0gIC8qICAgICAgICAgIFRhZ2JhbndhICAgKi8KLSNkZWZpbmUgVFRfVUNSX1BISUxJUFBJTkUgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIwKSAvKiBVKzE3MDAtVSsxNzFGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxNzIwLVUrMTczRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMTc0MC1VKzE3NUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzE3NjAtVSsxNzdGICovCi0gIC8qIEJpdCA4NSAgIE9sZCBJdGFsaWMgKi8KLSNkZWZpbmUgVFRfVUNSX09MRF9JVEFMSUMgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKlUrMTAzMDAtVSsxMDMyRiovCi0gIC8qIEJpdCA4NiAgIEdvdGhpYyAqLwotI2RlZmluZSBUVF9VQ1JfR09USElDICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjIpIC8qVSsxMDMzMC1VKzEwMzRGKi8KLSAgLyogQml0IDg3ICAgRGVzZXJldCAqLwotI2RlZmluZSBUVF9VQ1JfREVTRVJFVCAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpIC8qVSsxMDQwMC1VKzEwNDRGKi8KLSAgLyogQml0IDg4ICAgQnl6YW50aW5lIE11c2ljYWwgU3ltYm9scyArICovCi0gIC8qICAgICAgICAgIE11c2ljYWwgU3ltYm9scyAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9VQ1JfTVVTSUNBTF9TWU1CT0xTICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qVSsxRDAwMC1VKzFEMEZGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMUQxMDAtVSsxRDFGRiovCi0gIC8qIEJpdCA4OSAgIE1hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfTUFUSF9BTFBIQU5VTUVSSUNfU1lNQk9MUyAgICAgICAoMUwgPDwgMjUpIC8qVSsxRDQwMC1VKzFEN0ZGKi8KLSAgLyogQml0IDkwICAgUHJpdmF0ZSBVc2UgKHBsYW5lIDE1KSArICovCi0gIC8qICAgICAgICAgIFByaXZhdGUgVXNlIChwbGFuZSAxNikgICAqLwotI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0VfU1VQUExFTUVOVEFSWSAgICAgICAoMUwgPDwgMjYpIC8qVStGMDAwMC1VK0ZGRkZEKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzEwMDAwMC1VKzEwRkZGRCovCi0gIC8qIEJpdCA5MSAgIFZhcmlhdGlvbiBTZWxlY3RvcnMgKi8KLSNkZWZpbmUgVFRfVUNSX1ZBUklBVElPTl9TRUxFQ1RPUlMgICAgICAgICAgICAgKDFMIDw8IDI3KSAvKiBVK0ZFMDAtVStGRTBGICovCi0gIC8qIEJpdCA5MiAgIFRhZ3MgKi8KLSNkZWZpbmUgVFRfVUNSX1RBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAvKlUrRTAwMDAtVStFMDA3RiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNvbWUgY29tcGlsZXJzIGhhdmUgYSB2ZXJ5IGxpbWl0ZWQgbGVuZ3RoIG9mIGlkZW50aWZpZXJzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKCBfX1RVUkJPQ19fICkgJiYgX19UVVJCT0NfXyA8IDB4MDQxMCB8fCBkZWZpbmVkKCBfX1BBQ0lGSUNfXyApCi0jZGVmaW5lIEhBVkVfTElNSVRfT05fSURFTlRTCi0jZW5kaWYKLQotCi0jaWZuZGVmIEhBVkVfTElNSVRfT05fSURFTlRTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhlcmUgc29tZSBhbGlhcyAjZGVmaW5lcyBpbiBvcmRlciB0byBiZSBjbGVhcmVyLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgYXJlIG5vdCBhbHdheXMgI2RlZmluZWQgdG8gc3RheSB3aXRoaW4gdGhlIDMxIGNoYXJhY3RlciBsaW1pdCAgICovCi0gIC8qIHdoaWNoIHNvbWUgY29tcGlsZXJzIGhhdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ3JlZGl0cyBnbyB0byBEYXZlIEhvbyA8ZGhvb0BmbGFzaC5uZXQ+IGZvciBwb2ludGluZyBvdXQgdGhhdCBtb2Rlcm4gICovCi0gIC8qIEJvcmxhbmQgY29tcGlsZXJzIChyZWFkOiBmcm9tIEJDKysgMy4xIG9uKSBjYW4gaW5jcmVhc2UgdGhpcyBsaW1pdC4gICAqLwotICAvKiBJZiB5b3UgZ2V0IGEgd2FybmluZyB3aXRoIHN1Y2ggYSBjb21waWxlciwgdXNlIHRoZSAtaTQwIHN3aXRjaC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0EgICAgICBcCi0gICAgICAgICBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQQotI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTl9GT1JNU19CICAgICAgXAotICAgICAgICAgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05TX0IKLQotI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTICAgICAgXAotICAgICAgICAgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTCi0jZGVmaW5lIFRUX1VDUl9DT01CSU5JTkdfRElBQ1JJVElDQUxfTUFSS1NfU1lNQiBcCi0gICAgICAgICBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ1NfU1lNQgotCi0KLSNlbmRpZiAvKiAhSEFWRV9MSU1JVF9PTl9JREVOVFMgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUTkFNRUlEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oIGIvaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWVkYjBlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHRhYmxlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgU0ZOVC9UcnVlVHlwZSB0YWJsZXMgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAgICAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDggYnkgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRUQUJMRVNfSF9fCi0jZGVmaW5lIF9fVFRUQUJMRVNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRydWV0eXBlX3RhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIFRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHNwZWNpZmljIHRhYmxlIHR5cGVzIGFuZCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZXMgICAqLwotICAvKiAgICBhcyB3ZWxsIGFzIHNvbWUgcm91dGluZXMgdXNlZCB0byBhY2Nlc3MgYW5kIHByb2Nlc3MgdGhlbS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIGZvbnQgaGVhZGVyIHRhYmxlLiAgQWxsICAgICAgICovCi0gIC8qICAgIGZpZWxkcyBmb2xsb3cgdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hlYWRlcl8KLSAgewotICAgIEZUX0ZpeGVkICAgVGFibGVfVmVyc2lvbjsKLSAgICBGVF9GaXhlZCAgIEZvbnRfUmV2aXNpb247Ci0KLSAgICBGVF9Mb25nICAgIENoZWNrU3VtX0FkanVzdDsKLSAgICBGVF9Mb25nICAgIE1hZ2ljX051bWJlcjsKLQotICAgIEZUX1VTaG9ydCAgRmxhZ3M7Ci0gICAgRlRfVVNob3J0ICBVbml0c19QZXJfRU07Ci0KLSAgICBGVF9Mb25nICAgIENyZWF0ZWQgWzJdOwotICAgIEZUX0xvbmcgICAgTW9kaWZpZWRbMl07Ci0KLSAgICBGVF9TaG9ydCAgIHhNaW47Ci0gICAgRlRfU2hvcnQgICB5TWluOwotICAgIEZUX1Nob3J0ICAgeE1heDsKLSAgICBGVF9TaG9ydCAgIHlNYXg7Ci0KLSAgICBGVF9VU2hvcnQgIE1hY19TdHlsZTsKLSAgICBGVF9VU2hvcnQgIExvd2VzdF9SZWNfUFBFTTsKLQotICAgIEZUX1Nob3J0ICAgRm9udF9EaXJlY3Rpb247Ci0gICAgRlRfU2hvcnQgICBJbmRleF9Ub19Mb2NfRm9ybWF0OwotICAgIEZUX1Nob3J0ICAgR2x5cGhfRGF0YV9Gb3JtYXQ7Ci0KLSAgfSBUVF9IZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Ib3JpSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgaG9yaXpvbnRhbCBoZWFkZXIsIHRoZSBgaGhlYScgKi8KLSAgLyogICAgdGFibGUsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgaG9yaXpvbnRhbCBtZXRyaWNzIHRhYmxlLCAgICAgICovCi0gIC8qICAgIGkuZS4sIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFZlcnNpb24gICAgICAgICAgICAgICAgOjogVGhlIHRhYmxlIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXNjZW5kZXIgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IG9mIGFsbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSBBU0NJSSkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvQXNjZW5kZXInIGZpZWxkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIE9TLzIgdGFibGUgaW5zdGVhZCBpZiB5b3Ugd2FudCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc2NlbmRlciAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBkZXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSBib3R0b20tbW9zdCBvZiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVnYXRpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlIEFTQ0lJKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9EZXNjZW5kZXInICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSBpbnN0ZWFkIGlmIHlvdSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGluZV9HYXAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGxpbmUgZ2FwLCBpLmUuLCB0aGUgZGlzdGFuY2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWRkIHRvIHRoZSBhc2NlbmRlciBhbmQgZGVzY2VuZGVyIHRvICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCB0aGUgQlRCLCBpLmUuLCB0aGUgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZS10by1iYXNlbGluZSBkaXN0YW5jZSBmb3IgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZV9XaWR0aF9NYXggICAgICA6OiBUaGlzIGZpZWxkIGlzIHRoZSBtYXhpbXVtIG9mIGFsbCBhZHZhbmNlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgY2FuIGJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSB3aWR0aCBvZiBhbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmJpdHJhcnkgc3RyaW5nIG9mIHRleHQuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fTGVmdF9TaWRlX0JlYXJpbmcgIDo6IFRoZSBtaW5pbXVtIGxlZnQgc2lkZSBiZWFyaW5nIG9mIGFsbCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fUmlnaHRfU2lkZV9CZWFyaW5nIDo6IFRoZSBtaW5pbXVtIHJpZ2h0IHNpZGUgYmVhcmluZyBvZiBhbGwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4TWF4X0V4dGVudCAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIGhvcml6b250YWwgZXh0ZW50IChpLmUuLCB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgd2lkdGgnIG9mIGEgZ2x5cGgncyBib3VuZGluZyBib3gpIGZvciAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfU2xvcGVfUmlzZSAgICAgICA6OiBUaGUgcmlzZSBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUgb2YgdGhlIGN1cnNvciAoc2xvcGU9cmlzZS9ydW4pLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FyZXRfU2xvcGVfUnVuICAgICAgICA6OiBUaGUgcnVuIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICA6OiA4IHJlc2VydmVkIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNfRGF0YV9Gb3JtYXQgICAgIDo6IEFsd2F5cyAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bWJlcl9PZl9ITWV0cmljcyAgICAgOjogTnVtYmVyIG9mIEhNZXRyaWNzIGVudHJpZXMgaW4gdGhlIGBobXR4JyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIC0tIHRoaXMgdmFsdWUgY2FuIGJlIHNtYWxsZXIgdGhhbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZm9udC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb25nX21ldHJpY3MgICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNob3J0X21ldHJpY3MgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGBobXR4JyB0YWJsZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElNUE9SVEFOVDogVGhlIFRUX0hvcmlIZWFkZXIgYW5kIFRUX1ZlcnRIZWFkZXIgc3RydWN0dXJlcyBzaG91bGQgICAqLwotICAvKiAgICAgICAgICAgICAgIGJlIGlkZW50aWNhbCBleGNlcHQgZm9yIHRoZSBuYW1lcyBvZiB0aGVpciBmaWVsZHMgd2hpY2ggKi8KLSAgLyogICAgICAgICAgICAgICBhcmUgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IGEgc2luZ2xlIGZ1bmN0aW9uIGluIHRoZSBgdHRsb2FkJyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBtb2R1bGUgaXMgYWJsZSB0byByZWFkIGJvdGggdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICovCi0gIC8qICAgICAgICAgICAgICAgaGVhZGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hvcmlIZWFkZXJfCi0gIHsKLSAgICBGVF9GaXhlZCAgIFZlcnNpb247Ci0gICAgRlRfU2hvcnQgICBBc2NlbmRlcjsKLSAgICBGVF9TaG9ydCAgIERlc2NlbmRlcjsKLSAgICBGVF9TaG9ydCAgIExpbmVfR2FwOwotCi0gICAgRlRfVVNob3J0ICBhZHZhbmNlX1dpZHRoX01heDsgICAgICAvKiBhZHZhbmNlIHdpZHRoIG1heGltdW0gKi8KLQotICAgIEZUX1Nob3J0ICAgbWluX0xlZnRfU2lkZV9CZWFyaW5nOyAgLyogbWluaW11bSBsZWZ0LXNiICAgICAgICovCi0gICAgRlRfU2hvcnQgICBtaW5fUmlnaHRfU2lkZV9CZWFyaW5nOyAvKiBtaW5pbXVtIHJpZ2h0LXNiICAgICAgKi8KLSAgICBGVF9TaG9ydCAgIHhNYXhfRXh0ZW50OyAgICAgICAgICAgIC8qIHhtYXggZXh0ZW50cyAgICAgICAgICAqLwotICAgIEZUX1Nob3J0ICAgY2FyZXRfU2xvcGVfUmlzZTsKLSAgICBGVF9TaG9ydCAgIGNhcmV0X1Nsb3BlX1J1bjsKLSAgICBGVF9TaG9ydCAgIGNhcmV0X09mZnNldDsKLQotICAgIEZUX1Nob3J0ICAgUmVzZXJ2ZWRbNF07Ci0KLSAgICBGVF9TaG9ydCAgIG1ldHJpY19EYXRhX0Zvcm1hdDsKLSAgICBGVF9VU2hvcnQgIG51bWJlcl9PZl9ITWV0cmljczsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgIC8qIGJ1dCB0aGV5IGFyZSB1c2VkIHRvIGNvbm5lY3QgdGhlIG1ldHJpY3MgaGVhZGVyIHRvIHRoZSByZWxldmFudCAgICAqLwotICAgIC8qIGBITVRYJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7Ci0gICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOwotCi0gIH0gVFRfSG9yaUhlYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1ZlcnRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSB2ZXJ0aWNhbCBoZWFkZXIsIHRoZSBgdmhlYScgICAqLwotICAvKiAgICB0YWJsZSwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNhbCBtZXRyaWNzIHRhYmxlLCBpLmUuLCAgKi8KLSAgLyogICAgdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVmVyc2lvbiAgICAgICAgICAgICAgICAgOjogVGhlIHRhYmxlIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBc2NlbmRlciAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IG9mICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0FzY2VuZGVyJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc2NlbmRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZGVzY2VuZGVyLCBpLmUuLCB0aGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tLW1vc3Qgb2YgYWxsIGdseXBoIHBvaW50cyBmb3VuZCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb250LiAgSXQgaXMgbmVnYXRpdmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0Rlc2NlbmRlcicgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfR2FwICAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgbGluZSBnYXAsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhZGQgdG8gdGhlIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgdG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHRoZSBCVEIsIGkuZS4sIHRoZSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lLXRvLWJhc2VsaW5lIGRpc3RhbmNlIGZvciB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2VfSGVpZ2h0X01heCAgICAgIDo6IFRoaXMgZmllbGQgaXMgdGhlIG1heGltdW0gb2YgYWxsICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlIGhlaWdodHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiBhbiBhcmJpdHJhcnkgc3RyaW5nIG9mIHRleHQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX1RvcF9TaWRlX0JlYXJpbmcgICAgOjogVGhlIG1pbmltdW0gdG9wIHNpZGUgYmVhcmluZyBvZiBhbGwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmcgOjogVGhlIG1pbmltdW0gYm90dG9tIHNpZGUgYmVhcmluZyBvZiBhbGwgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeU1heF9FeHRlbnQgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gdmVydGljYWwgZXh0ZW50IChpLmUuLCB0aGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBoZWlnaHQnIG9mIGEgZ2x5cGgncyBib3VuZGluZyBib3gpIGZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGhzIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X1Nsb3BlX1Jpc2UgICAgICAgIDo6IFRoZSByaXNlIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZSBvZiB0aGUgY3Vyc29yIChzbG9wZT1yaXNlL3J1bikuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X1Nsb3BlX1J1biAgICAgICAgIDo6IFRoZSBydW4gY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X09mZnNldCAgICAgICAgICAgIDo6IFRoZSBjdXJzb3IncyBvZmZzZXQgZm9yIHNsYW50ZWQgZm9udHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGByZXNlcnZlZCcgaW4gdm10eCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiAxLjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXNlcnZlZCAgICAgICAgICAgICAgICA6OiA4IHJlc2VydmVkIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY19EYXRhX0Zvcm1hdCAgICAgIDo6IEFsd2F5cyAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtYmVyX09mX0hNZXRyaWNzICAgICAgOjogTnVtYmVyIG9mIFZNZXRyaWNzIGVudHJpZXMgaW4gdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB2bXR4JyB0YWJsZSAtLSB0aGlzIHZhbHVlIGNhbiBiZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGVyIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiBnbHlwaHMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb25nX21ldHJpY3MgICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNob3J0X21ldHJpY3MgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElNUE9SVEFOVDogVGhlIFRUX0hvcmlIZWFkZXIgYW5kIFRUX1ZlcnRIZWFkZXIgc3RydWN0dXJlcyBzaG91bGQgICAqLwotICAvKiAgICAgICAgICAgICAgIGJlIGlkZW50aWNhbCBleGNlcHQgZm9yIHRoZSBuYW1lcyBvZiB0aGVpciBmaWVsZHMgd2hpY2ggKi8KLSAgLyogICAgICAgICAgICAgICBhcmUgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IGEgc2luZ2xlIGZ1bmN0aW9uIGluIHRoZSBgdHRsb2FkJyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBtb2R1bGUgaXMgYWJsZSB0byByZWFkIGJvdGggdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICovCi0gIC8qICAgICAgICAgICAgICAgaGVhZGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1ZlcnRIZWFkZXJfCi0gIHsKLSAgICBGVF9GaXhlZCAgIFZlcnNpb247Ci0gICAgRlRfU2hvcnQgICBBc2NlbmRlcjsKLSAgICBGVF9TaG9ydCAgIERlc2NlbmRlcjsKLSAgICBGVF9TaG9ydCAgIExpbmVfR2FwOwotCi0gICAgRlRfVVNob3J0ICBhZHZhbmNlX0hlaWdodF9NYXg7ICAgICAgLyogYWR2YW5jZSBoZWlnaHQgbWF4aW11bSAqLwotCi0gICAgRlRfU2hvcnQgICBtaW5fVG9wX1NpZGVfQmVhcmluZzsgICAgLyogbWluaW11bSBsZWZ0LXNiIG9yIHRvcC1zYiAgICAgICAqLwotICAgIEZUX1Nob3J0ICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmc7IC8qIG1pbmltdW0gcmlnaHQtc2Igb3IgYm90dG9tLXNiICAgKi8KLSAgICBGVF9TaG9ydCAgIHlNYXhfRXh0ZW50OyAgICAgICAgICAgICAvKiB4bWF4IG9yIHltYXggZXh0ZW50cyAgICAgICAgICAgICovCi0gICAgRlRfU2hvcnQgICBjYXJldF9TbG9wZV9SaXNlOwotICAgIEZUX1Nob3J0ICAgY2FyZXRfU2xvcGVfUnVuOwotICAgIEZUX1Nob3J0ICAgY2FyZXRfT2Zmc2V0OwotCi0gICAgRlRfU2hvcnQgICBSZXNlcnZlZFs0XTsKLQotICAgIEZUX1Nob3J0ICAgbWV0cmljX0RhdGFfRm9ybWF0OwotICAgIEZUX1VTaG9ydCAgbnVtYmVyX09mX1ZNZXRyaWNzOwotCi0gICAgLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uICovCi0gICAgLyogYnV0IHRoZXkncmUgdXNlZCB0byBjb25uZWN0IHRoZSBtZXRyaWNzIGhlYWRlciB0byB0aGUgcmVsZXZhbnQgICAgICovCi0gICAgLyogYEhNVFgnIG9yIGBWTVRYJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB2b2lkKiAgICAgIGxvbmdfbWV0cmljczsKLSAgICB2b2lkKiAgICAgIHNob3J0X21ldHJpY3M7Ci0KLSAgfSBUVF9WZXJ0SGVhZGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIE9TLzIgdGFibGUuIFRoaXMgaXMgdGhlIGxvbmcgICovCi0gIC8qICAgIHRhYmxlIHZlcnNpb24uICBBbGwgZmllbGRzIGNvbXBseSB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHdlIG5vdyBzdXBwb3J0IG9sZCBNYWMgZm9udHMgd2hpY2ggZG8gbm90IGluY2x1ZGUgYW4gICAgICovCi0gIC8qICAgIE9TLzIgdGFibGUuICBJbiB0aGlzIGNhc2UsIHRoZSBgdmVyc2lvbicgZmllbGQgaXMgYWx3YXlzIHNldCB0byAgICAqLwotICAvKiAgICAweEZGRkYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9PUzJfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qIDB4MDAwMSAtIG1vcmUgb3IgMHhGRkZGICovCi0gICAgRlRfU2hvcnQgICB4QXZnQ2hhcldpZHRoOwotICAgIEZUX1VTaG9ydCAgdXNXZWlnaHRDbGFzczsKLSAgICBGVF9VU2hvcnQgIHVzV2lkdGhDbGFzczsKLSAgICBGVF9TaG9ydCAgIGZzVHlwZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRYU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRZU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRYT2Zmc2V0OwotICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFlPZmZzZXQ7Ci0gICAgRlRfU2hvcnQgICB5U3VwZXJzY3JpcHRYU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdXBlcnNjcmlwdFlTaXplOwotICAgIEZUX1Nob3J0ICAgeVN1cGVyc2NyaXB0WE9mZnNldDsKLSAgICBGVF9TaG9ydCAgIHlTdXBlcnNjcmlwdFlPZmZzZXQ7Ci0gICAgRlRfU2hvcnQgICB5U3RyaWtlb3V0U2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdHJpa2VvdXRQb3NpdGlvbjsKLSAgICBGVF9TaG9ydCAgIHNGYW1pbHlDbGFzczsKLQotICAgIEZUX0J5dGUgICAgcGFub3NlWzEwXTsKLQotICAgIEZUX1VMb25nICAgdWxVbmljb2RlUmFuZ2UxOyAgICAgICAgLyogQml0cyAwLTMxICAgKi8KLSAgICBGVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlMjsgICAgICAgIC8qIEJpdHMgMzItNjMgICovCi0gICAgRlRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTM7ICAgICAgICAvKiBCaXRzIDY0LTk1ICAqLwotICAgIEZUX1VMb25nICAgdWxVbmljb2RlUmFuZ2U0OyAgICAgICAgLyogQml0cyA5Ni0xMjcgKi8KLQotICAgIEZUX0NoYXIgICAgYWNoVmVuZElEWzRdOwotCi0gICAgRlRfVVNob3J0ICBmc1NlbGVjdGlvbjsKLSAgICBGVF9VU2hvcnQgIHVzRmlyc3RDaGFySW5kZXg7Ci0gICAgRlRfVVNob3J0ICB1c0xhc3RDaGFySW5kZXg7Ci0gICAgRlRfU2hvcnQgICBzVHlwb0FzY2VuZGVyOwotICAgIEZUX1Nob3J0ICAgc1R5cG9EZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBzVHlwb0xpbmVHYXA7Ci0gICAgRlRfVVNob3J0ICB1c1dpbkFzY2VudDsKLSAgICBGVF9VU2hvcnQgIHVzV2luRGVzY2VudDsKLQotICAgIC8qIG9ubHkgdmVyc2lvbiAxIHRhYmxlczogKi8KLQotICAgIEZUX1VMb25nICAgdWxDb2RlUGFnZVJhbmdlMTsgICAgICAgLyogQml0cyAwLTMxICAgKi8KLSAgICBGVF9VTG9uZyAgIHVsQ29kZVBhZ2VSYW5nZTI7ICAgICAgIC8qIEJpdHMgMzItNjMgICovCi0KLSAgICAvKiBvbmx5IHZlcnNpb24gMiB0YWJsZXM6ICovCi0KLSAgICBGVF9TaG9ydCAgIHN4SGVpZ2h0OwotICAgIEZUX1Nob3J0ICAgc0NhcEhlaWdodDsKLSAgICBGVF9VU2hvcnQgIHVzRGVmYXVsdENoYXI7Ci0gICAgRlRfVVNob3J0ICB1c0JyZWFrQ2hhcjsKLSAgICBGVF9VU2hvcnQgIHVzTWF4Q29udGV4dDsKLQotICB9IFRUX09TMjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Bvc3RzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSBQb3N0c2NyaXB0IHRhYmxlLiAgQWxsIGZpZWxkcyAqLwotICAvKiAgICBjb21wbHkgdG8gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICBUaGlzIHN0cnVjdHVyZSBkb2VzIG5vdCAgICAgKi8KLSAgLyogICAgcmVmZXJlbmNlIHRoZSBQb3N0c2NyaXB0IGdseXBoIG5hbWVzLCB3aGljaCBjYW4gYmUgbmV2ZXJ0aGVsZXNzICAgICovCi0gIC8qICAgIGFjY2Vzc2VkIHdpdGggdGhlIGB0dHBvc3QnIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RzY3JpcHRfCi0gIHsKLSAgICBGVF9GaXhlZCAgRm9ybWF0VHlwZTsKLSAgICBGVF9GaXhlZCAgaXRhbGljQW5nbGU7Ci0gICAgRlRfU2hvcnQgIHVuZGVybGluZVBvc2l0aW9uOwotICAgIEZUX1Nob3J0ICB1bmRlcmxpbmVUaGlja25lc3M7Ci0gICAgRlRfVUxvbmcgIGlzRml4ZWRQaXRjaDsKLSAgICBGVF9VTG9uZyAgbWluTWVtVHlwZTQyOwotICAgIEZUX1VMb25nICBtYXhNZW1UeXBlNDI7Ci0gICAgRlRfVUxvbmcgIG1pbk1lbVR5cGUxOwotICAgIEZUX1VMb25nICBtYXhNZW1UeXBlMTsKLQotICAgIC8qIEdseXBoIG5hbWVzIGZvbGxvdyBpbiB0aGUgZmlsZSwgYnV0IHdlIGRvbid0ICAgKi8KLSAgICAvKiBsb2FkIHRoZW0gYnkgZGVmYXVsdC4gIFNlZSB0aGUgdHRwb3N0LmMgZmlsZS4gICovCi0KLSAgfSBUVF9Qb3N0c2NyaXB0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUENMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIFBDTFQgdGFibGUuICBBbGwgZmllbGRzICAgICAgICovCi0gIC8qICAgIGNvbXBseSB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1BDTFRfCi0gIHsKLSAgICBGVF9GaXhlZCAgIFZlcnNpb247Ci0gICAgRlRfVUxvbmcgICBGb250TnVtYmVyOwotICAgIEZUX1VTaG9ydCAgUGl0Y2g7Ci0gICAgRlRfVVNob3J0ICB4SGVpZ2h0OwotICAgIEZUX1VTaG9ydCAgU3R5bGU7Ci0gICAgRlRfVVNob3J0ICBUeXBlRmFtaWx5OwotICAgIEZUX1VTaG9ydCAgQ2FwSGVpZ2h0OwotICAgIEZUX1VTaG9ydCAgU3ltYm9sU2V0OwotICAgIEZUX0NoYXIgICAgVHlwZUZhY2VbMTZdOwotICAgIEZUX0NoYXIgICAgQ2hhcmFjdGVyQ29tcGxlbWVudFs4XTsKLSAgICBGVF9DaGFyICAgIEZpbGVOYW1lWzZdOwotICAgIEZUX0NoYXIgICAgU3Ryb2tlV2VpZ2h0OwotICAgIEZUX0NoYXIgICAgV2lkdGhUeXBlOwotICAgIEZUX0J5dGUgICAgU2VyaWZTdHlsZTsKLSAgICBGVF9CeXRlICAgIFJlc2VydmVkOwotCi0gIH0gVFRfUENMVDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX01heFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtYXhpbXVtIHByb2ZpbGUgaXMgYSB0YWJsZSBjb250YWluaW5nIG1hbnkgbWF4IHZhbHVlcyB3aGljaCAgICAqLwotICAvKiAgICBjYW4gYmUgdXNlZCB0byBwcmUtYWxsb2NhdGUgYXJyYXlzLiAgVGhpcyBlbnN1cmVzIHRoYXQgbm8gbWVtb3J5ICAgKi8KLSAgLyogICAgYWxsb2NhdGlvbiBvY2N1cnMgZHVyaW5nIGEgZ2x5cGggbG9hZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbiAgICAgICAgICAgICAgIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1HbHlwaHMgICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhpcyBUcnVlVHlwZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhQb2ludHMgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1jb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RydWN0dXJlIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYG1heENvbXBvc2l0ZVBvaW50cycuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heENvbnRvdXJzICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgaW4gYSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF4Q29tcG9zaXRlQ29udG91cnMnLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9zaXRlUG9pbnRzICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgaW4gYSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGVsZW1lbnQgYG1heFBvaW50cycuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heENvbXBvc2l0ZUNvbnRvdXJzICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgaW4gYSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBlbGVtZW50IGBtYXhDb250b3VycycuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhab25lcyAgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHpvbmVzIHVzZWQgZm9yICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhUd2lsaWdodFBvaW50cyAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3aWxpZ2h0IHpvbmUgdXNlZCBmb3IgZ2x5cGggaGludGluZy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhTdG9yYWdlICAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UgYXJlYSB1c2VkIGZvciBnbHlwaCBoaW50aW5nLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhGdW5jdGlvbkRlZnMgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zIGluIHRoZSBUcnVlVHlwZSBieXRlY29kZSBmb3IgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4SW5zdHJ1Y3Rpb25EZWZzICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFN0YWNrRWxlbWVudHMgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2sgZWxlbWVudHMgdXNlZCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGJ5dGVjb2RlIGludGVycHJldGF0aW9uLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgVHJ1ZVR5cGUgb3Bjb2RlcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgZ2x5cGggaGludGluZy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heENvbXBvbmVudEVsZW1lbnRzICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltcGxlIChpLmUuLCBub24tICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlKSBnbHlwaHMgaW4gYSBjb21wb3NpdGUgZ2x5cGguICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heENvbXBvbmVudERlcHRoICAgICA6OiBUaGUgbWF4aW11bSBuZXN0aW5nIGRlcHRoIG9mIGNvbXBvc2l0ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBpcyBvbmx5IHVzZWQgZHVyaW5nIGZvbnQgbG9hZGluZy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9NYXhQcm9maWxlXwotICB7Ci0gICAgRlRfRml4ZWQgICB2ZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgbnVtR2x5cGhzOwotICAgIEZUX1VTaG9ydCAgbWF4UG9pbnRzOwotICAgIEZUX1VTaG9ydCAgbWF4Q29udG91cnM7Ci0gICAgRlRfVVNob3J0ICBtYXhDb21wb3NpdGVQb2ludHM7Ci0gICAgRlRfVVNob3J0ICBtYXhDb21wb3NpdGVDb250b3VyczsKLSAgICBGVF9VU2hvcnQgIG1heFpvbmVzOwotICAgIEZUX1VTaG9ydCAgbWF4VHdpbGlnaHRQb2ludHM7Ci0gICAgRlRfVVNob3J0ICBtYXhTdG9yYWdlOwotICAgIEZUX1VTaG9ydCAgbWF4RnVuY3Rpb25EZWZzOwotICAgIEZUX1VTaG9ydCAgbWF4SW5zdHJ1Y3Rpb25EZWZzOwotICAgIEZUX1VTaG9ydCAgbWF4U3RhY2tFbGVtZW50czsKLSAgICBGVF9VU2hvcnQgIG1heFNpemVPZkluc3RydWN0aW9uczsKLSAgICBGVF9VU2hvcnQgIG1heENvbXBvbmVudEVsZW1lbnRzOwotICAgIEZUX1VTaG9ydCAgbWF4Q29tcG9uZW50RGVwdGg7Ci0KLSAgfSBUVF9NYXhQcm9maWxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2ZudF9UYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdXNlZCB0byBzcGVjaWZ5IHRoZSBpbmRleCBvZiBhbiBTRk5UIHRhYmxlLiAgICAgICAgICovCi0gIC8qICAgIFVzZWQgaW4gdGhlIEBGVF9HZXRfU2ZudF9UYWJsZSBBUEkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9TZm50X1RhZ18KLSAgewotICAgIGZ0X3NmbnRfaGVhZCA9IDAsCi0gICAgZnRfc2ZudF9tYXhwID0gMSwKLSAgICBmdF9zZm50X29zMiAgPSAyLAotICAgIGZ0X3NmbnRfaGhlYSA9IDMsCi0gICAgZnRfc2ZudF92aGVhID0gNCwKLSAgICBmdF9zZm50X3Bvc3QgPSA1LAotICAgIGZ0X3NmbnRfcGNsdCA9IDYsCi0KLSAgICBzZm50X21heCAgIC8qIGludGVybmFsIGVuZCBtYXJrICovCi0KLSAgfSBGVF9TZm50X1RhZzsKLQotICAvKiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1NmbnRfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBnaXZlbiBTRk5UIHRhYmxlIHdpdGhpbiBhIGZhY2UuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgIDo6IFRoZSBpbmRleCBvZiB0aGUgU0ZOVCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGUtbGVzcyBwb2ludGVyIHRvIHRoZSB0YWJsZS4gIFRoaXMgd2lsbCBiZSAwIGluIGNhc2Ugb2YgICAgICAgKi8KLSAgLyogICAgZXJyb3IsIG9yIGlmIHRoZSBjb3JyZXNwb25kaW5nIHRhYmxlIHdhcyBub3QgZm91bmQgKk9SKiBsb2FkZWQgICAgICovCi0gIC8qICAgIGZyb20gdGhlIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSB0YWJsZSBpcyBvd25lZCBieSB0aGUgZmFjZSBvYmplY3QgYW5kIGRpc2FwcGVhcnMgd2l0aCBpdC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCB0byBhY2Nlc3MgU0ZOVCB0YWJsZXMgdGhhdCBhcmUgbG9hZGVkICovCi0gIC8qICAgIGJ5IHRoZSBzZm50LCB0cnVldHlwZSwgYW5kIG9wZW50eXBlIGRyaXZlcnMuICBTZWUgQEZUX1NmbnRfVGFnIGZvciAqLwotICAvKiAgICBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCogKQotICBGVF9HZXRfU2ZudF9UYWJsZSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TZm50X1RhZyAgdGFnICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgRlRfTG9hZF9TZm50X1RhYmxlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBMb2FkcyBhbnkgZm9udCB0YWJsZSBpbnRvIGNsaWVudCBtZW1vcnkuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBmYWNlIDo6Ci0gICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KLSAgKgotICAqICAgdGFnIDo6Ci0gICogICAgIFRoZSBmb3VyLWJ5dGUgdGFnIG9mIHRoZSB0YWJsZSB0byBsb2FkLiAgVXNlIHRoZSB2YWx1ZSAwIGlmIHlvdSB3YW50Ci0gICogICAgIHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLiAgT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlCi0gICogICAgIGRlZmluaXRpb25zIGZvdW5kIGluIHRoZSBARlRfVFJVRVRZUEVfVEFHU19IIGZpbGUsIG9yIGZvcmdlIGEgbmV3Ci0gICogICAgIG9uZSB3aXRoIEBGVF9NQUtFX1RBRy4KLSAgKgotICAqICAgb2Zmc2V0IDo6Ci0gICogICAgIFRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHRhYmxlIChvciBmaWxlIGlmIHRhZyA9PSAwKS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICBidWZmZXIgOjoKLSAgKiAgICAgVGhlIHRhcmdldCBidWZmZXIgYWRkcmVzcy4gIFRoZSBjbGllbnQgbXVzdCBlbnN1cmUgdGhhdCB0aGUgbWVtb3J5Ci0gICogICAgIGFycmF5IGlzIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgZGF0YS4KLSAgKgotICAqIEBpbm91dDoKLSAgKiAgIGxlbmd0aCA6OgotICAqICAgICBJZiB0aGUgYGxlbmd0aCcgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZW4gdHJ5IHRvIGxvYWQgdGhlIHdob2xlIHRhYmxlLgotICAqICAgICBSZXR1cm4gYW4gZXJyb3IgY29kZSBpZiBpdCBmYWlscy4KLSAgKgotICAqICAgICBFbHNlLCBpZiBgKmxlbmd0aCcgaXMgMCwgZXhpdCBpbW1lZGlhdGVseSB3aGlsZSByZXR1cm5pbmcgdGhlCi0gICogICAgIHRhYmxlJ3MgKG9yIGZpbGUpIGZ1bGwgc2l6ZSBpbiBpdC4KLSAgKgotICAqICAgICBFbHNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSB0YWJsZSBvciBmaWxlLCBmcm9tIHRoZQotICAqICAgICBzdGFydGluZyBvZmZzZXQuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgSWYgeW91IG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSB0YWJsZSdzIGxlbmd0aCB5b3Ugc2hvdWxkIGZpcnN0IGNhbGwgdGhpcwotICAqICAgZnVuY3Rpb24gd2l0aCBgKmxlbmd0aCcgc2V0IHRvIDAsIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLSAgKgotICAqICAgICB7Ci0gICogICAgICAgRlRfVUxvbmcgIGxlbmd0aCA9IDA7Ci0gICoKLSAgKgotICAqICAgICAgIGVycm9yID0gRlRfTG9hZF9TZm50X1RhYmxlKCBmYWNlLCB0YWcsIDAsIE5VTEwsICZsZW5ndGggKTsKLSAgKiAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gdGFibGUgZG9lcyBub3QgZXhpc3QgLi4uIH0KLSAgKgotICAqICAgICAgIGJ1ZmZlciA9IG1hbGxvYyggbGVuZ3RoICk7Ci0gICogICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsgLi4uIG5vdCBlbm91Z2ggbWVtb3J5IC4uLiB9Ci0gICoKLSAgKiAgICAgICBlcnJvciA9IEZUX0xvYWRfU2ZudF9UYWJsZSggZmFjZSwgdGFnLCAwLCBidWZmZXIsICZsZW5ndGggKTsKLSAgKiAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gY291bGQgbm90IGxvYWQgdGFibGUgLi4uIH0KLSAgKiAgICAgfQotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTG9hZF9TZm50X1RhYmxlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9TZm50X1RhYmxlX0luZm8KLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIFJldHVybnMgaW5mb3JtYXRpb24gb24gYW4gU0ZOVCB0YWJsZS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgIGZhY2UgOjoKLSAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLgotICAqCi0gICogICB0YWJsZV9pbmRleCA6OgotICAqICAgICBUaGUgaW5kZXggb2YgYW4gU0ZOVCB0YWJsZS4gIFRoZSBmdW5jdGlvbiByZXR1cm5zCi0gICogICAgIEZUX0Vycl9UYWJsZV9NaXNzaW5nIGZvciBhbiBpbnZhbGlkIHZhbHVlLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgIHRhZyA6OgotICAqICAgICBUaGUgbmFtZSB0YWcgb2YgdGhlIFNGTlQgdGFibGUuCi0gICoKLSAgKiAgIGxlbmd0aCA6OgotICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBTRk5UIHRhYmxlLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFNGTlQgdGFibGVzIHdpdGggbGVuZ3RoIHplcm8gYXJlIHRyZWF0ZWQgYXMgbWlzc2luZyBieSBXaW5kb3dzLgotICAqCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZm50X1RhYmxlX0luZm8oIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHRhYmxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqdGFnLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gVHJ1ZVR5cGUvc2ZudCBzcGVjaWZpYyBjbWFwIGxhbmd1YWdlIElELiAgRGVmaW5pdGlvbnMgb2YgICAgKi8KLSAgLyogICAgbGFuZ3VhZ2UgSUQgdmFsdWVzIGFyZSBpbiBgZnJlZXR5cGUvdHRuYW1laWQuaCcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHRhcmdldCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsYW5ndWFnZSBJRCBvZiBgY2hhcm1hcCcuICBJZiBgY2hhcm1hcCcgZG9lc24ndCBiZWxvbmcgdG8gYSAgICAqLwotICAvKiAgICBUcnVlVHlwZS9zZm50IGZhY2UsIGp1c3QgcmV0dXJuIDAgYXMgdGhlIGRlZmF1bHQgdmFsdWUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUxvbmcgKQotICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCggRlRfQ2hhck1hcCAgY2hhcm1hcCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIFRydWVUeXBlL3NmbnQgc3BlY2lmaWMgY21hcCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHRhcmdldCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmb3JtYXQgb2YgYGNoYXJtYXAnLiAgSWYgYGNoYXJtYXAnIGRvZXNuJ3QgYmVsb25nIHRvIGEgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZS9zZm50IGZhY2UsIHJldHVybiAtMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX0dldF9DTWFwX0Zvcm1hdCggRlRfQ2hhck1hcCAgY2hhcm1hcCApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVFRBQkxFU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWdzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTc5MDA4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHR0YWdzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRhZ3MgZm9yIFRydWVUeXBlIGFuZCBPcGVuVHlwZSB0YWJsZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDQsIDIwMDUsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRBR1NfSF9fCi0jZGVmaW5lIF9fVFRBR1NfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgVFRBR19hdmFyICBGVF9NQUtFX1RBRyggJ2EnLCAndicsICdhJywgJ3InICkKLSNkZWZpbmUgVFRBR19CQVNFICBGVF9NQUtFX1RBRyggJ0InLCAnQScsICdTJywgJ0UnICkKLSNkZWZpbmUgVFRBR19iZGF0ICBGVF9NQUtFX1RBRyggJ2InLCAnZCcsICdhJywgJ3QnICkKLSNkZWZpbmUgVFRBR19CREYgICBGVF9NQUtFX1RBRyggJ0InLCAnRCcsICdGJywgJyAnICkKLSNkZWZpbmUgVFRBR19iaGVkICBGVF9NQUtFX1RBRyggJ2InLCAnaCcsICdlJywgJ2QnICkKLSNkZWZpbmUgVFRBR19ibG9jICBGVF9NQUtFX1RBRyggJ2InLCAnbCcsICdvJywgJ2MnICkKLSNkZWZpbmUgVFRBR19ic2xuICBGVF9NQUtFX1RBRyggJ2InLCAncycsICdsJywgJ24nICkKLSNkZWZpbmUgVFRBR19DRkYgICBGVF9NQUtFX1RBRyggJ0MnLCAnRicsICdGJywgJyAnICkKLSNkZWZpbmUgVFRBR19jbWFwICBGVF9NQUtFX1RBRyggJ2MnLCAnbScsICdhJywgJ3AnICkKLSNkZWZpbmUgVFRBR19jdmFyICBGVF9NQUtFX1RBRyggJ2MnLCAndicsICdhJywgJ3InICkKLSNkZWZpbmUgVFRBR19jdnQgICBGVF9NQUtFX1RBRyggJ2MnLCAndicsICd0JywgJyAnICkKLSNkZWZpbmUgVFRBR19EU0lHICBGVF9NQUtFX1RBRyggJ0QnLCAnUycsICdJJywgJ0cnICkKLSNkZWZpbmUgVFRBR19FQkRUICBGVF9NQUtFX1RBRyggJ0UnLCAnQicsICdEJywgJ1QnICkKLSNkZWZpbmUgVFRBR19FQkxDICBGVF9NQUtFX1RBRyggJ0UnLCAnQicsICdMJywgJ0MnICkKLSNkZWZpbmUgVFRBR19FQlNDICBGVF9NQUtFX1RBRyggJ0UnLCAnQicsICdTJywgJ0MnICkKLSNkZWZpbmUgVFRBR19mZWF0ICBGVF9NQUtFX1RBRyggJ2YnLCAnZScsICdhJywgJ3QnICkKLSNkZWZpbmUgVFRBR19mcGdtICBGVF9NQUtFX1RBRyggJ2YnLCAncCcsICdnJywgJ20nICkKLSNkZWZpbmUgVFRBR19mdmFyICBGVF9NQUtFX1RBRyggJ2YnLCAndicsICdhJywgJ3InICkKLSNkZWZpbmUgVFRBR19nYXNwICBGVF9NQUtFX1RBRyggJ2cnLCAnYScsICdzJywgJ3AnICkKLSNkZWZpbmUgVFRBR19HREVGICBGVF9NQUtFX1RBRyggJ0cnLCAnRCcsICdFJywgJ0YnICkKLSNkZWZpbmUgVFRBR19nbHlmICBGVF9NQUtFX1RBRyggJ2cnLCAnbCcsICd5JywgJ2YnICkKLSNkZWZpbmUgVFRBR19HUE9TICBGVF9NQUtFX1RBRyggJ0cnLCAnUCcsICdPJywgJ1MnICkKLSNkZWZpbmUgVFRBR19HU1VCICBGVF9NQUtFX1RBRyggJ0cnLCAnUycsICdVJywgJ0InICkKLSNkZWZpbmUgVFRBR19ndmFyICBGVF9NQUtFX1RBRyggJ2cnLCAndicsICdhJywgJ3InICkKLSNkZWZpbmUgVFRBR19oZG14ICBGVF9NQUtFX1RBRyggJ2gnLCAnZCcsICdtJywgJ3gnICkKLSNkZWZpbmUgVFRBR19oZWFkICBGVF9NQUtFX1RBRyggJ2gnLCAnZScsICdhJywgJ2QnICkKLSNkZWZpbmUgVFRBR19oaGVhICBGVF9NQUtFX1RBRyggJ2gnLCAnaCcsICdlJywgJ2EnICkKLSNkZWZpbmUgVFRBR19obXR4ICBGVF9NQUtFX1RBRyggJ2gnLCAnbScsICd0JywgJ3gnICkKLSNkZWZpbmUgVFRBR19KU1RGICBGVF9NQUtFX1RBRyggJ0onLCAnUycsICdUJywgJ0YnICkKLSNkZWZpbmUgVFRBR19qdXN0ICBGVF9NQUtFX1RBRyggJ2onLCAndScsICdzJywgJ3QnICkKLSNkZWZpbmUgVFRBR19rZXJuICBGVF9NQUtFX1RBRyggJ2snLCAnZScsICdyJywgJ24nICkKLSNkZWZpbmUgVFRBR19sY2FyICBGVF9NQUtFX1RBRyggJ2wnLCAnYycsICdhJywgJ3InICkKLSNkZWZpbmUgVFRBR19sb2NhICBGVF9NQUtFX1RBRyggJ2wnLCAnbycsICdjJywgJ2EnICkKLSNkZWZpbmUgVFRBR19MVFNIICBGVF9NQUtFX1RBRyggJ0wnLCAnVCcsICdTJywgJ0gnICkKLSNkZWZpbmUgVFRBR19NQVRIICBGVF9NQUtFX1RBRyggJ00nLCAnQScsICdUJywgJ0gnICkKLSNkZWZpbmUgVFRBR19tYXhwICBGVF9NQUtFX1RBRyggJ20nLCAnYScsICd4JywgJ3AnICkKLSNkZWZpbmUgVFRBR19NRVRBICBGVF9NQUtFX1RBRyggJ00nLCAnRScsICdUJywgJ0EnICkKLSNkZWZpbmUgVFRBR19NTUZYICBGVF9NQUtFX1RBRyggJ00nLCAnTScsICdGJywgJ1gnICkKLSNkZWZpbmUgVFRBR19NTVNEICBGVF9NQUtFX1RBRyggJ00nLCAnTScsICdTJywgJ0QnICkKLSNkZWZpbmUgVFRBR19tb3J0ICBGVF9NQUtFX1RBRyggJ20nLCAnbycsICdyJywgJ3QnICkKLSNkZWZpbmUgVFRBR19tb3J4ICBGVF9NQUtFX1RBRyggJ20nLCAnbycsICdyJywgJ3gnICkKLSNkZWZpbmUgVFRBR19uYW1lICBGVF9NQUtFX1RBRyggJ24nLCAnYScsICdtJywgJ2UnICkKLSNkZWZpbmUgVFRBR19vcGJkICBGVF9NQUtFX1RBRyggJ28nLCAncCcsICdiJywgJ2QnICkKLSNkZWZpbmUgVFRBR19PUzIgICBGVF9NQUtFX1RBRyggJ08nLCAnUycsICcvJywgJzInICkKLSNkZWZpbmUgVFRBR19PVFRPICBGVF9NQUtFX1RBRyggJ08nLCAnVCcsICdUJywgJ08nICkKLSNkZWZpbmUgVFRBR19QQ0xUICBGVF9NQUtFX1RBRyggJ1AnLCAnQycsICdMJywgJ1QnICkKLSNkZWZpbmUgVFRBR19wb3N0ICBGVF9NQUtFX1RBRyggJ3AnLCAnbycsICdzJywgJ3QnICkKLSNkZWZpbmUgVFRBR19wcmVwICBGVF9NQUtFX1RBRyggJ3AnLCAncicsICdlJywgJ3AnICkKLSNkZWZpbmUgVFRBR19wcm9wICBGVF9NQUtFX1RBRyggJ3AnLCAncicsICdvJywgJ3AnICkKLSNkZWZpbmUgVFRBR19TSU5HICBGVF9NQUtFX1RBRyggJ1MnLCAnSScsICdOJywgJ0cnICkKLSNkZWZpbmUgVFRBR190cmFrICBGVF9NQUtFX1RBRyggJ3QnLCAncicsICdhJywgJ2snICkKLSNkZWZpbmUgVFRBR190cnVlICBGVF9NQUtFX1RBRyggJ3QnLCAncicsICd1JywgJ2UnICkKLSNkZWZpbmUgVFRBR190dGMgICBGVF9NQUtFX1RBRyggJ3QnLCAndCcsICdjJywgJyAnICkKLSNkZWZpbmUgVFRBR190dGNmICBGVF9NQUtFX1RBRyggJ3QnLCAndCcsICdjJywgJ2YnICkKLSNkZWZpbmUgVFRBR19WRE1YICBGVF9NQUtFX1RBRyggJ1YnLCAnRCcsICdNJywgJ1gnICkKLSNkZWZpbmUgVFRBR192aGVhICBGVF9NQUtFX1RBRyggJ3YnLCAnaCcsICdlJywgJ2EnICkKLSNkZWZpbmUgVFRBR192bXR4ICBGVF9NQUtFX1RBRyggJ3YnLCAnbScsICd0JywgJ3gnICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUQUdTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS90dHVucGF0LmggYi9pbmNsdWRlL2ZyZWV0eXBlL3R0dW5wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxNjI3NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL3R0dW5wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0dW5wYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBEZWZpbml0aW9ucyBmb3IgdGhlIHVucGF0ZW50ZWQgVHJ1ZVR5cGUgaGludGluZyBzeXN0ZW0gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXcml0dGVuIGJ5IEdyYWhhbSBBc2hlciA8Z3JhaGFtLmFzaGVyQGJ0aW50ZXJuZXQuY29tPiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRVTlBBVF9IX18KLSNkZWZpbmUgX19UVFVOUEFUX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGNvbnN0YW50OgotICAqICAgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgQSBjb25zdGFudCB1c2VkIGFzIHRoZSB0YWcgb2YgYW4gQEZUX1BhcmFtZXRlciBzdHJ1Y3R1cmUgdG8gaW5kaWNhdGUKLSAgKiAgIHRoYXQgdW5wYXRlbnRlZCBtZXRob2RzIG9ubHkgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIFRydWVUeXBlIGJ5dGVjb2RlCi0gICogICBpbnRlcnByZXRlciBmb3IgYSB0eXBlZmFjZSBvcGVuZWQgYnkgQEZUX09wZW5fRmFjZS4KLSAgKgotICAqLwotI2RlZmluZSBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HICBGVF9NQUtFX1RBRyggJ3UnLCAnbicsICdwJywgJ2EnICkKLQotIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19UVFVOUEFUX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mdDJidWlsZC5oIGIvaW5jbHVkZS9mdDJidWlsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNkODg3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZnQyYnVpbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0MmJ1aWxkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSAyIGJ1aWxkIGFuZCBzZXR1cCBtYWNyb3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgKEdlbmVyaWMgdmVyc2lvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgY29ycmVzcG9uZHMgdG8gdGhlIGRlZmF1bHQgYGZ0MmJ1aWxkLmgnIGZpbGUgZm9yICAgICAgICAgICAgKi8KLSAgLyogRnJlZVR5cGUgMi4gIEl0IHVzZXMgdGhlIGBmcmVldHlwZScgaW5jbHVkZSByb290LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgc3BlY2lmaWMgcGxhdGZvcm1zIG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uLiAgICAgKi8KLSAgLyogU2VlIGJ1aWxkcy91bml4L2Z0MnVuaXguaCBmb3IgYW4gZXhhbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlQyX0JVSUxEX0dFTkVSSUNfSF9fCi0jZGVmaW5lIF9fRlQyX0JVSUxEX0dFTkVSSUNfSF9fCi0KLSNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaD4KLQotI2VuZGlmIC8qIF9fRlQyX0JVSUxEX0dFTkVSSUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5jIGIvc3JjL2F1dG9maXQvYWZhbmdsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzNjBkMS4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmYW5nbGVzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBSb3V0aW5lcyB1c2VkIHRvIGNvbXB1dGUgdmVjdG9yIGFuZ2xlcyB3aXRoIGxpbWl0ZWQgYWNjdXJhY3kgICAgICAgICAqLwotLyogICAgYW5kIHZlcnkgaGlnaCBzcGVlZC4gIEl0IGFsc28gY29udGFpbnMgc29ydGluZyByb3V0aW5lcyAoYm9keSkuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJhZnR5cGVzLmgiCi0KLQotI2lmIDAKLQotICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCi0gIGFmX2Nvcm5lcl9pc19mbGF0KCBGVF9Qb3MgIHhfaW4sCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIHlfaW4sCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIHhfb3V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICB5X291dCApCi0gIHsKLSAgICBGVF9Qb3MgIGF4ID0geF9pbjsKLSAgICBGVF9Qb3MgIGF5ID0geV9pbjsKLQotICAgIEZUX1BvcyAgZF9pbiwgZF9vdXQsIGRfY29ybmVyOwotCi0KLSAgICBpZiAoIGF4IDwgMCApCi0gICAgICBheCA9IC1heDsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX2luID0gYXggKyBheTsKLQotICAgIGF4ID0geF9vdXQ7Ci0gICAgaWYgKCBheCA8IDAgKQotICAgICAgYXggPSAtYXg7Ci0gICAgYXkgPSB5X291dDsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX291dCA9IGF4ICsgYXk7Ci0KLSAgICBheCA9IHhfb3V0ICsgeF9pbjsKLSAgICBpZiAoIGF4IDwgMCApCi0gICAgICBheCA9IC1heDsKLSAgICBheSA9IHlfb3V0ICsgeV9pbjsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX2Nvcm5lciA9IGF4ICsgYXk7Ci0KLSAgICByZXR1cm4gKCBkX2luICsgZF9vdXQgLSBkX2Nvcm5lciApIDwgKCBkX2Nvcm5lciA+PiA0ICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfSW50ICkKLSAgYWZfY29ybmVyX29yaWVudGF0aW9uKCBGVF9Qb3MgIHhfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICB5X2luLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgeF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICB5X291dCApCi0gIHsKLSAgICBGVF9Qb3MgIGRlbHRhOwotCi0KLSAgICBkZWx0YSA9IHhfaW4gKiB5X291dCAtIHlfaW4gKiB4X291dDsKLQotICAgIGlmICggZGVsdGEgPT0gMCApCi0gICAgICByZXR1cm4gMDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMSAtIDIgKiAoIGRlbHRhIDwgMCApOwotICB9Ci0KLSNlbmRpZgotCi0KLSAgLyoKLSAgICogIFdlIGFyZSBub3QgdXNpbmcgYGFmX2FuZ2xlX2F0YW4nIGFueW1vcmUsIGJ1dCB3ZSBrZWVwIHRoZSBzb3VyY2UKLSAgICogIGNvZGUgYmVsb3cganVzdCBpbiBjYXNlLi4uCi0gICAqLwotCi0KLSNpZiAwCi0KLQotICAvKgotICAgKiAgVGhlIHRyaWNrIGhlcmUgaXMgdG8gcmVhbGl6ZSB0aGF0IHdlIGRvbid0IG5lZWQgYSB2ZXJ5IGFjY3VyYXRlIGFuZ2xlCi0gICAqICBhcHByb3hpbWF0aW9uLiAgV2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgcmVzdWx0IG9mIGBhZl9hbmdsZV9hdGFuJyB0bwotICAgKiAgb25seSBjb21wYXJlIHRoZSBzaWduIG9mIGFuZ2xlIGRpZmZlcmVuY2VzLCBvciBjaGVjayB3aGV0aGVyIGl0cwotICAgKiAgbWFnbml0dWRlIGlzIHZlcnkgc21hbGwuCi0gICAqCi0gICAqICBUaGUgYXBwcm94aW1hdGlvbgotICAgKgotICAgKiAgICBkeSAqIFBJIC8gKHxkeHwrfGR5fCkKLSAgICoKLSAgICogIHNob3VsZCBiZSBlbm91Z2gsIGFuZCBtdWNoIGZhc3RlciB0byBjb21wdXRlLgotICAgKi8KLSAgRlRfTE9DQUxfREVGKCBBRl9BbmdsZSApCi0gIGFmX2FuZ2xlX2F0YW4oIEZUX0ZpeGVkICBkeCwKLSAgICAgICAgICAgICAgICAgRlRfRml4ZWQgIGR5ICkKLSAgewotICAgIEFGX0FuZ2xlICBhbmdsZTsKLSAgICBGVF9GaXhlZCAgYXggPSBkeDsKLSAgICBGVF9GaXhlZCAgYXkgPSBkeTsKLQotCi0gICAgaWYgKCBheCA8IDAgKQotICAgICAgYXggPSAtYXg7Ci0gICAgaWYgKCBheSA8IDAgKQotICAgICAgYXkgPSAtYXk7Ci0KLSAgICBheCArPSBheTsKLQotICAgIGlmICggYXggPT0gMCApCi0gICAgICBhbmdsZSA9IDA7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFuZ2xlID0gKCBBRl9BTkdMRV9QSTIgKiBkeSApIC8gKCBheCArIGF5ICk7Ci0gICAgICBpZiAoIGR4IDwgMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggYW5nbGUgPj0gMCApCi0gICAgICAgICAgYW5nbGUgPSBBRl9BTkdMRV9QSSAtIGFuZ2xlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYW5nbGUgPSAtQUZfQU5HTEVfUEkgLSBhbmdsZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYW5nbGU7Ci0gIH0KLQotCi0jZWxpZiAwCi0KLQotICAvKiB0aGUgZm9sbG93aW5nIHRhYmxlIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHdpdGggKi8KLSAgLyogdGhlIGBtYXRoZXIucHknIFB5dGhvbiBzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgQUZfQVRBTl9CSVRTICA4Ci0KLSAgc3RhdGljIGNvbnN0IEZUX0J5dGUgIGFmX2FyY3RhblsxTCA8PCBBRl9BVEFOX0JJVFNdID0KLSAgewotICAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwKLSAgICAgMywgIDMsICAzLCAgMywgIDQsICA0LCAgNCwgIDUsCi0gICAgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAotICAgICA4LCAgOCwgIDgsICA5LCAgOSwgIDksIDEwLCAxMCwKLSAgICAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsCi0gICAgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LAotICAgIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywKLSAgICAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMjAsCi0gICAgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLAotICAgIDIyLCAyMywgMjMsIDIzLCAyNCwgMjQsIDI0LCAyNCwKLSAgICAyNSwgMjUsIDI1LCAyNiwgMjYsIDI2LCAyNiwgMjcsCi0gICAgMjcsIDI3LCAyOCwgMjgsIDI4LCAyOCwgMjksIDI5LAotICAgIDI5LCAzMCwgMzAsIDMwLCAzMCwgMzEsIDMxLCAzMSwKLSAgICAzMSwgMzIsIDMyLCAzMiwgMzMsIDMzLCAzMywgMzMsCi0gICAgMzQsIDM0LCAzNCwgMzQsIDM1LCAzNSwgMzUsIDM1LAotICAgIDM2LCAzNiwgMzYsIDM2LCAzNywgMzcsIDM3LCAzOCwKLSAgICAzOCwgMzgsIDM4LCAzOSwgMzksIDM5LCAzOSwgNDAsCi0gICAgNDAsIDQwLCA0MCwgNDEsIDQxLCA0MSwgNDEsIDQyLAotICAgIDQyLCA0MiwgNDIsIDQyLCA0MywgNDMsIDQzLCA0MywKLSAgICA0NCwgNDQsIDQ0LCA0NCwgNDUsIDQ1LCA0NSwgNDUsCi0gICAgNDYsIDQ2LCA0NiwgNDYsIDQ2LCA0NywgNDcsIDQ3LAotICAgIDQ3LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ5LCA0OSwKLSAgICA0OSwgNDksIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTEsCi0gICAgNTEsIDUxLCA1MSwgNTEsIDUyLCA1MiwgNTIsIDUyLAotICAgIDUyLCA1MywgNTMsIDUzLCA1MywgNTMsIDU0LCA1NCwKLSAgICA1NCwgNTQsIDU0LCA1NSwgNTUsIDU1LCA1NSwgNTUsCi0gICAgNTYsIDU2LCA1NiwgNTYsIDU2LCA1NywgNTcsIDU3LAotICAgIDU3LCA1NywgNTcsIDU4LCA1OCwgNTgsIDU4LCA1OCwKLSAgICA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA2MCwgNjAsCi0gICAgNjAsIDYwLCA2MCwgNjEsIDYxLCA2MSwgNjEsIDYxLAotICAgIDYxLCA2MiwgNjIsIDYyLCA2MiwgNjIsIDYyLCA2MywKLSAgICA2MywgNjMsIDYzLCA2MywgNjMsIDY0LCA2NCwgNjQKLSAgfTsKLQotCi0gIEZUX0xPQ0FMX0RFRiggQUZfQW5nbGUgKQotICBhZl9hbmdsZV9hdGFuKCBGVF9GaXhlZCAgZHgsCi0gICAgICAgICAgICAgICAgIEZUX0ZpeGVkICBkeSApCi0gIHsKLSAgICBBRl9BbmdsZSAgYW5nbGU7Ci0KLQotICAgIC8qIGNoZWNrIHRyaXZpYWwgY2FzZXMgKi8KLSAgICBpZiAoIGR5ID09IDAgKQotICAgIHsKLSAgICAgIGFuZ2xlID0gMDsKLSAgICAgIGlmICggZHggPCAwICkKLSAgICAgICAgYW5nbGUgPSBBRl9BTkdMRV9QSTsKLSAgICAgIHJldHVybiBhbmdsZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGR4ID09IDAgKQotICAgIHsKLSAgICAgIGFuZ2xlID0gQUZfQU5HTEVfUEkyOwotICAgICAgaWYgKCBkeSA8IDAgKQotICAgICAgICBhbmdsZSA9IC1BRl9BTkdMRV9QSTI7Ci0gICAgICByZXR1cm4gYW5nbGU7Ci0gICAgfQotCi0gICAgYW5nbGUgPSAwOwotICAgIGlmICggZHggPCAwICkKLSAgICB7Ci0gICAgICBkeCA9IC1keDsKLSAgICAgIGR5ID0gLWR5OwotICAgICAgYW5nbGUgPSBBRl9BTkdMRV9QSTsKLSAgICB9Ci0KLSAgICBpZiAoIGR5IDwgMCApCi0gICAgewotICAgICAgRlRfUG9zICB0bXA7Ci0KLQotICAgICAgdG1wID0gZHg7Ci0gICAgICBkeCAgPSAtZHk7Ci0gICAgICBkeSAgPSB0bXA7Ci0gICAgICBhbmdsZSAtPSBBRl9BTkdMRV9QSTI7Ci0gICAgfQotCi0gICAgaWYgKCBkeCA9PSAwICYmIGR5ID09IDAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIGR4ID09IGR5ICkKLSAgICAgIGFuZ2xlICs9IEFGX0FOR0xFX1BJNDsKLSAgICBlbHNlIGlmICggZHggPiBkeSApCi0gICAgICBhbmdsZSArPSBhZl9hcmN0YW5bRlRfRGl2Rml4KCBkeSwgZHggKSA+PiAoIDE2IC0gQUZfQVRBTl9CSVRTICldOwotICAgIGVsc2UKLSAgICAgIGFuZ2xlICs9IEFGX0FOR0xFX1BJMiAtCi0gICAgICAgICAgICAgICBhZl9hcmN0YW5bRlRfRGl2Rml4KCBkeCwgZHkgKSA+PiAoIDE2IC0gQUZfQVRBTl9CSVRTICldOwotCi0gICAgaWYgKCBhbmdsZSA+IEFGX0FOR0xFX1BJICkKLSAgICAgIGFuZ2xlIC09IEFGX0FOR0xFXzJQSTsKLQotICAgIHJldHVybiBhbmdsZTsKLSAgfQotCi0KLSNlbmRpZiAvKiAwICovCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9zb3J0X3BvcyggRlRfVUludCAgY291bnQsCi0gICAgICAgICAgICAgICBGVF9Qb3MqICB0YWJsZSApCi0gIHsKLSAgICBGVF9VSW50ICBpLCBqOwotICAgIEZUX1BvcyAgIHN3YXA7Ci0KLQotICAgIGZvciAoIGkgPSAxOyBpIDwgY291bnQ7IGkrKyApCi0gICAgewotICAgICAgZm9yICggaiA9IGk7IGogPiAwOyBqLS0gKQotICAgICAgewotICAgICAgICBpZiAoIHRhYmxlW2pdID4gdGFibGVbaiAtIDFdICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBzd2FwICAgICAgICAgPSB0YWJsZVtqXTsKLSAgICAgICAgdGFibGVbal0gICAgID0gdGFibGVbaiAtIDFdOwotICAgICAgICB0YWJsZVtqIC0gMV0gPSBzd2FwOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfc29ydF93aWR0aHMoIEZUX1VJbnQgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgIEFGX1dpZHRoICB0YWJsZSApCi0gIHsKLSAgICBGVF9VSW50ICAgICAgaSwgajsKLSAgICBBRl9XaWR0aFJlYyAgc3dhcDsKLQotCi0gICAgZm9yICggaSA9IDE7IGkgPCBjb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBmb3IgKCBqID0gaTsgaiA+IDA7IGotLSApCi0gICAgICB7Ci0gICAgICAgIGlmICggdGFibGVbal0ub3JnID4gdGFibGVbaiAtIDFdLm9yZyApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgc3dhcCAgICAgICAgID0gdGFibGVbal07Ci0gICAgICAgIHRhYmxlW2pdICAgICA9IHRhYmxlW2ogLSAxXTsKLSAgICAgICAgdGFibGVbaiAtIDFdID0gc3dhcDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmYW5nbGVzLmggYi9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNmOWUxLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmYW5nbGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8qCi0gKiAgYWZhbmdsZXMuaAotICoKLSAqICBUaGlzIGlzIGEgZHVtbXkgZmlsZSwgdXNlZCB0byBwbGVhc2UgdGhlIGJ1aWxkIHN5c3RlbS4gIEl0IGlzIG5ldmVyCi0gKiAgaW5jbHVkZWQgYnkgdGhlIGF1dG8tZml0dGVyIHNvdXJjZXMuCi0gKgotICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmNqay5jIGIvc3JjL2F1dG9maXQvYWZjamsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5NDM4Yi4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmNqay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmNqay5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgQ0pLIHNjcmlwdCAoYm9keSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAqICBUaGUgYWxnb3JpdGhtIGlzIGJhc2VkIG9uIGFraXRvJ3MgYXV0b2hpbnQgcGF0Y2gsIGF2YWlsYWJsZSBoZXJlOgotICAgKgotICAgKiAgaHR0cDovL3d3dy5rZGUuZ3IuanAvfmFraXRvL3BhdGNoL2ZyZWV0eXBlMi8KLSAgICoKLSAgICovCi0KLSNpbmNsdWRlICJhZnR5cGVzLmgiCi0jaW5jbHVkZSAiYWZsYXRpbi5oIgotCi0KLSNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKSwotCi0jaW5jbHVkZSAiYWZjamsuaCIKLSNpbmNsdWRlICJhZmVycm9ycy5oIgotCi0KLSNpZmRlZiBBRl9VU0VfV0FSUEVSCi0jaW5jbHVkZSAiYWZ3YXJwLmgiCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgQyBKIEsgICBHIEwgTyBCIEEgTCAgIE0gRSBUIFIgSSBDIFMgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9jamtfbWV0cmljc19pbml0KCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSApCi0gIHsKLSAgICBGVF9DaGFyTWFwICBvbGRtYXAgPSBmYWNlLT5jaGFybWFwOwotCi0KLSAgICBtZXRyaWNzLT51bml0c19wZXJfZW0gPSBmYWNlLT51bml0c19wZXJfRU07Ci0KLSAgICAvKiBUT0RPIGFyZSB0aGVyZSBibHVlcz8gKi8KLQotICAgIGlmICggRlRfU2VsZWN0X0NoYXJtYXAoIGZhY2UsIEZUX0VOQ09ESU5HX1VOSUNPREUgKSApCi0gICAgICBmYWNlLT5jaGFybWFwID0gTlVMTDsKLQotICAgIC8qIGxhdGluJ3MgdmVyc2lvbiB3b3VsZCBzdWZmaWNlICovCi0gICAgYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyggbWV0cmljcywgZmFjZSwgMHg3NTMwICk7Ci0KLSAgICBGVF9TZXRfQ2hhcm1hcCggZmFjZSwgb2xkbWFwICk7Ci0KLSAgICByZXR1cm4gQUZfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBhZl9jamtfbWV0cmljc19zY2FsZV9kaW0oIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TY2FsZXIgICAgICAgIHNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICAgIGRpbSApCi0gIHsKLSAgICBBRl9MYXRpbkF4aXMgIGF4aXM7Ci0KLQotICAgIGF4aXMgPSAmbWV0cmljcy0+YXhpc1tkaW1dOwotCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgIHsKLSAgICAgIGF4aXMtPnNjYWxlID0gc2NhbGVyLT54X3NjYWxlOwotICAgICAgYXhpcy0+ZGVsdGEgPSBzY2FsZXItPnhfZGVsdGE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBheGlzLT5zY2FsZSA9IHNjYWxlci0+eV9zY2FsZTsKLSAgICAgIGF4aXMtPmRlbHRhID0gc2NhbGVyLT55X2RlbHRhOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfY2prX21ldHJpY3Nfc2NhbGUoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgICAgc2NhbGVyICkKLSAgewotICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyID0gKnNjYWxlcjsKLQotICAgIGFmX2Nqa19tZXRyaWNzX3NjYWxlX2RpbSggbWV0cmljcywgc2NhbGVyLCBBRl9ESU1FTlNJT05fSE9SWiApOwotICAgIGFmX2Nqa19tZXRyaWNzX3NjYWxlX2RpbSggbWV0cmljcywgc2NhbGVyLCBBRl9ESU1FTlNJT05fVkVSVCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgIEMgSiBLICAgRyBMIFkgUCBIICAgQSBOIEEgTCBZIFMgSSBTICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZfY2prX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgICAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMgICAgICA9IGF4aXMtPnNlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudF9saW1pdCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgQUZfU2VnbWVudCAgICBzZWc7Ci0KLQotICAgIGVycm9yID0gYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyggaGludHMsIGRpbSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogYSBzZWdtZW50IGlzIHJvdW5kIGlmIGl0IGRvZXNuJ3QgaGF2ZSBzdWNjZXNzaXZlICovCi0gICAgLyogb24tY3VydmUgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICB7Ci0gICAgICBBRl9Qb2ludCAgcHQgICA9IHNlZy0+Zmlyc3Q7Ci0gICAgICBBRl9Qb2ludCAgbGFzdCA9IHNlZy0+bGFzdDsKLSAgICAgIEFGX0ZsYWdzICBmMCAgID0gKEFGX0ZsYWdzKShwdC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0wpOwotICAgICAgQUZfRmxhZ3MgIGYxOwotCi0KLSAgICAgIHNlZy0+ZmxhZ3MgJj0gfkFGX0VER0VfUk9VTkQ7Ci0KLSAgICAgIGZvciAoIDsgcHQgIT0gbGFzdDsgZjAgPSBmMSApCi0gICAgICB7Ci0gICAgICAgIHB0ID0gcHQtPm5leHQ7Ci0gICAgICAgIGYxID0gKEFGX0ZsYWdzKShwdC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0wpOwotCi0gICAgICAgIGlmICggIWYwICYmICFmMSApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCBwdCA9PSBsYXN0ICkKLSAgICAgICAgICBzZWctPmZsYWdzIHw9IEFGX0VER0VfUk9VTkQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEFGX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfY2prX2hpbnRzX2xpbmtfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgICAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMgICAgICA9IGF4aXMtPnNlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudF9saW1pdCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgIEFGX0RpcmVjdGlvbiAgbWFqb3JfZGlyICAgICA9IGF4aXMtPm1ham9yX2RpcjsKLSAgICBBRl9TZWdtZW50ICAgIHNlZzEsIHNlZzI7Ci0gICAgRlRfUG9zICAgICAgICBsZW5fdGhyZXNob2xkOwotICAgIEZUX1BvcyAgICAgICAgZGlzdF90aHJlc2hvbGQ7Ci0KLQotICAgIGxlbl90aHJlc2hvbGQgPSBBRl9MQVRJTl9DT05TVEFOVCggaGludHMtPm1ldHJpY3MsIDggKTsKLQotICAgIGRpc3RfdGhyZXNob2xkID0gKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKSA/IGhpbnRzLT54X3NjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaGludHMtPnlfc2NhbGU7Ci0gICAgZGlzdF90aHJlc2hvbGQgPSBGVF9EaXZGaXgoIDY0ICogMywgZGlzdF90aHJlc2hvbGQgKTsKLQotICAgIC8qIG5vdyBjb21wYXJlIGVhY2ggc2VnbWVudCB0byB0aGUgb3RoZXJzICovCi0gICAgZm9yICggc2VnMSA9IHNlZ21lbnRzOyBzZWcxIDwgc2VnbWVudF9saW1pdDsgc2VnMSsrICkKLSAgICB7Ci0gICAgICAvKiB0aGUgZmFrZSBzZWdtZW50cyBhcmUgZm9yIG1ldHJpY3MgaGludGluZyBvbmx5ICovCi0gICAgICBpZiAoIHNlZzEtPmZpcnN0ID09IHNlZzEtPmxhc3QgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBzZWcxLT5kaXIgIT0gbWFqb3JfZGlyICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGZvciAoIHNlZzIgPSBzZWdtZW50czsgc2VnMiA8IHNlZ21lbnRfbGltaXQ7IHNlZzIrKyApCi0gICAgICAgIGlmICggc2VnMiAhPSBzZWcxICYmIHNlZzEtPmRpciArIHNlZzItPmRpciA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgZGlzdCA9IHNlZzItPnBvcyAtIHNlZzEtPnBvczsKLQotCi0gICAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgbWluID0gc2VnMS0+bWluX2Nvb3JkOwotICAgICAgICAgICAgRlRfUG9zICBtYXggPSBzZWcxLT5tYXhfY29vcmQ7Ci0gICAgICAgICAgICBGVF9Qb3MgIGxlbjsKLQotCi0gICAgICAgICAgICBpZiAoIG1pbiA8IHNlZzItPm1pbl9jb29yZCApCi0gICAgICAgICAgICAgIG1pbiA9IHNlZzItPm1pbl9jb29yZDsKLQotICAgICAgICAgICAgaWYgKCBtYXggPiBzZWcyLT5tYXhfY29vcmQgKQotICAgICAgICAgICAgICBtYXggPSBzZWcyLT5tYXhfY29vcmQ7Ci0KLSAgICAgICAgICAgIGxlbiA9IG1heCAtIG1pbjsKLSAgICAgICAgICAgIGlmICggbGVuID49IGxlbl90aHJlc2hvbGQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIGRpc3QgKiA4IDwgc2VnMS0+c2NvcmUgKiA5ICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAoIGRpc3QgKiA4IDwgc2VnMS0+c2NvcmUgKiA3IHx8IHNlZzEtPmxlbiA8IGxlbiApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlZzEtPnNjb3JlID0gZGlzdDsKLSAgICAgICAgICAgICAgICBzZWcxLT5sZW4gICA9IGxlbjsKLSAgICAgICAgICAgICAgICBzZWcxLT5saW5rICA9IHNlZzI7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAoIGRpc3QgKiA4IDwgc2VnMi0+c2NvcmUgKiA5ICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAoIGRpc3QgKiA4IDwgc2VnMi0+c2NvcmUgKiA3IHx8IHNlZzItPmxlbiA8IGxlbiApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlZzItPnNjb3JlID0gZGlzdDsKLSAgICAgICAgICAgICAgICBzZWcyLT5sZW4gICA9IGxlbjsKLSAgICAgICAgICAgICAgICBzZWcyLT5saW5rICA9IHNlZzE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBub3cgY29tcHV0ZSB0aGUgYHNlcmlmJyBzZWdtZW50cwotICAgICAqCi0gICAgICogIEluIEhhbnppLCBzb21lIHN0cm9rZXMgYXJlIHdpZGVyIG9uIG9uZSBvciBib3RoIG9mIHRoZSBlbmRzLgotICAgICAqICBXZSBlaXRoZXIgaWRlbnRpZnkgdGhlIHN0ZW1zIG9uIHRoZSBlbmRzIGFzIHNlcmlmcyBvciByZW1vdmUKLSAgICAgKiAgdGhlIGxpbmthZ2UsIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdGVtcy4KLSAgICAgKgotICAgICAqLwotCi0gICAgewotICAgICAgQUZfU2VnbWVudCAgbGluazEsIGxpbmsyOwotCi0KLSAgICAgIGZvciAoIHNlZzEgPSBzZWdtZW50czsgc2VnMSA8IHNlZ21lbnRfbGltaXQ7IHNlZzErKyApCi0gICAgICB7Ci0gICAgICAgIGxpbmsxID0gc2VnMS0+bGluazsKLSAgICAgICAgaWYgKCAhbGluazEgfHwgbGluazEtPmxpbmsgIT0gc2VnMSB8fCBsaW5rMS0+cG9zIDw9IHNlZzEtPnBvcyApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKCBzZWcxLT5zY29yZSA+PSBkaXN0X3RocmVzaG9sZCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZm9yICggc2VnMiA9IHNlZ21lbnRzOyBzZWcyIDwgc2VnbWVudF9saW1pdDsgc2VnMisrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggc2VnMi0+cG9zID4gc2VnMS0+cG9zIHx8IHNlZzEgPT0gc2VnMiApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGxpbmsyID0gc2VnMi0+bGluazsKLSAgICAgICAgICBpZiAoICFsaW5rMiB8fCBsaW5rMi0+bGluayAhPSBzZWcyIHx8IGxpbmsyLT5wb3MgPCBsaW5rMS0+cG9zICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgaWYgKCBzZWcxLT5wb3MgPT0gc2VnMi0+cG9zICYmIGxpbmsxLT5wb3MgPT0gbGluazItPnBvcyApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGlmICggc2VnMi0+c2NvcmUgPD0gc2VnMS0+c2NvcmUgfHwgc2VnMS0+c2NvcmUgKiA0IDw9IHNlZzItPnNjb3JlICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgLyogc2VnMiA8IHNlZzEgPCBsaW5rMSA8IGxpbmsyICovCi0KLSAgICAgICAgICBpZiAoIHNlZzEtPmxlbiA+PSBzZWcyLT5sZW4gKiAzICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBRl9TZWdtZW50ICBzZWc7Ci0KLQotICAgICAgICAgICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQUZfU2VnbWVudCAgbGluayA9IHNlZy0+bGluazsKLQotCi0gICAgICAgICAgICAgIGlmICggbGluayA9PSBzZWcyICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlZy0+bGluayAgPSAwOwotICAgICAgICAgICAgICAgIHNlZy0+c2VyaWYgPSBsaW5rMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmICggbGluayA9PSBsaW5rMiApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWctPmxpbmsgID0gMDsKLSAgICAgICAgICAgICAgICBzZWctPnNlcmlmID0gc2VnMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VnMS0+bGluayA9IGxpbmsxLT5saW5rID0gMDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggc2VnMSA9IHNlZ21lbnRzOyBzZWcxIDwgc2VnbWVudF9saW1pdDsgc2VnMSsrICkKLSAgICB7Ci0gICAgICBzZWcyID0gc2VnMS0+bGluazsKLQotICAgICAgaWYgKCBzZWcyICkKLSAgICAgIHsKLSAgICAgICAgc2VnMi0+bnVtX2xpbmtlZCsrOwotICAgICAgICBpZiAoIHNlZzItPmxpbmsgIT0gc2VnMSApCi0gICAgICAgIHsKLSAgICAgICAgICBzZWcxLT5saW5rID0gMDsKLQotICAgICAgICAgIGlmICggc2VnMi0+c2NvcmUgPCBkaXN0X3RocmVzaG9sZCB8fCBzZWcxLT5zY29yZSA8IHNlZzItPnNjb3JlICogNCApCi0gICAgICAgICAgICBzZWcxLT5zZXJpZiA9IHNlZzItPmxpbms7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2VnMi0+bnVtX2xpbmtlZC0tOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZfY2prX2hpbnRzX2NvbXB1dGVfZWRnZXMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgPSBBRl9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgIEFGX0xhdGluQXhpcyAgbGF4aXMgID0gJigoQUZfTGF0aW5NZXRyaWNzKWhpbnRzLT5tZXRyaWNzKS0+YXhpc1tkaW1dOwotCi0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50cyAgICAgID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50X2xpbWl0ID0gc2VnbWVudHMgKyBheGlzLT5udW1fc2VnbWVudHM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWc7Ci0KLSAgICBGVF9GaXhlZCAgICAgIHNjYWxlOwotICAgIEZUX1BvcyAgICAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQ7Ci0KLQotICAgIGF4aXMtPm51bV9lZGdlcyA9IDA7Ci0KLSAgICBzY2FsZSA9ICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkgPyBoaW50cy0+eF9zY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGhpbnRzLT55X3NjYWxlOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIGJlZ2luIGJ5IGdlbmVyYXRpbmcgYSBzb3J0ZWQgdGFibGUgb2YgZWRnZXMgZm9yIHRoZSBjdXJyZW50ICAgICovCi0gICAgLyogZGlyZWN0aW9uLiAgVG8gZG8gc28sIHdlIHNpbXBseSBzY2FuIGVhY2ggc2VnbWVudCBhbmQgdHJ5IHRvIGZpbmQgKi8KLSAgICAvKiBhbiBlZGdlIGluIG91ciB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0cyBwb3NpdGlvbi4gICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSWYgbm8gZWRnZSBpcyBmb3VuZCwgd2UgY3JlYXRlIGFuZCBpbnNlcnQgYSBuZXcgZWRnZSBpbiB0aGUgICAgICAgKi8KLSAgICAvKiBzb3J0ZWQgdGFibGUuICBPdGhlcndpc2UsIHdlIHNpbXBseSBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIGVkZ2UncyAqLwotICAgIC8qIGxpc3Qgd2hpY2ggaXMgdGhlbiBwcm9jZXNzZWQgaW4gdGhlIHNlY29uZCBzdGVwIHRvIGNvbXB1dGUgdGhlICAgICovCi0gICAgLyogZWRnZSdzIHByb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE5vdGUgdGhhdCB0aGUgZWRnZXMgdGFibGUgaXMgc29ydGVkIGFsb25nIHRoZSBzZWdtZW50L2VkZ2UgICAgICAgICovCi0gICAgLyogcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA9IEZUX011bEZpeCggbGF4aXMtPmVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSApOwotICAgIGlmICggZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPiA2NCAvIDQgKQotICAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSBGVF9EaXZGaXgoIDY0IC8gNCwgc2NhbGUgKTsKLSAgICBlbHNlCi0gICAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA9IGxheGlzLT5lZGdlX2Rpc3RhbmNlX3RocmVzaG9sZDsKLQotICAgIGZvciAoIHNlZyA9IHNlZ21lbnRzOyBzZWcgPCBzZWdtZW50X2xpbWl0OyBzZWcrKyApCi0gICAgewotICAgICAgQUZfRWRnZSAgZm91bmQgPSAwOwotICAgICAgRlRfUG9zICAgYmVzdCAgPSAweEZGRkZVOwotICAgICAgRlRfSW50ICAgZWU7Ci0KLQotICAgICAgLyogbG9vayBmb3IgYW4gZWRnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWdtZW50ICovCi0gICAgICBmb3IgKCBlZSA9IDA7IGVlIDwgYXhpcy0+bnVtX2VkZ2VzOyBlZSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfRWRnZSAgZWRnZSA9IGF4aXMtPmVkZ2VzICsgZWU7Ci0gICAgICAgIEZUX1BvcyAgIGRpc3Q7Ci0KLQotICAgICAgICBpZiAoIGVkZ2UtPmRpciAhPSBzZWctPmRpciApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZGlzdCA9IHNlZy0+cG9zIC0gZWRnZS0+ZnBvczsKLSAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgIGlmICggZGlzdCA8IGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkICYmIGRpc3QgPCBiZXN0ICkKLSAgICAgICAgewotICAgICAgICAgIEFGX1NlZ21lbnQgIGxpbmsgPSBzZWctPmxpbms7Ci0KLQotICAgICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgYWxsIGxpbmtlZCBzZWdtZW50cyBvZiB0aGUgY2FuZGlkYXRlIGVkZ2UgKi8KLSAgICAgICAgICAvKiBjYW4gbWFrZSBhIHNpbmdsZSBlZGdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBsaW5rICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBRl9TZWdtZW50ICBzZWcxID0gZWRnZS0+Zmlyc3Q7Ci0gICAgICAgICAgICBBRl9TZWdtZW50ICBsaW5rMTsKLSAgICAgICAgICAgIEZUX1BvcyAgICAgIGRpc3QyID0gMDsKLQotCi0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsaW5rMSA9IHNlZzEtPmxpbms7Ci0gICAgICAgICAgICAgIGlmICggbGluazEgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlzdDIgPSBBRl9TRUdNRU5UX0RJU1QoIGxpbmssIGxpbmsxICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBkaXN0MiA+PSBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCApCi0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IHdoaWxlICggKCBzZWcxID0gc2VnMS0+ZWRnZV9uZXh0ICkgIT0gZWRnZS0+Zmlyc3QgKTsKLQotICAgICAgICAgICAgaWYgKCBkaXN0MiA+PSBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCApCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGJlc3QgID0gZGlzdDsKLSAgICAgICAgICBmb3VuZCA9IGVkZ2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCAhZm91bmQgKQotICAgICAgewotICAgICAgICBBRl9FZGdlICBlZGdlOwotCi0KLSAgICAgICAgLyogaW5zZXJ0IGEgbmV3IGVkZ2UgaW4gdGhlIGxpc3QgYW5kICovCi0gICAgICAgIC8qIHNvcnQgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbiAgICAqLwotICAgICAgICBlcnJvciA9IGFmX2F4aXNfaGludHNfbmV3X2VkZ2UoIGF4aXMsIHNlZy0+cG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9EaXJlY3Rpb24pc2VnLT5kaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LCAmZWRnZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBuZXcgZWRnZSdzIGxpc3QgKi8KLSAgICAgICAgRlRfWkVSTyggZWRnZSApOwotCi0gICAgICAgIGVkZ2UtPmZpcnN0ICAgID0gc2VnOwotICAgICAgICBlZGdlLT5sYXN0ICAgICA9IHNlZzsKLSAgICAgICAgZWRnZS0+ZnBvcyAgICAgPSBzZWctPnBvczsKLSAgICAgICAgZWRnZS0+b3BvcyAgICAgPSBlZGdlLT5wb3MgPSBGVF9NdWxGaXgoIHNlZy0+cG9zLCBzY2FsZSApOwotICAgICAgICBzZWctPmVkZ2VfbmV4dCA9IHNlZzsKLSAgICAgICAgZWRnZS0+ZGlyICAgICAgPSBzZWctPmRpcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogaWYgYW4gZWRnZSB3YXMgZm91bmQsIHNpbXBseSBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIGVkZ2UncyAqLwotICAgICAgICAvKiBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHNlZy0+ZWRnZV9uZXh0ICAgICAgICAgPSBmb3VuZC0+Zmlyc3Q7Ci0gICAgICAgIGZvdW5kLT5sYXN0LT5lZGdlX25leHQgPSBzZWc7Ci0gICAgICAgIGZvdW5kLT5sYXN0ICAgICAgICAgICAgPSBzZWc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEdvb2QsIHdlIG5vdyBjb21wdXRlIGVhY2ggZWRnZSdzIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIHNlZ21lbnRzICovCi0gICAgLyogZm91bmQgb24gaXRzIHBvc2l0aW9uLiAgQmFzaWNhbGx5LCB0aGVzZSBhcmUgYXMgZm9sbG93cy4gICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAtIGVkZ2UncyBtYWluIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIC0gc3RlbSBlZGdlLCBzZXJpZiBlZGdlIG9yIGJvdGggKHdoaWNoIGRlZmF1bHRzIHRvIHN0ZW0gdGhlbikgICAgKi8KLSAgICAvKiAgLSByb3VuZGVkIGVkZ2UsIHN0cmFpZ2h0IG9yIGJvdGggKHdoaWNoIGRlZmF1bHRzIHRvIHN0cmFpZ2h0KSAgICAqLwotICAgIC8qICAtIGxpbmsgZm9yIGVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBzZXQgdGhlIGBlZGdlJyBmaWVsZCBpbiBlYWNoIHNlZ21lbnQgLS0gdGhpcyBpcyAgICAgKi8KLSAgICAvKiByZXF1aXJlZCBpbiBvcmRlciB0byBjb21wdXRlIGVkZ2UgbGlua3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgbG9vcCBhbmQgc2V0dGluZyB0aGUgYGVkZ2UnIGZpZWxkIG9mIGVhY2ggKi8KLSAgICAvKiBzZWdtZW50IGRpcmVjdGx5IGluIHRoZSBjb2RlIGFib3ZlIHNsb3dzIGRvd24gZXhlY3V0aW9uIHNwZWVkIGZvciAqLwotICAgIC8qIHNvbWUgcmVhc29ucyBvbiBwbGF0Zm9ybXMgbGlrZSB0aGUgU3VuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB7Ci0gICAgICBBRl9FZGdlICBlZGdlcyAgICAgID0gYXhpcy0+ZWRnZXM7Ci0gICAgICBBRl9FZGdlICBlZGdlX2xpbWl0ID0gZWRnZXMgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgICBBRl9FZGdlICBlZGdlOwotCi0KLSAgICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgICB7Ci0gICAgICAgIHNlZyA9IGVkZ2UtPmZpcnN0OwotICAgICAgICBpZiAoIHNlZyApCi0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWctPmVkZ2UgPSBlZGdlOwotICAgICAgICAgICAgc2VnICAgICAgID0gc2VnLT5lZGdlX25leHQ7Ci0KLSAgICAgICAgICB9IHdoaWxlICggc2VnICE9IGVkZ2UtPmZpcnN0ICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBjb21wdXRlIGVhY2ggZWRnZSBwcm9wZXJ0aWVzICovCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGlzX3JvdW5kICAgID0gMDsgIC8qIGRvZXMgaXQgY29udGFpbiByb3VuZCBzZWdtZW50cz8gICAgKi8KLSAgICAgICAgRlRfSW50ICBpc19zdHJhaWdodCA9IDA7ICAvKiBkb2VzIGl0IGNvbnRhaW4gc3RyYWlnaHQgc2VnbWVudHM/ICovCi0KLQotICAgICAgICBzZWcgPSBlZGdlLT5maXJzdDsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgRlRfQm9vbCAgaXNfc2VyaWY7Ci0KLQotICAgICAgICAgIC8qIGNoZWNrIGZvciByb3VuZG5lc3Mgb2Ygc2VnbWVudCAqLwotICAgICAgICAgIGlmICggc2VnLT5mbGFncyAmIEFGX0VER0VfUk9VTkQgKQotICAgICAgICAgICAgaXNfcm91bmQrKzsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBpc19zdHJhaWdodCsrOwotCi0gICAgICAgICAgLyogY2hlY2sgZm9yIGxpbmtzIC0tIGlmIHNlZy0+c2VyaWYgaXMgc2V0LCB0aGVuIHNlZy0+bGluayBtdXN0ICovCi0gICAgICAgICAgLyogYmUgaWdub3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaXNfc2VyaWYgPSAoRlRfQm9vbCkoIHNlZy0+c2VyaWYgJiYgc2VnLT5zZXJpZi0+ZWRnZSAhPSBlZGdlICk7Ci0KLSAgICAgICAgICBpZiAoIHNlZy0+bGluayB8fCBpc19zZXJpZiApCi0gICAgICAgICAgewotICAgICAgICAgICAgQUZfRWRnZSAgICAgZWRnZTI7Ci0gICAgICAgICAgICBBRl9TZWdtZW50ICBzZWcyOwotCi0KLSAgICAgICAgICAgIGVkZ2UyID0gZWRnZS0+bGluazsKLSAgICAgICAgICAgIHNlZzIgID0gc2VnLT5saW5rOwotCi0gICAgICAgICAgICBpZiAoIGlzX3NlcmlmICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VnMiAgPSBzZWctPnNlcmlmOwotICAgICAgICAgICAgICBlZGdlMiA9IGVkZ2UtPnNlcmlmOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGVkZ2UyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfUG9zICBlZGdlX2RlbHRhOwotICAgICAgICAgICAgICBGVF9Qb3MgIHNlZ19kZWx0YTsKLQotCi0gICAgICAgICAgICAgIGVkZ2VfZGVsdGEgPSBlZGdlLT5mcG9zIC0gZWRnZTItPmZwb3M7Ci0gICAgICAgICAgICAgIGlmICggZWRnZV9kZWx0YSA8IDAgKQotICAgICAgICAgICAgICAgIGVkZ2VfZGVsdGEgPSAtZWRnZV9kZWx0YTsKLQotICAgICAgICAgICAgICBzZWdfZGVsdGEgPSBBRl9TRUdNRU5UX0RJU1QoIHNlZywgc2VnMiApOwotCi0gICAgICAgICAgICAgIGlmICggc2VnX2RlbHRhIDwgZWRnZV9kZWx0YSApCi0gICAgICAgICAgICAgICAgZWRnZTIgPSBzZWcyLT5lZGdlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlZGdlMiA9IHNlZzItPmVkZ2U7Ci0KLSAgICAgICAgICAgIGlmICggaXNfc2VyaWYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGdlLT5zZXJpZiAgID0gZWRnZTI7Ci0gICAgICAgICAgICAgIGVkZ2UyLT5mbGFncyB8PSBBRl9FREdFX1NFUklGOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBlZGdlLT5saW5rICA9IGVkZ2UyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHNlZyA9IHNlZy0+ZWRnZV9uZXh0OwotCi0gICAgICAgIH0gd2hpbGUgKCBzZWcgIT0gZWRnZS0+Zmlyc3QgKTsKLQotICAgICAgICAvKiBzZXQgdGhlIHJvdW5kL3N0cmFpZ2h0IGZsYWdzICovCi0gICAgICAgIGVkZ2UtPmZsYWdzID0gQUZfRURHRV9OT1JNQUw7Ci0KLSAgICAgICAgaWYgKCBpc19yb3VuZCA+IDAgJiYgaXNfcm91bmQgPj0gaXNfc3RyYWlnaHQgKQotICAgICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfUk9VTkQ7Ci0KLSAgICAgICAgLyogZ2V0IHJpZCBvZiBzZXJpZnMgaWYgbGluayBpcyBzZXQgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFhYWDogVGhpcyBnZXRzIHJpZCBvZiBtYW55IHVucGxlYXNhbnQgYXJ0ZWZhY3RzISAqLwotICAgICAgICAvKiAgICAgIEV4YW1wbGU6IHRoZSBgYycgaW4gY291ci5wZmEgYXQgc2l6ZSAxMyAgICAgKi8KLQotICAgICAgICBpZiAoIGVkZ2UtPnNlcmlmICYmIGVkZ2UtPmxpbmsgKQotICAgICAgICAgIGVkZ2UtPnNlcmlmID0gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9jamtfaGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBhZl9jamtfaGludHNfY29tcHV0ZV9zZWdtZW50cyggaGludHMsIGRpbSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBhZl9jamtfaGludHNfbGlua19zZWdtZW50cyggaGludHMsIGRpbSApOwotCi0gICAgICBlcnJvciA9IGFmX2Nqa19oaW50c19jb21wdXRlX2VkZ2VzKCBoaW50cywgZGltICk7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2Nqa19oaW50c19pbml0KCBBRl9HbHlwaEhpbnRzICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzICkKLSAgewotICAgIEZUX1JlbmRlcl9Nb2RlICBtb2RlOwotICAgIEZUX1VJbnQzMiAgICAgICBzY2FsZXJfZmxhZ3MsIG90aGVyX2ZsYWdzOwotCi0KLSAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgKEFGX1NjcmlwdE1ldHJpY3MpbWV0cmljcyApOwotCi0gICAgLyoKLSAgICAgKiAgY29ycmVjdCB4X3NjYWxlIGFuZCB5X3NjYWxlIHdoZW4gbmVlZGVkLCBzaW5jZSB0aGV5IG1heSBoYXZlCi0gICAgICogIGJlZW4gbW9kaWZpZWQgYWZfY2prX3NjYWxlX2RpbSBhYm92ZQotICAgICAqLwotICAgIGhpbnRzLT54X3NjYWxlID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uc2NhbGU7Ci0gICAgaGludHMtPnhfZGVsdGEgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS5kZWx0YTsKLSAgICBoaW50cy0+eV9zY2FsZSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdLnNjYWxlOwotICAgIGhpbnRzLT55X2RlbHRhID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0uZGVsdGE7Ci0KLSAgICAvKiBjb21wdXRlIGZsYWdzIGRlcGVuZGluZyBvbiByZW5kZXIgbW9kZSwgZXRjLiAqLwotICAgIG1vZGUgPSBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZTsKLQotI2lmZGVmIEFGX1VTRV9XQVJQRVIKLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEIHx8IG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1YgKQotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIucmVuZGVyX21vZGUgPSBtb2RlID0gRlRfUkVOREVSX01PREVfTk9STUFMOwotI2VuZGlmCi0KLSAgICBzY2FsZXJfZmxhZ3MgPSBoaW50cy0+c2NhbGVyX2ZsYWdzOwotICAgIG90aGVyX2ZsYWdzICA9IDA7Ci0KLSAgICAvKgotICAgICAqICBXZSBzbmFwIHRoZSB3aWR0aCBvZiB2ZXJ0aWNhbCBzdGVtcyBmb3IgdGhlIG1vbm9jaHJvbWUgYW5kCi0gICAgICogIGhvcml6b250YWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCi0gICAgICovCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgKQotICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfSE9SWl9TTkFQOwotCi0gICAgLyoKLSAgICAgKiAgV2Ugc25hcCB0aGUgd2lkdGggb2YgaG9yaXpvbnRhbCBzdGVtcyBmb3IgdGhlIG1vbm9jaHJvbWUgYW5kCi0gICAgICogIHZlcnRpY2FsIExDRCByZW5kZXJpbmcgdGFyZ2V0cyBvbmx5LgotICAgICAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9NT05PIHx8IG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1YgKQotICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfVkVSVF9TTkFQOwotCi0gICAgLyoKLSAgICAgKiAgV2UgYWRqdXN0IHN0ZW1zIHRvIGZ1bGwgcGl4ZWxzIG9ubHkgaWYgd2UgZG9uJ3QgdXNlIHRoZSBgbGlnaHQnIG1vZGUuCi0gICAgICovCi0gICAgaWYgKCBtb2RlICE9IEZUX1JFTkRFUl9NT0RFX0xJR0hUICkKLSAgICAgIG90aGVyX2ZsYWdzIHw9IEFGX0xBVElOX0hJTlRTX1NURU1fQURKVVNUOwotCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gKQotICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfTU9OTzsKLQotICAgIHNjYWxlcl9mbGFncyB8PSBBRl9TQ0FMRVJfRkxBR19OT19BRFZBTkNFOwotCi0gICAgaGludHMtPnNjYWxlcl9mbGFncyA9IHNjYWxlcl9mbGFnczsKLSAgICBoaW50cy0+b3RoZXJfZmxhZ3MgID0gb3RoZXJfZmxhZ3M7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgIEMgSiBLICAgRyBMIFkgUCBIICAgRyBSIEkgRCAtIEYgSSBUIFQgSSBOIEcgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogc25hcCBhIGdpdmVuIHdpZHRoIGluIHNjYWxlZCBjb29yZGluYXRlcyB0byBvbmUgb2YgdGhlICovCi0gIC8qIGN1cnJlbnQgc3RhbmRhcmQgd2lkdGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9Qb3MKLSAgYWZfY2prX3NuYXBfd2lkdGgoIEFGX1dpZHRoICB3aWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgd2lkdGggKQotICB7Ci0gICAgaW50ICAgICBuOwotICAgIEZUX1BvcyAgYmVzdCAgICAgID0gNjQgKyAzMiArIDI7Ci0gICAgRlRfUG9zICByZWZlcmVuY2UgPSB3aWR0aDsKLSAgICBGVF9Qb3MgIHNjYWxlZDsKLQotCi0gICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIHc7Ci0gICAgICBGVF9Qb3MgIGRpc3Q7Ci0KLQotICAgICAgdyA9IHdpZHRoc1tuXS5jdXI7Ci0gICAgICBkaXN0ID0gd2lkdGggLSB3OwotICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgIGRpc3QgPSAtZGlzdDsKLSAgICAgIGlmICggZGlzdCA8IGJlc3QgKQotICAgICAgewotICAgICAgICBiZXN0ICAgICAgPSBkaXN0OwotICAgICAgICByZWZlcmVuY2UgPSB3OwotICAgICAgfQotICAgIH0KLQotICAgIHNjYWxlZCA9IEZUX1BJWF9ST1VORCggcmVmZXJlbmNlICk7Ci0KLSAgICBpZiAoIHdpZHRoID49IHJlZmVyZW5jZSApCi0gICAgewotICAgICAgaWYgKCB3aWR0aCA8IHNjYWxlZCArIDQ4ICkKLSAgICAgICAgd2lkdGggPSByZWZlcmVuY2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIHdpZHRoID4gc2NhbGVkIC0gNDggKQotICAgICAgICB3aWR0aCA9IHJlZmVyZW5jZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gd2lkdGg7Ci0gIH0KLQotCi0gIC8qIGNvbXB1dGUgdGhlIHNuYXBwZWQgd2lkdGggb2YgYSBnaXZlbiBzdGVtICovCi0KLSAgc3RhdGljIEZUX1BvcwotICBhZl9jamtfY29tcHV0ZV9zdGVtX3dpZHRoKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZV9GbGFncyAgYmFzZV9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZV9GbGFncyAgc3RlbV9mbGFncyApCi0gIHsKLSAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgID0gKEFGX0xhdGluTWV0cmljcykgaGludHMtPm1ldHJpY3M7Ci0gICAgQUZfTGF0aW5BeGlzICAgICBheGlzICAgICA9ICYgbWV0cmljcy0+YXhpc1tkaW1dOwotICAgIEZUX1BvcyAgICAgICAgICAgZGlzdCAgICAgPSB3aWR0aDsKLSAgICBGVF9JbnQgICAgICAgICAgIHNpZ24gICAgID0gMDsKLSAgICBGVF9JbnQgICAgICAgICAgIHZlcnRpY2FsID0gKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKTsKLQotICAgIEZUX1VOVVNFRCggYmFzZV9mbGFncyApOwotICAgIEZUX1VOVVNFRCggc3RlbV9mbGFncyApOwotCi0KLSAgICBpZiAoICFBRl9MQVRJTl9ISU5UU19ET19TVEVNX0FESlVTVCggaGludHMgKSApCi0gICAgICByZXR1cm4gd2lkdGg7Ci0KLSAgICBpZiAoIGRpc3QgPCAwICkKLSAgICB7Ci0gICAgICBkaXN0ID0gLXdpZHRoOwotICAgICAgc2lnbiA9IDE7Ci0gICAgfQotCi0gICAgaWYgKCAoICB2ZXJ0aWNhbCAmJiAhQUZfTEFUSU5fSElOVFNfRE9fVkVSVF9TTkFQKCBoaW50cyApICkgfHwKLSAgICAgICAgICggIXZlcnRpY2FsICYmICFBRl9MQVRJTl9ISU5UU19ET19IT1JaX1NOQVAoIGhpbnRzICkgKSApCi0gICAgewotICAgICAgLyogc21vb3RoIGhpbnRpbmcgcHJvY2VzczogdmVyeSBsaWdodGx5IHF1YW50aXplIHRoZSBzdGVtIHdpZHRoICovCi0KLSAgICAgIGlmICggYXhpcy0+d2lkdGhfY291bnQgPiAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9BQlMoIGRpc3QgLSBheGlzLT53aWR0aHNbMF0uY3VyICkgPCA0MCApCi0gICAgICAgIHsKLSAgICAgICAgICBkaXN0ID0gYXhpcy0+d2lkdGhzWzBdLmN1cjsKLSAgICAgICAgICBpZiAoIGRpc3QgPCA0OCApCi0gICAgICAgICAgICBkaXN0ID0gNDg7Ci0KLSAgICAgICAgICBnb3RvIERvbmVfV2lkdGg7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBkaXN0IDwgNTQgKQotICAgICAgICBkaXN0ICs9ICggNTQgLSBkaXN0ICkgLyAyIDsKLSAgICAgIGVsc2UgaWYgKCBkaXN0IDwgMyAqIDY0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkZWx0YTsKLQotCi0gICAgICAgIGRlbHRhICA9IGRpc3QgJiA2MzsKLSAgICAgICAgZGlzdCAgJj0gLTY0OwotCi0gICAgICAgIGlmICggZGVsdGEgPCAxMCApCi0gICAgICAgICAgZGlzdCArPSBkZWx0YTsKLSAgICAgICAgZWxzZSBpZiAoIGRlbHRhIDwgMjIgKQotICAgICAgICAgIGRpc3QgKz0gMTA7Ci0gICAgICAgIGVsc2UgaWYgKCBkZWx0YSA8IDQyICkKLSAgICAgICAgICBkaXN0ICs9IGRlbHRhOwotICAgICAgICBlbHNlIGlmICggZGVsdGEgPCA1NCApCi0gICAgICAgICAgZGlzdCArPSA1NDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpc3QgKz0gZGVsdGE7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBzdHJvbmcgaGludGluZyBwcm9jZXNzOiBzbmFwIHRoZSBzdGVtIHdpZHRoIHRvIGludGVnZXIgcGl4ZWxzICovCi0KLSAgICAgIGRpc3QgPSBhZl9jamtfc25hcF93aWR0aCggYXhpcy0+d2lkdGhzLCBheGlzLT53aWR0aF9jb3VudCwgZGlzdCApOwotCi0gICAgICBpZiAoIHZlcnRpY2FsICkKLSAgICAgIHsKLSAgICAgICAgLyogaW4gdGhlIGNhc2Ugb2YgdmVydGljYWwgaGludGluZywgYWx3YXlzIHJvdW5kICovCi0gICAgICAgIC8qIHRoZSBzdGVtIGhlaWdodHMgdG8gaW50ZWdlciBwaXhlbHMgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggZGlzdCA+PSA2NCApCi0gICAgICAgICAgZGlzdCA9ICggZGlzdCArIDE2ICkgJiB+NjM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXN0ID0gNjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggQUZfTEFUSU5fSElOVFNfRE9fTU9OTyggaGludHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtb25vY2hyb21lIGhvcml6b250YWwgaGludGluZzogc25hcCB3aWR0aHMgdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICAgICAgICAvKiB3aXRoIGEgZGlmZmVyZW50IHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDY0ICkKLSAgICAgICAgICAgIGRpc3QgPSA2NDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBmb3IgaG9yaXpvbnRhbCBhbnRpLWFsaWFzZWQgaGludGluZywgd2UgYWRvcHQgYSBtb3JlIHN1YnRsZSAqLwotICAgICAgICAgIC8qIGFwcHJvYWNoOiB3ZSBzdHJlbmd0aGVuIHNtYWxsIHN0ZW1zLCByb3VuZCBzdGVtcyB3aG9zZSBzaXplICovCi0gICAgICAgICAgLyogaXMgYmV0d2VlbiAxIGFuZCAyIHBpeGVscyB0byBhbiBpbnRlZ2VyLCBvdGhlcndpc2Ugbm90aGluZyAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyA2NCApID4+IDE7Ci0KLSAgICAgICAgICBlbHNlIGlmICggZGlzdCA8IDEyOCApCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMjIgKSAmIH42MzsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAvKiByb3VuZCBvdGhlcndpc2UgdG8gcHJldmVudCBjb2xvciBmcmluZ2VzIGluIExDRCBtb2RlICovCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBEb25lX1dpZHRoOgotICAgIGlmICggc2lnbiApCi0gICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICByZXR1cm4gZGlzdDsKLSAgfQotCi0KLSAgLyogYWxpZ24gb25lIHN0ZW0gZWRnZSByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgc3RlbSBlZGdlICovCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfY2prX2FsaWduX2xpbmtlZF9lZGdlKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgYmFzZV9lZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIHN0ZW1fZWRnZSApCi0gIHsKLSAgICBGVF9Qb3MgIGRpc3QgPSBzdGVtX2VkZ2UtPm9wb3MgLSBiYXNlX2VkZ2UtPm9wb3M7Ci0KLSAgICBGVF9Qb3MgIGZpdHRlZF93aWR0aCA9IGFmX2Nqa19jb21wdXRlX3N0ZW1fd2lkdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLCBkaW0sIGRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9FZGdlX0ZsYWdzKWJhc2VfZWRnZS0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9FZGdlX0ZsYWdzKXN0ZW1fZWRnZS0+ZmxhZ3MgKTsKLQotCi0gICAgc3RlbV9lZGdlLT5wb3MgPSBiYXNlX2VkZ2UtPnBvcyArIGZpdHRlZF93aWR0aDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfY2prX2FsaWduX3NlcmlmX2VkZ2UoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIHNlcmlmICkKLSAgewotICAgIEZUX1VOVVNFRCggaGludHMgKTsKLQotICAgIHNlcmlmLT5wb3MgPSBiYXNlLT5wb3MgKyAoIHNlcmlmLT5vcG9zIC0gYmFzZS0+b3BvcyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgIEUgRCBHIEUgICBIIEkgTiBUIEkgTiBHICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgQUZfTElHSFRfTU9ERV9NQVhfSE9SWl9HQVAgICAgOQotI2RlZmluZSBBRl9MSUdIVF9NT0RFX01BWF9WRVJUX0dBUCAgIDE1Ci0jZGVmaW5lIEFGX0xJR0hUX01PREVfTUFYX0RFTFRBX0FCUyAgMTQKLQotCi0gIHN0YXRpYyBGVF9Qb3MKLSAgYWZfaGludF9ub3JtYWxfc3RlbSggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIGVkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIGVkZ2UyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICBhbmNob3IsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBGVF9Qb3MgIG9yZ19sZW4sIGN1cl9sZW4sIG9yZ19jZW50ZXI7Ci0gICAgRlRfUG9zICBjdXJfcG9zMSwgY3VyX3BvczI7Ci0gICAgRlRfUG9zICBkX29mZjEsIHVfb2ZmMSwgZF9vZmYyLCB1X29mZjIsIGRlbHRhOwotICAgIEZUX1BvcyAgb2Zmc2V0OwotICAgIEZUX1BvcyAgdGhyZXNob2xkID0gNjQ7Ci0KLQotICAgIGlmICggIUFGX0xBVElOX0hJTlRTX0RPX1NURU1fQURKVVNUKCBoaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoICggZWRnZS0+ZmxhZ3MgICYgQUZfRURHRV9ST1VORCApICYmCi0gICAgICAgICAgICggZWRnZTItPmZsYWdzICYgQUZfRURHRV9ST1VORCApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKQotICAgICAgICAgIHRocmVzaG9sZCA9IDY0IC0gQUZfTElHSFRfTU9ERV9NQVhfSE9SWl9HQVA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0aHJlc2hvbGQgPSA2NCAtIEFGX0xJR0hUX01PREVfTUFYX1ZFUlRfR0FQOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApCi0gICAgICAgICAgdGhyZXNob2xkID0gNjQgLSBBRl9MSUdIVF9NT0RFX01BWF9IT1JaX0dBUCAvIDM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0aHJlc2hvbGQgPSA2NCAtIEFGX0xJR0hUX01PREVfTUFYX1ZFUlRfR0FQIC8gMzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvcmdfbGVuICAgID0gZWRnZTItPm9wb3MgLSBlZGdlLT5vcG9zOwotICAgIGN1cl9sZW4gICAgPSBhZl9jamtfY29tcHV0ZV9zdGVtX3dpZHRoKCBoaW50cywgZGltLCBvcmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfRWRnZV9GbGFncyllZGdlLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0VkZ2VfRmxhZ3MpZWRnZTItPmZsYWdzICk7Ci0KLSAgICBvcmdfY2VudGVyID0gKCBlZGdlLT5vcG9zICsgZWRnZTItPm9wb3MgKSAvIDIgKyBhbmNob3I7Ci0gICAgY3VyX3BvczEgICA9IG9yZ19jZW50ZXIgLSBjdXJfbGVuIC8gMjsKLSAgICBjdXJfcG9zMiAgID0gY3VyX3BvczEgKyBjdXJfbGVuOwotICAgIGRfb2ZmMSAgICAgPSBjdXJfcG9zMSAtIEZUX1BJWF9GTE9PUiggY3VyX3BvczEgKTsKLSAgICBkX29mZjIgICAgID0gY3VyX3BvczIgLSBGVF9QSVhfRkxPT1IoIGN1cl9wb3MyICk7Ci0gICAgdV9vZmYxICAgICA9IDY0IC0gZF9vZmYxOwotICAgIHVfb2ZmMiAgICAgPSA2NCAtIGRfb2ZmMjsKLSAgICBkZWx0YSAgICAgID0gMDsKLQotCi0gICAgaWYgKCBkX29mZjEgPT0gMCB8fCBkX29mZjIgPT0gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGN1cl9sZW4gPD0gdGhyZXNob2xkICkKLSAgICB7Ci0gICAgICBpZiAoIGRfb2ZmMiA8IGN1cl9sZW4gKQotICAgICAgewotICAgICAgICBpZiAoIHVfb2ZmMSA8PSBkX29mZjIgKQotICAgICAgICAgIGRlbHRhID0gIHVfb2ZmMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRlbHRhID0gLWRfb2ZmMjsKLSAgICAgIH0KLQotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggdGhyZXNob2xkIDwgNjQgKQotICAgIHsKLSAgICAgIGlmICggZF9vZmYxID49IHRocmVzaG9sZCB8fCB1X29mZjEgPj0gdGhyZXNob2xkIHx8Ci0gICAgICAgICAgIGRfb2ZmMiA+PSB0aHJlc2hvbGQgfHwgdV9vZmYyID49IHRocmVzaG9sZCApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBvZmZzZXQgPSBjdXJfbGVuICUgNjQ7Ci0KLSAgICBpZiAoIG9mZnNldCA8IDMyICkKLSAgICB7Ci0gICAgICBpZiAoIHVfb2ZmMSA8PSBvZmZzZXQgfHwgZF9vZmYyIDw9IG9mZnNldCApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgb2Zmc2V0ID0gNjQgLSB0aHJlc2hvbGQ7Ci0KLSAgICBkX29mZjEgPSB0aHJlc2hvbGQgLSB1X29mZjE7Ci0gICAgdV9vZmYxID0gdV9vZmYxICAgIC0gb2Zmc2V0OwotICAgIHVfb2ZmMiA9IHRocmVzaG9sZCAtIGRfb2ZmMjsKLSAgICBkX29mZjIgPSBkX29mZjIgICAgLSBvZmZzZXQ7Ci0KLSAgICBpZiAoIGRfb2ZmMSA8PSB1X29mZjEgKQotICAgICAgdV9vZmYxID0gLWRfb2ZmMTsKLQotICAgIGlmICggZF9vZmYyIDw9IHVfb2ZmMiApCi0gICAgICB1X29mZjIgPSAtZF9vZmYyOwotCi0gICAgaWYgKCBGVF9BQlMoIHVfb2ZmMSApIDw9IEZUX0FCUyggdV9vZmYyICkgKQotICAgICAgZGVsdGEgPSB1X29mZjE7Ci0gICAgZWxzZQotICAgICAgZGVsdGEgPSB1X29mZjI7Ci0KLSAgRXhpdDoKLQotI2lmIDEKLSAgICBpZiAoICFBRl9MQVRJTl9ISU5UU19ET19TVEVNX0FESlVTVCggaGludHMgKSApCi0gICAgewotICAgICAgaWYgKCBkZWx0YSA+IEFGX0xJR0hUX01PREVfTUFYX0RFTFRBX0FCUyApCi0gICAgICAgIGRlbHRhID0gQUZfTElHSFRfTU9ERV9NQVhfREVMVEFfQUJTOwotICAgICAgZWxzZSBpZiAoIGRlbHRhIDwgLUFGX0xJR0hUX01PREVfTUFYX0RFTFRBX0FCUyApCi0gICAgICAgIGRlbHRhID0gLUFGX0xJR0hUX01PREVfTUFYX0RFTFRBX0FCUzsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGN1cl9wb3MxICs9IGRlbHRhOwotCi0gICAgaWYgKCBlZGdlLT5vcG9zIDwgZWRnZTItPm9wb3MgKQotICAgIHsKLSAgICAgIGVkZ2UtPnBvcyAgPSBjdXJfcG9zMTsKLSAgICAgIGVkZ2UyLT5wb3MgPSBjdXJfcG9zMSArIGN1cl9sZW47Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlZGdlLT5wb3MgID0gY3VyX3BvczEgKyBjdXJfbGVuOwotICAgICAgZWRnZTItPnBvcyA9IGN1cl9wb3MxOwotICAgIH0KLQotICAgIHJldHVybiBkZWx0YTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfY2prX2hpbnRfZWRnZXMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZXMgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZV9saW1pdCA9IGVkZ2VzICsgYXhpcy0+bnVtX2VkZ2VzOwotICAgIEZUX0ludCAgICAgICAgbl9lZGdlczsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2U7Ci0gICAgQUZfRWRnZSAgICAgICBhbmNob3IgICA9IDA7Ci0gICAgRlRfUG9zICAgICAgICBkZWx0YSAgICA9IDA7Ci0gICAgRlRfSW50ICAgICAgICBza2lwcGVkICA9IDA7Ci0KLQotICAgIC8qIG5vdyB3ZSBhbGlnbiBhbGwgc3RlbSBlZGdlcy4gKi8KLSAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgIHsKLSAgICAgIEFGX0VkZ2UgIGVkZ2UyOwotCi0KLSAgICAgIGlmICggZWRnZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyogc2tpcCBhbGwgbm9uLXN0ZW0gZWRnZXMgKi8KLSAgICAgIGVkZ2UyID0gZWRnZS0+bGluazsKLSAgICAgIGlmICggIWVkZ2UyICkKLSAgICAgIHsKLSAgICAgICAgc2tpcHBlZCsrOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogbm93IGFsaWduIHRoZSBzdGVtICovCi0KLSAgICAgIGlmICggZWRnZTIgPCBlZGdlICkKLSAgICAgIHsKLSAgICAgICAgYWZfY2prX2FsaWduX2xpbmtlZF9lZGdlKCBoaW50cywgZGltLCBlZGdlMiwgZWRnZSApOwotICAgICAgICBlZGdlLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGRpbSAhPSBBRl9ESU1FTlNJT05fVkVSVCAmJiAhYW5jaG9yICkKLSAgICAgIHsKLQotI2lmIDAKLSAgICAgICAgaWYgKCBmaXhlZHBpdGNoICkKLSAgICAgICAgewotICAgICAgICAgIEFGX0VkZ2UgICAgIGxlZnQgID0gZWRnZTsKLSAgICAgICAgICBBRl9FZGdlICAgICByaWdodCA9IGVkZ2VfbGltaXQgLSAxOwotICAgICAgICAgIEFGX0VkZ2VSZWMgIGxlZnQxLCBsZWZ0MiwgcmlnaHQxLCByaWdodDI7Ci0gICAgICAgICAgRlRfUG9zICAgICAgdGFyZ2V0LCBjZW50ZXIxLCBjZW50ZXIyOwotICAgICAgICAgIEZUX1BvcyAgICAgIGRlbHRhMSwgZGVsdGEyLCBkMSwgZDI7Ci0KLQotICAgICAgICAgIHdoaWxlICggcmlnaHQgPiBsZWZ0ICYmICFyaWdodC0+bGluayApCi0gICAgICAgICAgICByaWdodC0tOwotCi0gICAgICAgICAgbGVmdDEgID0gKmxlZnQ7Ci0gICAgICAgICAgbGVmdDIgID0gKmxlZnQtPmxpbms7Ci0gICAgICAgICAgcmlnaHQxID0gKnJpZ2h0LT5saW5rOwotICAgICAgICAgIHJpZ2h0MiA9ICpyaWdodDsKLQotICAgICAgICAgIGRlbHRhICA9ICggKCAoIGhpbnRlci0+cHAyLnggKyAzMiApICYgLTY0ICkgLSBoaW50ZXItPnBwMi54ICkgLyAyOwotICAgICAgICAgIHRhcmdldCA9IGxlZnQtPm9wb3MgKyAoIHJpZ2h0LT5vcG9zIC0gbGVmdC0+b3BvcyApIC8gMiArIGRlbHRhIC0gMTY7Ci0KLSAgICAgICAgICBkZWx0YTEgID0gZGVsdGE7Ci0gICAgICAgICAgZGVsdGExICs9IGFmX2hpbnRfbm9ybWFsX3N0ZW0oIGhpbnRzLCBsZWZ0LCBsZWZ0LT5saW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YTEsIDAgKTsKLQotICAgICAgICAgIGlmICggbGVmdC0+bGluayAhPSByaWdodCApCi0gICAgICAgICAgICBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgcmlnaHQtPmxpbmssIHJpZ2h0LCBkZWx0YTEsIDAgKTsKLQotICAgICAgICAgIGNlbnRlcjEgPSBsZWZ0LT5wb3MgKyAoIHJpZ2h0LT5wb3MgLSBsZWZ0LT5wb3MgKSAvIDI7Ci0KLSAgICAgICAgICBpZiAoIGNlbnRlcjEgPj0gdGFyZ2V0ICkKLSAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhIC0gMzI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVsdGEyID0gZGVsdGEgKyAzMjsKLQotICAgICAgICAgIGRlbHRhMiArPSBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgJmxlZnQxLCAmbGVmdDIsIGRlbHRhMiwgMCApOwotCi0gICAgICAgICAgaWYgKCBkZWx0YTEgIT0gZGVsdGEyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGxlZnQtPmxpbmsgIT0gcmlnaHQgKQotICAgICAgICAgICAgICBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgJnJpZ2h0MSwgJnJpZ2h0MiwgZGVsdGEyLCAwICk7Ci0KLSAgICAgICAgICAgIGNlbnRlcjIgPSBsZWZ0MS5wb3MgKyAoIHJpZ2h0Mi5wb3MgLSBsZWZ0MS5wb3MgKSAvIDI7Ci0KLSAgICAgICAgICAgIGQxID0gY2VudGVyMSAtIHRhcmdldDsKLSAgICAgICAgICAgIGQyID0gY2VudGVyMiAtIHRhcmdldDsKLQotICAgICAgICAgICAgaWYgKCBGVF9BQlMoIGQyICkgPCBGVF9BQlMoIGQxICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZWZ0LT5wb3MgICAgICAgPSBsZWZ0MS5wb3M7Ci0gICAgICAgICAgICAgIGxlZnQtPmxpbmstPnBvcyA9IGxlZnQyLnBvczsKLQotICAgICAgICAgICAgICBpZiAoIGxlZnQtPmxpbmsgIT0gcmlnaHQgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmlnaHQtPmxpbmstPnBvcyA9IHJpZ2h0MS5wb3M7Ci0gICAgICAgICAgICAgICAgcmlnaHQtPnBvcyAgICAgICA9IHJpZ2h0Mi5wb3M7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBkZWx0YTEgPSBkZWx0YTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZGVsdGEgICAgICAgICAgICAgICA9IGRlbHRhMTsKLSAgICAgICAgICByaWdodC0+bGluay0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgICAgIHJpZ2h0LT5mbGFncyAgICAgICB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotCi0jZW5kaWYgLyogMCAqLwotCi0gICAgICAgICAgZGVsdGEgPSBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgZWRnZSwgZWRnZTIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9ESU1FTlNJT05fSE9SWiApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBhZl9oaW50X25vcm1hbF9zdGVtKCBoaW50cywgZWRnZSwgZWRnZTIsIGRlbHRhLCBkaW0gKTsKLQotI2lmIDAKLSAgICAgIHByaW50ZiggInN0ZW0gKCVkLCVkKSBhZGp1c3RlZCAoJS4xZiwlLjFmKVxuIiwKLSAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywgZWRnZTIgLSBlZGdlcywKLSAgICAgICAgICAgICAgICggZWRnZS0+cG9zIC0gZWRnZS0+b3BvcyApIC8gNjQuMCwKLSAgICAgICAgICAgICAgICggZWRnZTItPnBvcyAtIGVkZ2UyLT5vcG9zICkgLyA2NC4wICk7Ci0jZW5kaWYKLQotICAgICAgYW5jaG9yID0gZWRnZTsKLSAgICAgIGVkZ2UtPmZsYWdzICB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICBlZGdlMi0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgIH0KLQotICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGxvd2VyY2FzZSBtJ3MgbWFpbnRhaW4gdGhlaXIgc3ltbWV0cnkgKi8KLQotICAgIC8qIEluIGdlbmVyYWwsIGxvd2VyY2FzZSBtJ3MgaGF2ZSBzaXggdmVydGljYWwgZWRnZXMgaWYgdGhleSBhcmUgc2FucyAqLwotICAgIC8qIHNlcmlmLCBvciB0d2VsdmUgaWYgdGhleSBhcmUgd2l0aCBzZXJpZnMuICBUaGlzIGltcGxlbWVudGF0aW9uIGlzICAqLwotICAgIC8qIGJhc2VkIG9uIHRoYXQgYXNzdW1wdGlvbiwgYW5kIHNlZW1zIHRvIHdvcmsgdmVyeSB3ZWxsIHdpdGggbW9zdCAgICAqLwotICAgIC8qIGZhY2VzLiAgSG93ZXZlciwgaWYgZm9yIGEgY2VydGFpbiBmYWNlIHRoaXMgYXNzdW1wdGlvbiBpcyBub3QgICAgICAqLwotICAgIC8qIHRydWUsIHRoZSBtIGlzIGp1c3QgcmVuZGVyZWQgbGlrZSBiZWZvcmUuICBJbiBhZGRpdGlvbiwgYW55IHN0ZW0gICAqLwotICAgIC8qIGNvcnJlY3Rpb24gd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gc3ltbWV0cmljYWwgZ2x5cGhzIChldmVuIGlmIHRoZSAqLwotICAgIC8qIGdseXBoIGlzIG5vdCBhbiBtKSwgc28gdGhlIHBvdGVudGlhbCBmb3IgdW53YW50ZWQgZGlzdG9ydGlvbiBpcyAgICAqLwotICAgIC8qIHJlbGF0aXZlbHkgbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogV2UgZG9uJ3QgaGFuZGxlIGhvcml6b250YWwgZWRnZXMgc2luY2Ugd2UgY2FuJ3QgZWFzaWx5IGFzc3VyZSB0aGF0ICovCi0gICAgLyogdGhlIHRoaXJkIChsb3dlc3QpIHN0ZW0gYWxpZ25zIHdpdGggdGhlIGJhc2UgbGluZTsgaXQgbWlnaHQgZW5kIHVwICovCi0gICAgLyogb25lIHBpeGVsIGhpZ2hlciBvciBsb3dlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBuX2VkZ2VzID0gZWRnZV9saW1pdCAtIGVkZ2VzOwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICYmICggbl9lZGdlcyA9PSA2IHx8IG5fZWRnZXMgPT0gMTIgKSApCi0gICAgewotICAgICAgQUZfRWRnZSAgZWRnZTEsIGVkZ2UyLCBlZGdlMzsKLSAgICAgIEZUX1BvcyAgIGRpc3QxLCBkaXN0Miwgc3BhbjsKLQotCi0gICAgICBpZiAoIG5fZWRnZXMgPT0gNiApCi0gICAgICB7Ci0gICAgICAgIGVkZ2UxID0gZWRnZXM7Ci0gICAgICAgIGVkZ2UyID0gZWRnZXMgKyAyOwotICAgICAgICBlZGdlMyA9IGVkZ2VzICsgNDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWRnZTEgPSBlZGdlcyArIDE7Ci0gICAgICAgIGVkZ2UyID0gZWRnZXMgKyA1OwotICAgICAgICBlZGdlMyA9IGVkZ2VzICsgOTsKLSAgICAgIH0KLQotICAgICAgZGlzdDEgPSBlZGdlMi0+b3BvcyAtIGVkZ2UxLT5vcG9zOwotICAgICAgZGlzdDIgPSBlZGdlMy0+b3BvcyAtIGVkZ2UyLT5vcG9zOwotCi0gICAgICBzcGFuID0gZGlzdDEgLSBkaXN0MjsKLSAgICAgIGlmICggc3BhbiA8IDAgKQotICAgICAgICBzcGFuID0gLXNwYW47Ci0KLSAgICAgIGlmICggZWRnZTEtPmxpbmsgPT0gZWRnZTEgKyAxICYmCi0gICAgICAgICAgIGVkZ2UyLT5saW5rID09IGVkZ2UyICsgMSAmJgotICAgICAgICAgICBlZGdlMy0+bGluayA9PSBlZGdlMyArIDEgJiYgc3BhbiA8IDggKQotICAgICAgewotICAgICAgICBkZWx0YSA9IGVkZ2UzLT5wb3MgLSAoIDIgKiBlZGdlMi0+cG9zIC0gZWRnZTEtPnBvcyApOwotICAgICAgICBlZGdlMy0+cG9zIC09IGRlbHRhOwotICAgICAgICBpZiAoIGVkZ2UzLT5saW5rICkKLSAgICAgICAgICBlZGdlMy0+bGluay0+cG9zIC09IGRlbHRhOwotCi0gICAgICAgIC8qIG1vdmUgdGhlIHNlcmlmcyBhbG9uZyB3aXRoIHRoZSBzdGVtICovCi0gICAgICAgIGlmICggbl9lZGdlcyA9PSAxMiApCi0gICAgICAgIHsKLSAgICAgICAgICAoIGVkZ2VzICsgOCApLT5wb3MgLT0gZGVsdGE7Ci0gICAgICAgICAgKCBlZGdlcyArIDExICktPnBvcyAtPSBkZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGVkZ2UzLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIGlmICggZWRnZTMtPmxpbmsgKQotICAgICAgICAgIGVkZ2UzLT5saW5rLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAhc2tpcHBlZCApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKgotICAgICAqICBub3cgaGludCB0aGUgcmVtYWluaW5nIGVkZ2VzIChzZXJpZnMgYW5kIHNpbmdsZSkgaW4gb3JkZXIKLSAgICAgKiAgdG8gY29tcGxldGUgb3VyIHByb2Nlc3NpbmcKLSAgICAgKi8KLSAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgIHsKLSAgICAgIGlmICggZWRnZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBlZGdlLT5zZXJpZiApCi0gICAgICB7Ci0gICAgICAgIGFmX2Nqa19hbGlnbl9zZXJpZl9lZGdlKCBoaW50cywgZWRnZS0+c2VyaWYsIGVkZ2UgKTsKLSAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgICBza2lwcGVkLS07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAhc2tpcHBlZCApCi0gICAgICByZXR1cm47Ci0KLSAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgIHsKLSAgICAgIEFGX0VkZ2UgIGJlZm9yZSwgYWZ0ZXI7Ci0KLQotICAgICAgaWYgKCBlZGdlLT5mbGFncyAmIEFGX0VER0VfRE9ORSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBiZWZvcmUgPSBhZnRlciA9IGVkZ2U7Ci0KLSAgICAgIHdoaWxlICggLS1iZWZvcmUgPj0gZWRnZXMgKQotICAgICAgICBpZiAoIGJlZm9yZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICB3aGlsZSAoICsrYWZ0ZXIgPCBlZGdlX2xpbWl0ICkKLSAgICAgICAgaWYgKCBhZnRlci0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIGJlZm9yZSA+PSBlZGdlcyB8fCBhZnRlciA8IGVkZ2VfbGltaXQgKQotICAgICAgewotICAgICAgICBpZiAoIGJlZm9yZSA8IGVkZ2VzICkKLSAgICAgICAgICBhZl9jamtfYWxpZ25fc2VyaWZfZWRnZSggaGludHMsIGFmdGVyLCBlZGdlICk7Ci0gICAgICAgIGVsc2UgaWYgKCBhZnRlciA+PSBlZGdlX2xpbWl0ICkKLSAgICAgICAgICBhZl9jamtfYWxpZ25fc2VyaWZfZWRnZSggaGludHMsIGJlZm9yZSwgZWRnZSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZWRnZS0+cG9zID0gYmVmb3JlLT5wb3MgKwotICAgICAgICAgICAgRlRfTXVsRGl2KCBlZGdlLT5mcG9zIC0gYmVmb3JlLT5mcG9zLAotICAgICAgICAgICAgICAgICAgICAgICBhZnRlci0+cG9zIC0gYmVmb3JlLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5mcG9zIC0gYmVmb3JlLT5mcG9zICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBhZl9jamtfYWxpZ25fZWRnZV9wb2ludHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgPSAmIGhpbnRzLT5heGlzW2RpbV07Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlcyAgICAgID0gYXhpcy0+ZWRnZXM7Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlX2xpbWl0ID0gZWRnZXMgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlOwotICAgIEZUX0Jvb2wgICAgICAgc25hcHBpbmc7Ci0KLQotICAgIHNuYXBwaW5nID0gRlRfQk9PTCggKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfTEFUSU5fSElOVFNfRE9fSE9SWl9TTkFQKCBoaW50cyApICkgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9MQVRJTl9ISU5UU19ET19WRVJUX1NOQVAoIGhpbnRzICkgKSAgKTsKLQotICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgewotICAgICAgLyogbW92ZSB0aGUgcG9pbnRzIG9mIGVhY2ggc2VnbWVudCAgICAgKi8KLSAgICAgIC8qIGluIGVhY2ggZWRnZSB0byB0aGUgZWRnZSdzIHBvc2l0aW9uICovCi0gICAgICBBRl9TZWdtZW50ICBzZWcgPSBlZGdlLT5maXJzdDsKLQotCi0gICAgICBpZiAoIHNuYXBwaW5nICkKLSAgICAgIHsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIEFGX1BvaW50ICBwb2ludCA9IHNlZy0+Zmlyc3Q7Ci0KLQotICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwb2ludC0+eCAgICAgID0gZWRnZS0+cG9zOwotICAgICAgICAgICAgICBwb2ludC0+ZmxhZ3MgfD0gQUZfRkxBR19UT1VDSF9YOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwb2ludC0+eSAgICAgID0gZWRnZS0+cG9zOwotICAgICAgICAgICAgICBwb2ludC0+ZmxhZ3MgfD0gQUZfRkxBR19UT1VDSF9ZOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHBvaW50ID09IHNlZy0+bGFzdCApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBwb2ludCA9IHBvaW50LT5uZXh0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIHNlZyA9IHNlZy0+ZWRnZV9uZXh0OwotCi0gICAgICAgIH0gd2hpbGUgKCBzZWcgIT0gZWRnZS0+Zmlyc3QgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkZWx0YSA9IGVkZ2UtPnBvcyAtIGVkZ2UtPm9wb3M7Ci0KLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgQUZfUG9pbnQgIHBvaW50ID0gc2VnLT5maXJzdDsKLQotCi0gICAgICAgICAgZm9yICg7OykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvaW50LT54ICAgICArPSBkZWx0YTsKLSAgICAgICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IEFGX0ZMQUdfVE9VQ0hfWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG9pbnQtPnkgICAgICs9IGRlbHRhOwotICAgICAgICAgICAgICBwb2ludC0+ZmxhZ3MgfD0gQUZfRkxBR19UT1VDSF9ZOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHBvaW50ID09IHNlZy0+bGFzdCApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBwb2ludCA9IHBvaW50LT5uZXh0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIHNlZyA9IHNlZy0+ZWRnZV9uZXh0OwotCi0gICAgICAgIH0gd2hpbGUgKCBzZWcgIT0gZWRnZS0+Zmlyc3QgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9jamtfaGludHNfYXBwbHkoIEFGX0dseXBoSGludHMgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgaW50ICAgICAgIGRpbTsKLQotICAgIEZUX1VOVVNFRCggbWV0cmljcyApOwotCi0KLSAgICBlcnJvciA9IGFmX2dseXBoX2hpbnRzX3JlbG9hZCggaGludHMsIG91dGxpbmUsIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGFuYWx5emUgZ2x5cGggb3V0bGluZSAqLwotICAgIGlmICggQUZfSElOVFNfRE9fSE9SSVpPTlRBTCggaGludHMgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBhZl9jamtfaGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBoaW50cywgQUZfRElNRU5TSU9OX0hPUlogKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBBRl9ISU5UU19ET19WRVJUSUNBTCggaGludHMgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBhZl9jamtfaGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBoaW50cywgQUZfRElNRU5TSU9OX1ZFUlQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogZ3JpZC1maXQgdGhlIG91dGxpbmUgKi8KLSAgICBmb3IgKCBkaW0gPSAwOyBkaW0gPCBBRl9ESU1FTlNJT05fTUFYOyBkaW0rKyApCi0gICAgewotICAgICAgaWYgKCAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiAmJiBBRl9ISU5UU19ET19IT1JJWk9OVEFMKCBoaW50cyApICkgfHwKLSAgICAgICAgICAgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgJiYgQUZfSElOVFNfRE9fVkVSVElDQUwoIGhpbnRzICkgKSAgICkKLSAgICAgIHsKLQotI2lmZGVmIEFGX1VTRV9XQVJQRVIKLSAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgKQotICAgICAgICB7Ci0gICAgICAgICAgQUZfV2FycGVyUmVjICB3YXJwZXI7Ci0gICAgICAgICAgRlRfRml4ZWQgICAgICBzY2FsZTsKLSAgICAgICAgICBGVF9Qb3MgICAgICAgIGRlbHRhOwotCi0KLSAgICAgICAgICBhZl93YXJwZXJfY29tcHV0ZSggJndhcnBlciwgaGludHMsIGRpbSwgJnNjYWxlLCAmZGVsdGEgKTsKLSAgICAgICAgICBhZl9nbHlwaF9oaW50c19zY2FsZV9kaW0oIGhpbnRzLCBkaW0sIHNjYWxlLCBkZWx0YSApOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYgLyogQUZfVVNFX1dBUlBFUiAqLwotCi0gICAgICAgIGFmX2Nqa19oaW50X2VkZ2VzKCBoaW50cywgKEFGX0RpbWVuc2lvbilkaW0gKTsKLSAgICAgICAgYWZfY2prX2FsaWduX2VkZ2VfcG9pbnRzKCBoaW50cywgKEFGX0RpbWVuc2lvbilkaW0gKTsKLSAgICAgICAgYWZfZ2x5cGhfaGludHNfYWxpZ25fc3Ryb25nX3BvaW50cyggaGludHMsIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICAgIGFmX2dseXBoX2hpbnRzX2FsaWduX3dlYWtfcG9pbnRzKCBoaW50cywgKEFGX0RpbWVuc2lvbilkaW0gKTsKLSAgICAgIH0KLSAgICB9Ci0KLSNpZiAwCi0gICAgYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMoIGhpbnRzICk7Ci0gICAgYWZfZ2x5cGhfaGludHNfZHVtcF9zZWdtZW50cyggaGludHMgKTsKLSAgICBhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzKCBoaW50cyApOwotI2VuZGlmCi0KLSAgICBhZl9nbHlwaF9oaW50c19zYXZlKCBoaW50cywgb3V0bGluZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgQyBKIEsgICBTIEMgUiBJIFAgVCAgIEMgTCBBIFMgUyAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2Nqa191bmlyYW5nZXNbXSA9Ci0gIHsKLSNpZiAwCi0gICAgeyAweDAxMDAsICAweEZGRkYgfSwgIC8qIHdoeSB0aGlzPyAqLwotI2VuZGlmCi0gICAgeyAweDJFODAsICAweDJFRkYgfSwgIC8qIENKSyBSYWRpY2FscyBTdXBwbGVtZW50ICovCi0gICAgeyAweDJGMDAsICAweDJGREYgfSwgIC8qIEthbmd4aSBSYWRpY2FscyAqLwotICAgIHsgMHgzMDAwLCAgMHgzMDNGIH0sICAvKiBDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24gKi8KLSAgICB7IDB4MzA0MCwgIDB4MzA5RiB9LCAgLyogSGlyYWdhbmEgKi8KLSAgICB7IDB4MzBBMCwgIDB4MzBGRiB9LCAgLyogS2F0YWthbmEgKi8KLSAgICB7IDB4MzEwMCwgIDB4MzEyRiB9LCAgLyogQm9wb21vZm8gKi8KLSAgICB7IDB4MzEzMCwgIDB4MzE4RiB9LCAgLyogSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyAqLwotICAgIHsgMHgzMUEwLCAgMHgzMUJGIH0sICAvKiBCb3BvbW9mbyBFeHRlbmRlZCAqLwotICAgIHsgMHgzMUMwLCAgMHgzMUVGIH0sICAvKiBDSksgU3Ryb2tlcyAqLwotICAgIHsgMHgzMUYwLCAgMHgzMUZGIH0sICAvKiBLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zICovCi0gICAgeyAweDMyMDAsICAweDMyRkYgfSwgIC8qIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMgKi8KLSAgICB7IDB4MzMwMCwgIDB4MzNGRiB9LCAgLyogQ0pLIENvbXBhdGliaWxpdHkgKi8KLSAgICB7IDB4MzQwMCwgIDB4NERCRiB9LCAgLyogQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSAqLwotICAgIHsgMHg0REMwLCAgMHg0REZGIH0sICAvKiBZaWppbmcgSGV4YWdyYW0gU3ltYm9scyAqLwotICAgIHsgMHg0RTAwLCAgMHg5RkZGIH0sICAvKiBDSksgVW5pZmllZCBJZGVvZ3JhcGhzICovCi0gICAgeyAweEY5MDAsICAweEZBRkYgfSwgIC8qIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgKi8KLSAgICB7IDB4RkUzMCwgIDB4RkU0RiB9LCAgLyogQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgKi8KLSAgICB7IDB4RkYwMCwgIDB4RkZFRiB9LCAgLyogSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMgKi8KLSAgICB7IDB4MjAwMDAsIDB4MkE2REYgfSwgLyogQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQiAqLwotICAgIHsgMHgyRjgwMCwgMHgyRkExRiB9LCAvKiBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzIFN1cHBsZW1lbnQgKi8KLSAgICB7IDAsICAgICAgIDAgfQotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2Nqa19zY3JpcHRfY2xhc3MgPQotICB7Ci0gICAgQUZfU0NSSVBUX0NKSywKLSAgICBhZl9jamtfdW5pcmFuZ2VzLAotCi0gICAgc2l6ZW9mKCBBRl9MYXRpbk1ldHJpY3NSZWMgKSwKLQotICAgIChBRl9TY3JpcHRfSW5pdE1ldHJpY3NGdW5jKSBhZl9jamtfbWV0cmljc19pbml0LAotICAgIChBRl9TY3JpcHRfU2NhbGVNZXRyaWNzRnVuYylhZl9jamtfbWV0cmljc19zY2FsZSwKLSAgICAoQUZfU2NyaXB0X0RvbmVNZXRyaWNzRnVuYykgTlVMTCwKLQotICAgIChBRl9TY3JpcHRfSW5pdEhpbnRzRnVuYykgICBhZl9jamtfaGludHNfaW5pdCwKLSAgICAoQUZfU2NyaXB0X0FwcGx5SGludHNGdW5jKSAgYWZfY2prX2hpbnRzX2FwcGx5Ci0gIH07Ci0KLSNlbHNlIC8qICFBRl9DT05GSUdfT1BUSU9OX0NKSyAqLwotCi0gIHN0YXRpYyBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2Nqa191bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICB7IDAsIDAgfQotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2Nqa19zY3JpcHRfY2xhc3MgPQotICB7Ci0gICAgQUZfU0NSSVBUX0NKSywKLSAgICBhZl9jamtfdW5pcmFuZ2VzLAotCi0gICAgc2l6ZW9mKCBBRl9MYXRpbk1ldHJpY3NSZWMgKSwKLQotICAgIChBRl9TY3JpcHRfSW5pdE1ldHJpY3NGdW5jKSBOVUxMLAotICAgIChBRl9TY3JpcHRfU2NhbGVNZXRyaWNzRnVuYylOVUxMLAotICAgIChBRl9TY3JpcHRfRG9uZU1ldHJpY3NGdW5jKSBOVUxMLAotCi0gICAgKEFGX1NjcmlwdF9Jbml0SGludHNGdW5jKSAgIE5VTEwsCi0gICAgKEFGX1NjcmlwdF9BcHBseUhpbnRzRnVuYykgIE5VTEwKLSAgfTsKLQotI2VuZGlmIC8qICFBRl9DT05GSUdfT1BUSU9OX0NKSyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZjamsuaCBiL3NyYy9hdXRvZml0L2FmY2prLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzdmZGEuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZjamsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmY2prLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBDSksgc2NyaXB0IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FGQ0pLX0hfXwotI2RlZmluZSBfX0FGQ0pLX0hfXwotCi0jaW5jbHVkZSAiYWZoaW50cy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogdGhlIENKSy1zcGVjaWZpYyBzY3JpcHQgY2xhc3MgKi8KLQotICBGVF9DQUxMQkFDS19UQUJMRSBjb25zdCBBRl9TY3JpcHRDbGFzc1JlYwotICBhZl9jamtfc2NyaXB0X2NsYXNzOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfY2prX21ldHJpY3NfaW5pdCggQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgIGZhY2UgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX2Nqa19tZXRyaWNzX3NjYWxlKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBBRl9TY2FsZXIgICAgICAgIHNjYWxlciApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmX2Nqa19oaW50c19pbml0KCBBRl9HbHlwaEhpbnRzICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfY2prX2hpbnRzX2FwcGx5KCBBRl9HbHlwaEhpbnRzICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgKTsKLQotLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19BRkNKS19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmZHVtbXkuYyBiL3NyYy9hdXRvZml0L2FmZHVtbXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5NmU5Ni4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmR1bW15LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmR1bW15LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgZHVtbXkgcm91dGluZXMgdG8gYmUgdXNlZCBpZiBubyBoaW50aW5nIHNob3VsZCBiZSAgICAgICAgKi8KLS8qICAgIHBlcmZvcm1lZCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYWZkdW1teS5oIgotI2luY2x1ZGUgImFmaGludHMuaCIKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9kdW1teV9oaW50c19pbml0KCBBRl9HbHlwaEhpbnRzICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgQUZfU2NyaXB0TWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzICk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9kdW1teV9oaW50c19hcHBseSggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICBvdXRsaW5lICkKLSAgewotICAgIEZUX1VOVVNFRCggaGludHMgKTsKLSAgICBGVF9VTlVTRUQoIG91dGxpbmUgKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgY29uc3QgQUZfU2NyaXB0Q2xhc3NSZWMKLSAgYWZfZHVtbXlfc2NyaXB0X2NsYXNzID0KLSAgewotICAgIEFGX1NDUklQVF9OT05FLAotICAgIE5VTEwsCi0KLSAgICBzaXplb2YoIEFGX1NjcmlwdE1ldHJpY3NSZWMgKSwKLQotICAgIChBRl9TY3JpcHRfSW5pdE1ldHJpY3NGdW5jKSBOVUxMLAotICAgIChBRl9TY3JpcHRfU2NhbGVNZXRyaWNzRnVuYylOVUxMLAotICAgIChBRl9TY3JpcHRfRG9uZU1ldHJpY3NGdW5jKSBOVUxMLAotCi0gICAgKEFGX1NjcmlwdF9Jbml0SGludHNGdW5jKSAgIGFmX2R1bW15X2hpbnRzX2luaXQsCi0gICAgKEFGX1NjcmlwdF9BcHBseUhpbnRzRnVuYykgIGFmX2R1bW15X2hpbnRzX2FwcGx5Ci0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmR1bW15LmggYi9zcmMvYXV0b2ZpdC9hZmR1bW15LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWZhZjguLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZkdW1teS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZkdW1teS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGR1bW15IHJvdXRpbmVzIHRvIGJlIHVzZWQgaWYgbm8gaGludGluZyBzaG91bGQgYmUgICAgICAgICovCi0vKiAgICBwZXJmb3JtZWQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FGRFVNTVlfSF9fCi0jZGVmaW5lIF9fQUZEVU1NWV9IX18KLQotI2luY2x1ZGUgImFmdHlwZXMuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotIC8qICBBIGR1bW15IHNjcmlwdCBtZXRyaWNzIGNsYXNzIHVzZWQgd2hlbiBubyBoaW50aW5nIHNob3VsZAotICAqICBiZSBwZXJmb3JtZWQuICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciBub24tbGF0aW4gZ2x5cGhzIQotICAqLwotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2R1bW15X3NjcmlwdF9jbGFzczsKLQotLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0FGRFVNTVlfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmVycm9ycy5oIGIvc3JjL2F1dG9maXQvYWZlcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlZDVmZS4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG9maXR0ZXIgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBBdXRvZml0dGVyIGVycm9yIGVudW1lcmF0aW9uICAgICAgICAgICovCi0gIC8qIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19BRkVSUk9SU19IX18KLSNkZWZpbmUgX19BRkVSUk9SU19IX18KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBfX0ZURVJST1JTX0hfXwotCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIEFGX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9BdXRvZml0Ci0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX0FGRVJST1JTX0hfXyAqLwotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmZ2xvYmFsLmMgYi9zcmMvYXV0b2ZpdC9hZmdsb2JhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmI5MDkxLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmZ2xvYmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZnbG9iYWwuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIHJvdXRpbmVzIHRvIGNvbXB1dGUgZ2xvYmFsIGhpbnRpbmcgdmFsdWVzIChib2R5KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYWZnbG9iYWwuaCIKLSNpbmNsdWRlICJhZmR1bW15LmgiCi0jaW5jbHVkZSAiYWZsYXRpbi5oIgotI2luY2x1ZGUgImFmY2prLmgiCi0jaW5jbHVkZSAiYWZpbmRpYy5oIgotCi0jaW5jbHVkZSAiYWZlcnJvcnMuaCIKLQotI2lmZGVmIEZUX09QVElPTl9BVVRPRklUMgotI2luY2x1ZGUgImFmbGF0aW4yLmgiCi0jZW5kaWYKLQotICAvKiBwb3B1bGF0ZSB0aGlzIGxpc3Qgd2hlbiB5b3UgYWRkIG5ldyBzY3JpcHRzICovCi0gIHN0YXRpYyBBRl9TY3JpcHRDbGFzcyBjb25zdCAgYWZfc2NyaXB0X2NsYXNzZXNbXSA9Ci0gIHsKLSAgICAmYWZfZHVtbXlfc2NyaXB0X2NsYXNzLAotI2lmZGVmIEZUX09QVElPTl9BVVRPRklUMgotICAgICZhZl9sYXRpbjJfc2NyaXB0X2NsYXNzLAotI2VuZGlmCi0gICAgJmFmX2xhdGluX3NjcmlwdF9jbGFzcywKLSAgICAmYWZfY2prX3NjcmlwdF9jbGFzcywKLSAgICAmYWZfaW5kaWNfc2NyaXB0X2NsYXNzLCAKLSAgICBOVUxMICAvKiBkbyBub3QgcmVtb3ZlICovCi0gIH07Ci0KLSAgLyogaW5kZXggb2YgZGVmYXVsdCBzY3JpcHQgaW4gYGFmX3NjcmlwdF9jbGFzc2VzJyAqLwotI2RlZmluZSBBRl9TQ1JJUFRfTElTVF9ERUZBVUxUICAyCi0gIC8qIGluZGljYXRlcyBhbiB1bmNvdmVyZWQgZ2x5cGggICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUZfU0NSSVBUX0xJU1RfTk9ORSAgIDI1NQotCi0KLSAgLyoKLSAgICogIE5vdGUgdGhhdCBnbHlwaF9zY3JpcHRzW10gaXMgdXNlZCB0byBtYXAgZWFjaCBnbHlwaCBpbnRvCi0gICAqICBhbiBpbmRleCBpbnRvIHRoZSBgYWZfc2NyaXB0X2NsYXNzZXMnIGFycmF5LgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX0ZhY2VHbG9iYWxzUmVjXwotICB7Ci0gICAgRlRfRmFjZSAgICAgICAgICAgZmFjZTsKLSAgICBGVF9VSW50ICAgICAgICAgICBnbHlwaF9jb3VudDsgICAgLyogc2FtZSBhcyBmYWNlLT5udW1fZ2x5cGhzICovCi0gICAgRlRfQnl0ZSogICAgICAgICAgZ2x5cGhfc2NyaXB0czsKLQotICAgIEFGX1NjcmlwdE1ldHJpY3MgIG1ldHJpY3NbQUZfU0NSSVBUX01BWF07Ci0KLSAgfSBBRl9GYWNlR2xvYmFsc1JlYzsKLQotCi0gIC8qIENvbXB1dGUgdGhlIHNjcmlwdCBpbmRleCBvZiBlYWNoIGdseXBoIHdpdGhpbiBhIGdpdmVuIGZhY2UuICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3NjcmlwdF9jb3ZlcmFnZSggQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgICAgICAgPSBBRl9FcnJfT2s7Ci0gICAgRlRfRmFjZSAgICAgZmFjZSAgICAgICAgPSBnbG9iYWxzLT5mYWNlOwotICAgIEZUX0NoYXJNYXAgIG9sZF9jaGFybWFwID0gZmFjZS0+Y2hhcm1hcDsKLSAgICBGVF9CeXRlKiAgICBnc2NyaXB0cyAgICA9IGdsb2JhbHMtPmdseXBoX3NjcmlwdHM7Ci0gICAgRlRfVUludCAgICAgc3M7Ci0KLQotICAgIC8qIHRoZSB2YWx1ZSAyNTUgbWVhbnMgYHVuY292ZXJlZCBnbHlwaCcgKi8KLSAgICBGVF9NRU1fU0VUKCBnbG9iYWxzLT5nbHlwaF9zY3JpcHRzLAotICAgICAgICAgICAgICAgIEFGX1NDUklQVF9MSVNUX05PTkUsCi0gICAgICAgICAgICAgICAgZ2xvYmFscy0+Z2x5cGhfY291bnQgKTsKLQotICAgIGVycm9yID0gRlRfU2VsZWN0X0NoYXJtYXAoIGZhY2UsIEZUX0VOQ09ESU5HX1VOSUNPREUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgIC8qCi0gICAgICAqICBJZ25vcmUgdGhpcyBlcnJvcjsgd2Ugc2ltcGx5IHVzZSB0aGUgZGVmYXVsdCBzY3JpcHQuCi0gICAgICAqICBYWFg6IFNob3VsZG4ndCB3ZSByYXRoZXIgZGlzYWJsZSBoaW50aW5nPwotICAgICAgKi8KLSAgICAgIGVycm9yID0gQUZfRXJyX09rOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHNjYW4gZWFjaCBzY3JpcHQgaW4gYSBVbmljb2RlIGNoYXJtYXAgKi8KLSAgICBmb3IgKCBzcyA9IDA7IGFmX3NjcmlwdF9jbGFzc2VzW3NzXTsgc3MrKyApCi0gICAgewotICAgICAgQUZfU2NyaXB0Q2xhc3MgICAgICBjbGF6eiA9IGFmX3NjcmlwdF9jbGFzc2VzW3NzXTsKLSAgICAgIEFGX1NjcmlwdF9VbmlSYW5nZSAgcmFuZ2U7Ci0KLQotICAgICAgaWYgKCBjbGF6ei0+c2NyaXB0X3VuaV9yYW5nZXMgPT0gTlVMTCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKgotICAgICAgICogIFNjYW4gYWxsIHVuaWNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSBhbmQgc2V0IHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICAgKiAgZ2x5cGggc2NyaXB0IGluZGV4LgotICAgICAgICovCi0gICAgICBmb3IgKCByYW5nZSA9IGNsYXp6LT5zY3JpcHRfdW5pX3JhbmdlczsgcmFuZ2UtPmZpcnN0ICE9IDA7IHJhbmdlKysgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUgPSByYW5nZS0+Zmlyc3Q7Ci0gICAgICAgIEZUX1VJbnQgICBnaW5kZXg7Ci0KLQotICAgICAgICBnaW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleCggZmFjZSwgY2hhcmNvZGUgKTsKLQotICAgICAgICBpZiAoIGdpbmRleCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGdpbmRleCA8IGdsb2JhbHMtPmdseXBoX2NvdW50ICAgICAgICAgICAmJgotICAgICAgICAgICAgIGdzY3JpcHRzW2dpbmRleF0gPT0gQUZfU0NSSVBUX0xJU1RfTk9ORSApCi0gICAgICAgIHsKLSAgICAgICAgICBnc2NyaXB0c1tnaW5kZXhdID0gKEZUX0J5dGUpc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgY2hhcmNvZGUgPSBGVF9HZXRfTmV4dF9DaGFyKCBmYWNlLCBjaGFyY29kZSwgJmdpbmRleCApOwotCi0gICAgICAgICAgaWYgKCBnaW5kZXggPT0gMCB8fCBjaGFyY29kZSA+IHJhbmdlLT5sYXN0ICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgaWYgKCBnaW5kZXggPCBnbG9iYWxzLT5nbHlwaF9jb3VudCAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGdzY3JpcHRzW2dpbmRleF0gPT0gQUZfU0NSSVBUX0xJU1RfTk9ORSApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ3NjcmlwdHNbZ2luZGV4XSA9IChGVF9CeXRlKXNzOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIC8qCi0gICAgICogIEJ5IGRlZmF1bHQsIGFsbCB1bmNvdmVyZWQgZ2x5cGhzIGFyZSBzZXQgdG8gdGhlIGxhdGluIHNjcmlwdC4KLSAgICAgKiAgWFhYOiBTaG91bGRuJ3Qgd2UgZGlzYWJsZSBoaW50aW5nIG9yIGRvIHNvbWV0aGluZyBzaW1pbGFyPwotICAgICAqLwotICAgIHsKLSAgICAgIEZUX1VJbnQgIG5uOwotCi0KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBnbG9iYWxzLT5nbHlwaF9jb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggZ3NjcmlwdHNbbm5dID09IEFGX1NDUklQVF9MSVNUX05PTkUgKQotICAgICAgICAgIGdzY3JpcHRzW25uXSA9IEFGX1NDUklQVF9MSVNUX0RFRkFVTFQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRlRfU2V0X0NoYXJtYXAoIGZhY2UsIG9sZF9jaGFybWFwICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfZmFjZV9nbG9iYWxzX25ldyggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBBRl9GYWNlR2xvYmFscyAgKmFnbG9iYWxzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5OwotICAgIEFGX0ZhY2VHbG9iYWxzICBnbG9iYWxzOwotCi0KLSAgICBtZW1vcnkgPSBmYWNlLT5tZW1vcnk7Ci0KLSAgICBpZiAoICFGVF9BTExPQyggZ2xvYmFscywgc2l6ZW9mICggKmdsb2JhbHMgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9nbHlwaHMgKiBzaXplb2YgKCBGVF9CeXRlICkgKSApCi0gICAgewotICAgICAgZ2xvYmFscy0+ZmFjZSAgICAgICAgICA9IGZhY2U7Ci0gICAgICBnbG9iYWxzLT5nbHlwaF9jb3VudCAgID0gZmFjZS0+bnVtX2dseXBoczsKLSAgICAgIGdsb2JhbHMtPmdseXBoX3NjcmlwdHMgPSAoRlRfQnl0ZSopKCBnbG9iYWxzICsgMSApOwotCi0gICAgICBlcnJvciA9IGFmX2ZhY2VfZ2xvYmFsc19jb21wdXRlX3NjcmlwdF9jb3ZlcmFnZSggZ2xvYmFscyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGFmX2ZhY2VfZ2xvYmFsc19mcmVlKCBnbG9iYWxzICk7Ci0gICAgICAgIGdsb2JhbHMgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotICAgICphZ2xvYmFscyA9IGdsb2JhbHM7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9mYWNlX2dsb2JhbHNfZnJlZSggQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMgKQotICB7Ci0gICAgaWYgKCBnbG9iYWxzICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGdsb2JhbHMtPmZhY2UtPm1lbW9yeTsKLSAgICAgIEZUX1VJbnQgICAgbm47Ci0KLQotICAgICAgZm9yICggbm4gPSAwOyBubiA8IEFGX1NDUklQVF9NQVg7IG5uKysgKQotICAgICAgewotICAgICAgICBpZiAoIGdsb2JhbHMtPm1ldHJpY3Nbbm5dICkKLSAgICAgICAgewotICAgICAgICAgIEFGX1NjcmlwdENsYXNzICBjbGF6eiA9IGFmX3NjcmlwdF9jbGFzc2VzW25uXTsKLQotCi0gICAgICAgICAgRlRfQVNTRVJUKCBnbG9iYWxzLT5tZXRyaWNzW25uXS0+Y2xhenogPT0gY2xhenogKTsKLQotICAgICAgICAgIGlmICggY2xhenotPnNjcmlwdF9tZXRyaWNzX2RvbmUgKQotICAgICAgICAgICAgY2xhenotPnNjcmlwdF9tZXRyaWNzX2RvbmUoIGdsb2JhbHMtPm1ldHJpY3Nbbm5dICk7Ci0KLSAgICAgICAgICBGVF9GUkVFKCBnbG9iYWxzLT5tZXRyaWNzW25uXSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGdsb2JhbHMtPmdseXBoX2NvdW50ICAgPSAwOwotICAgICAgZ2xvYmFscy0+Z2x5cGhfc2NyaXB0cyA9IE5VTEw7ICAvKiBubyBuZWVkIHRvIGZyZWUgdGhpcyBvbmUhICovCi0gICAgICBnbG9iYWxzLT5mYWNlICAgICAgICAgID0gTlVMTDsKLQotICAgICAgRlRfRlJFRSggZ2xvYmFscyApOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2ZhY2VfZ2xvYmFsc19nZXRfbWV0cmljcyggQUZfRmFjZUdsb2JhbHMgICAgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TY3JpcHRNZXRyaWNzICAqYW1ldHJpY3MgKQotICB7Ci0gICAgQUZfU2NyaXB0TWV0cmljcyAgbWV0cmljcyA9IE5VTEw7Ci0gICAgRlRfVUludCAgICAgICAgICAgZ2lkeDsKLSAgICBBRl9TY3JpcHRDbGFzcyAgICBjbGF6ejsKLSAgICBGVF9VSW50ICAgICAgICAgICBzY3JpcHQgICAgID0gb3B0aW9ucyAmIDE1OwotICAgIGNvbnN0IEZUX1VJbnQgICAgIHNjcmlwdF9tYXggPSBzaXplb2YgKCBhZl9zY3JpcHRfY2xhc3NlcyApIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBhZl9zY3JpcHRfY2xhc3Nlc1swXSApOwotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yICAgICAgPSBBRl9FcnJfT2s7Ci0KLQotICAgIGlmICggZ2luZGV4ID49IGdsb2JhbHMtPmdseXBoX2NvdW50ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEFGX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGdpZHggPSBzY3JpcHQ7Ci0gICAgaWYgKCBnaWR4ID09IDAgfHwgZ2lkeCArIDEgPj0gc2NyaXB0X21heCApCi0gICAgICBnaWR4ID0gZ2xvYmFscy0+Z2x5cGhfc2NyaXB0c1tnaW5kZXhdOwotCi0gICAgY2xhenogPSBhZl9zY3JpcHRfY2xhc3Nlc1tnaWR4XTsKLSAgICBpZiAoIHNjcmlwdCA9PSAwICkKLSAgICAgIHNjcmlwdCA9IGNsYXp6LT5zY3JpcHQ7Ci0KLSAgICBtZXRyaWNzID0gZ2xvYmFscy0+bWV0cmljc1tjbGF6ei0+c2NyaXB0XTsKLSAgICBpZiAoIG1ldHJpY3MgPT0gTlVMTCApCi0gICAgewotICAgICAgLyogY3JlYXRlIHRoZSBnbG9iYWwgbWV0cmljcyBvYmplY3Qgd2hlbiBuZWVkZWQgKi8KLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZ2xvYmFscy0+ZmFjZS0+bWVtb3J5OwotCi0KLSAgICAgIGlmICggRlRfQUxMT0MoIG1ldHJpY3MsIGNsYXp6LT5zY3JpcHRfbWV0cmljc19zaXplICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIG1ldHJpY3MtPmNsYXp6ID0gY2xheno7Ci0KLSAgICAgIGlmICggY2xhenotPnNjcmlwdF9tZXRyaWNzX2luaXQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGNsYXp6LT5zY3JpcHRfbWV0cmljc19pbml0KCBtZXRyaWNzLCBnbG9iYWxzLT5mYWNlICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBjbGF6ei0+c2NyaXB0X21ldHJpY3NfZG9uZSApCi0gICAgICAgICAgICBjbGF6ei0+c2NyaXB0X21ldHJpY3NfZG9uZSggbWV0cmljcyApOwotCi0gICAgICAgICAgRlRfRlJFRSggbWV0cmljcyApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBnbG9iYWxzLT5tZXRyaWNzW2NsYXp6LT5zY3JpcHRdID0gbWV0cmljczsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICAqYW1ldHJpY3MgPSBtZXRyaWNzOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmdsb2JhbC5oIGIvc3JjL2F1dG9maXQvYWZnbG9iYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1MmMwOC4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmdsb2JhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZnbG9iYWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIHJvdXRpbmVzIHRvIGNvbXB1dGUgZ2xvYmFsIGhpbnRpbmcgdmFsdWVzICAgICAgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FGX0dMT0JBTF9IX18KLSNkZWZpbmUgX19BRl9HTE9CQUxfSF9fCi0KLQotI2luY2x1ZGUgImFmdHlwZXMuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgIEYgQSBDIEUgICBHIEwgTyBCIEEgTCBTICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiAgbW9kZWwgdGhlIGdsb2JhbCBoaW50cyBkYXRhIGZvciBhIGdpdmVuIGZhY2UsIGRlY29tcG9zZWQgaW50bwotICAgKiAgc2NyaXB0LXNwZWNpZmljIGl0ZW1zCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBBRl9GYWNlR2xvYmFsc1JlY18qICAgQUZfRmFjZUdsb2JhbHM7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9mYWNlX2dsb2JhbHNfbmV3KCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX0ZhY2VHbG9iYWxzICAqYWdsb2JhbHMgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9mYWNlX2dsb2JhbHNfZ2V0X21ldHJpY3MoIEFGX0ZhY2VHbG9iYWxzICAgICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU2NyaXB0TWV0cmljcyAgKmFtZXRyaWNzICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9mYWNlX2dsb2JhbHNfZnJlZSggQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMgKTsKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19BRl9HTE9CQUxTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZoaW50cy5jIGIvc3JjL2F1dG9maXQvYWZoaW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI4NzA2Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmaGludHMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZoaW50cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYWZoaW50cy5oIgotI2luY2x1ZGUgImFmZXJyb3JzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9heGlzX2hpbnRzX25ld19zZWdtZW50KCBBRl9BeGlzSGludHMgIGF4aXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TZWdtZW50ICAgKmFzZWdtZW50ICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yICAgPSBBRl9FcnJfT2s7Ci0gICAgQUZfU2VnbWVudCAgc2VnbWVudCA9IE5VTEw7Ci0KLQotICAgIGlmICggYXhpcy0+bnVtX3NlZ21lbnRzID49IGF4aXMtPm1heF9zZWdtZW50cyApCi0gICAgewotICAgICAgRlRfSW50ICBvbGRfbWF4ID0gYXhpcy0+bWF4X3NlZ21lbnRzOwotICAgICAgRlRfSW50ICBuZXdfbWF4ID0gb2xkX21heDsKLSAgICAgIEZUX0ludCAgYmlnX21heCA9IEZUX0lOVF9NQVggLyBzaXplb2YgKCAqc2VnbWVudCApOwotCi0KLSAgICAgIGlmICggb2xkX21heCA+PSBiaWdfbWF4ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBBRl9FcnJfT3V0X09mX01lbW9yeTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBuZXdfbWF4ICs9ICggbmV3X21heCA+PiAyICkgKyA0OwotICAgICAgaWYgKCBuZXdfbWF4IDwgb2xkX21heCB8fCBuZXdfbWF4ID4gYmlnX21heCApCi0gICAgICAgIG5ld19tYXggPSBiaWdfbWF4OwotCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBheGlzLT5zZWdtZW50cywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBheGlzLT5tYXhfc2VnbWVudHMgPSBuZXdfbWF4OwotICAgIH0KLQotICAgIHNlZ21lbnQgPSBheGlzLT5zZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50cysrOwotCi0gIEV4aXQ6Ci0gICAgKmFzZWdtZW50ID0gc2VnbWVudDsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmX2F4aXNfaGludHNfbmV3X2VkZ2UoIEFGX0F4aXNIaW50cyAgYXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBmcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaXJlY3Rpb24gIGRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAqYWVkZ2UgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gQUZfRXJyX09rOwotICAgIEFGX0VkZ2UgICBlZGdlICA9IE5VTEw7Ci0gICAgQUZfRWRnZSAgIGVkZ2VzOwotCi0KLSAgICBpZiAoIGF4aXMtPm51bV9lZGdlcyA+PSBheGlzLT5tYXhfZWRnZXMgKQotICAgIHsKLSAgICAgIEZUX0ludCAgb2xkX21heCA9IGF4aXMtPm1heF9lZGdlczsKLSAgICAgIEZUX0ludCAgbmV3X21heCA9IG9sZF9tYXg7Ci0gICAgICBGVF9JbnQgIGJpZ19tYXggPSBGVF9JTlRfTUFYIC8gc2l6ZW9mICggKmVkZ2UgKTsKLQotCi0gICAgICBpZiAoIG9sZF9tYXggPj0gYmlnX21heCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gQUZfRXJyX091dF9PZl9NZW1vcnk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgbmV3X21heCArPSAoIG5ld19tYXggPj4gMiApICsgNDsKLSAgICAgIGlmICggbmV3X21heCA8IG9sZF9tYXggfHwgbmV3X21heCA+IGJpZ19tYXggKQotICAgICAgICBuZXdfbWF4ID0gYmlnX21heDsKLQotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggYXhpcy0+ZWRnZXMsIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgYXhpcy0+bWF4X2VkZ2VzID0gbmV3X21heDsKLSAgICB9Ci0KLSAgICBlZGdlcyA9IGF4aXMtPmVkZ2VzOwotICAgIGVkZ2UgID0gZWRnZXMgKyBheGlzLT5udW1fZWRnZXM7Ci0KLSAgICB3aGlsZSAoIGVkZ2UgPiBlZGdlcyApCi0gICAgewotICAgICAgaWYgKCBlZGdlWy0xXS5mcG9zIDwgZnBvcyApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiB3ZSB3YW50IHRoZSBlZGdlIHdpdGggc2FtZSBwb3NpdGlvbiBhbmQgbWlub3IgZGlyZWN0aW9uICovCi0gICAgICAvKiB0byBhcHBlYXIgYmVmb3JlIHRob3NlIGluIHRoZSBtYWpvciBvbmUgaW4gdGhlIGxpc3QgICAgICovCi0gICAgICBpZiAoIGVkZ2VbLTFdLmZwb3MgPT0gZnBvcyAmJiBkaXIgPT0gYXhpcy0+bWFqb3JfZGlyICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGVkZ2VbMF0gPSBlZGdlWy0xXTsKLSAgICAgIGVkZ2UtLTsKLSAgICB9Ci0KLSAgICBheGlzLT5udW1fZWRnZXMrKzsKLQotICAgIEZUX1pFUk8oIGVkZ2UgKTsKLSAgICBlZGdlLT5mcG9zID0gKEZUX1Nob3J0KWZwb3M7Ci0gICAgZWRnZS0+ZGlyICA9IChGVF9DaGFyKWRpcjsKLQotICBFeGl0OgotICAgICphZWRnZSA9IGVkZ2U7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2lmZGVmIEFGX0RFQlVHCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0gIHN0YXRpYyBjb25zdCBjaGFyKgotICBhZl9kaXJfc3RyKCBBRl9EaXJlY3Rpb24gIGRpciApCi0gIHsKLSAgICBjb25zdCBjaGFyKiAgcmVzdWx0OwotCi0KLSAgICBzd2l0Y2ggKCBkaXIgKQotICAgIHsKLSAgICBjYXNlIEFGX0RJUl9VUDoKLSAgICAgIHJlc3VsdCA9ICJ1cCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFGX0RJUl9ET1dOOgotICAgICAgcmVzdWx0ID0gImRvd24iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBRl9ESVJfTEVGVDoKLSAgICAgIHJlc3VsdCA9ICJsZWZ0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQUZfRElSX1JJR0hUOgotICAgICAgcmVzdWx0ID0gInJpZ2h0IjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXN1bHQgPSAibm9uZSI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSNkZWZpbmUgQUZfSU5ERVhfTlVNKCBwdHIsIGJhc2UgKSAgKCAocHRyKSA/ICggKHB0cikgLSAoYmFzZSkgKSA6IC0xICkKLQotCi0gIHZvaWQKLSAgYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMoIEFGX0dseXBoSGludHMgIGhpbnRzICkKLSAgewotICAgIEFGX1BvaW50ICBwb2ludHMgPSBoaW50cy0+cG9pbnRzOwotICAgIEFGX1BvaW50ICBsaW1pdCAgPSBwb2ludHMgKyBoaW50cy0+bnVtX3BvaW50czsKLSAgICBBRl9Qb2ludCAgcG9pbnQ7Ci0KLQotICAgIHByaW50ZiggIlRhYmxlIG9mIHBvaW50czpcbiIgKTsKLSAgICBwcmludGYoICAgIiAgWyBpbmRleCB8ICB4b3JnIHwgIHlvcmcgfCAgeHNjYWxlIHwgIHlzY2FsZSAiCi0gICAgICAgICAgICAgICJ8ICB4Zml0ICB8ICB5Zml0ICB8ICBmbGFncyBdXG4iICk7Ci0KLSAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBsaW1pdDsgcG9pbnQrKyApCi0gICAgewotICAgICAgcHJpbnRmKCAiICBbICU1ZCB8ICU1ZCB8ICU1ZCB8ICUtNS4yZiB8ICUtNS4yZiAiCi0gICAgICAgICAgICAgICJ8ICUtNS4yZiB8ICUtNS4yZiB8ICVjJWMlYyVjJWMlYyBdXG4iLAotICAgICAgICAgICAgICBwb2ludCAtIHBvaW50cywKLSAgICAgICAgICAgICAgcG9pbnQtPmZ4LAotICAgICAgICAgICAgICBwb2ludC0+ZnksCi0gICAgICAgICAgICAgIHBvaW50LT5veC82NC4wLAotICAgICAgICAgICAgICBwb2ludC0+b3kvNjQuMCwKLSAgICAgICAgICAgICAgcG9pbnQtPngvNjQuMCwKLSAgICAgICAgICAgICAgcG9pbnQtPnkvNjQuMCwKLSAgICAgICAgICAgICAgKCBwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX1dFQUtfSU5URVJQT0xBVElPTiApID8gJ3cnIDogJyAnLAotICAgICAgICAgICAgICAoIHBvaW50LT5mbGFncyAmIEFGX0ZMQUdfSU5GTEVDVElPTiApICAgICAgICAgPyAnaScgOiAnICcsCi0gICAgICAgICAgICAgICggcG9pbnQtPmZsYWdzICYgQUZfRkxBR19FWFRSRU1BX1ggKSAgICAgICAgICA/ICc8JyA6ICcgJywKLSAgICAgICAgICAgICAgKCBwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX0VYVFJFTUFfWSApICAgICAgICAgID8gJ3YnIDogJyAnLAotICAgICAgICAgICAgICAoIHBvaW50LT5mbGFncyAmIEFGX0ZMQUdfUk9VTkRfWCApICAgICAgICAgICAgPyAnKCcgOiAnICcsCi0gICAgICAgICAgICAgICggcG9pbnQtPmZsYWdzICYgQUZfRkxBR19ST1VORF9ZICkgICAgICAgICAgICA/ICd1JyA6ICcgJyk7Ci0gICAgfQotICAgIHByaW50ZiggIlxuIiApOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgY2hhcioKLSAgYWZfZWRnZV9mbGFnc190b19zdHJpbmcoIEFGX0VkZ2VfRmxhZ3MgIGZsYWdzICkKLSAgewotICAgIHN0YXRpYyBjaGFyICB0ZW1wWzMyXTsKLSAgICBpbnQgICAgICAgICAgcG9zID0gMDsKLQotCi0gICAgaWYgKCBmbGFncyAmIEFGX0VER0VfUk9VTkQgKQotICAgIHsKLSAgICAgIG1lbWNweSggdGVtcCArIHBvcywgInJvdW5kIiwgNSApOwotICAgICAgcG9zICs9IDU7Ci0gICAgfQotICAgIGlmICggZmxhZ3MgJiBBRl9FREdFX1NFUklGICkKLSAgICB7Ci0gICAgICBpZiAoIHBvcyA+IDAgKQotICAgICAgICB0ZW1wW3BvcysrXSA9ICcgJzsKLSAgICAgIG1lbWNweSggdGVtcCArIHBvcywgInNlcmlmIiwgNSApOwotICAgICAgcG9zICs9IDU7Ci0gICAgfQotICAgIGlmICggcG9zID09IDAgKQotICAgICAgcmV0dXJuICJub3JtYWwiOwotCi0gICAgdGVtcFtwb3NdID0gMDsKLQotICAgIHJldHVybiB0ZW1wOwotICB9Ci0KLQotICAvKiBBIGZ1bmN0aW9uIHRvIGR1bXAgdGhlIGFycmF5IG9mIGxpbmtlZCBzZWdtZW50cy4gKi8KLSAgdm9pZAotICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cyApCi0gIHsKLSAgICBGVF9JbnQgIGRpbWVuc2lvbjsKLQotCi0gICAgZm9yICggZGltZW5zaW9uID0gMTsgZGltZW5zaW9uID49IDA7IGRpbWVuc2lvbi0tICkKLSAgICB7Ci0gICAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgID0gJmhpbnRzLT5heGlzW2RpbWVuc2lvbl07Ci0gICAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgICBBRl9TZWdtZW50ICAgIGxpbWl0ICAgID0gc2VnbWVudHMgKyBheGlzLT5udW1fc2VnbWVudHM7Ci0gICAgICBBRl9TZWdtZW50ICAgIHNlZzsKLQotCi0gICAgICBwcmludGYgKCAiVGFibGUgb2YgJXMgc2VnbWVudHM6XG4iLAotICAgICAgICAgICAgICAgZGltZW5zaW9uID09IEFGX0RJTUVOU0lPTl9IT1JaID8gInZlcnRpY2FsIiA6ICJob3Jpem9udGFsIiApOwotICAgICAgcHJpbnRmICggIiAgWyBpbmRleCB8ICBwb3MgIHwgIGRpciAgfCBsaW5rIHwgc2VyaWYgfCIKLSAgICAgICAgICAgICAgICIgaGVpZ2h0ICB8IGV4dHJhIHwgZmxhZ3MgICAgXVxuIiApOwotCi0gICAgICBmb3IgKCBzZWcgPSBzZWdtZW50czsgc2VnIDwgbGltaXQ7IHNlZysrICkKLSAgICAgIHsKLSAgICAgICAgcHJpbnRmICggIiAgWyAlNWQgfCAlNS4yZyB8ICU1cyB8ICU0ZCB8ICU1ZCB8ICU1ZCB8ICU1ZCB8ICVzIF1cbiIsCi0gICAgICAgICAgICAgICAgIHNlZyAtIHNlZ21lbnRzLAotICAgICAgICAgICAgICAgICBkaW1lbnNpb24gPT0gQUZfRElNRU5TSU9OX0hPUlogPyAoaW50KXNlZy0+Zmlyc3QtPm94IC8gNjQuMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaW50KXNlZy0+Zmlyc3QtPm95IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgYWZfZGlyX3N0ciggKEFGX0RpcmVjdGlvbilzZWctPmRpciApLAotICAgICAgICAgICAgICAgICBBRl9JTkRFWF9OVU0oIHNlZy0+bGluaywgc2VnbWVudHMgKSwKLSAgICAgICAgICAgICAgICAgQUZfSU5ERVhfTlVNKCBzZWctPnNlcmlmLCBzZWdtZW50cyApLAotICAgICAgICAgICAgICAgICBzZWctPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgc2VnLT5oZWlnaHQgLSAoIHNlZy0+bWF4X2Nvb3JkIC0gc2VnLT5taW5fY29vcmQgKSwKLSAgICAgICAgICAgICAgICAgYWZfZWRnZV9mbGFnc190b19zdHJpbmcoIHNlZy0+ZmxhZ3MgKSApOwotICAgICAgfQotICAgICAgcHJpbnRmKCAiXG4iICk7Ci0gICAgfQotICB9Ci0KLQotICB2b2lkCi0gIGFmX2dseXBoX2hpbnRzX2R1bXBfZWRnZXMoIEFGX0dseXBoSGludHMgIGhpbnRzICkKLSAgewotICAgIEZUX0ludCAgZGltZW5zaW9uOwotCi0KLSAgICBmb3IgKCBkaW1lbnNpb24gPSAxOyBkaW1lbnNpb24gPj0gMDsgZGltZW5zaW9uLS0gKQotICAgIHsKLSAgICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgPSAmaGludHMtPmF4aXNbZGltZW5zaW9uXTsKLSAgICAgIEFGX0VkZ2UgICAgICAgZWRnZXMgPSBheGlzLT5lZGdlczsKLSAgICAgIEFGX0VkZ2UgICAgICAgbGltaXQgPSBlZGdlcyArIGF4aXMtPm51bV9lZGdlczsKLSAgICAgIEFGX0VkZ2UgICAgICAgZWRnZTsKLQotCi0gICAgICAvKgotICAgICAgICogIG5vdGU6IEFGX0RJTUVOU0lPTl9IT1JaIGNvcnJlc3BvbmRzIHRvIF92ZXJ0aWNhbF8gZWRnZXMKLSAgICAgICAqICAgICAgICBzaW5jZSB0aGV5IGhhdmUgY29uc3RhbnQgYSBYIGNvb3JkaW5hdGUuCi0gICAgICAgKi8KLSAgICAgIHByaW50ZiAoICJUYWJsZSBvZiAlcyBlZGdlczpcbiIsCi0gICAgICAgICAgICAgICBkaW1lbnNpb24gPT0gQUZfRElNRU5TSU9OX0hPUlogPyAidmVydGljYWwiIDogImhvcml6b250YWwiICk7Ci0gICAgICBwcmludGYgKCAiICBbIGluZGV4IHwgIHBvcyAgfCAgZGlyICB8IGxpbmsgfCIKLSAgICAgICAgICAgICAgICIgc2VyaWYgfCBibHVlIHwgb3BvcyAgfCAgcG9zICB8IGZsYWdzICAgXVxuIiApOwotCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBsaW1pdDsgZWRnZSsrICkKLSAgICAgIHsKLSAgICAgICAgcHJpbnRmICggIiAgWyAlNWQgfCAlNS4yZyB8ICU1cyB8ICU0ZCB8IgotICAgICAgICAgICAgICAgICAiICU1ZCB8ICAgJWMgIHwgJTUuMmYgfCAlNS4yZiB8ICVzIF1cbiIsCi0gICAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywKLSAgICAgICAgICAgICAgICAgKGludCllZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgYWZfZGlyX3N0ciggKEFGX0RpcmVjdGlvbillZGdlLT5kaXIgKSwKLSAgICAgICAgICAgICAgICAgQUZfSU5ERVhfTlVNKCBlZGdlLT5saW5rLCBlZGdlcyApLAotICAgICAgICAgICAgICAgICBBRl9JTkRFWF9OVU0oIGVkZ2UtPnNlcmlmLCBlZGdlcyApLAotICAgICAgICAgICAgICAgICBlZGdlLT5ibHVlX2VkZ2UgPyAneScgOiAnbicsCi0gICAgICAgICAgICAgICAgIGVkZ2UtPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICBhZl9lZGdlX2ZsYWdzX3RvX3N0cmluZyggZWRnZS0+ZmxhZ3MgKSApOwotICAgICAgfQotICAgICAgcHJpbnRmKCAiXG4iICk7Ci0gICAgfQotICB9Ci0KLSNlbHNlIC8qICFBRl9ERUJVRyAqLwotCi0gIC8qIHRoZXNlIGVtcHR5IHN0dWJzIGFyZSBvbmx5IHVzZWQgdG8gbGluayB0aGUgYGZ0Z3JpZCcgdGVzdCBwcm9ncmFtICovCi0gIC8qIHdoZW4gZGVidWdnaW5nIGlzIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgdm9pZAotICBhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cyggQUZfR2x5cGhIaW50cyAgaGludHMgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBoaW50cyApOwotICB9Ci0KLQotICB2b2lkCi0gIGFmX2dseXBoX2hpbnRzX2R1bXBfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzICkKLSAgewotICAgIEZUX1VOVVNFRCggaGludHMgKTsKLSAgfQotCi0KLSAgdm9pZAotICBhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzKCBBRl9HbHlwaEhpbnRzICBoaW50cyApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGhpbnRzICk7Ci0gIH0KLQotI2VuZGlmIC8qICFBRl9ERUJVRyAqLwotCi0KLSAgLyogY29tcHV0ZSB0aGUgZGlyZWN0aW9uIHZhbHVlIG9mIGEgZ2l2ZW4gdmVjdG9yICovCi0gIEZUX0xPQ0FMX0RFRiggQUZfRGlyZWN0aW9uICkKLSAgYWZfZGlyZWN0aW9uX2NvbXB1dGUoIEZUX1BvcyAgZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICkKLSAgewotICAgIEZUX1BvcyAgICAgICAgbGwsIHNzOyAgLyogbG9uZyBhbmQgc2hvcnQgYXJtIGxlbmd0aHMgKi8KLSAgICBBRl9EaXJlY3Rpb24gIGRpcjsgICAgIC8qIGNhbmRpZGF0ZSBkaXJlY3Rpb24gICAgICAgICovCi0KLQotICAgIGlmICggZHkgPj0gZHggKQotICAgIHsKLSAgICAgIGlmICggZHkgPj0gLWR4ICkKLSAgICAgIHsKLSAgICAgICAgZGlyID0gQUZfRElSX1VQOwotICAgICAgICBsbCAgPSBkeTsKLSAgICAgICAgc3MgID0gZHg7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpciA9IEFGX0RJUl9MRUZUOwotICAgICAgICBsbCAgPSAtZHg7Ci0gICAgICAgIHNzICA9IGR5OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qIGR5IDwgZHggKi8KLSAgICB7Ci0gICAgICBpZiAoIGR5ID49IC1keCApCi0gICAgICB7Ci0gICAgICAgIGRpciA9IEFGX0RJUl9SSUdIVDsKLSAgICAgICAgbGwgID0gZHg7Ci0gICAgICAgIHNzICA9IGR5OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkaXIgPSBBRl9ESVJfRE9XTjsKLSAgICAgICAgbGwgID0gZHk7Ci0gICAgICAgIHNzICA9IGR4OwotICAgICAgfQotICAgIH0KLQotICAgIHNzICo9IDE0OwotICAgIGlmICggRlRfQUJTKCBsbCApIDw9IEZUX0FCUyggc3MgKSApCi0gICAgICBkaXIgPSBBRl9ESVJfTk9ORTsKLQotICAgIHJldHVybiBkaXI7Ci0gIH0KLQotCi0gIC8qIGNvbXB1dGUgYWxsIGluZmxleCBwb2ludHMgaW4gYSBnaXZlbiBnbHlwaCAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX2dseXBoX2hpbnRzX2NvbXB1dGVfaW5mbGVjdGlvbnMoIEFGX0dseXBoSGludHMgIGhpbnRzICkKLSAgewotICAgIEFGX1BvaW50KiAgY29udG91ciAgICAgICA9IGhpbnRzLT5jb250b3VyczsKLSAgICBBRl9Qb2ludCogIGNvbnRvdXJfbGltaXQgPSBjb250b3VyICsgaGludHMtPm51bV9jb250b3VyczsKLQotCi0gICAgLyogZG8gZWFjaCBjb250b3VyIHNlcGFyYXRlbHkgKi8KLSAgICBmb3IgKCA7IGNvbnRvdXIgPCBjb250b3VyX2xpbWl0OyBjb250b3VyKysgKQotICAgIHsKLSAgICAgIEFGX1BvaW50ICBwb2ludCA9IGNvbnRvdXJbMF07Ci0gICAgICBBRl9Qb2ludCAgZmlyc3QgPSBwb2ludDsKLSAgICAgIEFGX1BvaW50ICBzdGFydCA9IHBvaW50OwotICAgICAgQUZfUG9pbnQgIGVuZCAgID0gcG9pbnQ7Ci0gICAgICBBRl9Qb2ludCAgYmVmb3JlOwotICAgICAgQUZfUG9pbnQgIGFmdGVyOwotICAgICAgRlRfUG9zICAgIGluX3gsIGluX3ksIG91dF94LCBvdXRfeTsKLSAgICAgIEFGX0FuZ2xlICBvcmllbnRfcHJldiwgb3JpZW50X2N1cjsKLSAgICAgIEZUX0ludCAgICBmaW5pc2hlZCA9IDA7Ci0KLQotICAgICAgLyogY29tcHV0ZSBmaXJzdCBzZWdtZW50IGluIGNvbnRvdXIgKi8KLSAgICAgIGZpcnN0ID0gcG9pbnQ7Ci0KLSAgICAgIHN0YXJ0ID0gZW5kID0gZmlyc3Q7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICBlbmQgPSBlbmQtPm5leHQ7Ci0gICAgICAgIGlmICggZW5kID09IGZpcnN0ICkKLSAgICAgICAgICBnb3RvIFNraXA7Ci0KLSAgICAgICAgaW5feCA9IGVuZC0+ZnggLSBzdGFydC0+Zng7Ci0gICAgICAgIGluX3kgPSBlbmQtPmZ5IC0gc3RhcnQtPmZ5OwotCi0gICAgICB9IHdoaWxlICggaW5feCA9PSAwICYmIGluX3kgPT0gMCApOwotCi0gICAgICAvKiBleHRlbmQgdGhlIHNlZ21lbnQgc3RhcnQgd2hlbmV2ZXIgcG9zc2libGUgKi8KLSAgICAgIGJlZm9yZSA9IHN0YXJ0OwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIHN0YXJ0ICA9IGJlZm9yZTsKLSAgICAgICAgICBiZWZvcmUgPSBiZWZvcmUtPnByZXY7Ci0gICAgICAgICAgaWYgKCBiZWZvcmUgPT0gZmlyc3QgKQotICAgICAgICAgICAgZ290byBTa2lwOwotCi0gICAgICAgICAgb3V0X3ggPSBzdGFydC0+ZnggLSBiZWZvcmUtPmZ4OwotICAgICAgICAgIG91dF95ID0gc3RhcnQtPmZ5IC0gYmVmb3JlLT5meTsKLQotICAgICAgICB9IHdoaWxlICggb3V0X3ggPT0gMCAmJiBvdXRfeSA9PSAwICk7Ci0KLSAgICAgICAgb3JpZW50X3ByZXYgPSBmdF9jb3JuZXJfb3JpZW50YXRpb24oIGluX3gsIGluX3ksIG91dF94LCBvdXRfeSApOwotCi0gICAgICB9IHdoaWxlICggb3JpZW50X3ByZXYgPT0gMCApOwotCi0gICAgICBmaXJzdCA9IHN0YXJ0OwotCi0gICAgICBpbl94ID0gb3V0X3g7Ci0gICAgICBpbl95ID0gb3V0X3k7Ci0KLSAgICAgIC8qIG5vdyBwcm9jZXNzIGFsbCBzZWdtZW50cyBpbiB0aGUgY29udG91ciAqLwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgLyogZmlyc3QsIGV4dGVuZCBjdXJyZW50IHNlZ21lbnQncyBlbmQgd2hlbmV2ZXIgcG9zc2libGUgKi8KLSAgICAgICAgYWZ0ZXIgPSBlbmQ7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuZCAgID0gYWZ0ZXI7Ci0gICAgICAgICAgICBhZnRlciA9IGFmdGVyLT5uZXh0OwotICAgICAgICAgICAgaWYgKCBhZnRlciA9PSBmaXJzdCApCi0gICAgICAgICAgICAgIGZpbmlzaGVkID0gMTsKLQotICAgICAgICAgICAgb3V0X3ggPSBhZnRlci0+ZnggLSBlbmQtPmZ4OwotICAgICAgICAgICAgb3V0X3kgPSBhZnRlci0+ZnkgLSBlbmQtPmZ5OwotCi0gICAgICAgICAgfSB3aGlsZSAoIG91dF94ID09IDAgJiYgb3V0X3kgPT0gMCApOwotCi0gICAgICAgICAgb3JpZW50X2N1ciA9IGZ0X2Nvcm5lcl9vcmllbnRhdGlvbiggaW5feCwgaW5feSwgb3V0X3gsIG91dF95ICk7Ci0KLSAgICAgICAgfSB3aGlsZSAoIG9yaWVudF9jdXIgPT0gMCApOwotCi0gICAgICAgIGlmICggKCBvcmllbnRfcHJldiArIG9yaWVudF9jdXIgKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHdlIGhhdmUgYW4gaW5mbGVjdGlvbiBwb2ludCBoZXJlICovCi0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdGFydC0+ZmxhZ3MgfD0gQUZfRkxBR19JTkZMRUNUSU9OOwotICAgICAgICAgICAgc3RhcnQgPSBzdGFydC0+bmV4dDsKLQotICAgICAgICAgIH0gd2hpbGUgKCBzdGFydCAhPSBlbmQgKTsKLQotICAgICAgICAgIHN0YXJ0LT5mbGFncyB8PSBBRl9GTEFHX0lORkxFQ1RJT047Ci0gICAgICAgIH0KLQotICAgICAgICBzdGFydCA9IGVuZDsKLSAgICAgICAgZW5kICAgPSBhZnRlcjsKLQotICAgICAgICBvcmllbnRfcHJldiA9IG9yaWVudF9jdXI7Ci0gICAgICAgIGluX3ggICAgICAgID0gb3V0X3g7Ci0gICAgICAgIGluX3kgICAgICAgID0gb3V0X3k7Ci0KLSAgICAgIH0gd2hpbGUgKCAhZmluaXNoZWQgKTsKLQotICAgIFNraXA6Ci0gICAgICA7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19pbml0KCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX1pFUk8oIGhpbnRzICk7Ci0gICAgaGludHMtPm1lbW9yeSA9IG1lbW9yeTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfZG9uZSggQUZfR2x5cGhIaW50cyAgaGludHMgKQotICB7Ci0gICAgaWYgKCBoaW50cyAmJiBoaW50cy0+bWVtb3J5ICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGhpbnRzLT5tZW1vcnk7Ci0gICAgICBpbnQgICAgICAgIGRpbTsKLQotCi0gICAgICAvKgotICAgICAgICogIG5vdGUgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGZyZWUgdGhlIHNlZ21lbnQgYW5kIGVkZ2UKLSAgICAgICAqICBidWZmZXJzLCBzaW5jZSB0aGV5IGFyZSByZWFsbHkgd2l0aGluIHRoZSBoaW50cy0+cG9pbnRzIGFycmF5Ci0gICAgICAgKi8KLSAgICAgIGZvciAoIGRpbSA9IDA7IGRpbSA8IEFGX0RJTUVOU0lPTl9NQVg7IGRpbSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfQXhpc0hpbnRzICBheGlzID0gJmhpbnRzLT5heGlzW2RpbV07Ci0KLQotICAgICAgICBheGlzLT5udW1fc2VnbWVudHMgPSAwOwotICAgICAgICBheGlzLT5tYXhfc2VnbWVudHMgPSAwOwotICAgICAgICBGVF9GUkVFKCBheGlzLT5zZWdtZW50cyApOwotCi0gICAgICAgIGF4aXMtPm51bV9lZGdlcyAgICA9IDA7Ci0gICAgICAgIGF4aXMtPm1heF9lZGdlcyAgICA9IDA7Ci0gICAgICAgIEZUX0ZSRUUoIGF4aXMtPmVkZ2VzICk7Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSRUUoIGhpbnRzLT5jb250b3VycyApOwotICAgICAgaGludHMtPm1heF9jb250b3VycyA9IDA7Ci0gICAgICBoaW50cy0+bnVtX2NvbnRvdXJzID0gMDsKLQotICAgICAgRlRfRlJFRSggaGludHMtPnBvaW50cyApOwotICAgICAgaGludHMtPm51bV9wb2ludHMgPSAwOwotICAgICAgaGludHMtPm1heF9wb2ludHMgPSAwOwotCi0gICAgICBoaW50cy0+bWVtb3J5ID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2dseXBoX2hpbnRzX3Jlc2NhbGUoIEFGX0dseXBoSGludHMgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TY3JpcHRNZXRyaWNzICBtZXRyaWNzICkKLSAgewotICAgIGhpbnRzLT5tZXRyaWNzICAgICAgPSBtZXRyaWNzOwotICAgIGhpbnRzLT5zY2FsZXJfZmxhZ3MgPSBtZXRyaWNzLT5zY2FsZXIuZmxhZ3M7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9nbHlwaF9oaW50c19yZWxvYWQoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgZ2V0X2luZmxlY3Rpb25zICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgICA9IEFGX0Vycl9PazsKLSAgICBBRl9Qb2ludCAgIHBvaW50czsKLSAgICBGVF9VSW50ICAgIG9sZF9tYXgsIG5ld19tYXg7Ci0gICAgRlRfRml4ZWQgICB4X3NjYWxlID0gaGludHMtPnhfc2NhbGU7Ci0gICAgRlRfRml4ZWQgICB5X3NjYWxlID0gaGludHMtPnlfc2NhbGU7Ci0gICAgRlRfUG9zICAgICB4X2RlbHRhID0gaGludHMtPnhfZGVsdGE7Ci0gICAgRlRfUG9zICAgICB5X2RlbHRhID0gaGludHMtPnlfZGVsdGE7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgID0gaGludHMtPm1lbW9yeTsKLQotCi0gICAgaGludHMtPm51bV9wb2ludHMgICA9IDA7Ci0gICAgaGludHMtPm51bV9jb250b3VycyA9IDA7Ci0KLSAgICBoaW50cy0+YXhpc1swXS5udW1fc2VnbWVudHMgPSAwOwotICAgIGhpbnRzLT5heGlzWzBdLm51bV9lZGdlcyAgICA9IDA7Ci0gICAgaGludHMtPmF4aXNbMV0ubnVtX3NlZ21lbnRzID0gMDsKLSAgICBoaW50cy0+YXhpc1sxXS5udW1fZWRnZXMgICAgPSAwOwotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCByZWFsbG9jYXRlIHRoZSBjb250b3VycyBhcnJheSB3aGVuIG5lY2Vzc2FyeSAqLwotICAgIG5ld19tYXggPSAoRlRfVUludClvdXRsaW5lLT5uX2NvbnRvdXJzOwotICAgIG9sZF9tYXggPSBoaW50cy0+bWF4X2NvbnRvdXJzOwotICAgIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIG5ld19tYXggPSAoIG5ld19tYXggKyAzICkgJiB+MzsKLQotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggaGludHMtPmNvbnRvdXJzLCBvbGRfbWF4LCBuZXdfbWF4ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGhpbnRzLT5tYXhfY29udG91cnMgPSBuZXdfbWF4OwotICAgIH0KLQotICAgIC8qCi0gICAgICogIHRoZW4gcmVhbGxvY2F0ZSB0aGUgcG9pbnRzIGFycmF5cyBpZiBuZWNlc3NhcnkgLS0KLSAgICAgKiAgbm90ZSB0aGF0IHdlIHJlc2VydmUgdHdvIGFkZGl0aW9uYWwgcG9pbnQgcG9zaXRpb25zLCB1c2VkIHRvCi0gICAgICogIGhpbnQgbWV0cmljcyBhcHByb3ByaWF0ZWx5Ci0gICAgICovCi0gICAgbmV3X21heCA9IChGVF9VSW50KSggb3V0bGluZS0+bl9wb2ludHMgKyAyICk7Ci0gICAgb2xkX21heCA9IGhpbnRzLT5tYXhfcG9pbnRzOwotICAgIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIG5ld19tYXggPSAoIG5ld19tYXggKyAyICsgNyApICYgfjc7Ci0KLSAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGhpbnRzLT5wb2ludHMsIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaGludHMtPm1heF9wb2ludHMgPSBuZXdfbWF4OwotICAgIH0KLQotICAgIGhpbnRzLT5udW1fcG9pbnRzICAgPSBvdXRsaW5lLT5uX3BvaW50czsKLSAgICBoaW50cy0+bnVtX2NvbnRvdXJzID0gb3V0bGluZS0+bl9jb250b3VyczsKLQotICAgIC8qIFdlIGNhbid0IHJlbHkgb24gdGhlIHZhbHVlIG9mIGBGVF9PdXRsaW5lLmZsYWdzJyB0byBrbm93IHRoZSBmaWxsICAgKi8KLSAgICAvKiBkaXJlY3Rpb24gdXNlZCBmb3IgYSBnbHlwaCwgZ2l2ZW4gdGhhdCBzb21lIGZvbnRzIGFyZSBicm9rZW4gKGUuZy4sICovCi0gICAgLyogdGhlIEFycGhpYyBvbmVzKS4gIFdlIHRodXMgcmVjb21wdXRlIGl0IGVhY2ggdGltZSB3ZSBuZWVkIHRvLiAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBoaW50cy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0ubWFqb3JfZGlyID0gQUZfRElSX1VQOwotICAgIGhpbnRzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXS5tYWpvcl9kaXIgPSBBRl9ESVJfTEVGVDsKLQotICAgIGlmICggRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24oIG91dGxpbmUgKSA9PSBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBUICkKLSAgICB7Ci0gICAgICBoaW50cy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0ubWFqb3JfZGlyID0gQUZfRElSX0RPV047Ci0gICAgICBoaW50cy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0ubWFqb3JfZGlyID0gQUZfRElSX1JJR0hUOwotICAgIH0KLQotICAgIGhpbnRzLT54X3NjYWxlID0geF9zY2FsZTsKLSAgICBoaW50cy0+eV9zY2FsZSA9IHlfc2NhbGU7Ci0gICAgaGludHMtPnhfZGVsdGEgPSB4X2RlbHRhOwotICAgIGhpbnRzLT55X2RlbHRhID0geV9kZWx0YTsKLQotICAgIGhpbnRzLT54bWluX2RlbHRhID0gMDsKLSAgICBoaW50cy0+eG1heF9kZWx0YSA9IDA7Ci0KLSAgICBwb2ludHMgPSBoaW50cy0+cG9pbnRzOwotICAgIGlmICggaGludHMtPm51bV9wb2ludHMgPT0gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB7Ci0gICAgICBBRl9Qb2ludCAgcG9pbnQ7Ci0gICAgICBBRl9Qb2ludCAgcG9pbnRfbGltaXQgPSBwb2ludHMgKyBoaW50cy0+bnVtX3BvaW50czsKLQotCi0gICAgICAvKiBjb21wdXRlIGNvb3JkaW5hdGVzICYgQmV6aWVyIGZsYWdzLCBuZXh0IGFuZCBwcmV2ICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciogIHZlYyAgICAgICAgICAgPSBvdXRsaW5lLT5wb2ludHM7Ci0gICAgICAgIGNoYXIqICAgICAgIHRhZyAgICAgICAgICAgPSBvdXRsaW5lLT50YWdzOwotICAgICAgICBBRl9Qb2ludCAgICBmaXJzdCAgICAgICAgID0gcG9pbnRzOwotICAgICAgICBBRl9Qb2ludCAgICBlbmQgICAgICAgICAgID0gcG9pbnRzICsgb3V0bGluZS0+Y29udG91cnNbMF07Ci0gICAgICAgIEFGX1BvaW50ICAgIHByZXYgICAgICAgICAgPSBlbmQ7Ci0gICAgICAgIEZUX0ludCAgICAgIGNvbnRvdXJfaW5kZXggPSAwOwotCi0KLSAgICAgICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRfbGltaXQ7IHBvaW50KyssIHZlYysrLCB0YWcrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBwb2ludC0+ZnggPSAoRlRfU2hvcnQpdmVjLT54OwotICAgICAgICAgIHBvaW50LT5meSA9IChGVF9TaG9ydCl2ZWMtPnk7Ci0gICAgICAgICAgcG9pbnQtPm94ID0gcG9pbnQtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApICsgeF9kZWx0YTsKLSAgICAgICAgICBwb2ludC0+b3kgPSBwb2ludC0+eSA9IEZUX011bEZpeCggdmVjLT55LCB5X3NjYWxlICkgKyB5X2RlbHRhOwotCi0gICAgICAgICAgc3dpdGNoICggRlRfQ1VSVkVfVEFHKCAqdGFnICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIEZUX0NVUlZFX1RBR19DT05JQzoKLSAgICAgICAgICAgIHBvaW50LT5mbGFncyA9IEFGX0ZMQUdfQ09OSUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIEZUX0NVUlZFX1RBR19DVUJJQzoKLSAgICAgICAgICAgIHBvaW50LT5mbGFncyA9IEFGX0ZMQUdfQ1VCSUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcG9pbnQtPmZsYWdzID0gMDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwb2ludC0+cHJldiA9IHByZXY7Ci0gICAgICAgICAgcHJldi0+bmV4dCAgPSBwb2ludDsKLSAgICAgICAgICBwcmV2ICAgICAgICA9IHBvaW50OwotCi0gICAgICAgICAgaWYgKCBwb2ludCA9PSBlbmQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKytjb250b3VyX2luZGV4IDwgb3V0bGluZS0+bl9jb250b3VycyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZpcnN0ID0gcG9pbnQgKyAxOwotICAgICAgICAgICAgICBlbmQgICA9IHBvaW50cyArIG91dGxpbmUtPmNvbnRvdXJzW2NvbnRvdXJfaW5kZXhdOwotICAgICAgICAgICAgICBwcmV2ICA9IGVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogc2V0LXVwIHRoZSBjb250b3VycyBhcnJheSAqLwotICAgICAgewotICAgICAgICBBRl9Qb2ludCogIGNvbnRvdXIgICAgICAgPSBoaW50cy0+Y29udG91cnM7Ci0gICAgICAgIEFGX1BvaW50KiAgY29udG91cl9saW1pdCA9IGNvbnRvdXIgKyBoaW50cy0+bnVtX2NvbnRvdXJzOwotICAgICAgICBzaG9ydCogICAgIGVuZCAgICAgICAgICAgPSBvdXRsaW5lLT5jb250b3VyczsKLSAgICAgICAgc2hvcnQgICAgICBpZHggICAgICAgICAgID0gMDsKLQotCi0gICAgICAgIGZvciAoIDsgY29udG91ciA8IGNvbnRvdXJfbGltaXQ7IGNvbnRvdXIrKywgZW5kKysgKQotICAgICAgICB7Ci0gICAgICAgICAgY29udG91clswXSA9IHBvaW50cyArIGlkeDsKLSAgICAgICAgICBpZHggICAgICAgID0gKHNob3J0KSggZW5kWzBdICsgMSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvbXB1dGUgZGlyZWN0aW9ucyBvZiBpbiAmIG91dCB2ZWN0b3JzICovCi0gICAgICB7Ci0gICAgICAgIEFGX1BvaW50ICAgICAgZmlyc3QgID0gcG9pbnRzOwotICAgICAgICBBRl9Qb2ludCAgICAgIHByZXYgICA9IE5VTEw7Ci0gICAgICAgIEZUX1BvcyAgICAgICAgaW5feCAgID0gMDsKLSAgICAgICAgRlRfUG9zICAgICAgICBpbl95ICAgPSAwOwotICAgICAgICBBRl9EaXJlY3Rpb24gIGluX2RpciA9IEFGX0RJUl9OT05FOwotCi0KLSAgICAgICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRfbGltaXQ7IHBvaW50KysgKQotICAgICAgICB7Ci0gICAgICAgICAgQUZfUG9pbnQgIG5leHQ7Ci0gICAgICAgICAgRlRfUG9zICAgIG91dF94LCBvdXRfeTsKLQotCi0gICAgICAgICAgaWYgKCBwb2ludCA9PSBmaXJzdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJldiAgID0gZmlyc3QtPnByZXY7Ci0gICAgICAgICAgICBpbl94ICAgPSBmaXJzdC0+ZnggLSBwcmV2LT5meDsKLSAgICAgICAgICAgIGluX3kgICA9IGZpcnN0LT5meSAtIHByZXYtPmZ5OwotICAgICAgICAgICAgaW5fZGlyID0gYWZfZGlyZWN0aW9uX2NvbXB1dGUoIGluX3gsIGluX3kgKTsKLSAgICAgICAgICAgIGZpcnN0ICA9IHByZXYgKyAxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHBvaW50LT5pbl9kaXIgPSAoRlRfQ2hhcilpbl9kaXI7Ci0KLSAgICAgICAgICBuZXh0ICA9IHBvaW50LT5uZXh0OwotICAgICAgICAgIG91dF94ID0gbmV4dC0+ZnggLSBwb2ludC0+Zng7Ci0gICAgICAgICAgb3V0X3kgPSBuZXh0LT5meSAtIHBvaW50LT5meTsKLQotICAgICAgICAgIGluX2RpciAgICAgICAgID0gYWZfZGlyZWN0aW9uX2NvbXB1dGUoIG91dF94LCBvdXRfeSApOwotICAgICAgICAgIHBvaW50LT5vdXRfZGlyID0gKEZUX0NoYXIpaW5fZGlyOwotCi0gICAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MgJiAoIEFGX0ZMQUdfQ09OSUMgfCBBRl9GTEFHX0NVQklDICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICBJc19XZWFrX1BvaW50OgotICAgICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IEFGX0ZMQUdfV0VBS19JTlRFUlBPTEFUSU9OOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggcG9pbnQtPm91dF9kaXIgPT0gcG9pbnQtPmluX2RpciApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwb2ludC0+b3V0X2RpciAhPSBBRl9ESVJfTk9ORSApCi0gICAgICAgICAgICAgIGdvdG8gSXNfV2Vha19Qb2ludDsKLQotICAgICAgICAgICAgaWYgKCBmdF9jb3JuZXJfaXNfZmxhdCggaW5feCwgaW5feSwgb3V0X3gsIG91dF95ICkgKQotICAgICAgICAgICAgICBnb3RvIElzX1dlYWtfUG9pbnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBwb2ludC0+aW5fZGlyID09IC1wb2ludC0+b3V0X2RpciApCi0gICAgICAgICAgICBnb3RvIElzX1dlYWtfUG9pbnQ7Ci0KLSAgICAgICAgICBpbl94ID0gb3V0X3g7Ci0gICAgICAgICAgaW5feSA9IG91dF95OwotICAgICAgICAgIHByZXYgPSBwb2ludDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIGNvbXB1dGUgaW5mbGVjdGlvbiBwb2ludHMgLS0gICAgICAgICAgICAgICAgICovCi0gICAgLyogZGlzYWJsZWQgZHVlIHRvIG5vIGxvbmdlciBwZXJjZWl2ZWQgYmVuZWZpdHMgKi8KLSAgICBpZiAoIDAgJiYgZ2V0X2luZmxlY3Rpb25zICkKLSAgICAgIGFmX2dseXBoX2hpbnRzX2NvbXB1dGVfaW5mbGVjdGlvbnMoIGhpbnRzICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2dseXBoX2hpbnRzX3NhdmUoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICBvdXRsaW5lICkKLSAgewotICAgIEFGX1BvaW50ICAgIHBvaW50ID0gaGludHMtPnBvaW50czsKLSAgICBBRl9Qb2ludCAgICBsaW1pdCA9IHBvaW50ICsgaGludHMtPm51bV9wb2ludHM7Ci0gICAgRlRfVmVjdG9yKiAgdmVjICAgPSBvdXRsaW5lLT5wb2ludHM7Ci0gICAgY2hhciogICAgICAgdGFnICAgPSBvdXRsaW5lLT50YWdzOwotCi0KLSAgICBmb3IgKCA7IHBvaW50IDwgbGltaXQ7IHBvaW50KyssIHZlYysrLCB0YWcrKyApCi0gICAgewotICAgICAgdmVjLT54ID0gcG9pbnQtPng7Ci0gICAgICB2ZWMtPnkgPSBwb2ludC0+eTsKLQotICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTklDICkKLSAgICAgICAgdGFnWzBdID0gRlRfQ1VSVkVfVEFHX0NPTklDOwotICAgICAgZWxzZSBpZiAoIHBvaW50LT5mbGFncyAmIEFGX0ZMQUdfQ1VCSUMgKQotICAgICAgICB0YWdbMF0gPSBGVF9DVVJWRV9UQUdfQ1VCSUM7Ci0gICAgICBlbHNlCi0gICAgICAgIHRhZ1swXSA9IEZUX0NVUlZFX1RBR19PTjsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICAgICAgICAgICAgICAgICAgICAgRURHRSBQT0lOVCBHUklELUZJVFRJTkcKLSAgICoKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19hbGlnbl9lZGdlX3BvaW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgICAgID0gJiBoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMgICAgICA9IGF4aXMtPnNlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudF9saW1pdCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnOwotCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICAgIHsKLSAgICAgICAgQUZfRWRnZSAgIGVkZ2UgPSBzZWctPmVkZ2U7Ci0gICAgICAgIEFGX1BvaW50ICBwb2ludCwgZmlyc3QsIGxhc3Q7Ci0KLQotICAgICAgICBpZiAoIGVkZ2UgPT0gTlVMTCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZmlyc3QgPSBzZWctPmZpcnN0OwotICAgICAgICBsYXN0ICA9IHNlZy0+bGFzdDsKLSAgICAgICAgcG9pbnQgPSBmaXJzdDsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIHBvaW50LT54ICAgICAgPSBlZGdlLT5wb3M7Ci0gICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IEFGX0ZMQUdfVE9VQ0hfWDsKLQotICAgICAgICAgIGlmICggcG9pbnQgPT0gbGFzdCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICAgIHsKLSAgICAgICAgQUZfRWRnZSAgIGVkZ2UgPSBzZWctPmVkZ2U7Ci0gICAgICAgIEFGX1BvaW50ICBwb2ludCwgZmlyc3QsIGxhc3Q7Ci0KLQotICAgICAgICBpZiAoIGVkZ2UgPT0gTlVMTCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZmlyc3QgPSBzZWctPmZpcnN0OwotICAgICAgICBsYXN0ICA9IHNlZy0+bGFzdDsKLSAgICAgICAgcG9pbnQgPSBmaXJzdDsKLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIHBvaW50LT55ICAgICAgPSBlZGdlLT5wb3M7Ci0gICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IEFGX0ZMQUdfVE9VQ0hfWTsKLQotICAgICAgICAgIGlmICggcG9pbnQgPT0gbGFzdCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICAgICAgICAgICAgICAgICAgICBTVFJPTkcgUE9JTlQgSU5URVJQT0xBVElPTgotICAgKgotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGhpbnQgdGhlIHN0cm9uZyBwb2ludHMgLS0gdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBUcnVlVHlwZSBgSVAnICovCi0gIC8qIGhpbnRpbmcgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfYWxpZ25fc3Ryb25nX3BvaW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9Qb2ludCAgICAgIHBvaW50cyAgICAgID0gaGludHMtPnBvaW50czsKLSAgICBBRl9Qb2ludCAgICAgIHBvaW50X2xpbWl0ID0gcG9pbnRzICsgaGludHMtPm51bV9wb2ludHM7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZXMgICAgICAgPSBheGlzLT5lZGdlczsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2VfbGltaXQgID0gZWRnZXMgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgQUZfRmxhZ3MgICAgICB0b3VjaF9mbGFnOwotCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgICB0b3VjaF9mbGFnID0gQUZfRkxBR19UT1VDSF9YOwotICAgIGVsc2UKLSAgICAgIHRvdWNoX2ZsYWcgID0gQUZfRkxBR19UT1VDSF9ZOwotCi0gICAgaWYgKCBlZGdlcyA8IGVkZ2VfbGltaXQgKQotICAgIHsKLSAgICAgIEFGX1BvaW50ICBwb2ludDsKLSAgICAgIEFGX0VkZ2UgICBlZGdlOwotCi0KLSAgICAgIGZvciAoIHBvaW50ID0gcG9pbnRzOyBwb2ludCA8IHBvaW50X2xpbWl0OyBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICB1LCBvdSwgZnU7ICAvKiBwb2ludCBwb3NpdGlvbiAqLwotICAgICAgICBGVF9Qb3MgIGRlbHRhOwotCi0KLSAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MgJiB0b3VjaF9mbGFnICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBpZiB0aGlzIHBvaW50IGlzIGNhbmRpZGF0ZSB0byB3ZWFrIGludGVycG9sYXRpb24sIHdlICAgICAgICovCi0gICAgICAgIC8qIGludGVycG9sYXRlIGl0IGFmdGVyIGFsbCBzdHJvbmcgcG9pbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgKi8KLQotICAgICAgICBpZiAoICAoIHBvaW50LT5mbGFncyAmIEFGX0ZMQUdfV0VBS19JTlRFUlBPTEFUSU9OICkgJiYKLSAgICAgICAgICAgICAhKCBwb2ludC0+ZmxhZ3MgJiBBRl9GTEFHX0lORkxFQ1RJT04gKSAgICAgICAgICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApCi0gICAgICAgIHsKLSAgICAgICAgICB1ICA9IHBvaW50LT5meTsKLSAgICAgICAgICBvdSA9IHBvaW50LT5veTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1ICA9IHBvaW50LT5meDsKLSAgICAgICAgICBvdSA9IHBvaW50LT5veDsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1ID0gdTsKLQotICAgICAgICAvKiBpcyB0aGUgcG9pbnQgYmVmb3JlIHRoZSBmaXJzdCBlZGdlPyAqLwotICAgICAgICBlZGdlICA9IGVkZ2VzOwotICAgICAgICBkZWx0YSA9IGVkZ2UtPmZwb3MgLSB1OwotICAgICAgICBpZiAoIGRlbHRhID49IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgdSA9IGVkZ2UtPnBvcyAtICggZWRnZS0+b3BvcyAtIG91ICk7Ci0gICAgICAgICAgZ290byBTdG9yZV9Qb2ludDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlzIHRoZSBwb2ludCBhZnRlciB0aGUgbGFzdCBlZGdlPyAqLwotICAgICAgICBlZGdlICA9IGVkZ2VfbGltaXQgLSAxOwotICAgICAgICBkZWx0YSA9IHUgLSBlZGdlLT5mcG9zOwotICAgICAgICBpZiAoIGRlbHRhID49IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgdSA9IGVkZ2UtPnBvcyArICggb3UgLSBlZGdlLT5vcG9zICk7Ci0gICAgICAgICAgZ290byBTdG9yZV9Qb2ludDsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBtaW4sIG1heCwgbWlkOwotICAgICAgICAgIEZUX1BvcyAgIGZwb3M7Ci0KLQotICAgICAgICAgIC8qIGZpbmQgZW5jbG9zaW5nIGVkZ2VzICovCi0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgICBtYXggPSBlZGdlX2xpbWl0IC0gZWRnZXM7Ci0KLSNpZiAxCi0gICAgICAgICAgLyogZm9yIHNtYWxsIGVkZ2UgY291bnRzLCBhIGxpbmVhciBzZWFyY2ggaXMgYmV0dGVyICovCi0gICAgICAgICAgaWYgKCBtYXggPD0gOCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgbm47Ci0KLSAgICAgICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBtYXg7IG5uKysgKQotICAgICAgICAgICAgICBpZiAoIGVkZ2VzW25uXS5mcG9zID49IHUgKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBpZiAoIGVkZ2VzW25uXS5mcG9zID09IHUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB1ID0gZWRnZXNbbm5dLnBvczsKLSAgICAgICAgICAgICAgZ290byBTdG9yZV9Qb2ludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1pbiA9IG5uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbWlkICA9ICggbWF4ICsgbWluICkgPj4gMTsKLSAgICAgICAgICAgIGVkZ2UgPSBlZGdlcyArIG1pZDsKLSAgICAgICAgICAgIGZwb3MgPSBlZGdlLT5mcG9zOwotCi0gICAgICAgICAgICBpZiAoIHUgPCBmcG9zICkKLSAgICAgICAgICAgICAgbWF4ID0gbWlkOwotICAgICAgICAgICAgZWxzZSBpZiAoIHUgPiBmcG9zICkKLSAgICAgICAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogd2UgYXJlIG9uIHRoZSBlZGdlICovCi0gICAgICAgICAgICAgIHUgPSBlZGdlLT5wb3M7Ci0gICAgICAgICAgICAgIGdvdG8gU3RvcmVfUG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgewotICAgICAgICAgICAgQUZfRWRnZSAgYmVmb3JlID0gZWRnZXMgKyBtaW4gLSAxOwotICAgICAgICAgICAgQUZfRWRnZSAgYWZ0ZXIgID0gZWRnZXMgKyBtaW4gKyAwOwotCi0KLSAgICAgICAgICAgIC8qIGFzc2VydCggYmVmb3JlICYmIGFmdGVyICYmIGJlZm9yZSAhPSBhZnRlciApICovCi0gICAgICAgICAgICBpZiAoIGJlZm9yZS0+c2NhbGUgPT0gMCApCi0gICAgICAgICAgICAgIGJlZm9yZS0+c2NhbGUgPSBGVF9EaXZGaXgoIGFmdGVyLT5wb3MgLSBiZWZvcmUtPnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPmZwb3MgLSBiZWZvcmUtPmZwb3MgKTsKLQotICAgICAgICAgICAgdSA9IGJlZm9yZS0+cG9zICsgRlRfTXVsRml4KCBmdSAtIGJlZm9yZS0+ZnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlLT5zY2FsZSApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICBTdG9yZV9Qb2ludDoKLSAgICAgICAgLyogc2F2ZSB0aGUgcG9pbnQgcG9zaXRpb24gKi8KLSAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgICAgICAgIHBvaW50LT54ID0gdTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBvaW50LT55ID0gdTsKLQotICAgICAgICBwb2ludC0+ZmxhZ3MgfD0gdG91Y2hfZmxhZzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICAgICAgICAgICAgICAgICAgICBXRUFLIFBPSU5UIElOVEVSUE9MQVRJT04KLSAgICoKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgdm9pZAotICBhZl9pdXBfc2hpZnQoIEFGX1BvaW50ICBwMSwKLSAgICAgICAgICAgICAgICBBRl9Qb2ludCAgcDIsCi0gICAgICAgICAgICAgICAgQUZfUG9pbnQgIHJlZiApCi0gIHsKLSAgICBBRl9Qb2ludCAgcDsKLSAgICBGVF9Qb3MgICAgZGVsdGEgPSByZWYtPnUgLSByZWYtPnY7Ci0KLSAgICBpZiAoIGRlbHRhID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gICAgZm9yICggcCA9IHAxOyBwIDwgcmVmOyBwKysgKQotICAgICAgcC0+dSA9IHAtPnYgKyBkZWx0YTsKLQotICAgIGZvciAoIHAgPSByZWYgKyAxOyBwIDw9IHAyOyBwKysgKQotICAgICAgcC0+dSA9IHAtPnYgKyBkZWx0YTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfaXVwX2ludGVycCggQUZfUG9pbnQgIHAxLAotICAgICAgICAgICAgICAgICBBRl9Qb2ludCAgcDIsCi0gICAgICAgICAgICAgICAgIEFGX1BvaW50ICByZWYxLAotICAgICAgICAgICAgICAgICBBRl9Qb2ludCAgcmVmMiApCi0gIHsKLSAgICBBRl9Qb2ludCAgcDsKLSAgICBGVF9Qb3MgICAgdTsKLSAgICBGVF9Qb3MgICAgdjEgPSByZWYxLT52OwotICAgIEZUX1BvcyAgICB2MiA9IHJlZjItPnY7Ci0gICAgRlRfUG9zICAgIGQxID0gcmVmMS0+dSAtIHYxOwotICAgIEZUX1BvcyAgICBkMiA9IHJlZjItPnUgLSB2MjsKLQotCi0gICAgaWYgKCBwMSA+IHAyICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggdjEgPT0gdjIgKQotICAgIHsKLSAgICAgIGZvciAoIHAgPSBwMTsgcCA8PSBwMjsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgdSA9IHAtPnY7Ci0KLSAgICAgICAgaWYgKCB1IDw9IHYxICkKLSAgICAgICAgICB1ICs9IGQxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdSArPSBkMjsKLQotICAgICAgICBwLT51ID0gdTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIHYxIDwgdjIgKQotICAgIHsKLSAgICAgIGZvciAoIHAgPSBwMTsgcCA8PSBwMjsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgdSA9IHAtPnY7Ci0KLSAgICAgICAgaWYgKCB1IDw9IHYxICkKLSAgICAgICAgICB1ICs9IGQxOwotICAgICAgICBlbHNlIGlmICggdSA+PSB2MiApCi0gICAgICAgICAgdSArPSBkMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHUgPSByZWYxLT51ICsgRlRfTXVsRGl2KCB1IC0gdjEsIHJlZjItPnUgLSByZWYxLT51LCB2MiAtIHYxICk7Ci0KLSAgICAgICAgcC0+dSA9IHU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKCBwID0gcDE7IHAgPD0gcDI7IHArKyApCi0gICAgICB7Ci0gICAgICAgIHUgPSBwLT52OwotCi0gICAgICAgIGlmICggdSA8PSB2MiApCi0gICAgICAgICAgdSArPSBkMjsKLSAgICAgICAgZWxzZSBpZiAoIHUgPj0gdjEgKQotICAgICAgICAgIHUgKz0gZDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB1ID0gcmVmMS0+dSArIEZUX011bERpdiggdSAtIHYxLCByZWYyLT51IC0gcmVmMS0+dSwgdjIgLSB2MSApOwotCi0gICAgICAgIHAtPnUgPSB1OwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfYWxpZ25fd2Vha19wb2ludHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX1BvaW50ICAgcG9pbnRzICAgICAgICA9IGhpbnRzLT5wb2ludHM7Ci0gICAgQUZfUG9pbnQgICBwb2ludF9saW1pdCAgID0gcG9pbnRzICsgaGludHMtPm51bV9wb2ludHM7Ci0gICAgQUZfUG9pbnQqICBjb250b3VyICAgICAgID0gaGludHMtPmNvbnRvdXJzOwotICAgIEFGX1BvaW50KiAgY29udG91cl9saW1pdCA9IGNvbnRvdXIgKyBoaW50cy0+bnVtX2NvbnRvdXJzOwotICAgIEFGX0ZsYWdzICAgdG91Y2hfZmxhZzsKLSAgICBBRl9Qb2ludCAgIHBvaW50OwotICAgIEFGX1BvaW50ICAgZW5kX3BvaW50OwotICAgIEFGX1BvaW50ICAgZmlyc3RfcG9pbnQ7Ci0KLQotICAgIC8qIFBBU1MgMTogTW92ZSBzZWdtZW50IHBvaW50cyB0byBlZGdlIHBvc2l0aW9ucyAqLwotCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgIHsKLSAgICAgIHRvdWNoX2ZsYWcgPSBBRl9GTEFHX1RPVUNIX1g7Ci0KLSAgICAgIGZvciAoIHBvaW50ID0gcG9pbnRzOyBwb2ludCA8IHBvaW50X2xpbWl0OyBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPnUgPSBwb2ludC0+eDsKLSAgICAgICAgcG9pbnQtPnYgPSBwb2ludC0+b3g7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0b3VjaF9mbGFnID0gQUZfRkxBR19UT1VDSF9ZOwotCi0gICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludF9saW1pdDsgcG9pbnQrKyApCi0gICAgICB7Ci0gICAgICAgIHBvaW50LT51ID0gcG9pbnQtPnk7Ci0gICAgICAgIHBvaW50LT52ID0gcG9pbnQtPm95OwotICAgICAgfQotICAgIH0KLQotICAgIHBvaW50ID0gcG9pbnRzOwotCi0gICAgZm9yICggOyBjb250b3VyIDwgY29udG91cl9saW1pdDsgY29udG91cisrICkKLSAgICB7Ci0gICAgICBBRl9Qb2ludCAgZmlyc3RfdG91Y2hlZCwgbGFzdF90b3VjaGVkOwotCi0KLSAgICAgIHBvaW50ICAgICAgID0gKmNvbnRvdXI7Ci0gICAgICBlbmRfcG9pbnQgICA9IHBvaW50LT5wcmV2OwotICAgICAgZmlyc3RfcG9pbnQgPSBwb2ludDsKLQotICAgICAgLyogZmluZCBmaXJzdCB0b3VjaGVkIHBvaW50ICovCi0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICBpZiAoIHBvaW50ID4gZW5kX3BvaW50ICkgIC8qIG5vIHRvdWNoZWQgcG9pbnQgaW4gY29udG91ciAqLwotICAgICAgICAgIGdvdG8gTmV4dENvbnRvdXI7Ci0KLSAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MgJiB0b3VjaF9mbGFnICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBwb2ludCsrOwotICAgICAgfQotCi0gICAgICBmaXJzdF90b3VjaGVkID0gcG9pbnQ7Ci0gICAgICBsYXN0X3RvdWNoZWQgID0gcG9pbnQ7Ci0KLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIEZUX0FTU0VSVCggcG9pbnQgPD0gZW5kX3BvaW50ICYmCi0gICAgICAgICAgICAgICAgICAgKCBwb2ludC0+ZmxhZ3MgJiB0b3VjaF9mbGFnICkgIT0gMCApOwotCi0gICAgICAgIC8qIHNraXAgYW55IHRvdWNoZWQgbmVpZ2hiaG91cnMgKi8KLSAgICAgICAgd2hpbGUgKCBwb2ludCA8IGVuZF9wb2ludCAmJiAoIHBvaW50WzFdLmZsYWdzICYgdG91Y2hfZmxhZyApICE9IDAgKQotICAgICAgICAgIHBvaW50Kys7Ci0KLSAgICAgICAgbGFzdF90b3VjaGVkID0gcG9pbnQ7Ci0KLSAgICAgICAgLyogZmluZCB0aGUgbmV4dCB0b3VjaGVkIHBvaW50LCBpZiBhbnkgKi8KLSAgICAgICAgcG9pbnQgKys7Ci0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHBvaW50ID4gZW5kX3BvaW50ICkKLSAgICAgICAgICAgIGdvdG8gRW5kQ29udG91cjsKLQotICAgICAgICAgIGlmICggKCBwb2ludC0+ZmxhZ3MgJiB0b3VjaF9mbGFnICkgIT0gMCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpbnRlcnBvbGF0ZSBiZXR3ZWVuIGxhc3RfdG91Y2hlZCBhbmQgcG9pbnQgKi8KLSAgICAgICAgYWZfaXVwX2ludGVycCggbGFzdF90b3VjaGVkICsgMSwgcG9pbnQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3RvdWNoZWQsIHBvaW50ICk7Ci0gICAgICB9Ci0KLSAgICBFbmRDb250b3VyOgotICAgICAgLyogc3BlY2lhbCBjYXNlOiBvbmx5IG9uZSBwb2ludCB3YXMgdG91Y2hlZCAqLwotICAgICAgaWYgKCBsYXN0X3RvdWNoZWQgPT0gZmlyc3RfdG91Y2hlZCApCi0gICAgICB7Ci0gICAgICAgIGFmX2l1cF9zaGlmdCggZmlyc3RfcG9pbnQsIGVuZF9wb2ludCwgZmlyc3RfdG91Y2hlZCApOwotICAgICAgfQotICAgICAgZWxzZSAvKiBpbnRlcnBvbGF0ZSB0aGUgbGFzdCBwYXJ0ICovCi0gICAgICB7Ci0gICAgICAgIGlmICggbGFzdF90b3VjaGVkIDwgZW5kX3BvaW50ICkKLSAgICAgICAgICBhZl9pdXBfaW50ZXJwKCBsYXN0X3RvdWNoZWQgKyAxLCBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF90b3VjaGVkLCBmaXJzdF90b3VjaGVkICk7Ci0KLSAgICAgICAgaWYgKCBmaXJzdF90b3VjaGVkID4gcG9pbnRzICkKLSAgICAgICAgICBhZl9pdXBfaW50ZXJwKCBmaXJzdF9wb2ludCwgZmlyc3RfdG91Y2hlZCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF90b3VjaGVkLCBmaXJzdF90b3VjaGVkICk7Ci0gICAgICB9Ci0KLSAgICBOZXh0Q29udG91cjoKLSAgICAgIDsKLSAgICB9Ci0KLSAgICAvKiBub3cgc2F2ZSB0aGUgaW50ZXJwb2xhdGVkIHZhbHVlcyBiYWNrIHRvIHgveSAqLwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICB7Ci0gICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludF9saW1pdDsgcG9pbnQrKyApCi0gICAgICAgIHBvaW50LT54ID0gcG9pbnQtPnU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludF9saW1pdDsgcG9pbnQrKyApCi0gICAgICAgIHBvaW50LT55ID0gcG9pbnQtPnU7Ci0gICAgfQotICB9Ci0KLQotI2lmZGVmIEFGX1VTRV9XQVJQRVIKLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19zY2FsZV9kaW0oIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICBkZWx0YSApCi0gIHsKLSAgICBBRl9Qb2ludCAgcG9pbnRzICAgICAgID0gaGludHMtPnBvaW50czsKLSAgICBBRl9Qb2ludCAgcG9pbnRzX2xpbWl0ID0gcG9pbnRzICsgaGludHMtPm51bV9wb2ludHM7Ci0gICAgQUZfUG9pbnQgIHBvaW50OwotCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRzX2xpbWl0OyBwb2ludCsrICkKLSAgICAgICAgcG9pbnQtPnggPSBGVF9NdWxGaXgoIHBvaW50LT5meCwgc2NhbGUgKSArIGRlbHRhOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRzX2xpbWl0OyBwb2ludCsrICkKLSAgICAgICAgcG9pbnQtPnkgPSBGVF9NdWxGaXgoIHBvaW50LT5meSwgc2NhbGUgKSArIGRlbHRhOwotICAgIH0KLSAgfQotCi0jZW5kaWYgLyogQUZfVVNFX1dBUlBFUiAqLwotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmaGludHMuaCBiL3NyYy9hdXRvZml0L2FmaGludHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODI2OC4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmhpbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZoaW50cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQUZISU5UU19IX18KLSNkZWZpbmUgX19BRkhJTlRTX0hfXwotCi0jaW5jbHVkZSAiYWZ0eXBlcy5oIgotCi0jZGVmaW5lIHh4QUZfU09SVF9TRUdNRU5UUwotCi1GVF9CRUdJTl9IRUFERVIKLQotIC8qCi0gICogIFRoZSBkZWZpbml0aW9uIG9mIG91dGxpbmUgZ2x5cGggaGludHMuICBUaGVzZSBhcmUgc2hhcmVkIGJ5IGFsbAotICAqICBzY3JpcHQgYW5hbHlzaXMgcm91dGluZXMgKHVudGlsIG5vdykuCi0gICovCi0KLSAgdHlwZWRlZiBlbnVtICBBRl9EaW1lbnNpb25fCi0gIHsKLSAgICBBRl9ESU1FTlNJT05fSE9SWiA9IDAsICAvKiB4IGNvb3JkaW5hdGVzLCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpLmUuLCB2ZXJ0aWNhbCBzZWdtZW50cyAmIGVkZ2VzICAgKi8KLSAgICBBRl9ESU1FTlNJT05fVkVSVCA9IDEsICAvKiB5IGNvb3JkaW5hdGVzLCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpLmUuLCBob3Jpem9udGFsIHNlZ21lbnRzICYgZWRnZXMgKi8KLQotICAgIEFGX0RJTUVOU0lPTl9NQVggIC8qIGRvIG5vdCByZW1vdmUgKi8KLQotICB9IEFGX0RpbWVuc2lvbjsKLQotCi0gIC8qIGhpbnQgZGlyZWN0aW9ucyAtLSB0aGUgdmFsdWVzIGFyZSBjb21wdXRlZCBzbyB0aGF0IHR3byB2ZWN0b3JzIGFyZSAqLwotICAvKiBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zIGlmZiBgZGlyMSArIGRpcjIgPT0gMCcgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBBRl9EaXJlY3Rpb25fCi0gIHsKLSAgICBBRl9ESVJfTk9ORSAgPSAgNCwKLSAgICBBRl9ESVJfUklHSFQgPSAgMSwKLSAgICBBRl9ESVJfTEVGVCAgPSAtMSwKLSAgICBBRl9ESVJfVVAgICAgPSAgMiwKLSAgICBBRl9ESVJfRE9XTiAgPSAtMgotCi0gIH0gQUZfRGlyZWN0aW9uOwotCi0KLSAgLyogcG9pbnQgaGludCBmbGFncyAqLwotICB0eXBlZGVmIGVudW0gIEFGX0ZsYWdzXwotICB7Ci0gICAgQUZfRkxBR19OT05FID0gMCwKLQotICAgIC8qIHBvaW50IHR5cGUgZmxhZ3MgKi8KLSAgICBBRl9GTEFHX0NPTklDICAgPSAxIDw8IDAsCi0gICAgQUZfRkxBR19DVUJJQyAgID0gMSA8PCAxLAotICAgIEFGX0ZMQUdfQ09OVFJPTCA9IEFGX0ZMQUdfQ09OSUMgfCBBRl9GTEFHX0NVQklDLAotCi0gICAgLyogcG9pbnQgZXh0cmVtdW0gZmxhZ3MgKi8KLSAgICBBRl9GTEFHX0VYVFJFTUFfWCA9IDEgPDwgMiwKLSAgICBBRl9GTEFHX0VYVFJFTUFfWSA9IDEgPDwgMywKLQotICAgIC8qIHBvaW50IHJvdW5kbmVzcyBmbGFncyAqLwotICAgIEFGX0ZMQUdfUk9VTkRfWCA9IDEgPDwgNCwKLSAgICBBRl9GTEFHX1JPVU5EX1kgPSAxIDw8IDUsCi0KLSAgICAvKiBwb2ludCB0b3VjaCBmbGFncyAqLwotICAgIEFGX0ZMQUdfVE9VQ0hfWCA9IDEgPDwgNiwKLSAgICBBRl9GTEFHX1RPVUNIX1kgPSAxIDw8IDcsCi0KLSAgICAvKiBjYW5kaWRhdGVzIGZvciB3ZWFrIGludGVycG9sYXRpb24gaGF2ZSB0aGlzIGZsYWcgc2V0ICovCi0gICAgQUZfRkxBR19XRUFLX0lOVEVSUE9MQVRJT04gPSAxIDw8IDgsCi0KLSAgICAvKiBhbGwgaW5mbGVjdGlvbiBwb2ludHMgaW4gdGhlIG91dGxpbmUgaGF2ZSB0aGlzIGZsYWcgc2V0ICovCi0gICAgQUZfRkxBR19JTkZMRUNUSU9OID0gMSA8PCA5Ci0KLSAgfSBBRl9GbGFnczsKLQotCi0gIC8qIGVkZ2UgaGludCBmbGFncyAqLwotICB0eXBlZGVmIGVudW0gIEFGX0VkZ2VfRmxhZ3NfCi0gIHsKLSAgICBBRl9FREdFX05PUk1BTCA9IDAsCi0gICAgQUZfRURHRV9ST1VORCAgPSAxIDw8IDAsCi0gICAgQUZfRURHRV9TRVJJRiAgPSAxIDw8IDEsCi0gICAgQUZfRURHRV9ET05FICAgPSAxIDw8IDIKLQotICB9IEFGX0VkZ2VfRmxhZ3M7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBBRl9Qb2ludFJlY18qICAgIEFGX1BvaW50OwotICB0eXBlZGVmIHN0cnVjdCBBRl9TZWdtZW50UmVjXyogIEFGX1NlZ21lbnQ7Ci0gIHR5cGVkZWYgc3RydWN0IEFGX0VkZ2VSZWNfKiAgICAgQUZfRWRnZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9Qb2ludFJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgZmxhZ3M7ICAgIC8qIHBvaW50IGZsYWdzIHVzZWQgYnkgaGludGVyICAgKi8KLSAgICBGVF9DaGFyICAgIGluX2RpcjsgICAvKiBkaXJlY3Rpb24gb2YgaW53YXJkcyB2ZWN0b3IgICovCi0gICAgRlRfQ2hhciAgICBvdXRfZGlyOyAgLyogZGlyZWN0aW9uIG9mIG91dHdhcmRzIHZlY3RvciAqLwotCi0gICAgRlRfUG9zICAgICBveCwgb3k7ICAgLyogb3JpZ2luYWwsIHNjYWxlZCBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1Nob3J0ICAgZngsIGZ5OyAgIC8qIG9yaWdpbmFsLCB1bnNjYWxlZCBwb3NpdGlvbiAoZm9udCB1bml0cykgICAgKi8KLSAgICBGVF9Qb3MgICAgIHgsIHk7ICAgICAvKiBjdXJyZW50IHBvc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfUG9zICAgICB1LCB2OyAgICAgLyogY3VycmVudCAoeCx5KSBvciAoeSx4KSBkZXBlbmRpbmcgb24gY29udGV4dCAqLwotCi0gICAgQUZfUG9pbnQgICBuZXh0OyAgICAgLyogbmV4dCBwb2ludCBpbiBjb250b3VyICAgICAqLwotICAgIEFGX1BvaW50ICAgcHJldjsgICAgIC8qIHByZXZpb3VzIHBvaW50IGluIGNvbnRvdXIgKi8KLQotICB9IEFGX1BvaW50UmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX1NlZ21lbnRSZWNfCi0gIHsKLSAgICBGVF9CeXRlICAgICBmbGFnczsgICAgICAgLyogZWRnZS9zZWdtZW50IGZsYWdzIGZvciB0aGlzIHNlZ21lbnQgKi8KLSAgICBGVF9DaGFyICAgICBkaXI7ICAgICAgICAgLyogc2VnbWVudCBkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgICBwb3M7ICAgICAgICAgLyogcG9zaXRpb24gb2Ygc2VnbWVudCAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgICBtaW5fY29vcmQ7ICAgLyogbWluaW11bSBjb29yZGluYXRlIG9mIHNlZ21lbnQgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgICBtYXhfY29vcmQ7ICAgLyogbWF4aW11bSBjb29yZGluYXRlIG9mIHNlZ21lbnQgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgICBoZWlnaHQ7ICAgICAgLyogdGhlIGhpbnRlZCBzZWdtZW50IGhlaWdodCAgICAgICAgICAgKi8KLQotICAgIEFGX0VkZ2UgICAgIGVkZ2U7ICAgICAgICAvKiB0aGUgc2VnbWVudCdzIHBhcmVudCBlZGdlICAgICAgICAgICAqLwotICAgIEFGX1NlZ21lbnQgIGVkZ2VfbmV4dDsgICAvKiBsaW5rIHRvIG5leHQgc2VnbWVudCBpbiBwYXJlbnQgZWRnZSAqLwotCi0gICAgQUZfU2VnbWVudCAgbGluazsgICAgICAgIC8qIChzdGVtKSBsaW5rIHNlZ21lbnQgICAgICAgICovCi0gICAgQUZfU2VnbWVudCAgc2VyaWY7ICAgICAgIC8qIHByaW1hcnkgc2VnbWVudCBmb3Igc2VyaWZzICovCi0gICAgRlRfUG9zICAgICAgbnVtX2xpbmtlZDsgIC8qIG51bWJlciBvZiBsaW5rZWQgc2VnbWVudHMgICovCi0gICAgRlRfUG9zICAgICAgc2NvcmU7ICAgICAgIC8qIHVzZWQgZHVyaW5nIHN0ZW0gbWF0Y2hpbmcgICovCi0gICAgRlRfUG9zICAgICAgbGVuOyAgICAgICAgIC8qIHVzZWQgZHVyaW5nIHN0ZW0gbWF0Y2hpbmcgICovCi0KLSAgICBBRl9Qb2ludCAgICBmaXJzdDsgICAgICAgLyogZmlyc3QgcG9pbnQgaW4gZWRnZSBzZWdtZW50ICAgICAgICAgICAgICovCi0gICAgQUZfUG9pbnQgICAgbGFzdDsgICAgICAgIC8qIGxhc3QgcG9pbnQgaW4gZWRnZSBzZWdtZW50ICAgICAgICAgICAgICAqLwotICAgIEFGX1BvaW50KiAgIGNvbnRvdXI7ICAgICAvKiBwdHIgdG8gZmlyc3QgcG9pbnQgb2Ygc2VnbWVudCdzIGNvbnRvdXIgKi8KLQotICB9IEFGX1NlZ21lbnRSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfRWRnZVJlY18KLSAgewotICAgIEZUX1Nob3J0ICAgIGZwb3M7ICAgICAgIC8qIG9yaWdpbmFsLCB1bnNjYWxlZCBwb3NpdGlvbiAoZm9udCB1bml0cykgKi8KLSAgICBGVF9Qb3MgICAgICBvcG9zOyAgICAgICAvKiBvcmlnaW5hbCwgc2NhbGVkIHBvc2l0aW9uICAgICAgICAgICAgICAgICovCi0gICAgRlRfUG9zICAgICAgcG9zOyAgICAgICAgLyogY3VycmVudCBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfQnl0ZSAgICAgZmxhZ3M7ICAgICAgLyogZWRnZSBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9DaGFyICAgICBkaXI7ICAgICAgICAvKiBlZGdlIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0ZpeGVkICAgIHNjYWxlOyAgICAgIC8qIHVzZWQgdG8gc3BlZWQgdXAgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGVkZ2VzICovCi0gICAgQUZfV2lkdGggICAgYmx1ZV9lZGdlOyAgLyogbm9uLU5VTEwgaWYgdGhpcyBpcyBhIGJsdWUgZWRnZSAgICAgICAgICAgICAgKi8KLQotICAgIEFGX0VkZ2UgICAgIGxpbms7Ci0gICAgQUZfRWRnZSAgICAgc2VyaWY7Ci0gICAgRlRfU2hvcnQgICAgbnVtX2xpbmtlZDsKLQotICAgIEZUX0ludCAgICAgIHNjb3JlOwotCi0gICAgQUZfU2VnbWVudCAgZmlyc3Q7Ci0gICAgQUZfU2VnbWVudCAgbGFzdDsKLQotICB9IEFGX0VkZ2VSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfQXhpc0hpbnRzUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICAgICBudW1fc2VnbWVudHM7Ci0gICAgRlRfSW50ICAgICAgICBtYXhfc2VnbWVudHM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50czsKLSNpZmRlZiBBRl9TT1JUX1NFR01FTlRTCi0gICAgRlRfSW50ICAgICAgICBtaWRfc2VnbWVudHM7Ci0jZW5kaWYKLQotICAgIEZUX0ludCAgICAgICAgbnVtX2VkZ2VzOwotICAgIEZUX0ludCAgICAgICAgbWF4X2VkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZXM7Ci0KLSAgICBBRl9EaXJlY3Rpb24gIG1ham9yX2RpcjsKLQotICB9IEFGX0F4aXNIaW50c1JlYywgKkFGX0F4aXNIaW50czsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9HbHlwaEhpbnRzUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5OwotCi0gICAgRlRfRml4ZWQgICAgICAgICAgeF9zY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgICAgICB4X2RlbHRhOwotCi0gICAgRlRfRml4ZWQgICAgICAgICAgeV9zY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgICAgICB5X2RlbHRhOwotCi0gICAgRlRfUG9zICAgICAgICAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICBtYXhfcG9pbnRzOwotICAgIEZUX0ludCAgICAgICAgICAgIG51bV9wb2ludHM7Ci0gICAgQUZfUG9pbnQgICAgICAgICAgcG9pbnRzOwotCi0gICAgRlRfSW50ICAgICAgICAgICAgbWF4X2NvbnRvdXJzOwotICAgIEZUX0ludCAgICAgICAgICAgIG51bV9jb250b3VyczsKLSAgICBBRl9Qb2ludCogICAgICAgICBjb250b3VyczsKLQotICAgIEFGX0F4aXNIaW50c1JlYyAgIGF4aXNbQUZfRElNRU5TSU9OX01BWF07Ci0KLSAgICBGVF9VSW50MzIgICAgICAgICBzY2FsZXJfZmxhZ3M7ICAvKiBjb3B5IG9mIHNjYWxlciBmbGFncyAgICAgKi8KLSAgICBGVF9VSW50MzIgICAgICAgICBvdGhlcl9mbGFnczsgICAvKiBmcmVlIGZvciBzY3JpcHQtc3BlY2lmaWMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbXBsZW1lbnRhdGlvbnMgICAgICAgICAgKi8KLSAgICBBRl9TY3JpcHRNZXRyaWNzICBtZXRyaWNzOwotCi0gICAgRlRfUG9zICAgICAgICAgICAgeG1pbl9kZWx0YTsgICAgLyogdXNlZCBmb3Igd2FycGluZyAqLwotICAgIEZUX1BvcyAgICAgICAgICAgIHhtYXhfZGVsdGE7Ci0gICAgCi0gIH0gQUZfR2x5cGhIaW50c1JlYzsKLQotCi0jZGVmaW5lIEFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBmICkgICggKGgpLT5zY2FsZXJfZmxhZ3MgJiAoZikgKQotI2RlZmluZSBBRl9ISU5UU19URVNUX09USEVSKCBoLCBmICkgICAoIChoKS0+b3RoZXJfZmxhZ3MgICYgKGYpICkKLQotCi0jaWZkZWYgQUZfREVCVUcKLQotI2RlZmluZSBBRl9ISU5UU19ET19IT1JJWk9OVEFMKCBoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggIV9hZl9kZWJ1Z19kaXNhYmxlX2hvcnpfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAotICAgICAgICAgICAgIUFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBBRl9TQ0FMRVJfRkxBR19OT19IT1JJWk9OVEFMICkgKQotCi0jZGVmaW5lIEFGX0hJTlRTX0RPX1ZFUlRJQ0FMKCBoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggIV9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKLSAgICAgICAgICAgICFBRl9ISU5UU19URVNUX1NDQUxFUiggaCwgQUZfU0NBTEVSX0ZMQUdfTk9fVkVSVElDQUwgKSApCi0KLSNkZWZpbmUgQUZfSElOVFNfRE9fQURWQU5DRSggaCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIUFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBBRl9TQ0FMRVJfRkxBR19OT19BRFZBTkNFICkKLQotI2RlZmluZSBBRl9ISU5UU19ET19CTFVFUyggaCApICAoICFfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzICkKLQotI2Vsc2UgLyogIUFGX0RFQlVHICovCi0KLSNkZWZpbmUgQUZfSElOVFNfRE9fSE9SSVpPTlRBTCggaCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIUFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBBRl9TQ0FMRVJfRkxBR19OT19IT1JJWk9OVEFMICkKLQotI2RlZmluZSBBRl9ISU5UU19ET19WRVJUSUNBTCggaCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIUFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBBRl9TQ0FMRVJfRkxBR19OT19WRVJUSUNBTCApCi0KLSNkZWZpbmUgQUZfSElOVFNfRE9fQURWQU5DRSggaCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIUFGX0hJTlRTX1RFU1RfU0NBTEVSKCBoLCBBRl9TQ0FMRVJfRkxBR19OT19BRFZBTkNFICkKLQotI2RlZmluZSBBRl9ISU5UU19ET19CTFVFUyggaCApICAxCi0KLSNlbmRpZiAvKiAhQUZfREVCVUcgKi8KLQotCi0gIEZUX0xPQ0FMKCBBRl9EaXJlY3Rpb24gKQotICBhZl9kaXJlY3Rpb25fY29tcHV0ZSggRlRfUG9zICBkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgZHkgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmX2F4aXNfaGludHNfbmV3X3NlZ21lbnQoIEFGX0F4aXNIaW50cyAgYXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NlZ21lbnQgICAqYXNlZ21lbnQgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IpCi0gIGFmX2F4aXNfaGludHNfbmV3X2VkZ2UoIEFGX0F4aXNIaW50cyAgYXhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBmcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaXJlY3Rpb24gIGRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAqZWRnZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfaW5pdCggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApOwotCi0KLQotICAvKgotICAgKiAgcmVjb21wdXRlIGFsbCBBRl9Qb2ludCBpbiBhIEFGX0dseXBoSGludHMgZnJvbSB0aGUgZGVmaW5pdGlvbnMKLSAgICogIGluIGEgc291cmNlIG91dGxpbmUKLSAgICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfcmVzY2FsZSggQUZfR2x5cGhIaW50cyAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjcmlwdE1ldHJpY3MgIG1ldHJpY3MgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9nbHlwaF9oaW50c19yZWxvYWQoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgZ2V0X2luZmxlY3Rpb25zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19zYXZlKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgb3V0bGluZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfZ2x5cGhfaGludHNfYWxpZ25fZWRnZV9wb2ludHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19hbGlnbl9zdHJvbmdfcG9pbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19hbGlnbl93ZWFrX3BvaW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKTsKLQotI2lmZGVmIEFGX1VTRV9XQVJQRVIKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19zY2FsZV9kaW0oIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICBkZWx0YSApOwotI2VuZGlmCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9nbHlwaF9oaW50c19kb25lKCBBRl9HbHlwaEhpbnRzICBoaW50cyApOwotCi0vKiAqLwotCi0jZGVmaW5lIEFGX1NFR01FTlRfTEVOKCBzZWcgKSAgICAgICAgICAoIChzZWcpLT5tYXhfY29vcmQgLSAoc2VnKS0+bWluX2Nvb3JkICkKLQotI2RlZmluZSBBRl9TRUdNRU5UX0RJU1QoIHNlZzEsIHNlZzIgKSAgKCAoIChzZWcxKS0+cG9zID4gKHNlZzIpLT5wb3MgKSAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChzZWcxKS0+cG9zIC0gKHNlZzIpLT5wb3MgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoc2VnMiktPnBvcyAtIChzZWcxKS0+cG9zICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0FGSElOVFNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmluZGljLmMgYi9zcmMvYXV0b2ZpdC9hZmluZGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjdmNTIuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZpbmRpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmaW5kaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBJbmRpYyBzY3JpcHRzIChib2R5KS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmFodWwgQmhhbGVyYW8gPHJhaHVsLmJoYWxlcmFvQHJlZGhhdC5jb20+LCA8Yi5yYWh1bC5wbUBnbWFpbC5jb20+LiAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImFmdHlwZXMuaCIKLSNpbmNsdWRlICJhZmxhdGluLmgiCi0KLQotI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fSU5ESUMKLQotI2luY2x1ZGUgImFmaW5kaWMuaCIKLSNpbmNsdWRlICJhZmVycm9ycy5oIgotI2luY2x1ZGUgImFmY2prLmgiCi0KLQotI2lmZGVmIEFGX1VTRV9XQVJQRVIKLSNpbmNsdWRlICJhZndhcnAuaCIKLSNlbmRpZgotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2luZGljX21ldHJpY3NfaW5pdCggQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSApCi0gIHsKLSAgICAvKiB1c2UgQ0pLIHJvdXRpbmVzICovCi0gICAgcmV0dXJuIGFmX2Nqa19tZXRyaWNzX2luaXQoIG1ldHJpY3MsIGZhY2UgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfaW5kaWNfbWV0cmljc19zY2FsZSggQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TY2FsZXIgICAgICAgIHNjYWxlciApCi0gIHsKLSAgICAvKiB1c2UgQ0pLIHJvdXRpbmVzICovCi0gICAgYWZfY2prX21ldHJpY3Nfc2NhbGUoIG1ldHJpY3MsIHNjYWxlciApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZfaW5kaWNfaGludHNfaW5pdCggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzICkKLSAgewotICAgIC8qIHVzZSBDSksgcm91dGluZXMgKi8KLSAgICByZXR1cm4gYWZfY2prX2hpbnRzX2luaXQoIGhpbnRzLCBtZXRyaWNzICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9pbmRpY19oaW50c19hcHBseSggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcykKLSAgewotICAgIC8qIHVzZSBDSksgcm91dGluZXMgKi8KLSAgICByZXR1cm4gYWZfY2prX2hpbnRzX2FwcGx5KCBoaW50cywgb3V0bGluZSwgbWV0cmljcyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgSSBOIEQgSSBDICAgUyBDIFIgSSBQIFQgICBDIEwgQSBTIFMgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX2luZGljX3VuaXJhbmdlc1tdID0KLSAgewotI2lmIDAKLSAgICB7IDB4MDEwMCwgIDB4RkZGRiB9LCAgLyogd2h5IHRoaXM/ICovCi0jZW5kaWYKLSAgICB7IDB4MDkwMCwgMHgwREZGfSwgICAgLyogSW5kaWMgUmFuZ2UgKi8KLSAgICB7IDAsICAgICAgIDAgfQotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2luZGljX3NjcmlwdF9jbGFzcyA9Ci0gIHsKLSAgICBBRl9TQ1JJUFRfSU5ESUMsCi0gICAgYWZfaW5kaWNfdW5pcmFuZ2VzLAotCi0gICAgc2l6ZW9mKCBBRl9MYXRpbk1ldHJpY3NSZWMgKSwKLQotICAgIChBRl9TY3JpcHRfSW5pdE1ldHJpY3NGdW5jKSBhZl9pbmRpY19tZXRyaWNzX2luaXQsCi0gICAgKEFGX1NjcmlwdF9TY2FsZU1ldHJpY3NGdW5jKWFmX2luZGljX21ldHJpY3Nfc2NhbGUsCi0gICAgKEFGX1NjcmlwdF9Eb25lTWV0cmljc0Z1bmMpIE5VTEwsCi0KLSAgICAoQUZfU2NyaXB0X0luaXRIaW50c0Z1bmMpICAgYWZfaW5kaWNfaGludHNfaW5pdCwKLSAgICAoQUZfU2NyaXB0X0FwcGx5SGludHNGdW5jKSAgYWZfaW5kaWNfaGludHNfYXBwbHkKLSAgfTsKLQotI2Vsc2UgLyogIUFGX0NPTkZJR19PUFRJT05fSU5ESUMgKi8KLQotICBzdGF0aWMgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9pbmRpY191bmlyYW5nZXNbXSA9Ci0gIHsKLSAgICB7IDAsIDAgfQotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2luZGljX3NjcmlwdF9jbGFzcyA9Ci0gIHsKLSAgICBBRl9TQ1JJUFRfSU5ESUMsCi0gICAgYWZfaW5kaWNfdW5pcmFuZ2VzLAotCi0gICAgc2l6ZW9mKCBBRl9MYXRpbk1ldHJpY3NSZWMgKSwKLQotICAgIChBRl9TY3JpcHRfSW5pdE1ldHJpY3NGdW5jKSBOVUxMLAotICAgIChBRl9TY3JpcHRfU2NhbGVNZXRyaWNzRnVuYylOVUxMLAotICAgIChBRl9TY3JpcHRfRG9uZU1ldHJpY3NGdW5jKSBOVUxMLAotCi0gICAgKEFGX1NjcmlwdF9Jbml0SGludHNGdW5jKSAgIE5VTEwsCi0gICAgKEFGX1NjcmlwdF9BcHBseUhpbnRzRnVuYykgIE5VTEwKLSAgfTsKLQotI2VuZGlmIC8qICFBRl9DT05GSUdfT1BUSU9OX0lORElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmluZGljLmggYi9zcmMvYXV0b2ZpdC9hZmluZGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDJiMjYuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZpbmRpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZpbmRpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIEluZGljIHNjcmlwdHMgKHNwZWNpZmljYXRpb24pLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSYWh1bCBCaGFsZXJhbyA8cmFodWwuYmhhbGVyYW9AcmVkaGF0LmNvbT4sIDxiLnJhaHVsLnBtQGdtYWlsLmNvbT4uICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQUZJTkRJQ19IX18KLSNkZWZpbmUgX19BRklORElDX0hfXwotCi0jaW5jbHVkZSAiYWZoaW50cy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogdGhlIEluZGljLXNwZWNpZmljIHNjcmlwdCBjbGFzcyAqLwotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2luZGljX3NjcmlwdF9jbGFzczsKLQotCi0vKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0FGSU5ESUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmxhdGluLmMgYi9zcmMvYXV0b2ZpdC9hZmxhdGluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MGRhMDYuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZsYXRpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmxhdGluLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgbGF0aW4gc2NyaXB0IChib2R5KS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJhZmxhdGluLmgiCi0jaW5jbHVkZSAiYWZlcnJvcnMuaCIKLQotCi0jaWZkZWYgQUZfVVNFX1dBUlBFUgotI2luY2x1ZGUgImFmd2FycC5oIgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICBMIEEgVCBJIE4gICBHIEwgTyBCIEEgTCAgIE0gRSBUIFIgSSBDIFMgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICBjaGFyY29kZSApCi0gIHsKLSAgICAvKiBzY2FuIHRoZSBhcnJheSBvZiBzZWdtZW50cyBpbiBlYWNoIGRpcmVjdGlvbiAqLwotICAgIEFGX0dseXBoSGludHNSZWMgIGhpbnRzWzFdOwotCi0KLSAgICBhZl9nbHlwaF9oaW50c19pbml0KCBoaW50cywgZmFjZS0+bWVtb3J5ICk7Ci0KLSAgICBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS53aWR0aF9jb3VudCA9IDA7Ci0gICAgbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0ud2lkdGhfY291bnQgPSAwOwotCi0gICAgewotICAgICAgRlRfRXJyb3IgICAgICAgICAgICAgZXJyb3I7Ci0gICAgICBGVF9VSW50ICAgICAgICAgICAgICBnbHlwaF9pbmRleDsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgIGRpbTsKLSAgICAgIEFGX0xhdGluTWV0cmljc1JlYyAgIGR1bW15WzFdOwotICAgICAgQUZfU2NhbGVyICAgICAgICAgICAgc2NhbGVyID0gJmR1bW15LT5yb290LnNjYWxlcjsKLQotCi0gICAgICBnbHlwaF9pbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCBjaGFyY29kZSApOwotICAgICAgaWYgKCBnbHlwaF9pbmRleCA9PSAwICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX05PX1NDQUxFICk7Ci0gICAgICBpZiAoIGVycm9yIHx8IGZhY2UtPmdseXBoLT5vdXRsaW5lLm5fcG9pbnRzIDw9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1pFUk8oIGR1bW15ICk7Ci0KLSAgICAgIGR1bW15LT51bml0c19wZXJfZW0gPSBtZXRyaWNzLT51bml0c19wZXJfZW07Ci0gICAgICBzY2FsZXItPnhfc2NhbGUgICAgID0gc2NhbGVyLT55X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBzY2FsZXItPnhfZGVsdGEgICAgID0gc2NhbGVyLT55X2RlbHRhID0gMDsKLSAgICAgIHNjYWxlci0+ZmFjZSAgICAgICAgPSBmYWNlOwotICAgICAgc2NhbGVyLT5yZW5kZXJfbW9kZSA9IEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLSAgICAgIHNjYWxlci0+ZmxhZ3MgICAgICAgPSAwOwotCi0gICAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgKEFGX1NjcmlwdE1ldHJpY3MpZHVtbXkgKTsKLQotICAgICAgZXJyb3IgPSBhZl9nbHlwaF9oaW50c19yZWxvYWQoIGhpbnRzLCAmZmFjZS0+Z2x5cGgtPm91dGxpbmUsIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZvciAoIGRpbSA9IDA7IGRpbSA8IEFGX0RJTUVOU0lPTl9NQVg7IGRpbSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfTGF0aW5BeGlzICBheGlzICAgID0gJm1ldHJpY3MtPmF4aXNbZGltXTsKLSAgICAgICAgQUZfQXhpc0hpbnRzICBheGhpbnRzID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgICAgIEFGX1NlZ21lbnQgICAgc2VnLCBsaW1pdCwgbGluazsKLSAgICAgICAgRlRfVUludCAgICAgICBudW1fd2lkdGhzID0gMDsKLQotCi0gICAgICAgIGVycm9yID0gYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyggaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0RpbWVuc2lvbilkaW0gKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGFmX2xhdGluX2hpbnRzX2xpbmtfc2VnbWVudHMoIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfRGltZW5zaW9uKWRpbSApOwotCi0gICAgICAgIHNlZyAgID0gYXhoaW50cy0+c2VnbWVudHM7Ci0gICAgICAgIGxpbWl0ID0gc2VnICsgYXhoaW50cy0+bnVtX3NlZ21lbnRzOwotCi0gICAgICAgIGZvciAoIDsgc2VnIDwgbGltaXQ7IHNlZysrICkKLSAgICAgICAgewotICAgICAgICAgIGxpbmsgPSBzZWctPmxpbms7Ci0KLSAgICAgICAgICAvKiB3ZSBvbmx5IGNvbnNpZGVyIHN0ZW0gc2VnbWVudHMgdGhlcmUhICovCi0gICAgICAgICAgaWYgKCBsaW5rICYmIGxpbmstPmxpbmsgPT0gc2VnICYmIGxpbmsgPiBzZWcgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICAgICAgICBkaXN0ID0gc2VnLT5wb3MgLSBsaW5rLT5wb3M7Ci0gICAgICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgICAgICBpZiAoIG51bV93aWR0aHMgPCBBRl9MQVRJTl9NQVhfV0lEVEhTICkKLSAgICAgICAgICAgICAgYXhpcy0+d2lkdGhzWyBudW1fd2lkdGhzKysgXS5vcmcgPSBkaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFmX3NvcnRfd2lkdGhzKCBudW1fd2lkdGhzLCBheGlzLT53aWR0aHMgKTsKLSAgICAgICAgYXhpcy0+d2lkdGhfY291bnQgPSBudW1fd2lkdGhzOwotICAgICAgfQotCi0gIEV4aXQ6Ci0gICAgICBmb3IgKCBkaW0gPSAwOyBkaW0gPCBBRl9ESU1FTlNJT05fTUFYOyBkaW0rKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0xhdGluQXhpcyAgYXhpcyA9ICZtZXRyaWNzLT5heGlzW2RpbV07Ci0gICAgICAgIEZUX1BvcyAgICAgICAgc3RkdzsKLQotCi0gICAgICAgIHN0ZHcgPSAoIGF4aXMtPndpZHRoX2NvdW50ID4gMCApCi0gICAgICAgICAgICAgICAgID8gYXhpcy0+d2lkdGhzWzBdLm9yZwotICAgICAgICAgICAgICAgICA6IEFGX0xBVElOX0NPTlNUQU5UKCBtZXRyaWNzLCA1MCApOwotCi0gICAgICAgIC8qIGxldCdzIHRyeSAyMCUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoICovCi0gICAgICAgIGF4aXMtPmVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gc3RkdyAvIDU7Ci0gICAgICAgIGF4aXMtPnN0YW5kYXJkX3dpZHRoICAgICAgICAgID0gc3RkdzsKLSAgICAgICAgYXhpcy0+ZXh0cmFfbGlnaHQgICAgICAgICAgICAgPSAwOwotICAgICAgfQotICAgIH0KLQotICAgIGFmX2dseXBoX2hpbnRzX2RvbmUoIGhpbnRzICk7Ci0gIH0KLQotCi0KLSNkZWZpbmUgQUZfTEFUSU5fTUFYX1RFU1RfQ0hBUkFDVEVSUyAgMTIKLQotCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCAgYWZfbGF0aW5fYmx1ZV9jaGFyc1tBRl9MQVRJTl9NQVhfQkxVRVNdID0KLSAgewotICAgICJUSEVaT0NRUyIsCi0gICAgIkhFWkxPQ1VTIiwKLSAgICAiZmlqa2RiaCIsCi0gICAgInh6cm9lc2MiLAotICAgICJ4enJvZXNjIiwKLSAgICAicHFnankiCi0gIH07Ci0KLQotICBzdGF0aWMgdm9pZAotICBhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgIGZhY2UgKQotICB7Ci0gICAgRlRfUG9zICAgICAgICBmbGF0cyBbQUZfTEFUSU5fTUFYX1RFU1RfQ0hBUkFDVEVSU107Ci0gICAgRlRfUG9zICAgICAgICByb3VuZHNbQUZfTEFUSU5fTUFYX1RFU1RfQ0hBUkFDVEVSU107Ci0gICAgRlRfSW50ICAgICAgICBudW1fZmxhdHM7Ci0gICAgRlRfSW50ICAgICAgICBudW1fcm91bmRzOwotICAgIEZUX0ludCAgICAgICAgYmI7Ci0gICAgQUZfTGF0aW5CbHVlICBibHVlOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgQUZfTGF0aW5BeGlzICBheGlzICA9ICZtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXTsKLSAgICBGVF9HbHlwaFNsb3QgIGdseXBoID0gZmFjZS0+Z2x5cGg7Ci0KLQotICAgIC8qIHdlIGNvbXB1dGUgdGhlIGJsdWVzIHNpbXBseSBieSBsb2FkaW5nIGVhY2ggY2hhcmFjdGVyIGZyb20gdGhlICAgICovCi0gICAgLyogJ2FmX2xhdGluX2JsdWVfY2hhcnNbYmx1ZXNdJyBzdHJpbmcsIHRoZW4gY29tcHV0ZSBpdHMgdG9wLW1vc3Qgb3IgKi8KLSAgICAvKiBib3R0b20tbW9zdCBwb2ludHMgKGRlcGVuZGluZyBvbiBgQUZfSVNfVE9QX0JMVUUnKSAgICAgICAgICAgICAgICAqLwotCi0gICAgQUZfTE9HKCggImJsdWUgem9uZXMgY29tcHV0YXRpb25cbiIgKSk7Ci0gICAgQUZfTE9HKCggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApKTsKLQotICAgIGZvciAoIGJiID0gMDsgYmIgPCBBRl9MQVRJTl9CTFVFX01BWDsgYmIrKyApCi0gICAgewotICAgICAgY29uc3QgY2hhciogIHAgICAgID0gYWZfbGF0aW5fYmx1ZV9jaGFyc1tiYl07Ci0gICAgICBjb25zdCBjaGFyKiAgbGltaXQgPSBwICsgQUZfTEFUSU5fTUFYX1RFU1RfQ0hBUkFDVEVSUzsKLSAgICAgIEZUX1BvcyogICAgICBibHVlX3JlZjsKLSAgICAgIEZUX1BvcyogICAgICBibHVlX3Nob290OwotCi0KLSAgICAgIEFGX0xPRygoICJibHVlICUzZDogIiwgYmIgKSk7Ci0KLSAgICAgIG51bV9mbGF0cyAgPSAwOwotICAgICAgbnVtX3JvdW5kcyA9IDA7Ci0KLSAgICAgIGZvciAoIDsgcCA8IGxpbWl0ICYmICpwOyBwKysgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleDsKLSAgICAgICAgRlRfSW50ICAgICAgYmVzdF9wb2ludCwgYmVzdF95LCBiZXN0X2ZpcnN0LCBiZXN0X2xhc3Q7Ci0gICAgICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICAgICAgRlRfQm9vbCAgICAgcm91bmQgPSAwOwotCi0KLSAgICAgICAgQUZfTE9HKCggIiclYyciLCAqcCApKTsKLQotICAgICAgICAvKiBsb2FkIHRoZSBjaGFyYWN0ZXIgaW4gdGhlIGZhY2UgLS0gc2tpcCB1bmtub3duIG9yIGVtcHR5IG9uZXMgKi8KLSAgICAgICAgZ2x5cGhfaW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleCggZmFjZSwgKEZUX1VJbnQpKnAgKTsKLSAgICAgICAgaWYgKCBnbHlwaF9pbmRleCA9PSAwICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX05PX1NDQUxFICk7Ci0gICAgICAgIGlmICggZXJyb3IgfHwgZ2x5cGgtPm91dGxpbmUubl9wb2ludHMgPD0gMCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogbm93IGNvbXB1dGUgbWluIG9yIG1heCBwb2ludCBpbmRpY2VzIGFuZCBjb29yZGluYXRlcyAqLwotICAgICAgICBwb2ludHMgICAgICA9IGdseXBoLT5vdXRsaW5lLnBvaW50czsKLSAgICAgICAgYmVzdF9wb2ludCAgPSAtMTsKLSAgICAgICAgYmVzdF95ICAgICAgPSAwOyAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgICAgICBiZXN0X2ZpcnN0ICA9IDA7ICAvKiBkaXR0byAqLwotICAgICAgICBiZXN0X2xhc3QgICA9IDA7ICAvKiBkaXR0byAqLwotCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIG5uOwotICAgICAgICAgIEZUX0ludCAgZmlyc3QgPSAwOwotICAgICAgICAgIEZUX0ludCAgbGFzdCAgPSAtMTsKLQotCi0gICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IGdseXBoLT5vdXRsaW5lLm5fY29udG91cnM7IGZpcnN0ID0gbGFzdCsxLCBubisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG9sZF9iZXN0X3BvaW50ID0gYmVzdF9wb2ludDsKLSAgICAgICAgICAgIEZUX0ludCAgcHA7Ci0KLQotICAgICAgICAgICAgbGFzdCA9IGdseXBoLT5vdXRsaW5lLmNvbnRvdXJzW25uXTsKLQotICAgICAgICAgICAgLyogQXZvaWQgc2luZ2xlLXBvaW50IGNvbnRvdXJzIHNpbmNlIHRoZXkgYXJlIG5ldmVyIHJhc3Rlcml6ZWQuICovCi0gICAgICAgICAgICAvKiBJbiBzb21lIGZvbnRzLCB0aGV5IGNvcnJlc3BvbmQgdG8gbWFyayBhdHRhY2htZW50IHBvaW50cyAgICAgKi8KLSAgICAgICAgICAgIC8qIHdoaWNoIGFyZSB3YXkgb3V0c2lkZSBvZiB0aGUgZ2x5cGgncyByZWFsIG91dGxpbmUuICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBsYXN0IDw9IGZpcnN0ICkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKCBBRl9MQVRJTl9JU19UT1BfQkxVRSggYmIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZvciAoIHBwID0gZmlyc3Q7IHBwIDw9IGxhc3Q7IHBwKysgKQotICAgICAgICAgICAgICAgIGlmICggYmVzdF9wb2ludCA8IDAgfHwgcG9pbnRzW3BwXS55ID4gYmVzdF95ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBiZXN0X3BvaW50ID0gcHA7Ci0gICAgICAgICAgICAgICAgICBiZXN0X3kgICAgID0gcG9pbnRzW3BwXS55OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm9yICggcHAgPSBmaXJzdDsgcHAgPD0gbGFzdDsgcHArKyApCi0gICAgICAgICAgICAgICAgaWYgKCBiZXN0X3BvaW50IDwgMCB8fCBwb2ludHNbcHBdLnkgPCBiZXN0X3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJlc3RfcG9pbnQgPSBwcDsKLSAgICAgICAgICAgICAgICAgIGJlc3RfeSAgICAgPSBwb2ludHNbcHBdLnk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGJlc3RfcG9pbnQgIT0gb2xkX2Jlc3RfcG9pbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBiZXN0X2ZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICAgIGJlc3RfbGFzdCAgPSBsYXN0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBBRl9MT0coKCAiJTVkIiwgYmVzdF95ICkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm93IGNoZWNrIHdoZXRoZXIgdGhlIHBvaW50IGJlbG9uZ3MgdG8gYSBzdHJhaWdodCBvciByb3VuZCAgICovCi0gICAgICAgIC8qIHNlZ21lbnQ7IHdlIGZpcnN0IG5lZWQgdG8gZmluZCBpbiB3aGljaCBjb250b3VyIHRoZSBleHRyZW11bSAqLwotICAgICAgICAvKiBsaWVzLCB0aGVuIGluc3BlY3QgaXRzIHByZXZpb3VzIGFuZCBuZXh0IHBvaW50cyAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBiZXN0X3BvaW50ID49IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBwcmV2LCBuZXh0OwotICAgICAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICAgICAgLyogbm93IGxvb2sgZm9yIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBwb2ludHMgdGhhdCBhcmUgbm90IG9uIHRoZSAqLwotICAgICAgICAgIC8qIHNhbWUgWSBjb29yZGluYXRlLiAgVGhyZXNob2xkIHRoZSBgY2xvc2VuZXNzJy4uLiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBwcmV2ID0gYmVzdF9wb2ludDsKLSAgICAgICAgICBuZXh0ID0gcHJldjsKLQotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwcmV2ID4gYmVzdF9maXJzdCApCi0gICAgICAgICAgICAgIHByZXYtLTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcHJldiA9IGJlc3RfbGFzdDsKLQotICAgICAgICAgICAgZGlzdCA9IHBvaW50c1twcmV2XS55IC0gYmVzdF95OwotICAgICAgICAgICAgaWYgKCBkaXN0IDwgLTUgfHwgZGlzdCA+IDUgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIH0gd2hpbGUgKCBwcmV2ICE9IGJlc3RfcG9pbnQgKTsKLQotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBuZXh0IDwgYmVzdF9sYXN0ICkKLSAgICAgICAgICAgICAgbmV4dCsrOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBuZXh0ID0gYmVzdF9maXJzdDsKLQotICAgICAgICAgICAgZGlzdCA9IHBvaW50c1tuZXh0XS55IC0gYmVzdF95OwotICAgICAgICAgICAgaWYgKCBkaXN0IDwgLTUgfHwgZGlzdCA+IDUgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIH0gd2hpbGUgKCBuZXh0ICE9IGJlc3RfcG9pbnQgKTsKLQotICAgICAgICAgIC8qIG5vdywgc2V0IHRoZSBgcm91bmQnIGZsYWcgZGVwZW5kaW5nIG9uIHRoZSBzZWdtZW50J3Mga2luZCAqLwotICAgICAgICAgIHJvdW5kID0gRlRfQk9PTCgKLSAgICAgICAgICAgIEZUX0NVUlZFX1RBRyggZ2x5cGgtPm91dGxpbmUudGFnc1twcmV2XSApICE9IEZUX0NVUlZFX1RBR19PTiB8fAotICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCBnbHlwaC0+b3V0bGluZS50YWdzW25leHRdICkgIT0gRlRfQ1VSVkVfVEFHX09OICk7Ci0KLSAgICAgICAgICBBRl9MT0coKCAiJWMgIiwgcm91bmQgPyAncicgOiAnZicgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHJvdW5kICkKLSAgICAgICAgICByb3VuZHNbbnVtX3JvdW5kcysrXSA9IGJlc3RfeTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZsYXRzW251bV9mbGF0cysrXSAgID0gYmVzdF95OwotICAgICAgfQotCi0gICAgICBBRl9MT0coKCAiXG4iICkpOwotCi0gICAgICBpZiAoIG51bV9mbGF0cyA9PSAwICYmIG51bV9yb3VuZHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICB3ZSBjb3VsZG4ndCBmaW5kIGEgc2luZ2xlIGdseXBoIHRvIGNvbXB1dGUgdGhpcyBibHVlIHpvbmUsCi0gICAgICAgICAqICB3ZSB3aWxsIHNpbXBseSBpZ25vcmUgaXQgdGhlbgotICAgICAgICAgKi8KLSAgICAgICAgQUZfTE9HKCggImVtcHR5IVxuIiApKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIGhhdmUgY29tcHV0ZWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBgcm91bmRzJyBhbmQgYGZsYXRzJyB0YWJsZXMsICovCi0gICAgICAvKiBub3cgZGV0ZXJtaW5lIHRoZSByZWZlcmVuY2UgYW5kIG92ZXJzaG9vdCBwb3NpdGlvbiBvZiB0aGUgYmx1ZSAtLSAqLwotICAgICAgLyogd2Ugc2ltcGx5IHRha2UgdGhlIG1lZGlhbiB2YWx1ZSBhZnRlciBhIHNpbXBsZSBzb3J0ICAgICAgICAgICAgICAgKi8KLSAgICAgIGFmX3NvcnRfcG9zKCBudW1fcm91bmRzLCByb3VuZHMgKTsKLSAgICAgIGFmX3NvcnRfcG9zKCBudW1fZmxhdHMsICBmbGF0cyApOwotCi0gICAgICBibHVlICAgICAgID0gJiBheGlzLT5ibHVlc1theGlzLT5ibHVlX2NvdW50XTsKLSAgICAgIGJsdWVfcmVmICAgPSAmIGJsdWUtPnJlZi5vcmc7Ci0gICAgICBibHVlX3Nob290ID0gJiBibHVlLT5zaG9vdC5vcmc7Ci0KLSAgICAgIGF4aXMtPmJsdWVfY291bnQrKzsKLQotICAgICAgaWYgKCBudW1fZmxhdHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpibHVlX3JlZiAgID0KLSAgICAgICAgKmJsdWVfc2hvb3QgPSByb3VuZHNbbnVtX3JvdW5kcyAvIDJdOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIG51bV9yb3VuZHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpibHVlX3JlZiAgID0KLSAgICAgICAgKmJsdWVfc2hvb3QgPSBmbGF0c1tudW1fZmxhdHMgLyAyXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmJsdWVfcmVmICAgPSBmbGF0c1tudW1fZmxhdHMgLyAyXTsKLSAgICAgICAgKmJsdWVfc2hvb3QgPSByb3VuZHNbbnVtX3JvdW5kcyAvIDJdOwotICAgICAgfQotCi0gICAgICAvKiB0aGVyZSBhcmUgc29tZXRpbWVzIHByb2JsZW1zOiBpZiB0aGUgb3ZlcnNob290IHBvc2l0aW9uIG9mIHRvcCAgICAgKi8KLSAgICAgIC8qIHpvbmVzIGlzIHVuZGVyIGl0cyByZWZlcmVuY2UgcG9zaXRpb24sIG9yIHRoZSBvcHBvc2l0ZSBmb3IgYm90dG9tICAqLwotICAgICAgLyogem9uZXMuICBXZSBtdXN0IHRodXMgY2hlY2sgZXZlcnl0aGluZyB0aGVyZSBhbmQgY29ycmVjdCB0aGUgZXJyb3JzICovCi0gICAgICBpZiAoICpibHVlX3Nob290ICE9ICpibHVlX3JlZiApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgIHJlZiAgICAgID0gKmJsdWVfcmVmOwotICAgICAgICBGVF9Qb3MgICBzaG9vdCAgICA9ICpibHVlX3Nob290OwotICAgICAgICBGVF9Cb29sICBvdmVyX3JlZiA9IEZUX0JPT0woIHNob290ID4gcmVmICk7Ci0KLQotICAgICAgICBpZiAoIEFGX0xBVElOX0lTX1RPUF9CTFVFKCBiYiApIF4gb3Zlcl9yZWYgKQotICAgICAgICAgICpibHVlX3Nob290ID0gKmJsdWVfcmVmID0gKCBzaG9vdCArIHJlZiApIC8gMjsKLSAgICAgIH0KLQotICAgICAgYmx1ZS0+ZmxhZ3MgPSAwOwotICAgICAgaWYgKCBBRl9MQVRJTl9JU19UT1BfQkxVRSggYmIgKSApCi0gICAgICAgIGJsdWUtPmZsYWdzIHw9IEFGX0xBVElOX0JMVUVfVE9QOwotCi0gICAgICAvKgotICAgICAgICogVGhlIGZvbGxvd2luZyBmbGFncyBpcyB1c2VkIGxhdGVyIHRvIGFkanVzdCB0aGUgeSBhbmQgeCBzY2FsZXMKLSAgICAgICAqIGluIG9yZGVyIHRvIG9wdGltaXplIHRoZSBwaXhlbCBncmlkIGFsaWdubWVudCBvZiB0aGUgdG9wIG9mIHNtYWxsCi0gICAgICAgKiBsZXR0ZXJzLgotICAgICAgICovCi0gICAgICBpZiAoIGJiID09IEFGX0xBVElOX0JMVUVfU01BTExfVE9QICkKLSAgICAgICAgYmx1ZS0+ZmxhZ3MgfD0gQUZfTEFUSU5fQkxVRV9BREpVU1RNRU5UOwotCi0gICAgICBBRl9MT0coKCAiLS0gcmVmID0gJWxkLCBzaG9vdCA9ICVsZFxuIiwgKmJsdWVfcmVmLCAqYmx1ZV9zaG9vdCApKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9sYXRpbl9tZXRyaWNzX2luaXQoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgIGZhY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSBBRl9FcnJfT2s7Ci0gICAgRlRfQ2hhck1hcCAgb2xkbWFwID0gZmFjZS0+Y2hhcm1hcDsKLSAgICBGVF9VSW50ICAgICBlZTsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9FbmNvZGluZyAgbGF0aW5fZW5jb2RpbmdzW10gPQotICAgIHsKLSAgICAgIEZUX0VOQ09ESU5HX1VOSUNPREUsCi0gICAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTiwKLSAgICAgIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJELAotICAgICAgRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMSwKLSAgICAgIEZUX0VOQ09ESU5HX05PTkUgIC8qIGVuZCBvZiBsaXN0ICovCi0gICAgfTsKLQotCi0gICAgbWV0cmljcy0+dW5pdHNfcGVyX2VtID0gZmFjZS0+dW5pdHNfcGVyX0VNOwotCi0gICAgLyogZG8gd2UgaGF2ZSBhIGxhdGluIGNoYXJtYXAgaW4gdGhlcmU/ICovCi0gICAgZm9yICggZWUgPSAwOyBsYXRpbl9lbmNvZGluZ3NbZWVdICE9IEZUX0VOQ09ESU5HX05PTkU7IGVlKysgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfU2VsZWN0X0NoYXJtYXAoIGZhY2UsIGxhdGluX2VuY29kaW5nc1tlZV0gKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIC8qIEZvciBub3csIGNvbXB1dGUgdGhlIHN0YW5kYXJkIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSB0aGUgYG8nLiAqLwotICAgICAgYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyggbWV0cmljcywgZmFjZSwgJ28nICk7Ci0gICAgICBhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMoIG1ldHJpY3MsIGZhY2UgKTsKLSAgICB9Ci0KLSAgICBGVF9TZXRfQ2hhcm1hcCggZmFjZSwgb2xkbWFwICk7Ci0gICAgcmV0dXJuIEFGX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0oIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgICAgc2NhbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgICBkaW0gKQotICB7Ci0gICAgRlRfRml4ZWQgICAgICBzY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgIGRlbHRhOwotICAgIEFGX0xhdGluQXhpcyAgYXhpczsKLSAgICBGVF9VSW50ICAgICAgIG5uOwotCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgc2NhbGUgPSBzY2FsZXItPnhfc2NhbGU7Ci0gICAgICBkZWx0YSA9IHNjYWxlci0+eF9kZWx0YTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNjYWxlID0gc2NhbGVyLT55X3NjYWxlOwotICAgICAgZGVsdGEgPSBzY2FsZXItPnlfZGVsdGE7Ci0gICAgfQotCi0gICAgYXhpcyA9ICZtZXRyaWNzLT5heGlzW2RpbV07Ci0KLSAgICBpZiAoIGF4aXMtPm9yZ19zY2FsZSA9PSBzY2FsZSAmJiBheGlzLT5vcmdfZGVsdGEgPT0gZGVsdGEgKQotICAgICAgcmV0dXJuOwotCi0gICAgYXhpcy0+b3JnX3NjYWxlID0gc2NhbGU7Ci0gICAgYXhpcy0+b3JnX2RlbHRhID0gZGVsdGE7Ci0KLSAgICAvKgotICAgICAqIGNvcnJlY3QgWCBhbmQgWSBzY2FsZSB0byBvcHRpbWl6ZSB0aGUgYWxpZ25tZW50IG9mIHRoZSB0b3Agb2Ygc21hbGwKLSAgICAgKiBsZXR0ZXJzIHRvIHRoZSBwaXhlbCBncmlkCi0gICAgICovCi0gICAgewotICAgICAgQUZfTGF0aW5BeGlzICBBeGlzID0gJm1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdOwotICAgICAgQUZfTGF0aW5CbHVlICBibHVlID0gTlVMTDsKLQotCi0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgQXhpcy0+Ymx1ZV9jb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggQXhpcy0+Ymx1ZXNbbm5dLmZsYWdzICYgQUZfTEFUSU5fQkxVRV9BREpVU1RNRU5UICkKLSAgICAgICAgewotICAgICAgICAgIGJsdWUgPSAmQXhpcy0+Ymx1ZXNbbm5dOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmx1ZSApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgc2NhbGVkID0gRlRfTXVsRml4KCBibHVlLT5zaG9vdC5vcmcsIHNjYWxlci0+eV9zY2FsZSApOwotICAgICAgICBGVF9Qb3MgIGZpdHRlZCA9ICggc2NhbGVkICsgNDAgKSAmIH42MzsKLQotCi0gICAgICAgIGlmICggc2NhbGVkICE9IGZpdHRlZCApCi0gICAgICAgIHsKLSNpZiAwCi0gICAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZml0dGVkIDwgc2NhbGVkICkKLSAgICAgICAgICAgICAgc2NhbGUgLT0gc2NhbGUgLyA1MDsgIC8qIHNjYWxlICo9IDAuOTggKi8KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNjYWxlID0gRlRfTXVsRGl2KCBzY2FsZSwgZml0dGVkLCBzY2FsZWQgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBheGlzLT5zY2FsZSA9IHNjYWxlOwotICAgIGF4aXMtPmRlbHRhID0gZGVsdGE7Ci0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIueF9zY2FsZSA9IHNjYWxlOwotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIueF9kZWx0YSA9IGRlbHRhOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIueV9zY2FsZSA9IHNjYWxlOwotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIueV9kZWx0YSA9IGRlbHRhOwotICAgIH0KLQotICAgIC8qIHNjYWxlIHRoZSBzdGFuZGFyZCB3aWR0aHMgKi8KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgYXhpcy0+d2lkdGhfY291bnQ7IG5uKysgKQotICAgIHsKLSAgICAgIEFGX1dpZHRoICB3aWR0aCA9IGF4aXMtPndpZHRocyArIG5uOwotCi0KLSAgICAgIHdpZHRoLT5jdXIgPSBGVF9NdWxGaXgoIHdpZHRoLT5vcmcsIHNjYWxlICk7Ci0gICAgICB3aWR0aC0+Zml0ID0gd2lkdGgtPmN1cjsKLSAgICB9Ci0KLSAgICAvKiBhbiBleHRyYS1saWdodCBheGlzIGNvcnJlc3BvbmRzIHRvIGEgc3RhbmRhcmQgd2lkdGggdGhhdCBpcyAqLwotICAgIC8qIHNtYWxsZXIgdGhhbiAwLjc1IHBpeGVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgYXhpcy0+ZXh0cmFfbGlnaHQgPQotICAgICAgKEZUX0Jvb2wpKCBGVF9NdWxGaXgoIGF4aXMtPnN0YW5kYXJkX3dpZHRoLCBzY2FsZSApIDwgMzIgKyA4ICk7Ci0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCApCi0gICAgewotICAgICAgLyogc2NhbGUgdGhlIGJsdWUgem9uZXMgKi8KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBheGlzLT5ibHVlX2NvdW50OyBubisrICkKLSAgICAgIHsKLSAgICAgICAgQUZfTGF0aW5CbHVlICBibHVlID0gJmF4aXMtPmJsdWVzW25uXTsKLSAgICAgICAgRlRfUG9zICAgICAgICBkaXN0OwotCi0KLSAgICAgICAgYmx1ZS0+cmVmLmN1ciAgID0gRlRfTXVsRml4KCBibHVlLT5yZWYub3JnLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICAgIGJsdWUtPnJlZi5maXQgICA9IGJsdWUtPnJlZi5jdXI7Ci0gICAgICAgIGJsdWUtPnNob290LmN1ciA9IEZUX011bEZpeCggYmx1ZS0+c2hvb3Qub3JnLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICAgIGJsdWUtPnNob290LmZpdCA9IGJsdWUtPnNob290LmN1cjsKLSAgICAgICAgYmx1ZS0+ZmxhZ3MgICAgJj0gfkFGX0xBVElOX0JMVUVfQUNUSVZFOwotCi0gICAgICAgIC8qIGEgYmx1ZSB6b25lIGlzIG9ubHkgYWN0aXZlIGlmIGl0IGlzIGxlc3MgdGhhbiAzLzQgcGl4ZWxzIHRhbGwgKi8KLSAgICAgICAgZGlzdCA9IEZUX011bEZpeCggYmx1ZS0+cmVmLm9yZyAtIGJsdWUtPnNob290Lm9yZywgc2NhbGUgKTsKLSAgICAgICAgaWYgKCBkaXN0IDw9IDQ4ICYmIGRpc3QgPj0gLTQ4ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgZGVsdGExLCBkZWx0YTI7Ci0KLQotICAgICAgICAgIGRlbHRhMSA9IGJsdWUtPnNob290Lm9yZyAtIGJsdWUtPnJlZi5vcmc7Ci0gICAgICAgICAgZGVsdGEyID0gZGVsdGExOwotICAgICAgICAgIGlmICggZGVsdGExIDwgMCApCi0gICAgICAgICAgICBkZWx0YTIgPSAtZGVsdGEyOwotCi0gICAgICAgICAgZGVsdGEyID0gRlRfTXVsRml4KCBkZWx0YTIsIHNjYWxlICk7Ci0KLSAgICAgICAgICBpZiAoIGRlbHRhMiA8IDMyICkKLSAgICAgICAgICAgIGRlbHRhMiA9IDA7Ci0gICAgICAgICAgZWxzZSBpZiAoIGRlbHRhMiA8IDY0ICkKLSAgICAgICAgICAgIGRlbHRhMiA9IDMyICsgKCAoICggZGVsdGEyIC0gMzIgKSArIDE2ICkgJiB+MzEgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkZWx0YTIgPSBGVF9QSVhfUk9VTkQoIGRlbHRhMiApOwotCi0gICAgICAgICAgaWYgKCBkZWx0YTEgPCAwICkKLSAgICAgICAgICAgIGRlbHRhMiA9IC1kZWx0YTI7Ci0KLSAgICAgICAgICBibHVlLT5yZWYuZml0ICAgPSBGVF9QSVhfUk9VTkQoIGJsdWUtPnJlZi5jdXIgKTsKLSAgICAgICAgICBibHVlLT5zaG9vdC5maXQgPSBibHVlLT5yZWYuZml0ICsgZGVsdGEyOwotCi0gICAgICAgICAgYmx1ZS0+ZmxhZ3MgfD0gQUZfTEFUSU5fQkxVRV9BQ1RJVkU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2xhdGluX21ldHJpY3Nfc2NhbGUoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU2NhbGVyICAgICAgICBzY2FsZXIgKQotICB7Ci0gICAgbWV0cmljcy0+cm9vdC5zY2FsZXIucmVuZGVyX21vZGUgPSBzY2FsZXItPnJlbmRlcl9tb2RlOwotICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLmZhY2UgICAgICAgID0gc2NhbGVyLT5mYWNlOwotCi0gICAgYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW0oIG1ldHJpY3MsIHNjYWxlciwgQUZfRElNRU5TSU9OX0hPUlogKTsKLSAgICBhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbSggbWV0cmljcywgc2NhbGVyLCBBRl9ESU1FTlNJT05fVkVSVCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgIEwgQSBUIEkgTiAgIEcgTCBZIFAgSCAgIEEgTiBBIEwgWSBTIEkgUyAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSAgICAgICAgPSBoaW50cy0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgZXJyb3IgICAgICAgICA9IEFGX0Vycl9PazsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnQgICAgICAgPSBOVUxMOwotICAgIEFGX1NlZ21lbnRSZWMgc2VnMDsKLSAgICBBRl9Qb2ludCogICAgIGNvbnRvdXIgICAgICAgPSBoaW50cy0+Y29udG91cnM7Ci0gICAgQUZfUG9pbnQqICAgICBjb250b3VyX2xpbWl0ID0gY29udG91ciArIGhpbnRzLT5udW1fY29udG91cnM7Ci0gICAgQUZfRGlyZWN0aW9uICBtYWpvcl9kaXIsIHNlZ21lbnRfZGlyOwotCi0KLSAgICBGVF9aRVJPKCAmc2VnMCApOwotICAgIHNlZzAuc2NvcmUgPSAzMjAwMDsKLSAgICBzZWcwLmZsYWdzID0gQUZfRURHRV9OT1JNQUw7Ci0KLSAgICBtYWpvcl9kaXIgICA9IChBRl9EaXJlY3Rpb24pRlRfQUJTKCBheGlzLT5tYWpvcl9kaXIgKTsKLSAgICBzZWdtZW50X2RpciA9IG1ham9yX2RpcjsKLQotICAgIGF4aXMtPm51bV9zZWdtZW50cyA9IDA7Ci0KLSAgICAvKiBzZXQgdXAgKHUsdikgaW4gZWFjaCBwb2ludCAqLwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICB7Ci0gICAgICBBRl9Qb2ludCAgcG9pbnQgPSBoaW50cy0+cG9pbnRzOwotICAgICAgQUZfUG9pbnQgIGxpbWl0ID0gcG9pbnQgKyBoaW50cy0+bnVtX3BvaW50czsKLQotCi0gICAgICBmb3IgKCA7IHBvaW50IDwgbGltaXQ7IHBvaW50KysgKQotICAgICAgewotICAgICAgICBwb2ludC0+dSA9IHBvaW50LT5meDsKLSAgICAgICAgcG9pbnQtPnYgPSBwb2ludC0+Znk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBBRl9Qb2ludCAgcG9pbnQgPSBoaW50cy0+cG9pbnRzOwotICAgICAgQUZfUG9pbnQgIGxpbWl0ID0gcG9pbnQgKyBoaW50cy0+bnVtX3BvaW50czsKLQotCi0gICAgICBmb3IgKCA7IHBvaW50IDwgbGltaXQ7IHBvaW50KysgKQotICAgICAgewotICAgICAgICBwb2ludC0+dSA9IHBvaW50LT5meTsKLSAgICAgICAgcG9pbnQtPnYgPSBwb2ludC0+Zng7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogZG8gZWFjaCBjb250b3VyIHNlcGFyYXRlbHkgKi8KLSAgICBmb3IgKCA7IGNvbnRvdXIgPCBjb250b3VyX2xpbWl0OyBjb250b3VyKysgKQotICAgIHsKLSAgICAgIEFGX1BvaW50ICBwb2ludCAgID0gIGNvbnRvdXJbMF07Ci0gICAgICBBRl9Qb2ludCAgbGFzdCAgICA9ICBwb2ludC0+cHJldjsKLSAgICAgIGludCAgICAgICBvbl9lZGdlID0gIDA7Ci0gICAgICBGVF9Qb3MgICAgbWluX3BvcyA9ICAzMjAwMDsgIC8qIG1pbmltdW0gc2VnbWVudCBwb3MgIT0gbWluX2Nvb3JkICovCi0gICAgICBGVF9Qb3MgICAgbWF4X3BvcyA9IC0zMjAwMDsgIC8qIG1heGltdW0gc2VnbWVudCBwb3MgIT0gbWF4X2Nvb3JkICovCi0gICAgICBGVF9Cb29sICAgcGFzc2VkOwotCi0KLSAgICAgIGlmICggcG9pbnQgPT0gbGFzdCApICAvKiBza2lwIHNpbmdsZXRvbnMgLS0ganVzdCBpbiBjYXNlICovCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIEZUX0FCUyggbGFzdC0+b3V0X2RpciApICA9PSBtYWpvcl9kaXIgJiYKLSAgICAgICAgICAgRlRfQUJTKCBwb2ludC0+b3V0X2RpciApID09IG1ham9yX2RpciApCi0gICAgICB7Ci0gICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IG9uIGFuIGVkZ2UsIHRyeSB0byBsb2NhdGUgaXRzIHN0YXJ0ICovCi0gICAgICAgIGxhc3QgPSBwb2ludDsKLQotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgcG9pbnQgPSBwb2ludC0+cHJldjsKLSAgICAgICAgICBpZiAoIEZUX0FCUyggcG9pbnQtPm91dF9kaXIgKSAhPSBtYWpvcl9kaXIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCBwb2ludCA9PSBsYXN0ICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGxhc3QgICA9IHBvaW50OwotICAgICAgcGFzc2VkID0gMDsKLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICB1LCB2OwotCi0KLSAgICAgICAgaWYgKCBvbl9lZGdlICkKLSAgICAgICAgewotICAgICAgICAgIHUgPSBwb2ludC0+dTsKLSAgICAgICAgICBpZiAoIHUgPCBtaW5fcG9zICkKLSAgICAgICAgICAgIG1pbl9wb3MgPSB1OwotICAgICAgICAgIGlmICggdSA+IG1heF9wb3MgKQotICAgICAgICAgICAgbWF4X3BvcyA9IHU7Ci0KLSAgICAgICAgICBpZiAoIHBvaW50LT5vdXRfZGlyICE9IHNlZ21lbnRfZGlyIHx8IHBvaW50ID09IGxhc3QgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHdlIGFyZSBqdXN0IGxlYXZpbmcgYW4gZWRnZTsgcmVjb3JkIGEgbmV3IHNlZ21lbnQhICovCi0gICAgICAgICAgICBzZWdtZW50LT5sYXN0ID0gcG9pbnQ7Ci0gICAgICAgICAgICBzZWdtZW50LT5wb3MgID0gKEZUX1Nob3J0KSggKCBtaW5fcG9zICsgbWF4X3BvcyApID4+IDEgKTsKLQotICAgICAgICAgICAgLyogYSBzZWdtZW50IGlzIHJvdW5kIGlmIGVpdGhlciBpdHMgZmlyc3Qgb3IgbGFzdCBwb2ludCAqLwotICAgICAgICAgICAgLyogaXMgYSBjb250cm9sIHBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCAoIHNlZ21lbnQtPmZpcnN0LT5mbGFncyB8IHBvaW50LT5mbGFncyApICYKLSAgICAgICAgICAgICAgICAgICBBRl9GTEFHX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgIHNlZ21lbnQtPmZsYWdzIHw9IEFGX0VER0VfUk9VTkQ7Ci0KLSAgICAgICAgICAgIC8qIGNvbXB1dGUgc2VnbWVudCBzaXplICovCi0gICAgICAgICAgICBtaW5fcG9zID0gbWF4X3BvcyA9IHBvaW50LT52OwotCi0gICAgICAgICAgICB2ID0gc2VnbWVudC0+Zmlyc3QtPnY7Ci0gICAgICAgICAgICBpZiAoIHYgPCBtaW5fcG9zICkKLSAgICAgICAgICAgICAgbWluX3BvcyA9IHY7Ci0gICAgICAgICAgICBpZiAoIHYgPiBtYXhfcG9zICkKLSAgICAgICAgICAgICAgbWF4X3BvcyA9IHY7Ci0KLSAgICAgICAgICAgIHNlZ21lbnQtPm1pbl9jb29yZCA9IChGVF9TaG9ydCltaW5fcG9zOwotICAgICAgICAgICAgc2VnbWVudC0+bWF4X2Nvb3JkID0gKEZUX1Nob3J0KW1heF9wb3M7Ci0gICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgICAgPSAoRlRfU2hvcnQpKCBzZWdtZW50LT5tYXhfY29vcmQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC0+bWluX2Nvb3JkICk7Ci0KLSAgICAgICAgICAgIG9uX2VkZ2UgPSAwOwotICAgICAgICAgICAgc2VnbWVudCA9IE5VTEw7Ci0gICAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdyBleGl0IGlmIHdlIGFyZSBhdCB0aGUgc3RhcnQvZW5kIHBvaW50ICovCi0gICAgICAgIGlmICggcG9pbnQgPT0gbGFzdCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHBhc3NlZCApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBwYXNzZWQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhb25fZWRnZSAmJiBGVF9BQlMoIHBvaW50LT5vdXRfZGlyICkgPT0gbWFqb3JfZGlyICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHNlZ21lbnQhICovCi0gICAgICAgICAgc2VnbWVudF9kaXIgPSAoQUZfRGlyZWN0aW9uKXBvaW50LT5vdXRfZGlyOwotCi0gICAgICAgICAgLyogY2xlYXIgYWxsIHNlZ21lbnQgZmllbGRzICovCi0gICAgICAgICAgZXJyb3IgPSBhZl9heGlzX2hpbnRzX25ld19zZWdtZW50KCBheGlzLCBtZW1vcnksICZzZWdtZW50ICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBzZWdtZW50WzBdICAgICAgICA9IHNlZzA7Ci0gICAgICAgICAgc2VnbWVudC0+ZGlyICAgICAgPSAoRlRfQ2hhcilzZWdtZW50X2RpcjsKLSAgICAgICAgICBtaW5fcG9zID0gbWF4X3BvcyA9IHBvaW50LT51OwotICAgICAgICAgIHNlZ21lbnQtPmZpcnN0ICAgID0gcG9pbnQ7Ci0gICAgICAgICAgc2VnbWVudC0+bGFzdCAgICAgPSBwb2ludDsKLSAgICAgICAgICBzZWdtZW50LT5jb250b3VyICA9IGNvbnRvdXI7Ci0gICAgICAgICAgb25fZWRnZSAgICAgICAgICAgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLSAgICAgIH0KLQotICAgIH0gLyogY29udG91cnMgKi8KLQotCi0gICAgLyogbm93IHNsaWdodGx5IGluY3JlYXNlIHRoZSBoZWlnaHQgb2Ygc2VnbWVudHMgd2hlbiB0aGlzIG1ha2VzICovCi0gICAgLyogc2Vuc2UgLS0gdGhpcyBpcyB1c2VkIHRvIGJldHRlciBkZXRlY3QgYW5kIGlnbm9yZSBzZXJpZnMgICAgICovCi0gICAgewotICAgICAgQUZfU2VnbWVudCAgc2VnbWVudHMgICAgID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgICBBRl9TZWdtZW50ICBzZWdtZW50c19lbmQgPSBzZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50czsKLQotCi0gICAgICBmb3IgKCBzZWdtZW50ID0gc2VnbWVudHM7IHNlZ21lbnQgPCBzZWdtZW50c19lbmQ7IHNlZ21lbnQrKyApCi0gICAgICB7Ci0gICAgICAgIEFGX1BvaW50ICBmaXJzdCAgID0gc2VnbWVudC0+Zmlyc3Q7Ci0gICAgICAgIEFGX1BvaW50ICBsYXN0ICAgID0gc2VnbWVudC0+bGFzdDsKLSAgICAgICAgRlRfUG9zICAgIGZpcnN0X3YgPSBmaXJzdC0+djsKLSAgICAgICAgRlRfUG9zICAgIGxhc3RfdiAgPSBsYXN0LT52OwotCi0KLSAgICAgICAgaWYgKCBmaXJzdCA9PSBsYXN0ICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoIGZpcnN0X3YgPCBsYXN0X3YgKQotICAgICAgICB7Ci0gICAgICAgICAgQUZfUG9pbnQgIHA7Ci0KLQotICAgICAgICAgIHAgPSBmaXJzdC0+cHJldjsKLSAgICAgICAgICBpZiAoIHAtPnYgPCBmaXJzdF92ICkKLSAgICAgICAgICAgIHNlZ21lbnQtPmhlaWdodCA9IChGVF9TaG9ydCkoIHNlZ21lbnQtPmhlaWdodCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggZmlyc3RfdiAtIHAtPnYgKSA+PiAxICkgKTsKLQotICAgICAgICAgIHAgPSBsYXN0LT5uZXh0OwotICAgICAgICAgIGlmICggcC0+diA+IGxhc3RfdiApCi0gICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBzZWdtZW50LT5oZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHAtPnYgLSBsYXN0X3YgKSA+PiAxICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9Qb2ludCAgcDsKLQotCi0gICAgICAgICAgcCA9IGZpcnN0LT5wcmV2OwotICAgICAgICAgIGlmICggcC0+diA+IGZpcnN0X3YgKQotICAgICAgICAgICAgc2VnbWVudC0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggc2VnbWVudC0+aGVpZ2h0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCBwLT52IC0gZmlyc3RfdiApID4+IDEgKSApOwotCi0gICAgICAgICAgcCA9IGxhc3QtPm5leHQ7Ci0gICAgICAgICAgaWYgKCBwLT52IDwgbGFzdF92ICkKLSAgICAgICAgICAgIHNlZ21lbnQtPmhlaWdodCA9IChGVF9TaG9ydCkoIHNlZ21lbnQtPmhlaWdodCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggbGFzdF92IC0gcC0+diApID4+IDEgKSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sYXRpbl9oaW50c19saW5rX3NlZ21lbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgICAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMgICAgICA9IGF4aXMtPnNlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudF9saW1pdCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgIEZUX1BvcyAgICAgICAgbGVuX3RocmVzaG9sZCwgbGVuX3Njb3JlOwotICAgIEFGX1NlZ21lbnQgICAgc2VnMSwgc2VnMjsKLQotCi0gICAgbGVuX3RocmVzaG9sZCA9IEFGX0xBVElOX0NPTlNUQU5UKCBoaW50cy0+bWV0cmljcywgOCApOwotICAgIGlmICggbGVuX3RocmVzaG9sZCA9PSAwICkKLSAgICAgIGxlbl90aHJlc2hvbGQgPSAxOwotCi0gICAgbGVuX3Njb3JlID0gQUZfTEFUSU5fQ09OU1RBTlQoIGhpbnRzLT5tZXRyaWNzLCA2MDAwICk7Ci0KLSAgICAvKiBub3cgY29tcGFyZSBlYWNoIHNlZ21lbnQgdG8gdGhlIG90aGVycyAqLwotICAgIGZvciAoIHNlZzEgPSBzZWdtZW50czsgc2VnMSA8IHNlZ21lbnRfbGltaXQ7IHNlZzErKyApCi0gICAgewotICAgICAgLyogdGhlIGZha2Ugc2VnbWVudHMgYXJlIGludHJvZHVjZWQgdG8gaGludCB0aGUgbWV0cmljcyAtLSAqLwotICAgICAgLyogd2UgbXVzdCBuZXZlciBsaW5rIHRoZW0gdG8gYW55dGhpbmcgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBzZWcxLT5kaXIgIT0gYXhpcy0+bWFqb3JfZGlyIHx8IHNlZzEtPmZpcnN0ID09IHNlZzEtPmxhc3QgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgZm9yICggc2VnMiA9IHNlZ21lbnRzOyBzZWcyIDwgc2VnbWVudF9saW1pdDsgc2VnMisrICkKLSAgICAgICAgaWYgKCBzZWcxLT5kaXIgKyBzZWcyLT5kaXIgPT0gMCAmJiBzZWcyLT5wb3MgPiBzZWcxLT5wb3MgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICBwb3MxID0gc2VnMS0+cG9zOwotICAgICAgICAgIEZUX1BvcyAgcG9zMiA9IHNlZzItPnBvczsKLSAgICAgICAgICBGVF9Qb3MgIGRpc3QgPSBwb3MyIC0gcG9zMTsKLQotCi0gICAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIG1pbiA9IHNlZzEtPm1pbl9jb29yZDsKLSAgICAgICAgICAgIEZUX1BvcyAgbWF4ID0gc2VnMS0+bWF4X2Nvb3JkOwotICAgICAgICAgICAgRlRfUG9zICBsZW4sIHNjb3JlOwotCi0KLSAgICAgICAgICAgIGlmICggbWluIDwgc2VnMi0+bWluX2Nvb3JkICkKLSAgICAgICAgICAgICAgbWluID0gc2VnMi0+bWluX2Nvb3JkOwotCi0gICAgICAgICAgICBpZiAoIG1heCA+IHNlZzItPm1heF9jb29yZCApCi0gICAgICAgICAgICAgIG1heCA9IHNlZzItPm1heF9jb29yZDsKLQotICAgICAgICAgICAgbGVuID0gbWF4IC0gbWluOwotICAgICAgICAgICAgaWYgKCBsZW4gPj0gbGVuX3RocmVzaG9sZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjb3JlID0gZGlzdCArIGxlbl9zY29yZSAvIGxlbjsKLQotICAgICAgICAgICAgICBpZiAoIHNjb3JlIDwgc2VnMS0+c2NvcmUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VnMS0+c2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICBzZWcxLT5saW5rICA9IHNlZzI7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAoIHNjb3JlIDwgc2VnMi0+c2NvcmUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VnMi0+c2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICBzZWcyLT5saW5rICA9IHNlZzE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBub3csIGNvbXB1dGUgdGhlIGBzZXJpZicgc2VnbWVudHMgKi8KLSAgICBmb3IgKCBzZWcxID0gc2VnbWVudHM7IHNlZzEgPCBzZWdtZW50X2xpbWl0OyBzZWcxKysgKQotICAgIHsKLSAgICAgIHNlZzIgPSBzZWcxLT5saW5rOwotCi0gICAgICBpZiAoIHNlZzIgKQotICAgICAgewotICAgICAgICBpZiAoIHNlZzItPmxpbmsgIT0gc2VnMSApCi0gICAgICAgIHsKLSAgICAgICAgICBzZWcxLT5saW5rICA9IDA7Ci0gICAgICAgICAgc2VnMS0+c2VyaWYgPSBzZWcyLT5saW5rOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW5faGludHNfY29tcHV0ZV9lZGdlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3IgID0gQUZfRXJyX09rOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLSAgICBBRl9MYXRpbkF4aXMgIGxheGlzICA9ICYoKEFGX0xhdGluTWV0cmljcyloaW50cy0+bWV0cmljcyktPmF4aXNbZGltXTsKLQotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMgICAgICA9IGF4aXMtPnNlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudF9saW1pdCA9IHNlZ21lbnRzICsgYXhpcy0+bnVtX3NlZ21lbnRzOwotICAgIEFGX1NlZ21lbnQgICAgc2VnOwotCi0gICAgQUZfRGlyZWN0aW9uICB1cF9kaXI7Ci0gICAgRlRfRml4ZWQgICAgICBzY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkOwotICAgIEZUX1BvcyAgICAgICAgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkOwotCi0KLSAgICBheGlzLT5udW1fZWRnZXMgPSAwOwotCi0gICAgc2NhbGUgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApID8gaGludHMtPnhfc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoaW50cy0+eV9zY2FsZTsKLQotICAgIHVwX2RpciA9ICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkgPyBBRl9ESVJfVVAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQUZfRElSX1JJR0hUOwotCi0gICAgLyoKLSAgICAgKiAgV2UgaWdub3JlIGFsbCBzZWdtZW50cyB0aGF0IGFyZSBsZXNzIHRoYW4gMSBwaXhlbHMgaW4gbGVuZ3RoLAotICAgICAqICB0byBhdm9pZCBtYW55IHByb2JsZW1zIHdpdGggc2VyaWYgZm9udHMuICBXZSBjb21wdXRlIHRoZQotICAgICAqICBjb3JyZXNwb25kaW5nIHRocmVzaG9sZCBpbiBmb250IHVuaXRzLgotICAgICAqLwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkKLSAgICAgICAgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkID0gRlRfRGl2Rml4KCA2NCwgaGludHMtPnlfc2NhbGUgKTsKLSAgICBlbHNlCi0gICAgICAgIHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZCA9IDA7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2Ugd2lsbCBiZWdpbiBieSBnZW5lcmF0aW5nIGEgc29ydGVkIHRhYmxlIG9mIGVkZ2VzIGZvciB0aGUgICAgICAgKi8KLSAgICAvKiBjdXJyZW50IGRpcmVjdGlvbi4gIFRvIGRvIHNvLCB3ZSBzaW1wbHkgc2NhbiBlYWNoIHNlZ21lbnQgYW5kIHRyeSAqLwotICAgIC8qIHRvIGZpbmQgYW4gZWRnZSBpbiBvdXIgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBpdHMgcG9zaXRpb24uICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBJZiBubyBlZGdlIGlzIGZvdW5kLCB3ZSBjcmVhdGUgYW5kIGluc2VydCBhIG5ldyBlZGdlIGluIHRoZSAgICAgICAqLwotICAgIC8qIHNvcnRlZCB0YWJsZS4gIE90aGVyd2lzZSwgd2Ugc2ltcGx5IGFkZCB0aGUgc2VnbWVudCB0byB0aGUgZWRnZSdzICovCi0gICAgLyogbGlzdCB3aGljaCB3aWxsIGJlIHByb2Nlc3NlZCBpbiB0aGUgc2Vjb25kIHN0ZXAgdG8gY29tcHV0ZSB0aGUgICAgKi8KLSAgICAvKiBlZGdlJ3MgcHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogTm90ZSB0aGF0IHRoZSBlZGdlcyB0YWJsZSBpcyBzb3J0ZWQgYWxvbmcgdGhlIHNlZ21lbnQvZWRnZSAgICAgICAgKi8KLSAgICAvKiBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gRlRfTXVsRml4KCBsYXhpcy0+ZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlICk7Ci0gICAgaWYgKCBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA+IDY0IC8gNCApCi0gICAgICBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCA9IDY0IC8gNDsKLQotICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gRlRfRGl2Rml4KCBlZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgKTsKLQotICAgIGZvciAoIHNlZyA9IHNlZ21lbnRzOyBzZWcgPCBzZWdtZW50X2xpbWl0OyBzZWcrKyApCi0gICAgewotICAgICAgQUZfRWRnZSAgZm91bmQgPSAwOwotICAgICAgRlRfSW50ICAgZWU7Ci0KLQotICAgICAgaWYgKCBzZWctPmhlaWdodCA8IHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBBIHNwZWNpYWwgY2FzZSBmb3Igc2VyaWYgZWRnZXM6IElmIHRoZXkgYXJlIHNtYWxsZXIgdGhhbiAqLwotICAgICAgLyogMS41IHBpeGVscyB3ZSBpZ25vcmUgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggc2VnLT5zZXJpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAyICogc2VnLT5oZWlnaHQgPCAzICogc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIGxvb2sgZm9yIGFuIGVkZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc2VnbWVudCAqLwotICAgICAgZm9yICggZWUgPSAwOyBlZSA8IGF4aXMtPm51bV9lZGdlczsgZWUrKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0VkZ2UgIGVkZ2UgPSBheGlzLT5lZGdlcyArIGVlOwotICAgICAgICBGVF9Qb3MgICBkaXN0OwotCi0KLSAgICAgICAgZGlzdCA9IHNlZy0+cG9zIC0gZWRnZS0+ZnBvczsKLSAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgIGlmICggZGlzdCA8IGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkICYmIGVkZ2UtPmRpciA9PSBzZWctPmRpciApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3VuZCA9IGVkZ2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCAhZm91bmQgKQotICAgICAgewotICAgICAgICBBRl9FZGdlICBlZGdlOwotCi0KLSAgICAgICAgLyogaW5zZXJ0IGEgbmV3IGVkZ2UgaW4gdGhlIGxpc3QgYW5kICovCi0gICAgICAgIC8qIHNvcnQgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbiAgICAqLwotICAgICAgICBlcnJvciA9IGFmX2F4aXNfaGludHNfbmV3X2VkZ2UoIGF4aXMsIHNlZy0+cG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9EaXJlY3Rpb24pc2VnLT5kaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LCAmZWRnZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBuZXcgZWRnZSdzIGxpc3QgKi8KLSAgICAgICAgRlRfWkVSTyggZWRnZSApOwotCi0gICAgICAgIGVkZ2UtPmZpcnN0ICAgID0gc2VnOwotICAgICAgICBlZGdlLT5sYXN0ICAgICA9IHNlZzsKLSAgICAgICAgZWRnZS0+ZnBvcyAgICAgPSBzZWctPnBvczsKLSAgICAgICAgZWRnZS0+ZGlyICAgICAgPSBzZWctPmRpcjsKLSAgICAgICAgZWRnZS0+b3BvcyAgICAgPSBlZGdlLT5wb3MgPSBGVF9NdWxGaXgoIHNlZy0+cG9zLCBzY2FsZSApOwotICAgICAgICBzZWctPmVkZ2VfbmV4dCA9IHNlZzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogaWYgYW4gZWRnZSB3YXMgZm91bmQsIHNpbXBseSBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIGVkZ2UncyAqLwotICAgICAgICAvKiBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHNlZy0+ZWRnZV9uZXh0ICAgICAgICAgPSBmb3VuZC0+Zmlyc3Q7Ci0gICAgICAgIGZvdW5kLT5sYXN0LT5lZGdlX25leHQgPSBzZWc7Ci0gICAgICAgIGZvdW5kLT5sYXN0ICAgICAgICAgICAgPSBzZWc7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogR29vZCwgd2Ugd2lsbCBub3cgY29tcHV0ZSBlYWNoIGVkZ2UncyBwcm9wZXJ0aWVzIGFjY29yZGluZyB0byAgICAgKi8KLSAgICAvKiBzZWdtZW50cyBmb3VuZCBvbiBpdHMgcG9zaXRpb24uICBCYXNpY2FsbHksIHRoZXNlIGFyZTogICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIC0gZWRnZSdzIG1haW4gZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgLSBzdGVtIGVkZ2UsIHNlcmlmIGVkZ2Ugb3IgYm90aCAod2hpY2ggZGVmYXVsdHMgdG8gc3RlbSB0aGVuKSAgICAqLwotICAgIC8qICAtIHJvdW5kZWQgZWRnZSwgc3RyYWlnaHQgb3IgYm90aCAod2hpY2ggZGVmYXVsdHMgdG8gc3RyYWlnaHQpICAgICovCi0gICAgLyogIC0gbGluayBmb3IgZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIHNldCB0aGUgYGVkZ2UnIGZpZWxkIGluIGVhY2ggc2VnbWVudCAtLSB0aGlzIGlzICovCi0gICAgLyogcmVxdWlyZWQgaW4gb3JkZXIgdG8gY29tcHV0ZSBlZGdlIGxpbmtzICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBOb3RlIHRoYXQgcmVtb3ZpbmcgdGhpcyBsb29wIGFuZCBzZXR0aW5nIHRoZSBgZWRnZScgZmllbGQgb2YgZWFjaAotICAgICAqIHNlZ21lbnQgZGlyZWN0bHkgaW4gdGhlIGNvZGUgYWJvdmUgc2xvd3MgZG93biBleGVjdXRpb24gc3BlZWQgZm9yCi0gICAgICogc29tZSByZWFzb25zIG9uIHBsYXRmb3JtcyBsaWtlIHRoZSBTdW4uCi0gICAgICovCi0gICAgewotICAgICAgQUZfRWRnZSAgZWRnZXMgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgICAgQUZfRWRnZSAgZWRnZV9saW1pdCA9IGVkZ2VzICsgYXhpcy0+bnVtX2VkZ2VzOwotICAgICAgQUZfRWRnZSAgZWRnZTsKLQotCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBzZWcgPSBlZGdlLT5maXJzdDsKLSAgICAgICAgaWYgKCBzZWcgKQotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VnLT5lZGdlID0gZWRnZTsKLSAgICAgICAgICAgIHNlZyAgICAgICA9IHNlZy0+ZWRnZV9uZXh0OwotCi0gICAgICAgICAgfSB3aGlsZSAoIHNlZyAhPSBlZGdlLT5maXJzdCApOwotICAgICAgfQotCi0gICAgICAvKiBub3csIGNvbXB1dGUgZWFjaCBlZGdlIHByb3BlcnRpZXMgKi8KLSAgICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgaXNfcm91bmQgICAgPSAwOyAgLyogZG9lcyBpdCBjb250YWluIHJvdW5kIHNlZ21lbnRzPyAgICAqLwotICAgICAgICBGVF9JbnQgIGlzX3N0cmFpZ2h0ID0gMDsgIC8qIGRvZXMgaXQgY29udGFpbiBzdHJhaWdodCBzZWdtZW50cz8gKi8KLSAgICAgICAgRlRfUG9zICB1cHMgICAgICAgICA9IDA7ICAvKiBudW1iZXIgb2YgdXB3YXJkcyBzZWdtZW50cyAgICAgICAgICovCi0gICAgICAgIEZUX1BvcyAgZG93bnMgICAgICAgPSAwOyAgLyogbnVtYmVyIG9mIGRvd253YXJkcyBzZWdtZW50cyAgICAgICAqLwotCi0KLSAgICAgICAgc2VnID0gZWRnZS0+Zmlyc3Q7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIEZUX0Jvb2wgIGlzX3NlcmlmOwotCi0KLSAgICAgICAgICAvKiBjaGVjayBmb3Igcm91bmRuZXNzIG9mIHNlZ21lbnQgKi8KLSAgICAgICAgICBpZiAoIHNlZy0+ZmxhZ3MgJiBBRl9FREdFX1JPVU5EICkKLSAgICAgICAgICAgIGlzX3JvdW5kKys7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgaXNfc3RyYWlnaHQrKzsKLQotICAgICAgICAgIC8qIGNoZWNrIGZvciBzZWdtZW50IGRpcmVjdGlvbiAqLwotICAgICAgICAgIGlmICggc2VnLT5kaXIgPT0gdXBfZGlyICkKLSAgICAgICAgICAgIHVwcyAgICs9IHNlZy0+bWF4X2Nvb3JkLXNlZy0+bWluX2Nvb3JkOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRvd25zICs9IHNlZy0+bWF4X2Nvb3JkLXNlZy0+bWluX2Nvb3JkOwotCi0gICAgICAgICAgLyogY2hlY2sgZm9yIGxpbmtzIC0tIGlmIHNlZy0+c2VyaWYgaXMgc2V0LCB0aGVuIHNlZy0+bGluayBtdXN0ICovCi0gICAgICAgICAgLyogYmUgaWdub3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaXNfc2VyaWYgPSAoRlRfQm9vbCkoIHNlZy0+c2VyaWYgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPnNlcmlmLT5lZGdlICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5zZXJpZi0+ZWRnZSAhPSBlZGdlICk7Ci0KLSAgICAgICAgICBpZiAoICggc2VnLT5saW5rICYmIHNlZy0+bGluay0+ZWRnZSAhPSBOVUxMICkgfHwgaXNfc2VyaWYgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFGX0VkZ2UgICAgIGVkZ2UyOwotICAgICAgICAgICAgQUZfU2VnbWVudCAgc2VnMjsKLQotCi0gICAgICAgICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7Ci0gICAgICAgICAgICBzZWcyICA9IHNlZy0+bGluazsKLQotICAgICAgICAgICAgaWYgKCBpc19zZXJpZiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlZzIgID0gc2VnLT5zZXJpZjsKLSAgICAgICAgICAgICAgZWRnZTIgPSBlZGdlLT5zZXJpZjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBlZGdlMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1BvcyAgZWRnZV9kZWx0YTsKLSAgICAgICAgICAgICAgRlRfUG9zICBzZWdfZGVsdGE7Ci0KLQotICAgICAgICAgICAgICBlZGdlX2RlbHRhID0gZWRnZS0+ZnBvcyAtIGVkZ2UyLT5mcG9zOwotICAgICAgICAgICAgICBpZiAoIGVkZ2VfZGVsdGEgPCAwICkKLSAgICAgICAgICAgICAgICBlZGdlX2RlbHRhID0gLWVkZ2VfZGVsdGE7Ci0KLSAgICAgICAgICAgICAgc2VnX2RlbHRhID0gc2VnLT5wb3MgLSBzZWcyLT5wb3M7Ci0gICAgICAgICAgICAgIGlmICggc2VnX2RlbHRhIDwgMCApCi0gICAgICAgICAgICAgICAgc2VnX2RlbHRhID0gLXNlZ19kZWx0YTsKLQotICAgICAgICAgICAgICBpZiAoIHNlZ19kZWx0YSA8IGVkZ2VfZGVsdGEgKQotICAgICAgICAgICAgICAgIGVkZ2UyID0gc2VnMi0+ZWRnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZWRnZTIgPSBzZWcyLT5lZGdlOwotCi0gICAgICAgICAgICBpZiAoIGlzX3NlcmlmICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRnZS0+c2VyaWYgICA9IGVkZ2UyOwotICAgICAgICAgICAgICBlZGdlMi0+ZmxhZ3MgfD0gQUZfRURHRV9TRVJJRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZWRnZS0+bGluayAgPSBlZGdlMjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzZWcgPSBzZWctPmVkZ2VfbmV4dDsKLQotICAgICAgICB9IHdoaWxlICggc2VnICE9IGVkZ2UtPmZpcnN0ICk7Ci0KLSAgICAgICAgLyogc2V0IHRoZSByb3VuZC9zdHJhaWdodCBmbGFncyAqLwotICAgICAgICBlZGdlLT5mbGFncyA9IEFGX0VER0VfTk9STUFMOwotCi0gICAgICAgIGlmICggaXNfcm91bmQgPiAwICYmIGlzX3JvdW5kID49IGlzX3N0cmFpZ2h0ICkKLSAgICAgICAgICBlZGdlLT5mbGFncyB8PSBBRl9FREdFX1JPVU5EOwotCi0jaWYgMAotICAgICAgICAvKiBzZXQgdGhlIGVkZ2UncyBtYWluIGRpcmVjdGlvbiAqLwotICAgICAgICBlZGdlLT5kaXIgPSBBRl9ESVJfTk9ORTsKLQotICAgICAgICBpZiAoIHVwcyA+IGRvd25zICkKLSAgICAgICAgICBlZGdlLT5kaXIgPSAoRlRfQ2hhcil1cF9kaXI7Ci0KLSAgICAgICAgZWxzZSBpZiAoIHVwcyA8IGRvd25zICkKLSAgICAgICAgICBlZGdlLT5kaXIgPSAoRlRfQ2hhciktdXBfZGlyOwotCi0gICAgICAgIGVsc2UgaWYgKCB1cHMgPT0gZG93bnMgKQotICAgICAgICAgIGVkZ2UtPmRpciA9IDA7ICAvKiBib3RoIHVwIGFuZCBkb3duISAqLwotI2VuZGlmCi0KLSAgICAgICAgLyogZ2V0cyByaWQgb2Ygc2VyaWZzIGlmIGxpbmsgaXMgc2V0ICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFhYWDogVGhpcyBnZXRzIHJpZCBvZiBtYW55IHVucGxlYXNhbnQgYXJ0ZWZhY3RzISAqLwotICAgICAgICAvKiAgICAgIEV4YW1wbGU6IHRoZSBgYycgaW4gY291ci5wZmEgYXQgc2l6ZSAxMyAgICAgKi8KLQotICAgICAgICBpZiAoIGVkZ2UtPnNlcmlmICYmIGVkZ2UtPmxpbmsgKQotICAgICAgICAgIGVkZ2UtPnNlcmlmID0gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9sYXRpbl9oaW50c19kZXRlY3RfZmVhdHVyZXMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyggaGludHMsIGRpbSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBhZl9sYXRpbl9oaW50c19saW5rX3NlZ21lbnRzKCBoaW50cywgZGltICk7Ci0KLSAgICAgIGVycm9yID0gYWZfbGF0aW5faGludHNfY29tcHV0ZV9lZGdlcyggaGludHMsIGRpbSApOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfYmx1ZV9lZGdlcyggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgID0gJmhpbnRzLT5heGlzWyBBRl9ESU1FTlNJT05fVkVSVCBdOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZSAgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZV9saW1pdCA9IGVkZ2UgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgQUZfTGF0aW5BeGlzICBsYXRpbiAgICAgID0gJm1ldHJpY3MtPmF4aXNbIEFGX0RJTUVOU0lPTl9WRVJUIF07Ci0gICAgRlRfRml4ZWQgICAgICBzY2FsZSAgICAgID0gbGF0aW4tPnNjYWxlOwotCi0KLSAgICAvKiBjb21wdXRlIHdoaWNoIGJsdWUgem9uZXMgYXJlIGFjdGl2ZSwgaS5lLiBoYXZlIHRoZWlyIHNjYWxlZCAqLwotICAgIC8qIHNpemUgPCAzLzQgcGl4ZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBmb3IgZWFjaCBob3Jpem9udGFsIGVkZ2Ugc2VhcmNoIHRoZSBibHVlIHpvbmUgd2hpY2ggaXMgY2xvc2VzdCAqLwotICAgIGZvciAoIDsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgewotICAgICAgRlRfSW50ICAgIGJiOwotICAgICAgQUZfV2lkdGggIGJlc3RfYmx1ZSA9IE5VTEw7Ci0gICAgICBGVF9Qb3MgICAgYmVzdF9kaXN0OyAgLyogaW5pdGlhbCB0aHJlc2hvbGQgKi8KLQotCi0gICAgICAvKiBjb21wdXRlIHRoZSBpbml0aWFsIHRocmVzaG9sZCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBFTSBzaXplICovCi0gICAgICBiZXN0X2Rpc3QgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPnVuaXRzX3Blcl9lbSAvIDQwLCBzY2FsZSApOwotCi0gICAgICBpZiAoIGJlc3RfZGlzdCA+IDY0IC8gMiApCi0gICAgICAgIGJlc3RfZGlzdCA9IDY0IC8gMjsKLQotICAgICAgZm9yICggYmIgPSAwOyBiYiA8IEFGX0xBVElOX0JMVUVfTUFYOyBiYisrICkKLSAgICAgIHsKLSAgICAgICAgQUZfTGF0aW5CbHVlICBibHVlID0gbGF0aW4tPmJsdWVzICsgYmI7Ci0gICAgICAgIEZUX0Jvb2wgICAgICAgaXNfdG9wX2JsdWUsIGlzX21ham9yX2RpcjsKLQotCi0gICAgICAgIC8qIHNraXAgaW5hY3RpdmUgYmx1ZSB6b25lcyAoaS5lLiwgdGhvc2UgdGhhdCBhcmUgdG9vIHNtYWxsKSAqLwotICAgICAgICBpZiAoICEoIGJsdWUtPmZsYWdzICYgQUZfTEFUSU5fQkxVRV9BQ1RJVkUgKSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogaWYgaXQgaXMgYSB0b3Agem9uZSwgY2hlY2sgZm9yIHJpZ2h0IGVkZ2VzIC0tIGlmIGl0IGlzIGEgYm90dG9tICovCi0gICAgICAgIC8qIHpvbmUsIGNoZWNrIGZvciBsZWZ0IGVkZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogb2YgY291cnNlLCB0aGF0J3MgZm9yIFRydWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlzX3RvcF9ibHVlICA9IChGVF9CeXRlKSggKCBibHVlLT5mbGFncyAmIEFGX0xBVElOX0JMVUVfVE9QICkgIT0gMCApOwotICAgICAgICBpc19tYWpvcl9kaXIgPSBGVF9CT09MKCBlZGdlLT5kaXIgPT0gYXhpcy0+bWFqb3JfZGlyICk7Ci0KLSAgICAgICAgLyogaWYgaXQgaXMgYSB0b3Agem9uZSwgdGhlIGVkZ2UgbXVzdCBiZSBhZ2FpbnN0IHRoZSBtYWpvciAgICAqLwotICAgICAgICAvKiBkaXJlY3Rpb247IGlmIGl0IGlzIGEgYm90dG9tIHpvbmUsIGl0IG11c3QgYmUgaW4gdGhlIG1ham9yICovCi0gICAgICAgIC8qIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBpc190b3BfYmx1ZSBeIGlzX21ham9yX2RpciApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgIGRpc3Q7Ci0KLQotICAgICAgICAgIC8qIGZpcnN0IG9mIGFsbCwgY29tcGFyZSBpdCB0byB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uICovCi0gICAgICAgICAgZGlzdCA9IGVkZ2UtPmZwb3MgLSBibHVlLT5yZWYub3JnOwotICAgICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgICAgZGlzdCA9IEZUX011bEZpeCggZGlzdCwgc2NhbGUgKTsKLSAgICAgICAgICBpZiAoIGRpc3QgPCBiZXN0X2Rpc3QgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJlc3RfZGlzdCA9IGRpc3Q7Ci0gICAgICAgICAgICBiZXN0X2JsdWUgPSAmIGJsdWUtPnJlZjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBub3csIGNvbXBhcmUgaXQgdG8gdGhlIG92ZXJzaG9vdCBwb3NpdGlvbiBpZiB0aGUgZWRnZSBpcyAgICAgKi8KLSAgICAgICAgICAvKiByb3VuZGVkLCBhbmQgaWYgdGhlIGVkZ2UgaXMgb3ZlciB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIG9mIGEgKi8KLSAgICAgICAgICAvKiB0b3Agem9uZSwgb3IgdW5kZXIgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBvZiBhIGJvdHRvbSB6b25lICAgKi8KLSAgICAgICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ST1VORCAmJiBkaXN0ICE9IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0Jvb2wgIGlzX3VuZGVyX3JlZiA9IEZUX0JPT0woIGVkZ2UtPmZwb3MgPCBibHVlLT5yZWYub3JnICk7Ci0KLQotICAgICAgICAgICAgaWYgKCBpc190b3BfYmx1ZSBeIGlzX3VuZGVyX3JlZiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJsdWUgPSBsYXRpbi0+Ymx1ZXMgKyBiYjsKLSAgICAgICAgICAgICAgZGlzdCA9IGVkZ2UtPmZwb3MgLSBibHVlLT5zaG9vdC5vcmc7Ci0gICAgICAgICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICAgICAgICBkaXN0ID0gRlRfTXVsRml4KCBkaXN0LCBzY2FsZSApOwotICAgICAgICAgICAgICBpZiAoIGRpc3QgPCBiZXN0X2Rpc3QgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmVzdF9kaXN0ID0gZGlzdDsKLSAgICAgICAgICAgICAgICBiZXN0X2JsdWUgPSAmIGJsdWUtPnNob290OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmVzdF9ibHVlICkKLSAgICAgICAgZWRnZS0+Ymx1ZV9lZGdlID0gYmVzdF9ibHVlOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2xhdGluX2hpbnRzX2luaXQoIEFGX0dseXBoSGludHMgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZTsKLSAgICBGVF9VSW50MzIgICAgICAgc2NhbGVyX2ZsYWdzLCBvdGhlcl9mbGFnczsKLSAgICBGVF9GYWNlICAgICAgICAgZmFjZSA9IG1ldHJpY3MtPnJvb3Quc2NhbGVyLmZhY2U7Ci0KLQotICAgIGFmX2dseXBoX2hpbnRzX3Jlc2NhbGUoIGhpbnRzLCAoQUZfU2NyaXB0TWV0cmljcyltZXRyaWNzICk7Ci0KLSAgICAvKgotICAgICAqICBjb3JyZWN0IHhfc2NhbGUgYW5kIHlfc2NhbGUgaWYgbmVlZGVkLCBzaW5jZSB0aGV5IG1heSBoYXZlCi0gICAgICogIGJlZW4gbW9kaWZpZWQgYGFmX2xhdGluX21ldHJpY3Nfc2NhbGVfZGltJyBhYm92ZQotICAgICAqLwotICAgIGhpbnRzLT54X3NjYWxlID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uc2NhbGU7Ci0gICAgaGludHMtPnhfZGVsdGEgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS5kZWx0YTsKLSAgICBoaW50cy0+eV9zY2FsZSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdLnNjYWxlOwotICAgIGhpbnRzLT55X2RlbHRhID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0uZGVsdGE7Ci0KLSAgICAvKiBjb21wdXRlIGZsYWdzIGRlcGVuZGluZyBvbiByZW5kZXIgbW9kZSwgZXRjLiAqLwotICAgIG1vZGUgPSBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZTsKLQotI2lmIDAgLyogI2lmZGVmIEFGX1VTRV9XQVJQRVIgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEIHx8IG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1YgKQotICAgIHsKLSAgICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnJlbmRlcl9tb2RlID0gbW9kZSA9IEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHNjYWxlcl9mbGFncyA9IGhpbnRzLT5zY2FsZXJfZmxhZ3M7Ci0gICAgb3RoZXJfZmxhZ3MgID0gMDsKLQotICAgIC8qCi0gICAgICogIFdlIHNuYXAgdGhlIHdpZHRoIG9mIHZlcnRpY2FsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgaG9yaXpvbnRhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19IT1JaX1NOQVA7Ci0KLSAgICAvKgotICAgICAqICBXZSBzbmFwIHRoZSB3aWR0aCBvZiBob3Jpem9udGFsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgdmVydGljYWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCi0gICAgICovCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19WRVJUX1NOQVA7Ci0KLSAgICAvKgotICAgICAqICBXZSBhZGp1c3Qgc3RlbXMgdG8gZnVsbCBwaXhlbHMgb25seSBpZiB3ZSBkb24ndCB1c2UgdGhlIGBsaWdodCcgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgKQotICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfU1RFTV9BREpVU1Q7Ci0KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19NT05POwotCi0gICAgLyoKLSAgICAgKiAgSW4gYGxpZ2h0JyBoaW50aW5nIG1vZGUgd2UgZGlzYWJsZSBob3Jpem9udGFsIGhpbnRpbmcgY29tcGxldGVseS4KLSAgICAgKiAgV2UgYWxzbyBkbyBpdCBpZiB0aGUgZmFjZSBpcyBpdGFsaWMuCi0gICAgICovCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xJR0hUICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgKGZhY2UtPnN0eWxlX2ZsYWdzICYgRlRfU1RZTEVfRkxBR19JVEFMSUMpICE9IDAgKQotICAgICAgc2NhbGVyX2ZsYWdzIHw9IEFGX1NDQUxFUl9GTEFHX05PX0hPUklaT05UQUw7Ci0KLSAgICBoaW50cy0+c2NhbGVyX2ZsYWdzID0gc2NhbGVyX2ZsYWdzOwotICAgIGhpbnRzLT5vdGhlcl9mbGFncyAgPSBvdGhlcl9mbGFnczsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgIEwgQSBUIEkgTiAgIEcgTCBZIFAgSCAgIEcgUiBJIEQgLSBGIEkgVCBUIEkgTiBHICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBzbmFwIGEgZ2l2ZW4gd2lkdGggaW4gc2NhbGVkIGNvb3JkaW5hdGVzIHRvIG9uZSBvZiB0aGUgKi8KLSAgLyogY3VycmVudCBzdGFuZGFyZCB3aWR0aHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX1BvcwotICBhZl9sYXRpbl9zbmFwX3dpZHRoKCBBRl9XaWR0aCAgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICB3aWR0aCApCi0gIHsKLSAgICBpbnQgICAgIG47Ci0gICAgRlRfUG9zICBiZXN0ICAgICAgPSA2NCArIDMyICsgMjsKLSAgICBGVF9Qb3MgIHJlZmVyZW5jZSA9IHdpZHRoOwotICAgIEZUX1BvcyAgc2NhbGVkOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgdzsKLSAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICB3ID0gd2lkdGhzW25dLmN1cjsKLSAgICAgIGRpc3QgPSB3aWR0aCAtIHc7Ci0gICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgZGlzdCA9IC1kaXN0OwotICAgICAgaWYgKCBkaXN0IDwgYmVzdCApCi0gICAgICB7Ci0gICAgICAgIGJlc3QgICAgICA9IGRpc3Q7Ci0gICAgICAgIHJlZmVyZW5jZSA9IHc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc2NhbGVkID0gRlRfUElYX1JPVU5EKCByZWZlcmVuY2UgKTsKLQotICAgIGlmICggd2lkdGggPj0gcmVmZXJlbmNlICkKLSAgICB7Ci0gICAgICBpZiAoIHdpZHRoIDwgc2NhbGVkICsgNDggKQotICAgICAgICB3aWR0aCA9IHJlZmVyZW5jZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggd2lkdGggPiBzY2FsZWQgLSA0OCApCi0gICAgICAgIHdpZHRoID0gcmVmZXJlbmNlOwotICAgIH0KLQotICAgIHJldHVybiB3aWR0aDsKLSAgfQotCi0KLSAgLyogY29tcHV0ZSB0aGUgc25hcHBlZCB3aWR0aCBvZiBhIGdpdmVuIHN0ZW0gKi8KLQotICBzdGF0aWMgRlRfUG9zCi0gIGFmX2xhdGluX2NvbXB1dGVfc3RlbV93aWR0aCggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2VfRmxhZ3MgIGJhc2VfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZV9GbGFncyAgc3RlbV9mbGFncyApCi0gIHsKLSAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgID0gKEFGX0xhdGluTWV0cmljcykgaGludHMtPm1ldHJpY3M7Ci0gICAgQUZfTGF0aW5BeGlzICAgICBheGlzICAgICA9ICYgbWV0cmljcy0+YXhpc1tkaW1dOwotICAgIEZUX1BvcyAgICAgICAgICAgZGlzdCAgICAgPSB3aWR0aDsKLSAgICBGVF9JbnQgICAgICAgICAgIHNpZ24gICAgID0gMDsKLSAgICBGVF9JbnQgICAgICAgICAgIHZlcnRpY2FsID0gKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKTsKLQotCi0gICAgaWYgKCAhQUZfTEFUSU5fSElOVFNfRE9fU1RFTV9BREpVU1QoIGhpbnRzICkgfHwKLSAgICAgICAgICBheGlzLT5leHRyYV9saWdodCAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICByZXR1cm4gd2lkdGg7Ci0KLSAgICBpZiAoIGRpc3QgPCAwICkKLSAgICB7Ci0gICAgICBkaXN0ID0gLXdpZHRoOwotICAgICAgc2lnbiA9IDE7Ci0gICAgfQotCi0gICAgaWYgKCAoICB2ZXJ0aWNhbCAmJiAhQUZfTEFUSU5fSElOVFNfRE9fVkVSVF9TTkFQKCBoaW50cyApICkgfHwKLSAgICAgICAgICggIXZlcnRpY2FsICYmICFBRl9MQVRJTl9ISU5UU19ET19IT1JaX1NOQVAoIGhpbnRzICkgKSApCi0gICAgewotICAgICAgLyogc21vb3RoIGhpbnRpbmcgcHJvY2VzczogdmVyeSBsaWdodGx5IHF1YW50aXplIHRoZSBzdGVtIHdpZHRoICovCi0KLSAgICAgIC8qIGxlYXZlIHRoZSB3aWR0aHMgb2Ygc2VyaWZzIGFsb25lICovCi0KLSAgICAgIGlmICggKCBzdGVtX2ZsYWdzICYgQUZfRURHRV9TRVJJRiApICYmIHZlcnRpY2FsICYmICggZGlzdCA8IDMgKiA2NCApICkKLSAgICAgICAgZ290byBEb25lX1dpZHRoOwotCi0gICAgICBlbHNlIGlmICggKCBiYXNlX2ZsYWdzICYgQUZfRURHRV9ST1VORCApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaXN0IDwgODAgKQotICAgICAgICAgIGRpc3QgPSA2NDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBkaXN0IDwgNTYgKQotICAgICAgICBkaXN0ID0gNTY7Ci0KLSAgICAgIGlmICggYXhpcy0+d2lkdGhfY291bnQgPiAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkZWx0YTsKLQotCi0gICAgICAgIC8qIGNvbXBhcmUgdG8gc3RhbmRhcmQgd2lkdGggKi8KLSAgICAgICAgaWYgKCBheGlzLT53aWR0aF9jb3VudCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGEgPSBkaXN0IC0gYXhpcy0+d2lkdGhzWzBdLmN1cjsKLQotICAgICAgICAgIGlmICggZGVsdGEgPCAwICkKLSAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwotCi0gICAgICAgICAgaWYgKCBkZWx0YSA8IDQwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkaXN0ID0gYXhpcy0+d2lkdGhzWzBdLmN1cjsKLSAgICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgICAgZGlzdCA9IDQ4OwotCi0gICAgICAgICAgICBnb3RvIERvbmVfV2lkdGg7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBkaXN0IDwgMyAqIDY0ICkKLSAgICAgICAgewotICAgICAgICAgIGRlbHRhICA9IGRpc3QgJiA2MzsKLSAgICAgICAgICBkaXN0ICAmPSAtNjQ7Ci0KLSAgICAgICAgICBpZiAoIGRlbHRhIDwgMTAgKQotICAgICAgICAgICAgZGlzdCArPSBkZWx0YTsKLQotICAgICAgICAgIGVsc2UgaWYgKCBkZWx0YSA8IDMyICkKLSAgICAgICAgICAgIGRpc3QgKz0gMTA7Ci0KLSAgICAgICAgICBlbHNlIGlmICggZGVsdGEgPCA1NCApCi0gICAgICAgICAgICBkaXN0ICs9IDU0OwotCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGlzdCArPSBkZWx0YTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgZGlzdCA9ICggZGlzdCArIDMyICkgJiB+NjM7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBzdHJvbmcgaGludGluZyBwcm9jZXNzOiBzbmFwIHRoZSBzdGVtIHdpZHRoIHRvIGludGVnZXIgcGl4ZWxzICovCi0gICAgICBGVF9Qb3MgIG9yZ19kaXN0ID0gZGlzdDsKLQotCi0gICAgICBkaXN0ID0gYWZfbGF0aW5fc25hcF93aWR0aCggYXhpcy0+d2lkdGhzLCBheGlzLT53aWR0aF9jb3VudCwgZGlzdCApOwotCi0gICAgICBpZiAoIHZlcnRpY2FsICkKLSAgICAgIHsKLSAgICAgICAgLyogaW4gdGhlIGNhc2Ugb2YgdmVydGljYWwgaGludGluZywgYWx3YXlzIHJvdW5kICovCi0gICAgICAgIC8qIHRoZSBzdGVtIGhlaWdodHMgdG8gaW50ZWdlciBwaXhlbHMgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggZGlzdCA+PSA2NCApCi0gICAgICAgICAgZGlzdCA9ICggZGlzdCArIDE2ICkgJiB+NjM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXN0ID0gNjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggQUZfTEFUSU5fSElOVFNfRE9fTU9OTyggaGludHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtb25vY2hyb21lIGhvcml6b250YWwgaGludGluZzogc25hcCB3aWR0aHMgdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICAgICAgICAvKiB3aXRoIGEgZGlmZmVyZW50IHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDY0ICkKLSAgICAgICAgICAgIGRpc3QgPSA2NDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBmb3IgaG9yaXpvbnRhbCBhbnRpLWFsaWFzZWQgaGludGluZywgd2UgYWRvcHQgYSBtb3JlIHN1YnRsZSAqLwotICAgICAgICAgIC8qIGFwcHJvYWNoOiB3ZSBzdHJlbmd0aGVuIHNtYWxsIHN0ZW1zLCByb3VuZCBzdGVtcyB3aG9zZSBzaXplICovCi0gICAgICAgICAgLyogaXMgYmV0d2VlbiAxIGFuZCAyIHBpeGVscyB0byBhbiBpbnRlZ2VyLCBvdGhlcndpc2Ugbm90aGluZyAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyA2NCApID4+IDE7Ci0KLSAgICAgICAgICBlbHNlIGlmICggZGlzdCA8IDEyOCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogV2Ugb25seSByb3VuZCB0byBhbiBpbnRlZ2VyIHdpZHRoIGlmIHRoZSBjb3JyZXNwb25kaW5nICovCi0gICAgICAgICAgICAvKiBkaXN0b3J0aW9uIGlzIGxlc3MgdGhhbiAxLzQgcGl4ZWwuICBPdGhlcndpc2UgdGhpcyAgICAgKi8KLSAgICAgICAgICAgIC8qIG1ha2VzIGV2ZXJ5dGhpbmcgd29yc2Ugc2luY2UgdGhlIGRpYWdvbmFscywgd2hpY2ggYXJlICAqLwotICAgICAgICAgICAgLyogbm90IGhpbnRlZCwgYXBwZWFyIGEgbG90IGJvbGRlciBvciB0aGlubmVyIHRoYW4gdGhlICAgICovCi0gICAgICAgICAgICAvKiB2ZXJ0aWNhbCBzdGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgRlRfSW50ICBkZWx0YTsKLQotCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMjIgKSAmIH42MzsKLSAgICAgICAgICAgIGRlbHRhID0gZGlzdCAtIG9yZ19kaXN0OwotICAgICAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgICAgICBkZWx0YSA9IC1kZWx0YTsKLQotICAgICAgICAgICAgaWYgKGRlbHRhID49IDE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkaXN0ID0gb3JnX2Rpc3Q7Ci0gICAgICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgNjQgKSA+PiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAvKiByb3VuZCBvdGhlcndpc2UgdG8gcHJldmVudCBjb2xvciBmcmluZ2VzIGluIExDRCBtb2RlICovCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBEb25lX1dpZHRoOgotICAgIGlmICggc2lnbiApCi0gICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICByZXR1cm4gZGlzdDsKLSAgfQotCi0KLSAgLyogYWxpZ24gb25lIHN0ZW0gZWRnZSByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgc3RlbSBlZGdlICovCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW5fYWxpZ25fbGlua2VkX2VkZ2UoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgYmFzZV9lZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSAgICAgICAgc3RlbV9lZGdlICkKLSAgewotICAgIEZUX1BvcyAgZGlzdCA9IHN0ZW1fZWRnZS0+b3BvcyAtIGJhc2VfZWRnZS0+b3BvczsKLQotICAgIEZUX1BvcyAgZml0dGVkX3dpZHRoID0gYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50cywgZGltLCBkaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfRWRnZV9GbGFncyliYXNlX2VkZ2UtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfRWRnZV9GbGFncylzdGVtX2VkZ2UtPmZsYWdzICk7Ci0KLQotICAgIHN0ZW1fZWRnZS0+cG9zID0gYmFzZV9lZGdlLT5wb3MgKyBmaXR0ZWRfd2lkdGg7Ci0KLSAgICBBRl9MT0coKCAiTElOSzogZWRnZSAlZCAob3Bvcz0lLjJmKSBsaW5rZWQgdG8gKCUuMmYpLCAiCi0gICAgICAgICAgICAgImRpc3Qgd2FzICUuMmYsIG5vdyAlLjJmXG4iLAotICAgICAgICAgICAgIHN0ZW1fZWRnZS1oaW50cy0+YXhpc1tkaW1dLmVkZ2VzLCBzdGVtX2VkZ2UtPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgIHN0ZW1fZWRnZS0+cG9zIC8gNjQuMCwgZGlzdCAvIDY0LjAsIGZpdHRlZF93aWR0aCAvIDY0LjAgKSk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX2xhdGluX2FsaWduX3NlcmlmX2VkZ2UoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlICAgICAgICBzZXJpZiApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGhpbnRzICk7Ci0KLSAgICBzZXJpZi0+cG9zID0gYmFzZS0+cG9zICsgKHNlcmlmLT5vcG9zIC0gYmFzZS0+b3Bvcyk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgRSBEIEcgRSAgIEggSSBOIFQgSSBOIEcgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sYXRpbl9oaW50X2VkZ2VzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZXMgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZV9saW1pdCA9IGVkZ2VzICsgYXhpcy0+bnVtX2VkZ2VzOwotICAgIEZUX0ludCAgICAgICAgbl9lZGdlczsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2U7Ci0gICAgQUZfRWRnZSAgICAgICBhbmNob3IgICAgID0gMDsKLSAgICBGVF9JbnQgICAgICAgIGhhc19zZXJpZnMgPSAwOwotCi0KLSAgICAvKiB3ZSBiZWdpbiBieSBhbGlnbmluZyBhbGwgc3RlbXMgcmVsYXRpdmUgdG8gdGhlIGJsdWUgem9uZSAqLwotICAgIC8qIGlmIG5lZWRlZCAtLSB0aGF0J3Mgb25seSBmb3IgaG9yaXpvbnRhbCBlZGdlcyAgICAgICAgICAgICovCi0KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCAmJiBBRl9ISU5UU19ET19CTFVFUyggaGludHMgKSApCi0gICAgewotICAgICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfV2lkdGggIGJsdWU7Ci0gICAgICAgIEFGX0VkZ2UgICBlZGdlMSwgZWRnZTI7Ci0KLQotICAgICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBibHVlICA9IGVkZ2UtPmJsdWVfZWRnZTsKLSAgICAgICAgZWRnZTEgPSBOVUxMOwotICAgICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7Ci0KLSAgICAgICAgaWYgKCBibHVlICkKLSAgICAgICAgewotICAgICAgICAgIGVkZ2UxID0gZWRnZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggZWRnZTIgJiYgZWRnZTItPmJsdWVfZWRnZSApCi0gICAgICAgIHsKLSAgICAgICAgICBibHVlICA9IGVkZ2UyLT5ibHVlX2VkZ2U7Ci0gICAgICAgICAgZWRnZTEgPSBlZGdlMjsKLSAgICAgICAgICBlZGdlMiA9IGVkZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICFlZGdlMSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgQUZfTE9HKCggIkJMVUU6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc25hcHBlZCB0byAoJS4yZiksICIKLSAgICAgICAgICAgICAgICAgIndhcyAoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgIGVkZ2UxLWVkZ2VzLCBlZGdlMS0+b3BvcyAvIDY0LjAsIGJsdWUtPmZpdCAvIDY0LjAsCi0gICAgICAgICAgICAgICAgIGVkZ2UxLT5wb3MgLyA2NC4wICkpOwotCi0gICAgICAgIGVkZ2UxLT5wb3MgICAgPSBibHVlLT5maXQ7Ci0gICAgICAgIGVkZ2UxLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0KLSAgICAgICAgaWYgKCBlZGdlMiAmJiAhZWRnZTItPmJsdWVfZWRnZSApCi0gICAgICAgIHsKLSAgICAgICAgICBhZl9sYXRpbl9hbGlnbl9saW5rZWRfZWRnZSggaGludHMsIGRpbSwgZWRnZTEsIGVkZ2UyICk7Ci0gICAgICAgICAgZWRnZTItPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIWFuY2hvciApCi0gICAgICAgICAgYW5jaG9yID0gZWRnZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBub3cgd2Ugd2lsbCBhbGlnbiBhbGwgc3RlbSBlZGdlcywgdHJ5aW5nIHRvIG1haW50YWluIHRoZSAqLwotICAgIC8qIHJlbGF0aXZlIG9yZGVyIG9mIHN0ZW1zIGluIHRoZSBnbHlwaCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICB7Ci0gICAgICBBRl9FZGdlICBlZGdlMjsKLQotCi0gICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIHNraXAgYWxsIG5vbi1zdGVtIGVkZ2VzICovCi0gICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7Ci0gICAgICBpZiAoICFlZGdlMiApCi0gICAgICB7Ci0gICAgICAgIGhhc19zZXJpZnMrKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBhbGlnbiB0aGUgc3RlbSAqLwotCi0gICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgaXQncyBiZXR0ZXIgdG8gYmUgc2FmZSAqLwotICAgICAgaWYgKCBlZGdlMi0+Ymx1ZV9lZGdlICkKLSAgICAgIHsKLSAgICAgICAgQUZfTE9HKCggIkFTU0VSVElPTiBGQUlMRUQgZm9yIGVkZ2UgJWRcbiIsIGVkZ2UyLWVkZ2VzICkpOwotCi0gICAgICAgIGFmX2xhdGluX2FsaWduX2xpbmtlZF9lZGdlKCBoaW50cywgZGltLCBlZGdlMiwgZWRnZSApOwotICAgICAgICBlZGdlLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoICFhbmNob3IgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIG9yZ19sZW4sIG9yZ19jZW50ZXIsIGN1cl9sZW47Ci0gICAgICAgIEZUX1BvcyAgY3VyX3BvczEsIGVycm9yMSwgZXJyb3IyLCB1X29mZiwgZF9vZmY7Ci0KLQotICAgICAgICBvcmdfbGVuID0gZWRnZTItPm9wb3MgLSBlZGdlLT5vcG9zOwotICAgICAgICBjdXJfbGVuID0gYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoKAotICAgICAgICAgICAgICAgICAgICBoaW50cywgZGltLCBvcmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAoQUZfRWRnZV9GbGFncyllZGdlLT5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgKEFGX0VkZ2VfRmxhZ3MpZWRnZTItPmZsYWdzICk7Ci0gICAgICAgIGlmICggY3VyX2xlbiA8PSA2NCApCi0gICAgICAgICAgdV9vZmYgPSBkX29mZiA9IDMyOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1X29mZiA9IDM4OwotICAgICAgICAgIGRfb2ZmID0gMjY7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGN1cl9sZW4gPCA5NiApCi0gICAgICAgIHsKLSAgICAgICAgICBvcmdfY2VudGVyID0gZWRnZS0+b3BvcyArICggb3JnX2xlbiA+PiAxICk7Ci0KLSAgICAgICAgICBjdXJfcG9zMSAgID0gRlRfUElYX1JPVU5EKCBvcmdfY2VudGVyICk7Ci0KLSAgICAgICAgICBlcnJvcjEgPSBvcmdfY2VudGVyIC0gKCBjdXJfcG9zMSAtIHVfb2ZmICk7Ci0gICAgICAgICAgaWYgKCBlcnJvcjEgPCAwICkKLSAgICAgICAgICAgIGVycm9yMSA9IC1lcnJvcjE7Ci0KLSAgICAgICAgICBlcnJvcjIgPSBvcmdfY2VudGVyIC0gKCBjdXJfcG9zMSArIGRfb2ZmICk7Ci0gICAgICAgICAgaWYgKCBlcnJvcjIgPCAwICkKLSAgICAgICAgICAgIGVycm9yMiA9IC1lcnJvcjI7Ci0KLSAgICAgICAgICBpZiAoIGVycm9yMSA8IGVycm9yMiApCi0gICAgICAgICAgICBjdXJfcG9zMSAtPSB1X29mZjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjdXJfcG9zMSArPSBkX29mZjsKLQotICAgICAgICAgIGVkZ2UtPnBvcyAgPSBjdXJfcG9zMSAtIGN1cl9sZW4gLyAyOwotICAgICAgICAgIGVkZ2UyLT5wb3MgPSBlZGdlLT5wb3MgKyBjdXJfbGVuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBlZGdlLT5wb3MgPSBGVF9QSVhfUk9VTkQoIGVkZ2UtPm9wb3MgKTsKLQotICAgICAgICBBRl9MT0coKCAiQU5DSE9SOiBlZGdlICVkIChvcG9zPSUuMmYpIGFuZCAlZCAob3Bvcz0lLjJmKSAiCi0gICAgICAgICAgICAgICAgICJzbmFwcGVkIHRvICglLjJmKSAoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICBlZGdlMi1lZGdlcywgZWRnZTItPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLCBlZGdlMi0+cG9zIC8gNjQuMCApKTsKLSAgICAgICAgYW5jaG9yID0gZWRnZTsKLQotICAgICAgICBlZGdlLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0KLSAgICAgICAgYWZfbGF0aW5fYWxpZ25fbGlua2VkX2VkZ2UoIGhpbnRzLCBkaW0sIGVkZ2UsIGVkZ2UyICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgb3JnX3Bvcywgb3JnX2xlbiwgb3JnX2NlbnRlciwgY3VyX2xlbjsKLSAgICAgICAgRlRfUG9zICBjdXJfcG9zMSwgY3VyX3BvczIsIGRlbHRhMSwgZGVsdGEyOwotCi0KLSAgICAgICAgb3JnX3BvcyAgICA9IGFuY2hvci0+cG9zICsgKCBlZGdlLT5vcG9zIC0gYW5jaG9yLT5vcG9zICk7Ci0gICAgICAgIG9yZ19sZW4gICAgPSBlZGdlMi0+b3BvcyAtIGVkZ2UtPm9wb3M7Ci0gICAgICAgIG9yZ19jZW50ZXIgPSBvcmdfcG9zICsgKCBvcmdfbGVuID4+IDEgKTsKLQotICAgICAgICBjdXJfbGVuID0gYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoKAotICAgICAgICAgICAgICAgICAgIGhpbnRzLCBkaW0sIG9yZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgKEFGX0VkZ2VfRmxhZ3MpZWRnZS0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgKEFGX0VkZ2VfRmxhZ3MpZWRnZTItPmZsYWdzICk7Ci0KLSAgICAgICAgaWYgKCBlZGdlMi0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgIGVkZ2UtPnBvcyA9IGVkZ2UyLT5wb3MgLSBjdXJfbGVuOwotCi0gICAgICAgIGVsc2UgaWYgKCBjdXJfbGVuIDwgOTYgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICB1X29mZiwgZF9vZmY7Ci0KLQotICAgICAgICAgIGN1cl9wb3MxID0gRlRfUElYX1JPVU5EKCBvcmdfY2VudGVyICk7Ci0KLSAgICAgICAgICBpZiAoY3VyX2xlbiA8PSA2NCApCi0gICAgICAgICAgICB1X29mZiA9IGRfb2ZmID0gMzI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVfb2ZmID0gMzg7Ci0gICAgICAgICAgICBkX29mZiA9IDI2OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGRlbHRhMSA9IG9yZ19jZW50ZXIgLSAoIGN1cl9wb3MxIC0gdV9vZmYgKTsKLSAgICAgICAgICBpZiAoIGRlbHRhMSA8IDAgKQotICAgICAgICAgICAgZGVsdGExID0gLWRlbHRhMTsKLQotICAgICAgICAgIGRlbHRhMiA9IG9yZ19jZW50ZXIgLSAoIGN1cl9wb3MxICsgZF9vZmYgKTsKLSAgICAgICAgICBpZiAoIGRlbHRhMiA8IDAgKQotICAgICAgICAgICAgZGVsdGEyID0gLWRlbHRhMjsKLQotICAgICAgICAgIGlmICggZGVsdGExIDwgZGVsdGEyICkKLSAgICAgICAgICAgIGN1cl9wb3MxIC09IHVfb2ZmOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGN1cl9wb3MxICs9IGRfb2ZmOwotCi0gICAgICAgICAgZWRnZS0+cG9zICA9IGN1cl9wb3MxIC0gY3VyX2xlbiAvIDI7Ci0gICAgICAgICAgZWRnZTItPnBvcyA9IGN1cl9wb3MxICsgY3VyX2xlbiAvIDI7Ci0KLSAgICAgICAgICBBRl9MT0coKCAiU1RFTTogJWQgKG9wb3M9JS4yZikgdG8gJWQgKG9wb3M9JS4yZikgIgotICAgICAgICAgICAgICAgICAgICJzbmFwcGVkIHRvICglLjJmKSBhbmQgKCUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgIGVkZ2UyLWVkZ2VzLCBlZGdlMi0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCwgZWRnZTItPnBvcyAvIDY0LjAgKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb3JnX3BvcyAgICA9IGFuY2hvci0+cG9zICsgKCBlZGdlLT5vcG9zIC0gYW5jaG9yLT5vcG9zICk7Ci0gICAgICAgICAgb3JnX2xlbiAgICA9IGVkZ2UyLT5vcG9zIC0gZWRnZS0+b3BvczsKLSAgICAgICAgICBvcmdfY2VudGVyID0gb3JnX3BvcyArICggb3JnX2xlbiA+PiAxICk7Ci0KLSAgICAgICAgICBjdXJfbGVuICAgID0gYWZfbGF0aW5fY29tcHV0ZV9zdGVtX3dpZHRoKAotICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLCBkaW0sIG9yZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0VkZ2VfRmxhZ3MpZWRnZS0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0VkZ2VfRmxhZ3MpZWRnZTItPmZsYWdzICk7Ci0KLSAgICAgICAgICBjdXJfcG9zMSAgID0gRlRfUElYX1JPVU5EKCBvcmdfcG9zICk7Ci0gICAgICAgICAgZGVsdGExICAgICA9IGN1cl9wb3MxICsgKCBjdXJfbGVuID4+IDEgKSAtIG9yZ19jZW50ZXI7Ci0gICAgICAgICAgaWYgKCBkZWx0YTEgPCAwICkKLSAgICAgICAgICAgIGRlbHRhMSA9IC1kZWx0YTE7Ci0KLSAgICAgICAgICBjdXJfcG9zMiAgID0gRlRfUElYX1JPVU5EKCBvcmdfcG9zICsgb3JnX2xlbiApIC0gY3VyX2xlbjsKLSAgICAgICAgICBkZWx0YTIgICAgID0gY3VyX3BvczIgKyAoIGN1cl9sZW4gPj4gMSApIC0gb3JnX2NlbnRlcjsKLSAgICAgICAgICBpZiAoIGRlbHRhMiA8IDAgKQotICAgICAgICAgICAgZGVsdGEyID0gLWRlbHRhMjsKLQotICAgICAgICAgIGVkZ2UtPnBvcyAgPSAoIGRlbHRhMSA8IGRlbHRhMiApID8gY3VyX3BvczEgOiBjdXJfcG9zMjsKLSAgICAgICAgICBlZGdlMi0+cG9zID0gZWRnZS0+cG9zICsgY3VyX2xlbjsKLQotICAgICAgICAgIEFGX0xPRygoICJTVEVNOiAlZCAob3Bvcz0lLjJmKSB0byAlZCAob3Bvcz0lLjJmKSAiCi0gICAgICAgICAgICAgICAgICAgInNuYXBwZWQgdG8gKCUuMmYpIGFuZCAoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgZWRnZTItZWRnZXMsIGVkZ2UyLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLCBlZGdlMi0+cG9zIC8gNjQuMCApKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVkZ2UtPmZsYWdzICB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIGVkZ2UyLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0KLSAgICAgICAgaWYgKCBlZGdlID4gZWRnZXMgJiYgZWRnZS0+cG9zIDwgZWRnZVstMV0ucG9zICkKLSAgICAgICAgewotICAgICAgICAgIEFGX0xPRygoICJCT1VORDogJWQgKHBvcz0lLjJmKSB0byAoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+cG9zIC8gNjQuMCwgZWRnZVstMV0ucG9zIC8gNjQuMCApKTsKLSAgICAgICAgICBlZGdlLT5wb3MgPSBlZGdlWy0xXS5wb3M7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBtYWtlIHN1cmUgdGhhdCBsb3dlcmNhc2UgbSdzIG1haW50YWluIHRoZWlyIHN5bW1ldHJ5ICovCi0KLSAgICAvKiBJbiBnZW5lcmFsLCBsb3dlcmNhc2UgbSdzIGhhdmUgc2l4IHZlcnRpY2FsIGVkZ2VzIGlmIHRoZXkgYXJlIHNhbnMgKi8KLSAgICAvKiBzZXJpZiwgb3IgdHdlbHZlIGlmIHRoZXkgYXJlIHdpdGggc2VyaWZzLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAgKi8KLSAgICAvKiBiYXNlZCBvbiB0aGF0IGFzc3VtcHRpb24sIGFuZCBzZWVtcyB0byB3b3JrIHZlcnkgd2VsbCB3aXRoIG1vc3QgICAgKi8KLSAgICAvKiBmYWNlcy4gIEhvd2V2ZXIsIGlmIGZvciBhIGNlcnRhaW4gZmFjZSB0aGlzIGFzc3VtcHRpb24gaXMgbm90ICAgICAgKi8KLSAgICAvKiB0cnVlLCB0aGUgbSBpcyBqdXN0IHJlbmRlcmVkIGxpa2UgYmVmb3JlLiAgSW4gYWRkaXRpb24sIGFueSBzdGVtICAgKi8KLSAgICAvKiBjb3JyZWN0aW9uIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHN5bW1ldHJpY2FsIGdseXBocyAoZXZlbiBpZiB0aGUgKi8KLSAgICAvKiBnbHlwaCBpcyBub3QgYW4gbSksIHNvIHRoZSBwb3RlbnRpYWwgZm9yIHVud2FudGVkIGRpc3RvcnRpb24gaXMgICAgKi8KLSAgICAvKiByZWxhdGl2ZWx5IGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIFdlIGRvbid0IGhhbmRsZSBob3Jpem9udGFsIGVkZ2VzIHNpbmNlIHdlIGNhbid0IGVhc2lseSBhc3N1cmUgdGhhdCAqLwotICAgIC8qIHRoZSB0aGlyZCAobG93ZXN0KSBzdGVtIGFsaWducyB3aXRoIHRoZSBiYXNlIGxpbmU7IGl0IG1pZ2h0IGVuZCB1cCAqLwotICAgIC8qIG9uZSBwaXhlbCBoaWdoZXIgb3IgbG93ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgbl9lZGdlcyA9IGVkZ2VfbGltaXQgLSBlZGdlczsKLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiAmJiAoIG5fZWRnZXMgPT0gNiB8fCBuX2VkZ2VzID09IDEyICkgKQotICAgIHsKLSAgICAgIEFGX0VkZ2UgIGVkZ2UxLCBlZGdlMiwgZWRnZTM7Ci0gICAgICBGVF9Qb3MgICBkaXN0MSwgZGlzdDIsIHNwYW4sIGRlbHRhOwotCi0KLSAgICAgIGlmICggbl9lZGdlcyA9PSA2ICkKLSAgICAgIHsKLSAgICAgICAgZWRnZTEgPSBlZGdlczsKLSAgICAgICAgZWRnZTIgPSBlZGdlcyArIDI7Ci0gICAgICAgIGVkZ2UzID0gZWRnZXMgKyA0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlZGdlMSA9IGVkZ2VzICsgMTsKLSAgICAgICAgZWRnZTIgPSBlZGdlcyArIDU7Ci0gICAgICAgIGVkZ2UzID0gZWRnZXMgKyA5OwotICAgICAgfQotCi0gICAgICBkaXN0MSA9IGVkZ2UyLT5vcG9zIC0gZWRnZTEtPm9wb3M7Ci0gICAgICBkaXN0MiA9IGVkZ2UzLT5vcG9zIC0gZWRnZTItPm9wb3M7Ci0KLSAgICAgIHNwYW4gPSBkaXN0MSAtIGRpc3QyOwotICAgICAgaWYgKCBzcGFuIDwgMCApCi0gICAgICAgIHNwYW4gPSAtc3BhbjsKLQotICAgICAgaWYgKCBzcGFuIDwgOCApCi0gICAgICB7Ci0gICAgICAgIGRlbHRhID0gZWRnZTMtPnBvcyAtICggMiAqIGVkZ2UyLT5wb3MgLSBlZGdlMS0+cG9zICk7Ci0gICAgICAgIGVkZ2UzLT5wb3MgLT0gZGVsdGE7Ci0gICAgICAgIGlmICggZWRnZTMtPmxpbmsgKQotICAgICAgICAgIGVkZ2UzLT5saW5rLT5wb3MgLT0gZGVsdGE7Ci0KLSAgICAgICAgLyogbW92ZSB0aGUgc2VyaWZzIGFsb25nIHdpdGggdGhlIHN0ZW0gKi8KLSAgICAgICAgaWYgKCBuX2VkZ2VzID09IDEyICkKLSAgICAgICAgewotICAgICAgICAgICggZWRnZXMgKyA4ICktPnBvcyAtPSBkZWx0YTsKLSAgICAgICAgICAoIGVkZ2VzICsgMTEgKS0+cG9zIC09IGRlbHRhOwotICAgICAgICB9Ci0KLSAgICAgICAgZWRnZTMtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLSAgICAgICAgaWYgKCBlZGdlMy0+bGluayApCi0gICAgICAgICAgZWRnZTMtPmxpbmstPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGhhc19zZXJpZnMgfHwgIWFuY2hvciApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqICBub3cgaGludCB0aGUgcmVtYWluaW5nIGVkZ2VzIChzZXJpZnMgYW5kIHNpbmdsZSkgaW4gb3JkZXIKLSAgICAgICAqICB0byBjb21wbGV0ZSBvdXIgcHJvY2Vzc2luZwotICAgICAgICovCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGRlbHRhOwotCi0KLSAgICAgICAgaWYgKCBlZGdlLT5mbGFncyAmIEFGX0VER0VfRE9ORSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZGVsdGEgPSAxMDAwOwotCi0gICAgICAgIGlmICggZWRnZS0+c2VyaWYgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGEgPSBlZGdlLT5zZXJpZi0+b3BvcyAtIGVkZ2UtPm9wb3M7Ci0gICAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRlbHRhIDwgNjQgKyAxNiApCi0gICAgICAgIHsKLSAgICAgICAgICBhZl9sYXRpbl9hbGlnbl9zZXJpZl9lZGdlKCBoaW50cywgZWRnZS0+c2VyaWYsIGVkZ2UgKTsKLSAgICAgICAgICBBRl9MT0coKCAiU0VSSUY6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc2VyaWYgdG8gJWQgKG9wb3M9JS4yZikgIgotICAgICAgICAgICAgICAgICAgICJhbGlnbmVkIHRvICglLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICBlZGdlLWVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICBlZGdlLT5zZXJpZiAtIGVkZ2VzLCBlZGdlLT5zZXJpZi0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggIWFuY2hvciApCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9MT0coKCAiU0VSSUZfQU5DSE9SOiBlZGdlICVkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gKCUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLCBlZGdlLT5wb3MgLyA2NC4wICkpOwotICAgICAgICAgIGVkZ2UtPnBvcyA9IEZUX1BJWF9ST1VORCggZWRnZS0+b3BvcyApOwotICAgICAgICAgIGFuY2hvciAgICA9IGVkZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQUZfRWRnZSAgYmVmb3JlLCBhZnRlcjsKLQotCi0gICAgICAgICAgZm9yICggYmVmb3JlID0gZWRnZSAtIDE7IGJlZm9yZSA+PSBlZGdlczsgYmVmb3JlLS0gKQotICAgICAgICAgICAgaWYgKCBiZWZvcmUtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBmb3IgKCBhZnRlciA9IGVkZ2UgKyAxOyBhZnRlciA8IGVkZ2VfbGltaXQ7IGFmdGVyKysgKQotICAgICAgICAgICAgaWYgKCBhZnRlci0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGlmICggYmVmb3JlID49IGVkZ2VzICYmIGJlZm9yZSA8IGVkZ2UgICAmJgotICAgICAgICAgICAgICAgYWZ0ZXIgPCBlZGdlX2xpbWl0ICYmIGFmdGVyID4gZWRnZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRnZS0+cG9zID0gYmVmb3JlLT5wb3MgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGVkZ2UtPm9wb3MgLSBiZWZvcmUtPm9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPnBvcyAtIGJlZm9yZS0+cG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5vcG9zIC0gYmVmb3JlLT5vcG9zICk7Ci0gICAgICAgICAgICBBRl9MT0coKCAiU0VSSUZfTElOSzE6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc25hcHBlZCB0byAoJS4yZikgIgotICAgICAgICAgICAgICAgICAgICAgImZyb20gJWQgKG9wb3M9JS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICBlZGdlLWVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgIGVkZ2UtPnBvcyAvIDY0LjAsIGJlZm9yZSAtIGVkZ2VzLAotICAgICAgICAgICAgICAgICAgICAgYmVmb3JlLT5vcG9zIC8gNjQuMCApKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVkZ2UtPnBvcyA9IGFuY2hvci0+cG9zICsKLSAgICAgICAgICAgICAgICAgICAgICAgICggKCBlZGdlLT5vcG9zIC0gYW5jaG9yLT5vcG9zICsgMTYgKSAmIH4zMSApOwotICAgICAgICAgICAgQUZfTE9HKCggIlNFUklGX0xJTksyOiBlZGdlICVkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gKCUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsIGVkZ2UtPnBvcyAvIDY0LjAgKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotCi0gICAgICAgIGlmICggZWRnZSA+IGVkZ2VzICYmIGVkZ2UtPnBvcyA8IGVkZ2VbLTFdLnBvcyApCi0gICAgICAgICAgZWRnZS0+cG9zID0gZWRnZVstMV0ucG9zOwotCi0gICAgICAgIGlmICggZWRnZSArIDEgPCBlZGdlX2xpbWl0ICAgICAgICAmJgotICAgICAgICAgICAgIGVkZ2VbMV0uZmxhZ3MgJiBBRl9FREdFX0RPTkUgJiYKLSAgICAgICAgICAgICBlZGdlLT5wb3MgPiBlZGdlWzFdLnBvcyAgICAgICkKLSAgICAgICAgICBlZGdlLT5wb3MgPSBlZGdlWzFdLnBvczsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9sYXRpbl9oaW50c19hcHBseSggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgaW50ICAgICAgIGRpbTsKLQotCi0gICAgZXJyb3IgPSBhZl9nbHlwaF9oaW50c19yZWxvYWQoIGhpbnRzLCBvdXRsaW5lLCAxICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBhbmFseXplIGdseXBoIG91dGxpbmUgKi8KLSNpZmRlZiBBRl9VU0VfV0FSUEVSCi0gICAgaWYgKCBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCB8fAotICAgICAgICAgQUZfSElOVFNfRE9fSE9SSVpPTlRBTCggaGludHMgKSApCi0jZWxzZQotICAgIGlmICggQUZfSElOVFNfRE9fSE9SSVpPTlRBTCggaGludHMgKSApCi0jZW5kaWYKLSAgICB7Ci0gICAgICBlcnJvciA9IGFmX2xhdGluX2hpbnRzX2RldGVjdF9mZWF0dXJlcyggaGludHMsIEFGX0RJTUVOU0lPTl9IT1JaICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggQUZfSElOVFNfRE9fVkVSVElDQUwoIGhpbnRzICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gYWZfbGF0aW5faGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBoaW50cywgQUZfRElNRU5TSU9OX1ZFUlQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfYmx1ZV9lZGdlcyggaGludHMsIG1ldHJpY3MgKTsKLSAgICB9Ci0KLSAgICAvKiBncmlkLWZpdCB0aGUgb3V0bGluZSAqLwotICAgIGZvciAoIGRpbSA9IDA7IGRpbSA8IEFGX0RJTUVOU0lPTl9NQVg7IGRpbSsrICkKLSAgICB7Ci0jaWZkZWYgQUZfVVNFX1dBUlBFUgotICAgICAgaWYgKCAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiAmJgotICAgICAgICAgICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnJlbmRlcl9tb2RlID09IEZUX1JFTkRFUl9NT0RFX0xJR0hUICkgKQotICAgICAgewotICAgICAgICBBRl9XYXJwZXJSZWMgIHdhcnBlcjsKLSAgICAgICAgRlRfRml4ZWQgICAgICBzY2FsZTsKLSAgICAgICAgRlRfUG9zICAgICAgICBkZWx0YTsKLQotCi0gICAgICAgIGFmX3dhcnBlcl9jb21wdXRlKCAmd2FycGVyLCBoaW50cywgZGltLCAmc2NhbGUsICZkZWx0YSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19zY2FsZV9kaW0oIGhpbnRzLCBkaW0sIHNjYWxlLCBkZWx0YSApOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBpZiAoICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICYmIEFGX0hJTlRTX0RPX0hPUklaT05UQUwoIGhpbnRzICkgKSB8fAotICAgICAgICAgICAoIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCAmJiBBRl9ISU5UU19ET19WRVJUSUNBTCggaGludHMgKSApICAgKQotICAgICAgewotICAgICAgICBhZl9sYXRpbl9oaW50X2VkZ2VzKCBoaW50cywgKEFGX0RpbWVuc2lvbilkaW0gKTsKLSAgICAgICAgYWZfZ2x5cGhfaGludHNfYWxpZ25fZWRnZV9wb2ludHMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19hbGlnbl9zdHJvbmdfcG9pbnRzKCBoaW50cywgKEFGX0RpbWVuc2lvbilkaW0gKTsKLSAgICAgICAgYWZfZ2x5cGhfaGludHNfYWxpZ25fd2Vha19wb2ludHMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgfQotICAgIH0KLSAgICBhZl9nbHlwaF9oaW50c19zYXZlKCBoaW50cywgb3V0bGluZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgIEwgQSBUIEkgTiAgIFMgQyBSIEkgUCBUICAgQyBMIEEgUyBTICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFhYWDogdGhpcyBzaG91bGQgcHJvYmFibHkgZmluZSB0dW5lZCB0byBkaWZmZXJlbnRpYXRlIGJldHRlciBiZXR3ZWVuICovCi0gIC8qICAgICAgc2NyaXB0cy4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbGF0aW5fdW5pcmFuZ2VzW10gPQotICB7Ci0gICAgeyAweDAwMjAsIDB4MDA3RiB9LCAgLyogQmFzaWMgTGF0aW4gKG5vIGNvbnRyb2wgY2hhcmFjdGVycykgKi8KLSAgICB7IDB4MDBBMCwgMHgwMEZGIH0sICAvKiBMYXRpbi0xIFN1cHBsZW1lbnQgKG5vIGNvbnRyb2wgY2hhcmFjdGVycykgKi8KLSAgICB7IDB4MDEwMCwgMHgwMTdGIH0sICAvKiBMYXRpbiBFeHRlbmRlZC1BICovCi0gICAgeyAweDAxODAsIDB4MDI0RiB9LCAgLyogTGF0aW4gRXh0ZW5kZWQtQiAqLwotICAgIHsgMHgwMjUwLCAweDAyQUYgfSwgIC8qIElQQSBFeHRlbnNpb25zICovCi0gICAgeyAweDAyQjAsIDB4MDJGRiB9LCAgLyogU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzICovCi0gICAgeyAweDAzMDAsIDB4MDM2RiB9LCAgLyogQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzICovCi0gICAgeyAweDAzNzAsIDB4MDNGRiB9LCAgLyogR3JlZWsgYW5kIENvcHRpYyAqLwotICAgIHsgMHgwNDAwLCAweDA0RkYgfSwgIC8qIEN5cmlsbGljICovCi0gICAgeyAweDA1MDAsIDB4MDUyRiB9LCAgLyogQ3lyaWxsaWMgU3VwcGxlbWVudCAqLwotICAgIHsgMHgxRDAwLCAweDFEN0YgfSwgIC8qIFBob25ldGljIEV4dGVuc2lvbnMgKi8KLSAgICB7IDB4MUQ4MCwgMHgxREJGIH0sICAvKiBQaG9uZXRpYyBFeHRlbnNpb25zIFN1cHBsZW1lbnQgKi8KLSAgICB7IDB4MURDMCwgMHgxREZGIH0sICAvKiBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgU3VwcGxlbWVudCAqLwotICAgIHsgMHgxRTAwLCAweDFFRkYgfSwgIC8qIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwgKi8KLSAgICB7IDB4MUYwMCwgMHgxRkZGIH0sICAvKiBHcmVlayBFeHRlbmRlZCAqLwotICAgIHsgMHgyMDAwLCAweDIwNkYgfSwgIC8qIEdlbmVyYWwgUHVuY3R1YXRpb24gKi8KLSAgICB7IDB4MjA3MCwgMHgyMDlGIH0sICAvKiBTdXBlcnNjcmlwdHMgYW5kIFN1YnNjcmlwdHMgKi8KLSAgICB7IDB4MjBBMCwgMHgyMENGIH0sICAvKiBDdXJyZW5jeSBTeW1ib2xzICovCi0gICAgeyAweDIxNTAsIDB4MjE4RiB9LCAgLyogTnVtYmVyIEZvcm1zICovCi0gICAgeyAweDI0NjAsIDB4MjRGRiB9LCAgLyogRW5jbG9zZWQgQWxwaGFudW1lcmljcyAqLwotICAgIHsgMCAgICAgLCAwICAgICAgfQotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2xhdGluX3NjcmlwdF9jbGFzcyA9Ci0gIHsKLSAgICBBRl9TQ1JJUFRfTEFUSU4sCi0gICAgYWZfbGF0aW5fdW5pcmFuZ2VzLAotCi0gICAgc2l6ZW9mKCBBRl9MYXRpbk1ldHJpY3NSZWMgKSwKLQotICAgIChBRl9TY3JpcHRfSW5pdE1ldHJpY3NGdW5jKSBhZl9sYXRpbl9tZXRyaWNzX2luaXQsCi0gICAgKEFGX1NjcmlwdF9TY2FsZU1ldHJpY3NGdW5jKWFmX2xhdGluX21ldHJpY3Nfc2NhbGUsCi0gICAgKEFGX1NjcmlwdF9Eb25lTWV0cmljc0Z1bmMpIE5VTEwsCi0KLSAgICAoQUZfU2NyaXB0X0luaXRIaW50c0Z1bmMpICAgYWZfbGF0aW5faGludHNfaW5pdCwKLSAgICAoQUZfU2NyaXB0X0FwcGx5SGludHNGdW5jKSAgYWZfbGF0aW5faGludHNfYXBwbHkKLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmbGF0aW4uaCBiL3NyYy9hdXRvZml0L2FmbGF0aW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1MWQzNy4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZmxhdGluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZsYXRpbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIGxhdGluIHNjcmlwdCAoc3BlY2lmaWNhdGlvbikuICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQUZMQVRJTl9IX18KLSNkZWZpbmUgX19BRkxBVElOX0hfXwotCi0jaW5jbHVkZSAiYWZoaW50cy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogdGhlIGxhdGluLXNwZWNpZmljIHNjcmlwdCBjbGFzcyAqLwotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2xhdGluX3NjcmlwdF9jbGFzczsKLQotCi0vKiBjb25zdGFudHMgYXJlIGdpdmVuIHdpdGggdW5pdHNfcGVyX2VtID09IDIwNDggaW4gbWluZCAqLwotI2RlZmluZSBBRl9MQVRJTl9DT05TVEFOVCggbWV0cmljcywgYyApIFwKLSAgKCAoIChjKSAqIChGVF9Mb25nKSggKEFGX0xhdGluTWV0cmljcykobWV0cmljcykgKS0+dW5pdHNfcGVyX2VtICkgLyAyMDQ4ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgIEwgQSBUIEkgTiAgIEcgTCBPIEIgQSBMICAgTSBFIFQgUiBJIEMgUyAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoKLSAgICogIFRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zIGNvdWxkIGJlIGVtYmVkZGVkIGluIHRoZSBmaWxlIGBhZmxhdGluLmMnOwotICAgKiAgdGhleSBoYXZlIGJlZW4gbWFkZSBzZW1pLXB1YmxpYyB0byBhbGxvdyBhbHRlcm5hdGUgc2NyaXB0IGhpbnRlcnMgdG8KLSAgICogIHJlLXVzZSBzb21lIG9mIHRoZW0uCi0gICAqLwotCi0KLSAgLyogTGF0aW4gKGdsb2JhbCkgbWV0cmljcyBtYW5hZ2VtZW50ICovCi0KLSAgZW51bQotICB7Ci0gICAgQUZfTEFUSU5fQkxVRV9DQVBJVEFMX1RPUCwKLSAgICBBRl9MQVRJTl9CTFVFX0NBUElUQUxfQk9UVE9NLAotICAgIEFGX0xBVElOX0JMVUVfU01BTExfRl9UT1AsCi0gICAgQUZfTEFUSU5fQkxVRV9TTUFMTF9UT1AsCi0gICAgQUZfTEFUSU5fQkxVRV9TTUFMTF9CT1RUT00sCi0gICAgQUZfTEFUSU5fQkxVRV9TTUFMTF9NSU5PUiwKLQotICAgIEFGX0xBVElOX0JMVUVfTUFYCi0gIH07Ci0KLQotI2RlZmluZSBBRl9MQVRJTl9JU19UT1BfQkxVRSggYiApICAoIChiKSA9PSBBRl9MQVRJTl9CTFVFX0NBUElUQUxfVE9QIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPT0gQUZfTEFUSU5fQkxVRV9TTUFMTF9GX1RPUCB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIpID09IEFGX0xBVElOX0JMVUVfU01BTExfVE9QICAgKQotCi0jZGVmaW5lIEFGX0xBVElOX01BWF9XSURUSFMgIDE2Ci0jZGVmaW5lIEFGX0xBVElOX01BWF9CTFVFUyAgIEFGX0xBVElOX0JMVUVfTUFYCi0KLQotICBlbnVtCi0gIHsKLSAgICBBRl9MQVRJTl9CTFVFX0FDVElWRSAgICAgPSAxIDw8IDAsCi0gICAgQUZfTEFUSU5fQkxVRV9UT1AgICAgICAgID0gMSA8PCAxLAotICAgIEFGX0xBVElOX0JMVUVfQURKVVNUTUVOVCA9IDEgPDwgMiwgIC8qIHVzZWQgZm9yIHNjYWxlIGFkanVzdG1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcHRpbWl6YXRpb24gICAgICAgICAgICAgICovCi0gICAgQUZfTEFUSU5fQkxVRV9GTEFHX01BWAotICB9OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGX0xhdGluQmx1ZVJlY18KLSAgewotICAgIEFGX1dpZHRoUmVjICByZWY7Ci0gICAgQUZfV2lkdGhSZWMgIHNob290OwotICAgIEZUX1VJbnQgICAgICBmbGFnczsKLQotICB9IEFGX0xhdGluQmx1ZVJlYywgKkFGX0xhdGluQmx1ZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9MYXRpbkF4aXNSZWNfCi0gIHsKLSAgICBGVF9GaXhlZCAgICAgICAgIHNjYWxlOwotICAgIEZUX1BvcyAgICAgICAgICAgZGVsdGE7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgIHdpZHRoX2NvdW50OwotICAgIEFGX1dpZHRoUmVjICAgICAgd2lkdGhzW0FGX0xBVElOX01BWF9XSURUSFNdOwotICAgIEZUX1BvcyAgICAgICAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQ7Ci0gICAgRlRfUG9zICAgICAgICAgICBzdGFuZGFyZF93aWR0aDsKLSAgICBGVF9Cb29sICAgICAgICAgIGV4dHJhX2xpZ2h0OwotCi0gICAgLyogaWdub3JlZCBmb3IgaG9yaXpvbnRhbCBtZXRyaWNzICovCi0gICAgRlRfQm9vbCAgICAgICAgICBjb250cm9sX292ZXJzaG9vdDsKLSAgICBGVF9VSW50ICAgICAgICAgIGJsdWVfY291bnQ7Ci0gICAgQUZfTGF0aW5CbHVlUmVjICBibHVlc1tBRl9MQVRJTl9CTFVFX01BWF07Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgIG9yZ19zY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgICAgIG9yZ19kZWx0YTsKLQotICB9IEFGX0xhdGluQXhpc1JlYywgKkFGX0xhdGluQXhpczsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9MYXRpbk1ldHJpY3NSZWNfCi0gIHsKLSAgICBBRl9TY3JpcHRNZXRyaWNzUmVjICByb290OwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIHVuaXRzX3Blcl9lbTsKLSAgICBBRl9MYXRpbkF4aXNSZWMgICAgICBheGlzW0FGX0RJTUVOU0lPTl9NQVhdOwotCi0gIH0gQUZfTGF0aW5NZXRyaWNzUmVjLCAqQUZfTGF0aW5NZXRyaWNzOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW5fbWV0cmljc19pbml0KCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9sYXRpbl9tZXRyaWNzX3NjYWxlKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgICAgc2NhbGVyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZl9sYXRpbl9tZXRyaWNzX2luaXRfd2lkdGhzKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICBjaGFyY29kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICBMIEEgVCBJIE4gICBHIEwgWSBQIEggICBBIE4gQSBMIFkgUyBJIFMgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgZW51bQotICB7Ci0gICAgQUZfTEFUSU5fSElOVFNfSE9SWl9TTkFQICAgPSAxIDw8IDAsIC8qIGVuYWJsZSBzdGVtIHdpZHRoIHNuYXBwaW5nICAqLwotICAgIEFGX0xBVElOX0hJTlRTX1ZFUlRfU05BUCAgID0gMSA8PCAxLCAvKiBlbmFibGUgc3RlbSBoZWlnaHQgc25hcHBpbmcgKi8KLSAgICBBRl9MQVRJTl9ISU5UU19TVEVNX0FESlVTVCA9IDEgPDwgMiwgLyogZW5hYmxlIHN0ZW0gd2lkdGgvaGVpZ2h0ICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkanVzdG1lbnQgICAgICAgICAgICAgICAgICAqLwotICAgIEFGX0xBVElOX0hJTlRTX01PTk8gICAgICAgID0gMSA8PCAzICAvKiBpbmRpY2F0ZSBtb25vY2hyb21lICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVuZGVyaW5nICAgICAgICAgICAgICAgICAgICovCi0gIH07Ci0KLQotI2RlZmluZSBBRl9MQVRJTl9ISU5UU19ET19IT1JaX1NOQVAoIGggKSAgICAgICAgICAgICBcCi0gIEFGX0hJTlRTX1RFU1RfT1RIRVIoIGgsIEFGX0xBVElOX0hJTlRTX0hPUlpfU05BUCApCi0KLSNkZWZpbmUgQUZfTEFUSU5fSElOVFNfRE9fVkVSVF9TTkFQKCBoICkgICAgICAgICAgICAgXAotICBBRl9ISU5UU19URVNUX09USEVSKCBoLCBBRl9MQVRJTl9ISU5UU19WRVJUX1NOQVAgKQotCi0jZGVmaW5lIEFGX0xBVElOX0hJTlRTX0RPX1NURU1fQURKVVNUKCBoICkgICAgICAgICAgICAgXAotICBBRl9ISU5UU19URVNUX09USEVSKCBoLCBBRl9MQVRJTl9ISU5UU19TVEVNX0FESlVTVCApCi0KLSNkZWZpbmUgQUZfTEFUSU5fSElOVFNfRE9fTU9OTyggaCApICAgICAgICAgICAgIFwKLSAgQUZfSElOVFNfVEVTVF9PVEhFUiggaCwgQUZfTEFUSU5fSElOVFNfTU9OTyApCi0KLQotICAvKgotICAgKiAgVGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgYmUgZXhwb3J0ZWQuICBIb3dldmVyLCBvdGhlciBzY3JpcHRzIG1pZ2h0Ci0gICAqICBsaWtlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzLWlzLgotICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW5faGludHNfY29tcHV0ZV9zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApOwotCi0gIC8qCi0gICAqICBUaGlzIHNob3VsZG4ndCBub3JtYWxseSBiZSBleHBvcnRlZC4gIEhvd2V2ZXIsIG90aGVyIHNjcmlwdHMgbWlnaHQKLSAgICogIHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gYXMtaXMuCi0gICAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX2xhdGluX2hpbnRzX2xpbmtfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0gKTsKLQotICAvKgotICAgKiAgVGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgYmUgZXhwb3J0ZWQuICBIb3dldmVyLCBvdGhlciBzY3JpcHRzIG1pZ2h0Ci0gICAqICB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzLWlzLgotICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW5faGludHNfY29tcHV0ZV9lZGdlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmX2xhdGluX2hpbnRzX2RldGVjdF9mZWF0dXJlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICk7Ci0KLS8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fQUZMQVRJTl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmbGF0aW4yLmMgYi9zcmMvYXV0b2ZpdC9hZmxhdGluMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQxNzc0Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmbGF0aW4yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbGF0aW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBsYXRpbiBzY3JpcHQgKGJvZHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImFmbGF0aW4uaCIKLSNpbmNsdWRlICJhZmxhdGluMi5oIgotI2luY2x1ZGUgImFmZXJyb3JzLmgiCi0KLQotI2lmZGVmIEFGX1VTRV9XQVJQRVIKLSNpbmNsdWRlICJhZndhcnAuaCIKLSNlbmRpZgotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9sYXRpbjJfaGludHNfY29tcHV0ZV9zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApOwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2xhdGluMl9oaW50c19saW5rX3NlZ21lbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApOwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgIEwgQSBUIEkgTiAgIEcgTCBPIEIgQSBMICAgTSBFIFQgUiBJIEMgUyAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX2xhdGluMl9tZXRyaWNzX2luaXRfd2lkdGhzKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICBjaGFyY29kZSApCi0gIHsKLSAgICAvKiBzY2FuIHRoZSBhcnJheSBvZiBzZWdtZW50cyBpbiBlYWNoIGRpcmVjdGlvbiAqLwotICAgIEFGX0dseXBoSGludHNSZWMgIGhpbnRzWzFdOwotCi0KLSAgICBhZl9nbHlwaF9oaW50c19pbml0KCBoaW50cywgZmFjZS0+bWVtb3J5ICk7Ci0KLSAgICBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS53aWR0aF9jb3VudCA9IDA7Ci0gICAgbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0ud2lkdGhfY291bnQgPSAwOwotCi0gICAgewotICAgICAgRlRfRXJyb3IgICAgICAgICAgICAgZXJyb3I7Ci0gICAgICBGVF9VSW50ICAgICAgICAgICAgICBnbHlwaF9pbmRleDsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgIGRpbTsKLSAgICAgIEFGX0xhdGluTWV0cmljc1JlYyAgIGR1bW15WzFdOwotICAgICAgQUZfU2NhbGVyICAgICAgICAgICAgc2NhbGVyID0gJmR1bW15LT5yb290LnNjYWxlcjsKLQotCi0gICAgICBnbHlwaF9pbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCBjaGFyY29kZSApOwotICAgICAgaWYgKCBnbHlwaF9pbmRleCA9PSAwICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX05PX1NDQUxFICk7Ci0gICAgICBpZiAoIGVycm9yIHx8IGZhY2UtPmdseXBoLT5vdXRsaW5lLm5fcG9pbnRzIDw9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1pFUk8oIGR1bW15ICk7Ci0KLSAgICAgIGR1bW15LT51bml0c19wZXJfZW0gPSBtZXRyaWNzLT51bml0c19wZXJfZW07Ci0gICAgICBzY2FsZXItPnhfc2NhbGUgICAgID0gc2NhbGVyLT55X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBzY2FsZXItPnhfZGVsdGEgICAgID0gc2NhbGVyLT55X2RlbHRhID0gMDsKLSAgICAgIHNjYWxlci0+ZmFjZSAgICAgICAgPSBmYWNlOwotICAgICAgc2NhbGVyLT5yZW5kZXJfbW9kZSA9IEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLSAgICAgIHNjYWxlci0+ZmxhZ3MgICAgICAgPSAwOwotCi0gICAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgKEFGX1NjcmlwdE1ldHJpY3MpZHVtbXkgKTsKLQotICAgICAgZXJyb3IgPSBhZl9nbHlwaF9oaW50c19yZWxvYWQoIGhpbnRzLCAmZmFjZS0+Z2x5cGgtPm91dGxpbmUsIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZvciAoIGRpbSA9IDA7IGRpbSA8IEFGX0RJTUVOU0lPTl9NQVg7IGRpbSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfTGF0aW5BeGlzICBheGlzICAgID0gJm1ldHJpY3MtPmF4aXNbZGltXTsKLSAgICAgICAgQUZfQXhpc0hpbnRzICBheGhpbnRzID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgICAgIEFGX1NlZ21lbnQgICAgc2VnLCBsaW1pdCwgbGluazsKLSAgICAgICAgRlRfVUludCAgICAgICBudW1fd2lkdGhzID0gMDsKLQotCi0gICAgICAgIGVycm9yID0gYWZfbGF0aW4yX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMoIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBhZl9sYXRpbjJfaGludHNfbGlua19zZWdtZW50cyggaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9EaW1lbnNpb24pZGltICk7Ci0KLSAgICAgICAgc2VnICAgPSBheGhpbnRzLT5zZWdtZW50czsKLSAgICAgICAgbGltaXQgPSBzZWcgKyBheGhpbnRzLT5udW1fc2VnbWVudHM7Ci0KLSAgICAgICAgZm9yICggOyBzZWcgPCBsaW1pdDsgc2VnKysgKQotICAgICAgICB7Ci0gICAgICAgICAgbGluayA9IHNlZy0+bGluazsKLQotICAgICAgICAgIC8qIHdlIG9ubHkgY29uc2lkZXIgc3RlbSBzZWdtZW50cyB0aGVyZSEgKi8KLSAgICAgICAgICBpZiAoIGxpbmsgJiYgbGluay0+bGluayA9PSBzZWcgJiYgbGluayA+IHNlZyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICBkaXN0OwotCi0KLSAgICAgICAgICAgIGRpc3QgPSBzZWctPnBvcyAtIGxpbmstPnBvczsKLSAgICAgICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgICAgIGlmICggbnVtX3dpZHRocyA8IEFGX0xBVElOX01BWF9XSURUSFMgKQotICAgICAgICAgICAgICBheGlzLT53aWR0aHNbIG51bV93aWR0aHMrKyBdLm9yZyA9IGRpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWZfc29ydF93aWR0aHMoIG51bV93aWR0aHMsIGF4aXMtPndpZHRocyApOwotICAgICAgICBheGlzLT53aWR0aF9jb3VudCA9IG51bV93aWR0aHM7Ci0gICAgICB9Ci0KLSAgRXhpdDoKLSAgICAgIGZvciAoIGRpbSA9IDA7IGRpbSA8IEFGX0RJTUVOU0lPTl9NQVg7IGRpbSsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfTGF0aW5BeGlzICBheGlzID0gJm1ldHJpY3MtPmF4aXNbZGltXTsKLSAgICAgICAgRlRfUG9zICAgICAgICBzdGR3OwotCi0KLSAgICAgICAgc3RkdyA9ICggYXhpcy0+d2lkdGhfY291bnQgPiAwICkKLSAgICAgICAgICAgICAgICAgPyBheGlzLT53aWR0aHNbMF0ub3JnCi0gICAgICAgICAgICAgICAgIDogQUZfTEFUSU5fQ09OU1RBTlQoIG1ldHJpY3MsIDUwICk7Ci0KLSAgICAgICAgLyogbGV0J3MgdHJ5IDIwJSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggKi8KLSAgICAgICAgYXhpcy0+ZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSBzdGR3IC8gNTsKLSAgICAgICAgYXhpcy0+c3RhbmRhcmRfd2lkdGggICAgICAgICAgPSBzdGR3OwotICAgICAgICBheGlzLT5leHRyYV9saWdodCAgICAgICAgICAgICA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYWZfZ2x5cGhfaGludHNfZG9uZSggaGludHMgKTsKLSAgfQotCi0KLQotI2RlZmluZSBBRl9MQVRJTl9NQVhfVEVTVF9DSEFSQUNURVJTICAxMgotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0ICBhZl9sYXRpbjJfYmx1ZV9jaGFyc1tBRl9MQVRJTl9NQVhfQkxVRVNdID0KLSAgewotICAgICJUSEVaT0NRUyIsCi0gICAgIkhFWkxPQ1VTIiwKLSAgICAiZmlqa2RiaCIsCi0gICAgInh6cm9lc2MiLAotICAgICJ4enJvZXNjIiwKLSAgICAicHFnankiCi0gIH07Ci0KLQotICBzdGF0aWMgdm9pZAotICBhZl9sYXRpbjJfbWV0cmljc19pbml0X2JsdWVzKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICkKLSAgewotICAgIEZUX1BvcyAgICAgICAgZmxhdHMgW0FGX0xBVElOX01BWF9URVNUX0NIQVJBQ1RFUlNdOwotICAgIEZUX1BvcyAgICAgICAgcm91bmRzW0FGX0xBVElOX01BWF9URVNUX0NIQVJBQ1RFUlNdOwotICAgIEZUX0ludCAgICAgICAgbnVtX2ZsYXRzOwotICAgIEZUX0ludCAgICAgICAgbnVtX3JvdW5kczsKLSAgICBGVF9JbnQgICAgICAgIGJiOwotICAgIEFGX0xhdGluQmx1ZSAgYmx1ZTsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIEFGX0xhdGluQXhpcyAgYXhpcyAgPSAmbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF07Ci0gICAgRlRfR2x5cGhTbG90ICBnbHlwaCA9IGZhY2UtPmdseXBoOwotCi0KLSAgICAvKiB3ZSBjb21wdXRlIHRoZSBibHVlcyBzaW1wbHkgYnkgbG9hZGluZyBlYWNoIGNoYXJhY3RlciBmcm9tIHRoZSAgICAqLwotICAgIC8qICdhZl9sYXRpbjJfYmx1ZV9jaGFyc1tibHVlc10nIHN0cmluZywgdGhlbiBjb21wdXRlIGl0cyB0b3AtbW9zdCBvciAqLwotICAgIC8qIGJvdHRvbS1tb3N0IHBvaW50cyAoZGVwZW5kaW5nIG9uIGBBRl9JU19UT1BfQkxVRScpICAgICAgICAgICAgICAgICovCi0KLSAgICBBRl9MT0coKCAiYmx1ZSB6b25lcyBjb21wdXRhdGlvblxuIiApKTsKLSAgICBBRl9MT0coKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICkpOwotCi0gICAgZm9yICggYmIgPSAwOyBiYiA8IEFGX0xBVElOX0JMVUVfTUFYOyBiYisrICkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyKiAgcCAgICAgPSBhZl9sYXRpbjJfYmx1ZV9jaGFyc1tiYl07Ci0gICAgICBjb25zdCBjaGFyKiAgbGltaXQgPSBwICsgQUZfTEFUSU5fTUFYX1RFU1RfQ0hBUkFDVEVSUzsKLSAgICAgIEZUX1BvcyogICAgICBibHVlX3JlZjsKLSAgICAgIEZUX1BvcyogICAgICBibHVlX3Nob290OwotCi0KLSAgICAgIEFGX0xPRygoICJibHVlICUzZDogIiwgYmIgKSk7Ci0KLSAgICAgIG51bV9mbGF0cyAgPSAwOwotICAgICAgbnVtX3JvdW5kcyA9IDA7Ci0KLSAgICAgIGZvciAoIDsgcCA8IGxpbWl0ICYmICpwOyBwKysgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleDsKLSAgICAgICAgRlRfSW50ICAgICAgYmVzdF9wb2ludCwgYmVzdF95LCBiZXN0X2ZpcnN0LCBiZXN0X2xhc3Q7Ci0gICAgICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICAgICAgRlRfQm9vbCAgICAgcm91bmQ7Ci0KLQotICAgICAgICBBRl9MT0coKCAiJyVjJyIsICpwICkpOwotCi0gICAgICAgIC8qIGxvYWQgdGhlIGNoYXJhY3RlciBpbiB0aGUgZmFjZSAtLSBza2lwIHVua25vd24gb3IgZW1wdHkgb25lcyAqLwotICAgICAgICBnbHlwaF9pbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCAoRlRfVUludCkqcCApOwotICAgICAgICBpZiAoIGdseXBoX2luZGV4ID09IDAgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgZ2x5cGhfaW5kZXgsIEZUX0xPQURfTk9fU0NBTEUgKTsKLSAgICAgICAgaWYgKCBlcnJvciB8fCBnbHlwaC0+b3V0bGluZS5uX3BvaW50cyA8PSAwICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBub3cgY29tcHV0ZSBtaW4gb3IgbWF4IHBvaW50IGluZGljZXMgYW5kIGNvb3JkaW5hdGVzICovCi0gICAgICAgIHBvaW50cyAgICAgID0gZ2x5cGgtPm91dGxpbmUucG9pbnRzOwotICAgICAgICBiZXN0X3BvaW50ICA9IC0xOwotICAgICAgICBiZXN0X3kgICAgICA9IDA7ICAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgICAgIGJlc3RfZmlyc3QgID0gMDsgIC8qIGRpdHRvICovCi0gICAgICAgIGJlc3RfbGFzdCAgID0gMDsgIC8qIGRpdHRvICovCi0KLSAgICAgICAgewotICAgICAgICAgIEZUX0ludCAgbm47Ci0gICAgICAgICAgRlRfSW50ICBmaXJzdCA9IDA7Ci0gICAgICAgICAgRlRfSW50ICBsYXN0ICA9IC0xOwotCi0KLSAgICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgZ2x5cGgtPm91dGxpbmUubl9jb250b3VyczsgZmlyc3QgPSBsYXN0KzEsIG5uKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgb2xkX2Jlc3RfcG9pbnQgPSBiZXN0X3BvaW50OwotICAgICAgICAgICAgRlRfSW50ICBwcDsKLQotCi0gICAgICAgICAgICBsYXN0ID0gZ2x5cGgtPm91dGxpbmUuY29udG91cnNbbm5dOwotCi0gICAgICAgICAgICAvKiBBdm9pZCBzaW5nbGUtcG9pbnQgY29udG91cnMgc2luY2UgdGhleSBhcmUgbmV2ZXIgcmFzdGVyaXplZC4gKi8KLSAgICAgICAgICAgIC8qIEluIHNvbWUgZm9udHMsIHRoZXkgY29ycmVzcG9uZCB0byBtYXJrIGF0dGFjaG1lbnQgcG9pbnRzICAgICAqLwotICAgICAgICAgICAgLyogd2hpY2ggYXJlIHdheSBvdXRzaWRlIG9mIHRoZSBnbHlwaCdzIHJlYWwgb3V0bGluZS4gICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIGxhc3QgPT0gZmlyc3QgKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpZiAoIEFGX0xBVElOX0lTX1RPUF9CTFVFKCBiYiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm9yICggcHAgPSBmaXJzdDsgcHAgPD0gbGFzdDsgcHArKyApCi0gICAgICAgICAgICAgICAgaWYgKCBiZXN0X3BvaW50IDwgMCB8fCBwb2ludHNbcHBdLnkgPiBiZXN0X3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJlc3RfcG9pbnQgPSBwcDsKLSAgICAgICAgICAgICAgICAgIGJlc3RfeSAgICAgPSBwb2ludHNbcHBdLnk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmb3IgKCBwcCA9IGZpcnN0OyBwcCA8PSBsYXN0OyBwcCsrICkKLSAgICAgICAgICAgICAgICBpZiAoIGJlc3RfcG9pbnQgPCAwIHx8IHBvaW50c1twcF0ueSA8IGJlc3RfeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmVzdF9wb2ludCA9IHBwOwotICAgICAgICAgICAgICAgICAgYmVzdF95ICAgICA9IHBvaW50c1twcF0ueTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggYmVzdF9wb2ludCAhPSBvbGRfYmVzdF9wb2ludCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJlc3RfZmlyc3QgPSBmaXJzdDsKLSAgICAgICAgICAgICAgYmVzdF9sYXN0ICA9IGxhc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIEFGX0xPRygoICIlNWQiLCBiZXN0X3kgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgY2hlY2sgd2hldGhlciB0aGUgcG9pbnQgYmVsb25ncyB0byBhIHN0cmFpZ2h0IG9yIHJvdW5kICAgKi8KLSAgICAgICAgLyogc2VnbWVudDsgd2UgZmlyc3QgbmVlZCB0byBmaW5kIGluIHdoaWNoIGNvbnRvdXIgdGhlIGV4dHJlbXVtICovCi0gICAgICAgIC8qIGxpZXMsIHRoZW4gaW5zcGVjdCBpdHMgcHJldmlvdXMgYW5kIG5leHQgcG9pbnRzICAgICAgICAgICAgICAqLwotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBzdGFydCwgZW5kLCBwcmV2LCBuZXh0OwotICAgICAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICAgICAgLyogbm93IGxvb2sgZm9yIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBwb2ludHMgdGhhdCBhcmUgbm90IG9uIHRoZSAqLwotICAgICAgICAgIC8qIHNhbWUgWSBjb29yZGluYXRlLiAgVGhyZXNob2xkIHRoZSBgY2xvc2VuZXNzJy4uLiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBzdGFydCA9IGVuZCA9IGJlc3RfcG9pbnQ7Ci0KLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXYgPSBzdGFydC0xOwotICAgICAgICAgICAgaWYgKCBwcmV2IDwgYmVzdF9maXJzdCApCi0gICAgICAgICAgICAgIHByZXYgPSBiZXN0X2xhc3Q7Ci0KLSAgICAgICAgICAgIGRpc3QgPSBwb2ludHNbcHJldl0ueSAtIGJlc3RfeTsKLSAgICAgICAgICAgIGlmICggZGlzdCA8IC01IHx8IGRpc3QgPiA1ICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHN0YXJ0ID0gcHJldjsKLQotICAgICAgICAgIH0gd2hpbGUgKCBzdGFydCAhPSBiZXN0X3BvaW50ICk7Ci0KLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5leHQgPSBlbmQrMTsKLSAgICAgICAgICAgIGlmICggbmV4dCA+IGJlc3RfbGFzdCApCi0gICAgICAgICAgICAgIG5leHQgPSBiZXN0X2ZpcnN0OwotCi0gICAgICAgICAgICBkaXN0ID0gcG9pbnRzW25leHRdLnkgLSBiZXN0X3k7Ci0gICAgICAgICAgICBpZiAoIGRpc3QgPCAtNSB8fCBkaXN0ID4gNSApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBlbmQgPSBuZXh0OwotCi0gICAgICAgICAgfSB3aGlsZSAoIGVuZCAhPSBiZXN0X3BvaW50ICk7Ci0KLSAgICAgICAgICAvKiBub3csIHNldCB0aGUgYHJvdW5kJyBmbGFnIGRlcGVuZGluZyBvbiB0aGUgc2VnbWVudCdzIGtpbmQgKi8KLSAgICAgICAgICByb3VuZCA9IEZUX0JPT0woCi0gICAgICAgICAgICBGVF9DVVJWRV9UQUcoIGdseXBoLT5vdXRsaW5lLnRhZ3Nbc3RhcnRdICkgIT0gRlRfQ1VSVkVfVEFHX09OIHx8Ci0gICAgICAgICAgICBGVF9DVVJWRV9UQUcoIGdseXBoLT5vdXRsaW5lLnRhZ3NbIGVuZCBdICkgIT0gRlRfQ1VSVkVfVEFHX09OICk7Ci0KLSAgICAgICAgICBBRl9MT0coKCAiJWMgIiwgcm91bmQgPyAncicgOiAnZicgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHJvdW5kICkKLSAgICAgICAgICByb3VuZHNbbnVtX3JvdW5kcysrXSA9IGJlc3RfeTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZsYXRzW251bV9mbGF0cysrXSAgID0gYmVzdF95OwotICAgICAgfQotCi0gICAgICBBRl9MT0coKCAiXG4iICkpOwotCi0gICAgICBpZiAoIG51bV9mbGF0cyA9PSAwICYmIG51bV9yb3VuZHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICB3ZSBjb3VsZG4ndCBmaW5kIGEgc2luZ2xlIGdseXBoIHRvIGNvbXB1dGUgdGhpcyBibHVlIHpvbmUsCi0gICAgICAgICAqICB3ZSB3aWxsIHNpbXBseSBpZ25vcmUgaXQgdGhlbgotICAgICAgICAgKi8KLSAgICAgICAgQUZfTE9HKCggImVtcHR5IVxuIiApKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIGhhdmUgY29tcHV0ZWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBgcm91bmRzJyBhbmQgYGZsYXRzJyB0YWJsZXMsICovCi0gICAgICAvKiBub3cgZGV0ZXJtaW5lIHRoZSByZWZlcmVuY2UgYW5kIG92ZXJzaG9vdCBwb3NpdGlvbiBvZiB0aGUgYmx1ZSAtLSAqLwotICAgICAgLyogd2Ugc2ltcGx5IHRha2UgdGhlIG1lZGlhbiB2YWx1ZSBhZnRlciBhIHNpbXBsZSBzb3J0ICAgICAgICAgICAgICAgKi8KLSAgICAgIGFmX3NvcnRfcG9zKCBudW1fcm91bmRzLCByb3VuZHMgKTsKLSAgICAgIGFmX3NvcnRfcG9zKCBudW1fZmxhdHMsICBmbGF0cyApOwotCi0gICAgICBibHVlICAgICAgID0gJiBheGlzLT5ibHVlc1theGlzLT5ibHVlX2NvdW50XTsKLSAgICAgIGJsdWVfcmVmICAgPSAmIGJsdWUtPnJlZi5vcmc7Ci0gICAgICBibHVlX3Nob290ID0gJiBibHVlLT5zaG9vdC5vcmc7Ci0KLSAgICAgIGF4aXMtPmJsdWVfY291bnQrKzsKLQotICAgICAgaWYgKCBudW1fZmxhdHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpibHVlX3JlZiAgID0KLSAgICAgICAgKmJsdWVfc2hvb3QgPSByb3VuZHNbbnVtX3JvdW5kcyAvIDJdOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIG51bV9yb3VuZHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpibHVlX3JlZiAgID0KLSAgICAgICAgKmJsdWVfc2hvb3QgPSBmbGF0c1tudW1fZmxhdHMgLyAyXTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmJsdWVfcmVmICAgPSBmbGF0c1tudW1fZmxhdHMgLyAyXTsKLSAgICAgICAgKmJsdWVfc2hvb3QgPSByb3VuZHNbbnVtX3JvdW5kcyAvIDJdOwotICAgICAgfQotCi0gICAgICAvKiB0aGVyZSBhcmUgc29tZXRpbWVzIHByb2JsZW1zOiBpZiB0aGUgb3ZlcnNob290IHBvc2l0aW9uIG9mIHRvcCAgICAgKi8KLSAgICAgIC8qIHpvbmVzIGlzIHVuZGVyIGl0cyByZWZlcmVuY2UgcG9zaXRpb24sIG9yIHRoZSBvcHBvc2l0ZSBmb3IgYm90dG9tICAqLwotICAgICAgLyogem9uZXMuICBXZSBtdXN0IHRodXMgY2hlY2sgZXZlcnl0aGluZyB0aGVyZSBhbmQgY29ycmVjdCB0aGUgZXJyb3JzICovCi0gICAgICBpZiAoICpibHVlX3Nob290ICE9ICpibHVlX3JlZiApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgIHJlZiAgICAgID0gKmJsdWVfcmVmOwotICAgICAgICBGVF9Qb3MgICBzaG9vdCAgICA9ICpibHVlX3Nob290OwotICAgICAgICBGVF9Cb29sICBvdmVyX3JlZiA9IEZUX0JPT0woIHNob290ID4gcmVmICk7Ci0KLQotICAgICAgICBpZiAoIEFGX0xBVElOX0lTX1RPUF9CTFVFKCBiYiApIF4gb3Zlcl9yZWYgKQotICAgICAgICAgICpibHVlX3Nob290ID0gKmJsdWVfcmVmID0gKCBzaG9vdCArIHJlZiApIC8gMjsKLSAgICAgIH0KLQotICAgICAgYmx1ZS0+ZmxhZ3MgPSAwOwotICAgICAgaWYgKCBBRl9MQVRJTl9JU19UT1BfQkxVRSggYmIgKSApCi0gICAgICAgIGJsdWUtPmZsYWdzIHw9IEFGX0xBVElOX0JMVUVfVE9QOwotCi0gICAgICAvKgotICAgICAgICogVGhlIGZvbGxvd2luZyBmbGFncyBpcyB1c2VkIGxhdGVyIHRvIGFkanVzdCB0aGUgeSBhbmQgeCBzY2FsZXMKLSAgICAgICAqIGluIG9yZGVyIHRvIG9wdGltaXplIHRoZSBwaXhlbCBncmlkIGFsaWdubWVudCBvZiB0aGUgdG9wIG9mIHNtYWxsCi0gICAgICAgKiBsZXR0ZXJzLgotICAgICAgICovCi0gICAgICBpZiAoIGJiID09IEFGX0xBVElOX0JMVUVfU01BTExfVE9QICkKLSAgICAgICAgYmx1ZS0+ZmxhZ3MgfD0gQUZfTEFUSU5fQkxVRV9BREpVU1RNRU5UOwotCi0gICAgICBBRl9MT0coKCAiLS0gcmVmID0gJWxkLCBzaG9vdCA9ICVsZFxuIiwgKmJsdWVfcmVmLCAqYmx1ZV9zaG9vdCApKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9sYXRpbjJfbWV0cmljc19pbml0KCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICBmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gQUZfRXJyX09rOwotICAgIEZUX0NoYXJNYXAgIG9sZG1hcCA9IGZhY2UtPmNoYXJtYXA7Ci0gICAgRlRfVUludCAgICAgZWU7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRW5jb2RpbmcgIGxhdGluX2VuY29kaW5nc1tdID0KLSAgICB7Ci0gICAgICBGVF9FTkNPRElOR19VTklDT0RFLAotICAgICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4sCi0gICAgICBGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRCwKLSAgICAgIEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzEsCi0gICAgICBGVF9FTkNPRElOR19OT05FICAvKiBlbmQgb2YgbGlzdCAqLwotICAgIH07Ci0KLQotICAgIG1ldHJpY3MtPnVuaXRzX3Blcl9lbSA9IGZhY2UtPnVuaXRzX3Blcl9FTTsKLQotICAgIC8qIGRvIHdlIGhhdmUgYSBsYXRpbiBjaGFybWFwIGluIHRoZXJlPyAqLwotICAgIGZvciAoIGVlID0gMDsgbGF0aW5fZW5jb2RpbmdzW2VlXSAhPSBGVF9FTkNPRElOR19OT05FOyBlZSsrICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1NlbGVjdF9DaGFybWFwKCBmYWNlLCBsYXRpbl9lbmNvZGluZ3NbZWVdICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICAvKiBGb3Igbm93LCBjb21wdXRlIHRoZSBzdGFuZGFyZCB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gdGhlIGBvJy4gKi8KLSAgICAgIGFmX2xhdGluMl9tZXRyaWNzX2luaXRfd2lkdGhzKCBtZXRyaWNzLCBmYWNlLCAnbycgKTsKLSAgICAgIGFmX2xhdGluMl9tZXRyaWNzX2luaXRfYmx1ZXMoIG1ldHJpY3MsIGZhY2UgKTsKLSAgICB9Ci0KLSAgICBGVF9TZXRfQ2hhcm1hcCggZmFjZSwgb2xkbWFwICk7Ci0gICAgcmV0dXJuIEFGX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW4yX21ldHJpY3Nfc2NhbGVfZGltKCBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TY2FsZXIgICAgICAgIHNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgICAgZGltICkKLSAgewotICAgIEZUX0ZpeGVkICAgICAgc2NhbGU7Ci0gICAgRlRfUG9zICAgICAgICBkZWx0YTsKLSAgICBBRl9MYXRpbkF4aXMgIGF4aXM7Ci0gICAgRlRfVUludCAgICAgICBubjsKLQotCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgIHsKLSAgICAgIHNjYWxlID0gc2NhbGVyLT54X3NjYWxlOwotICAgICAgZGVsdGEgPSBzY2FsZXItPnhfZGVsdGE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzY2FsZSA9IHNjYWxlci0+eV9zY2FsZTsKLSAgICAgIGRlbHRhID0gc2NhbGVyLT55X2RlbHRhOwotICAgIH0KLQotICAgIGF4aXMgPSAmbWV0cmljcy0+YXhpc1tkaW1dOwotCi0gICAgaWYgKCBheGlzLT5vcmdfc2NhbGUgPT0gc2NhbGUgJiYgYXhpcy0+b3JnX2RlbHRhID09IGRlbHRhICkKLSAgICAgIHJldHVybjsKLQotICAgIGF4aXMtPm9yZ19zY2FsZSA9IHNjYWxlOwotICAgIGF4aXMtPm9yZ19kZWx0YSA9IGRlbHRhOwotCi0gICAgLyoKLSAgICAgKiBjb3JyZWN0IFkgc2NhbGUgdG8gb3B0aW1pemUgdGhlIGFsaWdubWVudCBvZiB0aGUgdG9wIG9mIHNtYWxsCi0gICAgICogbGV0dGVycyB0byB0aGUgcGl4ZWwgZ3JpZAotICAgICAqLwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICkKLSAgICB7Ci0gICAgICBBRl9MYXRpbkF4aXMgIHZheGlzID0gJm1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX1ZFUlRdOwotICAgICAgQUZfTGF0aW5CbHVlICBibHVlID0gTlVMTDsKLQotCi0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgdmF4aXMtPmJsdWVfY291bnQ7IG5uKysgKQotICAgICAgewotICAgICAgICBpZiAoIHZheGlzLT5ibHVlc1tubl0uZmxhZ3MgJiBBRl9MQVRJTl9CTFVFX0FESlVTVE1FTlQgKQotICAgICAgICB7Ci0gICAgICAgICAgYmx1ZSA9ICZ2YXhpcy0+Ymx1ZXNbbm5dOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmx1ZSApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgc2NhbGVkID0gRlRfTXVsRml4KCBibHVlLT5zaG9vdC5vcmcsIHNjYWxlci0+eV9zY2FsZSApOwotICAgICAgICBGVF9Qb3MgIGZpdHRlZCA9ICggc2NhbGVkICsgNDAgKSAmIH42MzsKLQotI2lmIDEKLSAgICAgICAgaWYgKCBzY2FsZWQgIT0gZml0dGVkICkgewotICAgICAgICAgIHNjYWxlID0gRlRfTXVsRGl2KCBzY2FsZSwgZml0dGVkLCBzY2FsZWQgKTsKLSAgICAgICAgICBBRl9MT0coKCAiPT0gc2NhbGVkIHgtdG9wID0gJS4yZyAgZml0dGVkID0gJS4yZywgc2NhbGluZyA9ICUuNGdcbiIsIHNjYWxlZC82NC4wLCBmaXR0ZWQvNjQuMCwgKGZpdHRlZCoxLjApL3NjYWxlZCApKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICB9Ci0gICAgfQotCi0gICAgYXhpcy0+c2NhbGUgPSBzY2FsZTsKLSAgICBheGlzLT5kZWx0YSA9IGRlbHRhOwotCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgIHsKLSAgICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnhfc2NhbGUgPSBzY2FsZTsKLSAgICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnhfZGVsdGEgPSBkZWx0YTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnlfc2NhbGUgPSBzY2FsZTsKLSAgICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLnlfZGVsdGEgPSBkZWx0YTsKLSAgICB9Ci0KLSAgICAvKiBzY2FsZSB0aGUgc3RhbmRhcmQgd2lkdGhzICovCi0gICAgZm9yICggbm4gPSAwOyBubiA8IGF4aXMtPndpZHRoX2NvdW50OyBubisrICkKLSAgICB7Ci0gICAgICBBRl9XaWR0aCAgd2lkdGggPSBheGlzLT53aWR0aHMgKyBubjsKLQotCi0gICAgICB3aWR0aC0+Y3VyID0gRlRfTXVsRml4KCB3aWR0aC0+b3JnLCBzY2FsZSApOwotICAgICAgd2lkdGgtPmZpdCA9IHdpZHRoLT5jdXI7Ci0gICAgfQotCi0gICAgLyogYW4gZXh0cmEtbGlnaHQgYXhpcyBjb3JyZXNwb25kcyB0byBhIHN0YW5kYXJkIHdpZHRoIHRoYXQgaXMgKi8KLSAgICAvKiBzbWFsbGVyIHRoYW4gMC43NSBwaXhlbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGF4aXMtPmV4dHJhX2xpZ2h0ID0KLSAgICAgIChGVF9Cb29sKSggRlRfTXVsRml4KCBheGlzLT5zdGFuZGFyZF93aWR0aCwgc2NhbGUgKSA8IDMyICsgOCApOwotCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKQotICAgIHsKLSAgICAgIC8qIHNjYWxlIHRoZSBibHVlIHpvbmVzICovCi0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgYXhpcy0+Ymx1ZV9jb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0xhdGluQmx1ZSAgYmx1ZSA9ICZheGlzLT5ibHVlc1tubl07Ci0gICAgICAgIEZUX1BvcyAgICAgICAgZGlzdDsKLQotCi0gICAgICAgIGJsdWUtPnJlZi5jdXIgICA9IEZUX011bEZpeCggYmx1ZS0+cmVmLm9yZywgc2NhbGUgKSArIGRlbHRhOwotICAgICAgICBibHVlLT5yZWYuZml0ICAgPSBibHVlLT5yZWYuY3VyOwotICAgICAgICBibHVlLT5zaG9vdC5jdXIgPSBGVF9NdWxGaXgoIGJsdWUtPnNob290Lm9yZywgc2NhbGUgKSArIGRlbHRhOwotICAgICAgICBibHVlLT5zaG9vdC5maXQgPSBibHVlLT5zaG9vdC5jdXI7Ci0gICAgICAgIGJsdWUtPmZsYWdzICAgICY9IH5BRl9MQVRJTl9CTFVFX0FDVElWRTsKLQotICAgICAgICAvKiBhIGJsdWUgem9uZSBpcyBvbmx5IGFjdGl2ZSBpZiBpdCBpcyBsZXNzIHRoYW4gMy80IHBpeGVscyB0YWxsICovCi0gICAgICAgIGRpc3QgPSBGVF9NdWxGaXgoIGJsdWUtPnJlZi5vcmcgLSBibHVlLT5zaG9vdC5vcmcsIHNjYWxlICk7Ci0gICAgICAgIGlmICggZGlzdCA8PSA0OCAmJiBkaXN0ID49IC00OCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgIGRlbHRhMSwgZGVsdGEyOwotCi0gICAgICAgICAgZGVsdGExID0gYmx1ZS0+c2hvb3Qub3JnIC0gYmx1ZS0+cmVmLm9yZzsKLSAgICAgICAgICBkZWx0YTIgPSBkZWx0YTE7Ci0gICAgICAgICAgaWYgKCBkZWx0YTEgPCAwICkKLSAgICAgICAgICAgIGRlbHRhMiA9IC1kZWx0YTI7Ci0KLSAgICAgICAgICBkZWx0YTIgPSBGVF9NdWxGaXgoIGRlbHRhMiwgc2NhbGUgKTsKLQotICAgICAgICAgIGlmICggZGVsdGEyIDwgMzIgKQotICAgICAgICAgICAgZGVsdGEyID0gMDsKLSAgICAgICAgICBlbHNlIGlmICggZGVsdGEyIDwgNjQgKQotICAgICAgICAgICAgZGVsdGEyID0gMzIgKyAoICggKCBkZWx0YTIgLSAzMiApICsgMTYgKSAmIH4zMSApOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRlbHRhMiA9IEZUX1BJWF9ST1VORCggZGVsdGEyICk7Ci0KLSAgICAgICAgICBpZiAoIGRlbHRhMSA8IDAgKQotICAgICAgICAgICAgZGVsdGEyID0gLWRlbHRhMjsKLQotICAgICAgICAgIGJsdWUtPnJlZi5maXQgICA9IEZUX1BJWF9ST1VORCggYmx1ZS0+cmVmLmN1ciApOwotICAgICAgICAgIGJsdWUtPnNob290LmZpdCA9IGJsdWUtPnJlZi5maXQgKyBkZWx0YTI7Ci0KLSAgICAgICAgICBBRl9MT0coKCAiPj4gYWN0aXZhdGluZyBibHVlIHpvbmUgJWQ6ICByZWYuY3VyPSUuMmcgcmVmLmZpdD0lLjJnIHNob290LmN1cj0lLjJnIHNob290LmZpdD0lLjJnXG4iLAotICAgICAgICAgICAgICAgICAgIG5uLCBibHVlLT5yZWYuY3VyLzY0LjAsIGJsdWUtPnJlZi5maXQvNjQuMCwKLSAgICAgICAgICAgICAgICAgICBibHVlLT5zaG9vdC5jdXIvNjQuMCwgYmx1ZS0+c2hvb3QuZml0LzY0LjAgKSk7Ci0KLSAgICAgICAgICBibHVlLT5mbGFncyB8PSBBRl9MQVRJTl9CTFVFX0FDVElWRTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW4yX21ldHJpY3Nfc2NhbGUoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU2NhbGVyICAgICAgICBzY2FsZXIgKQotICB7Ci0gICAgbWV0cmljcy0+cm9vdC5zY2FsZXIucmVuZGVyX21vZGUgPSBzY2FsZXItPnJlbmRlcl9tb2RlOwotICAgIG1ldHJpY3MtPnJvb3Quc2NhbGVyLmZhY2UgICAgICAgID0gc2NhbGVyLT5mYWNlOwotCi0gICAgYWZfbGF0aW4yX21ldHJpY3Nfc2NhbGVfZGltKCBtZXRyaWNzLCBzY2FsZXIsIEFGX0RJTUVOU0lPTl9IT1JaICk7Ci0gICAgYWZfbGF0aW4yX21ldHJpY3Nfc2NhbGVfZGltKCBtZXRyaWNzLCBzY2FsZXIsIEFGX0RJTUVOU0lPTl9WRVJUICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgTCBBIFQgSSBOICAgRyBMIFkgUCBIICAgQSBOIEEgTCBZIFMgSSBTICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lICBTT1JUX1NFR01FTlRTCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2xhdGluMl9oaW50c19jb21wdXRlX3NlZ21lbnRzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgICAgICAgICA9ICZoaW50cy0+YXhpc1tkaW1dOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ICAgICAgICA9IGhpbnRzLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgICAgICAgID0gQUZfRXJyX09rOwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudCAgICAgICA9IE5VTEw7Ci0gICAgQUZfU2VnbWVudFJlYyBzZWcwOwotICAgIEFGX1BvaW50KiAgICAgY29udG91ciAgICAgICA9IGhpbnRzLT5jb250b3VyczsKLSAgICBBRl9Qb2ludCogICAgIGNvbnRvdXJfbGltaXQgPSBjb250b3VyICsgaGludHMtPm51bV9jb250b3VyczsKLSAgICBBRl9EaXJlY3Rpb24gIG1ham9yX2Rpciwgc2VnbWVudF9kaXI7Ci0KLQotICAgIEZUX1pFUk8oICZzZWcwICk7Ci0gICAgc2VnMC5zY29yZSA9IDMyMDAwOwotICAgIHNlZzAuZmxhZ3MgPSBBRl9FREdFX05PUk1BTDsKLQotICAgIG1ham9yX2RpciAgID0gKEFGX0RpcmVjdGlvbilGVF9BQlMoIGF4aXMtPm1ham9yX2RpciApOwotICAgIHNlZ21lbnRfZGlyID0gbWFqb3JfZGlyOwotCi0gICAgYXhpcy0+bnVtX3NlZ21lbnRzID0gMDsKLQotICAgIC8qIHNldCB1cCAodSx2KSBpbiBlYWNoIHBvaW50ICovCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQotICAgIHsKLSAgICAgIEFGX1BvaW50ICBwb2ludCA9IGhpbnRzLT5wb2ludHM7Ci0gICAgICBBRl9Qb2ludCAgbGltaXQgPSBwb2ludCArIGhpbnRzLT5udW1fcG9pbnRzOwotCi0KLSAgICAgIGZvciAoIDsgcG9pbnQgPCBsaW1pdDsgcG9pbnQrKyApCi0gICAgICB7Ci0gICAgICAgIHBvaW50LT51ID0gcG9pbnQtPmZ4OwotICAgICAgICBwb2ludC0+diA9IHBvaW50LT5meTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEFGX1BvaW50ICBwb2ludCA9IGhpbnRzLT5wb2ludHM7Ci0gICAgICBBRl9Qb2ludCAgbGltaXQgPSBwb2ludCArIGhpbnRzLT5udW1fcG9pbnRzOwotCi0KLSAgICAgIGZvciAoIDsgcG9pbnQgPCBsaW1pdDsgcG9pbnQrKyApCi0gICAgICB7Ci0gICAgICAgIHBvaW50LT51ID0gcG9pbnQtPmZ5OwotICAgICAgICBwb2ludC0+diA9IHBvaW50LT5meDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBkbyBlYWNoIGNvbnRvdXIgc2VwYXJhdGVseSAqLwotICAgIGZvciAoIDsgY29udG91ciA8IGNvbnRvdXJfbGltaXQ7IGNvbnRvdXIrKyApCi0gICAgewotICAgICAgQUZfUG9pbnQgIHBvaW50ICAgPSAgY29udG91clswXTsKLSAgICAgIEFGX1BvaW50ICBzdGFydCAgID0gIHBvaW50OwotICAgICAgQUZfUG9pbnQgIGxhc3QgICAgPSAgcG9pbnQtPnByZXY7Ci0KLQotICAgICAgaWYgKCBwb2ludCA9PSBsYXN0ICkgIC8qIHNraXAgc2luZ2xldG9ucyAtLSBqdXN0IGluIGNhc2UgKi8KLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIGFscmVhZHkgb24gYW4gZWRnZSA/LCBiYWNrdHJhY2sgdG8gZmluZCBpdHMgc3RhcnQgKi8KLSAgICAgIGlmICggRlRfQUJTKCBwb2ludC0+aW5fZGlyICkgPT0gbWFqb3JfZGlyICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQgPSBwb2ludC0+cHJldjsKLQotICAgICAgICB3aGlsZSAoIHBvaW50LT5pbl9kaXIgPT0gc3RhcnQtPmluX2RpciApCi0gICAgICAgICAgcG9pbnQgPSBwb2ludC0+cHJldjsKLSAgICAgIH0KLSAgICAgIGVsc2UgIC8qIG90aGVyd2lzZSwgZmluZCBmaXJzdCBzZWdtZW50IHN0YXJ0LCBpZiBhbnkgKi8KLSAgICAgIHsKLSAgICAgICAgd2hpbGUgKCBGVF9BQlMoIHBvaW50LT5vdXRfZGlyICkgIT0gbWFqb3JfZGlyICkKLSAgICAgICAgewotICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0KLSAgICAgICAgICBpZiAoIHBvaW50ID09IHN0YXJ0ICkKLSAgICAgICAgICAgIGdvdG8gTmV4dENvbnRvdXI7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc3RhcnQgPSBwb2ludDsKLQotICAgICAgZm9yICAoOzspCi0gICAgICB7Ci0gICAgICAgIEFGX1BvaW50ICBmaXJzdDsKLSAgICAgICAgRlRfUG9zICAgIG1pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92OwotCi0gICAgICAgIC8qIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBzZWdtZW50ICovCi0gICAgICAgIEZUX0FTU0VSVCggRlRfQUJTKCBwb2ludC0+b3V0X2RpciApID09IG1ham9yX2RpciAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQtPmluX2RpciAhPSBwb2ludC0+b3V0X2RpciApOwotICAgICAgICBmaXJzdCA9IHBvaW50OwotCi0gICAgICAgIG1pbl91ID0gbWF4X3UgPSBwb2ludC0+dTsKLSAgICAgICAgbWluX3YgPSBtYXhfdiA9IHBvaW50LT52OwotCi0gICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0KLSAgICAgICAgd2hpbGUgKCBwb2ludC0+b3V0X2RpciA9PSBmaXJzdC0+b3V0X2RpciApCi0gICAgICAgIHsKLSAgICAgICAgICBwb2ludCA9IHBvaW50LT5uZXh0OwotCi0gICAgICAgICAgaWYgKCBwb2ludC0+dSA8IG1pbl91ICkKLSAgICAgICAgICAgIG1pbl91ID0gcG9pbnQtPnU7Ci0KLSAgICAgICAgICBpZiAoIHBvaW50LT51ID4gbWF4X3UgKQotICAgICAgICAgICAgbWF4X3UgPSBwb2ludC0+dTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcG9pbnQtPnYgPCBtaW5fdiApCi0gICAgICAgICAgbWluX3YgPSBwb2ludC0+djsKLQotICAgICAgICBpZiAoIHBvaW50LT52ID4gbWF4X3YgKQotICAgICAgICAgIG1heF92ID0gcG9pbnQtPnY7Ci0KLSAgICAgICAgLyogcmVjb3JkIG5ldyBzZWdtZW50ICovCi0gICAgICAgIGVycm9yID0gYWZfYXhpc19oaW50c19uZXdfc2VnbWVudCggYXhpcywgbWVtb3J5LCAmc2VnbWVudCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgc2VnbWVudFswXSAgICAgICAgID0gc2VnMDsKLSAgICAgICAgc2VnbWVudC0+ZGlyICAgICAgID0gZmlyc3QtPm91dF9kaXI7Ci0gICAgICAgIHNlZ21lbnQtPmZpcnN0ICAgICA9IGZpcnN0OwotICAgICAgICBzZWdtZW50LT5sYXN0ICAgICAgPSBwb2ludDsKLSAgICAgICAgc2VnbWVudC0+Y29udG91ciAgID0gY29udG91cjsKLSAgICAgICAgc2VnbWVudC0+cG9zICAgICAgID0gKEZUX1Nob3J0KSgoIG1pbl91ICsgbWF4X3UgKSA+PiAxKTsKLSAgICAgICAgc2VnbWVudC0+bWluX2Nvb3JkID0gKEZUX1Nob3J0KSBtaW5fdjsKLSAgICAgICAgc2VnbWVudC0+bWF4X2Nvb3JkID0gKEZUX1Nob3J0KSBtYXhfdjsKLSAgICAgICAgc2VnbWVudC0+aGVpZ2h0ICAgID0gKEZUX1Nob3J0KShtYXhfdiAtIG1pbl92KTsKLQotICAgICAgICAvKiBhIHNlZ21lbnQgaXMgcm91bmQgaWYgaXQgZG9lc24ndCBoYXZlIHN1Y2Nlc3NpdmUgKi8KLSAgICAgICAgLyogb24tY3VydmUgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9Qb2ludCAgcHQgICA9IGZpcnN0OwotICAgICAgICAgIEFGX1BvaW50ICBsYXN0ID0gcG9pbnQ7Ci0gICAgICAgICAgQUZfRmxhZ3MgIGYwICAgPSAoQUZfRmxhZ3MpKHB0LT5mbGFncyAmIEFGX0ZMQUdfQ09OVFJPTCk7Ci0gICAgICAgICAgQUZfRmxhZ3MgIGYxOwotCi0KLSAgICAgICAgICBzZWdtZW50LT5mbGFncyAmPSB+QUZfRURHRV9ST1VORDsKLQotICAgICAgICAgIGZvciAoIDsgcHQgIT0gbGFzdDsgZjAgPSBmMSApCi0gICAgICAgICAgewotICAgICAgICAgICAgcHQgPSBwdC0+bmV4dDsKLSAgICAgICAgICAgIGYxID0gKEFGX0ZsYWdzKShwdC0+ZmxhZ3MgJiBBRl9GTEFHX0NPTlRST0wpOwotCi0gICAgICAgICAgICBpZiAoICFmMCAmJiAhZjEgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKCBwdCA9PSBsYXN0ICkKLSAgICAgICAgICAgICAgc2VnbWVudC0+ZmxhZ3MgfD0gQUZfRURHRV9ST1VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgIC8qIHRoaXMgY2FuIGhhcHBlbiBpbiB0aGUgY2FzZSBvZiBhIGRlZ2VuZXJhdGUgY29udG91cgotICAgICAgICAqIGUuZy4gYSAyLXBvaW50IHZlcnRpY2FsIGNvbnRvdXIKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKCBwb2ludCA9PSBzdGFydCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoganVtcCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc2VnbWVudCwgaWYgYW55ICovCi0gICAgICAgIHdoaWxlICggRlRfQUJTKHBvaW50LT5vdXRfZGlyKSAhPSBtYWpvcl9kaXIgKQotICAgICAgICB7Ci0gICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLQotICAgICAgICAgIGlmICggcG9pbnQgPT0gc3RhcnQgKQotICAgICAgICAgICAgZ290byBOZXh0Q29udG91cjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgTmV4dENvbnRvdXI6Ci0gICAgICA7Ci0gICAgfSAvKiBjb250b3VycyAqLwotCi0gICAgLyogbm93IHNsaWdodGx5IGluY3JlYXNlIHRoZSBoZWlnaHQgb2Ygc2VnbWVudHMgd2hlbiB0aGlzIG1ha2VzICovCi0gICAgLyogc2Vuc2UgLS0gdGhpcyBpcyB1c2VkIHRvIGJldHRlciBkZXRlY3QgYW5kIGlnbm9yZSBzZXJpZnMgICAgICovCi0gICAgewotICAgICAgQUZfU2VnbWVudCAgc2VnbWVudHMgICAgID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgICBBRl9TZWdtZW50ICBzZWdtZW50c19lbmQgPSBzZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50czsKLQotCi0gICAgICBmb3IgKCBzZWdtZW50ID0gc2VnbWVudHM7IHNlZ21lbnQgPCBzZWdtZW50c19lbmQ7IHNlZ21lbnQrKyApCi0gICAgICB7Ci0gICAgICAgIEFGX1BvaW50ICBmaXJzdCAgID0gc2VnbWVudC0+Zmlyc3Q7Ci0gICAgICAgIEFGX1BvaW50ICBsYXN0ICAgID0gc2VnbWVudC0+bGFzdDsKLSAgICAgICAgQUZfUG9pbnQgIHA7Ci0gICAgICAgIEZUX1BvcyAgICBmaXJzdF92ID0gZmlyc3QtPnY7Ci0gICAgICAgIEZUX1BvcyAgICBsYXN0X3YgID0gbGFzdC0+djsKLQotCi0gICAgICAgIGlmICggZmlyc3QgPT0gbGFzdCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKCBmaXJzdF92IDwgbGFzdF92ICkKLSAgICAgICAgewotICAgICAgICAgIHAgPSBmaXJzdC0+cHJldjsKLSAgICAgICAgICBpZiAoIHAtPnYgPCBmaXJzdF92ICkKLSAgICAgICAgICAgIHNlZ21lbnQtPmhlaWdodCA9IChGVF9TaG9ydCkoIHNlZ21lbnQtPmhlaWdodCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggZmlyc3RfdiAtIHAtPnYgKSA+PiAxICkgKTsKLQotICAgICAgICAgIHAgPSBsYXN0LT5uZXh0OwotICAgICAgICAgIGlmICggcC0+diA+IGxhc3RfdiApCi0gICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBzZWdtZW50LT5oZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHAtPnYgLSBsYXN0X3YgKSA+PiAxICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBwID0gZmlyc3QtPnByZXY7Ci0gICAgICAgICAgaWYgKCBwLT52ID4gZmlyc3RfdiApCi0gICAgICAgICAgICBzZWdtZW50LT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBzZWdtZW50LT5oZWlnaHQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHAtPnYgLSBmaXJzdF92ICkgPj4gMSApICk7Ci0KLSAgICAgICAgICBwID0gbGFzdC0+bmV4dDsKLSAgICAgICAgICBpZiAoIHAtPnYgPCBsYXN0X3YgKQotICAgICAgICAgICAgc2VnbWVudC0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggc2VnbWVudC0+aGVpZ2h0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCBsYXN0X3YgLSBwLT52ICkgPj4gMSApICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBBRl9TT1JUX1NFR01FTlRTCi0gICAvKiBwbGFjZSBhbGwgc2VnbWVudHMgd2l0aCBhIG5lZ2F0aXZlIGRpcmVjdGlvbiB0byB0aGUgc3RhcnQKLSAgICAqIG9mIHRoZSBhcnJheSwgdXNlZCB0byBzcGVlZCB1cCBzZWdtZW50IGxpbmtpbmcgbGF0ZXIuLi4KLSAgICAqLwotICAgIHsKLSAgICAgIEFGX1NlZ21lbnQgIHNlZ21lbnRzID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgICBGVF9VSW50ICAgICBjb3VudCAgICA9IGF4aXMtPm51bV9zZWdtZW50czsKLSAgICAgIEZUX1VJbnQgICAgIGlpLCBqajsKLQotICAgICAgZm9yIChpaSA9IDA7IGlpIDwgY291bnQ7IGlpKyspCi0gICAgICB7Ci0gICAgICAgIGlmICggc2VnbWVudHNbaWldLmRpciA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChqaiA9IGlpKzE7IGpqIDwgY291bnQ7IGpqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBzZWdtZW50c1tqal0uZGlyIDwgMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFGX1NlZ21lbnRSZWMgIHRtcDsKLQotICAgICAgICAgICAgICB0bXAgICAgICAgICAgPSBzZWdtZW50c1tpaV07Ci0gICAgICAgICAgICAgIHNlZ21lbnRzW2lpXSA9IHNlZ21lbnRzW2pqXTsKLSAgICAgICAgICAgICAgc2VnbWVudHNbampdID0gdG1wOwotCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggamogPT0gY291bnQgKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGF4aXMtPm1pZF9zZWdtZW50cyA9IGlpOwotICAgIH0KLSNlbmRpZgotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sYXRpbjJfaGludHNfbGlua19zZWdtZW50cyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzICAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRfbGltaXQgPSBzZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50czsKLSNpZmRlZiBBRl9TT1JUX1NFR01FTlRTCi0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50X21pZCAgID0gc2VnbWVudHMgKyBheGlzLT5taWRfc2VnbWVudHM7Ci0jZW5kaWYKLSAgICBGVF9Qb3MgICAgICAgIGxlbl90aHJlc2hvbGQsIGxlbl9zY29yZTsKLSAgICBBRl9TZWdtZW50ICAgIHNlZzEsIHNlZzI7Ci0KLQotICAgIGxlbl90aHJlc2hvbGQgPSBBRl9MQVRJTl9DT05TVEFOVCggaGludHMtPm1ldHJpY3MsIDggKTsKLSAgICBpZiAoIGxlbl90aHJlc2hvbGQgPT0gMCApCi0gICAgICBsZW5fdGhyZXNob2xkID0gMTsKLQotICAgIGxlbl9zY29yZSA9IEFGX0xBVElOX0NPTlNUQU5UKCBoaW50cy0+bWV0cmljcywgNjAwMCApOwotCi0jaWZkZWYgQUZfU09SVF9TRUdNRU5UUwotICAgIGZvciAoIHNlZzEgPSBzZWdtZW50czsgc2VnMSA8IHNlZ21lbnRfbWlkOyBzZWcxKysgKQotICAgIHsKLSAgICAgIGlmICggc2VnMS0+ZGlyICE9IGF4aXMtPm1ham9yX2RpciB8fCBzZWcxLT5maXJzdCA9PSBzZWcxLT5sYXN0ICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGZvciAoIHNlZzIgPSBzZWdtZW50X21pZDsgc2VnMiA8IHNlZ21lbnRfbGltaXQ7IHNlZzIrKyApCi0jZWxzZQotICAgIC8qIG5vdyBjb21wYXJlIGVhY2ggc2VnbWVudCB0byB0aGUgb3RoZXJzICovCi0gICAgZm9yICggc2VnMSA9IHNlZ21lbnRzOyBzZWcxIDwgc2VnbWVudF9saW1pdDsgc2VnMSsrICkKLSAgICB7Ci0gICAgICAvKiB0aGUgZmFrZSBzZWdtZW50cyBhcmUgaW50cm9kdWNlZCB0byBoaW50IHRoZSBtZXRyaWNzIC0tICovCi0gICAgICAvKiB3ZSBtdXN0IG5ldmVyIGxpbmsgdGhlbSB0byBhbnl0aGluZyAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHNlZzEtPmRpciAhPSBheGlzLT5tYWpvcl9kaXIgfHwgc2VnMS0+Zmlyc3QgPT0gc2VnMS0+bGFzdCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBmb3IgKCBzZWcyID0gc2VnbWVudHM7IHNlZzIgPCBzZWdtZW50X2xpbWl0OyBzZWcyKysgKQotICAgICAgICBpZiAoIHNlZzEtPmRpciArIHNlZzItPmRpciA9PSAwICYmIHNlZzItPnBvcyA+IHNlZzEtPnBvcyApCi0jZW5kaWYKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgcG9zMSA9IHNlZzEtPnBvczsKLSAgICAgICAgICBGVF9Qb3MgIHBvczIgPSBzZWcyLT5wb3M7Ci0gICAgICAgICAgRlRfUG9zICBkaXN0ID0gcG9zMiAtIHBvczE7Ci0KLQotICAgICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIG1pbiA9IHNlZzEtPm1pbl9jb29yZDsKLSAgICAgICAgICAgIEZUX1BvcyAgbWF4ID0gc2VnMS0+bWF4X2Nvb3JkOwotICAgICAgICAgICAgRlRfUG9zICBsZW4sIHNjb3JlOwotCi0KLSAgICAgICAgICAgIGlmICggbWluIDwgc2VnMi0+bWluX2Nvb3JkICkKLSAgICAgICAgICAgICAgbWluID0gc2VnMi0+bWluX2Nvb3JkOwotCi0gICAgICAgICAgICBpZiAoIG1heCA+IHNlZzItPm1heF9jb29yZCApCi0gICAgICAgICAgICAgIG1heCA9IHNlZzItPm1heF9jb29yZDsKLQotICAgICAgICAgICAgbGVuID0gbWF4IC0gbWluOwotICAgICAgICAgICAgaWYgKCBsZW4gPj0gbGVuX3RocmVzaG9sZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjb3JlID0gZGlzdCArIGxlbl9zY29yZSAvIGxlbjsKLSAgICAgICAgICAgICAgaWYgKCBzY29yZSA8IHNlZzEtPnNjb3JlICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlZzEtPnNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICAgICAgc2VnMS0+bGluayAgPSBzZWcyOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKCBzY29yZSA8IHNlZzItPnNjb3JlICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlZzItPnNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICAgICAgc2VnMi0+bGluayAgPSBzZWcxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbm93LCBjb21wdXRlIHRoZSBgc2VyaWYnIHNlZ21lbnRzICovCi0gICAgZm9yICggc2VnMSA9IHNlZ21lbnRzOyBzZWcxIDwgc2VnbWVudF9saW1pdDsgc2VnMSsrICkKLSAgICB7Ci0gICAgICBzZWcyID0gc2VnMS0+bGluazsKLQotICAgICAgaWYgKCBzZWcyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzZWcyLT5saW5rICE9IHNlZzEgKQotICAgICAgICB7Ci0gICAgICAgICAgc2VnMS0+bGluayAgPSAwOwotICAgICAgICAgIHNlZzEtPnNlcmlmID0gc2VnMi0+bGluazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmX2xhdGluMl9oaW50c19jb21wdXRlX2VkZ2VzKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgID0gJmhpbnRzLT5heGlzW2RpbV07Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgPSBBRl9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgIEFGX0xhdGluQXhpcyAgbGF4aXMgID0gJigoQUZfTGF0aW5NZXRyaWNzKWhpbnRzLT5tZXRyaWNzKS0+YXhpc1tkaW1dOwotCi0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50cyAgICAgID0gYXhpcy0+c2VnbWVudHM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWdtZW50X2xpbWl0ID0gc2VnbWVudHMgKyBheGlzLT5udW1fc2VnbWVudHM7Ci0gICAgQUZfU2VnbWVudCAgICBzZWc7Ci0KLSAgICBBRl9EaXJlY3Rpb24gIHVwX2RpcjsKLSAgICBGVF9GaXhlZCAgICAgIHNjYWxlOwotICAgIEZUX1BvcyAgICAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQ7Ci0gICAgRlRfUG9zICAgICAgICBzZWdtZW50X2xlbmd0aF90aHJlc2hvbGQ7Ci0KLQotICAgIGF4aXMtPm51bV9lZGdlcyA9IDA7Ci0KLSAgICBzY2FsZSA9ICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICkgPyBoaW50cy0+eF9zY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGhpbnRzLT55X3NjYWxlOwotCi0gICAgdXBfZGlyID0gKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKSA/IEFGX0RJUl9VUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBRl9ESVJfUklHSFQ7Ci0KLSAgICAvKgotICAgICAqICBXZSB3YW50IHRvIGlnbm9yZSB2ZXJ5IHNtYWxsIChtb3N0bHkgc2VyaWYpIHNlZ21lbnRzLCB3ZSBkbyB0aGF0Ci0gICAgICogIGJ5IGlnbm9yaW5nIHRob3NlIHRoYXQgd2hvc2UgbGVuZ3RoIGlzIGxlc3MgdGhhbiBhIGdpdmVuIGZyYWN0aW9uCi0gICAgICogIG9mIHRoZSBzdGFuZGFyZCB3aWR0aC4gSWYgdGhlcmUgaXMgbm8gc3RhbmRhcmQgd2lkdGgsIHdlIGlnbm9yZQotICAgICAqICB0aG9zZSB0aGF0IGFyZSBsZXNzIHRoYW4gYSBnaXZlbiBzaXplIGluIHBpeGVscwotICAgICAqCi0gICAgICogIGFsc28sIHVubGluayBzZXJpZiBzZWdtZW50cyB0aGF0IGFyZSBsaW5rZWQgdG8gc2VnbWVudHMgZmFydGhlcgotICAgICAqICB0aGFuIDUwJSBvZiB0aGUgc3RhbmRhcmQgd2lkdGgKLSAgICAgKi8KLSAgICBpZiAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApCi0gICAgewotICAgICAgaWYgKCBsYXhpcy0+d2lkdGhfY291bnQgPiAwICkKLSAgICAgICAgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkID0gKGxheGlzLT5zdGFuZGFyZF93aWR0aCAqIDEwICkgPj4gNDsKLSAgICAgIGVsc2UKLSAgICAgICAgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkID0gRlRfRGl2Rml4KCA2NCwgaGludHMtPnlfc2NhbGUgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkID0gMDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBXZSB3aWxsIGJlZ2luIGJ5IGdlbmVyYXRpbmcgYSBzb3J0ZWQgdGFibGUgb2YgZWRnZXMgZm9yIHRoZSAgICAgICAqLwotICAgIC8qIGN1cnJlbnQgZGlyZWN0aW9uLiAgVG8gZG8gc28sIHdlIHNpbXBseSBzY2FuIGVhY2ggc2VnbWVudCBhbmQgdHJ5ICovCi0gICAgLyogdG8gZmluZCBhbiBlZGdlIGluIG91ciB0YWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0cyBwb3NpdGlvbi4gICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIElmIG5vIGVkZ2UgaXMgZm91bmQsIHdlIGNyZWF0ZSBhbmQgaW5zZXJ0IGEgbmV3IGVkZ2UgaW4gdGhlICAgICAgICovCi0gICAgLyogc29ydGVkIHRhYmxlLiAgT3RoZXJ3aXNlLCB3ZSBzaW1wbHkgYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBlZGdlJ3MgKi8KLSAgICAvKiBsaXN0IHdoaWNoIHdpbGwgYmUgcHJvY2Vzc2VkIGluIHRoZSBzZWNvbmQgc3RlcCB0byBjb21wdXRlIHRoZSAgICAqLwotICAgIC8qIGVkZ2UncyBwcm9wZXJ0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBOb3RlIHRoYXQgdGhlIGVkZ2VzIHRhYmxlIGlzIHNvcnRlZCBhbG9uZyB0aGUgc2VnbWVudC9lZGdlICAgICAgICAqLwotICAgIC8qIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSBGVF9NdWxGaXgoIGxheGlzLT5lZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgKTsKLSAgICBpZiAoIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID4gNjQgLyA0ICkKLSAgICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gNjQgLyA0OwotCi0gICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSBGVF9EaXZGaXgoIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSApOwotCi0gICAgZm9yICggc2VnID0gc2VnbWVudHM7IHNlZyA8IHNlZ21lbnRfbGltaXQ7IHNlZysrICkKLSAgICB7Ci0gICAgICBBRl9FZGdlICBmb3VuZCA9IDA7Ci0gICAgICBGVF9JbnQgICBlZTsKLQotCi0gICAgICBpZiAoIHNlZy0+aGVpZ2h0IDwgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIEEgc3BlY2lhbCBjYXNlIGZvciBzZXJpZiBlZGdlczogSWYgdGhleSBhcmUgc21hbGxlciB0aGFuICovCi0gICAgICAvKiAxLjUgcGl4ZWxzIHdlIGlnbm9yZSB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBzZWctPnNlcmlmICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkaXN0ID0gc2VnLT5zZXJpZi0+cG9zIC0gc2VnLT5wb3M7Ci0KLSAgICAgICAgaWYgKGRpc3QgPCAwKQotICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICBpZiAoZGlzdCA+PSBsYXhpcy0+c3RhbmRhcmRfd2lkdGggPj4gMSkKLSAgICAgICAgewotICAgICAgICAgIC8qIHVubGluayB0aGlzIHNlcmlmLCBpdCBpcyB0b28gZGlzdGFudCBmcm9tIGl0cyByZWZlcmVuY2Ugc3RlbSAqLwotICAgICAgICAgIHNlZy0+c2VyaWYgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAyKnNlZy0+aGVpZ2h0IDwgMyAqIHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZCApCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGxvb2sgZm9yIGFuIGVkZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc2VnbWVudCAqLwotICAgICAgZm9yICggZWUgPSAwOyBlZSA8IGF4aXMtPm51bV9lZGdlczsgZWUrKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0VkZ2UgIGVkZ2UgPSBheGlzLT5lZGdlcyArIGVlOwotICAgICAgICBGVF9Qb3MgICBkaXN0OwotCi0KLSAgICAgICAgZGlzdCA9IHNlZy0+cG9zIC0gZWRnZS0+ZnBvczsKLSAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgIGlmICggZGlzdCA8IGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkICYmIGVkZ2UtPmRpciA9PSBzZWctPmRpciApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3VuZCA9IGVkZ2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCAhZm91bmQgKQotICAgICAgewotICAgICAgICBBRl9FZGdlICAgZWRnZTsKLQotCi0gICAgICAgIC8qIGluc2VydCBhIG5ldyBlZGdlIGluIHRoZSBsaXN0IGFuZCAqLwotICAgICAgICAvKiBzb3J0IGFjY29yZGluZyB0byB0aGUgcG9zaXRpb24gICAgKi8KLSAgICAgICAgZXJyb3IgPSBhZl9heGlzX2hpbnRzX25ld19lZGdlKCBheGlzLCBzZWctPnBvcywgc2VnLT5kaXIsIG1lbW9yeSwgJmVkZ2UgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIC8qIGFkZCB0aGUgc2VnbWVudCB0byB0aGUgbmV3IGVkZ2UncyBsaXN0ICovCi0gICAgICAgIEZUX1pFUk8oIGVkZ2UgKTsKLQotICAgICAgICBlZGdlLT5maXJzdCAgICA9IHNlZzsKLSAgICAgICAgZWRnZS0+bGFzdCAgICAgPSBzZWc7Ci0gICAgICAgIGVkZ2UtPmZwb3MgICAgID0gc2VnLT5wb3M7Ci0gICAgICAgIGVkZ2UtPmRpciAgICAgID0gc2VnLT5kaXI7Ci0gICAgICAgIGVkZ2UtPm9wb3MgICAgID0gZWRnZS0+cG9zID0gRlRfTXVsRml4KCBzZWctPnBvcywgc2NhbGUgKTsKLSAgICAgICAgc2VnLT5lZGdlX25leHQgPSBzZWc7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIGFuIGVkZ2Ugd2FzIGZvdW5kLCBzaW1wbHkgYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBlZGdlJ3MgKi8KLSAgICAgICAgLyogbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBzZWctPmVkZ2VfbmV4dCAgICAgICAgID0gZm91bmQtPmZpcnN0OwotICAgICAgICBmb3VuZC0+bGFzdC0+ZWRnZV9uZXh0ID0gc2VnOwotICAgICAgICBmb3VuZC0+bGFzdCAgICAgICAgICAgID0gc2VnOwotICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEdvb2QsIHdlIHdpbGwgbm93IGNvbXB1dGUgZWFjaCBlZGdlJ3MgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gICAgICovCi0gICAgLyogc2VnbWVudHMgZm91bmQgb24gaXRzIHBvc2l0aW9uLiAgQmFzaWNhbGx5LCB0aGVzZSBhcmU6ICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAtIGVkZ2UncyBtYWluIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIC0gc3RlbSBlZGdlLCBzZXJpZiBlZGdlIG9yIGJvdGggKHdoaWNoIGRlZmF1bHRzIHRvIHN0ZW0gdGhlbikgICAgKi8KLSAgICAvKiAgLSByb3VuZGVkIGVkZ2UsIHN0cmFpZ2h0IG9yIGJvdGggKHdoaWNoIGRlZmF1bHRzIHRvIHN0cmFpZ2h0KSAgICAqLwotICAgIC8qICAtIGxpbmsgZm9yIGVkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBzZXQgdGhlIGBlZGdlJyBmaWVsZCBpbiBlYWNoIHNlZ21lbnQgLS0gdGhpcyBpcyAqLwotICAgIC8qIHJlcXVpcmVkIGluIG9yZGVyIHRvIGNvbXB1dGUgZWRnZSBsaW5rcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qCi0gICAgICogTm90ZSB0aGF0IHJlbW92aW5nIHRoaXMgbG9vcCBhbmQgc2V0dGluZyB0aGUgYGVkZ2UnIGZpZWxkIG9mIGVhY2gKLSAgICAgKiBzZWdtZW50IGRpcmVjdGx5IGluIHRoZSBjb2RlIGFib3ZlIHNsb3dzIGRvd24gZXhlY3V0aW9uIHNwZWVkIGZvcgotICAgICAqIHNvbWUgcmVhc29ucyBvbiBwbGF0Zm9ybXMgbGlrZSB0aGUgU3VuLgotICAgICAqLwotICAgIHsKLSAgICAgIEFGX0VkZ2UgIGVkZ2VzICAgICAgPSBheGlzLT5lZGdlczsKLSAgICAgIEFGX0VkZ2UgIGVkZ2VfbGltaXQgPSBlZGdlcyArIGF4aXMtPm51bV9lZGdlczsKLSAgICAgIEFGX0VkZ2UgIGVkZ2U7Ci0KLQotICAgICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICAgIHsKLSAgICAgICAgc2VnID0gZWRnZS0+Zmlyc3Q7Ci0gICAgICAgIGlmICggc2VnICkKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlZy0+ZWRnZSA9IGVkZ2U7Ci0gICAgICAgICAgICBzZWcgICAgICAgPSBzZWctPmVkZ2VfbmV4dDsKLQotICAgICAgICAgIH0gd2hpbGUgKCBzZWcgIT0gZWRnZS0+Zmlyc3QgKTsKLSAgICAgIH0KLQotICAgICAgLyogbm93LCBjb21wdXRlIGVhY2ggZWRnZSBwcm9wZXJ0aWVzICovCi0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGlzX3JvdW5kICAgID0gMDsgIC8qIGRvZXMgaXQgY29udGFpbiByb3VuZCBzZWdtZW50cz8gICAgKi8KLSAgICAgICAgRlRfSW50ICBpc19zdHJhaWdodCA9IDA7ICAvKiBkb2VzIGl0IGNvbnRhaW4gc3RyYWlnaHQgc2VnbWVudHM/ICovCi0gICAgICAgIEZUX1BvcyAgdXBzICAgICAgICAgPSAwOyAgLyogbnVtYmVyIG9mIHVwd2FyZHMgc2VnbWVudHMgICAgICAgICAqLwotICAgICAgICBGVF9Qb3MgIGRvd25zICAgICAgID0gMDsgIC8qIG51bWJlciBvZiBkb3dud2FyZHMgc2VnbWVudHMgICAgICAgKi8KLQotCi0gICAgICAgIHNlZyA9IGVkZ2UtPmZpcnN0OwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Cb29sICBpc19zZXJpZjsKLQotCi0gICAgICAgICAgLyogY2hlY2sgZm9yIHJvdW5kbmVzcyBvZiBzZWdtZW50ICovCi0gICAgICAgICAgaWYgKCBzZWctPmZsYWdzICYgQUZfRURHRV9ST1VORCApCi0gICAgICAgICAgICBpc19yb3VuZCsrOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlzX3N0cmFpZ2h0Kys7Ci0KLSAgICAgICAgICAvKiBjaGVjayBmb3Igc2VnbWVudCBkaXJlY3Rpb24gKi8KLSAgICAgICAgICBpZiAoIHNlZy0+ZGlyID09IHVwX2RpciApCi0gICAgICAgICAgICB1cHMgICArPSBzZWctPm1heF9jb29yZC1zZWctPm1pbl9jb29yZDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkb3ducyArPSBzZWctPm1heF9jb29yZC1zZWctPm1pbl9jb29yZDsKLQotICAgICAgICAgIC8qIGNoZWNrIGZvciBsaW5rcyAtLSBpZiBzZWctPnNlcmlmIGlzIHNldCwgdGhlbiBzZWctPmxpbmsgbXVzdCAqLwotICAgICAgICAgIC8qIGJlIGlnbm9yZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlzX3NlcmlmID0gKEZUX0Jvb2wpKCBzZWctPnNlcmlmICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5zZXJpZi0+ZWRnZSAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+c2VyaWYtPmVkZ2UgIT0gZWRnZSApOwotCi0gICAgICAgICAgaWYgKCAoIHNlZy0+bGluayAmJiBzZWctPmxpbmstPmVkZ2UgIT0gTlVMTCApIHx8IGlzX3NlcmlmICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBRl9FZGdlICAgICBlZGdlMjsKLSAgICAgICAgICAgIEFGX1NlZ21lbnQgIHNlZzI7Ci0KLQotICAgICAgICAgICAgZWRnZTIgPSBlZGdlLT5saW5rOwotICAgICAgICAgICAgc2VnMiAgPSBzZWctPmxpbms7Ci0KLSAgICAgICAgICAgIGlmICggaXNfc2VyaWYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWcyICA9IHNlZy0+c2VyaWY7Ci0gICAgICAgICAgICAgIGVkZ2UyID0gZWRnZS0+c2VyaWY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggZWRnZTIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9Qb3MgIGVkZ2VfZGVsdGE7Ci0gICAgICAgICAgICAgIEZUX1BvcyAgc2VnX2RlbHRhOwotCi0KLSAgICAgICAgICAgICAgZWRnZV9kZWx0YSA9IGVkZ2UtPmZwb3MgLSBlZGdlMi0+ZnBvczsKLSAgICAgICAgICAgICAgaWYgKCBlZGdlX2RlbHRhIDwgMCApCi0gICAgICAgICAgICAgICAgZWRnZV9kZWx0YSA9IC1lZGdlX2RlbHRhOwotCi0gICAgICAgICAgICAgIHNlZ19kZWx0YSA9IHNlZy0+cG9zIC0gc2VnMi0+cG9zOwotICAgICAgICAgICAgICBpZiAoIHNlZ19kZWx0YSA8IDAgKQotICAgICAgICAgICAgICAgIHNlZ19kZWx0YSA9IC1zZWdfZGVsdGE7Ci0KLSAgICAgICAgICAgICAgaWYgKCBzZWdfZGVsdGEgPCBlZGdlX2RlbHRhICkKLSAgICAgICAgICAgICAgICBlZGdlMiA9IHNlZzItPmVkZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGVkZ2UyID0gc2VnMi0+ZWRnZTsKLQotICAgICAgICAgICAgaWYgKCBpc19zZXJpZiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkZ2UtPnNlcmlmICAgPSBlZGdlMjsKLSAgICAgICAgICAgICAgZWRnZTItPmZsYWdzIHw9IEFGX0VER0VfU0VSSUY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGVkZ2UtPmxpbmsgID0gZWRnZTI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc2VnID0gc2VnLT5lZGdlX25leHQ7Ci0KLSAgICAgICAgfSB3aGlsZSAoIHNlZyAhPSBlZGdlLT5maXJzdCApOwotCi0gICAgICAgIC8qIHNldCB0aGUgcm91bmQvc3RyYWlnaHQgZmxhZ3MgKi8KLSAgICAgICAgZWRnZS0+ZmxhZ3MgPSBBRl9FREdFX05PUk1BTDsKLQotICAgICAgICBpZiAoIGlzX3JvdW5kID4gMCAmJiBpc19yb3VuZCA+PSBpc19zdHJhaWdodCApCi0gICAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ST1VORDsKLQotI2lmIDAKLSAgICAgICAgLyogc2V0IHRoZSBlZGdlJ3MgbWFpbiBkaXJlY3Rpb24gKi8KLSAgICAgICAgZWRnZS0+ZGlyID0gQUZfRElSX05PTkU7Ci0KLSAgICAgICAgaWYgKCB1cHMgPiBkb3ducyApCi0gICAgICAgICAgZWRnZS0+ZGlyID0gKEZUX0NoYXIpdXBfZGlyOwotCi0gICAgICAgIGVsc2UgaWYgKCB1cHMgPCBkb3ducyApCi0gICAgICAgICAgZWRnZS0+ZGlyID0gKEZUX0NoYXIpLXVwX2RpcjsKLQotICAgICAgICBlbHNlIGlmICggdXBzID09IGRvd25zICkKLSAgICAgICAgICBlZGdlLT5kaXIgPSAwOyAgLyogYm90aCB1cCBhbmQgZG93biEgKi8KLSNlbmRpZgotCi0gICAgICAgIC8qIGdldHMgcmlkIG9mIHNlcmlmcyBpZiBsaW5rIGlzIHNldCAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBYWFg6IFRoaXMgZ2V0cyByaWQgb2YgbWFueSB1bnBsZWFzYW50IGFydGVmYWN0cyEgKi8KLSAgICAgICAgLyogICAgICBFeGFtcGxlOiB0aGUgYGMnIGluIGNvdXIucGZhIGF0IHNpemUgMTMgICAgICovCi0KLSAgICAgICAgaWYgKCBlZGdlLT5zZXJpZiAmJiBlZGdlLT5saW5rICkKLSAgICAgICAgICBlZGdlLT5zZXJpZiA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfbGF0aW4yX2hpbnRzX2RldGVjdF9mZWF0dXJlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRGltZW5zaW9uICAgZGltICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBhZl9sYXRpbjJfaGludHNfY29tcHV0ZV9zZWdtZW50cyggaGludHMsIGRpbSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBhZl9sYXRpbjJfaGludHNfbGlua19zZWdtZW50cyggaGludHMsIGRpbSApOwotCi0gICAgICBlcnJvciA9IGFmX2xhdGluMl9oaW50c19jb21wdXRlX2VkZ2VzKCBoaW50cywgZGltICk7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgYWZfbGF0aW4yX2hpbnRzX2NvbXB1dGVfYmx1ZV9lZGdlcyggQUZfR2x5cGhIaW50cyAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgQUZfQXhpc0hpbnRzICBheGlzICAgICAgID0gJmhpbnRzLT5heGlzWyBBRl9ESU1FTlNJT05fVkVSVCBdOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZSAgICAgICA9IGF4aXMtPmVkZ2VzOwotICAgIEFGX0VkZ2UgICAgICAgZWRnZV9saW1pdCA9IGVkZ2UgKyBheGlzLT5udW1fZWRnZXM7Ci0gICAgQUZfTGF0aW5BeGlzICBsYXRpbiAgICAgID0gJm1ldHJpY3MtPmF4aXNbIEFGX0RJTUVOU0lPTl9WRVJUIF07Ci0gICAgRlRfRml4ZWQgICAgICBzY2FsZSAgICAgID0gbGF0aW4tPnNjYWxlOwotICAgIEZUX1BvcyAgICAgICAgYmVzdF9kaXN0MDsgIC8qIGluaXRpYWwgdGhyZXNob2xkICovCi0KLQotICAgIC8qIGNvbXB1dGUgdGhlIGluaXRpYWwgdGhyZXNob2xkIGFzIGEgZnJhY3Rpb24gb2YgdGhlIEVNIHNpemUgKi8KLSAgICBiZXN0X2Rpc3QwID0gRlRfTXVsRml4KCBtZXRyaWNzLT51bml0c19wZXJfZW0gLyA0MCwgc2NhbGUgKTsKLQotICAgIGlmICggYmVzdF9kaXN0MCA+IDY0IC8gMiApCi0gICAgICBiZXN0X2Rpc3QwID0gNjQgLyAyOwotCi0gICAgLyogY29tcHV0ZSB3aGljaCBibHVlIHpvbmVzIGFyZSBhY3RpdmUsIGkuZS4gaGF2ZSB0aGVpciBzY2FsZWQgKi8KLSAgICAvKiBzaXplIDwgMy80IHBpeGVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogZm9yIGVhY2ggaG9yaXpvbnRhbCBlZGdlIHNlYXJjaCB0aGUgYmx1ZSB6b25lIHdoaWNoIGlzIGNsb3Nlc3QgKi8KLSAgICBmb3IgKCA7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICBiYjsKLSAgICAgIEFGX1dpZHRoICBiZXN0X2JsdWUgPSBOVUxMOwotICAgICAgRlRfUG9zICAgIGJlc3RfZGlzdCA9IGJlc3RfZGlzdDA7Ci0KLSAgICAgIGZvciAoIGJiID0gMDsgYmIgPCBBRl9MQVRJTl9CTFVFX01BWDsgYmIrKyApCi0gICAgICB7Ci0gICAgICAgIEFGX0xhdGluQmx1ZSAgYmx1ZSA9IGxhdGluLT5ibHVlcyArIGJiOwotICAgICAgICBGVF9Cb29sICAgICAgIGlzX3RvcF9ibHVlLCBpc19tYWpvcl9kaXI7Ci0KLQotICAgICAgICAvKiBza2lwIGluYWN0aXZlIGJsdWUgem9uZXMgKGkuZS4sIHRob3NlIHRoYXQgYXJlIHRvbyBzbWFsbCkgKi8KLSAgICAgICAgaWYgKCAhKCBibHVlLT5mbGFncyAmIEFGX0xBVElOX0JMVUVfQUNUSVZFICkgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIGlmIGl0IGlzIGEgdG9wIHpvbmUsIGNoZWNrIGZvciByaWdodCBlZGdlcyAtLSBpZiBpdCBpcyBhIGJvdHRvbSAqLwotICAgICAgICAvKiB6b25lLCBjaGVjayBmb3IgbGVmdCBlZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIG9mIGNvdXJzZSwgdGhhdCdzIGZvciBUcnVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpc190b3BfYmx1ZSAgPSAoRlRfQnl0ZSkoICggYmx1ZS0+ZmxhZ3MgJiBBRl9MQVRJTl9CTFVFX1RPUCApICE9IDAgKTsKLSAgICAgICAgaXNfbWFqb3JfZGlyID0gRlRfQk9PTCggZWRnZS0+ZGlyID09IGF4aXMtPm1ham9yX2RpciApOwotCi0gICAgICAgIC8qIGlmIGl0IGlzIGEgdG9wIHpvbmUsIHRoZSBlZGdlIG11c3QgYmUgYWdhaW5zdCB0aGUgbWFqb3IgICAgKi8KLSAgICAgICAgLyogZGlyZWN0aW9uOyBpZiBpdCBpcyBhIGJvdHRvbSB6b25lLCBpdCBtdXN0IGJlIGluIHRoZSBtYWpvciAqLwotICAgICAgICAvKiBkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggaXNfdG9wX2JsdWUgXiBpc19tYWpvcl9kaXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICAgICBkaXN0OwotICAgICAgICAgIEFGX1dpZHRoICAgY29tcGFyZTsKLQotCi0gICAgICAgICAgLyogaWYgaXQncyBhIHJvdW5kZWQgZWRnZSwgY29tcGFyZSBpdCB0byB0aGUgb3ZlcnNob290IHBvc2l0aW9uICovCi0gICAgICAgICAgLyogaWYgaXQncyBhIGZsYXQgZWRnZSwgY29tcGFyZSBpdCB0byB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uICAgICovCi0gICAgICAgICAgaWYgKCBlZGdlLT5mbGFncyAmIEFGX0VER0VfUk9VTkQgKQotICAgICAgICAgICAgY29tcGFyZSA9ICZibHVlLT5zaG9vdDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb21wYXJlID0gJmJsdWUtPnJlZjsKLQotICAgICAgICAgIGRpc3QgPSBlZGdlLT5mcG9zIC0gY29tcGFyZS0+b3JnOwotICAgICAgICAgIGlmIChkaXN0IDwgMCkKLSAgICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICAgIGRpc3QgPSBGVF9NdWxGaXgoIGRpc3QsIHNjYWxlICk7Ci0gICAgICAgICAgaWYgKCBkaXN0IDwgYmVzdF9kaXN0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiZXN0X2Rpc3QgPSBkaXN0OwotICAgICAgICAgICAgYmVzdF9ibHVlID0gY29tcGFyZTsKLSAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgLyogbm93LCBjb21wYXJlIGl0IHRvIHRoZSBvdmVyc2hvb3QgcG9zaXRpb24gaWYgdGhlIGVkZ2UgaXMgICAgICovCi0gICAgICAgICAgLyogcm91bmRlZCwgYW5kIGlmIHRoZSBlZGdlIGlzIG92ZXIgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBvZiBhICovCi0gICAgICAgICAgLyogdG9wIHpvbmUsIG9yIHVuZGVyIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gb2YgYSBib3R0b20gem9uZSAgICovCi0gICAgICAgICAgaWYgKCBlZGdlLT5mbGFncyAmIEFGX0VER0VfUk9VTkQgJiYgZGlzdCAhPSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Cb29sICBpc191bmRlcl9yZWYgPSBGVF9CT09MKCBlZGdlLT5mcG9zIDwgYmx1ZS0+cmVmLm9yZyApOwotCi0KLSAgICAgICAgICAgIGlmICggaXNfdG9wX2JsdWUgXiBpc191bmRlcl9yZWYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBibHVlID0gbGF0aW4tPmJsdWVzICsgYmI7Ci0gICAgICAgICAgICAgIGRpc3QgPSBlZGdlLT5mcG9zIC0gYmx1ZS0+c2hvb3Qub3JnOwotICAgICAgICAgICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICAgICAgICAgICAgZGlzdCA9IEZUX011bEZpeCggZGlzdCwgc2NhbGUgKTsKLSAgICAgICAgICAgICAgaWYgKCBkaXN0IDwgYmVzdF9kaXN0ICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJlc3RfZGlzdCA9IGRpc3Q7Ci0gICAgICAgICAgICAgICAgYmVzdF9ibHVlID0gJiBibHVlLT5zaG9vdDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmVzdF9ibHVlICkKLSAgICAgICAgZWRnZS0+Ymx1ZV9lZGdlID0gYmVzdF9ibHVlOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2xhdGluMl9oaW50c19pbml0KCBBRl9HbHlwaEhpbnRzICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgRlRfUmVuZGVyX01vZGUgIG1vZGU7Ci0gICAgRlRfVUludDMyICAgICAgIHNjYWxlcl9mbGFncywgb3RoZXJfZmxhZ3M7Ci0gICAgRlRfRmFjZSAgICAgICAgIGZhY2UgPSBtZXRyaWNzLT5yb290LnNjYWxlci5mYWNlOwotCi0KLSAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgKEFGX1NjcmlwdE1ldHJpY3MpbWV0cmljcyApOwotCi0gICAgLyoKLSAgICAgKiAgY29ycmVjdCB4X3NjYWxlIGFuZCB5X3NjYWxlIGlmIG5lZWRlZCwgc2luY2UgdGhleSBtYXkgaGF2ZQotICAgICAqICBiZWVuIG1vZGlmaWVkIGBhZl9sYXRpbjJfbWV0cmljc19zY2FsZV9kaW0nIGFib3ZlCi0gICAgICovCi0gICAgaGludHMtPnhfc2NhbGUgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS5zY2FsZTsKLSAgICBoaW50cy0+eF9kZWx0YSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdLmRlbHRhOwotICAgIGhpbnRzLT55X3NjYWxlID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fVkVSVF0uc2NhbGU7Ci0gICAgaGludHMtPnlfZGVsdGEgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9WRVJUXS5kZWx0YTsKLQotICAgIC8qIGNvbXB1dGUgZmxhZ3MgZGVwZW5kaW5nIG9uIHJlbmRlciBtb2RlLCBldGMuICovCi0gICAgbW9kZSA9IG1ldHJpY3MtPnJvb3Quc2NhbGVyLnJlbmRlcl9tb2RlOwotCi0jaWYgMCAvKiAjaWZkZWYgQUZfVVNFX1dBUlBFUiAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCi0gICAgewotICAgICAgbWV0cmljcy0+cm9vdC5zY2FsZXIucmVuZGVyX21vZGUgPSBtb2RlID0gRlRfUkVOREVSX01PREVfTk9STUFMOwotICAgIH0KLSNlbmRpZgotCi0gICAgc2NhbGVyX2ZsYWdzID0gaGludHMtPnNjYWxlcl9mbGFnczsKLSAgICBvdGhlcl9mbGFncyAgPSAwOwotCi0gICAgLyoKLSAgICAgKiAgV2Ugc25hcCB0aGUgd2lkdGggb2YgdmVydGljYWwgc3RlbXMgZm9yIHRoZSBtb25vY2hyb21lIGFuZAotICAgICAqICBob3Jpem9udGFsIExDRCByZW5kZXJpbmcgdGFyZ2V0cyBvbmx5LgotICAgICAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9NT05PIHx8IG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEICkKLSAgICAgIG90aGVyX2ZsYWdzIHw9IEFGX0xBVElOX0hJTlRTX0hPUlpfU05BUDsKLQotICAgIC8qCi0gICAgICogIFdlIHNuYXAgdGhlIHdpZHRoIG9mIGhvcml6b250YWwgc3RlbXMgZm9yIHRoZSBtb25vY2hyb21lIGFuZAotICAgICAqICB2ZXJ0aWNhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WICkKLSAgICAgIG90aGVyX2ZsYWdzIHw9IEFGX0xBVElOX0hJTlRTX1ZFUlRfU05BUDsKLQotICAgIC8qCi0gICAgICogIFdlIGFkanVzdCBzdGVtcyB0byBmdWxsIHBpeGVscyBvbmx5IGlmIHdlIGRvbid0IHVzZSB0aGUgYGxpZ2h0JyBtb2RlLgotICAgICAqLwotICAgIGlmICggbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MSUdIVCApCi0gICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19TVEVNX0FESlVTVDsKLQotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9NT05PICkKLSAgICAgIG90aGVyX2ZsYWdzIHw9IEFGX0xBVElOX0hJTlRTX01PTk87Ci0KLSAgICAvKgotICAgICAqICBJbiBgbGlnaHQnIGhpbnRpbmcgbW9kZSB3ZSBkaXNhYmxlIGhvcml6b250YWwgaGludGluZyBjb21wbGV0ZWx5LgotICAgICAqICBXZSBhbHNvIGRvIGl0IGlmIHRoZSBmYWNlIGlzIGl0YWxpYy4KLSAgICAgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTElHSFQgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAoZmFjZS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0lUQUxJQykgIT0gMCApCi0gICAgICBzY2FsZXJfZmxhZ3MgfD0gQUZfU0NBTEVSX0ZMQUdfTk9fSE9SSVpPTlRBTDsKLQotICAgIGhpbnRzLT5zY2FsZXJfZmxhZ3MgPSBzY2FsZXJfZmxhZ3M7Ci0gICAgaGludHMtPm90aGVyX2ZsYWdzICA9IG90aGVyX2ZsYWdzOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgTCBBIFQgSSBOICAgRyBMIFkgUCBIICAgRyBSIEkgRCAtIEYgSSBUIFQgSSBOIEcgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHNuYXAgYSBnaXZlbiB3aWR0aCBpbiBzY2FsZWQgY29vcmRpbmF0ZXMgdG8gb25lIG9mIHRoZSAqLwotICAvKiBjdXJyZW50IHN0YW5kYXJkIHdpZHRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgRlRfUG9zCi0gIGFmX2xhdGluMl9zbmFwX3dpZHRoKCBBRl9XaWR0aCAgd2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICB3aWR0aCApCi0gIHsKLSAgICBpbnQgICAgIG47Ci0gICAgRlRfUG9zICBiZXN0ICAgICAgPSA2NCArIDMyICsgMjsKLSAgICBGVF9Qb3MgIHJlZmVyZW5jZSA9IHdpZHRoOwotICAgIEZUX1BvcyAgc2NhbGVkOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgdzsKLSAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICB3ID0gd2lkdGhzW25dLmN1cjsKLSAgICAgIGRpc3QgPSB3aWR0aCAtIHc7Ci0gICAgICBpZiAoIGRpc3QgPCAwICkKLSAgICAgICAgZGlzdCA9IC1kaXN0OwotICAgICAgaWYgKCBkaXN0IDwgYmVzdCApCi0gICAgICB7Ci0gICAgICAgIGJlc3QgICAgICA9IGRpc3Q7Ci0gICAgICAgIHJlZmVyZW5jZSA9IHc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc2NhbGVkID0gRlRfUElYX1JPVU5EKCByZWZlcmVuY2UgKTsKLQotICAgIGlmICggd2lkdGggPj0gcmVmZXJlbmNlICkKLSAgICB7Ci0gICAgICBpZiAoIHdpZHRoIDwgc2NhbGVkICsgNDggKQotICAgICAgICB3aWR0aCA9IHJlZmVyZW5jZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggd2lkdGggPiBzY2FsZWQgLSA0OCApCi0gICAgICAgIHdpZHRoID0gcmVmZXJlbmNlOwotICAgIH0KLQotICAgIHJldHVybiB3aWR0aDsKLSAgfQotCi0KLSAgLyogY29tcHV0ZSB0aGUgc25hcHBlZCB3aWR0aCBvZiBhIGdpdmVuIHN0ZW0gKi8KLQotICBzdGF0aWMgRlRfUG9zCi0gIGFmX2xhdGluMl9jb21wdXRlX3N0ZW1fd2lkdGgoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlX0ZsYWdzICBiYXNlX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2VfRmxhZ3MgIHN0ZW1fZmxhZ3MgKQotICB7Ci0gICAgQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzICA9IChBRl9MYXRpbk1ldHJpY3MpIGhpbnRzLT5tZXRyaWNzOwotICAgIEFGX0xhdGluQXhpcyAgICAgYXhpcyAgICAgPSAmIG1ldHJpY3MtPmF4aXNbZGltXTsKLSAgICBGVF9Qb3MgICAgICAgICAgIGRpc3QgICAgID0gd2lkdGg7Ci0gICAgRlRfSW50ICAgICAgICAgICBzaWduICAgICA9IDA7Ci0gICAgRlRfSW50ICAgICAgICAgICB2ZXJ0aWNhbCA9ICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICk7Ci0KLQotICAgIEZUX1VOVVNFRChiYXNlX2ZsYWdzKTsKLQotICAgIGlmICggIUFGX0xBVElOX0hJTlRTX0RPX1NURU1fQURKVVNUKCBoaW50cyApIHx8Ci0gICAgICAgICAgYXhpcy0+ZXh0cmFfbGlnaHQgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgcmV0dXJuIHdpZHRoOwotCi0gICAgaWYgKCBkaXN0IDwgMCApCi0gICAgewotICAgICAgZGlzdCA9IC13aWR0aDsKLSAgICAgIHNpZ24gPSAxOwotICAgIH0KLQotICAgIGlmICggKCAgdmVydGljYWwgJiYgIUFGX0xBVElOX0hJTlRTX0RPX1ZFUlRfU05BUCggaGludHMgKSApIHx8Ci0gICAgICAgICAoICF2ZXJ0aWNhbCAmJiAhQUZfTEFUSU5fSElOVFNfRE9fSE9SWl9TTkFQKCBoaW50cyApICkgKQotICAgIHsKLSAgICAgIC8qIHNtb290aCBoaW50aW5nIHByb2Nlc3M6IHZlcnkgbGlnaHRseSBxdWFudGl6ZSB0aGUgc3RlbSB3aWR0aCAqLwotCi0gICAgICAvKiBsZWF2ZSB0aGUgd2lkdGhzIG9mIHNlcmlmcyBhbG9uZSAqLwotCi0gICAgICBpZiAoICggc3RlbV9mbGFncyAmIEFGX0VER0VfU0VSSUYgKSAmJiB2ZXJ0aWNhbCAmJiAoIGRpc3QgPCAzICogNjQgKSApCi0gICAgICAgIGdvdG8gRG9uZV9XaWR0aDsKLQotI2lmIDAKLSAgICAgIGVsc2UgaWYgKCAoIGJhc2VfZmxhZ3MgJiBBRl9FREdFX1JPVU5EICkgKQotICAgICAgewotICAgICAgICBpZiAoIGRpc3QgPCA4MCApCi0gICAgICAgICAgZGlzdCA9IDY0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGRpc3QgPCA1NiApCi0gICAgICAgIGRpc3QgPSA1NjsKLSNlbmRpZgotICAgICAgaWYgKCBheGlzLT53aWR0aF9jb3VudCA+IDAgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGRlbHRhOwotCi0KLSAgICAgICAgLyogY29tcGFyZSB0byBzdGFuZGFyZCB3aWR0aCAqLwotICAgICAgICBpZiAoIGF4aXMtPndpZHRoX2NvdW50ID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWx0YSA9IGRpc3QgLSBheGlzLT53aWR0aHNbMF0uY3VyOwotCi0gICAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGE7Ci0KLSAgICAgICAgICBpZiAoIGRlbHRhIDwgNDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRpc3QgPSBheGlzLT53aWR0aHNbMF0uY3VyOwotICAgICAgICAgICAgaWYgKCBkaXN0IDwgNDggKQotICAgICAgICAgICAgICBkaXN0ID0gNDg7Ci0KLSAgICAgICAgICAgIGdvdG8gRG9uZV9XaWR0aDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRpc3QgPCAzICogNjQgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGEgID0gZGlzdCAmIDYzOwotICAgICAgICAgIGRpc3QgICY9IC02NDsKLQotICAgICAgICAgIGlmICggZGVsdGEgPCAxMCApCi0gICAgICAgICAgICBkaXN0ICs9IGRlbHRhOwotCi0gICAgICAgICAgZWxzZSBpZiAoIGRlbHRhIDwgMzIgKQotICAgICAgICAgICAgZGlzdCArPSAxMDsKLQotICAgICAgICAgIGVsc2UgaWYgKCBkZWx0YSA8IDU0ICkKLSAgICAgICAgICAgIGRpc3QgKz0gNTQ7Ci0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ICs9IGRlbHRhOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHN0cm9uZyBoaW50aW5nIHByb2Nlc3M6IHNuYXAgdGhlIHN0ZW0gd2lkdGggdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICAgIEZUX1BvcyAgb3JnX2Rpc3QgPSBkaXN0OwotCi0KLSAgICAgIGRpc3QgPSBhZl9sYXRpbjJfc25hcF93aWR0aCggYXhpcy0+d2lkdGhzLCBheGlzLT53aWR0aF9jb3VudCwgZGlzdCApOwotCi0gICAgICBpZiAoIHZlcnRpY2FsICkKLSAgICAgIHsKLSAgICAgICAgLyogaW4gdGhlIGNhc2Ugb2YgdmVydGljYWwgaGludGluZywgYWx3YXlzIHJvdW5kICovCi0gICAgICAgIC8qIHRoZSBzdGVtIGhlaWdodHMgdG8gaW50ZWdlciBwaXhlbHMgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggZGlzdCA+PSA2NCApCi0gICAgICAgICAgZGlzdCA9ICggZGlzdCArIDE2ICkgJiB+NjM7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBkaXN0ID0gNjQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggQUZfTEFUSU5fSElOVFNfRE9fTU9OTyggaGludHMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtb25vY2hyb21lIGhvcml6b250YWwgaGludGluZzogc25hcCB3aWR0aHMgdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICAgICAgICAvKiB3aXRoIGEgZGlmZmVyZW50IHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDY0ICkKLSAgICAgICAgICAgIGRpc3QgPSA2NDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBmb3IgaG9yaXpvbnRhbCBhbnRpLWFsaWFzZWQgaGludGluZywgd2UgYWRvcHQgYSBtb3JlIHN1YnRsZSAqLwotICAgICAgICAgIC8qIGFwcHJvYWNoOiB3ZSBzdHJlbmd0aGVuIHNtYWxsIHN0ZW1zLCByb3VuZCBzdGVtcyB3aG9zZSBzaXplICovCi0gICAgICAgICAgLyogaXMgYmV0d2VlbiAxIGFuZCAyIHBpeGVscyB0byBhbiBpbnRlZ2VyLCBvdGhlcndpc2Ugbm90aGluZyAgKi8KLQotICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgIGRpc3QgPSAoIGRpc3QgKyA2NCApID4+IDE7Ci0KLSAgICAgICAgICBlbHNlIGlmICggZGlzdCA8IDEyOCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogV2Ugb25seSByb3VuZCB0byBhbiBpbnRlZ2VyIHdpZHRoIGlmIHRoZSBjb3JyZXNwb25kaW5nICovCi0gICAgICAgICAgICAvKiBkaXN0b3J0aW9uIGlzIGxlc3MgdGhhbiAxLzQgcGl4ZWwuICBPdGhlcndpc2UgdGhpcyAgICAgKi8KLSAgICAgICAgICAgIC8qIG1ha2VzIGV2ZXJ5dGhpbmcgd29yc2Ugc2luY2UgdGhlIGRpYWdvbmFscywgd2hpY2ggYXJlICAqLwotICAgICAgICAgICAgLyogbm90IGhpbnRlZCwgYXBwZWFyIGEgbG90IGJvbGRlciBvciB0aGlubmVyIHRoYW4gdGhlICAgICovCi0gICAgICAgICAgICAvKiB2ZXJ0aWNhbCBzdGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgRlRfSW50ICBkZWx0YTsKLQotCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMjIgKSAmIH42MzsKLSAgICAgICAgICAgIGRlbHRhID0gZGlzdCAtIG9yZ19kaXN0OwotICAgICAgICAgICAgaWYgKCBkZWx0YSA8IDAgKQotICAgICAgICAgICAgICBkZWx0YSA9IC1kZWx0YTsKLQotICAgICAgICAgICAgaWYgKGRlbHRhID49IDE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkaXN0ID0gb3JnX2Rpc3Q7Ci0gICAgICAgICAgICAgIGlmICggZGlzdCA8IDQ4ICkKLSAgICAgICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgNjQgKSA+PiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAvKiByb3VuZCBvdGhlcndpc2UgdG8gcHJldmVudCBjb2xvciBmcmluZ2VzIGluIExDRCBtb2RlICovCi0gICAgICAgICAgICBkaXN0ID0gKCBkaXN0ICsgMzIgKSAmIH42MzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBEb25lX1dpZHRoOgotICAgIGlmICggc2lnbiApCi0gICAgICBkaXN0ID0gLWRpc3Q7Ci0KLSAgICByZXR1cm4gZGlzdDsKLSAgfQotCi0KLSAgLyogYWxpZ24gb25lIHN0ZW0gZWRnZSByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgc3RlbSBlZGdlICovCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW4yX2FsaWduX2xpbmtlZF9lZGdlKCBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIGJhc2VfZWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0VkZ2UgICAgICAgIHN0ZW1fZWRnZSApCi0gIHsKLSAgICBGVF9Qb3MgIGRpc3QgPSBzdGVtX2VkZ2UtPm9wb3MgLSBiYXNlX2VkZ2UtPm9wb3M7Ci0KLSAgICBGVF9Qb3MgIGZpdHRlZF93aWR0aCA9IGFmX2xhdGluMl9jb21wdXRlX3N0ZW1fd2lkdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLCBkaW0sIGRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9FZGdlX0ZsYWdzKWJhc2VfZWRnZS0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9FZGdlX0ZsYWdzKXN0ZW1fZWRnZS0+ZmxhZ3MgKTsKLQotCi0gICAgc3RlbV9lZGdlLT5wb3MgPSBiYXNlX2VkZ2UtPnBvcyArIGZpdHRlZF93aWR0aDsKLQotICAgIEFGX0xPRygoICJMSU5LOiBlZGdlICVkIChvcG9zPSUuMmYpIGxpbmtlZCB0byAoJS4yZiksICIKLSAgICAgICAgICAgICAiZGlzdCB3YXMgJS4yZiwgbm93ICUuMmZcbiIsCi0gICAgICAgICAgICAgc3RlbV9lZGdlLWhpbnRzLT5heGlzW2RpbV0uZWRnZXMsIHN0ZW1fZWRnZS0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgc3RlbV9lZGdlLT5wb3MgLyA2NC4wLCBkaXN0IC8gNjQuMCwgZml0dGVkX3dpZHRoIC8gNjQuMCApKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgYWZfbGF0aW4yX2FsaWduX3NlcmlmX2VkZ2UoIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9FZGdlICAgICAgICBzZXJpZiApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGhpbnRzICk7Ci0KLSAgICBzZXJpZi0+cG9zID0gYmFzZS0+cG9zICsgKHNlcmlmLT5vcG9zIC0gYmFzZS0+b3Bvcyk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgRSBEIEcgRSAgIEggSSBOIFQgSSBOIEcgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sYXRpbjJfaGludF9lZGdlcyggQUZfR2x5cGhIaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSApCi0gIHsKLSAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2VzICAgICAgPSBheGlzLT5lZGdlczsKLSAgICBBRl9FZGdlICAgICAgIGVkZ2VfbGltaXQgPSBlZGdlcyArIGF4aXMtPm51bV9lZGdlczsKLSAgICBGVF9JbnQgICAgICAgIG5fZWRnZXM7Ci0gICAgQUZfRWRnZSAgICAgICBlZGdlOwotICAgIEFGX0VkZ2UgICAgICAgYW5jaG9yICAgICA9IDA7Ci0gICAgRlRfSW50ICAgICAgICBoYXNfc2VyaWZzID0gMDsKLSAgICBGVF9Qb3MgICAgICAgIGFuY2hvcl9kcmlmdCA9IDA7Ci0KLQotCi0gICAgQUZfTE9HKCggIj09PT0gaGludGluZyAlcyBlZGdlcyA9PT09PVxuIiwgZGltID09IEFGX0RJTUVOU0lPTl9IT1JaID8gInZlcnRpY2FsIiA6ICJob3Jpem9udGFsIiApKTsKLQotICAgIC8qIHdlIGJlZ2luIGJ5IGFsaWduaW5nIGFsbCBzdGVtcyByZWxhdGl2ZSB0byB0aGUgYmx1ZSB6b25lICovCi0gICAgLyogaWYgbmVlZGVkIC0tIHRoYXQncyBvbmx5IGZvciBob3Jpem9udGFsIGVkZ2VzICAgICAgICAgICAgKi8KLQotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICYmIEFGX0hJTlRTX0RPX0JMVUVTKCBoaW50cyApICkKLSAgICB7Ci0gICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQotICAgICAgewotICAgICAgICBBRl9XaWR0aCAgYmx1ZTsKLSAgICAgICAgQUZfRWRnZSAgIGVkZ2UxLCBlZGdlMjsKLQotCi0gICAgICAgIGlmICggZWRnZS0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGJsdWUgID0gZWRnZS0+Ymx1ZV9lZGdlOwotICAgICAgICBlZGdlMSA9IE5VTEw7Ci0gICAgICAgIGVkZ2UyID0gZWRnZS0+bGluazsKLQotICAgICAgICBpZiAoIGJsdWUgKQotICAgICAgICB7Ci0gICAgICAgICAgZWRnZTEgPSBlZGdlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBlZGdlMiAmJiBlZGdlMi0+Ymx1ZV9lZGdlICkKLSAgICAgICAgewotICAgICAgICAgIGJsdWUgID0gZWRnZTItPmJsdWVfZWRnZTsKLSAgICAgICAgICBlZGdlMSA9IGVkZ2UyOwotICAgICAgICAgIGVkZ2UyID0gZWRnZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIWVkZ2UxICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBBRl9MT0coKCAiQkxVRTogZWRnZSAlZCAob3Bvcz0lLjJmKSBzbmFwcGVkIHRvICglLjJmKSwgIgotICAgICAgICAgICAgICAgICAid2FzICglLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgZWRnZTEtZWRnZXMsIGVkZ2UxLT5vcG9zIC8gNjQuMCwgYmx1ZS0+Zml0IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgZWRnZTEtPnBvcyAvIDY0LjAgKSk7Ci0KLSAgICAgICAgZWRnZTEtPnBvcyAgICA9IGJsdWUtPmZpdDsKLSAgICAgICAgZWRnZTEtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotICAgICAgICBpZiAoIGVkZ2UyICYmICFlZGdlMi0+Ymx1ZV9lZGdlICkKLSAgICAgICAgewotICAgICAgICAgIGFmX2xhdGluMl9hbGlnbl9saW5rZWRfZWRnZSggaGludHMsIGRpbSwgZWRnZTEsIGVkZ2UyICk7Ci0gICAgICAgICAgZWRnZTItPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIWFuY2hvciApCi0gICAgICAgIHsKLSAgICAgICAgICBhbmNob3IgPSBlZGdlOwotCi0gICAgICAgICAgYW5jaG9yX2RyaWZ0ID0gKGFuY2hvci0+cG9zIC0gYW5jaG9yLT5vcG9zKTsKLSAgICAgICAgICBpZiAoZWRnZTIpCi0gICAgICAgICAgICBhbmNob3JfZHJpZnQgPSAoYW5jaG9yX2RyaWZ0ICsgKGVkZ2UyLT5wb3MgLSBlZGdlMi0+b3BvcykpID4+IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBub3cgd2Ugd2lsbCBhbGlnbiBhbGwgc3RlbSBlZGdlcywgdHJ5aW5nIHRvIG1haW50YWluIHRoZSAqLwotICAgIC8qIHJlbGF0aXZlIG9yZGVyIG9mIHN0ZW1zIGluIHRoZSBnbHlwaCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKLSAgICB7Ci0gICAgICBBRl9FZGdlICBlZGdlMjsKLQotCi0gICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIHNraXAgYWxsIG5vbi1zdGVtIGVkZ2VzICovCi0gICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7Ci0gICAgICBpZiAoICFlZGdlMiApCi0gICAgICB7Ci0gICAgICAgIGhhc19zZXJpZnMrKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBhbGlnbiB0aGUgc3RlbSAqLwotCi0gICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgaXQncyBiZXR0ZXIgdG8gYmUgc2FmZSAqLwotICAgICAgaWYgKCBlZGdlMi0+Ymx1ZV9lZGdlICkKLSAgICAgIHsKLSAgICAgICAgQUZfTE9HKCggIkFTU0VSVElPTiBGQUlMRUQgZm9yIGVkZ2UgJWRcbiIsIGVkZ2UyLWVkZ2VzICkpOwotCi0gICAgICAgIGFmX2xhdGluMl9hbGlnbl9saW5rZWRfZWRnZSggaGludHMsIGRpbSwgZWRnZTIsIGVkZ2UgKTsKLSAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhYW5jaG9yICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBvcmdfbGVuLCBvcmdfY2VudGVyLCBjdXJfbGVuOwotICAgICAgICBGVF9Qb3MgIGN1cl9wb3MxLCBlcnJvcjEsIGVycm9yMiwgdV9vZmYsIGRfb2ZmOwotCi0KLSAgICAgICAgb3JnX2xlbiA9IGVkZ2UyLT5vcG9zIC0gZWRnZS0+b3BvczsKLSAgICAgICAgY3VyX2xlbiA9IGFmX2xhdGluMl9jb21wdXRlX3N0ZW1fd2lkdGgoCi0gICAgICAgICAgICAgICAgICAgIGhpbnRzLCBkaW0sIG9yZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgIChBRl9FZGdlX0ZsYWdzKWVkZ2UtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAoQUZfRWRnZV9GbGFncyllZGdlMi0+ZmxhZ3MgKTsKLSAgICAgICAgaWYgKCBjdXJfbGVuIDw9IDY0ICkKLSAgICAgICAgICB1X29mZiA9IGRfb2ZmID0gMzI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVfb2ZmID0gMzg7Ci0gICAgICAgICAgZF9vZmYgPSAyNjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggY3VyX2xlbiA8IDk2ICkKLSAgICAgICAgewotICAgICAgICAgIG9yZ19jZW50ZXIgPSBlZGdlLT5vcG9zICsgKCBvcmdfbGVuID4+IDEgKTsKLQotICAgICAgICAgIGN1cl9wb3MxICAgPSBGVF9QSVhfUk9VTkQoIG9yZ19jZW50ZXIgKTsKLQotICAgICAgICAgIGVycm9yMSA9IG9yZ19jZW50ZXIgLSAoIGN1cl9wb3MxIC0gdV9vZmYgKTsKLSAgICAgICAgICBpZiAoIGVycm9yMSA8IDAgKQotICAgICAgICAgICAgZXJyb3IxID0gLWVycm9yMTsKLQotICAgICAgICAgIGVycm9yMiA9IG9yZ19jZW50ZXIgLSAoIGN1cl9wb3MxICsgZF9vZmYgKTsKLSAgICAgICAgICBpZiAoIGVycm9yMiA8IDAgKQotICAgICAgICAgICAgZXJyb3IyID0gLWVycm9yMjsKLQotICAgICAgICAgIGlmICggZXJyb3IxIDwgZXJyb3IyICkKLSAgICAgICAgICAgIGN1cl9wb3MxIC09IHVfb2ZmOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGN1cl9wb3MxICs9IGRfb2ZmOwotCi0gICAgICAgICAgZWRnZS0+cG9zICA9IGN1cl9wb3MxIC0gY3VyX2xlbiAvIDI7Ci0gICAgICAgICAgZWRnZTItPnBvcyA9IGVkZ2UtPnBvcyArIGN1cl9sZW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGVkZ2UtPnBvcyA9IEZUX1BJWF9ST1VORCggZWRnZS0+b3BvcyApOwotCi0gICAgICAgIEFGX0xPRygoICJBTkNIT1I6IGVkZ2UgJWQgKG9wb3M9JS4yZikgYW5kICVkIChvcG9zPSUuMmYpICIKLSAgICAgICAgICAgICAgICAgInNuYXBwZWQgdG8gKCUuMmYpICglLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgIGVkZ2UyLWVkZ2VzLCBlZGdlMi0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgIGVkZ2UtPnBvcyAvIDY0LjAsIGVkZ2UyLT5wb3MgLyA2NC4wICkpOwotICAgICAgICBhbmNob3IgPSBlZGdlOwotCi0gICAgICAgIGVkZ2UtPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotICAgICAgICBhZl9sYXRpbjJfYWxpZ25fbGlua2VkX2VkZ2UoIGhpbnRzLCBkaW0sIGVkZ2UsIGVkZ2UyICk7Ci0KLSAgICAgICAgZWRnZTItPmZsYWdzIHw9IEFGX0VER0VfRE9ORTsKLQotICAgICAgICBhbmNob3JfZHJpZnQgPSAoIChhbmNob3ItPnBvcyAtIGFuY2hvci0+b3BvcykgKwotICAgICAgICAgICAgICAgICAgICAgICAgIChlZGdlMi0+cG9zIC0gZWRnZTItPm9wb3MpKSA+PiAxOwotCi0gICAgICAgIEFGX0xPRygoICJEUklGVDogJS4yZlxuIiwgYW5jaG9yX2RyaWZ0LzY0LjAgKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgIG9yZ19wb3MsIG9yZ19sZW4sIG9yZ19jZW50ZXIsIGN1cl9jZW50ZXIsIGN1cl9sZW47Ci0gICAgICAgIEZUX1BvcyAgIG9yZ19sZWZ0LCBvcmdfcmlnaHQ7Ci0KLQotICAgICAgICBvcmdfcG9zICAgID0gZWRnZS0+b3BvcyArIGFuY2hvcl9kcmlmdDsKLSAgICAgICAgb3JnX2xlbiAgICA9IGVkZ2UyLT5vcG9zIC0gZWRnZS0+b3BvczsKLSAgICAgICAgb3JnX2NlbnRlciA9IG9yZ19wb3MgKyAoIG9yZ19sZW4gPj4gMSApOwotCi0gICAgICAgIGN1cl9sZW4gPSBhZl9sYXRpbjJfY29tcHV0ZV9zdGVtX3dpZHRoKAotICAgICAgICAgICAgICAgICAgIGhpbnRzLCBkaW0sIG9yZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgKEFGX0VkZ2VfRmxhZ3MpZWRnZS0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgKEFGX0VkZ2VfRmxhZ3MpZWRnZTItPmZsYWdzICk7Ci0KLSAgICAgICAgb3JnX2xlZnQgID0gb3JnX3BvcyArICgob3JnX2xlbiAtIGN1cl9sZW4pID4+IDEpOwotICAgICAgICBvcmdfcmlnaHQgPSBvcmdfcG9zICsgKChvcmdfbGVuICsgY3VyX2xlbikgPj4gMSk7Ci0KLSAgICAgICAgQUZfTE9HKCggIkFMSUdOOiBsZWZ0PSUuMmYgcmlnaHQ9JS4yZiAiLCBvcmdfbGVmdC82NC4wLCBvcmdfcmlnaHQvNjQuMCApKTsKLSAgICAgICAgY3VyX2NlbnRlciA9IG9yZ19jZW50ZXI7Ci0KLSAgICAgICAgaWYgKCBlZGdlMi0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICB7Ci0gICAgICAgICAgQUZfTE9HKCggIlxuIiApKTsKLSAgICAgICAgICBlZGdlLT5wb3MgPSBlZGdlMi0+cG9zIC0gY3VyX2xlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgIC8qIHdlIHdhbnQgdG8gY29tcGFyZSBzZXZlcmFsIGRpc3BsYWNlbWVudCwgYW5kIGNob29zZQotICAgICAgICAgICogdGhlIG9uZSB0aGF0IGluY3JlYXNlcyBmaXRuZXNzIHdoaWxlIG1pbmltaXppbmcKLSAgICAgICAgICAqIGRpc3RvcnRpb24gYXMgd2VsbAotICAgICAgICAgICovCi0gICAgICAgICAgRlRfUG9zICAgZGlzcGxhY2VtZW50c1s2XSwgc2NvcmVzWzZdLCBvcmcsIGZpdCwgZGVsdGE7Ci0gICAgICAgICAgRlRfVUludCAgY291bnQgPSAwOwotCi0gICAgICAgICAgLyogbm90ZTogZG9uJ3QgZXZlbiB0cnkgdG8gZml0IHRpbnkgc3RlbXMgKi8KLSAgICAgICAgICBpZiAoIGN1cl9sZW4gPCAzMiApCi0gICAgICAgICAgewotICAgICAgICAgICAgQUZfTE9HKCggInRpbnkgc3RlbVxuIiApKTsKLSAgICAgICAgICAgIGdvdG8gQWxpZ25TdGVtOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGlmIHRoZSBzcGFuIGlzIHdpdGhpbiBhIHNpbmdsZSBwaXhlbCwgZG9uJ3QgdG91Y2ggaXQgKi8KLSAgICAgICAgICBpZiAoIEZUX1BJWF9GTE9PUihvcmdfbGVmdCkgPT0gRlRfUElYX0NFSUwob3JnX3JpZ2h0KSApCi0gICAgICAgICAgewotICAgICAgICAgICAgQUZfTE9HKCggInNpbmdsZSBwaXhlbCBzdGVtXG4iICkpOwotICAgICAgICAgICAgZ290byBBbGlnblN0ZW07Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGN1cl9sZW4gPD0gOTYpCi0gICAgICAgICAgewotICAgICAgICAgICAvKiB3ZSB3YW50IHRvIGF2b2lkIHRoZSBhYnNvbHV0ZSB3b3JzdCBjYXNlIHdoaWNoIGlzCi0gICAgICAgICAgICAqIHdoZW4gdGhlIGxlZnQgYW5kIHJpZ2h0IGVkZ2VzIG9mIHRoZSBzcGFuIGVhY2ggcmVwcmVzZW50Ci0gICAgICAgICAgICAqIGFib3V0IDUwJSBvZiB0aGUgZ3JheS4gd2UnZCBiZXR0ZXIgd2FudCB0byBjaGFuZ2UgdGhpcwotICAgICAgICAgICAgKiB0byAyNS83NSUsIHNpbmNlIHRoaXMgaXMgbXVjaCBtb3JlIHBsZWFzYW50IHRvIHRoZSBleWUgd2l0aAotICAgICAgICAgICAgKiB2ZXJ5IGFjY2VwdGFibGUgZGlzdG9ydGlvbgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZUX1BvcyAgZnJhY19sZWZ0ICA9IChvcmdfbGVmdCkgJiA2MzsKLSAgICAgICAgICAgIEZUX1BvcyAgZnJhY19yaWdodCA9IChvcmdfcmlnaHQpICYgNjM7Ci0KLSAgICAgICAgICAgIGlmICggZnJhY19sZWZ0ICA+PSAyMiAmJiBmcmFjX2xlZnQgIDw9IDQyICYmCi0gICAgICAgICAgICAgICAgIGZyYWNfcmlnaHQgPj0gMjIgJiYgZnJhY19yaWdodCA8PSA0MiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9yZyA9IGZyYWNfbGVmdDsKLSAgICAgICAgICAgICAgZml0ID0gKG9yZyA8PSAzMikgPyAxNiA6IDQ4OwotICAgICAgICAgICAgICBkZWx0YSA9IEZUX0FCUyhmaXQgLSBvcmcpOwotICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRzW2NvdW50XSA9IGZpdCAtIG9yZzsKLSAgICAgICAgICAgICAgc2NvcmVzW2NvdW50KytdICAgICAgPSBkZWx0YTsKLSAgICAgICAgICAgICAgQUZfTE9HKCggImRpc3BBPSUuMmYgKCVkKSAiLCAoZml0IC0gb3JnKS82NC4wLCBkZWx0YSApKTsKLQotICAgICAgICAgICAgICBvcmcgPSBmcmFjX3JpZ2h0OwotICAgICAgICAgICAgICBmaXQgPSAob3JnIDw9IDMyKSA/IDE2IDogNDg7Ci0gICAgICAgICAgICAgIGRlbHRhID0gRlRfQUJTKGZpdCAtIG9yZyk7Ci0gICAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbY291bnRdID0gZml0IC0gb3JnOwotICAgICAgICAgICAgICBzY29yZXNbY291bnQrK10gICAgID0gZGVsdGE7Ci0gICAgICAgICAgICAgIEFGX0xPRygoICJkaXNwQj0lLjJmICglZCkgIiwgKGZpdCAtIG9yZykvNjQuMCwgZGVsdGEgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogc25hcHBpbmcgdGhlIGxlZnQgZWRnZSB0byB0aGUgZ3JpZCAqLwotICAgICAgICAgIG9yZyAgID0gb3JnX2xlZnQ7Ci0gICAgICAgICAgZml0ICAgPSBGVF9QSVhfUk9VTkQob3JnKTsKLSAgICAgICAgICBkZWx0YSA9IEZUX0FCUyhmaXQgLSBvcmcpOwotICAgICAgICAgIGRpc3BsYWNlbWVudHNbY291bnRdID0gZml0IC0gb3JnOwotICAgICAgICAgIHNjb3Jlc1tjb3VudCsrXSAgICAgID0gZGVsdGE7Ci0gICAgICAgICAgQUZfTE9HKCggImRpc3BDPSUuMmYgKCVkKSAiLCAoZml0IC0gb3JnKS82NC4wLCBkZWx0YSApKTsKLQotICAgICAgICAgIC8qIHNuYXBwaW5nIHRoZSByaWdodCBlZGdlIHRvIHRoZSBncmlkICovCi0gICAgICAgICAgb3JnICAgPSBvcmdfcmlnaHQ7Ci0gICAgICAgICAgZml0ICAgPSBGVF9QSVhfUk9VTkQob3JnKTsKLSAgICAgICAgICBkZWx0YSA9IEZUX0FCUyhmaXQgLSBvcmcpOwotICAgICAgICAgIGRpc3BsYWNlbWVudHNbY291bnRdID0gZml0IC0gb3JnOwotICAgICAgICAgIHNjb3Jlc1tjb3VudCsrXSAgICAgID0gZGVsdGE7Ci0gICAgICAgICAgQUZfTE9HKCggImRpc3BEPSUuMmYgKCVkKSAiLCAoZml0IC0gb3JnKS82NC4wLCBkZWx0YSApKTsKLQotICAgICAgICAgIC8qIG5vdyBmaW5kIHRoZSBiZXN0IGRpc3BsYWNlbWVudCAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgYmVzdF9zY29yZSA9IHNjb3Jlc1swXTsKLSAgICAgICAgICAgIEZUX1BvcyAgYmVzdF9kaXNwICA9IGRpc3BsYWNlbWVudHNbMF07Ci0gICAgICAgICAgICBGVF9VSW50IG5uOwotCi0gICAgICAgICAgICBmb3IgKG5uID0gMTsgbm4gPCBjb3VudDsgbm4rKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHNjb3Jlc1tubl0gPCBiZXN0X3Njb3JlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3Jlc1tubl07Ci0gICAgICAgICAgICAgICAgYmVzdF9kaXNwICA9IGRpc3BsYWNlbWVudHNbbm5dOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1cl9jZW50ZXIgPSBvcmdfY2VudGVyICsgYmVzdF9kaXNwOwotICAgICAgICAgIH0KLSAgICAgICAgICBBRl9MT0coKCAiXG4iICkpOwotICAgICAgICB9Ci0KLSAgICAgIEFsaWduU3RlbToKLSAgICAgICAgZWRnZS0+cG9zICA9IGN1cl9jZW50ZXIgLSAoY3VyX2xlbiA+PiAxKTsKLSAgICAgICAgZWRnZTItPnBvcyA9IGVkZ2UtPnBvcyArIGN1cl9sZW47Ci0KLSAgICAgICAgQUZfTE9HKCggIlNURU0xOiAlZCAob3Bvcz0lLjJmKSB0byAlZCAob3Bvcz0lLjJmKSAiCi0gICAgICAgICAgICAgICAgICJzbmFwcGVkIHRvICglLjJmKSBhbmQgKCUuMmYpLCBvcmdfbGVuID0gJS4yZiBjdXJfbGVuPSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICBlZGdlMi1lZGdlcywgZWRnZTItPm9wb3MgLyA2NC4wLAotICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLCBlZGdlMi0+cG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgb3JnX2xlbiAvIDY0LjAsIGN1cl9sZW4gLyA2NC4wICkpOwotCi0gICAgICAgIGVkZ2UtPmZsYWdzICB8PSBBRl9FREdFX0RPTkU7Ci0gICAgICAgIGVkZ2UyLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7Ci0KLSAgICAgICAgaWYgKCBlZGdlID4gZWRnZXMgJiYgZWRnZS0+cG9zIDwgZWRnZVstMV0ucG9zICkKLSAgICAgICAgewotICAgICAgICAgIEFGX0xPRygoICJCT1VORDogJWQgKHBvcz0lLjJmKSB0byAoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+cG9zIC8gNjQuMCwgZWRnZVstMV0ucG9zIC8gNjQuMCApKTsKLSAgICAgICAgICBlZGdlLT5wb3MgPSBlZGdlWy0xXS5wb3M7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBtYWtlIHN1cmUgdGhhdCBsb3dlcmNhc2UgbSdzIG1haW50YWluIHRoZWlyIHN5bW1ldHJ5ICovCi0KLSAgICAvKiBJbiBnZW5lcmFsLCBsb3dlcmNhc2UgbSdzIGhhdmUgc2l4IHZlcnRpY2FsIGVkZ2VzIGlmIHRoZXkgYXJlIHNhbnMgKi8KLSAgICAvKiBzZXJpZiwgb3IgdHdlbHZlIGlmIHRoZXkgYXJlIHdpdGggc2VyaWZzLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyAgKi8KLSAgICAvKiBiYXNlZCBvbiB0aGF0IGFzc3VtcHRpb24sIGFuZCBzZWVtcyB0byB3b3JrIHZlcnkgd2VsbCB3aXRoIG1vc3QgICAgKi8KLSAgICAvKiBmYWNlcy4gIEhvd2V2ZXIsIGlmIGZvciBhIGNlcnRhaW4gZmFjZSB0aGlzIGFzc3VtcHRpb24gaXMgbm90ICAgICAgKi8KLSAgICAvKiB0cnVlLCB0aGUgbSBpcyBqdXN0IHJlbmRlcmVkIGxpa2UgYmVmb3JlLiAgSW4gYWRkaXRpb24sIGFueSBzdGVtICAgKi8KLSAgICAvKiBjb3JyZWN0aW9uIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHN5bW1ldHJpY2FsIGdseXBocyAoZXZlbiBpZiB0aGUgKi8KLSAgICAvKiBnbHlwaCBpcyBub3QgYW4gbSksIHNvIHRoZSBwb3RlbnRpYWwgZm9yIHVud2FudGVkIGRpc3RvcnRpb24gaXMgICAgKi8KLSAgICAvKiByZWxhdGl2ZWx5IGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIFdlIGRvbid0IGhhbmRsZSBob3Jpem9udGFsIGVkZ2VzIHNpbmNlIHdlIGNhbid0IGVhc2lseSBhc3N1cmUgdGhhdCAqLwotICAgIC8qIHRoZSB0aGlyZCAobG93ZXN0KSBzdGVtIGFsaWducyB3aXRoIHRoZSBiYXNlIGxpbmU7IGl0IG1pZ2h0IGVuZCB1cCAqLwotICAgIC8qIG9uZSBwaXhlbCBoaWdoZXIgb3IgbG93ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIDAKLSAgICBuX2VkZ2VzID0gZWRnZV9saW1pdCAtIGVkZ2VzOwotICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9IT1JaICYmICggbl9lZGdlcyA9PSA2IHx8IG5fZWRnZXMgPT0gMTIgKSApCi0gICAgewotICAgICAgQUZfRWRnZSAgZWRnZTEsIGVkZ2UyLCBlZGdlMzsKLSAgICAgIEZUX1BvcyAgIGRpc3QxLCBkaXN0Miwgc3BhbiwgZGVsdGE7Ci0KLQotICAgICAgaWYgKCBuX2VkZ2VzID09IDYgKQotICAgICAgewotICAgICAgICBlZGdlMSA9IGVkZ2VzOwotICAgICAgICBlZGdlMiA9IGVkZ2VzICsgMjsKLSAgICAgICAgZWRnZTMgPSBlZGdlcyArIDQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVkZ2UxID0gZWRnZXMgKyAxOwotICAgICAgICBlZGdlMiA9IGVkZ2VzICsgNTsKLSAgICAgICAgZWRnZTMgPSBlZGdlcyArIDk7Ci0gICAgICB9Ci0KLSAgICAgIGRpc3QxID0gZWRnZTItPm9wb3MgLSBlZGdlMS0+b3BvczsKLSAgICAgIGRpc3QyID0gZWRnZTMtPm9wb3MgLSBlZGdlMi0+b3BvczsKLQotICAgICAgc3BhbiA9IGRpc3QxIC0gZGlzdDI7Ci0gICAgICBpZiAoIHNwYW4gPCAwICkKLSAgICAgICAgc3BhbiA9IC1zcGFuOwotCi0gICAgICBpZiAoIHNwYW4gPCA4ICkKLSAgICAgIHsKLSAgICAgICAgZGVsdGEgPSBlZGdlMy0+cG9zIC0gKCAyICogZWRnZTItPnBvcyAtIGVkZ2UxLT5wb3MgKTsKLSAgICAgICAgZWRnZTMtPnBvcyAtPSBkZWx0YTsKLSAgICAgICAgaWYgKCBlZGdlMy0+bGluayApCi0gICAgICAgICAgZWRnZTMtPmxpbmstPnBvcyAtPSBkZWx0YTsKLQotICAgICAgICAvKiBtb3ZlIHRoZSBzZXJpZnMgYWxvbmcgd2l0aCB0aGUgc3RlbSAqLwotICAgICAgICBpZiAoIG5fZWRnZXMgPT0gMTIgKQotICAgICAgICB7Ci0gICAgICAgICAgKCBlZGdlcyArIDggKS0+cG9zIC09IGRlbHRhOwotICAgICAgICAgICggZWRnZXMgKyAxMSApLT5wb3MgLT0gZGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBlZGdlMy0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgICBpZiAoIGVkZ2UzLT5saW5rICkKLSAgICAgICAgICBlZGdlMy0+bGluay0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotICAgICAgfQotICAgIH0KLSNlbmRpZgotICAgIGlmICggaGFzX3NlcmlmcyB8fCAhYW5jaG9yICkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogIG5vdyBoaW50IHRoZSByZW1haW5pbmcgZWRnZXMgKHNlcmlmcyBhbmQgc2luZ2xlKSBpbiBvcmRlcgotICAgICAgICogIHRvIGNvbXBsZXRlIG91ciBwcm9jZXNzaW5nCi0gICAgICAgKi8KLSAgICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgZGVsdGE7Ci0KLQotICAgICAgICBpZiAoIGVkZ2UtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBkZWx0YSA9IDEwMDA7Ci0KLSAgICAgICAgaWYgKCBlZGdlLT5zZXJpZiApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWx0YSA9IGVkZ2UtPnNlcmlmLT5vcG9zIC0gZWRnZS0+b3BvczsKLSAgICAgICAgICBpZiAoIGRlbHRhIDwgMCApCi0gICAgICAgICAgICBkZWx0YSA9IC1kZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZGVsdGEgPCA2NCArIDE2ICkKLSAgICAgICAgewotICAgICAgICAgIGFmX2xhdGluMl9hbGlnbl9zZXJpZl9lZGdlKCBoaW50cywgZWRnZS0+c2VyaWYsIGVkZ2UgKTsKLSAgICAgICAgICBBRl9MT0coKCAiU0VSSUY6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc2VyaWYgdG8gJWQgKG9wb3M9JS4yZikgIgotICAgICAgICAgICAgICAgICAgICJhbGlnbmVkIHRvICglLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICBlZGdlLWVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICBlZGdlLT5zZXJpZiAtIGVkZ2VzLCBlZGdlLT5zZXJpZi0+b3BvcyAvIDY0LjAsCi0gICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggIWFuY2hvciApCi0gICAgICAgIHsKLSAgICAgICAgICBBRl9MT0coKCAiU0VSSUZfQU5DSE9SOiBlZGdlICVkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gKCUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLCBlZGdlLT5wb3MgLyA2NC4wICkpOwotICAgICAgICAgIGVkZ2UtPnBvcyA9IEZUX1BJWF9ST1VORCggZWRnZS0+b3BvcyApOwotICAgICAgICAgIGFuY2hvciAgICA9IGVkZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQUZfRWRnZSAgYmVmb3JlLCBhZnRlcjsKLQotCi0gICAgICAgICAgZm9yICggYmVmb3JlID0gZWRnZSAtIDE7IGJlZm9yZSA+PSBlZGdlczsgYmVmb3JlLS0gKQotICAgICAgICAgICAgaWYgKCBiZWZvcmUtPmZsYWdzICYgQUZfRURHRV9ET05FICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBmb3IgKCBhZnRlciA9IGVkZ2UgKyAxOyBhZnRlciA8IGVkZ2VfbGltaXQ7IGFmdGVyKysgKQotICAgICAgICAgICAgaWYgKCBhZnRlci0+ZmxhZ3MgJiBBRl9FREdFX0RPTkUgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGlmICggYmVmb3JlID49IGVkZ2VzICYmIGJlZm9yZSA8IGVkZ2UgICAmJgotICAgICAgICAgICAgICAgYWZ0ZXIgPCBlZGdlX2xpbWl0ICYmIGFmdGVyID4gZWRnZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRnZS0+cG9zID0gYmVmb3JlLT5wb3MgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGVkZ2UtPm9wb3MgLSBiZWZvcmUtPm9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPnBvcyAtIGJlZm9yZS0+cG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5vcG9zIC0gYmVmb3JlLT5vcG9zICk7Ci0gICAgICAgICAgICBBRl9MT0coKCAiU0VSSUZfTElOSzE6IGVkZ2UgJWQgKG9wb3M9JS4yZikgc25hcHBlZCB0byAoJS4yZikgZnJvbSAlZCAob3Bvcz0lLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGVkZ2UtZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLCBlZGdlLT5wb3MgLyA2NC4wLCBiZWZvcmUgLSBlZGdlcywgYmVmb3JlLT5vcG9zIC8gNjQuMCApKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRnZS0+cG9zID0gYW5jaG9yLT5wb3MgKyAoKCBlZGdlLT5vcG9zIC0gYW5jaG9yLT5vcG9zICsgMTYpICYgfjMxKTsKLQotICAgICAgICAgICAgQUZfTE9HKCggIlNFUklGX0xJTksyOiBlZGdlICVkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gKCUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsIGVkZ2UtPnBvcyAvIDY0LjAgKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwotCi0gICAgICAgIGlmICggZWRnZSA+IGVkZ2VzICYmIGVkZ2UtPnBvcyA8IGVkZ2VbLTFdLnBvcyApCi0gICAgICAgICAgZWRnZS0+cG9zID0gZWRnZVstMV0ucG9zOwotCi0gICAgICAgIGlmICggZWRnZSArIDEgPCBlZGdlX2xpbWl0ICAgICAgICAmJgotICAgICAgICAgICAgIGVkZ2VbMV0uZmxhZ3MgJiBBRl9FREdFX0RPTkUgJiYKLSAgICAgICAgICAgICBlZGdlLT5wb3MgPiBlZGdlWzFdLnBvcyAgICAgICkKLSAgICAgICAgICBlZGdlLT5wb3MgPSBlZGdlWzFdLnBvczsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9sYXRpbjJfaGludHNfYXBwbHkoIEFGX0dseXBoSGludHMgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBBRl9MYXRpbk1ldHJpY3MgIG1ldHJpY3MgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIGludCAgICAgICBkaW07Ci0KLQotICAgIGVycm9yID0gYWZfZ2x5cGhfaGludHNfcmVsb2FkKCBoaW50cywgb3V0bGluZSwgMSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogYW5hbHl6ZSBnbHlwaCBvdXRsaW5lICovCi0jaWZkZWYgQUZfVVNFX1dBUlBFUgotICAgIGlmICggbWV0cmljcy0+cm9vdC5zY2FsZXIucmVuZGVyX21vZGUgPT0gRlRfUkVOREVSX01PREVfTElHSFQgfHwKLSAgICAgICAgIEFGX0hJTlRTX0RPX0hPUklaT05UQUwoIGhpbnRzICkgKQotI2Vsc2UKLSAgICBpZiAoIEFGX0hJTlRTX0RPX0hPUklaT05UQUwoIGhpbnRzICkgKQotI2VuZGlmCi0gICAgewotICAgICAgZXJyb3IgPSBhZl9sYXRpbjJfaGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBoaW50cywgQUZfRElNRU5TSU9OX0hPUlogKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBBRl9ISU5UU19ET19WRVJUSUNBTCggaGludHMgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBhZl9sYXRpbjJfaGludHNfZGV0ZWN0X2ZlYXR1cmVzKCBoaW50cywgQUZfRElNRU5TSU9OX1ZFUlQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGFmX2xhdGluMl9oaW50c19jb21wdXRlX2JsdWVfZWRnZXMoIGhpbnRzLCBtZXRyaWNzICk7Ci0gICAgfQotCi0gICAgLyogZ3JpZC1maXQgdGhlIG91dGxpbmUgKi8KLSAgICBmb3IgKCBkaW0gPSAwOyBkaW0gPCBBRl9ESU1FTlNJT05fTUFYOyBkaW0rKyApCi0gICAgewotI2lmZGVmIEFGX1VTRV9XQVJQRVIKLSAgICAgIGlmICggKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogJiYKLSAgICAgICAgICAgICBtZXRyaWNzLT5yb290LnNjYWxlci5yZW5kZXJfbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCApICkKLSAgICAgIHsKLSAgICAgICAgQUZfV2FycGVyUmVjICB3YXJwZXI7Ci0gICAgICAgIEZUX0ZpeGVkICAgICAgc2NhbGU7Ci0gICAgICAgIEZUX1BvcyAgICAgICAgZGVsdGE7Ci0KLQotICAgICAgICBhZl93YXJwZXJfY29tcHV0ZSggJndhcnBlciwgaGludHMsIGRpbSwgJnNjYWxlLCAmZGVsdGEgKTsKLSAgICAgICAgYWZfZ2x5cGhfaGludHNfc2NhbGVfZGltKCBoaW50cywgZGltLCBzY2FsZSwgZGVsdGEgKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgaWYgKCAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiAmJiBBRl9ISU5UU19ET19IT1JJWk9OVEFMKCBoaW50cyApICkgfHwKLSAgICAgICAgICAgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgJiYgQUZfSElOVFNfRE9fVkVSVElDQUwoIGhpbnRzICkgKSAgICkKLSAgICAgIHsKLSAgICAgICAgYWZfbGF0aW4yX2hpbnRfZWRnZXMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19hbGlnbl9lZGdlX3BvaW50cyggaGludHMsIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICAgIGFmX2dseXBoX2hpbnRzX2FsaWduX3N0cm9uZ19wb2ludHMoIGhpbnRzLCAoQUZfRGltZW5zaW9uKWRpbSApOwotICAgICAgICBhZl9nbHlwaF9oaW50c19hbGlnbl93ZWFrX3BvaW50cyggaGludHMsIChBRl9EaW1lbnNpb24pZGltICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGFmX2dseXBoX2hpbnRzX3NhdmUoIGhpbnRzLCBvdXRsaW5lICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgTCBBIFQgSSBOICAgUyBDIFIgSSBQIFQgICBDIEwgQSBTIFMgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbGF0aW4yX3VuaXJhbmdlc1tdID0KLSAgewotICAgIHsgMzIsICAxMjcgfSwgICAgLyogWFhYOiBUT0RPOiBBZGQgbmV3IFVuaWNvZGUgcmFuZ2VzIGhlcmUhICovCi0gICAgeyAxNjAsIDI1NSB9LAotICAgIHsgMCwgICAwIH0KLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiBjb25zdCBBRl9TY3JpcHRDbGFzc1JlYwotICBhZl9sYXRpbjJfc2NyaXB0X2NsYXNzID0KLSAgewotICAgIEFGX1NDUklQVF9MQVRJTjIsCi0gICAgYWZfbGF0aW4yX3VuaXJhbmdlcywKLQotICAgIHNpemVvZiggQUZfTGF0aW5NZXRyaWNzUmVjICksCi0KLSAgICAoQUZfU2NyaXB0X0luaXRNZXRyaWNzRnVuYykgYWZfbGF0aW4yX21ldHJpY3NfaW5pdCwKLSAgICAoQUZfU2NyaXB0X1NjYWxlTWV0cmljc0Z1bmMpYWZfbGF0aW4yX21ldHJpY3Nfc2NhbGUsCi0gICAgKEFGX1NjcmlwdF9Eb25lTWV0cmljc0Z1bmMpIE5VTEwsCi0KLSAgICAoQUZfU2NyaXB0X0luaXRIaW50c0Z1bmMpICAgYWZfbGF0aW4yX2hpbnRzX2luaXQsCi0gICAgKEFGX1NjcmlwdF9BcHBseUhpbnRzRnVuYykgIGFmX2xhdGluMl9oaW50c19hcHBseQotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsYXRpbjIuaCBiL3NyYy9hdXRvZml0L2FmbGF0aW4yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZWRhMDUuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZsYXRpbjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbGF0aW4yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBsYXRpbiBzY3JpcHQgKHNwZWNpZmljYXRpb24pLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FGTEFUSU4yX0hfXwotI2RlZmluZSBfX0FGTEFUSU4yX0hfXwotCi0jaW5jbHVkZSAiYWZoaW50cy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogdGhlIGxhdGluLXNwZWNpZmljIHNjcmlwdCBjbGFzcyAqLwotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEFGX1NjcmlwdENsYXNzUmVjCi0gIGFmX2xhdGluMl9zY3JpcHRfY2xhc3M7Ci0KLS8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fQUZMQVRJTl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmbG9hZGVyLmMgYi9zcmMvYXV0b2ZpdC9hZmxvYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQ4YzJmLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmbG9hZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZsb2FkZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGdseXBoIGxvYWRpbmcgcm91dGluZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiYWZsb2FkZXIuaCIKLSNpbmNsdWRlICJhZmhpbnRzLmgiCi0jaW5jbHVkZSAiYWZnbG9iYWwuaCIKLSNpbmNsdWRlICJhZmxhdGluLmgiCi0jaW5jbHVkZSAiYWZlcnJvcnMuaCIKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9sb2FkZXJfaW5pdCggQUZfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9aRVJPKCBsb2FkZXIgKTsKLQotICAgIGFmX2dseXBoX2hpbnRzX2luaXQoICZsb2FkZXItPmhpbnRzLCBtZW1vcnkgKTsKLSNpZmRlZiBBRl9ERUJVRwotICAgIF9hZl9kZWJ1Z19oaW50cyA9ICZsb2FkZXItPmhpbnRzOwotI2VuZGlmCi0gICAgcmV0dXJuIEZUX0dseXBoTG9hZGVyX05ldyggbWVtb3J5LCAmbG9hZGVyLT5nbG9hZGVyICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZl9sb2FkZXJfcmVzZXQoIEFGX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBBRl9FcnJfT2s7Ci0KLQotICAgIGxvYWRlci0+ZmFjZSAgICA9IGZhY2U7Ci0gICAgbG9hZGVyLT5nbG9iYWxzID0gKEFGX0ZhY2VHbG9iYWxzKWZhY2UtPmF1dG9oaW50LmRhdGE7Ci0KLSAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGxvYWRlci0+Z2xvYWRlciApOwotCi0gICAgaWYgKCBsb2FkZXItPmdsb2JhbHMgPT0gTlVMTCApCi0gICAgewotICAgICAgZXJyb3IgPSBhZl9mYWNlX2dsb2JhbHNfbmV3KCBmYWNlLCAmbG9hZGVyLT5nbG9iYWxzICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGZhY2UtPmF1dG9oaW50LmRhdGEgPQotICAgICAgICAgIChGVF9Qb2ludGVyKWxvYWRlci0+Z2xvYmFsczsKLSAgICAgICAgZmFjZS0+YXV0b2hpbnQuZmluYWxpemVyID0KLSAgICAgICAgICAoRlRfR2VuZXJpY19GaW5hbGl6ZXIpYWZfZmFjZV9nbG9iYWxzX2ZyZWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBhZl9sb2FkZXJfZG9uZSggQUZfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgYWZfZ2x5cGhfaGludHNfZG9uZSggJmxvYWRlci0+aGludHMgKTsKLQotICAgIGxvYWRlci0+ZmFjZSAgICA9IE5VTEw7Ci0gICAgbG9hZGVyLT5nbG9iYWxzID0gTlVMTDsKLQotI2lmZGVmIEFGX0RFQlVHCi0gICAgX2FmX2RlYnVnX2hpbnRzID0gTlVMTDsKLSNlbmRpZgotICAgIEZUX0dseXBoTG9hZGVyX0RvbmUoIGxvYWRlci0+Z2xvYWRlciApOwotICAgIGxvYWRlci0+Z2xvYWRlciA9IE5VTEw7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZl9sb2FkZXJfbG9hZF9nKCBBRl9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgQUZfU2NhbGVyICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBkZXB0aCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICBlcnJvcjsKLSAgICBGVF9GYWNlICAgICAgICAgICBmYWNlICAgICA9IGxvYWRlci0+ZmFjZTsKLSAgICBGVF9HbHlwaExvYWRlciAgICBnbG9hZGVyICA9IGxvYWRlci0+Z2xvYWRlcjsKLSAgICBBRl9TY3JpcHRNZXRyaWNzICBtZXRyaWNzICA9IGxvYWRlci0+bWV0cmljczsKLSAgICBBRl9HbHlwaEhpbnRzICAgICBoaW50cyAgICA9ICZsb2FkZXItPmhpbnRzOwotICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QgICAgID0gZmFjZS0+Z2x5cGg7Ci0gICAgRlRfU2xvdF9JbnRlcm5hbCAgaW50ZXJuYWwgPSBzbG90LT5pbnRlcm5hbDsKLQotCi0gICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgbG9hZGVyLT50cmFuc2Zvcm1lZCA9IGludGVybmFsLT5nbHlwaF90cmFuc2Zvcm1lZDsKLSAgICBpZiAoIGxvYWRlci0+dHJhbnNmb3JtZWQgKQotICAgIHsKLSAgICAgIEZUX01hdHJpeCAgaW52ZXJzZTsKLQotCi0gICAgICBsb2FkZXItPnRyYW5zX21hdHJpeCA9IGludGVybmFsLT5nbHlwaF9tYXRyaXg7Ci0gICAgICBsb2FkZXItPnRyYW5zX2RlbHRhICA9IGludGVybmFsLT5nbHlwaF9kZWx0YTsKLQotICAgICAgaW52ZXJzZSA9IGxvYWRlci0+dHJhbnNfbWF0cml4OwotICAgICAgRlRfTWF0cml4X0ludmVydCggJmludmVyc2UgKTsKLSAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oICZsb2FkZXItPnRyYW5zX2RlbHRhLCAmaW52ZXJzZSApOwotICAgIH0KLQotICAgIC8qIHNldCBsaW5lYXIgbWV0cmljcyAqLwotICAgIHNsb3QtPmxpbmVhckhvcmlBZHZhbmNlID0gc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZTsKLSAgICBzbG90LT5saW5lYXJWZXJ0QWR2YW5jZSA9IHNsb3QtPm1ldHJpY3MudmVydEFkdmFuY2U7Ci0KLSAgICBzd2l0Y2ggKCBzbG90LT5mb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOgotICAgICAgLyogdHJhbnNsYXRlIHRoZSBsb2FkZWQgZ2x5cGggd2hlbiBhbiBpbnRlcm5hbCB0cmFuc2Zvcm0gaXMgbmVlZGVkICovCi0gICAgICBpZiAoIGxvYWRlci0+dHJhbnNmb3JtZWQgKQotICAgICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggJnNsb3QtPm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPnRyYW5zX2RlbHRhLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPnRyYW5zX2RlbHRhLnkgKTsKLQotICAgICAgLyogY29weSB0aGUgb3V0bGluZSBwb2ludHMgaW4gdGhlIGxvYWRlcidzIGN1cnJlbnQgICAgICAgICAgICAgICAqLwotICAgICAgLyogZXh0cmEgcG9pbnRzIHdoaWNoIGlzIHVzZWQgdG8ga2VlcCBvcmlnaW5hbCBnbHlwaCBjb29yZGluYXRlcyAqLwotICAgICAgZXJyb3IgPSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGdsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdC0+b3V0bGluZS5uX3BvaW50cyArIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdC0+b3V0bGluZS5uX2NvbnRvdXJzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBGVF9BUlJBWV9DT1BZKCBnbG9hZGVyLT5jdXJyZW50Lm91dGxpbmUucG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgc2xvdC0+b3V0bGluZS5wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICBzbG90LT5vdXRsaW5lLm5fcG9pbnRzICk7Ci0KLSAgICAgIEZUX0FSUkFZX0NPUFkoIGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgIHNsb3QtPm91dGxpbmUuY29udG91cnMsCi0gICAgICAgICAgICAgICAgICAgICBzbG90LT5vdXRsaW5lLm5fY29udG91cnMgKTsKLQotICAgICAgRlRfQVJSQVlfQ09QWSggZ2xvYWRlci0+Y3VycmVudC5vdXRsaW5lLnRhZ3MsCi0gICAgICAgICAgICAgICAgICAgICBzbG90LT5vdXRsaW5lLnRhZ3MsCi0gICAgICAgICAgICAgICAgICAgICBzbG90LT5vdXRsaW5lLm5fcG9pbnRzICk7Ci0KLSAgICAgIGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5uX3BvaW50cyAgID0gc2xvdC0+b3V0bGluZS5uX3BvaW50czsKLSAgICAgIGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5uX2NvbnRvdXJzID0gc2xvdC0+b3V0bGluZS5uX2NvbnRvdXJzOwotCi0gICAgICAvKiBjb21wdXRlIG9yaWdpbmFsIGhvcml6b250YWwgcGhhbnRvbSBwb2ludHMgKGFuZCBpZ25vcmUgKi8KLSAgICAgIC8qIHZlcnRpY2FsIG9uZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgbG9hZGVyLT5wcDEueCA9IGhpbnRzLT54X2RlbHRhOwotICAgICAgbG9hZGVyLT5wcDEueSA9IGhpbnRzLT55X2RlbHRhOwotICAgICAgbG9hZGVyLT5wcDIueCA9IEZUX011bEZpeCggc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLT54X3NjYWxlICkgKyBoaW50cy0+eF9kZWx0YTsKLSAgICAgIGxvYWRlci0+cHAyLnkgPSBoaW50cy0+eV9kZWx0YTsKLQotICAgICAgLyogYmUgc3VyZSB0byBjaGVjayBmb3Igc3BhY2luZyBnbHlwaHMgKi8KLSAgICAgIGlmICggc2xvdC0+b3V0bGluZS5uX3BvaW50cyA9PSAwICkKLSAgICAgICAgZ290byBIaW50X01ldHJpY3M7Ci0KLSAgICAgIC8qIG5vdyBsb2FkIHRoZSBzbG90IGltYWdlIGludG8gdGhlIGF1dG8tb3V0bGluZSBhbmQgcnVuIHRoZSAqLwotICAgICAgLyogYXV0b21hdGljIGhpbnRpbmcgcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIG1ldHJpY3MtPmNsYXp6LT5zY3JpcHRfaGludHNfYXBwbHkgKQotICAgICAgICBtZXRyaWNzLT5jbGF6ei0+c2NyaXB0X2hpbnRzX2FwcGx5KCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2FkZXItPmN1cnJlbnQub3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcyApOwotCi0gICAgICAvKiB3ZSBub3cgbmVlZCB0byBoaW50IHRoZSBtZXRyaWNzIGFjY29yZGluZyB0byB0aGUgY2hhbmdlIGluICovCi0gICAgICAvKiB3aWR0aC9wb3NpdGlvbmluZyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgaGludGluZyBwcm9jZXNzICovCi0gICAgICBpZiAoIHNjYWxlci0+cmVuZGVyX21vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgICAgICAgIG9sZF9yc2IsIG9sZF9sc2IsIG5ld19sc2I7Ci0gICAgICAgIEZUX1BvcyAgICAgICAgcHAxeF91aCwgcHAyeF91aDsKLSAgICAgICAgQUZfQXhpc0hpbnRzICBheGlzICA9ICZoaW50cy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl07Ci0gICAgICAgIEFGX0VkZ2UgICAgICAgZWRnZTEgPSBheGlzLT5lZGdlczsgICAgICAgICAvKiBsZWZ0bW9zdCBlZGdlICAqLwotICAgICAgICBBRl9FZGdlICAgICAgIGVkZ2UyID0gZWRnZTEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy0+bnVtX2VkZ2VzIC0gMTsgLyogcmlnaHRtb3N0IGVkZ2UgKi8KLQotCi0gICAgICAgIGlmICggYXhpcy0+bnVtX2VkZ2VzID4gMSAmJiBBRl9ISU5UU19ET19BRFZBTkNFKCBoaW50cyApICkKLSAgICAgICAgewotICAgICAgICAgIG9sZF9yc2IgICAgID0gbG9hZGVyLT5wcDIueCAtIGVkZ2UyLT5vcG9zOwotICAgICAgICAgIG9sZF9sc2IgICAgID0gZWRnZTEtPm9wb3M7Ci0gICAgICAgICAgbmV3X2xzYiAgICAgPSBlZGdlMS0+cG9zOwotCi0gICAgICAgICAgLyogcmVtZW1iZXIgdW5oaW50ZWQgdmFsdWVzIHRvIGxhdGVyIGFjY291bnQgKi8KLSAgICAgICAgICAvKiBmb3Igcm91bmRpbmcgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgcHAxeF91aCA9IG5ld19sc2IgICAgLSBvbGRfbHNiOwotICAgICAgICAgIHBwMnhfdWggPSBlZGdlMi0+cG9zICsgb2xkX3JzYjsKLQotICAgICAgICAgIC8qIHByZWZlciB0b28gbXVjaCBzcGFjZSBvdmVyIHRvbyBsaXR0bGUgc3BhY2UgKi8KLSAgICAgICAgICAvKiBmb3IgdmVyeSBzbWFsbCBzaXplcyAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICBpZiAoIG9sZF9sc2IgPCAyNCApCi0gICAgICAgICAgICBwcDF4X3VoIC09IDg7Ci0KLSAgICAgICAgICBpZiAoIG9sZF9yc2IgPCAyNCApCi0gICAgICAgICAgICBwcDJ4X3VoICs9IDg7Ci0KLSAgICAgICAgICBsb2FkZXItPnBwMS54ID0gRlRfUElYX1JPVU5EKCBwcDF4X3VoICk7Ci0gICAgICAgICAgbG9hZGVyLT5wcDIueCA9IEZUX1BJWF9ST1VORCggcHAyeF91aCApOwotCi0gICAgICAgICAgaWYgKCBsb2FkZXItPnBwMS54ID49IG5ld19sc2IgJiYgb2xkX2xzYiA+IDAgKQotICAgICAgICAgICAgbG9hZGVyLT5wcDEueCAtPSA2NDsKLQotICAgICAgICAgIGlmICggbG9hZGVyLT5wcDIueCA8PSBlZGdlMi0+cG9zICYmIG9sZF9yc2IgPiAwICkKLSAgICAgICAgICAgIGxvYWRlci0+cHAyLnggKz0gNjQ7Ci0KLSAgICAgICAgICBzbG90LT5sc2JfZGVsdGEgPSBsb2FkZXItPnBwMS54IC0gcHAxeF91aDsKLSAgICAgICAgICBzbG90LT5yc2JfZGVsdGEgPSBsb2FkZXItPnBwMi54IC0gcHAyeF91aDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgICBwcDF4ID0gbG9hZGVyLT5wcDEueDsKLSAgICAgICAgICBGVF9Qb3MgICBwcDJ4ID0gbG9hZGVyLT5wcDIueDsKLQotICAgICAgICAgIGxvYWRlci0+cHAxLnggPSBGVF9QSVhfUk9VTkQoIHBwMXggKTsKLSAgICAgICAgICBsb2FkZXItPnBwMi54ID0gRlRfUElYX1JPVU5EKCBwcDJ4ICk7Ci0KLSAgICAgICAgICBzbG90LT5sc2JfZGVsdGEgPSBsb2FkZXItPnBwMS54IC0gcHAxeDsKLSAgICAgICAgICBzbG90LT5yc2JfZGVsdGEgPSBsb2FkZXItPnBwMi54IC0gcHAyeDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9Qb3MgICBwcDF4ID0gbG9hZGVyLT5wcDEueDsKLSAgICAgICAgRlRfUG9zICAgcHAyeCA9IGxvYWRlci0+cHAyLng7Ci0KLSAgICAgICAgbG9hZGVyLT5wcDEueCA9IEZUX1BJWF9ST1VORCggcHAxeCArIGhpbnRzLT54bWluX2RlbHRhICk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggPSBGVF9QSVhfUk9VTkQoIHBwMnggKyBoaW50cy0+eG1heF9kZWx0YSApOwotCi0gICAgICAgIHNsb3QtPmxzYl9kZWx0YSA9IGxvYWRlci0+cHAxLnggLSBwcDF4OwotICAgICAgICBzbG90LT5yc2JfZGVsdGEgPSBsb2FkZXItPnBwMi54IC0gcHAyeDsKLSAgICAgIH0KLQotICAgICAgLyogZ29vZCwgd2Ugc2ltcGx5IGFkZCB0aGUgZ2x5cGggdG8gb3VyIGxvYWRlcidzIGJhc2UgKi8KLSAgICAgIEZUX0dseXBoTG9hZGVyX0FkZCggZ2xvYWRlciApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEU6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgICAgICBubiwgbnVtX3N1YmdseXBocyA9IHNsb3QtPm51bV9zdWJnbHlwaHM7Ci0gICAgICAgIEZUX1VJbnQgICAgICBudW1fYmFzZV9zdWJncywgc3RhcnRfcG9pbnQ7Ci0gICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaDsKLQotCi0gICAgICAgIHN0YXJ0X3BvaW50ID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOwotCi0gICAgICAgIC8qIGZpcnN0IG9mIGFsbCwgY29weSB0aGUgc3ViZ2x5cGggZGVzY3JpcHRvcnMgaW4gdGhlIGdseXBoIGxvYWRlciAqLwotICAgICAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NoZWNrU3ViR2x5cGhzKCBnbG9hZGVyLCBudW1fc3ViZ2x5cGhzICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBGVF9BUlJBWV9DT1BZKCBnbG9hZGVyLT5jdXJyZW50LnN1YmdseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgc2xvdC0+c3ViZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgICBudW1fc3ViZ2x5cGhzICk7Ci0KLSAgICAgICAgZ2xvYWRlci0+Y3VycmVudC5udW1fc3ViZ2x5cGhzID0gbnVtX3N1YmdseXBoczsKLSAgICAgICAgbnVtX2Jhc2Vfc3ViZ3MgICAgICAgICAgICAgICAgID0gZ2xvYWRlci0+YmFzZS5udW1fc3ViZ2x5cGhzOwotCi0gICAgICAgIC8qIG5vdywgcmVhZCBlYWNoIHN1YmdseXBoIGluZGVwZW5kZW50bHkgKi8KLSAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9zdWJnbHlwaHM7IG5uKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yICBwcDEsIHBwMjsKLSAgICAgICAgICBGVF9Qb3MgICAgIHgsIHk7Ci0gICAgICAgICAgRlRfVUludCAgICBudW1fcG9pbnRzLCBudW1fbmV3X3BvaW50cywgbnVtX2Jhc2VfcG9pbnRzOwotCi0KLSAgICAgICAgICAvKiBnbG9hZGVyLmN1cnJlbnQuc3ViZ2x5cGhzIGNhbiBjaGFuZ2UgZHVyaW5nIGdseXBoIGxvYWRpbmcgZHVlICovCi0gICAgICAgICAgLyogdG8gcmUtYWxsb2NhdGlvbiAtLSB3ZSBtdXN0IHJlY29tcHV0ZSB0aGUgY3VycmVudCBzdWJnbHlwaCBvbiAqLwotICAgICAgICAgIC8qIGVhY2ggaXRlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBzdWJnbHlwaCA9IGdsb2FkZXItPmJhc2Uuc3ViZ2x5cGhzICsgbnVtX2Jhc2Vfc3ViZ3MgKyBubjsKLQotICAgICAgICAgIHBwMSA9IGxvYWRlci0+cHAxOwotICAgICAgICAgIHBwMiA9IGxvYWRlci0+cHAyOwotCi0gICAgICAgICAgbnVtX2Jhc2VfcG9pbnRzID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOwotCi0gICAgICAgICAgZXJyb3IgPSBhZl9sb2FkZXJfbG9hZF9nKCBsb2FkZXIsIHNjYWxlciwgc3ViZ2x5cGgtPmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9mbGFncywgZGVwdGggKyAxICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAvKiByZWNvbXB1dGUgc3ViZ2x5cGggcG9pbnRlciAqLwotICAgICAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+YmFzZS5zdWJnbHlwaHMgKyBudW1fYmFzZV9zdWJncyArIG5uOwotCi0gICAgICAgICAgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcDEgPSBsb2FkZXItPnBwMTsKLSAgICAgICAgICAgIHBwMiA9IGxvYWRlci0+cHAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgbG9hZGVyLT5wcDEgPSBwcDE7Ci0gICAgICAgICAgICBsb2FkZXItPnBwMiA9IHBwMjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBudW1fcG9pbnRzICAgICA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5uX3BvaW50czsKLSAgICAgICAgICBudW1fbmV3X3BvaW50cyA9IG51bV9wb2ludHMgLSBudW1fYmFzZV9wb2ludHM7Ci0KLSAgICAgICAgICAvKiBub3cgcGVyZm9ybSB0aGUgdHJhbnNmb3JtIHJlcXVpcmVkIGZvciB0aGlzIHN1YmdseXBoICovCi0KLSAgICAgICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmICggRlRfU1VCR0xZUEhfRkxBR19TQ0FMRSAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NVQkdMWVBIX0ZMQUdfWFlfU0NBTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TVUJHTFlQSF9GTEFHXzJYMiAgICAgICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciogIGN1ciAgID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLnBvaW50cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9iYXNlX3BvaW50czsKLSAgICAgICAgICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gY3VyICsgbnVtX25ld19wb2ludHM7Ci0KLQotICAgICAgICAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgICAgICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtKCBjdXIsICZzdWJnbHlwaC0+dHJhbnNmb3JtICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogYXBwbHkgb2Zmc2V0ICovCi0KLSAgICAgICAgICBpZiAoICEoIHN1YmdseXBoLT5mbGFncyAmIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgICAgIGsgPSBzdWJnbHlwaC0+YXJnMTsKLSAgICAgICAgICAgIEZUX1VJbnQgICAgIGwgPSBzdWJnbHlwaC0+YXJnMjsKLSAgICAgICAgICAgIEZUX1ZlY3RvciogIHAxOwotICAgICAgICAgICAgRlRfVmVjdG9yKiAgcDI7Ci0KLQotICAgICAgICAgICAgaWYgKCBzdGFydF9wb2ludCArIGsgPj0gbnVtX2Jhc2VfcG9pbnRzICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID49IChGVF9VSW50KW51bV9uZXdfcG9pbnRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZXJyb3IgPSBBRl9FcnJfSW52YWxpZF9Db21wb3NpdGU7Ci0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbCArPSBudW1fYmFzZV9wb2ludHM7Ci0KLSAgICAgICAgICAgIC8qIGZvciBub3csIG9ubHkgdXNlIHRoZSBjdXJyZW50IHBvaW50IGNvb3JkaW5hdGVzOyAgICAqLwotICAgICAgICAgICAgLyogd2UgbWF5IGNvbnNpZGVyIGFub3RoZXIgYXBwcm9hY2ggaW4gdGhlIG5lYXIgZnV0dXJlICovCi0gICAgICAgICAgICBwMSA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKyBzdGFydF9wb2ludCArIGs7Ci0gICAgICAgICAgICBwMiA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKyBzdGFydF9wb2ludCArIGw7Ci0KLSAgICAgICAgICAgIHggPSBwMS0+eCAtIHAyLT54OwotICAgICAgICAgICAgeSA9IHAxLT55IC0gcDItPnk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4ID0gRlRfTXVsRml4KCBzdWJnbHlwaC0+YXJnMSwgaGludHMtPnhfc2NhbGUgKSArIGhpbnRzLT54X2RlbHRhOwotICAgICAgICAgICAgeSA9IEZUX011bEZpeCggc3ViZ2x5cGgtPmFyZzIsIGhpbnRzLT55X3NjYWxlICkgKyBoaW50cy0+eV9kZWx0YTsKLQotICAgICAgICAgICAgeCA9IEZUX1BJWF9ST1VORCggeCApOwotICAgICAgICAgICAgeSA9IEZUX1BJWF9ST1VORCggeSApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX091dGxpbmUgIGR1bW15ID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lOwotCi0KLSAgICAgICAgICAgIGR1bW15LnBvaW50cyAgKz0gbnVtX2Jhc2VfcG9pbnRzOwotICAgICAgICAgICAgZHVtbXkubl9wb2ludHMgPSAoc2hvcnQpbnVtX25ld19wb2ludHM7Ci0KLSAgICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmZHVtbXksIHgsIHkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIHdlIGRvbid0IHN1cHBvcnQgb3RoZXIgZm9ybWF0cyAoeWV0PykgKi8KLSAgICAgIGVycm9yID0gQUZfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLSAgICB9Ci0KLSAgSGludF9NZXRyaWNzOgotICAgIGlmICggZGVwdGggPT0gMCApCi0gICAgewotICAgICAgRlRfQkJveCAgICBiYm94OwotICAgICAgRlRfVmVjdG9yICB2dmVjdG9yOwotCi0KLSAgICAgIHZ2ZWN0b3IueCA9IHNsb3QtPm1ldHJpY3MudmVydEJlYXJpbmdYIC0gc2xvdC0+bWV0cmljcy5ob3JpQmVhcmluZ1g7Ci0gICAgICB2dmVjdG9yLnkgPSBzbG90LT5tZXRyaWNzLnZlcnRCZWFyaW5nWSAtIHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdZOwotICAgICAgdnZlY3Rvci54ID0gRlRfTXVsRml4KCB2dmVjdG9yLngsIG1ldHJpY3MtPnNjYWxlci54X3NjYWxlICk7Ci0gICAgICB2dmVjdG9yLnkgPSBGVF9NdWxGaXgoIHZ2ZWN0b3IueSwgbWV0cmljcy0+c2NhbGVyLnlfc2NhbGUgKTsKLQotICAgICAgLyogdHJhbnNmb3JtIHRoZSBoaW50ZWQgb3V0bGluZSBpZiBuZWVkZWQgKi8KLSAgICAgIGlmICggbG9hZGVyLT50cmFuc2Zvcm1lZCApCi0gICAgICB7Ci0gICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmZ2xvYWRlci0+YmFzZS5vdXRsaW5lLCAmbG9hZGVyLT50cmFuc19tYXRyaXggKTsKLSAgICAgICAgRlRfVmVjdG9yX1RyYW5zZm9ybSggJnZ2ZWN0b3IsICZsb2FkZXItPnRyYW5zX21hdHJpeCApOwotICAgICAgfQotI2lmIDEKLSAgICAgIC8qIHdlIG11c3QgdHJhbnNsYXRlIG91ciBmaW5hbCBvdXRsaW5lIGJ5IC1wcDEueCBhbmQgY29tcHV0ZSAqLwotICAgICAgLyogdGhlIG5ldyBtZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGxvYWRlci0+cHAxLnggKQotICAgICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggJmdsb2FkZXItPmJhc2Uub3V0bGluZSwgLWxvYWRlci0+cHAxLngsIDAgKTsKLSNlbmRpZgotICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJmdsb2FkZXItPmJhc2Uub3V0bGluZSwgJmJib3ggKTsKLQotICAgICAgYmJveC54TWluID0gRlRfUElYX0ZMT09SKCBiYm94LnhNaW4gKTsKLSAgICAgIGJib3gueU1pbiA9IEZUX1BJWF9GTE9PUiggYmJveC55TWluICk7Ci0gICAgICBiYm94LnhNYXggPSBGVF9QSVhfQ0VJTCggIGJib3gueE1heCApOwotICAgICAgYmJveC55TWF4ID0gRlRfUElYX0NFSUwoICBiYm94LnlNYXggKTsKLQotICAgICAgc2xvdC0+bWV0cmljcy53aWR0aCAgICAgICAgPSBiYm94LnhNYXggLSBiYm94LnhNaW47Ci0gICAgICBzbG90LT5tZXRyaWNzLmhlaWdodCAgICAgICA9IGJib3gueU1heCAtIGJib3gueU1pbjsKLSAgICAgIHNsb3QtPm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gYmJveC54TWluOwotICAgICAgc2xvdC0+bWV0cmljcy5ob3JpQmVhcmluZ1kgPSBiYm94LnlNYXg7Ci0KLSAgICAgIHNsb3QtPm1ldHJpY3MudmVydEJlYXJpbmdYID0gRlRfUElYX0ZMT09SKCBiYm94LnhNaW4gKyB2dmVjdG9yLnggKTsKLSAgICAgIHNsb3QtPm1ldHJpY3MudmVydEJlYXJpbmdZID0gRlRfUElYX0ZMT09SKCBiYm94LnlNYXggKyB2dmVjdG9yLnkgKTsKLQotICAgICAgLyogZm9yIG1vbm8td2lkdGggZm9udHMgKGxpa2UgQW5kYWxlLCBDb3VyaWVyLCBldGMuKSB3ZSBuZWVkICovCi0gICAgICAvKiB0byBrZWVwIHRoZSBvcmlnaW5hbCByb3VuZGVkIGFkdmFuY2Ugd2lkdGggICAgICAgICAgICAgICAgKi8KLSNpZiAwCi0gICAgICBpZiAoICFGVF9JU19GSVhFRF9XSURUSCggc2xvdC0+ZmFjZSApICkKLSAgICAgICAgc2xvdC0+bWV0cmljcy5ob3JpQWR2YW5jZSA9IGxvYWRlci0+cHAyLnggLSBsb2FkZXItPnBwMS54OwotICAgICAgZWxzZQotICAgICAgICBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlID0gRlRfTXVsRml4KCBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X3NjYWxlICk7Ci0jZWxzZQotICAgICAgaWYgKCAhRlRfSVNfRklYRURfV0lEVEgoIHNsb3QtPmZhY2UgKSApCi0gICAgICB7Ci0gICAgICAgIC8qIG5vbi1zcGFjaW5nIGdseXBocyBtdXN0IHN0YXkgYXMtaXMgKi8KLSAgICAgICAgaWYgKCBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlICkKLSAgICAgICAgICBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlID0gbG9hZGVyLT5wcDIueCAtIGxvYWRlci0+cHAxLng7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPSBGVF9NdWxGaXgoIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnNjYWxlci54X3NjYWxlICk7Ci0KLSAgICAgICAgLyogU2V0IGRlbHRhIHZhbHVlcyB0byAwLiAgT3RoZXJ3aXNlIGNvZGUgdGhhdCB1c2VzIHRoZW0gaXMgKi8KLSAgICAgICAgLyogZ29pbmcgdG8gcnVpbiB0aGUgZml4ZWQgYWR2YW5jZSB3aWR0aC4gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgc2xvdC0+bHNiX2RlbHRhID0gMDsKLSAgICAgICAgc2xvdC0+cnNiX2RlbHRhID0gMDsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBzbG90LT5tZXRyaWNzLnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBzbG90LT5tZXRyaWNzLnZlcnRBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnNjYWxlci55X3NjYWxlICk7Ci0KLSAgICAgIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgPSBGVF9QSVhfUk9VTkQoIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgKTsKLSAgICAgIHNsb3QtPm1ldHJpY3MudmVydEFkdmFuY2UgPSBGVF9QSVhfUk9VTkQoIHNsb3QtPm1ldHJpY3MudmVydEFkdmFuY2UgKTsKLQotICAgICAgLyogbm93IGNvcHkgb3V0bGluZSBpbnRvIGdseXBoIHNsb3QgKi8KLSAgICAgIEZUX0dseXBoTG9hZGVyX1Jld2luZCggaW50ZXJuYWwtPmxvYWRlciApOwotICAgICAgZXJyb3IgPSBGVF9HbHlwaExvYWRlcl9Db3B5UG9pbnRzKCBpbnRlcm5hbC0+bG9hZGVyLCBnbG9hZGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBzbG90LT5vdXRsaW5lID0gaW50ZXJuYWwtPmxvYWRlci0+YmFzZS5vdXRsaW5lOwotICAgICAgc2xvdC0+Zm9ybWF0ICA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotICAgIH0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgIGFmX2RlYnVnX2hpbnRlciA9IGhpbnRlcjsKLSNlbmRpZgotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZfbG9hZGVyX2xvYWRfZ2x5cGgoIEFGX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBGVF9TaXplICAgICAgIHNpemUgPSBmYWNlLT5zaXplOwotICAgIEFGX1NjYWxlclJlYyAgc2NhbGVyOwotCi0KLSAgICBpZiAoICFzaXplICkKLSAgICAgIHJldHVybiBBRl9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIEZUX1pFUk8oICZzY2FsZXIgKTsKLQotICAgIHNjYWxlci5mYWNlICAgID0gZmFjZTsKLSAgICBzY2FsZXIueF9zY2FsZSA9IHNpemUtPm1ldHJpY3MueF9zY2FsZTsKLSAgICBzY2FsZXIueF9kZWx0YSA9IDA7ICAvKiBYWFg6IFRPRE86IGFkZCBzdXBwb3J0IGZvciBzdWItcGl4ZWwgaGludGluZyAqLwotICAgIHNjYWxlci55X3NjYWxlID0gc2l6ZS0+bWV0cmljcy55X3NjYWxlOwotICAgIHNjYWxlci55X2RlbHRhID0gMDsgIC8qIFhYWDogVE9ETzogYWRkIHN1cHBvcnQgZm9yIHN1Yi1waXhlbCBoaW50aW5nICovCi0KLSAgICBzY2FsZXIucmVuZGVyX21vZGUgPSBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICk7Ci0gICAgc2NhbGVyLmZsYWdzICAgICAgID0gMDsgIC8qIFhYWDogZml4IHRoaXMgKi8KLQotICAgIGVycm9yID0gYWZfbG9hZGVyX3Jlc2V0KCBsb2FkZXIsIGZhY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgQUZfU2NyaXB0TWV0cmljcyAgbWV0cmljczsKLSAgICAgIEZUX1VJbnQgICAgICAgICAgIG9wdGlvbnMgPSAwOwotCi0KLSNpZmRlZiBGVF9PUFRJT05fQVVUT0ZJVDIKLSAgICAgIC8qIFhYWDogdW5kb2N1bWVudGVkIGhvb2sgdG8gYWN0aXZhdGUgdGhlIGxhdGluMiBoaW50ZXIgKi8KLSAgICAgIGlmICggbG9hZF9mbGFncyAmICggMVVMIDw8IDIwICkgKQotICAgICAgICBvcHRpb25zID0gMjsKLSNlbmRpZgotCi0gICAgICBlcnJvciA9IGFmX2ZhY2VfZ2xvYmFsc19nZXRfbWV0cmljcyggbG9hZGVyLT5nbG9iYWxzLCBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgJm1ldHJpY3MgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgbG9hZGVyLT5tZXRyaWNzID0gbWV0cmljczsKLQotICAgICAgICBpZiAoIG1ldHJpY3MtPmNsYXp6LT5zY3JpcHRfbWV0cmljc19zY2FsZSApCi0gICAgICAgICAgbWV0cmljcy0+Y2xhenotPnNjcmlwdF9tZXRyaWNzX3NjYWxlKCBtZXRyaWNzLCAmc2NhbGVyICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBtZXRyaWNzLT5zY2FsZXIgPSBzY2FsZXI7Ci0KLSAgICAgICAgbG9hZF9mbGFncyB8PSAgRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STTsKLSAgICAgICAgbG9hZF9mbGFncyAmPSB+RlRfTE9BRF9SRU5ERVI7Ci0KLSAgICAgICAgaWYgKCBtZXRyaWNzLT5jbGF6ei0+c2NyaXB0X2hpbnRzX2luaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBtZXRyaWNzLT5jbGF6ei0+c2NyaXB0X2hpbnRzX2luaXQoICZsb2FkZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnJvciA9IGFmX2xvYWRlcl9sb2FkX2coIGxvYWRlciwgJnNjYWxlciwgZ2luZGV4LCBsb2FkX2ZsYWdzLCAwICk7Ci0gICAgICB9Ci0gICAgfQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsb2FkZXIuaCBiL3NyYy9hdXRvZml0L2FmbG9hZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNjdjMTAuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZsb2FkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbG9hZGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBnbHlwaCBsb2FkaW5nIHJvdXRpbmVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FGX0xPQURFUl9IX18KLSNkZWZpbmUgX19BRl9MT0FERVJfSF9fCi0KLSNpbmNsdWRlICJhZmhpbnRzLmgiCi0jaW5jbHVkZSAiYWZnbG9iYWwuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCBBRl9Mb2FkZXJSZWNfCi0gIHsKLSAgICBGVF9GYWNlICAgICAgICAgICBmYWNlOyAgICAgICAgICAgLyogY3VycmVudCBmYWNlICovCi0gICAgQUZfRmFjZUdsb2JhbHMgICAgZ2xvYmFsczsgICAgICAgIC8qIGN1cnJlbnQgZmFjZSBnbG9iYWxzICovCi0gICAgRlRfR2x5cGhMb2FkZXIgICAgZ2xvYWRlcjsgICAgICAgIC8qIGdseXBoIGxvYWRlciAqLwotICAgIEFGX0dseXBoSGludHNSZWMgIGhpbnRzOwotICAgIEFGX1NjcmlwdE1ldHJpY3MgIG1ldHJpY3M7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgdHJhbnNmb3JtZWQ7Ci0gICAgRlRfTWF0cml4ICAgICAgICAgdHJhbnNfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICAgIHRyYW5zX2RlbHRhOwotICAgIEZUX1ZlY3RvciAgICAgICAgIHBwMTsKLSAgICBGVF9WZWN0b3IgICAgICAgICBwcDI7Ci0gICAgLyogd2UgZG9uJ3QgaGFuZGxlIHZlcnRpY2FsIHBoYW50b20gcG9pbnRzICovCi0KLSAgfSBBRl9Mb2FkZXJSZWMsICpBRl9Mb2FkZXI7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9sb2FkZXJfaW5pdCggQUZfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZfbG9hZGVyX3Jlc2V0KCBBRl9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgIGZhY2UgKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfbG9hZGVyX2RvbmUoIEFGX0xvYWRlciAgbG9hZGVyICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZl9sb2FkZXJfbG9hZF9nbHlwaCggQUZfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgbG9hZF9mbGFncyApOwotCi0vKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fQUZfTE9BREVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZtb2R1bGUuYyBiL3NyYy9hdXRvZml0L2FmbW9kdWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNWUxY2MuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZtb2R1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbW9kdWxlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImFmbW9kdWxlLmgiCi0jaW5jbHVkZSAiYWZsb2FkZXIuaCIKLQotI2lmZGVmIEFGX0RFQlVHCi0gIGludCAgICBfYWZfZGVidWc7Ci0gIGludCAgICBfYWZfZGVidWdfZGlzYWJsZV9ob3J6X2hpbnRzOwotICBpbnQgICAgX2FmX2RlYnVnX2Rpc2FibGVfdmVydF9oaW50czsKLSAgaW50ICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2JsdWVfaGludHM7Ci0gIHZvaWQqICBfYWZfZGVidWdfaGludHM7Ci0jZW5kaWYKLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfQXV0b2ZpdHRlclJlY18KLSAgewotICAgIEZUX01vZHVsZVJlYyAgcm9vdDsKLSAgICBBRl9Mb2FkZXJSZWMgIGxvYWRlclsxXTsKLQotICB9IEZUX0F1dG9maXR0ZXJSZWMsICpGVF9BdXRvZml0dGVyOwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGFmX2F1dG9maXR0ZXJfaW5pdCggRlRfQXV0b2ZpdHRlciAgbW9kdWxlICkKLSAgewotICAgIHJldHVybiBhZl9sb2FkZXJfaW5pdCggbW9kdWxlLT5sb2FkZXIsIG1vZHVsZS0+cm9vdC5saWJyYXJ5LT5tZW1vcnkgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgYWZfYXV0b2ZpdHRlcl9kb25lKCBGVF9BdXRvZml0dGVyICBtb2R1bGUgKQotICB7Ci0gICAgYWZfbG9hZGVyX2RvbmUoIG1vZHVsZS0+bG9hZGVyICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBhZl9hdXRvZml0dGVyX2xvYWRfZ2x5cGgoIEZUX0F1dG9maXR0ZXIgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHNpemUgKTsKLQotICAgIHJldHVybiBhZl9sb2FkZXJfbG9hZF9nbHlwaCggbW9kdWxlLT5sb2FkZXIsIHNsb3QtPmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgRlRfQXV0b0hpbnRlcl9TZXJ2aWNlUmVjICBhZl9hdXRvZml0dGVyX3NlcnZpY2UgPQotICB7Ci0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgKEZUX0F1dG9IaW50ZXJfR2x5cGhMb2FkRnVuYylhZl9hdXRvZml0dGVyX2xvYWRfZ2x5cGgKLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgIGF1dG9maXRfbW9kdWxlX2NsYXNzID0KLSAgewotICAgIEZUX01PRFVMRV9ISU5URVIsCi0gICAgc2l6ZW9mICggRlRfQXV0b2ZpdHRlclJlYyApLAotCi0gICAgImF1dG9maXR0ZXIiLAotICAgIDB4MTAwMDBMLCAgIC8qIHZlcnNpb24gMS4wIG9mIHRoZSBhdXRvZml0dGVyICAqLwotICAgIDB4MjAwMDBMLCAgIC8qIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBhYm92ZSAqLwotCi0gICAgKGNvbnN0IHZvaWQqKSZhZl9hdXRvZml0dGVyX3NlcnZpY2UsCi0KLSAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKWFmX2F1dG9maXR0ZXJfaW5pdCwKLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIGFmX2F1dG9maXR0ZXJfZG9uZSwKLSAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIE5VTEwKLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmbW9kdWxlLmggYi9zcmMvYXV0b2ZpdC9hZm1vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjI2OGEwLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZm1vZHVsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgbW9kdWxlIGltcGxlbWVudGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19BRk1PRFVMRV9IX18KLSNkZWZpbmUgX19BRk1PRFVMRV9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIEZUX0NBTExCQUNLX1RBQkxFCi0gIGNvbnN0IEZUX01vZHVsZV9DbGFzcyAgYXV0b2ZpdF9tb2R1bGVfY2xhc3M7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19BRk1PRFVMRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmdHlwZXMuaCBiL3NyYy9hdXRvZml0L2FmdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4MTFmMC4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZnR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZ0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIHR5cGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICBUaGUgYXV0by1maXR0ZXIgaXMgYSBjb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBvbGQgYXV0by1oaW50ZXIuCi0gICAqICBJdHMgbWFpbiBmZWF0dXJlIGlzIHRoZSBhYmlsaXR5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBkaWZmZXJlbnQKLSAgICogIHNjcmlwdHMgaW4gb3JkZXIgdG8gYXBwbHkgbGFuZ3VhZ2Utc3BlY2lmaWMgcnVsZXMuCi0gICAqCi0gICAqICBUaGUgY29kZSBoYXMgYWxzbyBiZWVuIGNvbXBhcnRtZW50aXplZCBpbnRvIHNldmVyYWwgZW50aXRpZXMgdGhhdAotICAgKiAgc2hvdWxkIG1ha2UgYWxnb3JpdGhtaWMgZXhwZXJpbWVudGF0aW9uIGVhc2llciB0aGFuIHdpdGggdGhlIG9sZAotICAgKiAgY29kZS4KLSAgICoKLSAgICogIEZpbmFsbHksIHdlIGdldCByaWQgb2YgdGhlIENhdGhhcm9uIGxpY2Vuc2UsIHNpbmNlIHRoaXMgY29kZSBpcwotICAgKiAgcmVsZWFzZWQgdW5kZXIgdGhlIEZyZWVUeXBlIG9uZS4KLSAgICoKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FGVFlQRVNfSF9fCi0jZGVmaW5lIF9fQUZUWVBFU19IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBEIEUgQiBVIEcgRyBJIE4gRyAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgeHhBRl9VU0VfV0FSUEVSICAvKiBvbmx5IGRlZmluZSB0byB1c2Ugd2FycCBoaW50aW5nICovCi0jZGVmaW5lIHh4QUZfREVCVUcKLQotI2lmZGVmIEFGX0RFQlVHCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBBRl9MT0coIHggKSAgZG8geyBpZiAoIF9hZl9kZWJ1ZyApIHByaW50ZiB4OyB9IHdoaWxlICggMCApCi0KLWV4dGVybiBpbnQgICAgX2FmX2RlYnVnOwotZXh0ZXJuIGludCAgICBfYWZfZGVidWdfZGlzYWJsZV9ob3J6X2hpbnRzOwotZXh0ZXJuIGludCAgICBfYWZfZGVidWdfZGlzYWJsZV92ZXJ0X2hpbnRzOwotZXh0ZXJuIGludCAgICBfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzOwotZXh0ZXJuIHZvaWQqICBfYWZfZGVidWdfaGludHM7Ci0KLSNlbHNlIC8qICFBRl9ERUJVRyAqLwotCi0jZGVmaW5lIEFGX0xPRyggeCApICBkbyA7IHdoaWxlICggMCApICAgICAgICAvKiBub3RoaW5nICovCi0KLSNlbmRpZiAvKiAhQUZfREVCVUcgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgVSBUIEkgTCBJIFQgWSAgIFMgVCBVIEYgRiAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9XaWR0aFJlY18KLSAgewotICAgIEZUX1BvcyAgb3JnOyAgLyogb3JpZ2luYWwgcG9zaXRpb24vd2lkdGggaW4gZm9udCB1bml0cyAgICAgICAgICAgICAgKi8KLSAgICBGVF9Qb3MgIGN1cjsgIC8qIGN1cnJlbnQvc2NhbGVkIHBvc2l0aW9uL3dpZHRoIGluIGRldmljZSBzdWItcGl4ZWxzICovCi0gICAgRlRfUG9zICBmaXQ7ICAvKiBjdXJyZW50L2ZpdHRlZCBwb3NpdGlvbi93aWR0aCBpbiBkZXZpY2Ugc3ViLXBpeGVscyAqLwotCi0gIH0gQUZfV2lkdGhSZWMsICpBRl9XaWR0aDsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZfc29ydF9wb3MoIEZUX1VJbnQgIGNvdW50LAotICAgICAgICAgICAgICAgRlRfUG9zKiAgdGFibGUgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX3NvcnRfd2lkdGhzKCBGVF9VSW50ICAgY291bnQsCi0gICAgICAgICAgICAgICAgICBBRl9XaWR0aCAgd2lkdGhzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgQSBOIEcgTCBFICAgVCBZIFAgRSBTICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiAgVGhlIGF1dG8tZml0dGVyIGRvZXNuJ3QgbmVlZCBhIHZlcnkgaGlnaCBhbmd1bGFyIGFjY3VyYWN5OwotICAgKiAgdGhpcyBhbGxvd3MgdXMgdG8gc3BlZWQgdXAgc29tZSBjb21wdXRhdGlvbnMgY29uc2lkZXJhYmx5IHdpdGggYQotICAgKiAgbGlnaHQgQ29yZGljIGFsZ29yaXRobSAoc2VlIGFmYW5nbGVzLmMpLgotICAgKi8KLQotICB0eXBlZGVmIEZUX0ludCAgQUZfQW5nbGU7Ci0KLQotI2RlZmluZSBBRl9BTkdMRV9QSSAgIDI1NgotI2RlZmluZSBBRl9BTkdMRV8yUEkgICggQUZfQU5HTEVfUEkgKiAyICkKLSNkZWZpbmUgQUZfQU5HTEVfUEkyICAoIEFGX0FOR0xFX1BJIC8gMiApCi0jZGVmaW5lIEFGX0FOR0xFX1BJNCAgKCBBRl9BTkdMRV9QSSAvIDQgKQotCi0KLSNpZiAwCi0gIC8qCi0gICAqICBjb21wdXRlIHRoZSBhbmdsZSBvZiBhIGdpdmVuIDItRCB2ZWN0b3IKLSAgICovCi0gIEZUX0xPQ0FMKCBBRl9BbmdsZSApCi0gIGFmX2FuZ2xlX2F0YW4oIEZUX1BvcyAgZHgsCi0gICAgICAgICAgICAgICAgIEZUX1BvcyAgZHkgKTsKLQotCi0gIC8qCi0gICAqICBjb21wdXRlIGBhbmdsZTIgLSBhbmdsZTEnOyB0aGUgcmVzdWx0IGlzIGFsd2F5cyB3aXRoaW4KLSAgICogIHRoZSByYW5nZSBbLUFGX0FOR0xFX1BJIC4uIEFGX0FOR0xFX1BJIC0gMV0KLSAgICovCi0gIEZUX0xPQ0FMKCBBRl9BbmdsZSApCi0gIGFmX2FuZ2xlX2RpZmYoIEFGX0FuZ2xlICBhbmdsZTEsCi0gICAgICAgICAgICAgICAgIEFGX0FuZ2xlICBhbmdsZTIgKTsKLSNlbmRpZiAvKiAwICovCi0KLQotI2RlZmluZSBBRl9BTkdMRV9ESUZGKCByZXN1bHQsIGFuZ2xlMSwgYW5nbGUyICkgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEFGX0FuZ2xlICBfZGVsdGEgPSAoYW5nbGUyKSAtIChhbmdsZTEpOyAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9kZWx0YSAlPSBBRl9BTkdMRV8yUEk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggX2RlbHRhIDwgMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgX2RlbHRhICs9IEFGX0FOR0xFXzJQSTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggX2RlbHRhID4gQUZfQU5HTEVfUEkgKSAgICAgICAgICAgICAgICAgXAotICAgICAgX2RlbHRhIC09IEFGX0FOR0xFXzJQSTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlc3VsdCA9IF9kZWx0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgTyBVIFQgTCBJIE4gRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qICBvcGFxdWUgaGFuZGxlIHRvIGdseXBoLXNwZWNpZmljIGhpbnRzIC0tIHNlZSBgYWZoaW50cy5oJyBmb3IgbW9yZQotICAgKiAgZGV0YWlscwotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQUZfR2x5cGhIaW50c1JlY18qICBBRl9HbHlwaEhpbnRzOwotCi0gIC8qICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1vZGVsIGFuIGlucHV0IGdseXBoIG91dGxpbmUgdG8KLSAgICogIHRoZSBhdXRvLWhpbnRlci4gIFRoZSBsYXR0ZXIgd2lsbCBzZXQgdGhlIGBoaW50cycgZmllbGQKLSAgICogIGRlcGVuZGluZyBvbiB0aGUgZ2x5cGgncyBzY3JpcHQuCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQUZfT3V0bGluZVJlY18KLSAgewotICAgIEZUX0ZhY2UgICAgICAgIGZhY2U7Ci0gICAgRlRfT3V0bGluZSAgICAgb3V0bGluZTsKLSAgICBGVF9VSW50ICAgICAgICBvdXRsaW5lX3Jlc29sdXRpb247Ci0KLSAgICBGVF9JbnQgICAgICAgICBhZHZhbmNlOwotICAgIEZUX1VJbnQgICAgICAgIG1ldHJpY3NfcmVzb2x1dGlvbjsKLQotICAgIEFGX0dseXBoSGludHMgIGhpbnRzOwotCi0gIH0gQUZfT3V0bGluZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgUyBDIEEgTCBFIFIgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAqICBBIHNjYWxlciBtb2RlbHMgdGhlIHRhcmdldCBwaXhlbCBkZXZpY2UgdGhhdCB3aWxsIHJlY2VpdmUgdGhlCi0gICAqICBhdXRvLWhpbnRlZCBnbHlwaCBpbWFnZS4KLSAgICovCi0KLSAgdHlwZWRlZiBlbnVtICBBRl9TY2FsZXJGbGFnc18KLSAgewotICAgIEFGX1NDQUxFUl9GTEFHX05PX0hPUklaT05UQUwgPSAxLCAgLyogZGlzYWJsZSBob3Jpem9udGFsIGhpbnRpbmcgKi8KLSAgICBBRl9TQ0FMRVJfRkxBR19OT19WRVJUSUNBTCAgID0gMiwgIC8qIGRpc2FibGUgdmVydGljYWwgaGludGluZyAgICovCi0gICAgQUZfU0NBTEVSX0ZMQUdfTk9fQURWQU5DRSAgICA9IDQgICAvKiBkaXNhYmxlIGFkdmFuY2UgaGludGluZyAgICAqLwotCi0gIH0gQUZfU2NhbGVyRmxhZ3M7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZfU2NhbGVyUmVjXwotICB7Ci0gICAgRlRfRmFjZSAgICAgICAgIGZhY2U7ICAgICAgICAvKiBzb3VyY2UgZm9udCBmYWNlICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9GaXhlZCAgICAgICAgeF9zY2FsZTsgICAgIC8qIGZyb20gZm9udCB1bml0cyB0byAxLzY0dGggZGV2aWNlIHBpeGVscyAqLwotICAgIEZUX0ZpeGVkICAgICAgICB5X3NjYWxlOyAgICAgLyogZnJvbSBmb250IHVuaXRzIHRvIDEvNjR0aCBkZXZpY2UgcGl4ZWxzICovCi0gICAgRlRfUG9zICAgICAgICAgIHhfZGVsdGE7ICAgICAvKiBpbiAxLzY0dGggZGV2aWNlIHBpeGVscyAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Qb3MgICAgICAgICAgeV9kZWx0YTsgICAgIC8qIGluIDEvNjR0aCBkZXZpY2UgcGl4ZWxzICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZTsgLyogbW9ub2Nocm9tZSwgYW50aS1hbGlhc2VkLCBMQ0QsIGV0Yy4gICAgICovCi0gICAgRlRfVUludDMyICAgICAgIGZsYWdzOyAgICAgICAvKiBhZGRpdGlvbmFsIGNvbnRyb2wgZmxhZ3MsIHNlZSBhYm92ZSAgICAgKi8KLQotICB9IEFGX1NjYWxlclJlYywgKkFGX1NjYWxlcjsKLQotCi0jZGVmaW5lIEFGX1NDQUxFUl9FUVVBTF9TQ0FMRVMoIGEsIGIgKSAgICAgIFwKLSAgICAgICAgICAoIChhKS0+eF9zY2FsZSA9PSAoYiktPnhfc2NhbGUgJiYgXAotICAgICAgICAgICAgKGEpLT55X3NjYWxlID09IChiKS0+eV9zY2FsZSAmJiBcCi0gICAgICAgICAgICAoYSktPnhfZGVsdGEgPT0gKGIpLT54X2RlbHRhICYmIFwKLSAgICAgICAgICAgIChhKS0+eV9kZWx0YSA9PSAoYiktPnlfZGVsdGEgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBTIEMgUiBJIFAgVCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoKLSAgICogIFRoZSBsaXN0IG9mIGtub3cgc2NyaXB0cy4gIEVhY2ggZGlmZmVyZW50IHNjcmlwdCBjb3JyZXNwb25kcyB0byB0aGUKLSAgICogIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKLSAgICoKLSAgICogICAtIEEgc2V0IG9mIFVuaWNvZGUgcmFuZ2VzIHRvIHRlc3Qgd2hldGhlciB0aGUgZmFjZSBzdXBwb3J0cyB0aGUKLSAgICogICAgIHNjcmlwdC4KLSAgICoKLSAgICogICAtIEEgc3BlY2lmaWMgZ2xvYmFsIGFuYWx5emVyIHRoYXQgd2lsbCBjb21wdXRlIGdsb2JhbCBtZXRyaWNzCi0gICAqICAgICBzcGVjaWZpYyB0byB0aGUgc2NyaXB0LgotICAgKgotICAgKiAgIC0gQSBzcGVjaWZpYyBnbHlwaCBhbmFseXplciB0aGF0IHdpbGwgY29tcHV0ZSBzZWdtZW50cyBhbmQKLSAgICogICAgIGVkZ2VzIGZvciBlYWNoIGdseXBoIGNvdmVyZWQgYnkgdGhlIHNjcmlwdC4KLSAgICoKLSAgICogICAtIEEgc3BlY2lmaWMgZ3JpZC1maXR0aW5nIGFsZ29yaXRobSB0aGF0IHdpbGwgZGlzdG9ydCB0aGUKLSAgICogICAgIHNjYWxlZCBnbHlwaCBvdXRsaW5lIGFjY29yZGluZyB0byB0aGUgcmVzdWx0cyBvZiB0aGUgZ2x5cGgKLSAgICogICAgIGFuYWx5emVyLgotICAgKgotICAgKiAgTm90ZSB0aGF0IGEgZ2l2ZW4gYW5hbHl6ZXIgYW5kL29yIGdyaWQtZml0dGluZyBhbGdvcml0aG0gY2FuIGJlCi0gICAqICB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgc2NyaXB0LgotICAgKi8KLQotICB0eXBlZGVmIGVudW0gIEFGX1NjcmlwdF8KLSAgewotICAgIEFGX1NDUklQVF9OT05FICA9IDAsCi0gICAgQUZfU0NSSVBUX0xBVElOID0gMSwKLSAgICBBRl9TQ1JJUFRfQ0pLICAgPSAyLAotICAgIEFGX1NDUklQVF9JTkRJQyA9IDMsIAotI2lmZGVmIEZUX09QVElPTl9BVVRPRklUMgotICAgIEFGX1NDUklQVF9MQVRJTjIsCi0jZW5kaWYKLQotICAgIC8qIGFkZCBuZXcgc2NyaXB0cyBoZXJlLiAgRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgbGlzdCBpbiAqLwotICAgIC8qIGBhZmdsb2JhbC5jJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgQUZfU0NSSVBUX01BWCAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLQotICB9IEFGX1NjcmlwdDsKLQotCi0gIHR5cGVkZWYgc3RydWN0IEFGX1NjcmlwdENsYXNzUmVjXyBjb25zdCogIEFGX1NjcmlwdENsYXNzOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9TY3JpcHRNZXRyaWNzUmVjXwotICB7Ci0gICAgQUZfU2NyaXB0Q2xhc3MgIGNsYXp6OwotICAgIEFGX1NjYWxlclJlYyAgICBzY2FsZXI7Ci0KLSAgfSBBRl9TY3JpcHRNZXRyaWNzUmVjLCAqQUZfU2NyaXB0TWV0cmljczsKLQotCi0gIC8qICBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhbiBGVF9GYWNlIHRvIGNvbXB1dGUgZ2xvYmFsIG1ldHJpY3MgZm9yCi0gICAqICBhIHNwZWNpZmljIHNjcmlwdC4KLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpBRl9TY3JpcHRfSW5pdE1ldHJpY3NGdW5jKSggQUZfU2NyaXB0TWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgZmFjZSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkFGX1NjcmlwdF9TY2FsZU1ldHJpY3NGdW5jKSggQUZfU2NyaXB0TWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjYWxlciAgICAgICAgIHNjYWxlciApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkFGX1NjcmlwdF9Eb25lTWV0cmljc0Z1bmMpKCBBRl9TY3JpcHRNZXRyaWNzICBtZXRyaWNzICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqQUZfU2NyaXB0X0luaXRIaW50c0Z1bmMpKCBBRl9HbHlwaEhpbnRzICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjcmlwdE1ldHJpY3MgIG1ldHJpY3MgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpBRl9TY3JpcHRfQXBwbHlIaW50c0Z1bmMpKCBBRl9HbHlwaEhpbnRzICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NjcmlwdE1ldHJpY3MgIG1ldHJpY3MgKTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9TY3JpcHRfVW5pUmFuZ2VSZWNfCi0gIHsKLSAgICBGVF9VSW50MzIgIGZpcnN0OwotICAgIEZUX1VJbnQzMiAgbGFzdDsKLQotICB9IEFGX1NjcmlwdF9VbmlSYW5nZVJlYzsKLQotICB0eXBlZGVmIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgKkFGX1NjcmlwdF9VbmlSYW5nZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9TY3JpcHRDbGFzc1JlY18KLSAgewotICAgIEFGX1NjcmlwdCAgICAgICAgICAgICAgICAgICBzY3JpcHQ7Ci0gICAgQUZfU2NyaXB0X1VuaVJhbmdlICAgICAgICAgIHNjcmlwdF91bmlfcmFuZ2VzOyAvKiBsYXN0IG11c3QgYmUgeyAwLCAwIH0gKi8KLQotICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfbWV0cmljc19zaXplOwotICAgIEFGX1NjcmlwdF9Jbml0TWV0cmljc0Z1bmMgICBzY3JpcHRfbWV0cmljc19pbml0OwotICAgIEFGX1NjcmlwdF9TY2FsZU1ldHJpY3NGdW5jICBzY3JpcHRfbWV0cmljc19zY2FsZTsKLSAgICBBRl9TY3JpcHRfRG9uZU1ldHJpY3NGdW5jICAgc2NyaXB0X21ldHJpY3NfZG9uZTsKLQotICAgIEFGX1NjcmlwdF9Jbml0SGludHNGdW5jICAgICBzY3JpcHRfaGludHNfaW5pdDsKLSAgICBBRl9TY3JpcHRfQXBwbHlIaW50c0Z1bmMgICAgc2NyaXB0X2hpbnRzX2FwcGx5OwotCi0gIH0gQUZfU2NyaXB0Q2xhc3NSZWM7Ci0KLQotLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19BRlRZUEVTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZ3YXJwLmMgYi9zcmMvYXV0b2ZpdC9hZndhcnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViYjliMS4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hZndhcnAuYworKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZndhcnAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgd2FycGluZyBhbGdvcml0aG0gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJhZndhcnAuaCIKLQotI2lmZGVmIEFGX1VTRV9XQVJQRVIKLQotI2lmIDEKLSAgc3RhdGljIGNvbnN0IEFGX1dhcnBTY29yZQotICBhZl93YXJwZXJfd2VpZ2h0c1s2NF0gPQotICB7Ci0gICAgMzUsIDMyLCAzMCwgMjUsIDIwLCAxNSwgMTIsIDEwLCAgNSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0yLCAtNSwgLTgsLTEwLC0xMCwtMjAsLTIwLC0zMCwtMzAsCi0KLSAgIC0zMCwtMzAsLTIwLC0yMCwtMTAsLTEwLCAtOCwgLTUsIC0yLCAtMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICA1LCAxMCwgMTIsIDE1LCAyMCwgMjUsIDMwLCAzMiwKLSAgfTsKLSNlbHNlCi0gIHN0YXRpYyBjb25zdCBBRl9XYXJwU2NvcmUKLSAgYWZfd2FycGVyX3dlaWdodHNbNjRdID0KLSAgewotICAgIDMwLCAyMCwgMTAsICA1LCAgNCwgIDQsICAzLCAgMiwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAtMSwgLTIsIC0yLCAtNSwgLTUsLTEwLC0xMCwtMTUsLTIwLAotCi0gICAtMjAsLTE1LC0xNSwtMTAsLTEwLCAtNSwgLTUsIC0yLCAtMiwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA1LCAxMCwgMjAsCi0gIH07Ci0jZW5kaWYKLQotCi0gIHN0YXRpYyB2b2lkCi0gIGFmX3dhcnBlcl9jb21wdXRlX2xpbmVfYmVzdCggQUZfV2FycGVyICAgICB3YXJwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1dhcnBTY29yZSAgYmFzZV9kaXN0b3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBudW1fc2VnbWVudHMgKQotICB7Ci0gICAgRlRfSW50ICAgICAgICBpZHhfbWluLCBpZHhfbWF4LCBpZHgwOwotICAgIEZUX1VJbnQgICAgICAgbm47Ci0gICAgQUZfV2FycFNjb3JlICBzY29yZXNbNjVdOwotCi0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgNjU7IG5uKysgKQotICAgICAgc2NvcmVzW25uXSA9IDA7Ci0KLSAgICBpZHgwID0geHgxIC0gd2FycGVyLT50MTsKLQotICAgIC8qIGNvbXB1dGUgbWluaW11bSBhbmQgbWF4aW11bSBpbmRpY2VzICovCi0gICAgewotICAgICAgRlRfUG9zICB4eDFtaW4gPSB3YXJwZXItPngxbWluOwotICAgICAgRlRfUG9zICB4eDFtYXggPSB3YXJwZXItPngxbWF4OwotICAgICAgRlRfUG9zICB3ICAgICAgPSB4eDIgLSB4eDE7Ci0KLQotICAgICAgaWYgKCB4eDFtaW4gKyB3IDwgd2FycGVyLT54Mm1pbiApCi0gICAgICAgIHh4MW1pbiA9IHdhcnBlci0+eDJtaW4gLSB3OwotCi0gICAgICB4eDFtYXggPSB3YXJwZXItPngxbWF4OwotICAgICAgaWYgKCB4eDFtYXggKyB3ID4gd2FycGVyLT54Mm1heCApCi0gICAgICAgIHh4MW1heCA9IHdhcnBlci0+eDJtYXggLSB3OwotCi0gICAgICBpZHhfbWluID0geHgxbWluIC0gd2FycGVyLT50MTsKLSAgICAgIGlkeF9tYXggPSB4eDFtYXggLSB3YXJwZXItPnQxOwotCi0gICAgICBpZiAoIGlkeF9taW4gPCAwIHx8IGlkeF9taW4gPiBpZHhfbWF4IHx8IGlkeF9tYXggPiA2NCApCi0gICAgICB7Ci0gICAgICAgIEFGX0xPRygoICJpbnZhbGlkIGluZGljZXM6XG4iCi0gICAgICAgICAgICAgICAgICIgIG1pbj0lZCBtYXg9JWQsIHh4MT0lbGQgeHgyPSVsZCxcbiIKLSAgICAgICAgICAgICAgICAgIiAgeDFtaW49JWxkIHgxbWF4PSVsZCwgeDJtaW49JWxkIHgybWF4PSVsZFxuIiwKLSAgICAgICAgICAgICAgICAgaWR4X21pbiwgaWR4X21heCwgeHgxLCB4eDIsCi0gICAgICAgICAgICAgICAgIHdhcnBlci0+eDFtaW4sIHdhcnBlci0+eDFtYXgsCi0gICAgICAgICAgICAgICAgIHdhcnBlci0+eDJtaW4sIHdhcnBlci0+eDJtYXggKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX3NlZ21lbnRzOyBubisrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIGxlbiA9IHNlZ21lbnRzW25uXS5tYXhfY29vcmQgLSBzZWdtZW50c1tubl0ubWluX2Nvb3JkOwotICAgICAgRlRfUG9zICB5MCAgPSBGVF9NdWxGaXgoIHNlZ21lbnRzW25uXS5wb3MsIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgIEZUX1BvcyAgeSAgID0geTAgKyAoIGlkeF9taW4gLSBpZHgwICk7Ci0gICAgICBGVF9JbnQgIGlkeDsKLQotCi0gICAgICBmb3IgKCBpZHggPSBpZHhfbWluOyBpZHggPD0gaWR4X21heDsgaWR4KyssIHkrKyApCi0gICAgICAgIHNjb3Jlc1tpZHhdICs9IGFmX3dhcnBlcl93ZWlnaHRzW3kgJiA2M10gKiBsZW47Ci0gICAgfQotCi0gICAgLyogZmluZCBiZXN0IHNjb3JlICovCi0gICAgewotICAgICAgRlRfSW50ICBpZHg7Ci0KLQotICAgICAgZm9yICggaWR4ID0gaWR4X21pbjsgaWR4IDw9IGlkeF9tYXg7IGlkeCsrICkKLSAgICAgIHsKLSAgICAgICAgQUZfV2FycFNjb3JlICBzY29yZSA9IHNjb3Jlc1tpZHhdOwotICAgICAgICBBRl9XYXJwU2NvcmUgIGRpc3RvcnQgPSBiYXNlX2Rpc3RvcnQgKyAoIGlkeCAtIGlkeDAgKTsKLQotCi0gICAgICAgIGlmICggc2NvcmUgPiB3YXJwZXItPmJlc3Rfc2NvcmUgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgKCBzY29yZSA9PSB3YXJwZXItPmJlc3Rfc2NvcmUgICAgJiYKLSAgICAgICAgICAgICAgIGRpc3RvcnQgPCB3YXJwZXItPmJlc3RfZGlzdG9ydCApICAgKQotICAgICAgICB7Ci0gICAgICAgICAgd2FycGVyLT5iZXN0X3Njb3JlICAgPSBzY29yZTsKLSAgICAgICAgICB3YXJwZXItPmJlc3RfZGlzdG9ydCA9IGRpc3RvcnQ7Ci0gICAgICAgICAgd2FycGVyLT5iZXN0X3NjYWxlICAgPSBzY2FsZTsKLSAgICAgICAgICB3YXJwZXItPmJlc3RfZGVsdGEgICA9IGRlbHRhICsgKCBpZHggLSBpZHgwICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGFmX3dhcnBlcl9jb21wdXRlKCBBRl9XYXJwZXIgICAgICB3YXJwZXIsCi0gICAgICAgICAgICAgICAgICAgICBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgKmFfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICphX2RlbHRhICkKLSAgewotICAgIEFGX0F4aXNIaW50cyAgYXhpczsKLSAgICBBRl9Qb2ludCAgICAgIHBvaW50czsKLQotICAgIEZUX0ZpeGVkICAgICAgb3JnX3NjYWxlOwotICAgIEZUX1BvcyAgICAgICAgb3JnX2RlbHRhOwotCi0gICAgRlRfVUludCAgICAgICBubiwgbnVtX3BvaW50cywgbnVtX3NlZ21lbnRzOwotICAgIEZUX0ludCAgICAgICAgWDEsIFgyOwotICAgIEZUX0ludCAgICAgICAgdzsKLQotICAgIEFGX1dhcnBTY29yZSAgYmFzZV9kaXN0b3J0OwotICAgIEFGX1NlZ21lbnQgICAgc2VnbWVudHM7Ci0KLQotICAgIC8qIGdldCBvcmlnaW5hbCBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uICovCi0gICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgKQotICAgIHsKLSAgICAgIG9yZ19zY2FsZSA9IGhpbnRzLT55X3NjYWxlOwotICAgICAgb3JnX2RlbHRhID0gaGludHMtPnlfZGVsdGE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvcmdfc2NhbGUgPSBoaW50cy0+eF9zY2FsZTsKLSAgICAgIG9yZ19kZWx0YSA9IGhpbnRzLT54X2RlbHRhOwotICAgIH0KLQotICAgIHdhcnBlci0+YmVzdF9zY2FsZSAgID0gb3JnX3NjYWxlOwotICAgIHdhcnBlci0+YmVzdF9kZWx0YSAgID0gb3JnX2RlbHRhOwotICAgIHdhcnBlci0+YmVzdF9zY29yZSAgID0gSU5UX01JTjsKLSAgICB3YXJwZXItPmJlc3RfZGlzdG9ydCA9IDA7Ci0KLSAgICBheGlzICAgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKLSAgICBzZWdtZW50cyAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICBudW1fc2VnbWVudHMgPSBheGlzLT5udW1fc2VnbWVudHM7Ci0gICAgcG9pbnRzICAgICAgID0gaGludHMtPnBvaW50czsKLSAgICBudW1fcG9pbnRzICAgPSBoaW50cy0+bnVtX3BvaW50czsKLQotICAgICphX3NjYWxlID0gb3JnX3NjYWxlOwotICAgICphX2RlbHRhID0gb3JnX2RlbHRhOwotCi0gICAgLyogZ2V0IFgxIGFuZCBYMiwgbWluaW11bSBhbmQgbWF4aW11bSBpbiBvcmlnaW5hbCBjb29yZGluYXRlcyAqLwotICAgIGlmICggbnVtX3NlZ21lbnRzIDwgMSApCi0gICAgICByZXR1cm47Ci0KLSNpZiAxCi0gICAgWDEgPSBYMiA9IHBvaW50c1swXS5meDsKLSAgICBmb3IgKCBubiA9IDE7IG5uIDwgbnVtX3BvaW50czsgbm4rKyApCi0gICAgewotICAgICAgRlRfSW50ICBYID0gcG9pbnRzW25uXS5meDsKLQotCi0gICAgICBpZiAoIFggPCBYMSApCi0gICAgICAgIFgxID0gWDsKLSAgICAgIGlmICggWCA+IFgyICkKLSAgICAgICAgWDIgPSBYOwotICAgIH0KLSNlbHNlCi0gICAgWDEgPSBYMiA9IHNlZ21lbnRzWzBdLnBvczsKLSAgICBmb3IgKCBubiA9IDE7IG5uIDwgbnVtX3NlZ21lbnRzOyBubisrICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIFggPSBzZWdtZW50c1tubl0ucG9zOwotCi0KLSAgICAgIGlmICggWCA8IFgxICkKLSAgICAgICAgWDEgPSBYOwotICAgICAgaWYgKCBYID4gWDIgKQotICAgICAgICBYMiA9IFg7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoIFgxID49IFgyICkKLSAgICAgIHJldHVybjsKLQotICAgIHdhcnBlci0+eDEgPSBGVF9NdWxGaXgoIFgxLCBvcmdfc2NhbGUgKSArIG9yZ19kZWx0YTsKLSAgICB3YXJwZXItPngyID0gRlRfTXVsRml4KCBYMiwgb3JnX3NjYWxlICkgKyBvcmdfZGVsdGE7Ci0KLSAgICB3YXJwZXItPnQxID0gQUZfV0FSUEVSX0ZMT09SKCB3YXJwZXItPngxICk7Ci0gICAgd2FycGVyLT50MiA9IEFGX1dBUlBFUl9DRUlMKCB3YXJwZXItPngyICk7Ci0KLSAgICB3YXJwZXItPngxbWluID0gd2FycGVyLT54MSAmIH4zMTsKLSAgICB3YXJwZXItPngxbWF4ID0gd2FycGVyLT54MW1pbiArIDMyOwotICAgIHdhcnBlci0+eDJtaW4gPSB3YXJwZXItPngyICYgfjMxOwotICAgIHdhcnBlci0+eDJtYXggPSB3YXJwZXItPngybWluICsgMzI7Ci0KLSAgICBpZiAoIHdhcnBlci0+eDFtYXggPiB3YXJwZXItPngyICkKLSAgICAgIHdhcnBlci0+eDFtYXggPSB3YXJwZXItPngyOwotCi0gICAgaWYgKCB3YXJwZXItPngybWluIDwgd2FycGVyLT54MSApCi0gICAgICB3YXJwZXItPngybWluID0gd2FycGVyLT54MTsKLQotICAgIHdhcnBlci0+dzAgPSB3YXJwZXItPngyIC0gd2FycGVyLT54MTsKLQotICAgIGlmICggd2FycGVyLT53MCA8PSA2NCApCi0gICAgewotICAgICAgd2FycGVyLT54MW1heCA9IHdhcnBlci0+eDE7Ci0gICAgICB3YXJwZXItPngybWluID0gd2FycGVyLT54MjsKLSAgICB9Ci0KLSAgICB3YXJwZXItPndtaW4gPSB3YXJwZXItPngybWluIC0gd2FycGVyLT54MW1heDsKLSAgICB3YXJwZXItPndtYXggPSB3YXJwZXItPngybWF4IC0gd2FycGVyLT54MW1pbjsKLQotI2lmIDEKLSAgICB7Ci0gICAgICBpbnQgIG1hcmdpbiA9IDE2OwotCi0KLSAgICAgIGlmICggd2FycGVyLT53MCA8PSAxMjggKQotICAgICAgewotICAgICAgICAgbWFyZ2luID0gODsKLSAgICAgICAgIGlmICggd2FycGVyLT53MCA8PSA5NiApCi0gICAgICAgICAgIG1hcmdpbiA9IDQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggd2FycGVyLT53bWluIDwgd2FycGVyLT53MCAtIG1hcmdpbiApCi0gICAgICAgIHdhcnBlci0+d21pbiA9IHdhcnBlci0+dzAgLSBtYXJnaW47Ci0KLSAgICAgIGlmICggd2FycGVyLT53bWF4ID4gd2FycGVyLT53MCArIG1hcmdpbiApCi0gICAgICAgIHdhcnBlci0+d21heCA9IHdhcnBlci0+dzAgKyBtYXJnaW47Ci0gICAgfQotCi0gICAgaWYgKCB3YXJwZXItPndtaW4gPCB3YXJwZXItPncwICogMyAvIDQgKQotICAgICAgd2FycGVyLT53bWluID0gd2FycGVyLT53MCAqIDMgLyA0OwotCi0gICAgaWYgKCB3YXJwZXItPndtYXggPiB3YXJwZXItPncwICogNSAvIDQgKQotICAgICAgd2FycGVyLT53bWF4ID0gd2FycGVyLT53MCAqIDUgLyA0OwotI2Vsc2UKLSAgICAvKiBubyBzY2FsaW5nLCBqdXN0IHRyYW5zbGF0aW9uICovCi0gICAgd2FycGVyLT53bWluID0gd2FycGVyLT53bWF4ID0gd2FycGVyLT53MDsKLSNlbmRpZgotCi0gICAgZm9yICggdyA9IHdhcnBlci0+d21pbjsgdyA8PSB3YXJwZXItPndtYXg7IHcrKyApCi0gICAgewotICAgICAgRlRfRml4ZWQgIG5ld19zY2FsZTsKLSAgICAgIEZUX1BvcyAgICBuZXdfZGVsdGE7Ci0gICAgICBGVF9Qb3MgICAgeHgxLCB4eDI7Ci0KLQotICAgICAgeHgxID0gd2FycGVyLT54MTsKLSAgICAgIHh4MiA9IHdhcnBlci0+eDI7Ci0gICAgICBpZiAoIHcgPj0gd2FycGVyLT53MCApCi0gICAgICB7Ci0gICAgICAgIHh4MSAtPSB3IC0gd2FycGVyLT53MDsKLSAgICAgICAgaWYgKCB4eDEgPCB3YXJwZXItPngxbWluICkKLSAgICAgICAgewotICAgICAgICAgIHh4MiArPSB3YXJwZXItPngxbWluIC0geHgxOwotICAgICAgICAgIHh4MSAgPSB3YXJwZXItPngxbWluOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHh4MSAtPSB3IC0gd2FycGVyLT53MDsKLSAgICAgICAgaWYgKCB4eDEgPiB3YXJwZXItPngxbWF4ICkKLSAgICAgICAgewotICAgICAgICAgIHh4MiAtPSB4eDEgLSB3YXJwZXItPngxbWF4OwotICAgICAgICAgIHh4MSAgPSB3YXJwZXItPngxbWF4OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggeHgxIDwgd2FycGVyLT54MSApCi0gICAgICAgIGJhc2VfZGlzdG9ydCA9IHdhcnBlci0+eDEgLSB4eDE7Ci0gICAgICBlbHNlCi0gICAgICAgIGJhc2VfZGlzdG9ydCA9IHh4MSAtIHdhcnBlci0+eDE7Ci0KLSAgICAgIGlmICggeHgyIDwgd2FycGVyLT54MiApCi0gICAgICAgIGJhc2VfZGlzdG9ydCArPSB3YXJwZXItPngyIC0geHgyOwotICAgICAgZWxzZQotICAgICAgICBiYXNlX2Rpc3RvcnQgKz0geHgyIC0gd2FycGVyLT54MjsKLQotICAgICAgYmFzZV9kaXN0b3J0ICo9IDEwOwotCi0gICAgICBuZXdfc2NhbGUgPSBvcmdfc2NhbGUgKyBGVF9EaXZGaXgoIHcgLSB3YXJwZXItPncwLCBYMiAtIFgxICk7Ci0gICAgICBuZXdfZGVsdGEgPSB4eDEgLSBGVF9NdWxGaXgoIFgxLCBuZXdfc2NhbGUgKTsKLQotICAgICAgYWZfd2FycGVyX2NvbXB1dGVfbGluZV9iZXN0KCB3YXJwZXIsIG5ld19zY2FsZSwgbmV3X2RlbHRhLCB4eDEsIHh4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9kaXN0b3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50cywgbnVtX3NlZ21lbnRzICk7Ci0gICAgfQotCi0gICAgewotICAgICAgRlRfRml4ZWQgIGJlc3Rfc2NhbGUgPSB3YXJwZXItPmJlc3Rfc2NhbGU7Ci0gICAgICBGVF9Qb3MgICAgYmVzdF9kZWx0YSA9IHdhcnBlci0+YmVzdF9kZWx0YTsKLSAgICAgCi0KLSAgICAgIGhpbnRzLT54bWluX2RlbHRhID0gRlRfTXVsRml4KCBYMSwgYmVzdF9zY2FsZSAtIG9yZ19zY2FsZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgYmVzdF9kZWx0YTsKLSAgICAgIGhpbnRzLT54bWF4X2RlbHRhID0gRlRfTXVsRml4KCBYMiwgYmVzdF9zY2FsZSAtIG9yZ19zY2FsZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgYmVzdF9kZWx0YTsKLQotICAgICAgKmFfc2NhbGUgPSBiZXN0X3NjYWxlOwotICAgICAgKmFfZGVsdGEgPSBiZXN0X2RlbHRhOwotICAgIH0KLSAgfQotCi0jZWxzZSAvKiAhQUZfVVNFX1dBUlBFUiAqLwotCi1jaGFyICBhZl93YXJwZXJfZHVtbXkgPSAwOyAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotCi0jZW5kaWYgLyogIUFGX1VTRV9XQVJQRVIgKi8KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZndhcnAuaCBiL3NyYy9hdXRvZml0L2Fmd2FycC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQzZmRkLi4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2Fmd2FycC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZ3YXJwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIHdhcnBpbmcgYWxnb3JpdGhtIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQUZXQVJQX0hfXwotI2RlZmluZSBfX0FGV0FSUF9IX18KLQotI2luY2x1ZGUgImFmaGludHMuaCIKLQotRlRfQkVHSU5fSEVBREVSCi0KLSNkZWZpbmUgQUZfV0FSUEVSX1NDQUxFCi0KLSNkZWZpbmUgQUZfV0FSUEVSX0ZMT09SKCB4ICkgICggKHgpICYgfjYzICkKLSNkZWZpbmUgQUZfV0FSUEVSX0NFSUwoIHggKSAgIEFGX1dBUlBFUl9GTE9PUiggKHgpICsgNjMgKQotCi0KLSAgdHlwZWRlZiBGVF9JbnQzMiAgQUZfV2FycFNjb3JlOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRl9XYXJwZXJSZWNfCi0gIHsKLSAgICBGVF9Qb3MgICAgICAgIHgxLCB4MjsKLSAgICBGVF9Qb3MgICAgICAgIHQxLCB0MjsKLSAgICBGVF9Qb3MgICAgICAgIHgxbWluLCB4MW1heDsKLSAgICBGVF9Qb3MgICAgICAgIHgybWluLCB4Mm1heDsKLSAgICBGVF9Qb3MgICAgICAgIHcwLCB3bWluLCB3bWF4OwotCi0gICAgRlRfRml4ZWQgICAgICBiZXN0X3NjYWxlOwotICAgIEZUX1BvcyAgICAgICAgYmVzdF9kZWx0YTsKLSAgICBBRl9XYXJwU2NvcmUgIGJlc3Rfc2NvcmU7Ci0gICAgQUZfV2FycFNjb3JlICBiZXN0X2Rpc3RvcnQ7Ci0KLSAgfSBBRl9XYXJwZXJSZWMsICpBRl9XYXJwZXI7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmX3dhcnBlcl9jb21wdXRlKCBBRl9XYXJwZXIgICAgICB3YXJwZXIsCi0gICAgICAgICAgICAgICAgICAgICBBRl9HbHlwaEhpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgIEFGX0RpbWVuc2lvbiAgIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgKmFfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICphX2RlbHRhICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0FGV0FSUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2F1dG9maXQuYyBiL3NyYy9hdXRvZml0L2F1dG9maXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlNjZhOS4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9hdXRvZml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhdXRvZml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgbW9kdWxlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiYWZhbmdsZXMuYyIKLSNpbmNsdWRlICJhZmdsb2JhbC5jIgotI2luY2x1ZGUgImFmaGludHMuYyIKLQotI2luY2x1ZGUgImFmZHVtbXkuYyIKLSNpbmNsdWRlICJhZmxhdGluLmMiCi0jaWZkZWYgRlRfT1BUSU9OX0FVVE9GSVQyCi0jaW5jbHVkZSAiYWZsYXRpbjIuYyIKLSNlbmRpZgotI2luY2x1ZGUgImFmY2prLmMiCi0jaW5jbHVkZSAiYWZpbmRpYy5jIgotCi0jaW5jbHVkZSAiYWZsb2FkZXIuYyIKLSNpbmNsdWRlICJhZm1vZHVsZS5jIgotCi0jaWZkZWYgQUZfVVNFX1dBUlBFUgotI2luY2x1ZGUgImFmd2FycC5jIgotI2VuZGlmCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRhZHZhbmMuYyBiL3NyYy9iYXNlL2Z0YWR2YW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmEwY2YuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRhZHZhbmMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0FEVkFOQ0VTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBfZnRfZmFjZV9zY2FsZV9hZHZhbmNlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGZsYWdzICkKLSAgewotICAgIEZUX0ZpeGVkICBzY2FsZTsKLSAgICBGVF9VSW50ICAgbm47Ci0KLSAgICBpZiAoIChmbGFncyAmIEZUX0xPQURfTk9fU0NBTEUpICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIGZhY2UtPnNpemUgPT0gTlVMTCApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfU2l6ZV9IYW5kbGU7Ci0KLSAgICBpZiAoICEoZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCkgKQotICAgICAgc2NhbGUgPSBmYWNlLT5zaXplLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgZWxzZQotICAgICAgc2NhbGUgPSBmYWNlLT5zaXplLT5tZXRyaWNzLnlfc2NhbGU7Ci0KLSAgICAvKiB0aGlzIG11c3QgYmUgdGhlIHNhbWUgY29tcHV0YXRpb24gdGhhbiB0byBnZXQgbGluZWFySG9yaS9WZXJ0QWR2YW5jZQotICAgICAqIChzZWUgRlRfTG9hZF9HbHlwaCgpIGltcGxlbWVudGF0aW9uIGluIHNyYy9iYXNlL2Z0b2Jqcy5jICovCi0gICAgZm9yIChubiA9IDA7IG5uIDwgY291bnQ7IG5uKyspCi0gICAgICBhZHZhbmNlc1tubl0gPSBGVF9NdWxEaXYoIGFkdmFuY2VzW25uXSwgc2NhbGUsIDY0ICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLS8qIGF0IHRoZSBtb21lbnQsIHdlIGNhbiBwZXJmb3JtIGZhc3QgYWR2YW5jZSByZXRyaWV2YWwgb25seSBpbgotICAgdGhlIGZvbGxvd2luZyBjYXNlczoKLQotICAgICAgIC0gdW5zY2FsZWQgbG9hZAotICAgICAgIC0gdW5oaW50ZWQgbG9hZAotICAgICAgIC0gbGlnaHQtaGludGVkIGxvYWQKLSAqLwotI2RlZmluZSAgTE9BRF9BRFZBTkNFX0ZBU1RfQ0hFQ0soZmxhZ3MpICAgIFwKLSAgICAoKChmbGFncyAmIChGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19ISU5USU5HKSkgIT0gMCkgfHwgXAotICAgICBGVF9MT0FEX1RBUkdFVF9NT0RFKGZsYWdzKSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCkKLQotICBGVF9FWFBPUlRfREVGKEZUX0Vycm9yKQotICBGVF9HZXRfQWR2YW5jZSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICpwYWR2YW5jZSApCi0gIHsKLSAgICBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAgZnVuYzsKLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOwotCi0gICAgaWYgKGdpbmRleCA+PSAoRlRfVUludCkgZmFjZS0+bnVtX2dseXBocyApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfR2x5cGhfSW5kZXg7Ci0KLSAgICBmdW5jID0gZmFjZS0+ZHJpdmVyLT5jbGF6ei0+Z2V0X2FkdmFuY2VzOwotICAgIGlmIChmdW5jICE9IE5VTEwgJiYgTE9BRF9BRFZBTkNFX0ZBU1RfQ0hFQ0soZmxhZ3MpKQotICAgIHsKLSAgICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgICAgZXJyb3IgPSBmdW5jKCBmYWNlLCBnaW5kZXgsIDEsIGZsYWdzLCBwYWR2YW5jZSApOwotICAgICAgaWYgKCFlcnJvcikKLSAgICAgICAgcmV0dXJuIF9mdF9mYWNlX3NjYWxlX2FkdmFuY2VzKCBmYWNlLCBwYWR2YW5jZSwgMSwgZmxhZ3MgKTsKLQotICAgICAgaWYgKGVycm9yICE9IEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUpCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfR2V0X0FkdmFuY2VzKCBmYWNlLCBnaW5kZXgsIDEsIGZsYWdzLCBwYWR2YW5jZSApOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKEZUX0Vycm9yKQotICBGVF9HZXRfQWR2YW5jZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKnBhZHZhbmNlcyApCi0gIHsKLSAgICBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAgZnVuYzsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgICAgbnVtLCBlbmQsIG5uOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICBlcnJvciA9IDA7Ci0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKLQotICAgIG51bSA9IChGVF9VSW50KSBmYWNlLT5udW1fZ2x5cGhzOwotICAgIGVuZCA9IHN0YXJ0ICsgY291bnQ7Ci0gICAgaWYgKHN0YXJ0ID49IG51bSB8fCBlbmQgPCBzdGFydCB8fCBlbmQgPiBudW0pCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfR2x5cGhfSW5kZXg7Ci0KLSAgICBpZiAoY291bnQgPT0gMCkKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgIGZ1bmMgPSBmYWNlLT5kcml2ZXItPmNsYXp6LT5nZXRfYWR2YW5jZXM7Ci0gICAgaWYgKGZ1bmMgIT0gTlVMTCAmJiBMT0FEX0FEVkFOQ0VfRkFTVF9DSEVDSyhmbGFncykpCi0gICAgewotICAgICAgZXJyb3IgPSBmdW5jKCBmYWNlLCBzdGFydCwgY291bnQsIGZsYWdzLCBwYWR2YW5jZXMgKTsKLSAgICAgIGlmICghZXJyb3IpIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKGVycm9yICE9IEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUpCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBlcnJvciA9IDA7Ci0KLSAgICBpZiAoKGZsYWdzICYgRlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSkgIT0gMCkKLSAgICAgIHJldHVybiBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlOwotCi0gICAgZmxhZ3MgfD0gRlRfTE9BRF9BRFZBTkNFX09OTFk7Ci0gICAgZm9yIChubiA9IDA7IG5uIDwgY291bnQ7IG5uKyspCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBzdGFydCtubiwgZmxhZ3MgKTsKLSAgICAgIGlmIChlcnJvcikgYnJlYWs7Ci0KLSAgICAgIHBhZHZhbmNlc1tubl0gPSAoZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCkKLSAgICAgICAgICAgICAgICAgICAgPyBmYWNlLT5nbHlwaC0+YWR2YW5jZS54Ci0gICAgICAgICAgICAgICAgICAgIDogZmFjZS0+Z2x5cGgtPmFkdmFuY2UueTsKLSAgICB9Ci0gICAgaWYgKGVycm9yKSByZXR1cm4gZXJyb3I7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gX2Z0X2ZhY2Vfc2NhbGVfYWR2YW5jZXMoIGZhY2UsIHBhZHZhbmNlcywgY291bnQsIGZsYWdzICk7Ci0gIH0KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0YXBpLmMgYi9zcmMvYmFzZS9mdGFwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE0ZDFmLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0YXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRhcGkuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0xJU1RfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICBDIE8gTSBQIEEgVCBJIEIgSSBMIEkgVCBZICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgQVBJICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9OZXdfTWVtb3J5X1N0cmVhbSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtICkKLSAgewotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0gICAgRlRfU3RyZWFtX09wZW5NZW1vcnkoIHN0cmVhbSwgYmFzZSwgc2l6ZSApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZWVrX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcyApCi0gIHsKLSAgICByZXR1cm4gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgcG9zICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1NraXBfU3RyZWFtKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgZGlzdGFuY2UgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9Ta2lwKCBzdHJlYW0sIGRpc3RhbmNlICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1JlYWRfU3RyZWFtKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApCi0gIHsKLSAgICByZXR1cm4gRlRfU3RyZWFtX1JlYWQoIHN0cmVhbSwgYnVmZmVyLCBjb3VudCApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZWFkX1N0cmVhbV9BdCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcywKLSAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApCi0gIHsKLSAgICByZXR1cm4gRlRfU3RyZWFtX1JlYWRBdCggc3RyZWFtLCBwb3MsIGJ1ZmZlciwgY291bnQgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfRXh0cmFjdF9GcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICkKLSAgewotICAgIHJldHVybiBGVF9TdHJlYW1fRXh0cmFjdEZyYW1lKCBzdHJlYW0sIGNvdW50LCBwYnl0ZXMgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9SZWxlYXNlX0ZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMgKQotICB7Ci0gICAgRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSggc3RyZWFtLCBwYnl0ZXMgKTsKLSAgfQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX0FjY2Vzc19GcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApCi0gIHsKLSAgICByZXR1cm4gRlRfU3RyZWFtX0VudGVyRnJhbWUoIHN0cmVhbSwgY291bnQgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9Gb3JnZXRfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX1N0cmVhbV9FeGl0RnJhbWUoIHN0cmVhbSApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGJhc2UuYyBiL3NyYy9iYXNlL2Z0YmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDBlMDJkLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0YmFzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiYXNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNpbmdsZSBvYmplY3QgbGlicmFyeSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2RlZmluZSAgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jaW5jbHVkZSAiZnRjYWxjLmMiCi0jaW5jbHVkZSAiZnRkYmdtZW0uYyIKLSNpbmNsdWRlICJmdGdsb2Fkci5jIgotI2luY2x1ZGUgImZ0bmFtZXMuYyIKLSNpbmNsdWRlICJmdG9ianMuYyIKLSNpbmNsdWRlICJmdG91dGxuLmMiCi0jaW5jbHVkZSAiZnRyZm9yay5jIgotI2luY2x1ZGUgImZ0c3RyZWFtLmMiCi0jaW5jbHVkZSAiZnR0cmlnb24uYyIKLSNpbmNsdWRlICJmdHV0aWwuYyIKLQotI2lmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmICFkZWZpbmVkICggREFSV0lOX05PX0NBUkJPTiApCi0jaW5jbHVkZSAiZnRtYWMuYyIKLSNlbmRpZgotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0YmJveC5jIGIvc3JjL2Jhc2UvZnRiYm94LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMmFiMTMuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRiYm94LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiYm94LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGJib3ggY29tcHV0YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDQsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBjb21wb25lbnQgaGFzIGEgX3NpbmdsZV8gcm9sZTogdG8gY29tcHV0ZSBleGFjdCBvdXRsaW5lIGJvdW5kaW5nICovCi0gIC8qIGJveGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9CQk9YX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0KLQotICB0eXBlZGVmIHN0cnVjdCAgVEJCb3hfUmVjXwotICB7Ci0gICAgRlRfVmVjdG9yICBsYXN0OwotICAgIEZUX0JCb3ggICAgYmJveDsKLQotICB9IFRCQm94X1JlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJCb3hfTW92ZV9UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBtb3ZlX3RvJyBhbmQgYGxpbmVfdG8nIGVtaXR0ZXIgZHVyaW5nICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSgpLiAgSXQgc2ltcGx5IHJlY29yZHMgdGhlIGRlc3RpbmF0aW9uIHBvaW50ICAgKi8KLSAgLyogICAgaW4gYHVzZXItPmxhc3QnOyBubyBmdXJ0aGVyIGNvbXB1dGF0aW9ucyBhcmUgbmVjZXNzYXJ5IHNpbmNlIHdlICAgICovCi0gIC8qICAgIHVzZSB0aGUgY2JveCBhcyB0aGUgc3RhcnRpbmcgYmJveCB3aGljaCBtdXN0IGJlIHJlZmluZWQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHdhbGsgY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsd2F5cyAwLiAgTmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBCQm94X01vdmVfVG8oIEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgIFRCQm94X1JlYyogIHVzZXIgKQotICB7Ci0gICAgdXNlci0+bGFzdCA9ICp0bzsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotI2RlZmluZSBDSEVDS19YKCBwLCBiYm94ICkgIFwKLSAgICAgICAgICAoIHAtPnggPCBiYm94LnhNaW4gfHwgcC0+eCA+IGJib3gueE1heCApCi0KLSNkZWZpbmUgQ0hFQ0tfWSggcCwgYmJveCApICBcCi0gICAgICAgICAgKCBwLT55IDwgYmJveC55TWluIHx8IHAtPnkgPiBiYm94LnlNYXggKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkJveF9Db25pY19DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluZHMgdGhlIGV4dHJlbWEgb2YgYSAxLWRpbWVuc2lvbmFsIGNvbmljIEJlemllciBjdXJ2ZSBhbmQgdXBkYXRlICovCi0gIC8qICAgIGEgYm91bmRpbmcgcmFuZ2UuICBUaGlzIHZlcnNpb24gdXNlcyBkaXJlY3QgY29tcHV0YXRpb24sIGFzIGl0ICAgICAqLwotICAvKiAgICBkb2Vzbid0IG5lZWQgc3F1YXJlIHJvb3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MSAgOjogVGhlIHN0YXJ0IGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkyICA6OiBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTMgIDo6IFRoZSBlbmQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IG1pbmltdW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWF4aW11bS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEJCb3hfQ29uaWNfQ2hlY2soIEZUX1BvcyAgIHkxLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICB5MiwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgeTMsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyogIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgbWF4ICkKLSAgewotICAgIGlmICggeTEgPD0geTMgJiYgeTIgPT0geTEgKSAgICAgLyogZmxhdCBhcmMgKi8KLSAgICAgIGdvdG8gU3VpdGU7Ci0KLSAgICBpZiAoIHkxIDwgeTMgKQotICAgIHsKLSAgICAgIGlmICggeTIgPj0geTEgJiYgeTIgPD0geTMgKSAgIC8qIGFzY2VuZGluZyBhcmMgKi8KLSAgICAgICAgZ290byBTdWl0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggeTIgPj0geTMgJiYgeTIgPD0geTEgKSAgIC8qIGRlc2NlbmRpbmcgYXJjICovCi0gICAgICB7Ci0gICAgICAgIHkyID0geTE7Ci0gICAgICAgIHkxID0geTM7Ci0gICAgICAgIHkzID0geTI7Ci0gICAgICAgIGdvdG8gU3VpdGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgeTEgPSB5MyA9IHkxIC0gRlRfTXVsRGl2KCB5MiAtIHkxLCB5MiAtIHkxLCB5MSAtIDIqeTIgKyB5MyApOwotCi0gIFN1aXRlOgotICAgIGlmICggeTEgPCAqbWluICkgKm1pbiA9IHkxOwotICAgIGlmICggeTMgPiAqbWF4ICkgKm1heCA9IHkzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0NvbmljX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgY29uaWNfdG8nIGVtaXR0ZXIgZHVyaW5nICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0RlY29tcG9zZSgpLiAgSXQgY2hlY2tzIGEgY29uaWMgQmV6aWVyIGN1cnZlIHdpdGggdGhlICAgICovCi0gIC8qICAgIGN1cnJlbnQgYm91bmRpbmcgYm94LCBhbmQgY29tcHV0ZXMgaXRzIGV4dHJlbWEgaWYgbmVjZXNzYXJ5IHRvICAgICAqLwotICAvKiAgICB1cGRhdGUgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sIDo6IEEgcG9pbnRlciB0byBhIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsd2F5cyAwLiAgTmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIHRoZSBjYXNlIG9mIGEgbm9uLW1vbm90b25vdXMgYXJjLCB3ZSBjb21wdXRlIGRpcmVjdGx5IHRoZSAgICAgICAqLwotICAvKiAgICBleHRyZW11bSBjb29yZGluYXRlcywgYXMgaXQgaXMgc3VmZmljaWVudGx5IGZhc3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBpbnQKLSAgQkJveF9Db25pY19UbyggRlRfVmVjdG9yKiAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgIFRCQm94X1JlYyogIHVzZXIgKQotICB7Ci0gICAgLyogd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBgdG8nIHNpbmNlIGl0IGlzIGFsd2F5cyBhbiBgb24nIHBvaW50LCB0aHVzICovCi0gICAgLyogd2l0aGluIHRoZSBiYm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBpZiAoIENIRUNLX1goIGNvbnRyb2wsIHVzZXItPmJib3ggKSApCi0gICAgICBCQm94X0NvbmljX0NoZWNrKCB1c2VyLT5sYXN0LngsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgdG8tPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC54TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueE1heCApOwotCi0gICAgaWYgKCBDSEVDS19ZKCBjb250cm9sLCB1c2VyLT5iYm94ICkgKQotICAgICAgQkJveF9Db25pY19DaGVjayggdXNlci0+bGFzdC55LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvLT55LAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueU1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnlNYXggKTsKLQotICAgIHVzZXItPmxhc3QgPSAqdG87Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkJveF9DdWJpY19DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluZHMgdGhlIGV4dHJlbWEgb2YgYSAxLWRpbWVuc2lvbmFsIGN1YmljIEJlemllciBjdXJ2ZSBhbmQgICAgICAgICovCi0gIC8qICAgIHVwZGF0ZXMgYSBib3VuZGluZyByYW5nZS4gIFRoaXMgdmVyc2lvbiB1c2VzIHNwbGl0dGluZyBiZWNhdXNlIHdlICAqLwotICAvKiAgICBkb24ndCB3YW50IHRvIHVzZSBzcXVhcmUgcm9vdHMgYW5kIGV4dHJhIGFjY3VyYWN5LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwMSAgOjogVGhlIHN0YXJ0IGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHAyICA6OiBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcDMgIDo6IFRoZSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwNCAgOjogVGhlIGVuZCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW4gOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWluaW11bS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtYXhpbXVtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmIDAKLQotICBzdGF0aWMgdm9pZAotICBCQm94X0N1YmljX0NoZWNrKCBGVF9Qb3MgICBwMSwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgcDIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgIHAzLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICBwNCwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgbWluLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtYXggKQotICB7Ci0gICAgRlRfUG9zICBzdGFja1szMiozICsgMV0sICphcmM7Ci0KLQotICAgIGFyYyA9IHN0YWNrOwotCi0gICAgYXJjWzBdID0gcDE7Ci0gICAgYXJjWzFdID0gcDI7Ci0gICAgYXJjWzJdID0gcDM7Ci0gICAgYXJjWzNdID0gcDQ7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIEZUX1BvcyAgeTEgPSBhcmNbMF07Ci0gICAgICBGVF9Qb3MgIHkyID0gYXJjWzFdOwotICAgICAgRlRfUG9zICB5MyA9IGFyY1syXTsKLSAgICAgIEZUX1BvcyAgeTQgPSBhcmNbM107Ci0KLQotICAgICAgaWYgKCB5MSA9PSB5NCApCi0gICAgICB7Ci0gICAgICAgIGlmICggeTEgPT0geTIgJiYgeTEgPT0geTMgKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGF0ICovCi0gICAgICAgICAgZ290byBUZXN0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHkxIDwgeTQgKQotICAgICAgewotICAgICAgICBpZiAoIHkyID49IHkxICYmIHkyIDw9IHk0ICYmIHkzID49IHkxICYmIHkzIDw9IHk0ICkgLyogYXNjZW5kaW5nICovCi0gICAgICAgICAgZ290byBUZXN0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIHkyID49IHk0ICYmIHkyIDw9IHkxICYmIHkzID49IHk0ICYmIHkzIDw9IHkxICkgLyogZGVzY2VuZGluZyAqLwotICAgICAgICB7Ci0gICAgICAgICAgeTIgPSB5MTsKLSAgICAgICAgICB5MSA9IHk0OwotICAgICAgICAgIHk0ID0geTI7Ci0gICAgICAgICAgZ290byBUZXN0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIHVua25vd24gZGlyZWN0aW9uIC0tIHNwbGl0IHRoZSBhcmMgaW4gdHdvICovCi0gICAgICBhcmNbNl0gPSB5NDsKLSAgICAgIGFyY1sxXSA9IHkxID0gKCB5MSArIHkyICkgLyAyOwotICAgICAgYXJjWzVdID0geTQgPSAoIHk0ICsgeTMgKSAvIDI7Ci0gICAgICB5MiA9ICggeTIgKyB5MyApIC8gMjsKLSAgICAgIGFyY1syXSA9IHkxID0gKCB5MSArIHkyICkgLyAyOwotICAgICAgYXJjWzRdID0geTQgPSAoIHk0ICsgeTIgKSAvIDI7Ci0gICAgICBhcmNbM10gPSAoIHkxICsgeTQgKSAvIDI7Ci0KLSAgICAgIGFyYyArPSAzOwotICAgICAgZ290byBTdWl0ZTsKLQotICAgVGVzdDoKLSAgICAgIGlmICggeTEgPCAqbWluICkgKm1pbiA9IHkxOwotICAgICAgaWYgKCB5NCA+ICptYXggKSAqbWF4ID0geTQ7Ci0gICAgICBhcmMgLT0gMzsKLQotICAgIFN1aXRlOgotICAgICAgOwotICAgIH0gd2hpbGUgKCBhcmMgPj0gc3RhY2sgKTsKLSAgfQotCi0jZWxzZQotCi0gIHN0YXRpYyB2b2lkCi0gIHRlc3RfY3ViaWNfZXh0cmVtYSggRlRfUG9zICAgIHkxLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICB5MiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgeTMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgIHk0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICB1LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgIG1heCApCi0gIHsKLSAvKiBGVF9Qb3MgICAgYSA9IHk0IC0gMyp5MyArIDMqeTIgLSB5MTsgKi8KLSAgICBGVF9Qb3MgICAgYiA9IHkzIC0gMip5MiArIHkxOwotICAgIEZUX1BvcyAgICBjID0geTIgLSB5MTsKLSAgICBGVF9Qb3MgICAgZCA9IHkxOwotICAgIEZUX1BvcyAgICB5OwotICAgIEZUX0ZpeGVkICB1dTsKLQotICAgIEZUX1VOVVNFRCAoIHk0ICk7Ci0KLQotICAgIC8qIFRoZSBwb2x5bm9taWFsIGlzICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBQKHgpID0gYSp4XjMgKyAzYip4XjIgKyAzYyp4ICsgZCAgLCAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBkUC9keCA9IDNhKnheMiArIDZiKnggKyAzYyAgICAgICAgIC4gKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEhvd2V2ZXIsIHdlIGFsc28gaGF2ZSAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIGRQL2R4KHUpID0gMCAgICAgICAgICAgICAgICAgICAgICAgLCAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogd2hpY2ggaW1wbGllcyBieSBzdWJ0cmFjdGlvbiB0aGF0ICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgUCh1KSA9IGIqdV4yICsgMmMqdSArIGQgICAgICAgICAgICAuICovCi0KLSAgICBpZiAoIHUgPiAwICYmIHUgPCAweDEwMDAwTCApCi0gICAgewotICAgICAgdXUgPSBGVF9NdWxGaXgoIHUsIHUgKTsKLSAgICAgIHkgID0gZCArIEZUX011bEZpeCggYywgMip1ICkgKyBGVF9NdWxGaXgoIGIsIHV1ICk7Ci0KLSAgICAgIGlmICggeSA8ICptaW4gKSAqbWluID0geTsKLSAgICAgIGlmICggeSA+ICptYXggKSAqbWF4ID0geTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEJCb3hfQ3ViaWNfQ2hlY2soIEZUX1BvcyAgIHkxLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICB5MiwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgeTMsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgIHk0LAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtaW4sCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyogIG1heCApCi0gIHsKLSAgICAvKiBhbHdheXMgY29tcGFyZSBmaXJzdCBhbmQgbGFzdCBwb2ludHMgKi8KLSAgICBpZiAgICAgICggeTEgPCAqbWluICkgICptaW4gPSB5MTsKLSAgICBlbHNlIGlmICggeTEgPiAqbWF4ICkgICptYXggPSB5MTsKLQotICAgIGlmICAgICAgKCB5NCA8ICptaW4gKSAgKm1pbiA9IHk0OwotICAgIGVsc2UgaWYgKCB5NCA+ICptYXggKSAgKm1heCA9IHk0OwotCi0gICAgLyogbm93LCB0cnkgdG8gc2VlIGlmIHRoZXJlIGFyZSBzcGxpdCBwb2ludHMgaGVyZSAqLwotICAgIGlmICggeTEgPD0geTQgKQotICAgIHsKLSAgICAgIC8qIGZsYXQgb3IgYXNjZW5kaW5nIGFyYyB0ZXN0ICovCi0gICAgICBpZiAoIHkxIDw9IHkyICYmIHkyIDw9IHk0ICYmIHkxIDw9IHkzICYmIHkzIDw9IHk0ICkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIC8qIHkxID4geTQgKi8KLSAgICB7Ci0gICAgICAvKiBkZXNjZW5kaW5nIGFyYyB0ZXN0ICovCi0gICAgICBpZiAoIHkxID49IHkyICYmIHkyID49IHk0ICYmIHkxID49IHkzICYmIHkzID49IHk0ICkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFRoZXJlIGFyZSBzb21lIHNwbGl0IHBvaW50cy4gIEZpbmQgdGhlbS4gKi8KLSAgICB7Ci0gICAgICBGVF9Qb3MgICAgYSA9IHk0IC0gMyp5MyArIDMqeTIgLSB5MTsKLSAgICAgIEZUX1BvcyAgICBiID0geTMgLSAyKnkyICsgeTE7Ci0gICAgICBGVF9Qb3MgICAgYyA9IHkyIC0geTE7Ci0gICAgICBGVF9Qb3MgICAgZDsKLSAgICAgIEZUX0ZpeGVkICB0OwotCi0KLSAgICAgIC8qIFdlIG5lZWQgdG8gc29sdmUgYGF4XjIrMmJ4K2MnIGhlcmUsIHdpdGhvdXQgZmxvYXRpbmcgcG9pbnRzISAgICAgICovCi0gICAgICAvKiBUaGUgdHJpY2sgaXMgdG8gbm9ybWFsaXplIHRvIGEgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uIGluIG9yZGVyICAqLwotICAgICAgLyogdG8gdXNlIG91ciAxNi4xNiBmaXhlZCBwb2ludCByb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBXZSBjb21wdXRlIEZUX011bEZpeChiLGIpIGFuZCBGVF9NdWxGaXgoYSxjKSBhZnRlciBub3JtYWxpemF0aW9uLiAqLwotICAgICAgLyogVGhlc2UgdmFsdWVzIG11c3QgZml0IGludG8gYSBzaW5nbGUgMTYuMTYgdmFsdWUuICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBXZSBub3JtYWxpemUgYSwgYiwgYW5kIGMgdG8gYDguMTYnIGZpeGVkIGZsb2F0IHZhbHVlcyB0byBlbnN1cmUgICAqLwotICAgICAgLyogdGhhdCBpdHMgcHJvZHVjdCBpcyBoZWxkIGluIGEgYDE2LjE2JyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgdDEsIHQyOwotICAgICAgICBpbnQgICAgICAgc2hpZnQgPSAwOwotCi0KLSAgICAgICAgLyogVGhlIGZvbGxvd2luZyBjb21wdXRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZmFjdCB0aGF0IGZvciAgICovCi0gICAgICAgIC8qIGFueSB2YWx1ZSBgeScsIGlmIGBuJyBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIG1vc3QgICAgICAgICAqLwotICAgICAgICAvKiBzaWduaWZpY2FudCBiaXQgb2YgYGFicyh5KScgKHN0YXJ0aW5nIGZyb20gMCBmb3IgdGhlICAgICAgKi8KLSAgICAgICAgLyogbGVhc3Qgc2lnbmlmaWNhbnQgYml0KSwgdGhlbiBgeScgaXMgaW4gdGhlIHJhbmdlICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgIC0yXm4uLjJebi0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFdlIHdhbnQgdG8gc2hpZnQgYGEnLCBgYicsIGFuZCBgYycgY29uY3VycmVudGx5IGluIG9yZGVyICAqLwotICAgICAgICAvKiB0byBlbnN1cmUgdGhhdCB0aGV5IGFsbCBmaXQgaW4gOC4xNiB2YWx1ZXMsIHdoaWNoIG1hcHMgICAgKi8KLSAgICAgICAgLyogdG8gdGhlIGludGVnZXIgcmFuZ2UgYC0yXjIzLi4yXjIzLTEnLiAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBOZWNlc3NhcmlseSwgd2UgbmVlZCB0byBzaGlmdCBgYScsIGBiJywgYW5kIGBjJyBzbyB0aGF0ICAgKi8KLSAgICAgICAgLyogdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGl0cyBhYnNvbHV0ZSB2YWx1ZXMgaXMgYXQgICAgICovCi0gICAgICAgIC8qIF9tb3N0XyBhdCBwb3NpdGlvbiAyMy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogV2UgYmVnaW4gYnkgY29tcHV0aW5nIGB0MScgYXMgdGhlIGJpdHdpc2UgYE9SJyBvZiB0aGUgICAgICovCi0gICAgICAgIC8qIGFic29sdXRlIHZhbHVlcyBvZiBgYScsIGBiJywgYGMnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIHQxICA9IChGVF9VTG9uZykoICggYSA+PSAwICkgPyBhIDogLWEgKTsKLSAgICAgICAgdDIgID0gKEZUX1VMb25nKSggKCBiID49IDAgKSA/IGIgOiAtYiApOwotICAgICAgICB0MSB8PSB0MjsKLSAgICAgICAgdDIgID0gKEZUX1VMb25nKSggKCBjID49IDAgKSA/IGMgOiAtYyApOwotICAgICAgICB0MSB8PSB0MjsKLQotICAgICAgICAvKiBOb3cgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgYHQxJyAgKi8KLSAgICAgICAgLyogaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGVpdGhlciBgYScsIGBiJywgb3IgYGMnLCAgICovCi0gICAgICAgIC8qIGRlcGVuZGluZyBvbiB0aGUgZ3JlYXRlc3QgaW50ZWdlciByYW5nZSBvZiB0aGUgcGFydGljdWxhciAqLwotICAgICAgICAvKiB2YXJpYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIE5leHQsIHdlIGNvbXB1dGUgdGhlIGBzaGlmdCcsIGJ5IHNoaWZ0aW5nIGB0MScgYXMgbWFueSAgICAqLwotICAgICAgICAvKiB0aW1lcyBhcyBuZWNlc3NhcnkgdG8gbW92ZSBpdHMgTVNCIHRvIHBvc2l0aW9uIDIzLiAgVGhpcyAgKi8KLSAgICAgICAgLyogY29ycmVzcG9uZHMgdG8gYSB2YWx1ZSBvZiBgdDEnIHRoYXQgaXMgaW4gdGhlIHJhbmdlICAgICAgICovCi0gICAgICAgIC8qIDB4NDBfMDAwMC4uMHg3Rl9GRkZGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogRmluYWxseSwgd2Ugc2hpZnQgYGEnLCBgYicsIGFuZCBgYycgYnkgdGhlIHNhbWUgYW1vdW50LiAgICovCi0gICAgICAgIC8qIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCB2YWx1ZXMgYXJlIG5vdyBpbiB0aGUgcmFuZ2UgICAgICAgICAqLwotICAgICAgICAvKiAtMl4yMy4uMl4yMywgaS5lLiwgdGhleSBhcmUgbm93IGV4cHJlc3NlZCBhcyA4LjE2ICAgICAgICAgKi8KLSAgICAgICAgLyogZml4ZWQtZmxvYXQgbnVtYmVycy4gIFRoaXMgYWxzbyBtZWFucyB0aGF0IHdlIGFyZSB1c2luZyAgICovCi0gICAgICAgIC8qIDI0IGJpdHMgb2YgcHJlY2lzaW9uIHRvIGNvbXB1dGUgdGhlIHplcm9zLCBpbmRlcGVuZGVudGx5ICAqLwotICAgICAgICAvKiBvZiB0aGUgcmFuZ2Ugb2YgdGhlIG9yaWdpbmFsIHBvbHlub21pYWwgY29lZmZpY2llbnRzLiAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoaXMgYWxnb3JpdGhtIHNob3VsZCBlbnN1cmUgcmVhc29uYWJseSBhY2N1cmF0ZSB2YWx1ZXMgICAqLwotICAgICAgICAvKiBmb3IgdGhlIHplcm9zLiAgTm90ZSB0aGF0IHRoZXkgYXJlIG9ubHkgZXhwcmVzc2VkIHdpdGggICAgKi8KLSAgICAgICAgLyogMTYgYml0cyB3aGVuIGNvbXB1dGluZyB0aGUgZXh0cmVtYSAodGhlIHplcm9zIG5lZWQgdG8gICAgICovCi0gICAgICAgIC8qIGJlIGluIDAuLjEgZXhjbHVzaXZlIHRvIGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgYXJjKS4gICAqLwotCi0gICAgICAgIGlmICggdDEgPT0gMCApICAvKiBhbGwgY29lZmZpY2llbnRzIGFyZSAwISAqLwotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAoIHQxID4gMHg3RkZGRkZVTCApCi0gICAgICAgIHsKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNoaWZ0Kys7Ci0gICAgICAgICAgICB0MSA+Pj0gMTsKLQotICAgICAgICAgIH0gd2hpbGUgKCB0MSA+IDB4N0ZGRkZGVUwgKTsKLQotICAgICAgICAgIC8qIHRoaXMgbG9zZXMgc29tZSBiaXRzIG9mIHByZWNpc2lvbiwgYnV0IHdlIHVzZSAyNCBvZiB0aGVtICovCi0gICAgICAgICAgLyogZm9yIHRoZSBjb21wdXRhdGlvbiBhbnl3YXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBhID4+PSBzaGlmdDsKLSAgICAgICAgICBiID4+PSBzaGlmdDsKLSAgICAgICAgICBjID4+PSBzaGlmdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggdDEgPCAweDQwMDAwMFVMICkKLSAgICAgICAgewotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgc2hpZnQrKzsKLSAgICAgICAgICAgIHQxIDw8PSAxOwotCi0gICAgICAgICAgfSB3aGlsZSAoIHQxIDwgMHg0MDAwMDBVTCApOwotCi0gICAgICAgICAgYSA8PD0gc2hpZnQ7Ci0gICAgICAgICAgYiA8PD0gc2hpZnQ7Ci0gICAgICAgICAgYyA8PD0gc2hpZnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogaGFuZGxlIGEgPT0gMCAqLwotICAgICAgaWYgKCBhID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoIGIgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICB0ID0gLSBGVF9EaXZGaXgoIGMsIGIgKSAvIDI7Ci0gICAgICAgICAgdGVzdF9jdWJpY19leHRyZW1hKCB5MSwgeTIsIHkzLCB5NCwgdCwgbWluLCBtYXggKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBzb2x2ZSB0aGUgZXF1YXRpb24gbm93ICovCi0gICAgICAgIGQgPSBGVF9NdWxGaXgoIGIsIGIgKSAtIEZUX011bEZpeCggYSwgYyApOwotICAgICAgICBpZiAoIGQgPCAwICkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaWYgKCBkID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhlcmUgaXMgYSBzaW5nbGUgc3BsaXQgcG9pbnQgYXQgLWIvYSAqLwotICAgICAgICAgIHQgPSAtIEZUX0RpdkZpeCggYiwgYSApOwotICAgICAgICAgIHRlc3RfY3ViaWNfZXh0cmVtYSggeTEsIHkyLCB5MywgeTQsIHQsIG1pbiwgbWF4ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhlcmUgYXJlIHR3byBzb2x1dGlvbnM7IHdlIG5lZWQgdG8gZmlsdGVyIHRoZW0gKi8KLSAgICAgICAgICBkID0gRlRfU3FydEZpeGVkKCAoRlRfSW50MzIpZCApOwotICAgICAgICAgIHQgPSAtIEZUX0RpdkZpeCggYiAtIGQsIGEgKTsKLSAgICAgICAgICB0ZXN0X2N1YmljX2V4dHJlbWEoIHkxLCB5MiwgeTMsIHk0LCB0LCBtaW4sIG1heCApOwotCi0gICAgICAgICAgdCA9IC0gRlRfRGl2Rml4KCBiICsgZCwgYSApOwotICAgICAgICAgIHRlc3RfY3ViaWNfZXh0cmVtYSggeTEsIHkyLCB5MywgeTQsIHQsIG1pbiwgbWF4ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0N1YmljX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgY3ViaWNfdG8nIGVtaXR0ZXIgZHVyaW5nICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0RlY29tcG9zZSgpLiAgSXQgY2hlY2tzIGEgY3ViaWMgQmV6aWVyIGN1cnZlIHdpdGggdGhlICAgICovCi0gIC8qICAgIGN1cnJlbnQgYm91bmRpbmcgYm94LCBhbmQgY29tcHV0ZXMgaXRzIGV4dHJlbWEgaWYgbmVjZXNzYXJ5IHRvICAgICAqLwotICAvKiAgICB1cGRhdGUgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sMSA6OiBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2wyIDo6IEEgcG9pbnRlciB0byB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWx3YXlzIDAuICBOZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2Ugb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gdGhlIGNhc2Ugb2YgYSBub24tbW9ub3Rvbm91cyBhcmMsIHdlIGRvbid0IGNvbXB1dGUgZGlyZWN0bHkgICAgICovCi0gIC8qICAgIGV4dHJlbXVtIGNvb3JkaW5hdGVzLCB3ZSBzdWJkaXZpZGUgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBCQm94X0N1YmljX1RvKCBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICBUQkJveF9SZWMqICB1c2VyICkKLSAgewotICAgIC8qIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYHRvJyBzaW5jZSBpdCBpcyBhbHdheXMgYW4gYG9uJyBwb2ludCwgdGh1cyAqLwotICAgIC8qIHdpdGhpbiB0aGUgYmJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBDSEVDS19YKCBjb250cm9sMSwgdXNlci0+YmJveCApIHx8Ci0gICAgICAgICBDSEVDS19YKCBjb250cm9sMiwgdXNlci0+YmJveCApICkKLSAgICAgIEJCb3hfQ3ViaWNfQ2hlY2soIHVzZXItPmxhc3QueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wxLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDItPngsCi0gICAgICAgICAgICAgICAgICAgICAgICB0by0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC54TWF4ICk7Ci0KLSAgICBpZiAoIENIRUNLX1koIGNvbnRyb2wxLCB1c2VyLT5iYm94ICkgfHwKLSAgICAgICAgIENIRUNLX1koIGNvbnRyb2wyLCB1c2VyLT5iYm94ICkgKQotICAgICAgQkJveF9DdWJpY19DaGVjayggdXNlci0+bGFzdC55LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDEtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sMi0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvLT55LAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueU1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnlNYXggKTsKLQotICAgIHVzZXItPmxhc3QgPSAqdG87Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJib3guaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9HZXRfQkJveCggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICAgICphYmJveCApCi0gIHsKLSAgICBGVF9CQm94ICAgICBjYm94OwotICAgIEZUX0JCb3ggICAgIGJib3g7Ci0gICAgRlRfVmVjdG9yKiAgdmVjOwotICAgIEZUX1VTaG9ydCAgIG47Ci0KLQotICAgIGlmICggIWFiYm94ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX091dGxpbmU7Ci0KLSAgICAvKiBpZiBvdXRsaW5lIGlzIGVtcHR5LCByZXR1cm4gKDAsMCwwLDApICovCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwIHx8IG91dGxpbmUtPm5fY29udG91cnMgPD0gMCApCi0gICAgewotICAgICAgYWJib3gtPnhNaW4gPSBhYmJveC0+eE1heCA9IDA7Ci0gICAgICBhYmJveC0+eU1pbiA9IGFiYm94LT55TWF4ID0gMDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIFdlIGNvbXB1dGUgdGhlIGNvbnRyb2wgYm94IGFzIHdlbGwgYXMgdGhlIGJvdW5kaW5nIGJveCBvZiAgKi8KLSAgICAvKiBhbGwgYG9uJyBwb2ludHMgaW4gdGhlIG91dGxpbmUuICBUaGVuLCBpZiB0aGUgdHdvIGJveGVzICAgICovCi0gICAgLyogY29pbmNpZGUsIHdlIGV4aXQgaW1tZWRpYXRlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgdmVjID0gb3V0bGluZS0+cG9pbnRzOwotICAgIGJib3gueE1pbiA9IGJib3gueE1heCA9IGNib3gueE1pbiA9IGNib3gueE1heCA9IHZlYy0+eDsKLSAgICBiYm94LnlNaW4gPSBiYm94LnlNYXggPSBjYm94LnlNaW4gPSBjYm94LnlNYXggPSB2ZWMtPnk7Ci0gICAgdmVjKys7Ci0KLSAgICBmb3IgKCBuID0gMTsgbiA8IG91dGxpbmUtPm5fcG9pbnRzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgeCA9IHZlYy0+eDsKLSAgICAgIEZUX1BvcyAgeSA9IHZlYy0+eTsKLQotCi0gICAgICAvKiB1cGRhdGUgY29udHJvbCBib3ggKi8KLSAgICAgIGlmICggeCA8IGNib3gueE1pbiApIGNib3gueE1pbiA9IHg7Ci0gICAgICBpZiAoIHggPiBjYm94LnhNYXggKSBjYm94LnhNYXggPSB4OwotCi0gICAgICBpZiAoIHkgPCBjYm94LnlNaW4gKSBjYm94LnlNaW4gPSB5OwotICAgICAgaWYgKCB5ID4gY2JveC55TWF4ICkgY2JveC55TWF4ID0geTsKLQotICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUtPnRhZ3Nbbl0gKSA9PSBGVF9DVVJWRV9UQUdfT04gKQotICAgICAgewotICAgICAgICAvKiB1cGRhdGUgYmJveCBmb3IgYG9uJyBwb2ludHMgb25seSAqLwotICAgICAgICBpZiAoIHggPCBiYm94LnhNaW4gKSBiYm94LnhNaW4gPSB4OwotICAgICAgICBpZiAoIHggPiBiYm94LnhNYXggKSBiYm94LnhNYXggPSB4OwotCi0gICAgICAgIGlmICggeSA8IGJib3gueU1pbiApIGJib3gueU1pbiA9IHk7Ci0gICAgICAgIGlmICggeSA+IGJib3gueU1heCApIGJib3gueU1heCA9IHk7Ci0gICAgICB9Ci0KLSAgICAgIHZlYysrOwotICAgIH0KLQotICAgIC8qIHRlc3QgdHdvIGJveGVzIGZvciBlcXVhbGl0eSAqLwotICAgIGlmICggY2JveC54TWluIDwgYmJveC54TWluIHx8IGNib3gueE1heCA+IGJib3gueE1heCB8fAotICAgICAgICAgY2JveC55TWluIDwgYmJveC55TWluIHx8IGNib3gueU1heCA+IGJib3gueU1heCApCi0gICAgewotICAgICAgLyogdGhlIHR3byBib3hlcyBhcmUgZGlmZmVyZW50LCBub3cgd2FsayBvdmVyIHRoZSBvdXRsaW5lIHRvICovCi0gICAgICAvKiBnZXQgdGhlIEJlemllciBhcmMgZXh0cmVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgc3RhdGljIGNvbnN0IEZUX091dGxpbmVfRnVuY3MgIGJib3hfaW50ZXJmYWNlID0KLSAgICAgIHsKLSAgICAgICAgKEZUX091dGxpbmVfTW92ZVRvX0Z1bmMpIEJCb3hfTW92ZV9UbywKLSAgICAgICAgKEZUX091dGxpbmVfTGluZVRvX0Z1bmMpIEJCb3hfTW92ZV9UbywKLSAgICAgICAgKEZUX091dGxpbmVfQ29uaWNUb19GdW5jKUJCb3hfQ29uaWNfVG8sCi0gICAgICAgIChGVF9PdXRsaW5lX0N1YmljVG9fRnVuYylCQm94X0N1YmljX1RvLAotICAgICAgICAwLCAwCi0gICAgICB9OwotCi0gICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICAgVEJCb3hfUmVjICB1c2VyOwotCi0KLSAgICAgIHVzZXIuYmJveCA9IGJib3g7Ci0KLSAgICAgIGVycm9yID0gRlRfT3V0bGluZV9EZWNvbXBvc2UoIG91dGxpbmUsICZiYm94X2ludGVyZmFjZSwgJnVzZXIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICphYmJveCA9IHVzZXIuYmJveDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgKmFiYm94ID0gYmJveDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Yml0bWFwLmMgYi9zcmMvYmFzZS9mdGJpdG1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFjZGYyLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0Yml0bWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiaXRtYXAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIDFicHAsIDJicHAsIDRicHAsIGFuZCA4YnBwICovCi0vKiAgICBiaXRtYXBzIGludG8gOGJwcCBmb3JtYXQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9CSVRNQVBfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotICBzdGF0aWMKLSAgY29uc3QgRlRfQml0bWFwICBudWxsX2JpdG1hcCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJpdG1hcC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0JpdG1hcF9OZXcoIEZUX0JpdG1hcCAgKmFiaXRtYXAgKQotICB7Ci0gICAgKmFiaXRtYXAgPSBudWxsX2JpdG1hcDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJpdG1hcC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfQ29weSggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgKnRhcmdldCkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEZUX0ludCAgICAgcGl0Y2ggID0gc291cmNlLT5waXRjaDsKLSAgICBGVF9VTG9uZyAgIHNpemU7Ci0KLQotICAgIGlmICggc291cmNlID09IHRhcmdldCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzb3VyY2UtPmJ1ZmZlciA9PSBOVUxMICkKLSAgICB7Ci0gICAgICAqdGFyZ2V0ID0gKnNvdXJjZTsKLQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICBpZiAoIHBpdGNoIDwgMCApCi0gICAgICBwaXRjaCA9IC1waXRjaDsKLSAgICBzaXplID0gKEZUX1VMb25nKSggcGl0Y2ggKiBzb3VyY2UtPnJvd3MgKTsKLQotICAgIGlmICggdGFyZ2V0LT5idWZmZXIgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICB0YXJnZXRfcGl0Y2ggPSB0YXJnZXQtPnBpdGNoOwotICAgICAgRlRfVUxvbmcgIHRhcmdldF9zaXplOwotCi0KLSAgICAgIGlmICggdGFyZ2V0X3BpdGNoIDwgMCAgKQotICAgICAgICB0YXJnZXRfcGl0Y2ggPSAtdGFyZ2V0X3BpdGNoOwotICAgICAgdGFyZ2V0X3NpemUgPSAoRlRfVUxvbmcpKCB0YXJnZXRfcGl0Y2ggKiB0YXJnZXQtPnJvd3MgKTsKLQotICAgICAgaWYgKCB0YXJnZXRfc2l6ZSAhPSBzaXplICkKLSAgICAgICAgKHZvaWQpRlRfUVJFQUxMT0MoIHRhcmdldC0+YnVmZmVyLCB0YXJnZXRfc2l6ZSwgc2l6ZSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAodm9pZClGVF9RQUxMT0MoIHRhcmdldC0+YnVmZmVyLCBzaXplICk7Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqcDsKLQotCi0gICAgICBwID0gdGFyZ2V0LT5idWZmZXI7Ci0gICAgICAqdGFyZ2V0ID0gKnNvdXJjZTsKLSAgICAgIHRhcmdldC0+YnVmZmVyID0gcDsKLQotICAgICAgRlRfTUVNX0NPUFkoIHRhcmdldC0+YnVmZmVyLCBzb3VyY2UtPmJ1ZmZlciwgc2l6ZSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKCBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAqICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICB4cGl4ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgeXBpeGVscyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgaW50ICAgICAgICAgICAgIHBpdGNoOwotICAgIGludCAgICAgICAgICAgICBuZXdfcGl0Y2g7Ci0gICAgRlRfVUludCAgICAgICAgIGJwcDsKLSAgICBGVF9JbnQgICAgICAgICAgaSwgd2lkdGgsIGhlaWdodDsKLSAgICB1bnNpZ25lZCBjaGFyKiAgYnVmZmVyOwotCi0KLSAgICB3aWR0aCAgPSBiaXRtYXAtPndpZHRoOwotICAgIGhlaWdodCA9IGJpdG1hcC0+cm93czsKLSAgICBwaXRjaCAgPSBiaXRtYXAtPnBpdGNoOwotICAgIGlmICggcGl0Y2ggPCAwICkKLSAgICAgIHBpdGNoID0gLXBpdGNoOwotCi0gICAgc3dpdGNoICggYml0bWFwLT5waXhlbF9tb2RlICkKLSAgICB7Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX01PTk86Ci0gICAgICBicHAgICAgICAgPSAxOwotICAgICAgbmV3X3BpdGNoID0gKCB3aWR0aCArIHhwaXhlbHMgKyA3ICkgPj4gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZMjoKLSAgICAgIGJwcCAgICAgICA9IDI7Ci0gICAgICBuZXdfcGl0Y2ggPSAoIHdpZHRoICsgeHBpeGVscyArIDMgKSA+PiAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVk0OgotICAgICAgYnBwICAgICAgID0gNDsKLSAgICAgIG5ld19waXRjaCA9ICggd2lkdGggKyB4cGl4ZWxzICsgMSApID4+IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWToKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfTENEOgotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9MQ0RfVjoKLSAgICAgIGJwcCAgICAgICA9IDg7Ci0gICAgICBuZXdfcGl0Y2ggPSAoIHdpZHRoICsgeHBpeGVscyApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9HbHlwaF9Gb3JtYXQ7Ci0gICAgfQotCi0gICAgLyogaWYgbm8gbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBpZiAoIHlwaXhlbHMgPT0gMCAmJiBuZXdfcGl0Y2ggPD0gcGl0Y2ggKQotICAgIHsKLSAgICAgIC8qIHplcm8gdGhlIHBhZGRpbmcgKi8KLSAgICAgIEZUX0ludCAgYml0X3dpZHRoID0gcGl0Y2ggKiA4OwotICAgICAgRlRfSW50ICBiaXRfbGFzdCAgPSAoIHdpZHRoICsgeHBpeGVscyApICogYnBwOwotCi0KLSAgICAgIGlmICggYml0X2xhc3QgPCBiaXRfd2lkdGggKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgbGluZSAgPSBiaXRtYXAtPmJ1ZmZlciArICggYml0X2xhc3QgPj4gMyApOwotICAgICAgICBGVF9CeXRlKiAgZW5kICAgPSBiaXRtYXAtPmJ1ZmZlciArIHBpdGNoOwotICAgICAgICBGVF9JbnQgICAgc2hpZnQgPSBiaXRfbGFzdCAmIDc7Ci0gICAgICAgIEZUX1VJbnQgICBtYXNrICA9IDB4RkYwMFUgPj4gc2hpZnQ7Ci0gICAgICAgIEZUX0ludCAgICBjb3VudCA9IGhlaWdodDsKLQotCi0gICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBsaW5lICs9IHBpdGNoLCBlbmQgKz0gcGl0Y2ggKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIHdyaXRlID0gbGluZTsKLQotCi0gICAgICAgICAgaWYgKCBzaGlmdCA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlWzBdID0gKEZUX0J5dGUpKCB3cml0ZVswXSAmIG1hc2sgKTsKLSAgICAgICAgICAgIHdyaXRlKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICggd3JpdGUgPCBlbmQgKQotICAgICAgICAgICAgRlRfTUVNX1pFUk8oIHdyaXRlLCBlbmQtd3JpdGUgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIGlmICggRlRfUUFMTE9DX01VTFQoIGJ1ZmZlciwgbmV3X3BpdGNoLCBiaXRtYXAtPnJvd3MgKyB5cGl4ZWxzICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgaWYgKCBiaXRtYXAtPnBpdGNoID4gMCApCi0gICAgewotICAgICAgRlRfSW50ICBsZW4gPSAoIHdpZHRoICogYnBwICsgNyApID4+IDM7Ci0KLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBiaXRtYXAtPnJvd3M7IGkrKyApCi0gICAgICAgIEZUX01FTV9DT1BZKCBidWZmZXIgKyBuZXdfcGl0Y2ggKiAoIHlwaXhlbHMgKyBpICksCi0gICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPmJ1ZmZlciArIHBpdGNoICogaSwgbGVuICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9JbnQgIGxlbiA9ICggd2lkdGggKiBicHAgKyA3ICkgPj4gMzsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IGJpdG1hcC0+cm93czsgaSsrICkKLSAgICAgICAgRlRfTUVNX0NPUFkoIGJ1ZmZlciArIG5ld19waXRjaCAqIGksCi0gICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPmJ1ZmZlciArIHBpdGNoICogaSwgbGVuICk7Ci0gICAgfQotCi0gICAgRlRfRlJFRSggYml0bWFwLT5idWZmZXIgKTsKLSAgICBiaXRtYXAtPmJ1ZmZlciA9IGJ1ZmZlcjsKLQotICAgIGlmICggYml0bWFwLT5waXRjaCA8IDAgKQotICAgICAgbmV3X3BpdGNoID0gLW5ld19waXRjaDsKLQotICAgIC8qIHNldCBwaXRjaCBvbmx5LCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBsZWZ0IHVudG91Y2hlZCAqLwotICAgIGJpdG1hcC0+cGl0Y2ggPSBuZXdfcGl0Y2g7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Yml0bWFwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0JpdG1hcF9FbWJvbGRlbiggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAqICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeFN0cmVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHlTdHJlbmd0aCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgdW5zaWduZWQgY2hhciogIHA7Ci0gICAgRlRfSW50ICAgICAgICAgIGksIHgsIHksIHBpdGNoOwotICAgIEZUX0ludCAgICAgICAgICB4c3RyLCB5c3RyOwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZTsKLQotICAgIGlmICggIWJpdG1hcCB8fCAhYml0bWFwLT5idWZmZXIgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgeHN0ciA9IEZUX1BJWF9ST1VORCggeFN0cmVuZ3RoICkgPj4gNjsKLSAgICB5c3RyID0gRlRfUElYX1JPVU5EKCB5U3RyZW5ndGggKSA+PiA2OwotCi0gICAgaWYgKCB4c3RyID09IDAgJiYgeXN0ciA9PSAwICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgZWxzZSBpZiAoIHhzdHIgPCAwIHx8IHlzdHIgPCAwICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIHN3aXRjaCAoIGJpdG1hcC0+cGl4ZWxfbW9kZSApCi0gICAgewotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZMjoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTQ6Ci0gICAgICB7Ci0gICAgICAgIEZUX0JpdG1hcCAgdG1wOwotICAgICAgICBGVF9JbnQgICAgIGFsaWduOwotCi0KLSAgICAgICAgaWYgKCBiaXRtYXAtPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9HUkFZMiApCi0gICAgICAgICAgYWxpZ24gPSAoIGJpdG1hcC0+d2lkdGggKyB4c3RyICsgMyApIC8gNDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGFsaWduID0gKCBiaXRtYXAtPndpZHRoICsgeHN0ciArIDEgKSAvIDI7Ci0KLSAgICAgICAgRlRfQml0bWFwX05ldyggJnRtcCApOwotCi0gICAgICAgIGVycm9yID0gRlRfQml0bWFwX0NvbnZlcnQoIGxpYnJhcnksIGJpdG1hcCwgJnRtcCwgYWxpZ24gKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgIEZUX0JpdG1hcF9Eb25lKCBsaWJyYXJ5LCBiaXRtYXAgKTsKLSAgICAgICAgKmJpdG1hcCA9IHRtcDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX01PTk86Ci0gICAgICBpZiAoIHhzdHIgPiA4ICkKLSAgICAgICAgeHN0ciA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9MQ0Q6Ci0gICAgICB4c3RyICo9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9MQ0RfVjoKLSAgICAgIHlzdHIgKj0gMzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGVycm9yID0gZnRfYml0bWFwX2Fzc3VyZV9idWZmZXIoIGxpYnJhcnktPm1lbW9yeSwgYml0bWFwLCB4c3RyLCB5c3RyICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBwaXRjaCA9IGJpdG1hcC0+cGl0Y2g7Ci0gICAgaWYgKCBwaXRjaCA+IDAgKQotICAgICAgcCA9IGJpdG1hcC0+YnVmZmVyICsgcGl0Y2ggKiB5c3RyOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwaXRjaCA9IC1waXRjaDsKLSAgICAgIHAgPSBiaXRtYXAtPmJ1ZmZlciArIHBpdGNoICogKCBiaXRtYXAtPnJvd3MgLSAxICk7Ci0gICAgfQotCi0gICAgLyogZm9yIGVhY2ggcm93ICovCi0gICAgZm9yICggeSA9IDA7IHkgPCBiaXRtYXAtPnJvd3MgOyB5KysgKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBIb3Jpem9udGFsbHk6Ci0gICAgICAgKgotICAgICAgICogRnJvbSB0aGUgbGFzdCBwaXhlbCBvbiwgbWFrZSBlYWNoIHBpeGVsIG9yJ2VkIHdpdGggdGhlCi0gICAgICAgKiBgeHN0cicgcGl4ZWxzIGJlZm9yZSBpdC4KLSAgICAgICAqLwotICAgICAgZm9yICggeCA9IHBpdGNoIC0gMTsgeCA+PSAwOyB4LS0gKQotICAgICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyIHRtcDsKLQotCi0gICAgICAgIHRtcCA9IHBbeF07Ci0gICAgICAgIGZvciAoIGkgPSAxOyBpIDw9IHhzdHI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGJpdG1hcC0+cGl4ZWxfbW9kZSA9PSBGVF9QSVhFTF9NT0RFX01PTk8gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBbeF0gfD0gdG1wID4+IGk7Ci0KLSAgICAgICAgICAgIC8qIHRoZSBtYXhpbXVtIHZhbHVlIG9mIDggZm9yIGB4c3RyJyBjb21lcyBmcm9tIGhlcmUgKi8KLSAgICAgICAgICAgIGlmICggeCA+IDAgKQotICAgICAgICAgICAgICBwW3hdIHw9IHBbeCAtIDFdIDw8ICggOCAtIGkgKTsKLQotI2lmIDAKLSAgICAgICAgICAgIGlmICggcFt4XSA9PSAweGZmICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggeCAtIGkgPj0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggcFt4XSArIHBbeCAtIGldID4gYml0bWFwLT5udW1fZ3JheXMgLSAxICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBbeF0gPSAodW5zaWduZWQgY2hhcikoYml0bWFwLT5udW1fZ3JheXMgLSAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwW3hdID0gKHVuc2lnbmVkIGNoYXIpKHBbeF0gKyBwW3gtaV0pOwotICAgICAgICAgICAgICAgIGlmICggcFt4XSA9PSBiaXRtYXAtPm51bV9ncmF5cyAtIDEgKQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBWZXJ0aWNhbGx5OgotICAgICAgICoKLSAgICAgICAqIE1ha2UgdGhlIGFib3ZlIGB5c3RyJyByb3dzIG9yJ2VkIHdpdGggaXQuCi0gICAgICAgKi8KLSAgICAgIGZvciAoIHggPSAxOyB4IDw9IHlzdHI7IHgrKyApCi0gICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIqICBxOwotCi0KLSAgICAgICAgcSA9IHAgLSBiaXRtYXAtPnBpdGNoICogeDsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwaXRjaDsgaSsrICkKLSAgICAgICAgICBxW2ldIHw9IHBbaV07Ci0gICAgICB9Ci0KLSAgICAgIHAgKz0gYml0bWFwLT5waXRjaDsKLSAgICB9Ci0KLSAgICBiaXRtYXAtPndpZHRoICs9IHhzdHI7Ci0gICAgYml0bWFwLT5yb3dzICs9IHlzdHI7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Yml0bWFwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0JpdG1hcF9Db252ZXJ0KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQml0bWFwICAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAgICAgICAqdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgICAgYWxpZ25tZW50ICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0xpYnJhcnlfSGFuZGxlOwotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgc3dpdGNoICggc291cmNlLT5waXhlbF9tb2RlICkKLSAgICB7Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX01PTk86Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVk6Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVkyOgotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZNDoKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICAgcGFkOwotICAgICAgICBGVF9Mb25nICBvbGRfc2l6ZTsKLQotCi0gICAgICAgIG9sZF9zaXplID0gdGFyZ2V0LT5yb3dzICogdGFyZ2V0LT5waXRjaDsKLSAgICAgICAgaWYgKCBvbGRfc2l6ZSA8IDAgKQotICAgICAgICAgIG9sZF9zaXplID0gLW9sZF9zaXplOwotCi0gICAgICAgIHRhcmdldC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTsKLSAgICAgICAgdGFyZ2V0LT5yb3dzICAgICAgID0gc291cmNlLT5yb3dzOwotICAgICAgICB0YXJnZXQtPndpZHRoICAgICAgPSBzb3VyY2UtPndpZHRoOwotCi0gICAgICAgIHBhZCA9IDA7Ci0gICAgICAgIGlmICggYWxpZ25tZW50ID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBwYWQgPSBzb3VyY2UtPndpZHRoICUgYWxpZ25tZW50OwotICAgICAgICAgIGlmICggcGFkICE9IDAgKQotICAgICAgICAgICAgcGFkID0gYWxpZ25tZW50IC0gcGFkOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFyZ2V0LT5waXRjaCA9IHNvdXJjZS0+d2lkdGggKyBwYWQ7Ci0KLSAgICAgICAgaWYgKCB0YXJnZXQtPnJvd3MgKiB0YXJnZXQtPnBpdGNoID4gb2xkX3NpemUgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBGVF9RUkVBTExPQyggdGFyZ2V0LT5idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9zaXplLCB0YXJnZXQtPnJvd3MgKiB0YXJnZXQtPnBpdGNoICkgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgfQotCi0gICAgc3dpdGNoICggc291cmNlLT5waXhlbF9tb2RlICkKLSAgICB7Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX01PTk86Ci0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBzID0gc291cmNlLT5idWZmZXI7Ci0gICAgICAgIEZUX0J5dGUqICB0ID0gdGFyZ2V0LT5idWZmZXI7Ci0gICAgICAgIEZUX0ludCAgICBpOwotCi0KLSAgICAgICAgdGFyZ2V0LT5udW1fZ3JheXMgPSAyOwotCi0gICAgICAgIGZvciAoIGkgPSBzb3VyY2UtPnJvd3M7IGkgPiAwOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIHNzID0gczsKLSAgICAgICAgICBGVF9CeXRlKiAgdHQgPSB0OwotICAgICAgICAgIEZUX0ludCAgICBqOwotCi0KLSAgICAgICAgICAvKiBnZXQgdGhlIGZ1bGwgYnl0ZXMgKi8KLSAgICAgICAgICBmb3IgKCBqID0gc291cmNlLT53aWR0aCA+PiAzOyBqID4gMDsgai0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIHZhbCA9IHNzWzBdOyAvKiBhdm9pZCBhIGJ5dGUtPmludCBjYXN0IG9uIGVhY2ggbGluZSAqLwotCi0KLSAgICAgICAgICAgIHR0WzBdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4ODAgKSA+PiA3ICk7Ci0gICAgICAgICAgICB0dFsxXSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDQwICkgPj4gNiApOwotICAgICAgICAgICAgdHRbMl0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgyMCApID4+IDUgKTsKLSAgICAgICAgICAgIHR0WzNdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MTAgKSA+PiA0ICk7Ci0gICAgICAgICAgICB0dFs0XSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDA4ICkgPj4gMyApOwotICAgICAgICAgICAgdHRbNV0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgwNCApID4+IDIgKTsKLSAgICAgICAgICAgIHR0WzZdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MDIgKSA+PiAxICk7Ci0gICAgICAgICAgICB0dFs3XSA9IChGVF9CeXRlKSggICB2YWwgJiAweDAxICk7Ci0KLSAgICAgICAgICAgIHR0ICs9IDg7Ci0gICAgICAgICAgICBzcyArPSAxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGdldCByZW1haW5pbmcgcGl4ZWxzIChpZiBhbnkpICovCi0gICAgICAgICAgaiA9IHNvdXJjZS0+d2lkdGggJiA3OwotICAgICAgICAgIGlmICggaiA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgdmFsID0gKnNzOwotCi0KLSAgICAgICAgICAgIGZvciAoIDsgaiA+IDA7IGotLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHR0WzBdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4ODAgKSA+PiA3KTsKLSAgICAgICAgICAgICAgdmFsIDw8PSAxOwotICAgICAgICAgICAgICB0dCAgICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcyArPSBzb3VyY2UtPnBpdGNoOwotICAgICAgICAgIHQgKz0gdGFyZ2V0LT5waXRjaDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZOgotICAgICAgewotICAgICAgICBGVF9JbnQgICAgd2lkdGggICA9IHNvdXJjZS0+d2lkdGg7Ci0gICAgICAgIEZUX0J5dGUqICBzICAgICAgID0gc291cmNlLT5idWZmZXI7Ci0gICAgICAgIEZUX0J5dGUqICB0ICAgICAgID0gdGFyZ2V0LT5idWZmZXI7Ci0gICAgICAgIEZUX0ludCAgICBzX3BpdGNoID0gc291cmNlLT5waXRjaDsKLSAgICAgICAgRlRfSW50ICAgIHRfcGl0Y2ggPSB0YXJnZXQtPnBpdGNoOwotICAgICAgICBGVF9JbnQgICAgaTsKLQotCi0gICAgICAgIHRhcmdldC0+bnVtX2dyYXlzID0gMjU2OwotCi0gICAgICAgIGZvciAoIGkgPSBzb3VyY2UtPnJvd3M7IGkgPiAwOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQVJSQVlfQ09QWSggdCwgcywgd2lkdGggKTsKLQotICAgICAgICAgIHMgKz0gc19waXRjaDsKLSAgICAgICAgICB0ICs9IHRfcGl0Y2g7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTI6Ci0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBzID0gc291cmNlLT5idWZmZXI7Ci0gICAgICAgIEZUX0J5dGUqICB0ID0gdGFyZ2V0LT5idWZmZXI7Ci0gICAgICAgIEZUX0ludCAgICBpOwotCi0KLSAgICAgICAgdGFyZ2V0LT5udW1fZ3JheXMgPSA0OwotCi0gICAgICAgIGZvciAoIGkgPSBzb3VyY2UtPnJvd3M7IGkgPiAwOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIHNzID0gczsKLSAgICAgICAgICBGVF9CeXRlKiAgdHQgPSB0OwotICAgICAgICAgIEZUX0ludCAgICBqOwotCi0KLSAgICAgICAgICAvKiBnZXQgdGhlIGZ1bGwgYnl0ZXMgKi8KLSAgICAgICAgICBmb3IgKCBqID0gc291cmNlLT53aWR0aCA+PiAyOyBqID4gMDsgai0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIHZhbCA9IHNzWzBdOwotCi0KLSAgICAgICAgICAgIHR0WzBdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4QzAgKSA+PiA2ICk7Ci0gICAgICAgICAgICB0dFsxXSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDMwICkgPj4gNCApOwotICAgICAgICAgICAgdHRbMl0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgwQyApID4+IDIgKTsKLSAgICAgICAgICAgIHR0WzNdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MDMgKSApOwotCi0gICAgICAgICAgICBzcyArPSAxOwotICAgICAgICAgICAgdHQgKz0gNDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBqID0gc291cmNlLT53aWR0aCAmIDM7Ci0gICAgICAgICAgaWYgKCBqID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICB2YWwgPSBzc1swXTsKLQotCi0gICAgICAgICAgICBmb3IgKCA7IGogPiAwOyBqLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0dFswXSAgPSAoRlRfQnl0ZSkoICggdmFsICYgMHhDMCApID4+IDYgKTsKLSAgICAgICAgICAgICAgdmFsICA8PD0gMjsKLSAgICAgICAgICAgICAgdHQgICAgKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzICs9IHNvdXJjZS0+cGl0Y2g7Ci0gICAgICAgICAgdCArPSB0YXJnZXQtPnBpdGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVk0OgotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgcyA9IHNvdXJjZS0+YnVmZmVyOwotICAgICAgICBGVF9CeXRlKiAgdCA9IHRhcmdldC0+YnVmZmVyOwotICAgICAgICBGVF9JbnQgICAgaTsKLQotCi0gICAgICAgIHRhcmdldC0+bnVtX2dyYXlzID0gMTY7Ci0KLSAgICAgICAgZm9yICggaSA9IHNvdXJjZS0+cm93czsgaSA+IDA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgc3MgPSBzOwotICAgICAgICAgIEZUX0J5dGUqICB0dCA9IHQ7Ci0gICAgICAgICAgRlRfSW50ICAgIGo7Ci0KLQotICAgICAgICAgIC8qIGdldCB0aGUgZnVsbCBieXRlcyAqLwotICAgICAgICAgIGZvciAoIGogPSBzb3VyY2UtPndpZHRoID4+IDE7IGogPiAwOyBqLS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgdmFsID0gc3NbMF07Ci0KLQotICAgICAgICAgICAgdHRbMF0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHhGMCApID4+IDQgKTsKLSAgICAgICAgICAgIHR0WzFdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MEYgKSApOwotCi0gICAgICAgICAgICBzcyArPSAxOwotICAgICAgICAgICAgdHQgKz0gMjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIHNvdXJjZS0+d2lkdGggJiAxICkKLSAgICAgICAgICAgIHR0WzBdID0gKEZUX0J5dGUpKCAoIHNzWzBdICYgMHhGMCApID4+IDQgKTsKLQotICAgICAgICAgIHMgKz0gc291cmNlLT5waXRjaDsKLSAgICAgICAgICB0ICs9IHRhcmdldC0+cGl0Y2g7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBkZWZhdWx0OgotICAgICAgOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJpdG1hcC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfRG9uZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgKmJpdG1hcCApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfTGlicmFyeV9IYW5kbGU7Ci0KLSAgICBpZiAoICFiaXRtYXAgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgRlRfRlJFRSggYml0bWFwLT5idWZmZXIgKTsKLSAgICAqYml0bWFwID0gbnVsbF9iaXRtYXA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGNhbGMuYyBiL3NyYy9iYXNlL2Z0Y2FsYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTkzYzMyLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0Y2FsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2FsYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBcml0aG1ldGljIGNvbXB1dGF0aW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA4IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdXBwb3J0IGZvciAxLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBoYXMgYmVlbiB0b3RhbGx5IGRyb3BwZWQgaW4gdGhpcyAgKi8KLSAgLyogcmVsZWFzZS4gIFlvdSBjYW4gc3RpbGwgd3JpdGUgeW91ciBvd24gY29kZSBpZiB5b3UgbmVlZCBpdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEltcGxlbWVudGluZyBiYXNpYyBjb21wdXRhdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfTXVsRGl2KCksIEZUX011bEZpeCgpLCBGVF9EaXZGaXgoKSwgRlRfUm91bmRGaXgoKSwgRlRfQ2VpbEZpeCgpLCAgICovCi0gIC8qIGFuZCBGVF9GbG9vckZpeCgpIGFyZSBkZWNsYXJlZCBpbiBmcmVldHlwZS5oLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0jaWZkZWYgIEZUX01VTEZJWF9JTkxJTkVECi0jdW5kZWYgIEZUX011bEZpeAotI2VuZGlmCi0KLS8qIHdlIG5lZWQgdG8gZGVmaW5lIGEgNjQtYml0cyBkYXRhIHR5cGUgaGVyZSAqLwotCi0jaWZkZWYgRlRfTE9ORzY0Ci0KLSAgdHlwZWRlZiBGVF9JTlQ2NCAgRlRfSW50NjQ7Ci0KLSNlbHNlCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ludDY0XwotICB7Ci0gICAgRlRfVUludDMyICBsbzsKLSAgICBGVF9VSW50MzIgIGhpOwotCi0gIH0gRlRfSW50NjQ7Ci0KLSNlbmRpZiAvKiBGVF9MT05HNjQgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NhbGMKLQotCi0gIC8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyICovCi0gIC8qIEZUX0xPTkc2NCBpcyBkZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQotICBGVF9Sb3VuZEZpeCggRlRfRml4ZWQgIGEgKQotICB7Ci0gICAgcmV0dXJuICggYSA+PSAwICkgPyAgICggYSArIDB4ODAwMEwgKSAmIH4weEZGRkZMCi0gICAgICAgICAgICAgICAgICAgICAgOiAtKCgtYSArIDB4ODAwMEwgKSAmIH4weEZGRkZMICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfQ2VpbEZpeCggRlRfRml4ZWQgIGEgKQotICB7Ci0gICAgcmV0dXJuICggYSA+PSAwICkgPyAgICggYSArIDB4RkZGRkwgKSAmIH4weEZGRkZMCi0gICAgICAgICAgICAgICAgICAgICAgOiAtKCgtYSArIDB4RkZGRkwgKSAmIH4weEZGRkZMICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfRmxvb3JGaXgoIEZUX0ZpeGVkICBhICkKLSAgewotICAgIHJldHVybiAoIGEgPj0gMCApID8gICBhICYgfjB4RkZGRkwKLSAgICAgICAgICAgICAgICAgICAgICA6IC0oKC1hKSAmIH4weEZGRkZMICk7Ci0gIH0KLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ludDMyICkKLSAgRlRfU3FydDMyKCBGVF9JbnQzMiAgeCApCi0gIHsKLSAgICBGVF9VTG9uZyAgdmFsLCByb290LCBuZXdyb290LCBtYXNrOwotCi0KLSAgICByb290ID0gMDsKLSAgICBtYXNrID0gMHg0MDAwMDAwMEw7Ci0gICAgdmFsICA9IChGVF9VTG9uZyl4OwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBuZXdyb290ID0gcm9vdCArIG1hc2s7Ci0gICAgICBpZiAoIG5ld3Jvb3QgPD0gdmFsICkKLSAgICAgIHsKLSAgICAgICAgdmFsIC09IG5ld3Jvb3Q7Ci0gICAgICAgIHJvb3QgPSBuZXdyb290ICsgbWFzazsKLSAgICAgIH0KLQotICAgICAgcm9vdCA+Pj0gMTsKLSAgICAgIG1hc2sgPj49IDI7Ci0KLSAgICB9IHdoaWxlICggbWFzayAhPSAwICk7Ci0KLSAgICByZXR1cm4gcm9vdDsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTICovCi0KLQotI2lmZGVmIEZUX0xPTkc2NAotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfTG9uZyApCi0gIEZUX011bERpdiggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgIEZUX0xvbmcgIGMgKQotICB7Ci0gICAgRlRfSW50ICAgczsKLSAgICBGVF9Mb25nICBkOwotCi0KLSAgICBzID0gMTsKLSAgICBpZiAoIGEgPCAwICkgeyBhID0gLWE7IHMgPSAtMTsgfQotICAgIGlmICggYiA8IDAgKSB7IGIgPSAtYjsgcyA9IC1zOyB9Ci0gICAgaWYgKCBjIDwgMCApIHsgYyA9IC1jOyBzID0gLXM7IH0KLQotICAgIGQgPSAoRlRfTG9uZykoIGMgPiAwID8gKCAoRlRfSW50NjQpYSAqIGIgKyAoIGMgPj4gMSApICkgLyBjCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiAweDdGRkZGRkZGTCApOwotCi0gICAgcmV0dXJuICggcyA+IDAgKSA/IGQgOiAtZDsKLSAgfQotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0xvbmcgKQotICBGVF9NdWxEaXZfTm9fUm91bmQoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBjICkKLSAgewotICAgIEZUX0ludCAgIHM7Ci0gICAgRlRfTG9uZyAgZDsKLQotCi0gICAgcyA9IDE7Ci0gICAgaWYgKCBhIDwgMCApIHsgYSA9IC1hOyBzID0gLTE7IH0KLSAgICBpZiAoIGIgPCAwICkgeyBiID0gLWI7IHMgPSAtczsgfQotICAgIGlmICggYyA8IDAgKSB7IGMgPSAtYzsgcyA9IC1zOyB9Ci0KLSAgICBkID0gKEZUX0xvbmcpKCBjID4gMCA/IChGVF9JbnQ2NClhICogYiAvIGMKLSAgICAgICAgICAgICAgICAgICAgICAgICA6IDB4N0ZGRkZGRkZMICk7Ci0KLSAgICByZXR1cm4gKCBzID4gMCApID8gZCA6IC1kOwotICB9Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9NdWxGaXgoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiApCi0gIHsKLSNpZmRlZiBGVF9NVUxGSVhfQVNTRU1CTEVSCi0gICAgcmV0dXJuIEZUX01VTEZJWF9BU1NFTUJMRVIoYSxiKTsKLSNlbHNlCi0gICAgRlRfSW50ICAgcyA9IDE7Ci0gICAgRlRfTG9uZyAgYzsKLQotCi0gICAgaWYgKCBhIDwgMCApIHsgYSA9IC1hOyBzID0gLTE7IH0KLSAgICBpZiAoIGIgPCAwICkgeyBiID0gLWI7IHMgPSAtczsgfQotCi0gICAgYyA9IChGVF9Mb25nKSggKCAoRlRfSW50NjQpYSAqIGIgKyAweDgwMDBMICkgPj4gMTYgKTsKLSAgICByZXR1cm4gKCBzID4gMCApID8gYyA6IC1jIDsKLSNlbmRpZgotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfRGl2Rml4KCBGVF9Mb25nICBhLAotICAgICAgICAgICAgIEZUX0xvbmcgIGIgKQotICB7Ci0gICAgRlRfSW50MzIgICBzOwotICAgIEZUX1VJbnQzMiAgcTsKLQotICAgIHMgPSAxOwotICAgIGlmICggYSA8IDAgKSB7IGEgPSAtYTsgcyA9IC0xOyB9Ci0gICAgaWYgKCBiIDwgMCApIHsgYiA9IC1iOyBzID0gLXM7IH0KLQotICAgIGlmICggYiA9PSAwICkKLSAgICAgIC8qIGNoZWNrIGZvciBkaXZpc2lvbiBieSAwICovCi0gICAgICBxID0gMHg3RkZGRkZGRkw7Ci0gICAgZWxzZQotICAgICAgLyogY29tcHV0ZSByZXN1bHQgZGlyZWN0bHkgKi8KLSAgICAgIHEgPSAoRlRfVUludDMyKSggKCAoIChGVF9JbnQ2NClhIDw8IDE2ICkgKyAoIGIgPj4gMSApICkgLyBiICk7Ci0KLSAgICByZXR1cm4gKCBzIDwgMCA/IC0oRlRfTG9uZylxIDogKEZUX0xvbmcpcSApOwotICB9Ci0KLQotI2Vsc2UgLyogIUZUX0xPTkc2NCAqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbXVsdG82NCggRlRfVUludDMyICB4LAotICAgICAgICAgICAgICBGVF9VSW50MzIgIHksCi0gICAgICAgICAgICAgIEZUX0ludDY0ICAqeiApCi0gIHsKLSAgICBGVF9VSW50MzIgIGxvMSwgaGkxLCBsbzIsIGhpMiwgbG8sIGhpLCBpMSwgaTI7Ci0KLQotICAgIGxvMSA9IHggJiAweDAwMDBGRkZGVTsgIGhpMSA9IHggPj4gMTY7Ci0gICAgbG8yID0geSAmIDB4MDAwMEZGRkZVOyAgaGkyID0geSA+PiAxNjsKLQotICAgIGxvID0gbG8xICogbG8yOwotICAgIGkxID0gbG8xICogaGkyOwotICAgIGkyID0gbG8yICogaGkxOwotICAgIGhpID0gaGkxICogaGkyOwotCi0gICAgLyogQ2hlY2sgY2Fycnkgb3ZlcmZsb3cgb2YgaTEgKyBpMiAqLwotICAgIGkxICs9IGkyOwotICAgIGhpICs9IChGVF9VSW50MzIpKCBpMSA8IGkyICkgPDwgMTY7Ci0KLSAgICBoaSArPSBpMSA+PiAxNjsKLSAgICBpMSAgPSBpMSA8PCAxNjsKLQotICAgIC8qIENoZWNrIGNhcnJ5IG92ZXJmbG93IG9mIGkxICsgbG8gKi8KLSAgICBsbyArPSBpMTsKLSAgICBoaSArPSAoIGxvIDwgaTEgKTsKLQotICAgIHotPmxvID0gbG87Ci0gICAgei0+aGkgPSBoaTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQzMgotICBmdF9kaXY2NGJ5MzIoIEZUX1VJbnQzMiAgaGksCi0gICAgICAgICAgICAgICAgRlRfVUludDMyICBsbywKLSAgICAgICAgICAgICAgICBGVF9VSW50MzIgIHkgKQotICB7Ci0gICAgRlRfVUludDMyICByLCBxOwotICAgIEZUX0ludCAgICAgaTsKLQotCi0gICAgcSA9IDA7Ci0gICAgciA9IGhpOwotCi0gICAgaWYgKCByID49IHkgKQotICAgICAgcmV0dXJuIChGVF9VSW50MzIpMHg3RkZGRkZGRkw7Ci0KLSAgICBpID0gMzI7Ci0gICAgZG8KLSAgICB7Ci0gICAgICByIDw8PSAxOwotICAgICAgcSA8PD0gMTsKLSAgICAgIHIgIHw9IGxvID4+IDMxOwotCi0gICAgICBpZiAoIHIgPj0gKEZUX1VJbnQzMil5ICkKLSAgICAgIHsKLSAgICAgICAgciAtPSB5OwotICAgICAgICBxIHw9IDE7Ci0gICAgICB9Ci0gICAgICBsbyA8PD0gMTsKLSAgICB9IHdoaWxlICggLS1pICk7Ci0KLSAgICByZXR1cm4gcTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgRlRfQWRkNjQoIEZUX0ludDY0KiAgeCwKLSAgICAgICAgICAgIEZUX0ludDY0KiAgeSwKLSAgICAgICAgICAgIEZUX0ludDY0ICAqeiApCi0gIHsKLSAgICByZWdpc3RlciBGVF9VSW50MzIgIGxvLCBoaTsKLQotCi0gICAgbG8gPSB4LT5sbyArIHktPmxvOwotICAgIGhpID0geC0+aGkgKyB5LT5oaSArICggbG8gPCB4LT5sbyApOwotCi0gICAgei0+bG8gPSBsbzsKLSAgICB6LT5oaSA9IGhpOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICAvKiBUaGUgRlRfTXVsRGl2IGZ1bmN0aW9uIGhhcyBiZWVuIG9wdGltaXplZCB0aGFua3MgdG8gaWRlYXMgZnJvbSAgICAgICovCi0gIC8qIEdyYWhhbSBBc2hlci4gIFRoZSB0cmljayBpcyB0byBvcHRpbWl6ZSBjb21wdXRhdGlvbiB3aGVuIGV2ZXJ5dGhpbmcgKi8KLSAgLyogZml0cyB3aXRoaW4gMzItYml0cyAoYSByYXRoZXIgY29tbW9uIGNhc2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICB3ZSBjb21wdXRlICdhKmIrYy8yJywgdGhlbiBkaXZpZGUgaXQgYnkgJ2MnLiAocG9zaXRpdmUgdmFsdWVzKSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgNDYzNDAgaXMgRkxPT1IoU1FSVCgyXjMxLTEpKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIGlmICggYSA8PSA0NjM0MCAmJiBiIDw9IDQ2MzQwICkgdGhlbiAoIGEqYiA8PSAweDdGRkVBODEwICkgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAweDdGRkZGRkZGIC0gMHg3RkZFQTgxMCA9IDB4MTU3RjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgaWYgKCBjIDwgMHgxNTdGMCoyICkgdGhlbiAoIGEqYitjLzIgPD0gMHg3RkZGRkZGRiApICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIGFuZCAyKjB4MTU3RjAgPSAxNzYwOTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfTG9uZyApCi0gIEZUX011bERpdiggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgIEZUX0xvbmcgIGMgKQotICB7Ci0gICAgbG9uZyAgczsKLQotCi0gICAgaWYgKCBhID09IDAgfHwgYiA9PSBjICkKLSAgICAgIHJldHVybiBhOwotCi0gICAgcyAgPSBhOyBhID0gRlRfQUJTKCBhICk7Ci0gICAgcyBePSBiOyBiID0gRlRfQUJTKCBiICk7Ci0gICAgcyBePSBjOyBjID0gRlRfQUJTKCBjICk7Ci0KLSAgICBpZiAoIGEgPD0gNDYzNDBMICYmIGIgPD0gNDYzNDBMICYmIGMgPD0gMTc2MDk1TCAmJiBjID4gMCApCi0gICAgICBhID0gKCBhICogYiArICggYyA+PiAxICkgKSAvIGM7Ci0KLSAgICBlbHNlIGlmICggYyA+IDAgKQotICAgIHsKLSAgICAgIEZUX0ludDY0ICB0ZW1wLCB0ZW1wMjsKLQotCi0gICAgICBmdF9tdWx0bzY0KCBhLCBiLCAmdGVtcCApOwotCi0gICAgICB0ZW1wMi5oaSA9IDA7Ci0gICAgICB0ZW1wMi5sbyA9IChGVF9VSW50MzIpKGMgPj4gMSk7Ci0gICAgICBGVF9BZGQ2NCggJnRlbXAsICZ0ZW1wMiwgJnRlbXAgKTsKLSAgICAgIGEgPSBmdF9kaXY2NGJ5MzIoIHRlbXAuaGksIHRlbXAubG8sIGMgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYSA9IDB4N0ZGRkZGRkZMOwotCi0gICAgcmV0dXJuICggcyA8IDAgPyAtYSA6IGEgKTsKLSAgfQotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICBGVF9CQVNFX0RFRiggRlRfTG9uZyApCi0gIEZUX011bERpdl9Ob19Sb3VuZCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGMgKQotICB7Ci0gICAgbG9uZyAgczsKLQotCi0gICAgaWYgKCBhID09IDAgfHwgYiA9PSBjICkKLSAgICAgIHJldHVybiBhOwotCi0gICAgcyAgPSBhOyBhID0gRlRfQUJTKCBhICk7Ci0gICAgcyBePSBiOyBiID0gRlRfQUJTKCBiICk7Ci0gICAgcyBePSBjOyBjID0gRlRfQUJTKCBjICk7Ci0KLSAgICBpZiAoIGEgPD0gNDYzNDBMICYmIGIgPD0gNDYzNDBMICYmIGMgPiAwICkKLSAgICAgIGEgPSBhICogYiAvIGM7Ci0KLSAgICBlbHNlIGlmICggYyA+IDAgKQotICAgIHsKLSAgICAgIEZUX0ludDY0ICB0ZW1wOwotCi0KLSAgICAgIGZ0X211bHRvNjQoIGEsIGIsICZ0ZW1wICk7Ci0gICAgICBhID0gZnRfZGl2NjRieTMyKCB0ZW1wLmhpLCB0ZW1wLmxvLCBjICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGEgPSAweDdGRkZGRkZGTDsKLQotICAgIHJldHVybiAoIHMgPCAwID8gLWEgOiBhICk7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfTG9uZyApCi0gIEZUX011bEZpeCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiICkKLSAgewotI2lmZGVmIEZUX01VTEZJWF9BU1NFTUJMRVIKLSAgICByZXR1cm4gRlRfTVVMRklYX0FTU0VNQkxFUihhLGIpOwotI2Vsc2UKLSAgICBGVF9Mb25nICAgc2EsIHNiOwotICAgIEZUX1VMb25nICB1YSwgdWI7Ci0KLQotICAgIGlmICggYSA9PSAwIHx8IGIgPT0gMHgxMDAwMEwgKQotICAgICAgcmV0dXJuIGE7Ci0KLSAgICBzYSA9ICggYSA+PiAoIHNpemVvZiAoIGEgKSAqIDggLSAxICkgKTsKLSAgICBhICA9ICggYSBeIHNhICkgLSBzYTsKLSAgICBzYiA9ICggYiA+PiAoIHNpemVvZiAoIGIgKSAqIDggLSAxICkgKTsKLSAgICBiICA9ICggYiBeIHNiICkgLSBzYjsKLQotICAgIHVhID0gKEZUX1VMb25nKWE7Ci0gICAgdWIgPSAoRlRfVUxvbmcpYjsKLQotICAgIGlmICggdWEgPD0gMjA0OCAmJiB1YiA8PSAxMDQ4NTc2TCApCi0gICAgICB1YSA9ICggdWEgKiB1YiArIDB4ODAwMFUgKSA+PiAxNjsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfVUxvbmcgIGFsID0gdWEgJiAweEZGRkZVOwotCi0KLSAgICAgIHVhID0gKCB1YSA+PiAxNiApICogdWIgKyAgYWwgKiAoIHViID4+IDE2ICkgKwotICAgICAgICAgICAoICggYWwgKiAoIHViICYgMHhGRkZGVSApICsgMHg4MDAwVSApID4+IDE2ICk7Ci0gICAgfQotCi0gICAgc2EgXj0gc2IsCi0gICAgdWEgID0gKEZUX1VMb25nKSgoIHVhIF4gc2EgKSAtIHNhKTsKLQotICAgIHJldHVybiAoRlRfTG9uZyl1YTsKLSNlbmRpZgotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfRGl2Rml4KCBGVF9Mb25nICBhLAotICAgICAgICAgICAgIEZUX0xvbmcgIGIgKQotICB7Ci0gICAgRlRfSW50MzIgICBzOwotICAgIEZUX1VJbnQzMiAgcTsKLQotCi0gICAgcyAgPSBhOyBhID0gRlRfQUJTKGEpOwotICAgIHMgXj0gYjsgYiA9IEZUX0FCUyhiKTsKLQotICAgIGlmICggYiA9PSAwICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayBmb3IgZGl2aXNpb24gYnkgMCAqLwotICAgICAgcSA9IDB4N0ZGRkZGRkZMOwotICAgIH0KLSAgICBlbHNlIGlmICggKCBhID4+IDE2ICkgPT0gMCApCi0gICAgewotICAgICAgLyogY29tcHV0ZSByZXN1bHQgZGlyZWN0bHkgKi8KLSAgICAgIHEgPSAoRlRfVUludDMyKSggKGEgPDwgMTYpICsgKGIgPj4gMSkgKSAvIChGVF9VSW50MzIpYjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHdlIG5lZWQgbW9yZSBiaXRzOyB3ZSBoYXZlIHRvIGRvIGl0IGJ5IGhhbmQgKi8KLSAgICAgIEZUX0ludDY0ICB0ZW1wLCB0ZW1wMjsKLQotICAgICAgdGVtcC5oaSAgPSAoRlRfSW50MzIpIChhID4+IDE2KTsKLSAgICAgIHRlbXAubG8gID0gKEZUX1VJbnQzMikoYSA8PCAxNik7Ci0gICAgICB0ZW1wMi5oaSA9IDA7Ci0gICAgICB0ZW1wMi5sbyA9IChGVF9VSW50MzIpKCBiID4+IDEgKTsKLSAgICAgIEZUX0FkZDY0KCAmdGVtcCwgJnRlbXAyLCAmdGVtcCApOwotICAgICAgcSA9IGZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYiApOwotICAgIH0KLQotICAgIHJldHVybiAoIHMgPCAwID8gLShGVF9JbnQzMilxIDogKEZUX0ludDMyKXEgKTsKLSAgfQotCi0KLSNpZiAwCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9NdWxUbzY0KCBGVF9JbnQzMiAgIHgsCi0gICAgICAgICAgICAgIEZUX0ludDMyICAgeSwKLSAgICAgICAgICAgICAgRlRfSW50NjQgICp6ICkKLSAgewotICAgIEZUX0ludDMyICBzOwotCi0KLSAgICBzICA9IHg7IHggPSBGVF9BQlMoIHggKTsKLSAgICBzIF49IHk7IHkgPSBGVF9BQlMoIHkgKTsKLQotICAgIGZ0X211bHRvNjQoIHgsIHksIHogKTsKLQotICAgIGlmICggcyA8IDAgKQotICAgIHsKLSAgICAgIHotPmxvID0gKEZUX1VJbnQzMiktKEZUX0ludDMyKXotPmxvOwotICAgICAgei0+aGkgPSB+ei0+aGkgKyAhKCB6LT5sbyApOwotICAgIH0KLSAgfQotCi0KLSAgLyogYXBwYXJlbnRseSwgdGhlIHNlY29uZCB2ZXJzaW9uIG9mIHRoaXMgY29kZSBpcyBub3QgY29tcGlsZWQgY29ycmVjdGx5ICovCi0gIC8qIG9uIE1hYyBtYWNoaW5lcyB3aXRoIHRoZSBNUFcgQyBjb21waWxlci4uICB0c2ssIHRzaywgdHNrLi4uICAgICAgICAgICAqLwotCi0jaWYgMQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ludDMyICkKLSAgRlRfRGl2NjRieTMyKCBGVF9JbnQ2NCogIHgsCi0gICAgICAgICAgICAgICAgRlRfSW50MzIgICB5ICkKLSAgewotICAgIEZUX0ludDMyICAgczsKLSAgICBGVF9VSW50MzIgIHEsIHIsIGksIGxvOwotCi0KLSAgICBzICA9IHgtPmhpOwotICAgIGlmICggcyA8IDAgKQotICAgIHsKLSAgICAgIHgtPmxvID0gKEZUX1VJbnQzMiktKEZUX0ludDMyKXgtPmxvOwotICAgICAgeC0+aGkgPSB+eC0+aGkgKyAheC0+bG87Ci0gICAgfQotICAgIHMgXj0geTsgIHkgPSBGVF9BQlMoIHkgKTsKLQotICAgIC8qIFNob3J0Y3V0ICovCi0gICAgaWYgKCB4LT5oaSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIHkgPiAwICkKLSAgICAgICAgcSA9IHgtPmxvIC8geTsKLSAgICAgIGVsc2UKLSAgICAgICAgcSA9IDB4N0ZGRkZGRkZMOwotCi0gICAgICByZXR1cm4gKCBzIDwgMCA/IC0oRlRfSW50MzIpcSA6IChGVF9JbnQzMilxICk7Ci0gICAgfQotCi0gICAgciAgPSB4LT5oaTsKLSAgICBsbyA9IHgtPmxvOwotCi0gICAgaWYgKCByID49IChGVF9VSW50MzIpeSApIC8qIHdlIGtub3cgeSBpcyB0byBiZSB0cmVhdGVkIGFzIHVuc2lnbmVkIGhlcmUgKi8KLSAgICAgIHJldHVybiAoIHMgPCAwID8gMHg4MDAwMDAwMVVMIDogMHg3RkZGRkZGRlVMICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBNYXgvTWluIEludDMyIGlmIGRpdmlzaW9uIG92ZXJmbG93LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGluY2x1ZGVzIGRpdmlzaW9uIGJ5IHplcm8hICAgICAgICAgICAgKi8KLSAgICBxID0gMDsKLSAgICBmb3IgKCBpID0gMDsgaSA8IDMyOyBpKysgKQotICAgIHsKLSAgICAgIHIgPDw9IDE7Ci0gICAgICBxIDw8PSAxOwotICAgICAgciAgfD0gbG8gPj4gMzE7Ci0KLSAgICAgIGlmICggciA+PSAoRlRfVUludDMyKXkgKQotICAgICAgewotICAgICAgICByIC09IHk7Ci0gICAgICAgIHEgfD0gMTsKLSAgICAgIH0KLSAgICAgIGxvIDw8PSAxOwotICAgIH0KLQotICAgIHJldHVybiAoIHMgPCAwID8gLShGVF9JbnQzMilxIDogKEZUX0ludDMyKXEgKTsKLSAgfQotCi0jZWxzZSAvKiAwICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfSW50MzIgKQotICBGVF9EaXY2NGJ5MzIoIEZUX0ludDY0KiAgeCwKLSAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIHkgKQotICB7Ci0gICAgRlRfSW50MzIgICBzOwotICAgIEZUX1VJbnQzMiAgcTsKLQotCi0gICAgcyAgPSB4LT5oaTsKLSAgICBpZiAoIHMgPCAwICkKLSAgICB7Ci0gICAgICB4LT5sbyA9IChGVF9VSW50MzIpLShGVF9JbnQzMil4LT5sbzsKLSAgICAgIHgtPmhpID0gfngtPmhpICsgIXgtPmxvOwotICAgIH0KLSAgICBzIF49IHk7ICB5ID0gRlRfQUJTKCB5ICk7Ci0KLSAgICAvKiBTaG9ydGN1dCAqLwotICAgIGlmICggeC0+aGkgPT0gMCApCi0gICAgewotICAgICAgaWYgKCB5ID4gMCApCi0gICAgICAgIHEgPSAoIHgtPmxvICsgKCB5ID4+IDEgKSApIC8geTsKLSAgICAgIGVsc2UKLSAgICAgICAgcSA9IDB4N0ZGRkZGRkZMOwotCi0gICAgICByZXR1cm4gKCBzIDwgMCA/IC0oRlRfSW50MzIpcSA6IChGVF9JbnQzMilxICk7Ci0gICAgfQotCi0gICAgcSA9IGZ0X2RpdjY0YnkzMiggeC0+aGksIHgtPmxvLCB5ICk7Ci0KLSAgICByZXR1cm4gKCBzIDwgMCA/IC0oRlRfSW50MzIpcSA6IChGVF9JbnQzMilxICk7Ci0gIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotI2VuZGlmIC8qIDAgKi8KLQotCi0jZW5kaWYgLyogRlRfTE9ORzY0ICovCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQoIGNvbnN0IEZUX01hdHJpeCogIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCAgICAgICAgKmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgIHNjYWxpbmcgKQotICB7Ci0gICAgRlRfRml4ZWQgIHh4LCB4eSwgeXgsIHl5OwotCi0gICAgRlRfTG9uZyAgIHZhbCA9IDB4MTAwMDBMICogc2NhbGluZzsKLQotCi0gICAgaWYgKCAhYSB8fCAhYiApCi0gICAgICByZXR1cm47Ci0KLSAgICB4eCA9IEZUX011bERpdiggYS0+eHgsIGItPnh4LCB2YWwgKSArIEZUX011bERpdiggYS0+eHksIGItPnl4LCB2YWwgKTsKLSAgICB4eSA9IEZUX011bERpdiggYS0+eHgsIGItPnh5LCB2YWwgKSArIEZUX011bERpdiggYS0+eHksIGItPnl5LCB2YWwgKTsKLSAgICB5eCA9IEZUX011bERpdiggYS0+eXgsIGItPnh4LCB2YWwgKSArIEZUX011bERpdiggYS0+eXksIGItPnl4LCB2YWwgKTsKLSAgICB5eSA9IEZUX011bERpdiggYS0+eXgsIGItPnh5LCB2YWwgKSArIEZUX011bERpdiggYS0+eXksIGItPnl5LCB2YWwgKTsKLQotICAgIGItPnh4ID0geHg7ICBiLT54eSA9IHh5OwotICAgIGItPnl4ID0geXg7ICBiLT55eSA9IHl5OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9WZWN0b3JfVHJhbnNmb3JtX1NjYWxlZCggRlRfVmVjdG9yKiAgICAgICAgdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgc2NhbGluZyApCi0gIHsKLSAgICBGVF9Qb3MgICB4eiwgeXo7Ci0KLSAgICBGVF9Mb25nICB2YWwgPSAweDEwMDAwTCAqIHNjYWxpbmc7Ci0KLQotICAgIGlmICggIXZlY3RvciB8fCAhbWF0cml4ICkKLSAgICAgIHJldHVybjsKLQotICAgIHh6ID0gRlRfTXVsRGl2KCB2ZWN0b3ItPngsIG1hdHJpeC0+eHgsIHZhbCApICsKLSAgICAgICAgIEZUX011bERpdiggdmVjdG9yLT55LCBtYXRyaXgtPnh5LCB2YWwgKTsKLQotICAgIHl6ID0gRlRfTXVsRGl2KCB2ZWN0b3ItPngsIG1hdHJpeC0+eXgsIHZhbCApICsKLSAgICAgICAgIEZUX011bERpdiggdmVjdG9yLT55LCBtYXRyaXgtPnl5LCB2YWwgKTsKLQotICAgIHZlY3Rvci0+eCA9IHh6OwotICAgIHZlY3Rvci0+eSA9IHl6OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0ludDMyICkKLSAgRlRfU3FydEZpeGVkKCBGVF9JbnQzMiAgeCApCi0gIHsKLSAgICBGVF9VSW50MzIgIHJvb3QsIHJlbV9oaSwgcmVtX2xvLCB0ZXN0X2RpdjsKLSAgICBGVF9JbnQgICAgIGNvdW50OwotCi0KLSAgICByb290ID0gMDsKLQotICAgIGlmICggeCA+IDAgKQotICAgIHsKLSAgICAgIHJlbV9oaSA9IDA7Ci0gICAgICByZW1fbG8gPSB4OwotICAgICAgY291bnQgID0gMjQ7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICByZW1faGkgICA9ICggcmVtX2hpIDw8IDIgKSB8ICggcmVtX2xvID4+IDMwICk7Ci0gICAgICAgIHJlbV9sbyA8PD0gMjsKLSAgICAgICAgcm9vdCAgIDw8PSAxOwotICAgICAgICB0ZXN0X2RpdiA9ICggcm9vdCA8PCAxICkgKyAxOwotCi0gICAgICAgIGlmICggcmVtX2hpID49IHRlc3RfZGl2ICkKLSAgICAgICAgewotICAgICAgICAgIHJlbV9oaSAtPSB0ZXN0X2RpdjsKLSAgICAgICAgICByb290ICAgKz0gMTsKLSAgICAgICAgfQotICAgICAgfSB3aGlsZSAoIC0tY291bnQgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKEZUX0ludDMyKXJvb3Q7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfSW50ICkKLSAgZnRfY29ybmVyX29yaWVudGF0aW9uKCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApCi0gIHsKLSAgICBGVF9JbnQgIHJlc3VsdDsKLQotCi0gICAgLyogZGVhbCB3aXRoIHRoZSB0cml2aWFsIGNhc2VzIHF1aWNrbHkgKi8KLSAgICBpZiAoIGluX3kgPT0gMCApCi0gICAgewotICAgICAgaWYgKCBpbl94ID49IDAgKQotICAgICAgICByZXN1bHQgPSBvdXRfeTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gLW91dF95OwotICAgIH0KLSAgICBlbHNlIGlmICggaW5feCA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIGluX3kgPj0gMCApCi0gICAgICAgIHJlc3VsdCA9IC1vdXRfeDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gb3V0X3g7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBvdXRfeSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIG91dF94ID49IDAgKQotICAgICAgICByZXN1bHQgPSBpbl95OwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAtaW5feTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG91dF94ID09IDAgKQotICAgIHsKLSAgICAgIGlmICggb3V0X3kgPj0gMCApCi0gICAgICAgIHJlc3VsdCA9IC1pbl94OwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAgaW5feDsKLSAgICB9Ci0gICAgZWxzZSAvKiBnZW5lcmFsIGNhc2UgKi8KLSAgICB7Ci0jaWZkZWYgRlRfTE9ORzY0Ci0KLSAgICAgIEZUX0ludDY0ICBkZWx0YSA9IChGVF9JbnQ2NClpbl94ICogb3V0X3kgLSAoRlRfSW50NjQpaW5feSAqIG91dF94OwotCi0KLSAgICAgIGlmICggZGVsdGEgPT0gMCApCi0gICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IDEgLSAyICogKCBkZWx0YSA8IDAgKTsKLQotI2Vsc2UKLQotICAgICAgRlRfSW50NjQgIHoxLCB6MjsKLQotCi0gICAgICBmdF9tdWx0bzY0KCBpbl94LCBvdXRfeSwgJnoxICk7Ci0gICAgICBmdF9tdWx0bzY0KCBpbl95LCBvdXRfeCwgJnoyICk7Ci0KLSAgICAgIGlmICggejEuaGkgPiB6Mi5oaSApCi0gICAgICAgIHJlc3VsdCA9ICsxOwotICAgICAgZWxzZSBpZiAoIHoxLmhpIDwgejIuaGkgKQotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICAgIGVsc2UgaWYgKCB6MS5sbyA+IHoyLmxvICkKLSAgICAgICAgcmVzdWx0ID0gKzE7Ci0gICAgICBlbHNlIGlmICggejEubG8gPCB6Mi5sbyApCi0gICAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAwOwotCi0jZW5kaWYKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0ludCApCi0gIGZ0X2Nvcm5lcl9pc19mbGF0KCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGluX3ksCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF94LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApCi0gIHsKLSAgICBGVF9Qb3MgIGF4ID0gaW5feDsKLSAgICBGVF9Qb3MgIGF5ID0gaW5feTsKLQotICAgIEZUX1BvcyAgZF9pbiwgZF9vdXQsIGRfY29ybmVyOwotCi0KLSAgICBpZiAoIGF4IDwgMCApCi0gICAgICBheCA9IC1heDsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX2luID0gYXggKyBheTsKLQotICAgIGF4ID0gb3V0X3g7Ci0gICAgaWYgKCBheCA8IDAgKQotICAgICAgYXggPSAtYXg7Ci0gICAgYXkgPSBvdXRfeTsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX291dCA9IGF4ICsgYXk7Ci0KLSAgICBheCA9IG91dF94ICsgaW5feDsKLSAgICBpZiAoIGF4IDwgMCApCi0gICAgICBheCA9IC1heDsKLSAgICBheSA9IG91dF95ICsgaW5feTsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX2Nvcm5lciA9IGF4ICsgYXk7Ci0KLSAgICByZXR1cm4gKCBkX2luICsgZF9vdXQgLSBkX2Nvcm5lciApIDwgKCBkX2Nvcm5lciA+PiA0ICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0ZGJnbWVtLmMgYi9zcmMvYmFzZS9mdGRiZ21lbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmE1YzIwLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0ZGJnbWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRkYmdtZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE1lbW9yeSBkZWJ1Z2dlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotI2luY2x1ZGUgRlRfVFlQRVNfSAotCi0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLQotI2RlZmluZSAgS0VFUEFMSVZFIC8qIGBLZWVwIGFsaXZlJyBtZWFucyB0aGF0IGZyZWVkIGJsb2NrcyBhcmVuJ3QgcmVsZWFzZWQKLSAgICAgICAgICAgICAgICAgICAgKiB0byB0aGUgaGVhcC4gIFRoaXMgaXMgdXNlZnVsIHRvIGRldGVjdCBkb3VibGUtZnJlZXMKLSAgICAgICAgICAgICAgICAgICAgKiBvciB3ZWlyZCBoZWFwIGNvcnJ1cHRpb24sIGJ1dCBpdCB1c2VzIGxhcmdlIGFtb3VudHMgb2YKLSAgICAgICAgICAgICAgICAgICAgKiBtZW1vcnksIGhvd2V2ZXIuCi0gICAgICAgICAgICAgICAgICAgICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0gIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyKiApICBfZnRfZGVidWdfZmlsZSAgID0gMDsKLSAgRlRfQkFTRV9ERUYoIGxvbmcgKSAgICAgICAgIF9mdF9kZWJ1Z19saW5lbm8gPSAwOwotCi0gIGV4dGVybiB2b2lkCi0gIEZUX0R1bXBNZW1vcnkoIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1Tb3VyY2VSZWNfKiAgRlRfTWVtU291cmNlOwotICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1Ob2RlUmVjXyogICAgRlRfTWVtTm9kZTsKLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTWVtVGFibGVSZWNfKiAgIEZUX01lbVRhYmxlOwotCi0KLSNkZWZpbmUgRlRfTUVNX1ZBTCggYWRkciApICAoKEZUX1VMb25nKShGVF9Qb2ludGVyKSggYWRkciApKQotCi0gIC8qCi0gICAqICBUaGlzIHN0cnVjdHVyZSBob2xkcyBzdGF0aXN0aWNzIGZvciBhIHNpbmdsZSBhbGxvY2F0aW9uL3JlbGVhc2UKLSAgICogIHNpdGUuICBUaGlzIGlzIHVzZWZ1bCB0byBrbm93IHdoZXJlIG1lbW9yeSBvcGVyYXRpb25zIGhhcHBlbiB0aGUKLSAgICogIG1vc3QuCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTWVtU291cmNlUmVjXwotICB7Ci0gICAgY29uc3QgY2hhciogICBmaWxlX25hbWU7Ci0gICAgbG9uZyAgICAgICAgICBsaW5lX25vOwotCi0gICAgRlRfTG9uZyAgICAgICBjdXJfYmxvY2tzOyAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3MgKi8KLSAgICBGVF9Mb25nICAgICAgIG1heF9ibG9ja3M7ICAgLyogbWF4LiBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrcyAgICAqLwotICAgIEZUX0xvbmcgICAgICAgYWxsX2Jsb2NrczsgICAvKiB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCAgICovCi0KLSAgICBGVF9Mb25nICAgICAgIGN1cl9zaXplOyAgICAgLyogY3VycmVudCBjdW11bGF0aXZlIGFsbG9jYXRlZCBzaXplICovCi0gICAgRlRfTG9uZyAgICAgICBtYXhfc2l6ZTsgICAgIC8qIG1heGltdW0gY3VtdWxhdGl2ZSBhbGxvY2F0ZWQgc2l6ZSAqLwotICAgIEZUX0xvbmcgICAgICAgYWxsX3NpemU7ICAgICAvKiB0b3RhbCBjdW11bGF0aXZlIGFsbG9jYXRlZCBzaXplICAgKi8KLQotICAgIEZUX0xvbmcgICAgICAgY3VyX21heDsgICAgICAvKiBjdXJyZW50IG1heGltdW0gYWxsb2NhdGVkIHNpemUgKi8KLQotICAgIEZUX1VJbnQzMiAgICAgaGFzaDsKLSAgICBGVF9NZW1Tb3VyY2UgIGxpbms7Ci0KLSAgfSBGVF9NZW1Tb3VyY2VSZWM7Ci0KLQotICAvKgotICAgKiAgV2UgZG9uJ3QgbmVlZCBhIHJlc2l6YWJsZSBhcnJheSBmb3IgdGhlIG1lbW9yeSBzb3VyY2VzLCBiZWNhdXNlCi0gICAqICB0aGVpciBudW1iZXIgaXMgcHJldHR5IGxpbWl0ZWQgd2l0aGluIEZyZWVUeXBlLgotICAgKi8KLSNkZWZpbmUgRlRfTUVNX1NPVVJDRV9CVUNLRVRTICAxMjgKLQotICAvKgotICAgKiAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhIHNpbmdsZSBhbGxvY2F0ZWQKLSAgICogIG1lbW9yeSBibG9jay4gIElmIEtFRVBBTElWRSBpcyBkZWZpbmVkLCBibG9ja3MgdGhhdCBhcmUgZnJlZWQgYnkKLSAgICogIEZyZWVUeXBlIGFyZSBuZXZlciByZWxlYXNlZCB0byB0aGUgc3lzdGVtLiAgSW5zdGVhZCwgdGhlaXIgYHNpemUnCi0gICAqICBmaWVsZCBpcyBzZXQgdG8gLXNpemUuICBUaGlzIGlzIG1haW5seSB1c2VmdWwgdG8gZGV0ZWN0IGRvdWJsZSBmcmVlcywKLSAgICogIGF0IHRoZSBwcmljZSBvZiBsYXJnZSBtZW1vcnkgZm9vdHByaW50IGR1cmluZyBleGVjdXRpb24uCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTWVtTm9kZVJlY18KLSAgewotICAgIEZUX0J5dGUqICAgICAgYWRkcmVzczsKLSAgICBGVF9Mb25nICAgICAgIHNpemU7ICAgICAvKiA8IDAgaWYgdGhlIGJsb2NrIHdhcyBmcmVlZCAqLwotCi0gICAgRlRfTWVtU291cmNlICBzb3VyY2U7Ci0KLSNpZmRlZiBLRUVQQUxJVkUKLSAgICBjb25zdCBjaGFyKiAgIGZyZWVfZmlsZV9uYW1lOwotICAgIEZUX0xvbmcgICAgICAgZnJlZV9saW5lX25vOwotI2VuZGlmCi0KLSAgICBGVF9NZW1Ob2RlICAgIGxpbms7Ci0KLSAgfSBGVF9NZW1Ob2RlUmVjOwotCi0KLSAgLyoKLSAgICogIFRoZSBnbG9iYWwgc3RydWN0dXJlLCBjb250YWluaW5nIGNvbXBvdW5kIHN0YXRpc3RpY3MgYW5kIGFsbCBoYXNoCi0gICAqICB0YWJsZXMuCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTWVtVGFibGVSZWNfCi0gIHsKLSAgICBGVF9VTG9uZyAgICAgICAgIHNpemU7Ci0gICAgRlRfVUxvbmcgICAgICAgICBub2RlczsKLSAgICBGVF9NZW1Ob2RlKiAgICAgIGJ1Y2tldHM7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIGFsbG9jX3RvdGFsOwotICAgIEZUX1VMb25nICAgICAgICAgYWxsb2NfY3VycmVudDsKLSAgICBGVF9VTG9uZyAgICAgICAgIGFsbG9jX21heDsKLSAgICBGVF9VTG9uZyAgICAgICAgIGFsbG9jX2NvdW50OwotCi0gICAgRlRfQm9vbCAgICAgICAgICBib3VuZF90b3RhbDsKLSAgICBGVF9VTG9uZyAgICAgICAgIGFsbG9jX3RvdGFsX21heDsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgYm91bmRfY291bnQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICBhbGxvY19jb3VudF9tYXg7Ci0KLSAgICBGVF9NZW1Tb3VyY2UgICAgIHNvdXJjZXNbRlRfTUVNX1NPVVJDRV9CVUNLRVRTXTsKLQotICAgIEZUX0Jvb2wgICAgICAgICAga2VlcF9hbGl2ZTsKLQotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OwotICAgIEZUX1BvaW50ZXIgICAgICAgbWVtb3J5X3VzZXI7Ci0gICAgRlRfQWxsb2NfRnVuYyAgICBhbGxvYzsKLSAgICBGVF9GcmVlX0Z1bmMgICAgIGZyZWU7Ci0gICAgRlRfUmVhbGxvY19GdW5jICByZWFsbG9jOwotCi0gIH0gRlRfTWVtVGFibGVSZWM7Ci0KLQotI2RlZmluZSBGVF9NRU1fU0laRV9NSU4gIDcKLSNkZWZpbmUgRlRfTUVNX1NJWkVfTUFYICAxMzg0NTE2MwotCi0jZGVmaW5lIEZUX0ZJTEVOQU1FKCB4ICkgICgoeCkgPyAoeCkgOiAidW5rbm93biBmaWxlIikKLQotCi0gIC8qCi0gICAqICBQcmltZSBudW1iZXJzIGFyZSB1Z2x5IHRvIGhhbmRsZS4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBpbXBsZW1lbnQKLSAgICogIEwtSGFzaGluZywgd2hpY2ggaXMgMTAlIGZhc3RlciBhbmQgZG9lc24ndCByZXF1aXJlIGRpdmlzaW9ucy4KLSAgICovCi0gIHN0YXRpYyBjb25zdCBGVF9VSW50ICBmdF9tZW1fcHJpbWVzW10gPQotICB7Ci0gICAgNywKLSAgICAxMSwKLSAgICAxOSwKLSAgICAzNywKLSAgICA3MywKLSAgICAxMDksCi0gICAgMTYzLAotICAgIDI1MSwKLSAgICAzNjcsCi0gICAgNTU3LAotICAgIDgyMywKLSAgICAxMjM3LAotICAgIDE4NjEsCi0gICAgMjc3NywKLSAgICA0MTc3LAotICAgIDYyNDcsCi0gICAgOTM3MSwKLSAgICAxNDA1NywKLSAgICAyMTA4OSwKLSAgICAzMTYyNywKLSAgICA0NzQzMSwKLSAgICA3MTE0MywKLSAgICAxMDY3MjEsCi0gICAgMTYwMDczLAotICAgIDI0MDEwMSwKLSAgICAzNjAxNjMsCi0gICAgNTQwMjE3LAotICAgIDgxMDM0MywKLSAgICAxMjE1NDk3LAotICAgIDE4MjMyMzEsCi0gICAgMjczNDg2NywKLSAgICA0MTAyMjgzLAotICAgIDYxNTM0MDksCi0gICAgOTIzMDExMywKLSAgICAxMzg0NTE2MywKLSAgfTsKLQotCi0gIHN0YXRpYyBGVF9VTG9uZwotICBmdF9tZW1fY2xvc2VzdF9wcmltZSggRlRfVUxvbmcgIG51bSApCi0gIHsKLSAgICBGVF9VSW50ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICBpIDwgc2l6ZW9mICggZnRfbWVtX3ByaW1lcyApIC8gc2l6ZW9mICggZnRfbWVtX3ByaW1lc1swXSApOyBpKysgKQotICAgICAgaWYgKCBmdF9tZW1fcHJpbWVzW2ldID4gbnVtICkKLSAgICAgICAgcmV0dXJuIGZ0X21lbV9wcmltZXNbaV07Ci0KLSAgICByZXR1cm4gRlRfTUVNX1NJWkVfTUFYOwotICB9Ci0KLQotICBleHRlcm4gdm9pZAotICBmdF9tZW1fZGVidWdfcGFuaWMoIGNvbnN0IGNoYXIqICBmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgLi4uICkKLSAgewotICAgIHZhX2xpc3QgIGFwOwotCi0KLSAgICBwcmludGYoICJGcmVlVHlwZS5EZWJ1ZzogIiApOwotCi0gICAgdmFfc3RhcnQoIGFwLCBmbXQgKTsKLSAgICB2cHJpbnRmKCBmbXQsIGFwICk7Ci0gICAgdmFfZW5kKCBhcCApOwotCi0gICAgcHJpbnRmKCAiXG4iICk7Ci0gICAgZXhpdCggRVhJVF9GQUlMVVJFICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Qb2ludGVyCi0gIGZ0X21lbV90YWJsZV9hbGxvYyggRlRfTWVtVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBzaXplICkKLSAgewotICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IHRhYmxlLT5tZW1vcnk7Ci0gICAgRlRfUG9pbnRlciAgYmxvY2s7Ci0KLQotICAgIG1lbW9yeS0+dXNlciA9IHRhYmxlLT5tZW1vcnlfdXNlcjsKLSAgICBibG9jayA9IHRhYmxlLT5hbGxvYyggbWVtb3J5LCBzaXplICk7Ci0gICAgbWVtb3J5LT51c2VyID0gdGFibGU7Ci0KLSAgICByZXR1cm4gYmxvY2s7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X21lbV90YWJsZV9mcmVlKCBGVF9NZW1UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgYmxvY2sgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSB0YWJsZS0+bWVtb3J5OwotCi0KLSAgICBtZW1vcnktPnVzZXIgPSB0YWJsZS0+bWVtb3J5X3VzZXI7Ci0gICAgdGFibGUtPmZyZWUoIG1lbW9yeSwgYmxvY2sgKTsKLSAgICBtZW1vcnktPnVzZXIgPSB0YWJsZTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX3RhYmxlX3Jlc2l6ZSggRlRfTWVtVGFibGUgIHRhYmxlICkKLSAgewotICAgIEZUX1VMb25nICBuZXdfc2l6ZTsKLQotCi0gICAgbmV3X3NpemUgPSBmdF9tZW1fY2xvc2VzdF9wcmltZSggdGFibGUtPm5vZGVzICk7Ci0gICAgaWYgKCBuZXdfc2l6ZSAhPSB0YWJsZS0+c2l6ZSApCi0gICAgewotICAgICAgRlRfTWVtTm9kZSogIG5ld19idWNrZXRzOwotICAgICAgRlRfVUxvbmcgICAgIGk7Ci0KLQotICAgICAgbmV3X2J1Y2tldHMgPSAoRlRfTWVtTm9kZSAqKQotICAgICAgICAgICAgICAgICAgICAgIGZ0X21lbV90YWJsZV9hbGxvYyggdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc2l6ZSAqIHNpemVvZiAoIEZUX01lbU5vZGUgKSApOwotICAgICAgaWYgKCBuZXdfYnVja2V0cyA9PSBOVUxMICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBGVF9BUlJBWV9aRVJPKCBuZXdfYnVja2V0cywgbmV3X3NpemUgKTsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCB0YWJsZS0+c2l6ZTsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfTWVtTm9kZSAgbm9kZSwgbmV4dCwgKnBub2RlOwotICAgICAgICBGVF9VTG9uZyAgICBoYXNoOwotCi0KLSAgICAgICAgbm9kZSA9IHRhYmxlLT5idWNrZXRzW2ldOwotICAgICAgICB3aGlsZSAoIG5vZGUgKQotICAgICAgICB7Ci0gICAgICAgICAgbmV4dCAgPSBub2RlLT5saW5rOwotICAgICAgICAgIGhhc2ggID0gRlRfTUVNX1ZBTCggbm9kZS0+YWRkcmVzcyApICUgbmV3X3NpemU7Ci0gICAgICAgICAgcG5vZGUgPSBuZXdfYnVja2V0cyArIGhhc2g7Ci0KLSAgICAgICAgICBub2RlLT5saW5rID0gcG5vZGVbMF07Ci0gICAgICAgICAgcG5vZGVbMF0gICA9IG5vZGU7Ci0KLSAgICAgICAgICBub2RlID0gbmV4dDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIHRhYmxlLT5idWNrZXRzICkKLSAgICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCB0YWJsZS0+YnVja2V0cyApOwotCi0gICAgICB0YWJsZS0+YnVja2V0cyA9IG5ld19idWNrZXRzOwotICAgICAgdGFibGUtPnNpemUgICAgPSBuZXdfc2l6ZTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9NZW1UYWJsZQotICBmdF9tZW1fdGFibGVfbmV3KCBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9NZW1UYWJsZSAgdGFibGU7Ci0KLQotICAgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+YWxsb2MoIG1lbW9yeSwgc2l6ZW9mICggKnRhYmxlICkgKTsKLSAgICBpZiAoIHRhYmxlID09IE5VTEwgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfWkVSTyggdGFibGUgKTsKLQotICAgIHRhYmxlLT5zaXplICA9IEZUX01FTV9TSVpFX01JTjsKLSAgICB0YWJsZS0+bm9kZXMgPSAwOwotCi0gICAgdGFibGUtPm1lbW9yeSA9IG1lbW9yeTsKLQotICAgIHRhYmxlLT5tZW1vcnlfdXNlciA9IG1lbW9yeS0+dXNlcjsKLQotICAgIHRhYmxlLT5hbGxvYyAgID0gbWVtb3J5LT5hbGxvYzsKLSAgICB0YWJsZS0+cmVhbGxvYyA9IG1lbW9yeS0+cmVhbGxvYzsKLSAgICB0YWJsZS0+ZnJlZSAgICA9IG1lbW9yeS0+ZnJlZTsKLQotICAgIHRhYmxlLT5idWNrZXRzID0gKEZUX01lbU5vZGUgKikKLSAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LT5hbGxvYyggbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS0+c2l6ZSAqIHNpemVvZiAoIEZUX01lbU5vZGUgKSApOwotICAgIGlmICggdGFibGUtPmJ1Y2tldHMgKQotICAgICAgRlRfQVJSQVlfWkVSTyggdGFibGUtPmJ1Y2tldHMsIHRhYmxlLT5zaXplICk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1lbW9yeS0+ZnJlZSggbWVtb3J5LCB0YWJsZSApOwotICAgICAgdGFibGUgPSBOVUxMOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiB0YWJsZTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX3RhYmxlX2Rlc3Ryb3koIEZUX01lbVRhYmxlICB0YWJsZSApCi0gIHsKLSAgICBGVF9VTG9uZyAgaTsKLQotCi0gICAgRlRfRHVtcE1lbW9yeSggdGFibGUtPm1lbW9yeSApOwotCi0gICAgaWYgKCB0YWJsZSApCi0gICAgewotICAgICAgRlRfTG9uZyAgIGxlYWtfY291bnQgPSAwOwotICAgICAgRlRfVUxvbmcgIGxlYWtzICAgICAgPSAwOwotCi0KLSAgICAgIC8qIHJlbW92ZSBhbGwgYmxvY2tzIGZyb20gdGhlIHRhYmxlLCByZXZlYWxpbmcgbGVha2VkIG9uZXMgKi8KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgdGFibGUtPnNpemU7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX01lbU5vZGUgICpwbm9kZSA9IHRhYmxlLT5idWNrZXRzICsgaSwgbmV4dCwgbm9kZSA9ICpwbm9kZTsKLQotCi0gICAgICAgIHdoaWxlICggbm9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICBuZXh0ICAgICAgID0gbm9kZS0+bGluazsKLSAgICAgICAgICBub2RlLT5saW5rID0gMDsKLQotICAgICAgICAgIGlmICggbm9kZS0+c2l6ZSA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZigKLSAgICAgICAgICAgICAgImxlYWtlZCBtZW1vcnkgYmxvY2sgYXQgYWRkcmVzcyAlcCwgc2l6ZSAlOGxkIGluICglczolbGQpXG4iLAotICAgICAgICAgICAgICBub2RlLT5hZGRyZXNzLCBub2RlLT5zaXplLAotICAgICAgICAgICAgICBGVF9GSUxFTkFNRSggbm9kZS0+c291cmNlLT5maWxlX25hbWUgKSwKLSAgICAgICAgICAgICAgbm9kZS0+c291cmNlLT5saW5lX25vICk7Ci0KLSAgICAgICAgICAgIGxlYWtfY291bnQrKzsKLSAgICAgICAgICAgIGxlYWtzICs9IG5vZGUtPnNpemU7Ci0KLSAgICAgICAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgbm9kZS0+YWRkcmVzcyApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG5vZGUtPmFkZHJlc3MgPSBOVUxMOwotICAgICAgICAgIG5vZGUtPnNpemUgICAgPSAwOwotCi0gICAgICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCBub2RlICk7Ci0gICAgICAgICAgbm9kZSA9IG5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgdGFibGUtPmJ1Y2tldHNbaV0gPSAwOwotICAgICAgfQotCi0gICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIHRhYmxlLT5idWNrZXRzICk7Ci0gICAgICB0YWJsZS0+YnVja2V0cyA9IE5VTEw7Ci0KLSAgICAgIHRhYmxlLT5zaXplICA9IDA7Ci0gICAgICB0YWJsZS0+bm9kZXMgPSAwOwotCi0gICAgICAvKiByZW1vdmUgYWxsIHNvdXJjZXMgKi8KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfTUVNX1NPVVJDRV9CVUNLRVRTOyBpKysgKQotICAgICAgewotICAgICAgICBGVF9NZW1Tb3VyY2UgIHNvdXJjZSwgbmV4dDsKLQotCi0gICAgICAgIGZvciAoIHNvdXJjZSA9IHRhYmxlLT5zb3VyY2VzW2ldOyBzb3VyY2UgIT0gTlVMTDsgc291cmNlID0gbmV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICBuZXh0ID0gc291cmNlLT5saW5rOwotICAgICAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgc291cmNlICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0YWJsZS0+c291cmNlc1tpXSA9IE5VTEw7Ci0gICAgICB9Ci0KLSAgICAgIHByaW50ZigKLSAgICAgICAgIkZyZWVUeXBlOiB0b3RhbCBtZW1vcnkgYWxsb2NhdGlvbnMgPSAlbGRcbiIsIHRhYmxlLT5hbGxvY190b3RhbCApOwotICAgICAgcHJpbnRmKAotICAgICAgICAiRnJlZVR5cGU6IG1heGltdW0gbWVtb3J5IGZvb3RwcmludCA9ICVsZFxuIiwgdGFibGUtPmFsbG9jX21heCApOwotCi0gICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIHRhYmxlICk7Ci0KLSAgICAgIGlmICggbGVha19jb3VudCA+IDAgKQotICAgICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICAgIkZyZWVUeXBlOiAlbGQgYnl0ZXMgb2YgbWVtb3J5IGxlYWtlZCBpbiAlbGQgYmxvY2tzXG4iLAotICAgICAgICAgIGxlYWtzLCBsZWFrX2NvdW50ICk7Ci0KLSAgICAgIHByaW50ZiggIkZyZWVUeXBlOiBObyBtZW1vcnkgbGVha3MgZGV0ZWN0ZWQhXG4iICk7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfTWVtTm9kZSoKLSAgZnRfbWVtX3RhYmxlX2dldF9ub2RlcCggRlRfTWVtVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYWRkcmVzcyApCi0gIHsKLSAgICBGVF9VTG9uZyAgICAgaGFzaDsKLSAgICBGVF9NZW1Ob2RlICAqcG5vZGUsIG5vZGU7Ci0KLQotICAgIGhhc2ggID0gRlRfTUVNX1ZBTCggYWRkcmVzcyApOwotICAgIHBub2RlID0gdGFibGUtPmJ1Y2tldHMgKyAoIGhhc2ggJSB0YWJsZS0+c2l6ZSApOwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBub2RlID0gcG5vZGVbMF07Ci0gICAgICBpZiAoICFub2RlICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggbm9kZS0+YWRkcmVzcyA9PSBhZGRyZXNzICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHBub2RlID0gJm5vZGUtPmxpbms7Ci0gICAgfQotICAgIHJldHVybiBwbm9kZTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX01lbVNvdXJjZQotICBmdF9tZW1fdGFibGVfZ2V0X3NvdXJjZSggRlRfTWVtVGFibGUgIHRhYmxlICkKLSAgewotICAgIEZUX1VJbnQzMiAgICAgaGFzaDsKLSAgICBGVF9NZW1Tb3VyY2UgIG5vZGUsICpwbm9kZTsKLQotCi0gICAgLyogY2FzdCB0byBGVF9QdHJEaXN0IGZpcnN0IHNpbmNlIHZvaWQqIGNhbiBiZSBsYXJnZXIgKi8KLSAgICAvKiB0aGFuIEZUX1VJbnQzMiBhbmQgR0NDIDQuMS4xIGVtaXRzIGEgd2FybmluZyAgICAgICAqLwotICAgIGhhc2ggID0gKEZUX1VJbnQzMikoRlRfUHRyRGlzdCkodm9pZCopX2Z0X2RlYnVnX2ZpbGUgKwotICAgICAgICAgICAgICAoRlRfVUludDMyKSggNSAqIF9mdF9kZWJ1Z19saW5lbm8gKTsKLSAgICBwbm9kZSA9ICZ0YWJsZS0+c291cmNlc1toYXNoICUgRlRfTUVNX1NPVVJDRV9CVUNLRVRTXTsKLQotICAgIGZvciAoIDs7ICkKLSAgICB7Ci0gICAgICBub2RlID0gKnBub2RlOwotICAgICAgaWYgKCBub2RlID09IE5VTEwgKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBub2RlLT5maWxlX25hbWUgPT0gX2Z0X2RlYnVnX2ZpbGUgJiYKLSAgICAgICAgICAgbm9kZS0+bGluZV9ubyAgID09IF9mdF9kZWJ1Z19saW5lbm8gICApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgcG5vZGUgPSAmbm9kZS0+bGluazsKLSAgICB9Ci0KLSAgICBub2RlID0gKEZUX01lbVNvdXJjZSlmdF9tZW1fdGFibGVfYWxsb2MoIHRhYmxlLCBzaXplb2YgKCAqbm9kZSApICk7Ci0gICAgaWYgKCBub2RlID09IE5VTEwgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgdG8gcGVyZm9ybSBtZW1vcnkgZGVidWdnaW5nXG4iICk7Ci0KLSAgICBub2RlLT5maWxlX25hbWUgPSBfZnRfZGVidWdfZmlsZTsKLSAgICBub2RlLT5saW5lX25vICAgPSBfZnRfZGVidWdfbGluZW5vOwotCi0gICAgbm9kZS0+Y3VyX2Jsb2NrcyA9IDA7Ci0gICAgbm9kZS0+bWF4X2Jsb2NrcyA9IDA7Ci0gICAgbm9kZS0+YWxsX2Jsb2NrcyA9IDA7Ci0KLSAgICBub2RlLT5jdXJfc2l6ZSAgID0gMDsKLSAgICBub2RlLT5tYXhfc2l6ZSAgID0gMDsKLSAgICBub2RlLT5hbGxfc2l6ZSAgID0gMDsKLQotICAgIG5vZGUtPmN1cl9tYXggICAgPSAwOwotCi0gICAgbm9kZS0+bGluayA9IE5VTEw7Ci0gICAgbm9kZS0+aGFzaCA9IGhhc2g7Ci0gICAgKnBub2RlICAgICA9IG5vZGU7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gbm9kZTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX3RhYmxlX3NldCggRlRfTWVtVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBkZWx0YSApCi0gIHsKLSAgICBGVF9NZW1Ob2RlICAqcG5vZGUsIG5vZGU7Ci0KLQotICAgIGlmICggdGFibGUgKQotICAgIHsKLSAgICAgIEZUX01lbVNvdXJjZSAgc291cmNlOwotCi0KLSAgICAgIHBub2RlID0gZnRfbWVtX3RhYmxlX2dldF9ub2RlcCggdGFibGUsIGFkZHJlc3MgKTsKLSAgICAgIG5vZGUgID0gKnBub2RlOwotICAgICAgaWYgKCBub2RlICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBub2RlLT5zaXplIDwgMCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBUaGlzIGJsb2NrIHdhcyBhbHJlYWR5IGZyZWVkLiAgT3VyIG1lbW9yeSBpcyBub3cgY29tcGxldGVseSAqLwotICAgICAgICAgIC8qIGNvcnJ1cHRlZCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogVGhpcyBjYW4gb25seSBoYXBwZW4gaW4ga2VlcC1hbGl2ZSBtb2RlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICAgICAibWVtb3J5IGhlYXAgY29ycnVwdGVkIChhbGxvY2F0aW5nIGZyZWVkIGJsb2NrKSIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBUaGlzIGJsb2NrIHdhcyBhbHJlYWR5IGFsbG9jYXRlZC4gIFRoaXMgbWVhbnMgdGhhdCBvdXIgbWVtb3J5ICovCi0gICAgICAgICAgLyogaXMgYWxzbyBjb3JydXB0ZWQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYygKLSAgICAgICAgICAgICJtZW1vcnkgaGVhcCBjb3JydXB0ZWQgKHJlLWFsbG9jYXRpbmcgYWxsb2NhdGVkIGJsb2NrIGF0IgotICAgICAgICAgICAgIiAlcCwgb2Ygc2l6ZSAlbGQpXG4iCi0gICAgICAgICAgICAib3JnPSVzOiVkIG5ldz0lczolZFxuIiwKLSAgICAgICAgICAgIG5vZGUtPmFkZHJlc3MsIG5vZGUtPnNpemUsCi0gICAgICAgICAgICBGVF9GSUxFTkFNRSggbm9kZS0+c291cmNlLT5maWxlX25hbWUgKSwgbm9kZS0+c291cmNlLT5saW5lX25vLAotICAgICAgICAgICAgRlRfRklMRU5BTUUoIF9mdF9kZWJ1Z19maWxlICksIF9mdF9kZWJ1Z19saW5lbm8gKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBub2RlIGluIHRoaXMgdGFibGUgKi8KLSAgICAgIG5vZGUgPSAoRlRfTWVtTm9kZSlmdF9tZW1fdGFibGVfYWxsb2MoIHRhYmxlLCBzaXplb2YgKCAqbm9kZSApICk7Ci0gICAgICBpZiAoIG5vZGUgPT0gTlVMTCApCi0gICAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggIm5vdCBlbm91Z2ggbWVtb3J5IHRvIHJ1biBtZW1vcnkgdGVzdHMiICk7Ci0KLSAgICAgIG5vZGUtPmFkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgbm9kZS0+c2l6ZSAgICA9IHNpemU7Ci0gICAgICBub2RlLT5zb3VyY2UgID0gc291cmNlID0gZnRfbWVtX3RhYmxlX2dldF9zb3VyY2UoIHRhYmxlICk7Ci0KLSAgICAgIGlmICggZGVsdGEgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgaXMgYW4gYWxsb2NhdGlvbiAqLwotICAgICAgICBzb3VyY2UtPmFsbF9ibG9ja3MrKzsKLSAgICAgICAgc291cmNlLT5jdXJfYmxvY2tzKys7Ci0gICAgICAgIGlmICggc291cmNlLT5jdXJfYmxvY2tzID4gc291cmNlLT5tYXhfYmxvY2tzICkKLSAgICAgICAgICBzb3VyY2UtPm1heF9ibG9ja3MgPSBzb3VyY2UtPmN1cl9ibG9ja3M7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggc2l6ZSA+IChGVF9VTG9uZylzb3VyY2UtPmN1cl9tYXggKQotICAgICAgICBzb3VyY2UtPmN1cl9tYXggPSBzaXplOwotCi0gICAgICBpZiAoIGRlbHRhICE9IDAgKQotICAgICAgewotICAgICAgICAvKiB3ZSBhcmUgZ3Jvd2luZyBvciBzaHJpbmtpbmcgYSByZWFsbG9jYXRlZCBibG9jayAqLwotICAgICAgICBzb3VyY2UtPmN1cl9zaXplICAgICArPSBkZWx0YTsKLSAgICAgICAgdGFibGUtPmFsbG9jX2N1cnJlbnQgKz0gZGVsdGE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHdlIGFyZSBhbGxvY2F0aW5nIGEgbmV3IGJsb2NrICovCi0gICAgICAgIHNvdXJjZS0+Y3VyX3NpemUgICAgICs9IHNpemU7Ci0gICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50ICs9IHNpemU7Ci0gICAgICB9Ci0KLSAgICAgIHNvdXJjZS0+YWxsX3NpemUgKz0gc2l6ZTsKLQotICAgICAgaWYgKCBzb3VyY2UtPmN1cl9zaXplID4gc291cmNlLT5tYXhfc2l6ZSApCi0gICAgICAgIHNvdXJjZS0+bWF4X3NpemUgPSBzb3VyY2UtPmN1cl9zaXplOwotCi0gICAgICBub2RlLT5mcmVlX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBub2RlLT5mcmVlX2xpbmVfbm8gICA9IDA7Ci0KLSAgICAgIG5vZGUtPmxpbmsgPSBwbm9kZVswXTsKLQotICAgICAgcG5vZGVbMF0gPSBub2RlOwotICAgICAgdGFibGUtPm5vZGVzKys7Ci0KLSAgICAgIHRhYmxlLT5hbGxvY190b3RhbCArPSBzaXplOwotCi0gICAgICBpZiAoIHRhYmxlLT5hbGxvY19jdXJyZW50ID4gdGFibGUtPmFsbG9jX21heCApCi0gICAgICAgIHRhYmxlLT5hbGxvY19tYXggPSB0YWJsZS0+YWxsb2NfY3VycmVudDsKLQotICAgICAgaWYgKCB0YWJsZS0+bm9kZXMgKiAzIDwgdGFibGUtPnNpemUgIHx8Ci0gICAgICAgICAgIHRhYmxlLT5zaXplICAqIDMgPCB0YWJsZS0+bm9kZXMgKQotICAgICAgICBmdF9tZW1fdGFibGVfcmVzaXplKCB0YWJsZSApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX3RhYmxlX3JlbW92ZSggRlRfTWVtVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGRlbHRhICkKLSAgewotICAgIGlmICggdGFibGUgKQotICAgIHsKLSAgICAgIEZUX01lbU5vZGUgICpwbm9kZSwgbm9kZTsKLQotCi0gICAgICBwbm9kZSA9IGZ0X21lbV90YWJsZV9nZXRfbm9kZXAoIHRhYmxlLCBhZGRyZXNzICk7Ci0gICAgICBub2RlICA9ICpwbm9kZTsKLSAgICAgIGlmICggbm9kZSApCi0gICAgICB7Ci0gICAgICAgIEZUX01lbVNvdXJjZSAgc291cmNlOwotCi0KLSAgICAgICAgaWYgKCBub2RlLT5zaXplIDwgMCApCi0gICAgICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAgICAgImZyZWVpbmcgbWVtb3J5IGJsb2NrIGF0ICVwIG1vcmUgdGhhbiBvbmNlIGF0ICglczolbGQpXG4iCi0gICAgICAgICAgICAiYmxvY2sgYWxsb2NhdGVkIGF0ICglczolbGQpIGFuZCByZWxlYXNlZCBhdCAoJXM6JWxkKSIsCi0gICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgRlRfRklMRU5BTUUoIF9mdF9kZWJ1Z19maWxlICksIF9mdF9kZWJ1Z19saW5lbm8sCi0gICAgICAgICAgICBGVF9GSUxFTkFNRSggbm9kZS0+c291cmNlLT5maWxlX25hbWUgKSwgbm9kZS0+c291cmNlLT5saW5lX25vLAotICAgICAgICAgICAgRlRfRklMRU5BTUUoIG5vZGUtPmZyZWVfZmlsZV9uYW1lICksIG5vZGUtPmZyZWVfbGluZV9ubyApOwotCi0gICAgICAgIC8qIHNjcmFtYmxlIHRoZSBub2RlJ3MgY29udGVudCBmb3IgYWRkaXRpb25hbCBzYWZldHkgKi8KLSAgICAgICAgRlRfTUVNX1NFVCggYWRkcmVzcywgMHhGMywgbm9kZS0+c2l6ZSApOwotCi0gICAgICAgIGlmICggZGVsdGEgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBzb3VyY2UgPSBub2RlLT5zb3VyY2U7Ci0KLSAgICAgICAgICBzb3VyY2UtPmN1cl9ibG9ja3MtLTsKLSAgICAgICAgICBzb3VyY2UtPmN1cl9zaXplIC09IG5vZGUtPnNpemU7Ci0KLSAgICAgICAgICB0YWJsZS0+YWxsb2NfY3VycmVudCAtPSBub2RlLT5zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB0YWJsZS0+a2VlcF9hbGl2ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3ZSBzaW1wbHkgaW52ZXJ0IHRoZSBub2RlJ3Mgc2l6ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBub2RlICovCi0gICAgICAgICAgLyogd2FzIGZyZWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIG5vZGUtPnNpemUgICAgICAgICAgID0gLW5vZGUtPnNpemU7Ci0gICAgICAgICAgbm9kZS0+ZnJlZV9maWxlX25hbWUgPSBfZnRfZGVidWdfZmlsZTsKLSAgICAgICAgICBub2RlLT5mcmVlX2xpbmVfbm8gICA9IF9mdF9kZWJ1Z19saW5lbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGFibGUtPm5vZGVzLS07Ci0KLSAgICAgICAgICAqcG5vZGUgPSBub2RlLT5saW5rOwotCi0gICAgICAgICAgbm9kZS0+c2l6ZSAgID0gMDsKLSAgICAgICAgICBub2RlLT5zb3VyY2UgPSBOVUxMOwotCi0gICAgICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCBub2RlICk7Ci0KLSAgICAgICAgICBpZiAoIHRhYmxlLT5ub2RlcyAqIDMgPCB0YWJsZS0+c2l6ZSAgfHwKLSAgICAgICAgICAgICAgIHRhYmxlLT5zaXplICAqIDMgPCB0YWJsZS0+bm9kZXMgKQotICAgICAgICAgICAgZnRfbWVtX3RhYmxlX3Jlc2l6ZSggdGFibGUgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICAgInRyeWluZyB0byBmcmVlIHVua25vd24gYmxvY2sgYXQgJXAgaW4gKCVzOiVsZClcbiIsCi0gICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICBGVF9GSUxFTkFNRSggX2Z0X2RlYnVnX2ZpbGUgKSwgX2Z0X2RlYnVnX2xpbmVubyApOwotICAgIH0KLSAgfQotCi0KLSAgZXh0ZXJuIEZUX1BvaW50ZXIKLSAgZnRfbWVtX2RlYnVnX2FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+dXNlcjsKLSAgICBGVF9CeXRlKiAgICAgYmxvY2s7Ci0KLQotICAgIGlmICggc2l6ZSA8PSAwICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggIm5lZ2F0aXZlIGJsb2NrIHNpemUgYWxsb2NhdGlvbiAoJWxkKSIsIHNpemUgKTsKLQotICAgIC8qIHJldHVybiBOVUxMIGlmIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0aW9ucyB3YXMgcmVhY2hlZCAqLwotICAgIGlmICggdGFibGUtPmJvdW5kX2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhYmxlLT5hbGxvY19jb3VudCA+PSB0YWJsZS0+YWxsb2NfY291bnRfbWF4ICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogcmV0dXJuIE5VTEwgaWYgdGhpcyBhbGxvY2F0aW9uIHdvdWxkIG92ZXJmbG93IHRoZSBtYXhpbXVtIGhlYXAgc2l6ZSAqLwotICAgIGlmICggdGFibGUtPmJvdW5kX3RvdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhYmxlLT5hbGxvY190b3RhbF9tYXggLSB0YWJsZS0+YWxsb2NfY3VycmVudCA+IChGVF9VTG9uZylzaXplICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgYmxvY2sgPSAoRlRfQnl0ZSAqKWZ0X21lbV90YWJsZV9hbGxvYyggdGFibGUsIHNpemUgKTsKLSAgICBpZiAoIGJsb2NrICkKLSAgICB7Ci0gICAgICBmdF9tZW1fdGFibGVfc2V0KCB0YWJsZSwgYmxvY2ssIChGVF9VTG9uZylzaXplLCAwICk7Ci0KLSAgICAgIHRhYmxlLT5hbGxvY19jb3VudCsrOwotICAgIH0KLQotICAgIF9mdF9kZWJ1Z19maWxlICAgPSAiPHVua25vd24+IjsKLSAgICBfZnRfZGVidWdfbGluZW5vID0gMDsKLQotICAgIHJldHVybiAoRlRfUG9pbnRlcilibG9jazsKLSAgfQotCi0KLSAgZXh0ZXJuIHZvaWQKLSAgZnRfbWVtX2RlYnVnX2ZyZWUoIEZUX01lbW9yeSAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJsb2NrICkKLSAgewotICAgIEZUX01lbVRhYmxlICB0YWJsZSA9IChGVF9NZW1UYWJsZSltZW1vcnktPnVzZXI7Ci0KLQotICAgIGlmICggYmxvY2sgPT0gTlVMTCApCi0gICAgICBmdF9tZW1fZGVidWdfcGFuaWMoICJ0cnlpbmcgdG8gZnJlZSBOVUxMIGluICglczolbGQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRklMRU5BTUUoIF9mdF9kZWJ1Z19maWxlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9mdF9kZWJ1Z19saW5lbm8gKTsKLQotICAgIGZ0X21lbV90YWJsZV9yZW1vdmUoIHRhYmxlLCAoRlRfQnl0ZSopYmxvY2ssIDAgKTsKLQotICAgIGlmICggIXRhYmxlLT5rZWVwX2FsaXZlICkKLSAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgYmxvY2sgKTsKLQotICAgIHRhYmxlLT5hbGxvY19jb3VudC0tOwotCi0gICAgX2Z0X2RlYnVnX2ZpbGUgICA9ICI8dW5rbm93bj4iOwotICAgIF9mdF9kZWJ1Z19saW5lbm8gPSAwOwotICB9Ci0KLQotICBleHRlcm4gRlRfUG9pbnRlcgotICBmdF9tZW1fZGVidWdfcmVhbGxvYyggRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBuZXdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJsb2NrICkKLSAgewotICAgIEZUX01lbVRhYmxlICB0YWJsZSA9IChGVF9NZW1UYWJsZSltZW1vcnktPnVzZXI7Ci0gICAgRlRfTWVtTm9kZSAgIG5vZGUsICpwbm9kZTsKLSAgICBGVF9Qb2ludGVyICAgbmV3X2Jsb2NrOwotICAgIEZUX0xvbmcgICAgICBkZWx0YTsKLQotICAgIGNvbnN0IGNoYXIqICBmaWxlX25hbWUgPSBGVF9GSUxFTkFNRSggX2Z0X2RlYnVnX2ZpbGUgKTsKLSAgICBGVF9Mb25nICAgICAgbGluZV9ubyAgID0gX2Z0X2RlYnVnX2xpbmVubzsKLQotCi0gICAgLyogdW5saWtlbHksIGJ1dCBwb3NzaWJsZSAqLwotICAgIGlmICggbmV3X3NpemUgPT0gY3VyX3NpemUgKQotICAgICAgcmV0dXJuIGJsb2NrOwotCi0gICAgLyogdGhlIGZvbGxvd2luZyBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gQU5TSSBDICovCi0jaWYgMAotICAgIGlmICggYmxvY2sgPT0gTlVMTCB8fCBjdXJfc2l6ZSA9PSAwICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggInRyeWluZyB0byByZWFsbG9jYXRlIE5VTEwgaW4gKCVzOiVsZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUsIGxpbmVfbm8gKTsKLSNlbmRpZgotCi0gICAgLyogd2hpbGUgdGhlIGZvbGxvd2luZyBpcyBhbGxvd2VkIGluIEFOU0kgQyBhbHNvLCB3ZSBhYm9ydCBzaW5jZSAqLwotICAgIC8qIHN1Y2ggY2FzZSBzaG91bGQgYmUgaGFuZGxlZCBieSBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIG5ld19zaXplIDw9IDAgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAidHJ5aW5nIHRvIHJlYWxsb2NhdGUgJXAgdG8gc2l6ZSAwIChjdXJyZW50IGlzICVsZCkgaW4gKCVzOiVsZCkiLAotICAgICAgICBibG9jaywgY3VyX3NpemUsIGZpbGVfbmFtZSwgbGluZV9ubyApOwotCi0gICAgLyogY2hlY2sgYGN1cl9zaXplJyB2YWx1ZSAqLwotICAgIHBub2RlID0gZnRfbWVtX3RhYmxlX2dldF9ub2RlcCggdGFibGUsIChGVF9CeXRlKilibG9jayApOwotICAgIG5vZGUgID0gKnBub2RlOwotICAgIGlmICggIW5vZGUgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAidHJ5aW5nIHRvIHJlYWxsb2NhdGUgdW5rbm93biBibG9jayBhdCAlcCBpbiAoJXM6JWxkKSIsCi0gICAgICAgIGJsb2NrLCBmaWxlX25hbWUsIGxpbmVfbm8gKTsKLQotICAgIGlmICggbm9kZS0+c2l6ZSA8PSAwICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYygKLSAgICAgICAgInRyeWluZyB0byByZWFsbG9jYXRlIGZyZWVkIGJsb2NrIGF0ICVwIGluICglczolbGQpIiwKLSAgICAgICAgYmxvY2ssIGZpbGVfbmFtZSwgbGluZV9ubyApOwotCi0gICAgaWYgKCBub2RlLT5zaXplICE9IGN1cl9zaXplICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggImludmFsaWQgZnRfcmVhbGxvYyByZXF1ZXN0IGZvciAlcC4gY3VyX3NpemUgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiJWxkIGluc3RlYWQgb2YgJWxkIGluICglczolbGQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIGN1cl9zaXplLCBub2RlLT5zaXplLCBmaWxlX25hbWUsIGxpbmVfbm8gKTsKLQotICAgIC8qIHJldHVybiBOVUxMIGlmIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0aW9ucyB3YXMgcmVhY2hlZCAqLwotICAgIGlmICggdGFibGUtPmJvdW5kX2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhYmxlLT5hbGxvY19jb3VudCA+PSB0YWJsZS0+YWxsb2NfY291bnRfbWF4ICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZGVsdGEgPSAoRlRfTG9uZykoIG5ld19zaXplIC0gY3VyX3NpemUgKTsKLQotICAgIC8qIHJldHVybiBOVUxMIGlmIHRoaXMgYWxsb2NhdGlvbiB3b3VsZCBvdmVyZmxvdyB0aGUgbWF4aW11bSBoZWFwIHNpemUgKi8KLSAgICBpZiAoIGRlbHRhID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdGFibGUtPmJvdW5kX3RvdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB0YWJsZS0+YWxsb2NfY3VycmVudCArIChGVF9VTG9uZylkZWx0YSA+IHRhYmxlLT5hbGxvY190b3RhbF9tYXggKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBuZXdfYmxvY2sgPSAoRlRfQnl0ZSAqKWZ0X21lbV90YWJsZV9hbGxvYyggdGFibGUsIG5ld19zaXplICk7Ci0gICAgaWYgKCBuZXdfYmxvY2sgPT0gTlVMTCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGZ0X21lbV90YWJsZV9zZXQoIHRhYmxlLCAoRlRfQnl0ZSopbmV3X2Jsb2NrLCBuZXdfc2l6ZSwgZGVsdGEgKTsKLQotICAgIGZ0X21lbWNweSggbmV3X2Jsb2NrLCBibG9jaywgY3VyX3NpemUgPCBuZXdfc2l6ZSA/IGN1cl9zaXplIDogbmV3X3NpemUgKTsKLQotICAgIGZ0X21lbV90YWJsZV9yZW1vdmUoIHRhYmxlLCAoRlRfQnl0ZSopYmxvY2ssIGRlbHRhICk7Ci0KLSAgICBfZnRfZGVidWdfZmlsZSAgID0gIjx1bmtub3duPiI7Ci0gICAgX2Z0X2RlYnVnX2xpbmVubyA9IDA7Ci0KLSAgICBpZiAoICF0YWJsZS0+a2VlcF9hbGl2ZSApCi0gICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIGJsb2NrICk7Ci0KLSAgICByZXR1cm4gbmV3X2Jsb2NrOwotICB9Ci0KLQotICBleHRlcm4gRlRfSW50Ci0gIGZ0X21lbV9kZWJ1Z19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9NZW1UYWJsZSAgdGFibGU7Ci0gICAgRlRfSW50ICAgICAgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggZ2V0ZW52KCAiRlQyX0RFQlVHX01FTU9SWSIgKSApCi0gICAgewotICAgICAgdGFibGUgPSBmdF9tZW1fdGFibGVfbmV3KCBtZW1vcnkgKTsKLSAgICAgIGlmICggdGFibGUgKQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiAgcDsKLQotCi0gICAgICAgIG1lbW9yeS0+dXNlciAgICA9IHRhYmxlOwotICAgICAgICBtZW1vcnktPmFsbG9jICAgPSBmdF9tZW1fZGVidWdfYWxsb2M7Ci0gICAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X21lbV9kZWJ1Z19yZWFsbG9jOwotICAgICAgICBtZW1vcnktPmZyZWUgICAgPSBmdF9tZW1fZGVidWdfZnJlZTsKLQotICAgICAgICBwID0gZ2V0ZW52KCAiRlQyX0FMTE9DX1RPVEFMX01BWCIgKTsKLSAgICAgICAgaWYgKCBwICE9IE5VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTG9uZyAgIHRvdGFsX21heCA9IGZ0X2F0b2woIHAgKTsKLQotCi0gICAgICAgICAgaWYgKCB0b3RhbF9tYXggPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YWJsZS0+Ym91bmRfdG90YWwgICAgID0gMTsKLSAgICAgICAgICAgIHRhYmxlLT5hbGxvY190b3RhbF9tYXggPSAoRlRfVUxvbmcpdG90YWxfbWF4OwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHAgPSBnZXRlbnYoICJGVDJfQUxMT0NfQ09VTlRfTUFYIiApOwotICAgICAgICBpZiAoIHAgIT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Mb25nICB0b3RhbF9jb3VudCA9IGZ0X2F0b2woIHAgKTsKLQotCi0gICAgICAgICAgaWYgKCB0b3RhbF9jb3VudCA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhYmxlLT5ib3VuZF9jb3VudCAgICAgPSAxOwotICAgICAgICAgICAgdGFibGUtPmFsbG9jX2NvdW50X21heCA9IChGVF9VTG9uZyl0b3RhbF9jb3VudDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gZ2V0ZW52KCAiRlQyX0tFRVBfQUxJVkUiICk7Ci0gICAgICAgIGlmICggcCAhPSBOVUxMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0xvbmcgIGtlZXBfYWxpdmUgPSBmdF9hdG9sKCBwICk7Ci0KLQotICAgICAgICAgIGlmICgga2VlcF9hbGl2ZSA+IDAgKQotICAgICAgICAgICAgdGFibGUtPmtlZXBfYWxpdmUgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgZXh0ZXJuIHZvaWQKLSAgZnRfbWVtX2RlYnVnX2RvbmUoIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX01lbVRhYmxlICB0YWJsZSA9IChGVF9NZW1UYWJsZSltZW1vcnktPnVzZXI7Ci0KLQotICAgIGlmICggdGFibGUgKQotICAgIHsKLSAgICAgIG1lbW9yeS0+ZnJlZSAgICA9IHRhYmxlLT5mcmVlOwotICAgICAgbWVtb3J5LT5yZWFsbG9jID0gdGFibGUtPnJlYWxsb2M7Ci0gICAgICBtZW1vcnktPmFsbG9jICAgPSB0YWJsZS0+YWxsb2M7Ci0KLSAgICAgIGZ0X21lbV90YWJsZV9kZXN0cm95KCB0YWJsZSApOwotICAgICAgbWVtb3J5LT51c2VyID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0KLSAgc3RhdGljIGludAotICBmdF9tZW1fc291cmNlX2NvbXBhcmUoIGNvbnN0IHZvaWQqICBwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgcDIgKQotICB7Ci0gICAgRlRfTWVtU291cmNlICBzMSA9ICooRlRfTWVtU291cmNlKilwMTsKLSAgICBGVF9NZW1Tb3VyY2UgIHMyID0gKihGVF9NZW1Tb3VyY2UqKXAyOwotCi0KLSAgICBpZiAoIHMyLT5tYXhfc2l6ZSA+IHMxLT5tYXhfc2l6ZSApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlIGlmICggczItPm1heF9zaXplIDwgczEtPm1heF9zaXplICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgZXh0ZXJuIHZvaWQKLSAgRlRfRHVtcE1lbW9yeSggRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+dXNlcjsKLQotCi0gICAgaWYgKCB0YWJsZSApCi0gICAgewotICAgICAgRlRfTWVtU291cmNlKiAgYnVja2V0ID0gdGFibGUtPnNvdXJjZXM7Ci0gICAgICBGVF9NZW1Tb3VyY2UqICBsaW1pdCAgPSBidWNrZXQgKyBGVF9NRU1fU09VUkNFX0JVQ0tFVFM7Ci0gICAgICBGVF9NZW1Tb3VyY2UqICBzb3VyY2VzOwotICAgICAgRlRfVUludCAgICAgICAgbm4sIGNvdW50OwotICAgICAgY29uc3QgY2hhciogICAgZm10OwotCi0KLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIGZvciAoIDsgYnVja2V0IDwgbGltaXQ7IGJ1Y2tldCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfTWVtU291cmNlICBzb3VyY2UgPSAqYnVja2V0OwotCi0KLSAgICAgICAgZm9yICggOyBzb3VyY2U7IHNvdXJjZSA9IHNvdXJjZS0+bGluayApCi0gICAgICAgICAgY291bnQrKzsKLSAgICAgIH0KLQotICAgICAgc291cmNlcyA9IChGVF9NZW1Tb3VyY2UqKWZ0X21lbV90YWJsZV9hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBzaXplb2YgKCAqc291cmNlcyApICogY291bnQgKTsKLQotICAgICAgY291bnQgPSAwOwotICAgICAgZm9yICggYnVja2V0ID0gdGFibGUtPnNvdXJjZXM7IGJ1Y2tldCA8IGxpbWl0OyBidWNrZXQrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX01lbVNvdXJjZSAgc291cmNlID0gKmJ1Y2tldDsKLQotCi0gICAgICAgIGZvciAoIDsgc291cmNlOyBzb3VyY2UgPSBzb3VyY2UtPmxpbmsgKQotICAgICAgICAgIHNvdXJjZXNbY291bnQrK10gPSBzb3VyY2U7Ci0gICAgICB9Ci0KLSAgICAgIGZ0X3Fzb3J0KCBzb3VyY2VzLCBjb3VudCwgc2l6ZW9mICggKnNvdXJjZXMgKSwgZnRfbWVtX3NvdXJjZV9jb21wYXJlICk7Ci0KLSAgICAgIHByaW50ZiggIkZyZWVUeXBlIE1lbW9yeSBEdW1wOiAiCi0gICAgICAgICAgICAgICJjdXJyZW50PSVsZCBtYXg9JWxkIHRvdGFsPSVsZCBjb3VudD0lbGRcbiIsCi0gICAgICAgICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50LCB0YWJsZS0+YWxsb2NfbWF4LAotICAgICAgICAgICAgICB0YWJsZS0+YWxsb2NfdG90YWwsIHRhYmxlLT5hbGxvY19jb3VudCApOwotICAgICAgcHJpbnRmKCAiIGJsb2NrICBibG9jayAgICBzaXplcyAgICBzaXplcyAgICBzaXplcyAgIHNvdXJjZVxuIiApOwotICAgICAgcHJpbnRmKCAiIGNvdW50ICAgaGlnaCAgICAgIHN1bSAgaGlnaHN1bSAgICAgIG1heCAgIGxvY2F0aW9uXG4iICk7Ci0gICAgICBwcmludGYoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7Ci0KLSAgICAgIGZtdCA9ICIlNmxkICU2bGQgJThsZCAlOGxkICU4bGQgJXM6JWRcbiI7Ci0KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX01lbVNvdXJjZSAgc291cmNlID0gc291cmNlc1tubl07Ci0KLQotICAgICAgICBwcmludGYoIGZtdCwKLSAgICAgICAgICAgICAgICBzb3VyY2UtPmN1cl9ibG9ja3MsIHNvdXJjZS0+bWF4X2Jsb2NrcywKLSAgICAgICAgICAgICAgICBzb3VyY2UtPmN1cl9zaXplLCBzb3VyY2UtPm1heF9zaXplLCBzb3VyY2UtPmN1cl9tYXgsCi0gICAgICAgICAgICAgICAgRlRfRklMRU5BTUUoIHNvdXJjZS0+ZmlsZV9uYW1lICksCi0gICAgICAgICAgICAgICAgc291cmNlLT5saW5lX25vICk7Ci0gICAgICB9Ci0gICAgICBwcmludGYoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKLQotICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCBzb3VyY2VzICk7Ci0gICAgfQotICB9Ci0KLSNlbHNlICAvKiAhRlRfREVCVUdfTUVNT1JZICovCi0KLSAgLyogQU5TSSBDIGRvZXNuJ3QgbGlrZSBlbXB0eSBzb3VyY2UgZmlsZXMgKi8KLSAgY29uc3QgRlRfQnl0ZSAgX2RlYnVnX21lbV9kdW1teSA9IDA7Ci0KLSNlbmRpZiAvKiAhRlRfREVCVUdfTUVNT1JZICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGRlYnVnLmMgYi9zcmMvYmFzZS9mdGRlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmM4YzIuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRkZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZGVidWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBEZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgY29tcG9uZW50IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDA0LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZSAqLwotICAvKiBkZWJ1Z2dpbmcgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZS4gIEl0cyBtYWluIHB1cnBvc2UgaXMgaW4gYXNzZXJ0aW9uICAgKi8KLSAgLyogY2hlY2tpbmcsIHRyYWNpbmcsIGFuZCBlcnJvciBkZXRlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgbm93IHRocmVlIGRlYnVnZ2luZyBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gdHJhY2UgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFcnJvciBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIGxvZyBmaWxlICh3aGljaCBjYW4gYmUgdGhlICovCi0gIC8qICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBlcnJvciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9ubHkgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gcmVsZWFzZSBtb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBObyBlcnJvciBtZXNzYWdlIGlzIHNlbnQgb3IgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgaXMgZnJlZSBmcm9tIGFueSAgICovCi0gIC8qICAgZGVidWdnaW5nIHBhcnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLQotI2lmIGRlZmluZWQoIEZUX0RFQlVHX0xFVkVMX0VSUk9SICkKLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfTWVzc2FnZSggY29uc3QgY2hhciogIGZtdCwgLi4uICkKLSAgewotICAgIHZhX2xpc3QgIGFwOwotCi0KLSAgICB2YV9zdGFydCggYXAsIGZtdCApOwotICAgIHZmcHJpbnRmKCBzdGRlcnIsIGZtdCwgYXAgKTsKLSAgICB2YV9lbmQoIGFwICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9QYW5pYyggY29uc3QgY2hhciogIGZtdCwgLi4uICkKLSAgewotICAgIHZhX2xpc3QgIGFwOwotCi0KLSAgICB2YV9zdGFydCggYXAsIGZtdCApOwotICAgIHZmcHJpbnRmKCBzdGRlcnIsIGZtdCwgYXAgKTsKLSAgICB2YV9lbmQoIGFwICk7Ci0KLSAgICBleGl0KCBFWElUX0ZBSUxVUkUgKTsKLSAgfQotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLQotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gIC8qIGFycmF5IG9mIHRyYWNlIGxldmVscywgaW5pdGlhbGl6ZWQgdG8gMCAqLwotICBpbnQgIGZ0X3RyYWNlX2xldmVsc1t0cmFjZV9jb3VudF07Ci0KLQotICAvKiBkZWZpbmUgYXJyYXkgb2YgdHJhY2UgdG9nZ2xlIG5hbWVzICovCi0jZGVmaW5lIEZUX1RSQUNFX0RFRiggeCApICAjeCAsCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqICBmdF90cmFjZV90b2dnbGVzW3RyYWNlX2NvdW50ICsgMV0gPQotICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICi0gICAgTlVMTAotICB9OwotCi0jdW5kZWYgRlRfVFJBQ0VfREVGCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQgKQotICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuIHRyYWNlX2NvdW50OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyICogKQotICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKQotICB7Ci0gICAgaW50ICBtYXggPSBGVF9UcmFjZV9HZXRfQ291bnQoKTsKLQotCi0gICAgaWYgKCBpZHggPCBtYXggKQotICAgICAgcmV0dXJuIGZ0X3RyYWNlX3RvZ2dsZXNbaWR4XTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbml0aWFsaXplIHRoZSB0cmFjaW5nIHN1Yi1zeXN0ZW0uICBUaGlzIGlzIGRvbmUgYnkgcmV0cmlldmluZyB0aGUgICAgKi8KLSAgLyogdmFsdWUgb2YgdGhlIGBGVDJfREVCVUcnIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSXQgbXVzdCBiZSBhIGxpc3Qgb2YgICovCi0gIC8qIHRvZ2dsZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGA7Jywgb3IgYCwnLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhwb3J0IEZUMl9ERUJVRz0iYW55OjMgbWVtb3J5Ojcgc3RyZWFtOjUiICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIHJlcXVlc3RzIHRoYXQgYWxsIGxldmVscyBiZSBzZXQgdG8gMywgZXhjZXB0IHRoZSB0cmFjZSBsZXZlbCBmb3IgKi8KLSAgLyogdGhlIG1lbW9yeSBhbmQgc3RyZWFtIGNvbXBvbmVudHMgd2hpY2ggYXJlIHNldCB0byA3IGFuZCA1LCAgICAgICAgICAgICovCi0gIC8qIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2VlIHRoZSBmaWxlIDxpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaD4gZm9yIGRldGFpbHMgb2YgdGhlICovCi0gIC8qIGF2YWlsYWJsZSB0b2dnbGUgbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGxldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA3OyAwIG1lYW5zIHF1aWV0IChleGNlcHQgZm9yIHNlcmlvdXMgICovCi0gIC8qIHJ1bnRpbWUgZXJyb3JzKSwgYW5kIDcgbWVhbnMgX3ZlcnlfIHZlcmJvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKLSAgewotICAgIGNvbnN0IGNoYXIqICBmdDJfZGVidWcgPSBnZXRlbnYoICJGVDJfREVCVUciICk7Ci0KLQotICAgIGlmICggZnQyX2RlYnVnICkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyKiAgcCA9IGZ0Ml9kZWJ1ZzsKLSAgICAgIGNvbnN0IGNoYXIqICBxOwotCi0KLSAgICAgIGZvciAoIDsgKnA7IHArKyApCi0gICAgICB7Ci0gICAgICAgIC8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBzZXBhcmF0b3JzICovCi0gICAgICAgIGlmICggKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnIHx8ICpwID09ICc7JyB8fCAqcCA9PSAnPScgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIHJlYWQgdG9nZ2xlIG5hbWUsIGZvbGxvd2VkIGJ5ICc6JyAqLwotICAgICAgICBxID0gcDsKLSAgICAgICAgd2hpbGUgKCAqcCAmJiAqcCAhPSAnOicgKQotICAgICAgICAgIHArKzsKLQotICAgICAgICBpZiAoICpwID09ICc6JyAmJiBwID4gcSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIG4sIGksIGxlbiA9IChGVF9JbnQpKCBwIC0gcSApOwotICAgICAgICAgIEZUX0ludCAgbGV2ZWwgPSAtMSwgZm91bmQgPSAtMTsKLQotCi0gICAgICAgICAgZm9yICggbiA9IDA7IG4gPCB0cmFjZV9jb3VudDsgbisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiAgdG9nZ2xlID0gZnRfdHJhY2VfdG9nZ2xlc1tuXTsKLQotCi0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCB0b2dnbGVbaV0gIT0gcVtpXSApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggaSA9PSBsZW4gJiYgdG9nZ2xlW2ldID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmb3VuZCA9IG47Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHJlYWQgbGV2ZWwgKi8KLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgaWYgKCAqcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbGV2ZWwgPSAqcCsrIC0gJzAnOwotICAgICAgICAgICAgaWYgKCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA3ICkKLSAgICAgICAgICAgICAgbGV2ZWwgPSAtMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIGZvdW5kID49IDAgJiYgbGV2ZWwgPj0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBmb3VuZCA9PSB0cmFjZV9hbnkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGBhbnknICovCi0gICAgICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdHJhY2VfY291bnQ7IG4rKyApCi0gICAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW25dID0gbGV2ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1tmb3VuZF0gPSBsZXZlbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0jZWxzZSAgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X2RlYnVnX2luaXQoIHZvaWQgKQotICB7Ci0gICAgLyogbm90aGluZyAqLwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfSW50ICkKLSAgRlRfVHJhY2VfR2V0X0NvdW50KCB2b2lkICkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggY29uc3QgY2hhciAqICkKLSAgRlRfVHJhY2VfR2V0X05hbWUoIEZUX0ludCAgaWR4ICkKLSAgewotICAgIEZUX1VOVVNFRCggaWR4ICk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Z2FzcC5jIGIvc3JjL2Jhc2UvZnRnYXNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ODVkMjkuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRnYXNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdhc3AuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgYGdhc3AnIHRhYmxlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfR0FTUF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9JbnQgKQotICBGVF9HZXRfR2FzcCggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgIEZUX1VJbnQgIHBwZW0gKQotICB7Ci0gICAgRlRfSW50ICByZXN1bHQgPSBGVF9HQVNQX05PX1RBQkxFOwotCi0KLSAgICBpZiAoIGZhY2UgJiYgRlRfSVNfU0ZOVCggZmFjZSApICkKLSAgICB7Ci0gICAgICBUVF9GYWNlICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOwotCi0KLSAgICAgIGlmICggdHRmYWNlLT5nYXNwLm51bVJhbmdlcyA+IDAgKQotICAgICAgewotICAgICAgICBUVF9HYXNwUmFuZ2UgIHJhbmdlICAgICA9IHR0ZmFjZS0+Z2FzcC5nYXNwUmFuZ2VzOwotICAgICAgICBUVF9HYXNwUmFuZ2UgIHJhbmdlX2VuZCA9IHJhbmdlICsgdHRmYWNlLT5nYXNwLm51bVJhbmdlczsKLQotCi0gICAgICAgIHdoaWxlICggcHBlbSA+IHJhbmdlLT5tYXhQUEVNICkKLSAgICAgICAgewotICAgICAgICAgIHJhbmdlKys7Ci0gICAgICAgICAgaWYgKCByYW5nZSA+PSByYW5nZV9lbmQgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gcmFuZ2UtPmdhc3BGbGFnOwotCi0gICAgICAgIC8qIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgc3B1cmlvdXMgYml0cyAqLwotICAgICAgICBpZiAoIHR0ZmFjZS0+Z2FzcC52ZXJzaW9uID09IDAgKQotICAgICAgICAgIHJlc3VsdCAmPSAzOwotICAgICAgfQotICAgIH0KLSAgRXhpdDoKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGdsb2Fkci5jIGIvc3JjL2Jhc2UvZnRnbG9hZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1MjYyMS4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdGdsb2Fkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z2xvYWRyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9HTFlQSF9MT0FERVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2dsb2FkZXIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBHIEwgWSBQIEggICBMIE8gQSBEIEUgUiAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBnbHlwaCBsb2FkZXIgaXMgYSBzaW1wbGUgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gbG9hZCBhIHNldCBvZiAgICAqLwotICAvKiBnbHlwaHMgZWFzaWx5LiAgSXQgaXMgY3JpdGljYWwgZm9yIHRoZSBjb3JyZWN0IGxvYWRpbmcgb2YgY29tcG9zaXRlcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElkZWFsbHksIG9uZSBjYW4gc2VlIGl0IGFzIGEgc3RhY2sgb2YgYWJzdHJhY3QgYGdseXBoJyBvYmplY3RzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsb2FkZXIuYmFzZSAgICAgSXMgcmVhbGx5IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLiAgSXQgZGVzY3JpYmVzIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNpbmdsZSBnbHlwaCBpbWFnZSBtYWRlIG9mIHRoZSBqdXh0YXBvc2l0aW9uIG9mICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzZXZlcmFsIGdseXBocyAodGhvc2UgYGluIHRoZSBzdGFjaycpLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbG9hZGVyLmN1cnJlbnQgIERlc2NyaWJlcyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgb24gd2hpY2ggYSBuZXcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBjYW4gYmUgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmV3aW5kICAgICAgICAgIENsZWFycyB0aGUgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFByZXBhcmUgICAgICAgICBTZXQgdXAgYGxvYWRlci5jdXJyZW50JyBmb3IgYWRkaXRpb24gb2YgYSBuZXcgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWRkICAgICAgICAgICAgIEFkZCB0aGUgYGN1cnJlbnQnIGdseXBoIGltYWdlIHRvIHRoZSBgYmFzZScgb25lLCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBhbmQgcHJlcGFyZSBmb3IgYW5vdGhlciBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBnbHlwaCBsb2FkZXIgaXMgbm93IGEgYmFzZSBvYmplY3QuICBFYWNoIGRyaXZlciB1c2VkIHRvICAgICAgICAgICAqLwotICAvKiByZS1pbXBsZW1lbnQgaXQgaW4gb25lIHdheSBvciB0aGUgb3RoZXIsIHdoaWNoIHdhc3RlZCBjb2RlIGFuZCAgICAgICAgKi8KLSAgLyogZW5lcmd5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyBnbHlwaCBsb2FkZXIgKi8KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfTmV3KCBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgKmFsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlcjsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIUZUX05FVyggbG9hZGVyICkgKQotICAgIHsKLSAgICAgIGxvYWRlci0+bWVtb3J5ID0gbWVtb3J5OwotICAgICAgKmFsb2FkZXIgICAgICAgPSBsb2FkZXI7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcmV3aW5kIHRoZSBnbHlwaCBsb2FkZXIgLSByZXNldCBjb3VudGVycyB0byAwICovCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfUmV3aW5kKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICkKLSAgewotICAgIEZUX0dseXBoTG9hZCAgYmFzZSAgICA9ICZsb2FkZXItPmJhc2U7Ci0gICAgRlRfR2x5cGhMb2FkICBjdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudDsKLQotCi0gICAgYmFzZS0+b3V0bGluZS5uX3BvaW50cyAgID0gMDsKLSAgICBiYXNlLT5vdXRsaW5lLm5fY29udG91cnMgPSAwOwotICAgIGJhc2UtPm51bV9zdWJnbHlwaHMgICAgICA9IDA7Ci0KLSAgICAqY3VycmVudCA9ICpiYXNlOwotICB9Ci0KLQotICAvKiByZXNldCB0aGUgZ2x5cGggbG9hZGVyLCBmcmVlcyBhbGwgYWxsb2NhdGVkIHRhYmxlcyAqLwotICAvKiBhbmQgc3RhcnRzIGZyb20gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1Jlc2V0KCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICkKLSAgewotICAgIEZUX01lbW9yeSBtZW1vcnkgPSBsb2FkZXItPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggbG9hZGVyLT5iYXNlLm91dGxpbmUucG9pbnRzICk7Ci0gICAgRlRfRlJFRSggbG9hZGVyLT5iYXNlLm91dGxpbmUudGFncyApOwotICAgIEZUX0ZSRUUoIGxvYWRlci0+YmFzZS5vdXRsaW5lLmNvbnRvdXJzICk7Ci0gICAgRlRfRlJFRSggbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50cyApOwotICAgIEZUX0ZSRUUoIGxvYWRlci0+YmFzZS5zdWJnbHlwaHMgKTsKLQotICAgIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMyID0gTlVMTDsKLQotICAgIGxvYWRlci0+bWF4X3BvaW50cyAgICA9IDA7Ci0gICAgbG9hZGVyLT5tYXhfY29udG91cnMgID0gMDsKLSAgICBsb2FkZXItPm1heF9zdWJnbHlwaHMgPSAwOwotCi0gICAgRlRfR2x5cGhMb2FkZXJfUmV3aW5kKCBsb2FkZXIgKTsKLSAgfQotCi0KLSAgLyogZGVsZXRlIGEgZ2x5cGggbG9hZGVyICovCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfRG9uZSggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBpZiAoIGxvYWRlciApCi0gICAgewotICAgICAgRlRfTWVtb3J5IG1lbW9yeSA9IGxvYWRlci0+bWVtb3J5OwotCi0KLSAgICAgIEZUX0dseXBoTG9hZGVyX1Jlc2V0KCBsb2FkZXIgKTsKLSAgICAgIEZUX0ZSRUUoIGxvYWRlciApOwotICAgIH0KLSAgfQotCi0KLSAgLyogcmUtYWRqdXN0IHRoZSBgY3VycmVudCcgb3V0bGluZSBmaWVsZHMgKi8KLSAgc3RhdGljIHZvaWQKLSAgRlRfR2x5cGhMb2FkZXJfQWRqdXN0X1BvaW50cyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9PdXRsaW5lKiAgYmFzZSAgICA9ICZsb2FkZXItPmJhc2Uub3V0bGluZTsKLSAgICBGVF9PdXRsaW5lKiAgY3VycmVudCA9ICZsb2FkZXItPmN1cnJlbnQub3V0bGluZTsKLQotCi0gICAgY3VycmVudC0+cG9pbnRzICAgPSBiYXNlLT5wb2ludHMgICArIGJhc2UtPm5fcG9pbnRzOwotICAgIGN1cnJlbnQtPnRhZ3MgICAgID0gYmFzZS0+dGFncyAgICAgKyBiYXNlLT5uX3BvaW50czsKLSAgICBjdXJyZW50LT5jb250b3VycyA9IGJhc2UtPmNvbnRvdXJzICsgYmFzZS0+bl9jb250b3VyczsKLQotICAgIC8qIGhhbmRsZSBleHRyYSBwb2ludHMgdGFibGUgLSBpZiBhbnkgKi8KLSAgICBpZiAoIGxvYWRlci0+dXNlX2V4dHJhICkKLSAgICB7Ci0gICAgICBsb2FkZXItPmN1cnJlbnQuZXh0cmFfcG9pbnRzICA9IGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5uX3BvaW50czsKLQotICAgICAgbG9hZGVyLT5jdXJyZW50LmV4dHJhX3BvaW50czIgPSBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPm5fcG9pbnRzOwotICAgIH0KLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ3JlYXRlRXh0cmEoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxvYWRlci0+bWVtb3J5OwotCi0KLSAgICBpZiAoICFGVF9ORVdfQVJSQVkoIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMsIDIgKiBsb2FkZXItPm1heF9wb2ludHMgKSApCi0gICAgewotICAgICAgbG9hZGVyLT51c2VfZXh0cmEgICAgICAgICAgPSAxOwotICAgICAgbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50czIgPSBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5tYXhfcG9pbnRzOwotCi0gICAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfUG9pbnRzKCBsb2FkZXIgKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiByZS1hZGp1c3QgdGhlIGBjdXJyZW50JyBzdWJnbHlwaHMgZmllbGQgKi8KLSAgc3RhdGljIHZvaWQKLSAgRlRfR2x5cGhMb2FkZXJfQWRqdXN0X1N1YmdseXBocyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9HbHlwaExvYWQgIGJhc2UgICAgPSAmbG9hZGVyLT5iYXNlOwotICAgIEZUX0dseXBoTG9hZCAgY3VycmVudCA9ICZsb2FkZXItPmN1cnJlbnQ7Ci0KLQotICAgIGN1cnJlbnQtPnN1YmdseXBocyA9IGJhc2UtPnN1YmdseXBocyArIGJhc2UtPm51bV9zdWJnbHlwaHM7Ci0gIH0KLQotCi0gIC8qIEVuc3VyZSB0aGF0IHdlIGNhbiBhZGQgYG5fcG9pbnRzJyBhbmQgYG5fY29udG91cnMnIHRvIG91ciBnbHlwaC4gICAgICAqLwotICAvKiBUaGlzIGZ1bmN0aW9uIHJlYWxsb2NhdGVzIGl0cyBvdXRsaW5lIHRhYmxlcyBpZiBuZWNlc3NhcnkuICBOb3RlIHRoYXQgKi8KLSAgLyogaXQgRE9FU04nVCBjaGFuZ2UgdGhlIG51bWJlciBvZiBwb2ludHMgd2l0aGluIHRoZSBsb2FkZXIhICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX2NvbnRvdXJzICkKLSAgewotICAgIEZUX01lbW9yeSAgICBtZW1vcnkgID0gbG9hZGVyLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfT3V0bGluZSogIGJhc2UgICAgPSAmbG9hZGVyLT5iYXNlLm91dGxpbmU7Ci0gICAgRlRfT3V0bGluZSogIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0gICAgRlRfQm9vbCAgICAgIGFkanVzdCAgPSAwOwotCi0gICAgRlRfVUludCAgICAgIG5ld19tYXgsIG9sZF9tYXg7Ci0KLQotICAgIC8qIGNoZWNrIHBvaW50cyAmIHRhZ3MgKi8KLSAgICBuZXdfbWF4ID0gYmFzZS0+bl9wb2ludHMgKyBjdXJyZW50LT5uX3BvaW50cyArIG5fcG9pbnRzOwotICAgIG9sZF9tYXggPSBsb2FkZXItPm1heF9wb2ludHM7Ci0KLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDggKTsKLQotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggYmFzZS0+cG9pbnRzLCBvbGRfbWF4LCBuZXdfbWF4ICkgfHwKLSAgICAgICAgICAgRlRfUkVORVdfQVJSQVkoIGJhc2UtPnRhZ3MsICAgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIGxvYWRlci0+dXNlX2V4dHJhICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX21heCAqIDIsIG5ld19tYXggKiAyICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBGVF9BUlJBWV9NT1ZFKCBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzICsgbmV3X21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50cyArIG9sZF9tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgIG9sZF9tYXggKTsKLQotICAgICAgICBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzMiA9IGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMgKyBuZXdfbWF4OwotICAgICAgfQotCi0gICAgICBhZGp1c3QgPSAxOwotICAgICAgbG9hZGVyLT5tYXhfcG9pbnRzID0gbmV3X21heDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBjb250b3VycyAqLwotICAgIG9sZF9tYXggPSBsb2FkZXItPm1heF9jb250b3VyczsKLSAgICBuZXdfbWF4ID0gYmFzZS0+bl9jb250b3VycyArIGN1cnJlbnQtPm5fY29udG91cnMgKwotICAgICAgICAgICAgICBuX2NvbnRvdXJzOwotICAgIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIG5ld19tYXggPSBGVF9QQURfQ0VJTCggbmV3X21heCwgNCApOwotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggYmFzZS0+Y29udG91cnMsIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgYWRqdXN0ID0gMTsKLSAgICAgIGxvYWRlci0+bWF4X2NvbnRvdXJzID0gbmV3X21heDsKLSAgICB9Ci0KLSAgICBpZiAoIGFkanVzdCApCi0gICAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfUG9pbnRzKCBsb2FkZXIgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogRW5zdXJlIHRoYXQgd2UgY2FuIGFkZCBgbl9zdWJnbHlwaHMnIHRvIG91ciBnbHlwaC4gdGhpcyBmdW5jdGlvbiAqLwotICAvKiByZWFsbG9jYXRlcyBpdHMgc3ViZ2x5cGhzIHRhYmxlIGlmIG5lY2Vzc2FyeS4gIE5vdGUgdGhhdCBpdCBET0VTICovCi0gIC8qIE5PVCBjaGFuZ2UgdGhlIG51bWJlciBvZiBzdWJnbHlwaHMgd2l0aGluIHRoZSBsb2FkZXIhICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9DaGVja1N1YkdseXBocyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX3N1YnMgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBsb2FkZXItPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9VSW50ICAgICAgIG5ld19tYXgsIG9sZF9tYXg7Ci0KLSAgICBGVF9HbHlwaExvYWQgIGJhc2UgICAgPSAmbG9hZGVyLT5iYXNlOwotICAgIEZUX0dseXBoTG9hZCAgY3VycmVudCA9ICZsb2FkZXItPmN1cnJlbnQ7Ci0KLQotICAgIG5ld19tYXggPSBiYXNlLT5udW1fc3ViZ2x5cGhzICsgY3VycmVudC0+bnVtX3N1YmdseXBocyArIG5fc3ViczsKLSAgICBvbGRfbWF4ID0gbG9hZGVyLT5tYXhfc3ViZ2x5cGhzOwotICAgIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIG5ld19tYXggPSBGVF9QQURfQ0VJTCggbmV3X21heCwgMiApOwotICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggYmFzZS0+c3ViZ2x5cGhzLCBvbGRfbWF4LCBuZXdfbWF4ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGxvYWRlci0+bWF4X3N1YmdseXBocyA9IG5ld19tYXg7Ci0KLSAgICAgIEZUX0dseXBoTG9hZGVyX0FkanVzdF9TdWJnbHlwaHMoIGxvYWRlciApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcHJlcGFyZSBsb2FkZXIgZm9yIHRoZSBhZGRpdGlvbiBvZiBhIG5ldyBnbHlwaCBvbiB0b3Agb2YgdGhlIGJhc2Ugb25lICovCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfUHJlcGFyZSggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9HbHlwaExvYWQgIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50OwotCi0KLSAgICBjdXJyZW50LT5vdXRsaW5lLm5fcG9pbnRzICAgPSAwOwotICAgIGN1cnJlbnQtPm91dGxpbmUubl9jb250b3VycyA9IDA7Ci0gICAgY3VycmVudC0+bnVtX3N1YmdseXBocyAgICAgID0gMDsKLQotICAgIEZUX0dseXBoTG9hZGVyX0FkanVzdF9Qb2ludHMgICAoIGxvYWRlciApOwotICAgIEZUX0dseXBoTG9hZGVyX0FkanVzdF9TdWJnbHlwaHMoIGxvYWRlciApOwotICB9Ci0KLQotICAvKiBhZGQgY3VycmVudCBnbHlwaCB0byB0aGUgYmFzZSBpbWFnZSAtIGFuZCBwcmVwYXJlIGZvciBhbm90aGVyICovCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfQWRkKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICkKLSAgewotICAgIEZUX0dseXBoTG9hZCAgYmFzZTsKLSAgICBGVF9HbHlwaExvYWQgIGN1cnJlbnQ7Ci0KLSAgICBGVF9VSW50ICAgICAgIG5fY3Vycl9jb250b3VyczsKLSAgICBGVF9VSW50ICAgICAgIG5fYmFzZV9wb2ludHM7Ci0gICAgRlRfVUludCAgICAgICBuOwotCi0KLSAgICBpZiAoICFsb2FkZXIgKQotICAgICAgcmV0dXJuOwotCi0gICAgYmFzZSAgICA9ICZsb2FkZXItPmJhc2U7Ci0gICAgY3VycmVudCA9ICZsb2FkZXItPmN1cnJlbnQ7Ci0KLSAgICBuX2N1cnJfY29udG91cnMgPSBjdXJyZW50LT5vdXRsaW5lLm5fY29udG91cnM7Ci0gICAgbl9iYXNlX3BvaW50cyAgID0gYmFzZS0+b3V0bGluZS5uX3BvaW50czsKLQotICAgIGJhc2UtPm91dGxpbmUubl9wb2ludHMgPQotICAgICAgKHNob3J0KSggYmFzZS0+b3V0bGluZS5uX3BvaW50cyArIGN1cnJlbnQtPm91dGxpbmUubl9wb2ludHMgKTsKLSAgICBiYXNlLT5vdXRsaW5lLm5fY29udG91cnMgPQotICAgICAgKHNob3J0KSggYmFzZS0+b3V0bGluZS5uX2NvbnRvdXJzICsgY3VycmVudC0+b3V0bGluZS5uX2NvbnRvdXJzICk7Ci0KLSAgICBiYXNlLT5udW1fc3ViZ2x5cGhzICs9IGN1cnJlbnQtPm51bV9zdWJnbHlwaHM7Ci0KLSAgICAvKiBhZGp1c3QgY29udG91cnMgY291bnQgaW4gbmV3ZXN0IG91dGxpbmUgKi8KLSAgICBmb3IgKCBuID0gMDsgbiA8IG5fY3Vycl9jb250b3VyczsgbisrICkKLSAgICAgIGN1cnJlbnQtPm91dGxpbmUuY29udG91cnNbbl0gPQotICAgICAgICAoc2hvcnQpKCBjdXJyZW50LT5vdXRsaW5lLmNvbnRvdXJzW25dICsgbl9iYXNlX3BvaW50cyApOwotCi0gICAgLyogcHJlcGFyZSBmb3IgYW5vdGhlciBuZXcgZ2x5cGggaW1hZ2UgKi8KLSAgICBGVF9HbHlwaExvYWRlcl9QcmVwYXJlKCBsb2FkZXIgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ29weVBvaW50cyggRlRfR2x5cGhMb2FkZXIgIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhMb2FkZXIgIHNvdXJjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgRlRfVUludCAgIG51bV9wb2ludHMgICA9IHNvdXJjZS0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOwotICAgIEZUX1VJbnQgICBudW1fY29udG91cnMgPSBzb3VyY2UtPmJhc2Uub3V0bGluZS5uX2NvbnRvdXJzOwotCi0KLSAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NoZWNrUG9pbnRzKCB0YXJnZXQsIG51bV9wb2ludHMsIG51bV9jb250b3VycyApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBGVF9PdXRsaW5lKiAgb3V0ID0gJnRhcmdldC0+YmFzZS5vdXRsaW5lOwotICAgICAgRlRfT3V0bGluZSogIGluICA9ICZzb3VyY2UtPmJhc2Uub3V0bGluZTsKLQotCi0gICAgICBGVF9BUlJBWV9DT1BZKCBvdXQtPnBvaW50cywgaW4tPnBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMgKTsKLSAgICAgIEZUX0FSUkFZX0NPUFkoIG91dC0+dGFncywgaW4tPnRhZ3MsCi0gICAgICAgICAgICAgICAgICAgICBudW1fcG9pbnRzICk7Ci0gICAgICBGVF9BUlJBWV9DT1BZKCBvdXQtPmNvbnRvdXJzLCBpbi0+Y29udG91cnMsCi0gICAgICAgICAgICAgICAgICAgICBudW1fY29udG91cnMgKTsKLQotICAgICAgLyogZG8gd2UgbmVlZCB0byBjb3B5IHRoZSBleHRyYSBwb2ludHM/ICovCi0gICAgICBpZiAoIHRhcmdldC0+dXNlX2V4dHJhICYmIHNvdXJjZS0+dXNlX2V4dHJhICkKLSAgICAgIHsKLSAgICAgICAgRlRfQVJSQVlfQ09QWSggdGFyZ2V0LT5iYXNlLmV4dHJhX3BvaW50cywgc291cmNlLT5iYXNlLmV4dHJhX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cyApOwotICAgICAgICBGVF9BUlJBWV9DT1BZKCB0YXJnZXQtPmJhc2UuZXh0cmFfcG9pbnRzMiwgc291cmNlLT5iYXNlLmV4dHJhX3BvaW50czIsCi0gICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMgKTsKLSAgICAgIH0KLQotICAgICAgb3V0LT5uX3BvaW50cyAgID0gKHNob3J0KW51bV9wb2ludHM7Ci0gICAgICBvdXQtPm5fY29udG91cnMgPSAoc2hvcnQpbnVtX2NvbnRvdXJzOwotCi0gICAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfUG9pbnRzKCB0YXJnZXQgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Z2x5cGguYyBiL3NyYy9iYXNlL2Z0Z2x5cGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwZTc5Zi4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdGdseXBoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnbHlwaC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBoYW5kbGUgZ2x5cGhzIChib2R5KS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2Ygc2V2ZXJhbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgICAqLwotICAvKiAgdGhhdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgYXBwbGljYXRpb25zIHRvIGVhc2lseSByZXRyaWV2ZSBnbHlwaCAgICAgKi8KLSAgLyogIGJpdG1hcHMgYW5kIG91dGxpbmVzIGZyb20gYSBnaXZlbiBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBvcHRpb25hbCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBmb250IHNlcnZlciAgKi8KLSAgLyogIG9yIHRleHQgbGF5b3V0IGVuZ2luZSBvbiB0b3Agb2YgRnJlZVR5cGUuICBIb3dldmVyLCB0aGV5IGFyZSBwcmV0dHkgICovCi0gIC8qICBoYW5keSBmb3IgbWFueSBvdGhlciBzaW1wbGUgdXNlcyBvZiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9HTFlQSF9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0JJVE1BUF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2dseXBoCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgIENvbnZlbmllbmNlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX01hdHJpeF9NdWx0aXBseSggY29uc3QgRlRfTWF0cml4KiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXggICAgICAgICpiICkKLSAgewotICAgIEZUX0ZpeGVkICB4eCwgeHksIHl4LCB5eTsKLQotCi0gICAgaWYgKCAhYSB8fCAhYiApCi0gICAgICByZXR1cm47Ci0KLSAgICB4eCA9IEZUX011bEZpeCggYS0+eHgsIGItPnh4ICkgKyBGVF9NdWxGaXgoIGEtPnh5LCBiLT55eCApOwotICAgIHh5ID0gRlRfTXVsRml4KCBhLT54eCwgYi0+eHkgKSArIEZUX011bEZpeCggYS0+eHksIGItPnl5ICk7Ci0gICAgeXggPSBGVF9NdWxGaXgoIGEtPnl4LCBiLT54eCApICsgRlRfTXVsRml4KCBhLT55eSwgYi0+eXggKTsKLSAgICB5eSA9IEZUX011bEZpeCggYS0+eXgsIGItPnh5ICkgKyBGVF9NdWxGaXgoIGEtPnl5LCBiLT55eSApOwotCi0gICAgYi0+eHggPSB4eDsgIGItPnh5ID0geHk7Ci0gICAgYi0+eXggPSB5eDsgIGItPnl5ID0geXk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9NYXRyaXhfSW52ZXJ0KCBGVF9NYXRyaXgqICBtYXRyaXggKQotICB7Ci0gICAgRlRfUG9zICBkZWx0YSwgeHgsIHl5OwotCi0KLSAgICBpZiAoICFtYXRyaXggKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgLyogY29tcHV0ZSBkaXNjcmltaW5hbnQgKi8KLSAgICBkZWx0YSA9IEZUX011bEZpeCggbWF0cml4LT54eCwgbWF0cml4LT55eSApIC0KLSAgICAgICAgICAgIEZUX011bEZpeCggbWF0cml4LT54eSwgbWF0cml4LT55eCApOwotCi0gICAgaWYgKCAhZGVsdGEgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OyAgLyogbWF0cml4IGNhbid0IGJlIGludmVydGVkICovCi0KLSAgICBtYXRyaXgtPnh5ID0gLSBGVF9EaXZGaXgoIG1hdHJpeC0+eHksIGRlbHRhICk7Ci0gICAgbWF0cml4LT55eCA9IC0gRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCBkZWx0YSApOwotCi0gICAgeHggPSBtYXRyaXgtPnh4OwotICAgIHl5ID0gbWF0cml4LT55eTsKLQotICAgIG1hdHJpeC0+eHggPSBGVF9EaXZGaXgoIHl5LCBkZWx0YSApOwotICAgIG1hdHJpeC0+eXkgPSBGVF9EaXZGaXgoIHh4LCBkZWx0YSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICBGVF9CaXRtYXBHbHlwaCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGZ0X2JpdG1hcF9nbHlwaF9pbml0KCBGVF9HbHlwaCAgICAgIGJpdG1hcF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBGVF9CaXRtYXBHbHlwaCAgZ2x5cGggICA9IChGVF9CaXRtYXBHbHlwaCliaXRtYXBfZ2x5cGg7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgPSBGVF9HTFlQSCggZ2x5cGggKS0+bGlicmFyeTsKLQotCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9HbHlwaF9Gb3JtYXQ7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZ2x5cGgtPmxlZnQgPSBzbG90LT5iaXRtYXBfbGVmdDsKLSAgICBnbHlwaC0+dG9wICA9IHNsb3QtPmJpdG1hcF90b3A7Ci0KLSAgICAvKiBkbyBsYXp5IGNvcHlpbmcgd2hlbmV2ZXIgcG9zc2libGUgKi8KLSAgICBpZiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKQotICAgIHsKLSAgICAgIGdseXBoLT5iaXRtYXAgPSBzbG90LT5iaXRtYXA7Ci0gICAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJj0gfkZUX0dMWVBIX09XTl9CSVRNQVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9CaXRtYXBfTmV3KCAmZ2x5cGgtPmJpdG1hcCApOwotICAgICAgZXJyb3IgPSBGVF9CaXRtYXBfQ29weSggbGlicmFyeSwgJnNsb3QtPmJpdG1hcCwgJmdseXBoLT5iaXRtYXAgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdF9iaXRtYXBfZ2x5cGhfY29weSggRlRfR2x5cGggIGJpdG1hcF9zb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgYml0bWFwX3RhcmdldCApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSA9IGJpdG1hcF9zb3VyY2UtPmxpYnJhcnk7Ci0gICAgRlRfQml0bWFwR2x5cGggIHNvdXJjZSAgPSAoRlRfQml0bWFwR2x5cGgpYml0bWFwX3NvdXJjZTsKLSAgICBGVF9CaXRtYXBHbHlwaCAgdGFyZ2V0ICA9IChGVF9CaXRtYXBHbHlwaCliaXRtYXBfdGFyZ2V0OwotCi0KLSAgICB0YXJnZXQtPmxlZnQgPSBzb3VyY2UtPmxlZnQ7Ci0gICAgdGFyZ2V0LT50b3AgID0gc291cmNlLT50b3A7Ci0KLSAgICByZXR1cm4gRlRfQml0bWFwX0NvcHkoIGxpYnJhcnksICZzb3VyY2UtPmJpdG1hcCwgJnRhcmdldC0+Yml0bWFwICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X2JpdG1hcF9nbHlwaF9kb25lKCBGVF9HbHlwaCAgYml0bWFwX2dseXBoICkKLSAgewotICAgIEZUX0JpdG1hcEdseXBoICBnbHlwaCAgID0gKEZUX0JpdG1hcEdseXBoKWJpdG1hcF9nbHlwaDsKLSAgICBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSA9IEZUX0dMWVBIKCBnbHlwaCApLT5saWJyYXJ5OwotCi0KLSAgICBGVF9CaXRtYXBfRG9uZSggbGlicmFyeSwgJmdseXBoLT5iaXRtYXAgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfYml0bWFwX2dseXBoX2Jib3goIEZUX0dseXBoICBiaXRtYXBfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94KiAgY2JveCApCi0gIHsKLSAgICBGVF9CaXRtYXBHbHlwaCAgZ2x5cGggPSAoRlRfQml0bWFwR2x5cGgpYml0bWFwX2dseXBoOwotCi0KLSAgICBjYm94LT54TWluID0gZ2x5cGgtPmxlZnQgPDwgNjsKLSAgICBjYm94LT54TWF4ID0gY2JveC0+eE1pbiArICggZ2x5cGgtPmJpdG1hcC53aWR0aCA8PCA2ICk7Ci0gICAgY2JveC0+eU1heCA9IGdseXBoLT50b3AgPDwgNjsKLSAgICBjYm94LT55TWluID0gY2JveC0+eU1heCAtICggZ2x5cGgtPmJpdG1hcC5yb3dzIDw8IDYgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX0dseXBoX0NsYXNzICBmdF9iaXRtYXBfZ2x5cGhfY2xhc3MgPQotICB7Ci0gICAgc2l6ZW9mICggRlRfQml0bWFwR2x5cGhSZWMgKSwKLSAgICBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLAotCi0gICAgZnRfYml0bWFwX2dseXBoX2luaXQsCi0gICAgZnRfYml0bWFwX2dseXBoX2RvbmUsCi0gICAgZnRfYml0bWFwX2dseXBoX2NvcHksCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0dseXBoX1RyYW5zZm9ybUZ1bmMgKi8KLSAgICBmdF9iaXRtYXBfZ2x5cGhfYmJveCwKLSAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfR2x5cGhfUHJlcGFyZUZ1bmMgICAqLwotICB9OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICBGVF9PdXRsaW5lR2x5cGggc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgZnRfb3V0bGluZV9nbHlwaF9pbml0KCBGVF9HbHlwaCAgICAgIG91dGxpbmVfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIEZUX091dGxpbmVHbHlwaCAgZ2x5cGggICA9IChGVF9PdXRsaW5lR2x5cGgpb3V0bGluZV9nbHlwaDsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5ID0gRlRfR0xZUEgoIGdseXBoICktPmxpYnJhcnk7Ci0gICAgRlRfT3V0bGluZSogICAgICBzb3VyY2UgID0gJnNsb3QtPm91dGxpbmU7Ci0gICAgRlRfT3V0bGluZSogICAgICB0YXJnZXQgID0gJmdseXBoLT5vdXRsaW5lOwotCi0KLSAgICAvKiBjaGVjayBmb3JtYXQgaW4gZ2x5cGggc2xvdCAqLwotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0dseXBoX0Zvcm1hdDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBuZXcgb3V0bGluZSAqLwotICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGxpYnJhcnksIHNvdXJjZS0+bl9wb2ludHMsIHNvdXJjZS0+bl9jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgtPm91dGxpbmUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX091dGxpbmVfQ29weSggc291cmNlLCB0YXJnZXQgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfb3V0bGluZV9nbHlwaF9kb25lKCBGVF9HbHlwaCAgb3V0bGluZV9nbHlwaCApCi0gIHsKLSAgICBGVF9PdXRsaW5lR2x5cGggIGdseXBoID0gKEZUX091dGxpbmVHbHlwaClvdXRsaW5lX2dseXBoOwotCi0KLSAgICBGVF9PdXRsaW5lX0RvbmUoIEZUX0dMWVBIKCBnbHlwaCApLT5saWJyYXJ5LCAmZ2x5cGgtPm91dGxpbmUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGZ0X291dGxpbmVfZ2x5cGhfY29weSggRlRfR2x5cGggIG91dGxpbmVfc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoICBvdXRsaW5lX3RhcmdldCApCi0gIHsKLSAgICBGVF9PdXRsaW5lR2x5cGggIHNvdXJjZSAgPSAoRlRfT3V0bGluZUdseXBoKW91dGxpbmVfc291cmNlOwotICAgIEZUX091dGxpbmVHbHlwaCAgdGFyZ2V0ICA9IChGVF9PdXRsaW5lR2x5cGgpb3V0bGluZV90YXJnZXQ7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnkgPSBGVF9HTFlQSCggc291cmNlICktPmxpYnJhcnk7Ci0KLQotICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGxpYnJhcnksIHNvdXJjZS0+b3V0bGluZS5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPm91dGxpbmUubl9jb250b3VycywgJnRhcmdldC0+b3V0bGluZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgIEZUX091dGxpbmVfQ29weSggJnNvdXJjZS0+b3V0bGluZSwgJnRhcmdldC0+b3V0bGluZSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9vdXRsaW5lX2dseXBoX3RyYW5zZm9ybSggRlRfR2x5cGggICAgICAgICAgb3V0bGluZV9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIGRlbHRhICkKLSAgewotICAgIEZUX091dGxpbmVHbHlwaCAgZ2x5cGggPSAoRlRfT3V0bGluZUdseXBoKW91dGxpbmVfZ2x5cGg7Ci0KLQotICAgIGlmICggbWF0cml4ICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmZ2x5cGgtPm91dGxpbmUsIG1hdHJpeCApOwotCi0gICAgaWYgKCBkZWx0YSApCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggJmdseXBoLT5vdXRsaW5lLCBkZWx0YS0+eCwgZGVsdGEtPnkgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfb3V0bGluZV9nbHlwaF9iYm94KCBGVF9HbHlwaCAgb3V0bGluZV9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94KiAgYmJveCApCi0gIHsKLSAgICBGVF9PdXRsaW5lR2x5cGggIGdseXBoID0gKEZUX091dGxpbmVHbHlwaClvdXRsaW5lX2dseXBoOwotCi0KLSAgICBGVF9PdXRsaW5lX0dldF9DQm94KCAmZ2x5cGgtPm91dGxpbmUsIGJib3ggKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGZ0X291dGxpbmVfZ2x5cGhfcHJlcGFyZSggRlRfR2x5cGggICAgICBvdXRsaW5lX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBGVF9PdXRsaW5lR2x5cGggIGdseXBoID0gKEZUX091dGxpbmVHbHlwaClvdXRsaW5lX2dseXBoOwotCi0KLSAgICBzbG90LT5mb3JtYXQgICAgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotICAgIHNsb3QtPm91dGxpbmUgICAgICAgID0gZ2x5cGgtPm91dGxpbmU7Ci0gICAgc2xvdC0+b3V0bGluZS5mbGFncyAmPSB+RlRfT1VUTElORV9PV05FUjsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9HbHlwaF9DbGFzcyAgZnRfb3V0bGluZV9nbHlwaF9jbGFzcyA9Ci0gIHsKLSAgICBzaXplb2YgKCBGVF9PdXRsaW5lR2x5cGhSZWMgKSwKLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIGZ0X291dGxpbmVfZ2x5cGhfaW5pdCwKLSAgICBmdF9vdXRsaW5lX2dseXBoX2RvbmUsCi0gICAgZnRfb3V0bGluZV9nbHlwaF9jb3B5LAotICAgIGZ0X291dGxpbmVfZ2x5cGhfdHJhbnNmb3JtLAotICAgIGZ0X291dGxpbmVfZ2x5cGhfYmJveCwKLSAgICBmdF9vdXRsaW5lX2dseXBoX3ByZXBhcmUKLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgRlRfR2x5cGggY2xhc3MgYW5kIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICBzdGF0aWMgRlRfRXJyb3IKLSAgIGZ0X25ld19nbHlwaCggRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6LAotICAgICAgICAgICAgICAgICBGVF9HbHlwaCogICAgICAgICAgICAgIGFnbHlwaCApCi0gICB7Ci0gICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICBGVF9HbHlwaCAgIGdseXBoOwotCi0KLSAgICAgKmFnbHlwaCA9IDA7Ci0KLSAgICAgaWYgKCAhRlRfQUxMT0MoIGdseXBoLCBjbGF6ei0+Z2x5cGhfc2l6ZSApICkKLSAgICAgewotICAgICAgIGdseXBoLT5saWJyYXJ5ID0gbGlicmFyeTsKLSAgICAgICBnbHlwaC0+Y2xhenogICA9IGNsYXp6OwotICAgICAgIGdseXBoLT5mb3JtYXQgID0gY2xhenotPmdseXBoX2Zvcm1hdDsKLQotICAgICAgICphZ2x5cGggPSBnbHlwaDsKLSAgICAgfQotCi0gICAgIHJldHVybiBlcnJvcjsKLSAgIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9Db3B5KCBGVF9HbHlwaCAgIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgRlRfR2x5cGggICp0YXJnZXQgKQotICB7Ci0gICAgRlRfR2x5cGggICAgICAgICAgICAgICBjb3B5OwotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6ejsKLQotCi0gICAgLyogY2hlY2sgYXJndW1lbnRzICovCi0gICAgaWYgKCAhdGFyZ2V0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgICp0YXJnZXQgPSAwOwotCi0gICAgaWYgKCAhc291cmNlIHx8ICFzb3VyY2UtPmNsYXp6ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGNsYXp6ID0gc291cmNlLT5jbGF6ejsKLSAgICBlcnJvciA9IGZ0X25ld19nbHlwaCggc291cmNlLT5saWJyYXJ5LCBjbGF6eiwgJmNvcHkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGNvcHktPmFkdmFuY2UgPSBzb3VyY2UtPmFkdmFuY2U7Ci0gICAgY29weS0+Zm9ybWF0ICA9IHNvdXJjZS0+Zm9ybWF0OwotCi0gICAgaWYgKCBjbGF6ei0+Z2x5cGhfY29weSApCi0gICAgICBlcnJvciA9IGNsYXp6LT5nbHlwaF9jb3B5KCBzb3VyY2UsIGNvcHkgKTsKLQotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfRG9uZV9HbHlwaCggY29weSApOwotICAgIGVsc2UKLSAgICAgICp0YXJnZXQgPSBjb3B5OwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z2x5cGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0dseXBoKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICphZ2x5cGggKQotICB7Ci0gICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9HbHlwaCAgICBnbHlwaDsKLQotICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgY2xhenogPSAwOwotCi0KLSAgICBpZiAoICFzbG90ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TbG90X0hhbmRsZTsKLQotICAgIGxpYnJhcnkgPSBzbG90LT5saWJyYXJ5OwotCi0gICAgaWYgKCAhYWdseXBoICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIC8qIGlmIGl0IGlzIGEgYml0bWFwLCB0aGF0J3MgZWFzeSA6LSkgKi8KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICkKLSAgICAgIGNsYXp6ID0gJmZ0X2JpdG1hcF9nbHlwaF9jbGFzczsKLQotICAgIC8qIGl0IGl0IGlzIGFuIG91dGxpbmUgdG9vICovCi0gICAgZWxzZSBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICBjbGF6eiA9ICZmdF9vdXRsaW5lX2dseXBoX2NsYXNzOwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHRyeSB0byBmaW5kIGEgcmVuZGVyZXIgdGhhdCBzdXBwb3J0cyB0aGUgZ2x5cGggaW1hZ2UgZm9ybWF0ICovCi0gICAgICBGVF9SZW5kZXJlciAgcmVuZGVyID0gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBzbG90LT5mb3JtYXQsIDAgKTsKLQotCi0gICAgICBpZiAoIHJlbmRlciApCi0gICAgICAgIGNsYXp6ID0gJnJlbmRlci0+Z2x5cGhfY2xhc3M7Ci0gICAgfQotCi0gICAgaWYgKCAhY2xhenogKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfR2x5cGhfRm9ybWF0OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGNyZWF0ZSBGVF9HbHlwaCBvYmplY3QgKi8KLSAgICBlcnJvciA9IGZ0X25ld19nbHlwaCggbGlicmFyeSwgY2xhenosICZnbHlwaCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY29weSBhZHZhbmNlIHdoaWxlIGNvbnZlcnRpbmcgaXQgdG8gMTYuMTYgZm9ybWF0ICovCi0gICAgZ2x5cGgtPmFkdmFuY2UueCA9IHNsb3QtPmFkdmFuY2UueCA8PCAxMDsKLSAgICBnbHlwaC0+YWR2YW5jZS55ID0gc2xvdC0+YWR2YW5jZS55IDw8IDEwOwotCi0gICAgLyogbm93IGltcG9ydCB0aGUgaW1hZ2UgZnJvbSB0aGUgZ2x5cGggc2xvdCAqLwotICAgIGVycm9yID0gY2xhenotPmdseXBoX2luaXQoIGdseXBoLCBzbG90ICk7Ci0KLSAgICAvKiBpZiBhbiBlcnJvciBvY2N1cnJlZCwgZGVzdHJveSB0aGUgZ2x5cGggKi8KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7Ci0gICAgZWxzZQotICAgICAgKmFnbHlwaCA9IGdseXBoOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z2x5cGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhfVHJhbnNmb3JtKCBGVF9HbHlwaCAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgZGVsdGEgKQotICB7Ci0gICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6ejsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFnbHlwaCB8fCAhZ2x5cGgtPmNsYXp6ICkKLSAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNsYXp6ID0gZ2x5cGgtPmNsYXp6OwotICAgICAgaWYgKCBjbGF6ei0+Z2x5cGhfdHJhbnNmb3JtICkKLSAgICAgIHsKLSAgICAgICAgLyogdHJhbnNmb3JtIGdseXBoIGltYWdlICovCi0gICAgICAgIGNsYXp6LT5nbHlwaF90cmFuc2Zvcm0oIGdseXBoLCBtYXRyaXgsIGRlbHRhICk7Ci0KLSAgICAgICAgLyogdHJhbnNmb3JtIGFkdmFuY2UgdmVjdG9yICovCi0gICAgICAgIGlmICggbWF0cml4ICkKLSAgICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtKCAmZ2x5cGgtPmFkdmFuY2UsIG1hdHJpeCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0dseXBoX0Zvcm1hdDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z2x5cGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9HbHlwaF9HZXRfQ0JveCggRlRfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGJib3hfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICphY2JveCApCi0gIHsKLSAgICBjb25zdCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6OwotCi0KLSAgICBpZiAoICFhY2JveCApCi0gICAgICByZXR1cm47Ci0KLSAgICBhY2JveC0+eE1pbiA9IGFjYm94LT55TWluID0gYWNib3gtPnhNYXggPSBhY2JveC0+eU1heCA9IDA7Ci0KLSAgICBpZiAoICFnbHlwaCB8fCAhZ2x5cGgtPmNsYXp6ICkKLSAgICAgIHJldHVybjsKLSAgICBlbHNlCi0gICAgewotICAgICAgY2xhenogPSBnbHlwaC0+Y2xheno7Ci0gICAgICBpZiAoICFjbGF6ei0+Z2x5cGhfYmJveCApCi0gICAgICAgIHJldHVybjsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogcmV0cmlldmUgYmJveCBpbiAyNi42IGNvb3JkaW5hdGVzICovCi0gICAgICAgIGNsYXp6LT5nbHlwaF9iYm94KCBnbHlwaCwgYWNib3ggKTsKLQotICAgICAgICAvKiBwZXJmb3JtIGdyaWQgZml0dGluZyBpZiBuZWVkZWQgKi8KLSAgICAgICAgaWYgKCBiYm94X21vZGUgPT0gRlRfR0xZUEhfQkJPWF9HUklERklUIHx8Ci0gICAgICAgICAgICAgYmJveF9tb2RlID09IEZUX0dMWVBIX0JCT1hfUElYRUxTICApCi0gICAgICAgIHsKLSAgICAgICAgICBhY2JveC0+eE1pbiA9IEZUX1BJWF9GTE9PUiggYWNib3gtPnhNaW4gKTsKLSAgICAgICAgICBhY2JveC0+eU1pbiA9IEZUX1BJWF9GTE9PUiggYWNib3gtPnlNaW4gKTsKLSAgICAgICAgICBhY2JveC0+eE1heCA9IEZUX1BJWF9DRUlMKCBhY2JveC0+eE1heCApOwotICAgICAgICAgIGFjYm94LT55TWF4ID0gRlRfUElYX0NFSUwoIGFjYm94LT55TWF4ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjb252ZXJ0IHRvIGludGVnZXIgcGl4ZWxzIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiAoIGJib3hfbW9kZSA9PSBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFIHx8Ci0gICAgICAgICAgICAgYmJveF9tb2RlID09IEZUX0dMWVBIX0JCT1hfUElYRUxTICAgKQotICAgICAgICB7Ci0gICAgICAgICAgYWNib3gtPnhNaW4gPj49IDY7Ci0gICAgICAgICAgYWNib3gtPnlNaW4gPj49IDY7Ci0gICAgICAgICAgYWNib3gtPnhNYXggPj49IDY7Ci0gICAgICAgICAgYWNib3gtPnlNYXggPj49IDY7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z2x5cGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhfVG9fQml0bWFwKCBGVF9HbHlwaCogICAgICAgdGhlX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZXN0cm95ICkKLSAgewotICAgIEZUX0dseXBoU2xvdFJlYyAgICAgICAgICAgZHVtbXk7Ci0gICAgRlRfR2x5cGhTbG90X0ludGVybmFsUmVjICBkdW1teV9pbnRlcm5hbDsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0dseXBoICAgICAgICAgICAgICAgICAgZ2x5cGg7Ci0gICAgRlRfQml0bWFwR2x5cGggICAgICAgICAgICBiaXRtYXAgPSBOVUxMOwotCi0gICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICAgICBjbGF6ejsKLQotCi0gICAgLyogY2hlY2sgYXJndW1lbnQgKi8KLSAgICBpZiAoICF0aGVfZ2x5cGggKQotICAgICAgZ290byBCYWQ7Ci0KLSAgICAvKiB3ZSByZW5kZXIgdGhlIGdseXBoIGludG8gYSBnbHlwaCBiaXRtYXAgdXNpbmcgYSBgZHVtbXknIGdseXBoIHNsb3QgKi8KLSAgICAvKiB0aGVuIGNhbGxpbmcgRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGdseXBoID0gKnRoZV9nbHlwaDsKLSAgICBpZiAoICFnbHlwaCApCi0gICAgICBnb3RvIEJhZDsKLQotICAgIGNsYXp6ID0gZ2x5cGgtPmNsYXp6OwotCi0gICAgLyogd2hlbiBjYWxsZWQgd2l0aCBhIGJpdG1hcCBnbHlwaCwgZG8gbm90aGluZyBhbmQgcmV0dXJuIHN1Y2Nlc3NmdWxseSAqLwotICAgIGlmICggY2xhenogPT0gJmZ0X2JpdG1hcF9nbHlwaF9jbGFzcyApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoICFjbGF6eiB8fCAhY2xhenotPmdseXBoX3ByZXBhcmUgKQotICAgICAgZ290byBCYWQ7Ci0KLSAgICBGVF9NRU1fWkVSTyggJmR1bW15LCBzaXplb2YgKCBkdW1teSApICk7Ci0gICAgRlRfTUVNX1pFUk8oICZkdW1teV9pbnRlcm5hbCwgc2l6ZW9mICggZHVtbXlfaW50ZXJuYWwgKSApOwotICAgIGR1bW15LmludGVybmFsID0gJmR1bW15X2ludGVybmFsOwotICAgIGR1bW15LmxpYnJhcnkgID0gZ2x5cGgtPmxpYnJhcnk7Ci0gICAgZHVtbXkuZm9ybWF0ICAgPSBjbGF6ei0+Z2x5cGhfZm9ybWF0OwotCi0gICAgLyogY3JlYXRlIHJlc3VsdCBiaXRtYXAgZ2x5cGggKi8KLSAgICBlcnJvciA9IGZ0X25ld19nbHlwaCggZ2x5cGgtPmxpYnJhcnksICZmdF9iaXRtYXBfZ2x5cGhfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9HbHlwaCopKHZvaWQqKSZiaXRtYXAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotI2lmIDEKLSAgICAvKiBpZiBgb3JpZ2luJyBpcyBzZXQsIHRyYW5zbGF0ZSB0aGUgZ2x5cGggaW1hZ2UgKi8KLSAgICBpZiAoIG9yaWdpbiApCi0gICAgICBGVF9HbHlwaF9UcmFuc2Zvcm0oIGdseXBoLCAwLCBvcmlnaW4gKTsKLSNlbHNlCi0gICAgRlRfVU5VU0VEKCBvcmlnaW4gKTsKLSNlbmRpZgotCi0gICAgLyogcHJlcGFyZSBkdW1teSBzbG90IGZvciByZW5kZXJpbmcgKi8KLSAgICBlcnJvciA9IGNsYXp6LT5nbHlwaF9wcmVwYXJlKCBnbHlwaCwgJmR1bW15ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgZXJyb3IgPSBGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwoIGdseXBoLT5saWJyYXJ5LCAmZHVtbXksIHJlbmRlcl9tb2RlICk7Ci0KLSNpZiAxCi0gICAgaWYgKCAhZGVzdHJveSAmJiBvcmlnaW4gKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgICB2LnggPSAtb3JpZ2luLT54OwotICAgICAgdi55ID0gLW9yaWdpbi0+eTsKLSAgICAgIEZUX0dseXBoX1RyYW5zZm9ybSggZ2x5cGgsIDAsICZ2ICk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGluIGNhc2Ugb2Ygc3VjY2VzcywgY29weSB0aGUgYml0bWFwIHRvIHRoZSBnbHlwaCBiaXRtYXAgKi8KLSAgICBlcnJvciA9IGZ0X2JpdG1hcF9nbHlwaF9pbml0KCAoRlRfR2x5cGgpYml0bWFwLCAmZHVtbXkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNvcHkgYWR2YW5jZSAqLwotICAgIGJpdG1hcC0+cm9vdC5hZHZhbmNlID0gZ2x5cGgtPmFkdmFuY2U7Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggZ2x5cGggKTsKLQotICAgICp0aGVfZ2x5cGggPSBGVF9HTFlQSCggYml0bWFwICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICYmIGJpdG1hcCApCi0gICAgICBGVF9Eb25lX0dseXBoKCBGVF9HTFlQSCggYml0bWFwICkgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLQotICBCYWQ6Ci0gICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0RvbmVfR2x5cGgoIEZUX0dseXBoICBnbHlwaCApCi0gIHsKLSAgICBpZiAoIGdseXBoICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgICAgICAgICAgICAgIG1lbW9yeSA9IGdseXBoLT5saWJyYXJ5LT5tZW1vcnk7Ci0gICAgICBjb25zdCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6ICA9IGdseXBoLT5jbGF6ejsKLQotCi0gICAgICBpZiAoIGNsYXp6LT5nbHlwaF9kb25lICkKLSAgICAgICAgY2xhenotPmdseXBoX2RvbmUoIGdseXBoICk7Ci0KLSAgICAgIEZUX0ZSRUUoIGdseXBoICk7Ci0gICAgfQotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGluaXQuYyBiL3NyYy9iYXNlL2Z0aW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWYxOWMzLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0aW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBpbml0aWFsaXphdGlvbiBsYXllciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDA1LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHR3byAgICAgICAgICAgKi8KLSAgLyogIGZ1bmN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcygpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgdGhlIHNldCBvZiBkZWZhdWx0IG1vZHVsZXMgdG8gYSAgICAgICovCi0gIC8qICAgICBmcmVzaCBuZXcgbGlicmFyeSBvYmplY3QuICBUaGUgc2V0IGlzIHRha2VuIGZyb20gdGhlIGhlYWRlciBmaWxlICAqLwotICAvKiAgICAgYGZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oJy4gIFNlZSB0aGUgZG9jdW1lbnQgYEZyZWVUeXBlIDIuMCAgICAgKi8KLSAgLyogICAgIEJ1aWxkIFN5c3RlbScgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRlRfSW5pdF9GcmVlVHlwZSgpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHN5c3RlbSBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLCAgICovCi0gIC8qICAgICBidWlsZHMgYSBsaWJyYXJ5IG91dCBvZiBpdCwgdGhlbiBjYWxscyBGVF9EZWZhdWx0X0RyaXZlcnMoKS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE5vdGUgdGhhdCBldmVuIGlmIEZUX0luaXRfRnJlZVR5cGUoKSB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgICovCi0gIC8qICBzeXN0ZW0gb2JqZWN0IGRlZmluZWQgYXQgYnVpbGQgdGltZSwgY2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgc3RpbGwgICAqLwotICAvKiAgYWJsZSB0byBwcm92aWRlIHRoZWlyIG93biBgZnRzeXN0ZW0uYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9pbml0Ci0KLSN1bmRlZiAgRlRfVVNFX01PRFVMRQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX1VTRV9NT0RVTEUoIHggKSAgZXh0ZXJuICJDIiBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgIHg7Ci0jZWxzZQotI2RlZmluZSBGVF9VU0VfTU9EVUxFKCB4ICkgIGV4dGVybiBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgIHg7Ci0jZW5kaWYKLQotCi0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0KLQotI3VuZGVmICBGVF9VU0VfTU9EVUxFCi0jZGVmaW5lIEZUX1VTRV9NT0RVTEUoIHggKSAgKGNvbnN0IEZUX01vZHVsZV9DbGFzcyopJih4KSwKLQotICBzdGF0aWMKLSAgY29uc3QgRlRfTW9kdWxlX0NsYXNzKiAgY29uc3QgZnRfZGVmYXVsdF9tb2R1bGVzW10gPQotICB7Ci0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0gICAgMAotICB9OwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOwotICAgIGNvbnN0IEZUX01vZHVsZV9DbGFzcyogY29uc3QqICBjdXI7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBkZWxheWVkIHRvIEZUX0FkZF9Nb2R1bGUoKSAqLwotCi0gICAgY3VyID0gZnRfZGVmYXVsdF9tb2R1bGVzOwotICAgIHdoaWxlICggKmN1ciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9BZGRfTW9kdWxlKCBsaWJyYXJ5LCAqY3VyICk7Ci0gICAgICAvKiBub3RpZnkgZXJyb3JzLCBidXQgZG9uJ3Qgc3RvcCAqLwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIkZUX0FkZF9EZWZhdWx0X01vZHVsZTogQ2Fubm90IGluc3RhbGwgYCVzJywgZXJyb3IgPSAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICgqY3VyKS0+bW9kdWxlX25hbWUsIGVycm9yICkpOwotICAgICAgfQotICAgICAgY3VyKys7Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkgICphbGlicmFyeSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICAvKiBGaXJzdCBvZiBhbGwsIGFsbG9jYXRlIGEgbmV3IHN5c3RlbSBvYmplY3QgLS0gdGhpcyBmdW5jdGlvbiBpcyBwYXJ0ICovCi0gICAgLyogb2YgdGhlIHN5c3RlbS1zcGVjaWZpYyBjb21wb25lbnQsIGkuZS4gYGZ0c3lzdGVtLmMnLiAgICAgICAgICAgICAgICAqLwotCi0gICAgbWVtb3J5ID0gRlRfTmV3X01lbW9yeSgpOwotICAgIGlmICggIW1lbW9yeSApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRlRfSW5pdF9GcmVlVHlwZTogY2Fubm90IGZpbmQgbWVtb3J5IG1hbmFnZXJcbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLSAgICB9Ci0KLSAgICAvKiBidWlsZCBhIGxpYnJhcnkgb3V0IG9mIGl0LCB0aGVuIGZpbGwgaXQgd2l0aCB0aGUgc2V0IG9mICovCi0gICAgLyogZGVmYXVsdCBkcml2ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgZXJyb3IgPSBGVF9OZXdfTGlicmFyeSggbWVtb3J5LCBhbGlicmFyeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfRG9uZV9NZW1vcnkoIG1lbW9yeSApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAoKmFsaWJyYXJ5KS0+dmVyc2lvbl9tYWpvciA9IEZSRUVUWVBFX01BSk9SOwotICAgICAgKCphbGlicmFyeSktPnZlcnNpb25fbWlub3IgPSBGUkVFVFlQRV9NSU5PUjsKLSAgICAgICgqYWxpYnJhcnkpLT52ZXJzaW9uX3BhdGNoID0gRlJFRVRZUEVfUEFUQ0g7Ci0KLSAgICAgIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMoICphbGlicmFyeSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9Eb25lX0ZyZWVUeXBlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIGlmICggbGlicmFyeSApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgICAgLyogRGlzY2FyZCB0aGUgbGlicmFyeSBvYmplY3QgKi8KLSAgICAgIEZUX0RvbmVfTGlicmFyeSggbGlicmFyeSApOwotCi0gICAgICAvKiBkaXNjYXJkIG1lbW9yeSBtYW5hZ2VyICovCi0gICAgICBGVF9Eb25lX01lbW9yeSggbWVtb3J5ICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRsY2RmaWwuYyBiL3NyYy9iYXNlL2Z0bGNkZmlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMWZhMGIuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRsY2RmaWwuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGxjZGZpbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBjb2xvciBmaWx0ZXJpbmcgb2Ygc3VicGl4ZWwgYml0bWFwIGdseXBocyAoYm9keSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYsIDIwMDggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTENEX0ZJTFRFUl9ICi0jaW5jbHVkZSBGVF9JTUFHRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLQotLyogZGVmaW5lIFVTRV9MRUdBQ1kgdG8gaW1wbGVtZW50IHRoZSBsZWdhY3kgZmlsdGVyICovCi0jZGVmaW5lICBVU0VfTEVHQUNZCi0KLSAgLyogRklSIGZpbHRlciB1c2VkIGJ5IHRoZSBkZWZhdWx0IGFuZCBsaWdodCBmaWx0ZXJzICovCi0gIHN0YXRpYyB2b2lkCi0gIF9mdF9sY2RfZmlsdGVyX2ZpciggRlRfQml0bWFwKiAgICAgIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9CeXRlKiAgd2VpZ2h0cyA9IGxpYnJhcnktPmxjZF93ZWlnaHRzOwotICAgIEZUX1VJbnQgICB3aWR0aCAgID0gKEZUX1VJbnQpYml0bWFwLT53aWR0aDsKLSAgICBGVF9VSW50ICAgaGVpZ2h0ICA9IChGVF9VSW50KWJpdG1hcC0+cm93czsKLQotCi0gICAgLyogaG9yaXpvbnRhbCBpbi1wbGFjZSBGSVIgZmlsdGVyICovCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCAmJiB3aWR0aCA+PSA0ICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgbGluZSA9IGJpdG1hcC0+YnVmZmVyOwotCi0KLSAgICAgIGZvciAoIDsgaGVpZ2h0ID4gMDsgaGVpZ2h0LS0sIGxpbmUgKz0gYml0bWFwLT5waXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGZpcls1XTsKLSAgICAgICAgRlRfVUludCAgdmFsMSwgeHg7Ci0KLQotICAgICAgICB2YWwxICAgPSBsaW5lWzBdOwotICAgICAgICBmaXJbMF0gPSB3ZWlnaHRzWzJdICogdmFsMTsKLSAgICAgICAgZmlyWzFdID0gd2VpZ2h0c1szXSAqIHZhbDE7Ci0gICAgICAgIGZpclsyXSA9IHdlaWdodHNbNF0gKiB2YWwxOwotICAgICAgICBmaXJbM10gPSAwOwotICAgICAgICBmaXJbNF0gPSAwOwotCi0gICAgICAgIHZhbDEgICAgPSBsaW5lWzFdOwotICAgICAgICBmaXJbMF0gKz0gd2VpZ2h0c1sxXSAqIHZhbDE7Ci0gICAgICAgIGZpclsxXSArPSB3ZWlnaHRzWzJdICogdmFsMTsKLSAgICAgICAgZmlyWzJdICs9IHdlaWdodHNbM10gKiB2YWwxOwotICAgICAgICBmaXJbM10gKz0gd2VpZ2h0c1s0XSAqIHZhbDE7Ci0KLSAgICAgICAgZm9yICggeHggPSAyOyB4eCA8IHdpZHRoOyB4eCsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHZhbCwgcGl4OwotCi0KLSAgICAgICAgICB2YWwgICAgPSBsaW5lW3h4XTsKLSAgICAgICAgICBwaXggICAgPSBmaXJbMF0gKyB3ZWlnaHRzWzBdICogdmFsOwotICAgICAgICAgIGZpclswXSA9IGZpclsxXSArIHdlaWdodHNbMV0gKiB2YWw7Ci0gICAgICAgICAgZmlyWzFdID0gZmlyWzJdICsgd2VpZ2h0c1syXSAqIHZhbDsKLSAgICAgICAgICBmaXJbMl0gPSBmaXJbM10gKyB3ZWlnaHRzWzNdICogdmFsOwotICAgICAgICAgIGZpclszXSA9ICAgICAgICAgIHdlaWdodHNbNF0gKiB2YWw7Ci0KLSAgICAgICAgICBwaXggICAgICAgID4+PSA4OwotICAgICAgICAgIHBpeCAgICAgICAgIHw9IC0oIHBpeCA+PiA4ICk7Ci0gICAgICAgICAgbGluZVt4eCAtIDJdID0gKEZUX0J5dGUpcGl4OwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHBpeDsKLQotCi0gICAgICAgICAgcGl4ICAgICAgICAgID0gZmlyWzBdID4+IDg7Ci0gICAgICAgICAgcGl4ICAgICAgICAgfD0gLSggcGl4ID4+IDggKTsKLSAgICAgICAgICBsaW5lW3h4IC0gMl0gPSAoRlRfQnl0ZSlwaXg7Ci0KLSAgICAgICAgICBwaXggICAgICAgICAgPSBmaXJbMV0gPj4gODsKLSAgICAgICAgICBwaXggICAgICAgICB8PSAtKCBwaXggPj4gOCApOwotICAgICAgICAgIGxpbmVbeHggLSAxXSA9IChGVF9CeXRlKXBpeDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIHZlcnRpY2FsIGluLXBsYWNlIEZJUiBmaWx0ZXIgKi8KLSAgICBlbHNlIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViAmJiBoZWlnaHQgPj0gNCApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGNvbHVtbiA9IGJpdG1hcC0+YnVmZmVyOwotICAgICAgRlRfSW50ICAgIHBpdGNoICA9IGJpdG1hcC0+cGl0Y2g7Ci0KLQotICAgICAgZm9yICggOyB3aWR0aCA+IDA7IHdpZHRoLS0sIGNvbHVtbisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIGNvbCA9IGNvbHVtbjsKLSAgICAgICAgRlRfVUludCAgIGZpcls1XTsKLSAgICAgICAgRlRfVUludCAgIHZhbDEsIHl5OwotCi0KLSAgICAgICAgdmFsMSAgID0gY29sWzBdOwotICAgICAgICBmaXJbMF0gPSB3ZWlnaHRzWzJdICogdmFsMTsKLSAgICAgICAgZmlyWzFdID0gd2VpZ2h0c1szXSAqIHZhbDE7Ci0gICAgICAgIGZpclsyXSA9IHdlaWdodHNbNF0gKiB2YWwxOwotICAgICAgICBmaXJbM10gPSAwOwotICAgICAgICBmaXJbNF0gPSAwOwotICAgICAgICBjb2wgICArPSBwaXRjaDsKLQotICAgICAgICB2YWwxICAgID0gY29sWzBdOwotICAgICAgICBmaXJbMF0gKz0gd2VpZ2h0c1sxXSAqIHZhbDE7Ci0gICAgICAgIGZpclsxXSArPSB3ZWlnaHRzWzJdICogdmFsMTsKLSAgICAgICAgZmlyWzJdICs9IHdlaWdodHNbM10gKiB2YWwxOwotICAgICAgICBmaXJbM10gKz0gd2VpZ2h0c1s0XSAqIHZhbDE7Ci0gICAgICAgIGNvbCAgICArPSBwaXRjaDsKLQotICAgICAgICBmb3IgKCB5eSA9IDI7IHl5IDwgaGVpZ2h0OyB5eSsrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHZhbCwgcGl4OwotCi0KLSAgICAgICAgICB2YWwgICAgPSBjb2xbMF07Ci0gICAgICAgICAgcGl4ICAgID0gZmlyWzBdICsgd2VpZ2h0c1swXSAqIHZhbDsKLSAgICAgICAgICBmaXJbMF0gPSBmaXJbMV0gKyB3ZWlnaHRzWzFdICogdmFsOwotICAgICAgICAgIGZpclsxXSA9IGZpclsyXSArIHdlaWdodHNbMl0gKiB2YWw7Ci0gICAgICAgICAgZmlyWzJdID0gZmlyWzNdICsgd2VpZ2h0c1szXSAqIHZhbDsKLSAgICAgICAgICBmaXJbM10gPSAgICAgICAgICB3ZWlnaHRzWzRdICogdmFsOwotCi0gICAgICAgICAgcGl4ICAgICAgICAgICA+Pj0gODsKLSAgICAgICAgICBwaXggICAgICAgICAgICB8PSAtKCBwaXggPj4gOCApOwotICAgICAgICAgIGNvbFstMiAqIHBpdGNoXSA9IChGVF9CeXRlKXBpeDsKLSAgICAgICAgICBjb2wgICAgICAgICAgICArPSBwaXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBwaXg7Ci0KLQotICAgICAgICAgIHBpeCAgICAgICAgICAgICA9IGZpclswXSA+PiA4OwotICAgICAgICAgIHBpeCAgICAgICAgICAgIHw9IC0oIHBpeCA+PiA4ICk7Ci0gICAgICAgICAgY29sWy0yICogcGl0Y2hdID0gKEZUX0J5dGUpcGl4OwotCi0gICAgICAgICAgcGl4ICAgICAgICAgPSBmaXJbMV0gPj4gODsKLSAgICAgICAgICBwaXggICAgICAgIHw9IC0oIHBpeCA+PiA4ICk7Ci0gICAgICAgICAgY29sWy1waXRjaF0gPSAoRlRfQnl0ZSlwaXg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0jaWZkZWYgVVNFX0xFR0FDWQotCi0gIC8qIGludHJhLXBpeGVsIGZpbHRlciB1c2VkIGJ5IHRoZSBsZWdhY3kgZmlsdGVyICovCi0gIHN0YXRpYyB2b2lkCi0gIF9mdF9sY2RfZmlsdGVyX2xlZ2FjeSggRlRfQml0bWFwKiAgICAgIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9VSW50ICB3aWR0aCAgPSAoRlRfVUludCliaXRtYXAtPndpZHRoOwotICAgIEZUX1VJbnQgIGhlaWdodCA9IChGVF9VSW50KWJpdG1hcC0+cm93czsKLSAgICBGVF9JbnQgICBwaXRjaCAgPSBiaXRtYXAtPnBpdGNoOwotCi0gICAgc3RhdGljIGNvbnN0IGludCAgZmlsdGVyc1szXVszXSA9Ci0gICAgewotICAgICAgeyA2NTUzOCAqIDkvMTMsIDY1NTM4ICogMS82LCA2NTUzOCAqIDEvMTMgfSwKLSAgICAgIHsgNjU1MzggKiAzLzEzLCA2NTUzOCAqIDQvNiwgNjU1MzggKiAzLzEzIH0sCi0gICAgICB7IDY1NTM4ICogMS8xMywgNjU1MzggKiAxLzYsIDY1NTM4ICogOS8xMyB9Ci0gICAgfTsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0KLSAgICAvKiBob3Jpem9udGFsIGluLXBsYWNlIGludHJhLXBpeGVsIGZpbHRlciAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgJiYgd2lkdGggPj0gMyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGxpbmUgPSBiaXRtYXAtPmJ1ZmZlcjsKLQotCi0gICAgICBmb3IgKCA7IGhlaWdodCA+IDA7IGhlaWdodC0tLCBsaW5lICs9IHBpdGNoICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgeHg7Ci0KLQotICAgICAgICBmb3IgKCB4eCA9IDA7IHh4IDwgd2lkdGg7IHh4ICs9IDMgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgciA9IDA7Ci0gICAgICAgICAgRlRfVUludCAgZyA9IDA7Ci0gICAgICAgICAgRlRfVUludCAgYiA9IDA7Ci0gICAgICAgICAgRlRfVUludCAgcDsKLQotCi0gICAgICAgICAgcCAgPSBsaW5lW3h4XTsKLSAgICAgICAgICByICs9IGZpbHRlcnNbMF1bMF0gKiBwOwotICAgICAgICAgIGcgKz0gZmlsdGVyc1swXVsxXSAqIHA7Ci0gICAgICAgICAgYiArPSBmaWx0ZXJzWzBdWzJdICogcDsKLQotICAgICAgICAgIHAgID0gbGluZVt4eCArIDFdOwotICAgICAgICAgIHIgKz0gZmlsdGVyc1sxXVswXSAqIHA7Ci0gICAgICAgICAgZyArPSBmaWx0ZXJzWzFdWzFdICogcDsKLSAgICAgICAgICBiICs9IGZpbHRlcnNbMV1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBsaW5lW3h4ICsgMl07Ci0gICAgICAgICAgciArPSBmaWx0ZXJzWzJdWzBdICogcDsKLSAgICAgICAgICBnICs9IGZpbHRlcnNbMl1bMV0gKiBwOwotICAgICAgICAgIGIgKz0gZmlsdGVyc1syXVsyXSAqIHA7Ci0KLSAgICAgICAgICBsaW5lW3h4XSAgICAgPSAoRlRfQnl0ZSkoIHIgLyA2NTUzNiApOwotICAgICAgICAgIGxpbmVbeHggKyAxXSA9IChGVF9CeXRlKSggZyAvIDY1NTM2ICk7Ci0gICAgICAgICAgbGluZVt4eCArIDJdID0gKEZUX0J5dGUpKCBiIC8gNjU1MzYgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViAmJiBoZWlnaHQgPj0gMyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGNvbHVtbiA9IGJpdG1hcC0+YnVmZmVyOwotCi0KLSAgICAgIGZvciAoIDsgd2lkdGggPiAwOyB3aWR0aC0tLCBjb2x1bW4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBjb2wgICAgID0gY29sdW1uOwotICAgICAgICBGVF9CeXRlKiAgY29sX2VuZCA9IGNvbCArIGhlaWdodCAqIHBpdGNoOwotCi0KLSAgICAgICAgZm9yICggOyBjb2wgPCBjb2xfZW5kOyBjb2wgKz0gMyAqIHBpdGNoICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHIgPSAwOwotICAgICAgICAgIEZUX1VJbnQgIGcgPSAwOwotICAgICAgICAgIEZUX1VJbnQgIGIgPSAwOwotICAgICAgICAgIEZUX1VJbnQgIHA7Ci0KLQotICAgICAgICAgIHAgID0gY29sWzBdOwotICAgICAgICAgIHIgKz0gZmlsdGVyc1swXVswXSAqIHA7Ci0gICAgICAgICAgZyArPSBmaWx0ZXJzWzBdWzFdICogcDsKLSAgICAgICAgICBiICs9IGZpbHRlcnNbMF1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBjb2xbcGl0Y2hdOwotICAgICAgICAgIHIgKz0gZmlsdGVyc1sxXVswXSAqIHA7Ci0gICAgICAgICAgZyArPSBmaWx0ZXJzWzFdWzFdICogcDsKLSAgICAgICAgICBiICs9IGZpbHRlcnNbMV1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBjb2xbcGl0Y2ggKiAyXTsKLSAgICAgICAgICByICs9IGZpbHRlcnNbMl1bMF0gKiBwOwotICAgICAgICAgIGcgKz0gZmlsdGVyc1syXVsxXSAqIHA7Ci0gICAgICAgICAgYiArPSBmaWx0ZXJzWzJdWzJdICogcDsKLQotICAgICAgICAgIGNvbFswXSAgICAgICAgID0gKEZUX0J5dGUpKCByIC8gNjU1MzYgKTsKLSAgICAgICAgICBjb2xbcGl0Y2hdICAgICA9IChGVF9CeXRlKSggZyAvIDY1NTM2ICk7Ci0gICAgICAgICAgY29sWzIgKiBwaXRjaF0gPSAoRlRfQnl0ZSkoIGIgLyA2NTUzNiApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSNlbmRpZiAvKiBVU0VfTEVHQUNZICovCi0KLQotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIoIEZUX0xpYnJhcnkgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MY2RGaWx0ZXIgICBmaWx0ZXIgKQotICB7Ci0gICAgc3RhdGljIGNvbnN0IEZUX0J5dGUgIGxpZ2h0X2ZpbHRlcls1XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLCA4NSwgODYsIDg1LCAwIH07Ci0gICAgLyogdGhlIHZhbHVlcyBoZXJlIHN1bSB1cCB0byBhIHZhbHVlIGxhcmdlciB0aGFuIDI1NiwgKi8KLSAgICAvKiBwcm92aWRpbmcgYSBjaGVhcCBnYW1tYSBjb3JyZWN0aW9uICAgICAgICAgICAgICAgICAqLwotICAgIHN0YXRpYyBjb25zdCBGVF9CeXRlICBkZWZhdWx0X2ZpbHRlcls1XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDEwLCAweDQwLCAweDcwLCAweDQwLCAweDEwIH07Ci0KLQotICAgIGlmICggbGlicmFyeSA9PSBOVUxMICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIHN3aXRjaCAoIGZpbHRlciApCi0gICAgewotICAgIGNhc2UgRlRfTENEX0ZJTFRFUl9OT05FOgotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gTlVMTDsKLSAgICAgIGxpYnJhcnktPmxjZF9leHRyYSAgICAgICA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfTENEX0ZJTFRFUl9ERUZBVUxUOgotI2lmIGRlZmluZWQoIEZUX0ZPUkNFX0xFR0FDWV9MQ0RfRklMVEVSICkKLQotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gX2Z0X2xjZF9maWx0ZXJfbGVnYWN5OwotICAgICAgbGlicmFyeS0+bGNkX2V4dHJhICAgICAgID0gMDsKLQotI2VsaWYgZGVmaW5lZCggRlRfRk9SQ0VfTElHSFRfTENEX0ZJTFRFUiApCi0KLSAgICAgIG1lbWNweSggbGlicmFyeS0+bGNkX3dlaWdodHMsIGxpZ2h0X2ZpbHRlciwgNSApOwotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gX2Z0X2xjZF9maWx0ZXJfZmlyOwotICAgICAgbGlicmFyeS0+bGNkX2V4dHJhICAgICAgID0gMjsKLQotI2Vsc2UKLQotICAgICAgbWVtY3B5KCBsaWJyYXJ5LT5sY2Rfd2VpZ2h0cywgZGVmYXVsdF9maWx0ZXIsIDUgKTsKLSAgICAgIGxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYyA9IF9mdF9sY2RfZmlsdGVyX2ZpcjsKLSAgICAgIGxpYnJhcnktPmxjZF9leHRyYSAgICAgICA9IDI7Ci0KLSNlbmRpZgotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfTENEX0ZJTFRFUl9MSUdIVDoKLSAgICAgIG1lbWNweSggbGlicmFyeS0+bGNkX3dlaWdodHMsIGxpZ2h0X2ZpbHRlciwgNSApOwotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gX2Z0X2xjZF9maWx0ZXJfZmlyOwotICAgICAgbGlicmFyeS0+bGNkX2V4dHJhICAgICAgID0gMjsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgVVNFX0xFR0FDWQotCi0gICAgY2FzZSBGVF9MQ0RfRklMVEVSX0xFR0FDWToKLSAgICAgIGxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYyA9IF9mdF9sY2RfZmlsdGVyX2xlZ2FjeTsKLSAgICAgIGxpYnJhcnktPmxjZF9leHRyYSAgICAgICA9IDA7Ci0gICAgICBicmVhazsKLQotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgIH0KLQotICAgIGxpYnJhcnktPmxjZF9maWx0ZXIgPSBmaWx0ZXI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICovCi0KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MY2RGaWx0ZXIgIGZpbHRlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLSAgICBGVF9VTlVTRUQoIGZpbHRlciApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7Ci0gIH0KLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRtbS5jIGIvc3JjL2Jhc2UvZnRtbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZkNWU4Li4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0bW0uYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1tLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTXVsdGlwbGUgTWFzdGVyIGZvbnQgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMywgMjAwNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9tbQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIEZUX0ZhY2UgICAgICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgICphc2VydmljZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgICphc2VydmljZSA9IE5VTEw7Ci0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKLQotICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBpZiAoIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCBmYWNlICkgKQotICAgIHsKLSAgICAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYXNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUSV9NQVNURVJTICk7Ci0KLSAgICAgIGlmICggYXNlcnZpY2UgKQotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtbS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfTXVsdGlfTWFzdGVyKCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWx0aV9NYXN0ZXIgICphbWFzdGVyICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgc2VydmljZTsKLQotCi0gICAgZXJyb3IgPSBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgaWYgKCBzZXJ2aWNlLT5nZXRfbW0gKQotICAgICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9tbSggZmFjZSwgYW1hc3RlciApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9NTV9WYXIoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqYW1hc3RlciApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7Ci0KLQotICAgIGVycm9yID0gZnRfZmFjZV9nZXRfbW1fc2VydmljZSggZmFjZSwgJnNlcnZpY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgIGlmICggc2VydmljZS0+Z2V0X21tX3ZhciApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X21tX3ZhciggZmFjZSwgYW1hc3RlciApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7Ci0KLQotICAgIGVycm9yID0gZnRfZmFjZV9nZXRfbW1fc2VydmljZSggZmFjZSwgJnNlcnZpY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgIGlmICggc2VydmljZS0+c2V0X21tX2Rlc2lnbiApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+c2V0X21tX2Rlc2lnbiggZmFjZSwgbnVtX2Nvb3JkcywgY29vcmRzICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW0uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgc2VydmljZTsKLQotCi0gICAgZXJyb3IgPSBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgaWYgKCBzZXJ2aWNlLT5zZXRfdmFyX2Rlc2lnbiApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+c2V0X3Zhcl9kZXNpZ24oIGZhY2UsIG51bV9jb29yZHMsIGNvb3JkcyApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7Ci0KLQotICAgIGVycm9yID0gZnRfZmFjZV9nZXRfbW1fc2VydmljZSggZmFjZSwgJnNlcnZpY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgIGlmICggc2VydmljZS0+c2V0X21tX2JsZW5kICkKLSAgICAgICAgIGVycm9yID0gc2VydmljZS0+c2V0X21tX2JsZW5kKCBmYWNlLCBudW1fY29vcmRzLCBjb29yZHMgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtbS5oICovCi0KLSAgLyogVGhpcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4gIEl0IGV4aXN0cyBmb3IgKi8KLSAgLyogb3J0aG9nb25hbGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7Ci0KLQotICAgIGVycm9yID0gZnRfZmFjZV9nZXRfbW1fc2VydmljZSggZmFjZSwgJnNlcnZpY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgIGlmICggc2VydmljZS0+c2V0X21tX2JsZW5kICkKLSAgICAgICAgIGVycm9yID0gc2VydmljZS0+c2V0X21tX2JsZW5kKCBmYWNlLCBudW1fY29vcmRzLCBjb29yZHMgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0bmFtZXMuYyBiL3NyYy9iYXNlL2Z0bmFtZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkZTVjNC4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdG5hbWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG5hbWVzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU2ltcGxlIGludGVyZmFjZSB0byBhY2Nlc3MgU0ZOVCBuYW1lIHRhYmxlcyAod2hpY2ggYXJlIHVzZWQgICAgICAgICAgKi8KLS8qICAgIHRvIGhvbGQgZm9udCBuYW1lcywgY29weXJpZ2h0IGluZm8sIG5vdGljZXMsIGV0Yy4pIChib2R5KS4gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBpcyBfbm90XyB1c2VkIHRvIHJldHJpZXZlIGdseXBoIG5hbWVzISAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRuYW1lcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludCApCi0gIEZUX0dldF9TZm50X05hbWVfQ291bnQoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgcmV0dXJuIChmYWNlICYmIEZUX0lTX1NGTlQoIGZhY2UgKSkgPyAoKFRUX0ZhY2UpZmFjZSktPm51bV9uYW1lcyA6IDA7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRuYW1lcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfU2ZudF9OYW1lKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICBGVF9TZm50TmFtZSAgKmFuYW1lICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0KLSAgICBpZiAoIGFuYW1lICYmIGZhY2UgJiYgRlRfSVNfU0ZOVCggZmFjZSApICkKLSAgICB7Ci0gICAgICBUVF9GYWNlICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOwotCi0KLSAgICAgIGlmICggaWR4IDwgKEZUX1VJbnQpdHRmYWNlLT5udW1fbmFtZXMgKQotICAgICAgewotICAgICAgICBUVF9OYW1lRW50cnlSZWMqICBlbnRyeSA9IHR0ZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIGlkeDsKLQotCi0gICAgICAgIC8qIGxvYWQgbmFtZSBvbiBkZW1hbmQgKi8KLSAgICAgICAgaWYgKCBlbnRyeS0+c3RyaW5nTGVuZ3RoID4gMCAmJiBlbnRyeS0+c3RyaW5nID09IE5VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5tZW1vcnk7Ci0gICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5zdHJlYW07Ci0KLQotICAgICAgICAgIGlmICggRlRfTkVXX0FSUkFZICAoIGVudHJ5LT5zdHJpbmcsIGVudHJ5LT5zdHJpbmdMZW5ndGggKSB8fAotICAgICAgICAgICAgICAgRlRfU1RSRUFNX1NFRUsoIGVudHJ5LT5zdHJpbmdPZmZzZXQgKSAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIGVudHJ5LT5zdHJpbmcsIGVudHJ5LT5zdHJpbmdMZW5ndGggKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotICAgICAgICAgICAgZW50cnktPnN0cmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYW5hbWUtPnBsYXRmb3JtX2lkID0gZW50cnktPnBsYXRmb3JtSUQ7Ci0gICAgICAgIGFuYW1lLT5lbmNvZGluZ19pZCA9IGVudHJ5LT5lbmNvZGluZ0lEOwotICAgICAgICBhbmFtZS0+bGFuZ3VhZ2VfaWQgPSBlbnRyeS0+bGFuZ3VhZ2VJRDsKLSAgICAgICAgYW5hbWUtPm5hbWVfaWQgICAgID0gZW50cnktPm5hbWVJRDsKLSAgICAgICAgYW5hbWUtPnN0cmluZyAgICAgID0gKEZUX0J5dGUqKWVudHJ5LT5zdHJpbmc7Ci0gICAgICAgIGFuYW1lLT5zdHJpbmdfbGVuICA9IGVudHJ5LT5zdHJpbmdMZW5ndGg7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRvYmpzLmMgYi9zcmMvYmFzZS9mdG9ianMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2N2IyZi4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdG9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGJhc2UgY2xhc3NlcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggYnkgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0xJU1RfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1JGT1JLX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0ggICAgLyogZm9yIFNGTlRfTG9hZF9UYWJsZV9GdW5jICovCi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1NGTlRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0tFUk5JTkdfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9FTkdJTkVfSAotCi0jaWZkZWYgQU5EUk9JRF9GT05UX0hBQ0sKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2VuZGlmCi0KLSNkZWZpbmUgR1JJRF9GSVRfTUVUUklDUwotCi0gIEZUX0JBU0VfREVGKCBGVF9Qb2ludGVyICkKLSAgZnRfc2VydmljZV9saXN0X2xvb2t1cCggRlRfU2VydmljZURlc2MgIHNlcnZpY2VfZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICBzZXJ2aWNlX2lkICkKLSAgewotICAgIEZUX1BvaW50ZXIgICAgICByZXN1bHQgPSBOVUxMOwotICAgIEZUX1NlcnZpY2VEZXNjICBkZXNjICAgPSBzZXJ2aWNlX2Rlc2NyaXB0b3JzOwotCi0KLSAgICBpZiAoIGRlc2MgJiYgc2VydmljZV9pZCApCi0gICAgewotICAgICAgZm9yICggOyBkZXNjLT5zZXJ2X2lkICE9IE5VTEw7IGRlc2MrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggZnRfc3RyY21wKCBkZXNjLT5zZXJ2X2lkLCBzZXJ2aWNlX2lkICkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoRlRfUG9pbnRlcilkZXNjLT5zZXJ2X2RhdGE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X3ZhbGlkYXRvcl9pbml0KCBGVF9WYWxpZGF0b3IgICAgICAgIHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRpb25MZXZlbCAgbGV2ZWwgKQotICB7Ci0gICAgdmFsaWQtPmJhc2UgID0gYmFzZTsKLSAgICB2YWxpZC0+bGltaXQgPSBsaW1pdDsKLSAgICB2YWxpZC0+bGV2ZWwgPSBsZXZlbDsKLSAgICB2YWxpZC0+ZXJyb3IgPSBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQgKQotICBmdF92YWxpZGF0b3JfcnVuKCBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIC8qIFRoaXMgZnVuY3Rpb24gZG9lc24ndCB3b3JrISAgTm9uZSBzaG91bGQgY2FsbCBpdC4gKi8KLSAgICBGVF9VTlVTRUQoIHZhbGlkICk7Ci0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfdmFsaWRhdG9yX2Vycm9yKCBGVF9WYWxpZGF0b3IgIHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgICAgZXJyb3IgKQotICB7Ci0gICAgLyogc2luY2UgdGhlIGNhc3QgYmVsb3cgYWxzbyBkaXNhYmxlcyB0aGUgY29tcGlsZXIncyAqLwotICAgIC8qIHR5cGUgY2hlY2ssIHdlIGludHJvZHVjZSBhIGR1bW15IHZhcmlhYmxlLCB3aGljaCAgKi8KLSAgICAvKiB3aWxsIGJlIG9wdGltaXplZCBhd2F5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9sYXRpbGUgZnRfam1wX2J1ZioganVtcF9idWZmZXIgPSAmdmFsaWQtPmp1bXBfYnVmZmVyOwotCi0KLSAgICB2YWxpZC0+ZXJyb3IgPSBlcnJvcjsKLQotICAgIC8qIHRocm93IGF3YXkgdm9sYXRpbGVuZXNzOyB1c2UgYGp1bXBfYnVmZmVyJyBvciB0aGUgICovCi0gICAgLyogY29tcGlsZXIgbWF5IHdhcm4gYWJvdXQgYW4gdW51c2VkIGxvY2FsIHZhcmlhYmxlICAgKi8KLSAgICBmdF9sb25nam1wKCAqKGZ0X2ptcF9idWYqKSBqdW1wX2J1ZmZlciwgMSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgUyBUIFIgRSBBIE0gICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBjcmVhdGUgYSBuZXcgaW5wdXQgc3RyZWFtIGZyb20gYW4gRlRfT3Blbl9BcmdzIHN0cnVjdHVyZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fTmV3KCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9PcGVuX0FyZ3MqICBhcmdzLAotICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICphc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW07Ci0KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0xpYnJhcnlfSGFuZGxlOwotCi0gICAgaWYgKCAhYXJncyApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICAqYXN0cmVhbSA9IDA7Ci0gICAgbWVtb3J5ICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBpZiAoIEZUX05FVyggc3RyZWFtICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc3RyZWFtLT5tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgICBpZiAoIGFyZ3MtPmZsYWdzICYgRlRfT1BFTl9NRU1PUlkgKQotICAgIHsKLSAgICAgIC8qIGNyZWF0ZSBhIG1lbW9yeS1iYXNlZCBzdHJlYW0gKi8KLSAgICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZUX0J5dGUqKWFyZ3MtPm1lbW9yeV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPm1lbW9yeV9zaXplICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fUEFUSE5BTUUgKQotICAgIHsKLSAgICAgIC8qIGNyZWF0ZSBhIG5vcm1hbCBzeXN0ZW0gc3RyZWFtICovCi0gICAgICBlcnJvciA9IEZUX1N0cmVhbV9PcGVuKCBzdHJlYW0sIGFyZ3MtPnBhdGhuYW1lICk7Ci0gICAgICBzdHJlYW0tPnBhdGhuYW1lLnBvaW50ZXIgPSBhcmdzLT5wYXRobmFtZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1NUUkVBTSApICYmIGFyZ3MtPnN0cmVhbSApCi0gICAgewotICAgICAgLyogdXNlIGFuIGV4aXN0aW5nLCB1c2VyLXByb3ZpZGVkIHN0cmVhbSAqLwotCi0gICAgICAvKiBpbiB0aGlzIGNhc2UsIHdlIGRvIG5vdCBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHN0cmVhbSBvYmplY3QgKi8KLSAgICAgIC8qIHNpbmNlIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgaXQgaGltc2VsZiAgICAgICAqLwotICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgICBzdHJlYW0gPSBhcmdzLT5zdHJlYW07Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0ZSRUUoIHN0cmVhbSApOwotICAgIGVsc2UKLSAgICAgIHN0cmVhbS0+bWVtb3J5ID0gbWVtb3J5OyAgLyoganVzdCB0byBiZSBjZXJ0YWluICovCi0KLSAgICAqYXN0cmVhbSA9IHN0cmVhbTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9TdHJlYW1fRnJlZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGV4dGVybmFsICkKLSAgewotICAgIGlmICggc3RyZWFtICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICAgIEZUX1N0cmVhbV9DbG9zZSggc3RyZWFtICk7Ci0KLSAgICAgIGlmICggIWV4dGVybmFsICkKLSAgICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgfQotICB9Ci0KLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vYmpzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgRkFDRSwgU0laRSAmIEdMWVBIIFNMT1QgT0JKRUNUUyAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfZ2x5cGhzbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBGVF9Ecml2ZXIgICAgICAgICBkcml2ZXIgPSBzbG90LT5mYWNlLT5kcml2ZXI7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICAgY2xhenogID0gZHJpdmVyLT5jbGF6ejsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnkgPSBkcml2ZXItPnJvb3QubWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9TbG90X0ludGVybmFsICBpbnRlcm5hbDsKLQotCi0gICAgc2xvdC0+bGlicmFyeSA9IGRyaXZlci0+cm9vdC5saWJyYXJ5OwotCi0gICAgaWYgKCBGVF9ORVcoIGludGVybmFsICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2xvdC0+aW50ZXJuYWwgPSBpbnRlcm5hbDsKLQotICAgIGlmICggRlRfRFJJVkVSX1VTRVNfT1VUTElORVMoIGRyaXZlciApICkKLSAgICAgIGVycm9yID0gRlRfR2x5cGhMb2FkZXJfTmV3KCBtZW1vcnksICZpbnRlcm5hbC0+bG9hZGVyICk7Ci0KLSAgICBpZiAoICFlcnJvciAmJiBjbGF6ei0+aW5pdF9zbG90ICkKLSAgICAgIGVycm9yID0gY2xhenotPmluaXRfc2xvdCggc2xvdCApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIGlmICggc2xvdC0+aW50ZXJuYWwtPmZsYWdzICYgRlRfR0xZUEhfT1dOX0JJVE1BUCApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggc2xvdC0+ZmFjZSApOwotCi0KLSAgICAgIEZUX0ZSRUUoIHNsb3QtPmJpdG1hcC5idWZmZXIgKTsKLSAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyAmPSB+RlRfR0xZUEhfT1dOX0JJVE1BUDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGFzc3VtZSB0aGF0IHRoZSBiaXRtYXAgYnVmZmVyIHdhcyBzdG9sZW4gb3Igbm90ICovCi0gICAgICAvKiBhbGxvY2F0ZWQgZnJvbSB0aGUgaGVhcCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgc2xvdC0+Yml0bWFwLmJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X2dseXBoc2xvdF9zZXRfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgIGJ1ZmZlciApCi0gIHsKLSAgICBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAoIHNsb3QgKTsKLQotICAgIHNsb3QtPmJpdG1hcC5idWZmZXIgPSBidWZmZXI7Ci0KLSAgICBGVF9BU1NFUlQoIChzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJiBGVF9HTFlQSF9PV05fQklUTUFQKSA9PSAwICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBzaXplICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIHNsb3QtPmZhY2UgKTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotCi0KLSAgICBpZiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKQotICAgICAgRlRfRlJFRSggc2xvdC0+Yml0bWFwLmJ1ZmZlciApOwotICAgIGVsc2UKLSAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyB8PSBGVF9HTFlQSF9PV05fQklUTUFQOwotCi0gICAgKHZvaWQpRlRfQUxMT0MoIHNsb3QtPmJpdG1hcC5idWZmZXIsIHNpemUgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2dseXBoc2xvdF9jbGVhciggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIC8qIGZyZWUgYml0bWFwIGlmIG5lZWRlZCAqLwotICAgIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCggc2xvdCApOwotCi0gICAgLyogY2xlYXIgYWxsIHB1YmxpYyBmaWVsZHMgaW4gdGhlIGdseXBoIHNsb3QgKi8KLSAgICBGVF9aRVJPKCAmc2xvdC0+bWV0cmljcyApOwotICAgIEZUX1pFUk8oICZzbG90LT5vdXRsaW5lICk7Ci0KLSAgICBzbG90LT5iaXRtYXAud2lkdGggICAgICA9IDA7Ci0gICAgc2xvdC0+Yml0bWFwLnJvd3MgICAgICAgPSAwOwotICAgIHNsb3QtPmJpdG1hcC5waXRjaCAgICAgID0gMDsKLSAgICBzbG90LT5iaXRtYXAucGl4ZWxfbW9kZSA9IDA7Ci0gICAgLyogYHNsb3QtPmJpdG1hcC5idWZmZXInIGhhcyBiZWVuIGhhbmRsZWQgYnkgZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwICovCi0KLSAgICBzbG90LT5iaXRtYXBfbGVmdCAgID0gMDsKLSAgICBzbG90LT5iaXRtYXBfdG9wICAgID0gMDsKLSAgICBzbG90LT5udW1fc3ViZ2x5cGhzID0gMDsKLSAgICBzbG90LT5zdWJnbHlwaHMgICAgID0gMDsKLSAgICBzbG90LT5jb250cm9sX2RhdGEgID0gMDsKLSAgICBzbG90LT5jb250cm9sX2xlbiAgID0gMDsKLSAgICBzbG90LT5vdGhlciAgICAgICAgID0gMDsKLSAgICBzbG90LT5mb3JtYXQgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX05PTkU7Ci0KLSAgICBzbG90LT5saW5lYXJIb3JpQWR2YW5jZSA9IDA7Ci0gICAgc2xvdC0+bGluZWFyVmVydEFkdmFuY2UgPSAwOwotICAgIHNsb3QtPmxzYl9kZWx0YSAgICAgICAgID0gMDsKLSAgICBzbG90LT5yc2JfZGVsdGEgICAgICAgICA9IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2dseXBoc2xvdF9kb25lKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfRHJpdmVyICAgICAgICBkcml2ZXIgPSBzbG90LT5mYWNlLT5kcml2ZXI7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6eiAgPSBkcml2ZXItPmNsYXp6OwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLQotCi0gICAgaWYgKCBjbGF6ei0+ZG9uZV9zbG90ICkKLSAgICAgIGNsYXp6LT5kb25lX3Nsb3QoIHNsb3QgKTsKLQotICAgIC8qIGZyZWUgYml0bWFwIGJ1ZmZlciBpZiBuZWVkZWQgKi8KLSAgICBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAoIHNsb3QgKTsKLQotICAgIC8qIGZyZWUgZ2x5cGggbG9hZGVyICovCi0gICAgaWYgKCBGVF9EUklWRVJfVVNFU19PVVRMSU5FUyggZHJpdmVyICkgKQotICAgIHsKLSAgICAgIEZUX0dseXBoTG9hZGVyX0RvbmUoIHNsb3QtPmludGVybmFsLT5sb2FkZXIgKTsKLSAgICAgIHNsb3QtPmludGVybmFsLT5sb2FkZXIgPSAwOwotICAgIH0KLQotICAgIEZUX0ZSRUUoIHNsb3QtPmludGVybmFsICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfR2x5cGhTbG90KCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICphc2xvdCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIEZUX0RyaXZlciAgICAgICAgZHJpdmVyOwotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7Ci0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnk7Ci0gICAgRlRfR2x5cGhTbG90ICAgICBzbG90OwotCi0KLSAgICBpZiAoICFmYWNlIHx8ICFmYWNlLT5kcml2ZXIgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgZHJpdmVyID0gZmFjZS0+ZHJpdmVyOwotICAgIGNsYXp6ICA9IGRyaXZlci0+Y2xheno7Ci0gICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLQotICAgIEZUX1RSQUNFNCgoICJGVF9OZXdfR2x5cGhTbG90OiBDcmVhdGluZyBuZXcgc2xvdCBvYmplY3RcbiIgKSk7Ci0gICAgaWYgKCAhRlRfQUxMT0MoIHNsb3QsIGNsYXp6LT5zbG90X29iamVjdF9zaXplICkgKQotICAgIHsKLSAgICAgIHNsb3QtPmZhY2UgPSBmYWNlOwotCi0gICAgICBlcnJvciA9IGZ0X2dseXBoc2xvdF9pbml0KCBzbG90ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgZnRfZ2x5cGhzbG90X2RvbmUoIHNsb3QgKTsKLSAgICAgICAgRlRfRlJFRSggc2xvdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHNsb3QtPm5leHQgID0gZmFjZS0+Z2x5cGg7Ci0gICAgICBmYWNlLT5nbHlwaCA9IHNsb3Q7Ci0KLSAgICAgIGlmICggYXNsb3QgKQotICAgICAgICAqYXNsb3QgPSBzbG90OwotICAgIH0KLSAgICBlbHNlIGlmICggYXNsb3QgKQotICAgICAgKmFzbG90ID0gMDsKLQotCi0gIEV4aXQ6Ci0gICAgRlRfVFJBQ0U0KCggIkZUX05ld19HbHlwaFNsb3Q6IFJldHVybiAlZFxuIiwgZXJyb3IgKSk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9Eb25lX0dseXBoU2xvdCggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIGlmICggc2xvdCApCi0gICAgewotICAgICAgRlRfRHJpdmVyICAgICBkcml2ZXIgPSBzbG90LT5mYWNlLT5kcml2ZXI7Ci0gICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IGRyaXZlci0+cm9vdC5tZW1vcnk7Ci0gICAgICBGVF9HbHlwaFNsb3QgIHByZXY7Ci0gICAgICBGVF9HbHlwaFNsb3QgIGN1cjsKLQotCi0gICAgICAvKiBSZW1vdmUgc2xvdCBmcm9tIGl0cyBwYXJlbnQgZmFjZSdzIGxpc3QgKi8KLSAgICAgIHByZXYgPSBOVUxMOwotICAgICAgY3VyICA9IHNsb3QtPmZhY2UtPmdseXBoOwotCi0gICAgICB3aGlsZSAoIGN1ciApCi0gICAgICB7Ci0gICAgICAgIGlmICggY3VyID09IHNsb3QgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAhcHJldiApCi0gICAgICAgICAgICBzbG90LT5mYWNlLT5nbHlwaCA9IGN1ci0+bmV4dDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmV2LT5uZXh0ID0gY3VyLT5uZXh0OwotCi0gICAgICAgICAgZnRfZ2x5cGhzbG90X2RvbmUoIHNsb3QgKTsKLSAgICAgICAgICBGVF9GUkVFKCBzbG90ICk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGN1cjsKLSAgICAgICAgY3VyICA9IGN1ci0+bmV4dDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TZXRfVHJhbnNmb3JtKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGRlbHRhICkKLSAgewotICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIGludGVybmFsID0gZmFjZS0+aW50ZXJuYWw7Ci0KLSAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzID0gMDsKLQotICAgIGlmICggIW1hdHJpeCApCi0gICAgewotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueHggPSAweDEwMDAwTDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnh5ID0gMDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnl4ID0gMDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnl5ID0gMHgxMDAwMEw7Ci0gICAgICBtYXRyaXggPSAmaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXg7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4ID0gKm1hdHJpeDsKLQotICAgIC8qIHNldCB0cmFuc2Zvcm1fZmxhZ3MgYml0IGZsYWcgMCBpZiBgbWF0cml4JyBpc24ndCB0aGUgaWRlbnRpdHkgKi8KLSAgICBpZiAoICggbWF0cml4LT54eSB8IG1hdHJpeC0+eXggKSB8fAotICAgICAgICAgbWF0cml4LT54eCAhPSAweDEwMDAwTCAgICAgIHx8Ci0gICAgICAgICBtYXRyaXgtPnl5ICE9IDB4MTAwMDBMICAgICAgKQotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyB8PSAxOwotCi0gICAgaWYgKCAhZGVsdGEgKQotICAgIHsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEueCA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhLnkgPSAwOwotICAgICAgZGVsdGEgPSAmaW50ZXJuYWwtPnRyYW5zZm9ybV9kZWx0YTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9kZWx0YSA9ICpkZWx0YTsKLQotICAgIC8qIHNldCB0cmFuc2Zvcm1fZmxhZ3MgYml0IGZsYWcgMSBpZiBgZGVsdGEnIGlzbid0IHRoZSBudWxsIHZlY3RvciAqLwotICAgIGlmICggZGVsdGEtPnggfCBkZWx0YS0+eSApCi0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzIHw9IDI7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9SZW5kZXJlcgotICBmdF9sb29rdXBfZ2x5cGhfcmVuZGVyZXIoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLSNpZmRlZiBHUklEX0ZJVF9NRVRSSUNTCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2dseXBoc2xvdF9ncmlkX2ZpdF9tZXRyaWNzKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgIHZlcnRpY2FsICkKLSAgewotICAgIEZUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzID0gJnNsb3QtPm1ldHJpY3M7Ci0gICAgRlRfUG9zICAgICAgICAgICAgIHJpZ2h0LCBib3R0b207Ci0KLQotICAgIGlmICggdmVydGljYWwgKQotICAgIHsKLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IEZUX1BJWF9GTE9PUiggbWV0cmljcy0+aG9yaUJlYXJpbmdYICk7Ci0gICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBGVF9QSVhfQ0VJTCAoIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSApOwotCi0gICAgICByaWdodCAgPSBGVF9QSVhfQ0VJTCggbWV0cmljcy0+dmVydEJlYXJpbmdYICsgbWV0cmljcy0+d2lkdGggKTsKLSAgICAgIGJvdHRvbSA9IEZUX1BJWF9DRUlMKCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgKyBtZXRyaWNzLT5oZWlnaHQgKTsKLQotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IEZUX1BJWF9GTE9PUiggbWV0cmljcy0+dmVydEJlYXJpbmdZICk7Ci0KLSAgICAgIG1ldHJpY3MtPndpZHRoICA9IHJpZ2h0IC0gbWV0cmljcy0+dmVydEJlYXJpbmdYOwotICAgICAgbWV0cmljcy0+aGVpZ2h0ID0gYm90dG9tIC0gbWV0cmljcy0+dmVydEJlYXJpbmdZOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IEZUX1BJWF9GTE9PUiggbWV0cmljcy0+dmVydEJlYXJpbmdZICk7Ci0KLSAgICAgIHJpZ2h0ICA9IEZUX1BJWF9DRUlMICggbWV0cmljcy0+aG9yaUJlYXJpbmdYICsgbWV0cmljcy0+d2lkdGggKTsKLSAgICAgIGJvdHRvbSA9IEZUX1BJWF9GTE9PUiggbWV0cmljcy0+aG9yaUJlYXJpbmdZIC0gbWV0cmljcy0+aGVpZ2h0ICk7Ci0KLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IEZUX1BJWF9GTE9PUiggbWV0cmljcy0+aG9yaUJlYXJpbmdYICk7Ci0gICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBGVF9QSVhfQ0VJTCAoIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSApOwotCi0gICAgICBtZXRyaWNzLT53aWR0aCAgPSByaWdodCAtIG1ldHJpY3MtPmhvcmlCZWFyaW5nWDsKLSAgICAgIG1ldHJpY3MtPmhlaWdodCA9IG1ldHJpY3MtPmhvcmlCZWFyaW5nWSAtIGJvdHRvbTsKLSAgICB9Ci0KLSAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9IEZUX1BJWF9ST1VORCggbWV0cmljcy0+aG9yaUFkdmFuY2UgKTsKLSAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSA9IEZUX1BJWF9ST1VORCggbWV0cmljcy0+dmVydEFkdmFuY2UgKTsKLSAgfQotI2VuZGlmIC8qIEdSSURfRklUX01FVFJJQ1MgKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTG9hZF9HbHlwaCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBGVF9Ecml2ZXIgICAgIGRyaXZlcjsKLSAgICBGVF9HbHlwaFNsb3QgIHNsb3Q7Ci0gICAgRlRfTGlicmFyeSAgICBsaWJyYXJ5OwotICAgIEZUX0Jvb2wgICAgICAgYXV0b2hpbnQgPSAwOwotICAgIEZUX01vZHVsZSAgICAgaGludGVyOwotCi0KLSAgICBpZiAoICFmYWNlIHx8ICFmYWNlLT5zaXplIHx8ICFmYWNlLT5nbHlwaCApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7Ci0KLSAgICAvKiBUaGUgdmFsaWRpdHkgdGVzdCBmb3IgYGdseXBoX2luZGV4JyBpcyBwZXJmb3JtZWQgYnkgdGhlICovCi0gICAgLyogZm9udCBkcml2ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgc2xvdCA9IGZhY2UtPmdseXBoOwotICAgIGZ0X2dseXBoc2xvdF9jbGVhciggc2xvdCApOwotCi0gICAgZHJpdmVyICA9IGZhY2UtPmRyaXZlcjsKLSAgICBsaWJyYXJ5ID0gZHJpdmVyLT5yb290LmxpYnJhcnk7Ci0gICAgaGludGVyICA9IGxpYnJhcnktPmF1dG9faGludGVyOwotCi0gICAgLyogcmVzb2x2ZSBsb2FkIGZsYWdzIGRlcGVuZGVuY2llcyAqLwotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19TQ0FMRSAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNOwotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApCi0gICAgewotICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkcgfAotICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX0JJVE1BUDsKLQotICAgICAgbG9hZF9mbGFncyAmPSB+RlRfTE9BRF9SRU5ERVI7Ci0gICAgfQotI2lmZGVmIEFORFJPSURfRk9OVF9IQUNLCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3RhdGljIGludCAgIGhhY2tfbW9kZTsKLQotICAgICAgICBpZiAoaGFja19tb2RlID09IDApIHsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQgICBmZCA9IG9wZW4oIi9kYXRhL21pc2MvZm9udC1oYWNrIiwgT19SRE9OTFkpOwotICAgICAgICAgICAgICAgIGNoYXIgIGJ1ZmZbMl07Ci0gICAgICAgICAgICAgICAgaW50ICAgcmV0OwotCi0gICAgICAgICAgICAgICAgaGFja19tb2RlID0gMTsgIC8qbWVhbnMgbGlnaHQgbm9kZSBieSBkZWZhdWx0ICovCi0gICAgICAgICAgICAgICAgaWYgKGZkIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICByZXQgPSByZWFkKGZkLCBidWZmLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IDEpCi0gICAgICAgICAgICAgICAgICAgIGhhY2tfbW9kZSA9IDEgKyAoYnVmZlswXSAtICcwJyk7Ci0KLSAgICAgICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICB9IHdoaWxlICgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoaGFja19tb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgbG9hZF9mbGFncyAmPSAweGZmZjBmZmZmOwotICAgICAgICAgICAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9UQVJHRVRfTElHSFQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBhdXRvLWhpbnQgb3Igbm90LgotICAgICAqIFRoZSBnZW5lcmFsIHJ1bGVzIGFyZToKLSAgICAgKgotICAgICAqIC0gRG8gb25seSBhdXRvLWhpbnRpbmcgaWYgd2UgaGF2ZSBhIGhpbnRlciBtb2R1bGUsCi0gICAgICogICBhIHNjYWxhYmxlIGZvbnQgZm9ybWF0IGRlYWxpbmcgd2l0aCBvdXRsaW5lcywKLSAgICAgKiAgIGFuZCBubyB0cmFuc2Zvcm1zIGV4Y2VwdCBzaW1wbGUgc2xhbnRzLgotICAgICAqCi0gICAgICogLSBUaGVuLCBhdXRvaGludCBpZiBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UIGlzIHNldAotICAgICAqICAgb3IgaWYgd2UgZG9uJ3QgaGF2ZSBhIG5hdGl2ZSBmb250IGhpbnRlci4KLSAgICAgKgotICAgICAqIC0gT3RoZXJ3aXNlLCBhdXRvLWhpbnQgZm9yIExJR0hUIGhpbnRpbmcgbW9kZS4KLSAgICAgKgotICAgICAqIC0gRXhjZXB0aW9uOiBUaGUgZm9udCByZXF1aXJlcyB0aGUgdW5wYXRlbnRlZAotICAgICAqICAgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gbG9hZCBwcm9wZXJseS4KLSAgICAgKi8KLQotICAgIGF1dG9oaW50ID0gMDsKLSAgICBpZiAoIGhpbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0hJTlRJTkcgICkgPT0gMCAmJgotICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19BVVRPSElOVCApID09IDAgJiYKLSAgICAgICAgIEZUX0RSSVZFUl9JU19TQ0FMQUJMRSggZHJpdmVyICkgICAgICAgICAgICYmCi0gICAgICAgICBGVF9EUklWRVJfVVNFU19PVVRMSU5FUyggZHJpdmVyICkgICAgICAgICAmJgotICAgICAgICAgZmFjZS0+aW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueXkgPiAwICAgJiYKLSAgICAgICAgIGZhY2UtPmludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnl4ID09IDAgICkKLSAgICB7Ci0gICAgICBpZiAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgKSAhPSAwIHx8Ci0gICAgICAgICAgICFGVF9EUklWRVJfSEFTX0hJTlRFUiggZHJpdmVyICkgICAgICAgICAgICAgICkKLSAgICAgICAgYXV0b2hpbnQgPSAxOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZSA9IEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKTsKLQotCi0gICAgICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIGZhY2UtPmludGVybmFsLT5pZ25vcmVfdW5wYXRlbnRlZF9oaW50ZXIgKQotICAgICAgICAgIGF1dG9oaW50ID0gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGF1dG9oaW50ICkKLSAgICB7Ci0gICAgICBGVF9BdXRvSGludGVyX1NlcnZpY2UgIGhpbnRpbmc7Ci0KLQotICAgICAgLyogdHJ5IHRvIGxvYWQgZW1iZWRkZWQgYml0bWFwcyBmaXJzdCBpZiBhdmFpbGFibGUgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogWFhYOiBUaGlzIGlzIHJlYWxseSBhIHRlbXBvcmFyeSBoYWNrIHRoYXQgc2hvdWxkIGRpc2FwcGVhciAqLwotICAgICAgLyogICAgICBwcm9tcHRseSB3aXRoIEZyZWVUeXBlIDIuMSEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBGVF9IQVNfRklYRURfU0laRVMoIGZhY2UgKSAgICAgICAgICAgICAmJgotICAgICAgICAgICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fQklUTUFQICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gZHJpdmVyLT5jbGF6ei0+bG9hZF9nbHlwaCggc2xvdCwgZmFjZS0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzIHwgRlRfTE9BRF9TQklUU19PTkxZICk7Ci0KLSAgICAgICAgaWYgKCAhZXJyb3IgJiYgc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKQotICAgICAgICAgIGdvdG8gTG9hZF9PazsKLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBGVF9GYWNlX0ludGVybmFsICBpbnRlcm5hbCAgICAgICAgPSBmYWNlLT5pbnRlcm5hbDsKLSAgICAgICAgRlRfSW50ICAgICAgICAgICAgdHJhbnNmb3JtX2ZsYWdzID0gaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFnczsKLQotCi0gICAgICAgIC8qIHNpbmNlIHRoZSBhdXRvLWhpbnRlciBjYWxscyBGVF9Mb2FkX0dseXBoIGJ5IGl0c2VsZiwgKi8KLSAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgZ2x5cGhzIGFyZW4ndCB0cmFuc2Zvcm1lZCAgICAgICAgICAgICAqLwotICAgICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzID0gMDsKLQotICAgICAgICAvKiBsb2FkIGF1dG8taGludGVkIG91dGxpbmUgKi8KLSAgICAgICAgaGludGluZyA9IChGVF9BdXRvSGludGVyX1NlcnZpY2UpaGludGVyLT5jbGF6ei0+bW9kdWxlX2ludGVyZmFjZTsKLQotICAgICAgICBlcnJvciAgID0gaGludGluZy0+bG9hZF9nbHlwaCggKEZUX0F1dG9IaW50ZXIpaGludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdCwgZmFjZS0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzICk7Ci0KLSAgICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyA9IHRyYW5zZm9ybV9mbGFnczsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yID0gZHJpdmVyLT5jbGF6ei0+bG9hZF9nbHlwaCggc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfZmxhZ3MgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKLSAgICAgIHsKLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgbG9hZGVkIG91dGxpbmUgaXMgY29ycmVjdCAqLwotICAgICAgICBlcnJvciA9IEZUX091dGxpbmVfQ2hlY2soICZzbG90LT5vdXRsaW5lICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotI2lmZGVmIEdSSURfRklUX01FVFJJQ1MKLSAgICAgICAgaWYgKCAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HICkgKQotICAgICAgICAgIGZ0X2dseXBoc2xvdF9ncmlkX2ZpdF9tZXRyaWNzKCBzbG90LAotICAgICAgICAgICAgICBGVF9CT09MKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKSApOwotI2VuZGlmCi0gICAgICB9Ci0gICAgfQotCi0gIExvYWRfT2s6Ci0gICAgLyogY29tcHV0ZSB0aGUgYWR2YW5jZSAqLwotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICB7Ci0gICAgICBzbG90LT5hZHZhbmNlLnggPSAwOwotICAgICAgc2xvdC0+YWR2YW5jZS55ID0gc2xvdC0+bWV0cmljcy52ZXJ0QWR2YW5jZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNsb3QtPmFkdmFuY2UueCA9IHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2U7Ci0gICAgICBzbG90LT5hZHZhbmNlLnkgPSAwOwotICAgIH0KLQotICAgIC8qIGNvbXB1dGUgdGhlIGxpbmVhciBhZHZhbmNlIGluIDE2LjE2IHBpeGVscyAqLwotICAgIGlmICggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9MSU5FQVJfREVTSUdOICkgPT0gMCAgJiYKLSAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSApICkKLSAgICB7Ci0gICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzID0gJmZhY2UtPnNpemUtPm1ldHJpY3M7Ci0KLQotICAgICAgLyogaXQncyB0cmlja3khICovCi0gICAgICBzbG90LT5saW5lYXJIb3JpQWR2YW5jZSA9IEZUX011bERpdiggc2xvdC0+bGluZWFySG9yaUFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSwgNjQgKTsKLQotICAgICAgc2xvdC0+bGluZWFyVmVydEFkdmFuY2UgPSBGVF9NdWxEaXYoIHNsb3QtPmxpbmVhclZlcnRBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUsIDY0ICk7Ci0gICAgfQotCi0gICAgaWYgKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0gKSA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9GYWNlX0ludGVybmFsICBpbnRlcm5hbCA9IGZhY2UtPmludGVybmFsOwotCi0KLSAgICAgIC8qIG5vdywgdHJhbnNmb3JtIHRoZSBnbHlwaCBpbWFnZSBpZiBuZWVkZWQgKi8KLSAgICAgIGlmICggaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyApCi0gICAgICB7Ci0gICAgICAgIC8qIGdldCByZW5kZXJlciAqLwotICAgICAgICBGVF9SZW5kZXJlciAgcmVuZGVyZXIgPSBmdF9sb29rdXBfZ2x5cGhfcmVuZGVyZXIoIHNsb3QgKTsKLQotCi0gICAgICAgIGlmICggcmVuZGVyZXIgKQotICAgICAgICAgIGVycm9yID0gcmVuZGVyZXItPmNsYXp6LT50cmFuc2Zvcm1fZ2x5cGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIsIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhICk7Ci0gICAgICAgIC8qIHRyYW5zZm9ybSBhZHZhbmNlICovCi0gICAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oICZzbG90LT5hZHZhbmNlLCAmaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXggKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBkbyB3ZSBuZWVkIHRvIHJlbmRlciB0aGUgaW1hZ2Ugbm93PyAqLwotICAgIGlmICggIWVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHNsb3QtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICAgICYmCi0gICAgICAgICBzbG90LT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSAmJgotICAgICAgICAgbG9hZF9mbGFncyAmIEZUX0xPQURfUkVOREVSICkKLSAgICB7Ci0gICAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZSA9IEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKTsKLQotCi0gICAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTk9STUFMICAgICAgJiYKLSAgICAgICAgICAgKGxvYWRfZmxhZ3MgJiBGVF9MT0FEX01PTk9DSFJPTUUgKSApCi0gICAgICAgIG1vZGUgPSBGVF9SRU5ERVJfTU9ERV9NT05POwotCi0gICAgICBlcnJvciA9IEZUX1JlbmRlcl9HbHlwaCggc2xvdCwgbW9kZSApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9Mb2FkX0NoYXIoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgRlRfSW50MzIgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgRlRfVUludCAgZ2x5cGhfaW5kZXg7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOwotCi0gICAgZ2x5cGhfaW5kZXggPSAoRlRfVUludCljaGFyX2NvZGU7Ci0gICAgaWYgKCBmYWNlLT5jaGFybWFwICkKLSAgICAgIGdseXBoX2luZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgoIGZhY2UsIGNoYXJfY29kZSApOwotCi0gICAgcmV0dXJuIEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzICk7Ci0gIH0KLQotCi0gIC8qIGRlc3RydWN0b3IgZm9yIHNpemVzIGxpc3QgKi8KLSAgc3RhdGljIHZvaWQKLSAgZGVzdHJveV9zaXplKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICBGVF9TaXplICAgIHNpemUsCi0gICAgICAgICAgICAgICAgRlRfRHJpdmVyICBkcml2ZXIgKQotICB7Ci0gICAgLyogZmluYWxpemUgY2xpZW50LXNwZWNpZmljIGRhdGEgKi8KLSAgICBpZiAoIHNpemUtPmdlbmVyaWMuZmluYWxpemVyICkKLSAgICAgIHNpemUtPmdlbmVyaWMuZmluYWxpemVyKCBzaXplICk7Ci0KLSAgICAvKiBmaW5hbGl6ZSBmb3JtYXQtc3BlY2lmaWMgc3R1ZmYgKi8KLSAgICBpZiAoIGRyaXZlci0+Y2xhenotPmRvbmVfc2l6ZSApCi0gICAgICBkcml2ZXItPmNsYXp6LT5kb25lX3NpemUoIHNpemUgKTsKLQotICAgIEZUX0ZSRUUoIHNpemUtPmludGVybmFsICk7Ci0gICAgRlRfRlJFRSggc2l6ZSApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIEZUX0NNYXAgIGNtYXAgKTsKLQotCi0gIHN0YXRpYyB2b2lkCi0gIGRlc3Ryb3lfY2hhcm1hcHMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfSW50ICBuOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgZmFjZS0+bnVtX2NoYXJtYXBzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX0NNYXAgIGNtYXAgPSBGVF9DTUFQKCBmYWNlLT5jaGFybWFwc1tuXSApOwotCi0KLSAgICAgIGZ0X2NtYXBfZG9uZV9pbnRlcm5hbCggY21hcCApOwotCi0gICAgICBmYWNlLT5jaGFybWFwc1tuXSA9IE5VTEw7Ci0gICAgfQotCi0gICAgRlRfRlJFRSggZmFjZS0+Y2hhcm1hcHMgKTsKLSAgICBmYWNlLT5udW1fY2hhcm1hcHMgPSAwOwotICB9Ci0KLQotICAvKiBkZXN0cnVjdG9yIGZvciBmYWNlcyBsaXN0ICovCi0gIHN0YXRpYyB2b2lkCi0gIGRlc3Ryb3lfZmFjZSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgIEZUX0RyaXZlciAgZHJpdmVyICkKLSAgewotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xhenogPSBkcml2ZXItPmNsYXp6OwotCi0KLSAgICAvKiBkaXNjYXJkIGF1dG8taGludGluZyBkYXRhICovCi0gICAgaWYgKCBmYWNlLT5hdXRvaGludC5maW5hbGl6ZXIgKQotICAgICAgZmFjZS0+YXV0b2hpbnQuZmluYWxpemVyKCBmYWNlLT5hdXRvaGludC5kYXRhICk7Ci0KLSAgICAvKiBEaXNjYXJkIGdseXBoIHNsb3RzIGZvciB0aGlzIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBCZXdhcmUhICBGVF9Eb25lX0dseXBoU2xvdCgpIGNoYW5nZXMgdGhlIGZpZWxkIGBmYWNlLT5nbHlwaCcgKi8KLSAgICB3aGlsZSAoIGZhY2UtPmdseXBoICkKLSAgICAgIEZUX0RvbmVfR2x5cGhTbG90KCBmYWNlLT5nbHlwaCApOwotCi0gICAgLyogZGlzY2FyZCBhbGwgc2l6ZXMgZm9yIHRoaXMgZmFjZSAqLwotICAgIEZUX0xpc3RfRmluYWxpemUoICZmYWNlLT5zaXplc19saXN0LAotICAgICAgICAgICAgICAgICAgICAgIChGVF9MaXN0X0Rlc3RydWN0b3IpZGVzdHJveV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgKTsKLSAgICBmYWNlLT5zaXplID0gMDsKLQotICAgIC8qIG5vdyBkaXNjYXJkIGNsaWVudCBkYXRhICovCi0gICAgaWYgKCBmYWNlLT5nZW5lcmljLmZpbmFsaXplciApCi0gICAgICBmYWNlLT5nZW5lcmljLmZpbmFsaXplciggZmFjZSApOwotCi0gICAgLyogZGlzY2FyZCBjaGFybWFwcyAqLwotICAgIGRlc3Ryb3lfY2hhcm1hcHMoIGZhY2UsIG1lbW9yeSApOwotCi0gICAgLyogZmluYWxpemUgZm9ybWF0LXNwZWNpZmljIHN0dWZmICovCi0gICAgaWYgKCBjbGF6ei0+ZG9uZV9mYWNlICkKLSAgICAgIGNsYXp6LT5kb25lX2ZhY2UoIGZhY2UgKTsKLQotICAgIC8qIGNsb3NlIHRoZSBzdHJlYW0gZm9yIHRoaXMgZmFjZSBpZiBuZWVkZWQgKi8KLSAgICBGVF9TdHJlYW1fRnJlZSgKLSAgICAgIGZhY2UtPnN0cmVhbSwKLSAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gKSAhPSAwICk7Ci0KLSAgICBmYWNlLT5zdHJlYW0gPSAwOwotCi0gICAgLyogZ2V0IHJpZCBvZiBpdCAqLwotICAgIGlmICggZmFjZS0+aW50ZXJuYWwgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGZhY2UtPmludGVybmFsICk7Ci0gICAgfQotICAgIEZUX0ZSRUUoIGZhY2UgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgRGVzdHJveV9Ecml2ZXIoIEZUX0RyaXZlciAgZHJpdmVyICkKLSAgewotICAgIEZUX0xpc3RfRmluYWxpemUoICZkcml2ZXItPmZhY2VzX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX0xpc3RfRGVzdHJ1Y3RvcilkZXN0cm95X2ZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5yb290Lm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgKTsKLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBkcm9wIHRoZSBkcml2ZXIncyBnbHlwaCBsb2FkZXIgKi8KLSAgICBpZiAoIEZUX0RSSVZFUl9VU0VTX09VVExJTkVTKCBkcml2ZXIgKSApCi0gICAgICBGVF9HbHlwaExvYWRlcl9Eb25lKCBkcml2ZXItPmdseXBoX2xvYWRlciApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaW5kX3VuaWNvZGVfY2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGZpbmRzIGEgVW5pY29kZSBjaGFybWFwLCBpZiB0aGVyZSBpcyBvbmUuICAgICAgICAgICAgKi8KLSAgLyogICAgQW5kIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIGl0IHRyaWVzIHRvIGZhdm91ciB0aGUgbW9yZSAgICAgICAgICovCi0gIC8qICAgIGV4dGVuc2l2ZSBvbmUsIGkuZS4sIG9uZSB0aGF0IHN1cHBvcnRzIFVDUy00IGFnYWluc3QgdGhvc2Ugd2hpY2ggICAqLwotICAvKiAgICBhcmUgbGltaXRlZCB0byB0aGUgQk1QIChzYWlkIFVDUy0yIGVuY29kaW5nLikgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gb3Blbl9mYWNlKCkgKGp1c3QgYmVsb3cpLCBhbmQgYWxzbyAgICAqLwotICAvKiAgICBmcm9tIEZUX1NlbGVjdF9DaGFybWFwKCAuLi4sIEZUX0VOQ09ESU5HX1VOSUNPREUgKS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmaW5kX3VuaWNvZGVfY2hhcm1hcCggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9DaGFyTWFwKiAgZmlyc3Q7Ci0gICAgRlRfQ2hhck1hcCogIGN1cjsKLQotCi0gICAgLyogY2FsbGVyIHNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IGBmYWNlJyBpcyB2YWxpZCAqLwotICAgIEZUX0FTU0VSVCggZmFjZSApOwotCi0gICAgZmlyc3QgPSBmYWNlLT5jaGFybWFwczsKLQotICAgIGlmICggIWZpcnN0ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9DaGFyTWFwX0hhbmRsZTsKLQotICAgIC8qCi0gICAgICogIFRoZSBvcmlnaW5hbCBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uKHMpIG9ubHkgc3BlY2lmaWVkIGNoYXJtYXAKLSAgICAgKiAgZm9ybWF0cyB0aGF0IGFyZSBjYXBhYmxlIG9mIG1hcHBpbmcgOCBvciAxNiBiaXQgY2hhcmFjdGVyIGNvZGVzIHRvCi0gICAgICogIGdseXBoIGluZGljZXMuCi0gICAgICoKLSAgICAgKiAgSG93ZXZlciwgcmVjZW50IHVwZGF0ZXMgdG8gdGhlIEFwcGxlIGFuZCBPcGVuVHlwZSBzcGVjaWZpY2F0aW9ucwotICAgICAqICBpbnRyb2R1Y2VkIG5ldyBmb3JtYXRzIHRoYXQgYXJlIGNhcGFibGUgb2YgbWFwcGluZyAzMi1iaXQgY2hhcmFjdGVyCi0gICAgICogIGNvZGVzIGFzIHdlbGwuICBBbmQgdGhlc2UgYXJlIGFscmVhZHkgdXNlZCBvbiBzb21lIGZvbnRzLCBtYWlubHkgdG8KLSAgICAgKiAgbWFwIG5vbi1CTVAgQXNpYW4gaWRlb2dyYXBocyBhcyBkZWZpbmVkIGluIFVuaWNvZGUuCi0gICAgICoKLSAgICAgKiAgRm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZXMsIHRoZXNlIGZvbnRzIGdlbmVyYWxseSBjb21lIHdpdGgKLSAgICAgKiAgKnNldmVyYWwqIFVuaWNvZGUgY2hhcm1hcHM6Ci0gICAgICoKLSAgICAgKiAgIC0gT25lIG9mIHRoZW0gaW4gdGhlICJvbGQiIDE2LWJpdCBmb3JtYXQsIHRoYXQgY2Fubm90IGFjY2VzcwotICAgICAqICAgICBhbGwgZ2x5cGhzIGluIHRoZSBmb250LgotICAgICAqCi0gICAgICogICAtIEFub3RoZXIgb25lIGluIHRoZSAibmV3IiAzMi1iaXQgZm9ybWF0LCB0aGF0IGNhbiBhY2Nlc3MgYWxsCi0gICAgICogICAgIHRoZSBnbHlwaHMuCi0gICAgICoKLSAgICAgKiAgVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB3cml0dGVuIHRvIGFsd2F5cyBmYXZvciBhIDMyLWJpdCBjaGFybWFwCi0gICAgICogIHdoZW4gZm91bmQuICBPdGhlcndpc2UsIGEgMTYtYml0IG9uZSBpcyByZXR1cm5lZCB3aGVuIGZvdW5kLgotICAgICAqLwotCi0gICAgLyogU2luY2UgdGhlIGBpbnRlcmVzdGluZycgdGFibGUsIHdpdGggSURzICgzLDEwKSwgaXMgbm9ybWFsbHkgdGhlICovCi0gICAgLyogbGFzdCBvbmUsIHdlIGxvb3AgYmFja3dhcmRzLiAgVGhpcyBsb3NlcyB3aXRoIHR5cGUxIGZvbnRzIHdpdGggICovCi0gICAgLyogbm9uLUJNUCBjaGFyYWN0ZXJzICg8LjAwMDElKSwgdGhpcyB3aW5zIHdpdGggLnR0ZiB3aXRoIG5vbi1CTVAgICovCi0gICAgLyogY2hhcnMgKC4wMSUgPyksIGFuZCB0aGlzIGlzIHRoZSBzYW1lIGFib3V0IDk5Ljk5JSBvZiB0aGUgdGltZSEgICovCi0KLSAgICBjdXIgPSBmaXJzdCArIGZhY2UtPm51bV9jaGFybWFwczsgIC8qIHBvaW50cyBhZnRlciB0aGUgbGFzdCBvbmUgKi8KLQotICAgIGZvciAoIDsgLS1jdXIgPj0gZmlyc3Q7ICkKLSAgICB7Ci0gICAgICBpZiAoIGN1clswXS0+ZW5jb2RpbmcgPT0gRlRfRU5DT0RJTkdfVU5JQ09ERSApCi0gICAgICB7Ci0gICAgICAgIC8qIFhYWCBJZiBzb21lIG5ldyBlbmNvZGluZ3MgdG8gcmVwcmVzZW50IFVDUy00IGFyZSBhZGRlZCwgKi8KLSAgICAgICAgLyogICAgIHRoZXkgc2hvdWxkIGJlIGFkZGVkIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoICggY3VyWzBdLT5wbGF0Zm9ybV9pZCA9PSBUVF9QTEFURk9STV9NSUNST1NPRlQgJiYKLSAgICAgICAgICAgICAgIGN1clswXS0+ZW5jb2RpbmdfaWQgPT0gVFRfTVNfSURfVUNTXzQgICAgICAgICkgICAgIHx8Ci0gICAgICAgICAgICAgKCBjdXJbMF0tPnBsYXRmb3JtX2lkID09IFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgJiYKLSAgICAgICAgICAgICAgIGN1clswXS0+ZW5jb2RpbmdfaWQgPT0gVFRfQVBQTEVfSURfVU5JQ09ERV8zMiAgICApICkKLSAgICAgICAgewotICAgICAgICAgIGZhY2UtPmNoYXJtYXAgPSBjdXJbMF07Ci0gICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIFdlIGRvIG5vdCBoYXZlIGFueSBVQ1MtNCBjaGFybWFwLiAgICAgICAgICAgICAgICAqLwotICAgIC8qIERvIHRoZSBsb29wIGFnYWluIGFuZCBzZWFyY2ggZm9yIFVDUy0yIGNoYXJtYXBzLiAqLwotICAgIGN1ciA9IGZpcnN0ICsgZmFjZS0+bnVtX2NoYXJtYXBzOwotCi0gICAgZm9yICggOyAtLWN1ciA+PSBmaXJzdDsgKQotICAgIHsKLSAgICAgIGlmICggY3VyWzBdLT5lbmNvZGluZyA9PSBGVF9FTkNPRElOR19VTklDT0RFICkKLSAgICAgIHsKLSAgICAgICAgZmFjZS0+Y2hhcm1hcCA9IGN1clswXTsKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQ2hhck1hcF9IYW5kbGU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHZhcmlhbnQgc2VsZWN0b3IgY2hhcm1hcCwgaWYgdGhlcmUgaXMgb25lLiAqLwotICAvKiAgICBUaGVyZSBjYW4gb25seSBiZSBvbmUgKHBsYXRmb3JtPTAsIHNwZWNpZmljPTUsIGZvcm1hdD0xNCkuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9DaGFyTWFwCi0gIGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0NoYXJNYXAqICBmaXJzdDsKLSAgICBGVF9DaGFyTWFwKiAgZW5kOwotICAgIEZUX0NoYXJNYXAqICBjdXI7Ci0KLQotICAgIC8qIGNhbGxlciBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCBgZmFjZScgaXMgdmFsaWQgKi8KLSAgICBGVF9BU1NFUlQoIGZhY2UgKTsKLQotICAgIGZpcnN0ID0gZmFjZS0+Y2hhcm1hcHM7Ci0KLSAgICBpZiAoICFmaXJzdCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGVuZCA9IGZpcnN0ICsgZmFjZS0+bnVtX2NoYXJtYXBzOyAgLyogcG9pbnRzIGFmdGVyIHRoZSBsYXN0IG9uZSAqLwotCi0gICAgZm9yICggY3VyID0gZmlyc3Q7IGN1ciA8IGVuZDsgKytjdXIgKQotICAgIHsKLSAgICAgIGlmICggY3VyWzBdLT5wbGF0Zm9ybV9pZCA9PSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFICAgICYmCi0gICAgICAgICAgIGN1clswXS0+ZW5jb2RpbmdfaWQgPT0gVFRfQVBQTEVfSURfVkFSSUFOVF9TRUxFQ1RPUiAmJgotICAgICAgICAgICBGVF9HZXRfQ01hcF9Gb3JtYXQoIGN1clswXSApID09IDE0ICAgICAgICAgICAgICAgICAgKQotICAgICAgICByZXR1cm4gY3VyWzBdOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvcGVuX2ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgc29tZSB3b3JrIGZvciBGVF9PcGVuX0ZhY2UoKS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBvcGVuX2ZhY2UoIEZUX0RyaXZlciAgICAgIGRyaXZlciwKLSAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcywKLSAgICAgICAgICAgICBGVF9GYWNlICAgICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnk7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICAgY2xheno7Ci0gICAgRlRfRmFjZSAgICAgICAgICAgZmFjZSA9IDA7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3IsIGVycm9yMjsKLSAgICBGVF9GYWNlX0ludGVybmFsICBpbnRlcm5hbCA9IE5VTEw7Ci0KLQotICAgIGNsYXp6ICA9IGRyaXZlci0+Y2xheno7Ci0gICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLQotICAgIC8qIGFsbG9jYXRlIHRoZSBmYWNlIG9iamVjdCBhbmQgcGVyZm9ybSBiYXNpYyBpbml0aWFsaXphdGlvbiAqLwotICAgIGlmICggRlRfQUxMT0MoIGZhY2UsIGNsYXp6LT5mYWNlX29iamVjdF9zaXplICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgaWYgKCBGVF9ORVcoIGludGVybmFsICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZmFjZS0+aW50ZXJuYWwgPSBpbnRlcm5hbDsKLQotICAgIGZhY2UtPmRyaXZlciAgID0gZHJpdmVyOwotICAgIGZhY2UtPm1lbW9yeSAgID0gbWVtb3J5OwotICAgIGZhY2UtPnN0cmVhbSAgID0gc3RyZWFtOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIHsKLSAgICAgIGludCAgaTsKLQotCi0gICAgICBmYWNlLT5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlID0gMDsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3BhcmFtcyAmJiAhZmFjZS0+aW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZTsKLSAgICAgICAgICAgIGkrKyApCi0gICAgICAgIGlmICggcGFyYW1zW2ldLnRhZyA9PSBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwgKQotICAgICAgICAgIGZhY2UtPmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgPQotICAgICAgICAgICAgKEZUX0luY3JlbWVudGFsX0ludGVyZmFjZSlwYXJhbXNbaV0uZGF0YTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICggY2xhenotPmluaXRfZmFjZSApCi0gICAgICBlcnJvciA9IGNsYXp6LT5pbml0X2ZhY2UoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludClmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIHNlbGVjdCBVbmljb2RlIGNoYXJtYXAgYnkgZGVmYXVsdCAqLwotICAgIGVycm9yMiA9IGZpbmRfdW5pY29kZV9jaGFybWFwKCBmYWNlICk7Ci0KLSAgICAvKiBpZiBubyBVbmljb2RlIGNoYXJtYXAgY2FuIGJlIGZvdW5kLCBGVF9FcnJfSW52YWxpZF9DaGFyTWFwX0hhbmRsZSAqLwotICAgIC8qIGlzIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBubyBlcnJvciBzaG91bGQgaGFwcGVuLCBidXQgd2Ugd2FudCB0byBwbGF5IHNhZmUgKi8KLSAgICBpZiAoIGVycm9yMiAmJiBlcnJvcjIgIT0gRlRfRXJyX0ludmFsaWRfQ2hhck1hcF9IYW5kbGUgKQotICAgIHsKLSAgICAgIGVycm9yID0gZXJyb3IyOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgICphZmFjZSA9IGZhY2U7Ci0KLSAgRmFpbDoKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBkZXN0cm95X2NoYXJtYXBzKCBmYWNlLCBtZW1vcnkgKTsKLSAgICAgIGlmICggY2xhenotPmRvbmVfZmFjZSApCi0gICAgICAgIGNsYXp6LT5kb25lX2ZhY2UoIGZhY2UgKTsKLSAgICAgIEZUX0ZSRUUoIGludGVybmFsICk7Ci0gICAgICBGVF9GUkVFKCBmYWNlICk7Ci0gICAgICAqYWZhY2UgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogdGhlcmUncyBhIE1hYy1zcGVjaWZpYyBleHRlbmRlZCBpbXBsZW1lbnRhdGlvbiBvZiBGVF9OZXdfRmFjZSgpICovCi0gIC8qIGluIHNyYy9iYXNlL2Z0bWFjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIEZUX01BQ0lOVE9TSAotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICBGVF9GYWNlICAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgbGlicmFyeScgYW5kIGBhZmFjZScgZGVsYXllZCB0byBGVF9PcGVuX0ZhY2UoKSAqLwotICAgIGlmICggIXBhdGhuYW1lICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIGFyZ3MuZmxhZ3MgICAgPSBGVF9PUEVOX1BBVEhOQU1FOwotICAgIGFyZ3MucGF0aG5hbWUgPSAoY2hhciopcGF0aG5hbWU7Ci0KLSAgICByZXR1cm4gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmYXJncywgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgfQotCi0jZW5kaWYgIC8qICFGVF9NQUNJTlRPU0ggKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X01lbW9yeV9GYWNlKCBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgZmlsZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBmaWxlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgKmFmYWNlICkKLSAgewotICAgIEZUX09wZW5fQXJncyAgYXJnczsKLQotCi0gICAgLyogdGVzdCBmb3IgdmFsaWQgYGxpYnJhcnknIGFuZCBgZmFjZScgZGVsYXllZCB0byBGVF9PcGVuX0ZhY2UoKSAqLwotICAgIGlmICggIWZpbGVfYmFzZSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBhcmdzLmZsYWdzICAgICAgID0gRlRfT1BFTl9NRU1PUlk7Ci0gICAgYXJncy5tZW1vcnlfYmFzZSA9IGZpbGVfYmFzZTsKLSAgICBhcmdzLm1lbW9yeV9zaXplID0gZmlsZV9zaXplOwotCi0gICAgcmV0dXJuIEZUX09wZW5fRmFjZSggbGlicmFyeSwgJmFyZ3MsIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0gIH0KLQotCi0jaWYgIWRlZmluZWQoIEZUX01BQ0lOVE9TSCApICYmIGRlZmluZWQoIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTICkKLQotICAvKiBUaGUgYmVoYXZpb3IgaGVyZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBpbiBiYXNlL2Z0bWFjLmMsIGJ1dCBpdCAgICAgKi8KLSAgLyogaXMgZGVzaWduZWQgdG8gd29yayBvbiBub24tbWFjIHN5c3RlbXMsIHNvIG5vIG1hYyBzcGVjaWZpYyBjYWxscy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBsb29rIGF0IHRoZSBmaWxlIGFuZCBkZXRlcm1pbmUgaWYgaXQgaXMgYSBtYWMgZGZvbnQgZmlsZSBvciBhIG1hYyAgKi8KLSAgLyogcmVzb3VyY2UgZmlsZSwgb3IgYSBtYWNiaW5hcnkgZmlsZSBjb250YWluaW5nIGEgbWFjIHJlc291cmNlIGZpbGUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVbmxpa2UgZnRtYWMgSSdtIG5vdCBnb2luZyB0byBsb29rIGF0IGEgYEZPTkQnLiAgSSBkb24ndCByZWFsbHkgc2VlICAgKi8KLSAgLyogdGhlIHBvaW50LCBlc3BlY2lhbGx5IHNpbmNlIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBgRk9ORCcgcmVzb3VyY2VzLiAgICovCi0gIC8qIEluc3RlYWQgSSdsbCBqdXN0IGxvb2sgZm9yIGBzZm50JyBhbmQgYFBPU1QnIHJlc291cmNlcywgb3JkZXJlZCBhcyAgICAqLwotICAvKiB0aGV5IG9jY3VyIGluIHRoZSBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBtdWx0aXBsZSBgUE9TVCcgcmVzb3VyY2VzIGRvIG5vdCBtZWFuIG11bHRpcGxlIHBvc3RzY3JpcHQgICAqLwotICAvKiBmb250czsgdGhleSBhbGwgZ2V0IGphbW1lZCB0b2dldGhlciB0byBtYWtlIHdoYXQgaXMgZXNzZW50aWFsbHkgYSAgICAgKi8KLSAgLyogcGZiIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBgTkZOVCcgb3IgYEZPTlQnIGJpdG1hcCByZXNvdXJjZXMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFzIHNvb24gYXMgd2UgZ2V0IGFuIGBzZm50JyBsb2FkIGl0IGludG8gbWVtb3J5IGFuZCBwYXNzIGl0IG9mZiB0byAgICAqLwotICAvKiBGVF9PcGVuX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHdlIGhhdmUgYSAoc2V0IG9mKSBgUE9TVCcgcmVzb3VyY2VzLCBtYXNzYWdlIHRoZW0gaW50byBhIChtZW1vcnkpICAqLwotICAvKiBwZmIgZmlsZSBhbmQgcGFzcyB0aGF0IHRvIEZUX09wZW5fRmFjZS4gIChBcyB3aXRoIGZ0bWFjLmMgSSdtIG5vdCAgICAgKi8KLSAgLyogZ29pbmcgdG8gdHJ5IHRvIHNhdmUgdGhlIGtlcm5pbmcgaW5mby4gIEFmdGVyIGFsbCB0aGF0IGxpdmVzIGluIHRoZSAgICovCi0gIC8qIGBGT05EJyB3aGljaCBpc24ndCBpbiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBgUE9TVCcgcmVzb3VyY2VzIHNvICAgICAqLwotICAvKiB3ZSBkb24ndCByZWFsbHkgaGF2ZSBhY2Nlc3MgdG8gaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIC8qIEZpbmFsaXplciBmb3IgYSBtZW1vcnkgc3RyZWFtOyBnZXRzIGNhbGxlZCBieSBGVF9Eb25lX0ZhY2UoKS4KLSAgICAgSXQgZnJlZXMgdGhlIG1lbW9yeSBpdCB1c2VzLiAqLwotICAvKiBmcm9tIGZ0bWFjLmMgKi8KLSAgc3RhdGljIHZvaWQKLSAgbWVtb3J5X3N0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggc3RyZWFtLT5iYXNlICk7Ci0KLSAgICBzdHJlYW0tPnNpemUgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgID0gMDsKLSAgICBzdHJlYW0tPmNsb3NlID0gMDsKLSAgfQotCi0KLSAgLyogQ3JlYXRlIGEgbmV3IG1lbW9yeSBzdHJlYW0gZnJvbSBhIGJ1ZmZlciBhbmQgYSBzaXplLiAqLwotICAvKiBmcm9tIGZ0bWFjLmMgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIG5ld19tZW1vcnlfc3RyZWFtKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW1fQ2xvc2VGdW5jICBjbG9zZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgKmFzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbTsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfTGlicmFyeV9IYW5kbGU7Ci0KLSAgICBpZiAoICFiYXNlICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgICphc3RyZWFtID0gMDsKLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgaWYgKCBGVF9ORVcoIHN0cmVhbSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sIGJhc2UsIHNpemUgKTsKLQotICAgIHN0cmVhbS0+Y2xvc2UgPSBjbG9zZTsKLQotICAgICphc3RyZWFtID0gc3RyZWFtOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDcmVhdGUgYSBuZXcgRlRfRmFjZSBnaXZlbiBhIGJ1ZmZlciBhbmQgYSBkcml2ZXIgbmFtZS4gKi8KLSAgLyogZnJvbSBmdG1hYy5jICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBkcml2ZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfU3RyZWFtICAgICBzdHJlYW0gPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBlcnJvciA9IG5ld19tZW1vcnlfc3RyZWFtKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfc3RyZWFtX2Nsb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBiYXNlICk7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgYXJncy5mbGFncyA9IEZUX09QRU5fU1RSRUFNOwotICAgIGFyZ3Muc3RyZWFtID0gc3RyZWFtOwotICAgIGlmICggZHJpdmVyX25hbWUgKQotICAgIHsKLSAgICAgIGFyZ3MuZmxhZ3MgPSBhcmdzLmZsYWdzIHwgRlRfT1BFTl9EUklWRVI7Ci0gICAgICBhcmdzLmRyaXZlciA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksIGRyaXZlcl9uYW1lICk7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotCi0gICAgaWYgKCBlcnJvciA9PSBGVF9FcnJfT2sgKQotICAgICAgKCphZmFjZSktPmZhY2VfZmxhZ3MgJj0gfkZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU07Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1N0cmVhbV9DbG9zZSggc3RyZWFtICk7Ci0gICAgICBGVF9GUkVFKCBzdHJlYW0gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIFRoZSByZXNvdXJjZSBoZWFkZXIgc2F5cyB3ZSd2ZSBnb3QgcmVzb3VyY2VfY250IGBQT1NUJyAodHlwZTEpICovCi0gIC8qIHJlc291cmNlcyBpbiB0aGlzIGZpbGUuICBUaGV5IGFsbCBuZWVkIHRvIGJlIGNvYWxlc2NlZCBpbnRvICAgICovCi0gIC8qIG9uZSBsdW1wIHdoaWNoIGdldHMgcGFzc2VkIG9uIHRvIHRoZSB0eXBlMSBkcml2ZXIuICAgICAgICAgICAgICovCi0gIC8qIEhlcmUgY2FuIGJlIG9ubHkgb25lIFBvc3RTY3JpcHQgZm9udCBpbiBhIGZpbGUgc28gZmFjZV9pbmRleCAgICovCi0gIC8qIG11c3QgYmUgMCAob3IgLTEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBNYWNfUmVhZF9QT1NUX1Jlc291cmNlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKm9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIHJlc291cmNlX2NudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2U7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgRlRfQnl0ZSogICBwZmJfZGF0YTsKLSAgICBpbnQgICAgICAgIGksIHR5cGUsIGZsYWdzOwotICAgIEZUX0xvbmcgICAgbGVuOwotICAgIEZUX0xvbmcgICAgcGZiX2xlbiwgcGZiX3BvcywgcGZiX2xlbnBvczsKLSAgICBGVF9Mb25nICAgIHJsZW4sIHRlbXA7Ci0KLQotICAgIGlmICggZmFjZV9pbmRleCA9PSAtMSApCi0gICAgICBmYWNlX2luZGV4ID0gMDsKLSAgICBpZiAoIGZhY2VfaW5kZXggIT0gMCApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBGaW5kIHRoZSBsZW5ndGggb2YgYWxsIHRoZSBQT1NUIHJlc291cmNlcywgY29uY2F0ZW5hdGVkLiAgQXNzdW1lICovCi0gICAgLyogd29yc3QgY2FzZSAoZWFjaCByZXNvdXJjZSBpbiBpdHMgb3duIHNlY3Rpb24pLiAgICAgICAgICAgICAgICAgICAqLwotICAgIHBmYl9sZW4gPSAwOwotICAgIGZvciAoIGkgPSAwOyBpIDwgcmVzb3VyY2VfY250OyArK2kgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgb2Zmc2V0c1tpXSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGlmICggRlRfUkVBRF9MT05HKCB0ZW1wICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICBwZmJfbGVuICs9IHRlbXAgKyA2OwotICAgIH0KLQotICAgIGlmICggRlRfQUxMT0MoIHBmYl9kYXRhLCAoRlRfTG9uZylwZmJfbGVuICsgMiApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHBmYl9kYXRhWzBdID0gMHg4MDsKLSAgICBwZmJfZGF0YVsxXSA9IDE7ICAgICAgICAgICAgLyogQXNjaWkgc2VjdGlvbiAqLwotICAgIHBmYl9kYXRhWzJdID0gMDsgICAgICAgICAgICAvKiA0LWJ5dGUgbGVuZ3RoLCBmaWxsIGluIGxhdGVyICovCi0gICAgcGZiX2RhdGFbM10gPSAwOwotICAgIHBmYl9kYXRhWzRdID0gMDsKLSAgICBwZmJfZGF0YVs1XSA9IDA7Ci0gICAgcGZiX3BvcyAgICAgPSA2OwotICAgIHBmYl9sZW5wb3MgID0gMjsKLQotICAgIGxlbiA9IDA7Ci0gICAgdHlwZSA9IDE7Ci0gICAgZm9yICggaSA9IDA7IGkgPCByZXNvdXJjZV9jbnQ7ICsraSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCBvZmZzZXRzW2ldICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0MjsKLSAgICAgIGlmICggRlRfUkVBRF9MT05HKCBybGVuICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBmbGFncyApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgcmxlbiAtPSAyOyAgICAgICAgICAgICAgICAgICAgLyogdGhlIGZsYWdzIGFyZSBwYXJ0IG9mIHRoZSByZXNvdXJjZSAqLwotICAgICAgaWYgKCAoIGZsYWdzID4+IDggKSA9PSB0eXBlICkKLSAgICAgICAgbGVuICs9IHJsZW47Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHBmYl9kYXRhW3BmYl9sZW5wb3MgICAgXSA9IChGVF9CeXRlKSggbGVuICk7Ci0gICAgICAgIHBmYl9kYXRhW3BmYl9sZW5wb3MgKyAxXSA9IChGVF9CeXRlKSggbGVuID4+IDggKTsKLSAgICAgICAgcGZiX2RhdGFbcGZiX2xlbnBvcyArIDJdID0gKEZUX0J5dGUpKCBsZW4gPj4gMTYgKTsKLSAgICAgICAgcGZiX2RhdGFbcGZiX2xlbnBvcyArIDNdID0gKEZUX0J5dGUpKCBsZW4gPj4gMjQgKTsKLQotICAgICAgICBpZiAoICggZmxhZ3MgPj4gOCApID09IDUgKSAgICAgIC8qIEVuZCBvZiBmb250IG1hcmsgKi8KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMHg4MDsKLQotICAgICAgICB0eXBlID0gZmxhZ3MgPj4gODsKLSAgICAgICAgbGVuID0gcmxlbjsKLQotICAgICAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gKEZUX0J5dGUpdHlwZTsKLSAgICAgICAgcGZiX2xlbnBvcyAgICAgICAgICA9IHBmYl9wb3M7Ci0gICAgICAgIHBmYl9kYXRhW3BmYl9wb3MrK10gPSAwOyAgICAgICAgLyogNC1ieXRlIGxlbmd0aCwgZmlsbCBpbiBsYXRlciAqLwotICAgICAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMDsKLSAgICAgICAgcGZiX2RhdGFbcGZiX3BvcysrXSA9IDA7Ci0gICAgICAgIHBmYl9kYXRhW3BmYl9wb3MrK10gPSAwOwotICAgICAgfQotCi0gICAgICBlcnJvciA9IEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIChGVF9CeXRlICopcGZiX2RhdGEgKyBwZmJfcG9zLCBybGVuICk7Ci0gICAgICBwZmJfcG9zICs9IHJsZW47Ci0gICAgfQotCi0gICAgcGZiX2RhdGFbcGZiX3BvcysrXSA9IDB4ODA7Ci0gICAgcGZiX2RhdGFbcGZiX3BvcysrXSA9IDM7Ci0KLSAgICBwZmJfZGF0YVtwZmJfbGVucG9zICAgIF0gPSAoRlRfQnl0ZSkoIGxlbiApOwotICAgIHBmYl9kYXRhW3BmYl9sZW5wb3MgKyAxXSA9IChGVF9CeXRlKSggbGVuID4+IDggKTsKLSAgICBwZmJfZGF0YVtwZmJfbGVucG9zICsgMl0gPSAoRlRfQnl0ZSkoIGxlbiA+PiAxNiApOwotICAgIHBmYl9kYXRhW3BmYl9sZW5wb3MgKyAzXSA9IChGVF9CeXRlKSggbGVuID4+IDI0ICk7Ci0KLSAgICByZXR1cm4gb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmYl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmYl9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmYWNlICk7Ci0KLSAgRXhpdDI6Ci0gICAgRlRfRlJFRSggcGZiX2RhdGEgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogVGhlIHJlc291cmNlIGhlYWRlciBzYXlzIHdlJ3ZlIGdvdCByZXNvdXJjZV9jbnQgYHNmbnQnICAgICAgKi8KLSAgLyogKFRydWVUeXBlL09wZW5UeXBlKSByZXNvdXJjZXMgaW4gdGhpcyBmaWxlLiAgTG9vayB0aHJvdWdoICAgKi8KLSAgLyogdGhlbSBmb3IgdGhlIG9uZSBpbmRpY2F0ZWQgYnkgZmFjZV9pbmRleCwgbG9hZCBpdCBpbnRvIG1lbSwgKi8KLSAgLyogcGFzcyBpdCBvbiB0aGUgdGhlIHRydWV0eXBlIGRyaXZlciBhbmQgcmV0dXJuIGl0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIE1hY19SZWFkX3NmbnRfUmVzb3VyY2UoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmVzb3VyY2VfY250LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9CeXRlKiAgIHNmbnRfZGF0YTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX0xvbmcgICAgZmxhZ19vZmZzZXQ7Ci0gICAgRlRfTG9uZyAgICBybGVuOwotICAgIGludCAgICAgICAgaXNfY2ZmOwotICAgIEZUX0xvbmcgICAgZmFjZV9pbmRleF9pbl9yZXNvdXJjZSA9IDA7Ci0KLQotICAgIGlmICggZmFjZV9pbmRleCA9PSAtMSApCi0gICAgICBmYWNlX2luZGV4ID0gMDsKLSAgICBpZiAoIGZhY2VfaW5kZXggPj0gcmVzb3VyY2VfY250ICkKLSAgICAgIHJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2U7Ci0KLSAgICBmbGFnX29mZnNldCA9IG9mZnNldHNbZmFjZV9pbmRleF07Ci0gICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCBmbGFnX29mZnNldCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9SRUFEX0xPTkcoIHJsZW4gKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgaWYgKCBybGVuID09IC0xICkKLSAgICAgIHJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2U7Ci0KLSAgICBpZiAoIEZUX0FMTE9DKCBzZm50X2RhdGEsIChGVF9Mb25nKXJsZW4gKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSAqKXNmbnRfZGF0YSwgcmxlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaXNfY2ZmID0gcmxlbiA+IDQgJiYgc2ZudF9kYXRhWzBdID09ICdPJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfZGF0YVsxXSA9PSAnVCcgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X2RhdGFbMl0gPT0gJ1QnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2ZudF9kYXRhWzNdID09ICdPJzsKLQotICAgIGVycm9yID0gb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXhfaW5fcmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NmZiA/ICJjZmYiIDogInRydWV0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgcmVzb3VyY2UgZm9yayBoZWFkZXIsIG9yIGEgdmFsaWQgZGZvbnQgICAgKi8KLSAgLyogaGVhZGVyLiAgSW4gYSByZXNvdXJjZSBmb3JrIHRoZSBmaXJzdCAxNiBieXRlcyBhcmUgcmVwZWF0ZWQgKi8KLSAgLyogYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBieXRlcyA0LTcuICBJbiBhIGRmb250IGJ5dGVzICAgKi8KLSAgLyogNC03IHBvaW50IHRvIDE2IGJ5dGVzIG9mIHplcm9lcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIElzTWFjUmVzb3VyY2UoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmVzb3VyY2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX0xvbmcgICAgbWFwX29mZnNldCwgcmRhcmFfcG9zOwotICAgIEZUX0xvbmcgICAgKmRhdGFfb2Zmc2V0czsKLSAgICBGVF9Mb25nICAgIGNvdW50OwotCi0KLSAgICBlcnJvciA9IEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8oIGxpYnJhcnksIHN0cmVhbSwgcmVzb3VyY2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcF9vZmZzZXQsICZyZGFyYV9wb3MgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGVycm9yID0gRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMoIGxpYnJhcnksIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfb2Zmc2V0LCByZGFyYV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTUFLRV9UQUcoICdQJywgJ08nLCAnUycsICdUJyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX29mZnNldHMsICZjb3VudCApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IE1hY19SZWFkX1BPU1RfUmVzb3VyY2UoIGxpYnJhcnksIHN0cmVhbSwgZGF0YV9vZmZzZXRzLCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgICAgIEZUX0ZSRUUoIGRhdGFfb2Zmc2V0cyApOwotICAgICAgLyogUE9TVCBleGlzdHMgaW4gYW4gTFdGTiBwcm92aWRpbmcgYSBzaW5nbGUgZmFjZSAqLwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAoKmFmYWNlKS0+bnVtX2ZhY2VzID0gMTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzKCBsaWJyYXJ5LCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX29mZnNldCwgcmRhcmFfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01BS0VfVEFHKCAncycsICdmJywgJ24nLCAndCcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YV9vZmZzZXRzLCAmY291bnQgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfTG9uZyAgZmFjZV9pbmRleF9pbnRlcm5hbCA9IGZhY2VfaW5kZXggJSBjb3VudDsKLQotCi0gICAgICBlcnJvciA9IE1hY19SZWFkX3NmbnRfUmVzb3VyY2UoIGxpYnJhcnksIHN0cmVhbSwgZGF0YV9vZmZzZXRzLCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleF9pbnRlcm5hbCwgYWZhY2UgKTsKLSAgICAgIEZUX0ZSRUUoIGRhdGFfb2Zmc2V0cyApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAoKmFmYWNlKS0+bnVtX2ZhY2VzID0gY291bnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDaGVjayBmb3IgYSB2YWxpZCBtYWNiaW5hcnkgaGVhZGVyLCBhbmQgaWYgd2UgZmluZCBvbmUgICAqLwotICAvKiBjaGVjayB0aGF0IHRoZSAoZmxhdHRlbmVkKSByZXNvdXJjZSBmb3JrIGluIGl0IGlzIHZhbGlkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgSXNNYWNCaW5hcnkoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgRlRfRmFjZSAgICAqYWZhY2UgKQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAgaGVhZGVyWzEyOF07Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgRlRfTG9uZyAgICAgICAgZGxlbiwgb2Zmc2V0OwotCi0KLSAgICBpZiAoIE5VTEwgPT0gc3RyZWFtICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIChGVF9CeXRlKiloZWFkZXIsIDEyOCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCAgICAgICAgICAgIGhlYWRlclsgMF0gIT0gIDAgfHwKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzc0XSAhPSAgMCB8fAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbODJdICE9ICAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsgMV0gPT0gIDAgfHwKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWyAxXSA+ICAzMyB8fAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNjNdICE9ICAwIHx8Ci0gICAgICAgICBoZWFkZXJbMiArIGhlYWRlclsxXV0gIT0gIDAgKQotICAgICAgcmV0dXJuIEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotCi0gICAgZGxlbiA9ICggaGVhZGVyWzB4NTNdIDw8IDI0ICkgfAotICAgICAgICAgICAoIGhlYWRlclsweDU0XSA8PCAxNiApIHwKLSAgICAgICAgICAgKCBoZWFkZXJbMHg1NV0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgaGVhZGVyWzB4NTZdOwotI2lmIDAKLSAgICBybGVuID0gKCBoZWFkZXJbMHg1N10gPDwgMjQgKSB8Ci0gICAgICAgICAgICggaGVhZGVyWzB4NThdIDw8IDE2ICkgfAotICAgICAgICAgICAoIGhlYWRlclsweDU5XSA8PCAgOCApIHwKLSAgICAgICAgICAgICBoZWFkZXJbMHg1YV07Ci0jZW5kaWYgLyogMCAqLwotICAgIG9mZnNldCA9IDEyOCArICggKCBkbGVuICsgMTI3ICkgJiB+MTI3ICk7Ci0KLSAgICByZXR1cm4gSXNNYWNSZXNvdXJjZSggbGlicmFyeSwgc3RyZWFtLCBvZmZzZXQsIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBsb2FkX2ZhY2VfaW5fZW1iZWRkZWRfcmZvcmsoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAqYWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3Blbl9BcmdzICAqYXJncyApCi0gIHsKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYWNjZXNzCi0KLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotICAgIGludCAgICAgICAgaTsKLQotICAgIGNoYXIgKiAgICAgZmlsZV9uYW1lc1tGVF9SQUNDRVNTX05fUlVMRVNdOwotICAgIEZUX0xvbmcgICAgb2Zmc2V0c1tGVF9SQUNDRVNTX05fUlVMRVNdOwotICAgIEZUX0Vycm9yICAgZXJyb3JzW0ZUX1JBQ0NFU1NfTl9SVUxFU107Ci0KLSAgICBGVF9PcGVuX0FyZ3MgIGFyZ3MyOwotICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtMjsKLQotCi0gICAgRlRfUmFjY2Vzc19HdWVzcyggbGlicmFyeSwgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPnBhdGhuYW1lLCBmaWxlX25hbWVzLCBvZmZzZXRzLCBlcnJvcnMgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfUkFDQ0VTU19OX1JVTEVTOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggZXJyb3JzW2ldICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UzKCggIkVycm9yWyVkXSBoYXMgb2NjdXJyZWQgaW4gcnVsZSAlZFxuIiwgZXJyb3JzW2ldLCBpICkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgYXJnczIuZmxhZ3MgICAgPSBGVF9PUEVOX1BBVEhOQU1FOwotICAgICAgYXJnczIucGF0aG5hbWUgPSBmaWxlX25hbWVzW2ldID8gZmlsZV9uYW1lc1tpXSA6IGFyZ3MtPnBhdGhuYW1lOwotCi0gICAgICBGVF9UUkFDRTMoKCAiVHJ5IHJ1bGUgJWQ6ICVzIChvZmZzZXQ9JWQpIC4uLiIsCi0gICAgICAgICAgICAgICAgICBpLCBhcmdzMi5wYXRobmFtZSwgb2Zmc2V0c1tpXSApKTsKLQotICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fTmV3KCBsaWJyYXJ5LCAmYXJnczIsICZzdHJlYW0yICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UzKCggImZhaWxlZFxuIiApKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gSXNNYWNSZXNvdXJjZSggbGlicmFyeSwgc3RyZWFtMiwgb2Zmc2V0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgICAgIEZUX1N0cmVhbV9GcmVlKCBzdHJlYW0yLCAwICk7Ci0KLSAgICAgIEZUX1RSQUNFMygoICIlc1xuIiwgZXJyb3IgPyAiZmFpbGVkIjogInN1Y2Nlc3NmdWwiICkpOwotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEZUX1JBQ0NFU1NfTl9SVUxFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmICggZmlsZV9uYW1lc1tpXSApCi0gICAgICAgIEZUX0ZSRUUoIGZpbGVfbmFtZXNbaV0gKTsKLSAgICB9Ci0KLSAgICAvKiBDYWxsZXIgKGxvYWRfbWFjX2ZhY2UpIHJlcXVpcmVzIEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0LiAqLwotICAgIGlmICggZXJyb3IgKQotICAgICAgZXJyb3IgPSBGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdDsKLQotICAgIHJldHVybiBlcnJvcjsKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vYmpzCi0KLSAgfQotCi0KLSAgLyogQ2hlY2sgZm9yIHNvbWUgbWFjaW50b3NoIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJcyB0aGlzIGEgbWFjYmluYXJ5IGZpbGU/ICBJZiBzbyBsb29rIGF0IHRoZSByZXNvdXJjZSBmb3JrLiAgICovCi0gIC8qIElzIHRoaXMgYSBtYWMgZGZvbnQgZmlsZT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXMgdGhpcyBhbiBvbGQgc3R5bGUgcmVzb3VyY2UgZm9yaz8gKGluIGRhdGEpICAgICAgICAgICAgICAgICAqLwotICAvKiBFbHNlIGNhbGwgbG9hZF9mYWNlX2luX2VtYmVkZGVkX3Jmb3JrIHRvIHRyeSBleHRyYSBydWxlcyAgICAgICovCi0gIC8qIChkZWZpbmVkIGluIGBmdHJmb3JrLmMnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF9tYWNfZmFjZSggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICphZmFjZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3Blbl9BcmdzICAqYXJncyApCi0gIHsKLSAgICBGVF9FcnJvciBlcnJvcjsKLSAgICBGVF9VTlVTRUQoIGFyZ3MgKTsKLQotCi0gICAgZXJyb3IgPSBJc01hY0JpbmFyeSggbGlicmFyeSwgc3RyZWFtLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICAgIGlmICggRlRfRVJST1JfQkFTRSggZXJyb3IgKSA9PSBGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdCApCi0gICAgewotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3JhY2Nlc3MKLQotICAgICAgRlRfVFJBQ0UzKCggIlRyeSBhcyBkZm9udDogJXMgLi4uIiwgYXJncy0+cGF0aG5hbWUgKSk7Ci0KLSAgICAgIGVycm9yID0gSXNNYWNSZXNvdXJjZSggbGlicmFyeSwgc3RyZWFtLCAwLCBmYWNlX2luZGV4LCBhZmFjZSApOwotCi0gICAgICBGVF9UUkFDRTMoKCAiJXNcbiIsIGVycm9yID8gImZhaWxlZCIgOiAic3VjY2Vzc2Z1bCIgKSk7Ci0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb2JqcwotCi0gICAgfQotCi0gICAgaWYgKCAoIEZUX0VSUk9SX0JBU0UoIGVycm9yICkgPT0gRlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQgICAgICB8fAotICAgICAgICAgICBGVF9FUlJPUl9CQVNFKCBlcnJvciApID09IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKSAmJgotICAgICAgICAgKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fUEFUSE5BTUUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICBlcnJvciA9IGxvYWRfZmFjZV9pbl9lbWJlZGRlZF9yZm9yayggbGlicmFyeSwgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsIGFmYWNlLCBhcmdzICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAgLyogIUZUX01BQ0lOVE9TSCAmJiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUyAqLwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PcGVuX0ZhY2UoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgY29uc3QgRlRfT3Blbl9BcmdzKiAgYXJncywKLSAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgKmFmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9Ecml2ZXIgICAgZHJpdmVyOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnk7Ci0gICAgRlRfU3RyZWFtICAgIHN0cmVhbTsKLSAgICBGVF9GYWNlICAgICAgZmFjZSA9IDA7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGUgPSAwOwotICAgIEZUX0Jvb2wgICAgICBleHRlcm5hbF9zdHJlYW07Ci0gICAgRlRfTW9kdWxlKiAgIGN1cjsKLSAgICBGVF9Nb2R1bGUqICAgbGltaXQ7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBkZWxheWVkIHRvICovCi0gICAgLyogRlRfU3RyZWFtX05ldygpICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGlmICggKCAhYWZhY2UgJiYgZmFjZV9pbmRleCA+PSAwICkgfHwgIWFyZ3MgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgZXh0ZXJuYWxfc3RyZWFtID0gRlRfQk9PTCggKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fU1RSRUFNICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5zdHJlYW0gICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgLyogY3JlYXRlIGlucHV0IHN0cmVhbSAqLwotICAgIGVycm9yID0gRlRfU3RyZWFtX05ldyggbGlicmFyeSwgYXJncywgJnN0cmVhbSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBGYWlsMzsKLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIC8qIElmIHRoZSBmb250IGRyaXZlciBpcyBzcGVjaWZpZWQgaW4gdGhlIGBhcmdzJyBzdHJ1Y3R1cmUsIHVzZSAqLwotICAgIC8qIGl0LiAgT3RoZXJ3aXNlLCB3ZSBzY2FuIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgZHJpdmVycy4gICAgICAqLwotICAgIGlmICggKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fRFJJVkVSICkgJiYgYXJncy0+ZHJpdmVyICkKLSAgICB7Ci0gICAgICBkcml2ZXIgPSBGVF9EUklWRVIoIGFyZ3MtPmRyaXZlciApOwotCi0gICAgICAvKiBub3QgYWxsIG1vZHVsZXMgYXJlIGRyaXZlcnMsIHNvIGNoZWNrLi4uICovCi0gICAgICBpZiAoIEZUX01PRFVMRV9JU19EUklWRVIoIGRyaXZlciApICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcyA9IDA7Ci0gICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyAgICAgPSAwOwotCi0KLSAgICAgICAgaWYgKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fUEFSQU1TICkKLSAgICAgICAgewotICAgICAgICAgIG51bV9wYXJhbXMgPSBhcmdzLT5udW1fcGFyYW1zOwotICAgICAgICAgIHBhcmFtcyAgICAgPSBhcmdzLT5wYXJhbXM7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnJvciA9IG9wZW5fZmFjZSggZHJpdmVyLCBzdHJlYW0sIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFyYW1zLCBwYXJhbXMsICZmYWNlICk7Ci0gICAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgICBnb3RvIFN1Y2Nlc3M7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfSGFuZGxlOwotCi0gICAgICBGVF9TdHJlYW1fRnJlZSggc3RyZWFtLCBleHRlcm5hbF9zdHJlYW0gKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGNoZWNrIGVhY2ggZm9udCBkcml2ZXIgZm9yIGFuIGFwcHJvcHJpYXRlIGZvcm1hdCAqLwotICAgICAgY3VyICAgPSBsaWJyYXJ5LT5tb2R1bGVzOwotICAgICAgbGltaXQgPSBjdXIgKyBsaWJyYXJ5LT5udW1fbW9kdWxlczsKLQotCi0gICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCi0gICAgICB7Ci0gICAgICAgIC8qIG5vdCBhbGwgbW9kdWxlcyBhcmUgZm9udCBkcml2ZXJzLCBzbyBjaGVjay4uLiAqLwotICAgICAgICBpZiAoIEZUX01PRFVMRV9JU19EUklWRVIoIGN1clswXSApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMgPSAwOwotICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyAgICAgPSAwOwotCi0KLSAgICAgICAgICBkcml2ZXIgPSBGVF9EUklWRVIoIGN1clswXSApOwotCi0gICAgICAgICAgaWYgKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fUEFSQU1TICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBudW1fcGFyYW1zID0gYXJncy0+bnVtX3BhcmFtczsKLSAgICAgICAgICAgIHBhcmFtcyAgICAgPSBhcmdzLT5wYXJhbXM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZXJyb3IgPSBvcGVuX2ZhY2UoIGRyaXZlciwgc3RyZWFtLCBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFyYW1zLCBwYXJhbXMsICZmYWNlICk7Ci0gICAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgICAgZ290byBTdWNjZXNzOwotCi0gICAgICAgICAgaWYgKCBGVF9FUlJPUl9CQVNFKCBlcnJvciApICE9IEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0ICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDM7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICBGYWlsMzoKLSAgICAvKiBJZiB3ZSBhcmUgb24gdGhlIG1hYywgYW5kIHdlIGdldCBhbiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICovCi0gICAgLyogaXQgbWF5IGJlIGJlY2F1c2Ugd2UgaGF2ZSBhbiBlbXB0eSBkYXRhIGZvcmssIHNvIHdlIG5lZWQgdG8gY2hlY2sgICAqLwotICAgIC8qIHRoZSByZXNvdXJjZSBmb3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIEZUX0VSUk9SX0JBU0UoIGVycm9yICkgIT0gRlRfRXJyX0Nhbm5vdF9PcGVuX1N0cmVhbSAgICAgICAmJgotICAgICAgICAgRlRfRVJST1JfQkFTRSggZXJyb3IgKSAhPSBGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdCAgICAgICYmCi0gICAgICAgICBGVF9FUlJPUl9CQVNFKCBlcnJvciApICE9IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKQotICAgICAgZ290byBGYWlsMjsKLQotI2lmICFkZWZpbmVkKCBGVF9NQUNJTlRPU0ggKSAmJiBkZWZpbmVkKCBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUyApCi0gICAgZXJyb3IgPSBsb2FkX21hY19mYWNlKCBsaWJyYXJ5LCBzdHJlYW0sIGZhY2VfaW5kZXgsIGFmYWNlLCBhcmdzICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gZ28gdG8gU3VjY2VzcyBoZXJlLiAgV2UndmUgYWxyZWFkeSBkb25lIHRoYXQuICovCi0gICAgICAvKiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2Ugc3VjY2VlZGVkIHdlIHN0aWxsIG5lZWQgdG8gY2xvc2UgdGhpcyAqLwotICAgICAgLyogc3RyZWFtICh3ZSBvcGVuZWQgYSBkaWZmZXJlbnQgc3RyZWFtIHdoaWNoIGV4dHJhY3RlZCB0aGUgICAgICAgKi8KLSAgICAgIC8qIGludGVyZXN0aW5nIGluZm9ybWF0aW9uIG91dCBvZiB0aGlzIHN0cmVhbSBoZXJlLiAgVGhhdCBzdHJlYW0gICovCi0gICAgICAvKiB3aWxsIHN0aWxsIGJlIG9wZW4gYW5kIHRoZSBmYWNlIHdpbGwgcG9pbnQgdG8gaXQpLiAgICAgICAgICAgICAqLwotICAgICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbSwgZXh0ZXJuYWxfc3RyZWFtICk7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9FUlJPUl9CQVNFKCBlcnJvciApICE9IEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0ICkKLSAgICAgIGdvdG8gRmFpbDI7Ci0jZW5kaWYgIC8qICFGVF9NQUNJTlRPU0ggJiYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMgKi8KLQotICAgICAgLyogbm8gZHJpdmVyIGlzIGFibGUgdG8gaGFuZGxlIHRoaXMgZm9ybWF0ICovCi0gICAgICBlcnJvciA9IEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotCi0gIEZhaWwyOgotICAgICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbSwgZXh0ZXJuYWxfc3RyZWFtICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gIFN1Y2Nlc3M6Ci0gICAgRlRfVFJBQ0U0KCggIkZUX09wZW5fRmFjZTogTmV3IGZhY2Ugb2JqZWN0LCBhZGRpbmcgdG8gbGlzdFxuIiApKTsKLQotICAgIC8qIHNldCB0aGUgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSBiaXQgZm9yIEZUX0RvbmVfRmFjZSAqLwotICAgIGlmICggZXh0ZXJuYWxfc3RyZWFtICkKLSAgICAgIGZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTTsKLQotICAgIC8qIGFkZCB0aGUgZmFjZSBvYmplY3QgdG8gaXRzIGRyaXZlcidzIGxpc3QgKi8KLSAgICBpZiAoIEZUX05FVyggbm9kZSApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIG5vZGUtPmRhdGEgPSBmYWNlOwotICAgIC8qIGRvbid0IGFzc3VtZSBkcml2ZXIgaXMgdGhlIHNhbWUgYXMgZmFjZS0+ZHJpdmVyLCBzbyB1c2UgKi8KLSAgICAvKiBmYWNlLT5kcml2ZXIgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfTGlzdF9BZGQoICZmYWNlLT5kcml2ZXItPmZhY2VzX2xpc3QsIG5vZGUgKTsKLQotICAgIC8qIG5vdyBhbGxvY2F0ZSBhIGdseXBoIHNsb3Qgb2JqZWN0IGZvciB0aGUgZmFjZSAqLwotICAgIEZUX1RSQUNFNCgoICJGVF9PcGVuX0ZhY2U6IENyZWF0aW5nIGdseXBoIHNsb3RcbiIgKSk7Ci0KLSAgICBpZiAoIGZhY2VfaW5kZXggPj0gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9OZXdfR2x5cGhTbG90KCBmYWNlLCBOVUxMICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBmaW5hbGx5LCBhbGxvY2F0ZSBhIHNpemUgb2JqZWN0IGZvciB0aGUgZmFjZSAqLwotICAgICAgewotICAgICAgICBGVF9TaXplICBzaXplOwotCi0KLSAgICAgICAgRlRfVFJBQ0U0KCggIkZUX09wZW5fRmFjZTogQ3JlYXRpbmcgc2l6ZSBvYmplY3RcbiIgKSk7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9OZXdfU2l6ZSggZmFjZSwgJnNpemUgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGZhY2UtPnNpemUgPSBzaXplOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHNvbWUgY2hlY2tzICovCi0KLSAgICBpZiAoIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkgKQotICAgIHsKLSAgICAgIGlmICggZmFjZS0+aGVpZ2h0IDwgMCApCi0gICAgICAgIGZhY2UtPmhlaWdodCA9IChGVF9TaG9ydCktZmFjZS0+aGVpZ2h0OwotCi0gICAgICBpZiAoICFGVF9IQVNfVkVSVElDQUwoIGZhY2UgKSApCi0gICAgICAgIGZhY2UtPm1heF9hZHZhbmNlX2hlaWdodCA9IChGVF9TaG9ydClmYWNlLT5oZWlnaHQ7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9IQVNfRklYRURfU0laRVMoIGZhY2UgKSApCi0gICAgewotICAgICAgRlRfSW50ICBpOwotCi0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZS0+bnVtX2ZpeGVkX3NpemVzOyBpKysgKQotICAgICAgewotICAgICAgICBGVF9CaXRtYXBfU2l6ZSogIGJzaXplID0gZmFjZS0+YXZhaWxhYmxlX3NpemVzICsgaTsKLQotCi0gICAgICAgIGlmICggYnNpemUtPmhlaWdodCA8IDAgKQotICAgICAgICAgIGJzaXplLT5oZWlnaHQgPSAoRlRfU2hvcnQpLWJzaXplLT5oZWlnaHQ7Ci0gICAgICAgIGlmICggYnNpemUtPnhfcHBlbSA8IDAgKQotICAgICAgICAgIGJzaXplLT54X3BwZW0gPSAoRlRfU2hvcnQpLWJzaXplLT54X3BwZW07Ci0gICAgICAgIGlmICggYnNpemUtPnlfcHBlbSA8IDAgKQotICAgICAgICAgIGJzaXplLT55X3BwZW0gPSAtYnNpemUtPnlfcHBlbTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIGludGVybmFsIGZhY2UgZGF0YSAqLwotICAgIHsKLSAgICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsID0gZmFjZS0+aW50ZXJuYWw7Ci0KLQotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueHggPSAweDEwMDAwTDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnh5ID0gMDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnl4ID0gMDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnl5ID0gMHgxMDAwMEw7Ci0KLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEueCA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhLnkgPSAwOwotICAgIH0KLQotICAgIGlmICggYWZhY2UgKQotICAgICAgKmFmYWNlID0gZmFjZTsKLSAgICBlbHNlCi0gICAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsKLQotICAgIGdvdG8gRXhpdDsKLQotICBGYWlsOgotICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOwotCi0gIEV4aXQ6Ci0gICAgRlRfVFJBQ0U0KCggIkZUX09wZW5fRmFjZTogUmV0dXJuICVkXG4iLCBlcnJvciApKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9BdHRhY2hfRmlsZSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lICkKLSAgewotICAgIEZUX09wZW5fQXJncyAgb3BlbjsKLQotCi0gICAgLyogdGVzdCBmb3IgdmFsaWQgYGZhY2UnIGRlbGF5ZWQgdG8gRlRfQXR0YWNoX1N0cmVhbSgpICovCi0KLSAgICBpZiAoICFmaWxlcGF0aG5hbWUgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgb3Blbi5zdHJlYW0gICA9IE5VTEw7Ci0gICAgb3Blbi5mbGFncyAgICA9IEZUX09QRU5fUEFUSE5BTUU7Ci0gICAgb3Blbi5wYXRobmFtZSA9IChjaGFyKilmaWxlcGF0aG5hbWU7Ci0KLSAgICByZXR1cm4gRlRfQXR0YWNoX1N0cmVhbSggZmFjZSwgJm9wZW4gKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9BdHRhY2hfU3RyZWFtKCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9PcGVuX0FyZ3MqICBwYXJhbWV0ZXJzICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfRHJpdmVyICBkcml2ZXI7Ci0KLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6OwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgcGFyYW1ldGVycycgZGVsYXllZCB0byBGVF9TdHJlYW1fTmV3KCkgKi8KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOwotCi0gICAgZHJpdmVyID0gZmFjZS0+ZHJpdmVyOwotICAgIGlmICggIWRyaXZlciApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRHJpdmVyX0hhbmRsZTsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX05ldyggZHJpdmVyLT5yb290LmxpYnJhcnksIHBhcmFtZXRlcnMsICZzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHdlIGltcGxlbWVudCBGVF9BdHRhY2hfU3RyZWFtIGluIGVhY2ggZHJpdmVyIHRocm91Z2ggdGhlICovCi0gICAgLyogYGF0dGFjaF9maWxlJyBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGVycm9yID0gRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLSAgICBjbGF6eiA9IGRyaXZlci0+Y2xheno7Ci0gICAgaWYgKCBjbGF6ei0+YXR0YWNoX2ZpbGUgKQotICAgICAgZXJyb3IgPSBjbGF6ei0+YXR0YWNoX2ZpbGUoIGZhY2UsIHN0cmVhbSApOwotCi0gICAgLyogY2xvc2UgdGhlIGF0dGFjaGVkIHN0cmVhbSAqLwotICAgIEZUX1N0cmVhbV9GcmVlKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIChGVF9Cb29sKSggcGFyYW1ldGVycy0+c3RyZWFtICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBwYXJhbWV0ZXJzLT5mbGFncyAmIEZUX09QRU5fU1RSRUFNICkgKSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfRmFjZSggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgRlRfRHJpdmVyICAgIGRyaXZlcjsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotICAgIEZUX0xpc3ROb2RlICBub2RlOwotCi0KLSAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOwotICAgIGlmICggZmFjZSAmJiBmYWNlLT5kcml2ZXIgKQotICAgIHsKLSAgICAgIGRyaXZlciA9IGZhY2UtPmRyaXZlcjsKLSAgICAgIG1lbW9yeSA9IGRyaXZlci0+cm9vdC5tZW1vcnk7Ci0KLSAgICAgIC8qIGZpbmQgZmFjZSBpbiBkcml2ZXIncyBsaXN0ICovCi0gICAgICBub2RlID0gRlRfTGlzdF9GaW5kKCAmZHJpdmVyLT5mYWNlc19saXN0LCBmYWNlICk7Ci0gICAgICBpZiAoIG5vZGUgKQotICAgICAgewotICAgICAgICAvKiByZW1vdmUgZmFjZSBvYmplY3QgZnJvbSB0aGUgZHJpdmVyJ3MgbGlzdCAqLwotICAgICAgICBGVF9MaXN0X1JlbW92ZSggJmRyaXZlci0+ZmFjZXNfbGlzdCwgbm9kZSApOwotICAgICAgICBGVF9GUkVFKCBub2RlICk7Ci0KLSAgICAgICAgLyogbm93IGRlc3Ryb3kgdGhlIG9iamVjdCBwcm9wZXIgKi8KLSAgICAgICAgZGVzdHJveV9mYWNlKCBtZW1vcnksIGZhY2UsIGRyaXZlciApOwotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfU2l6ZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICBGVF9TaXplICAqYXNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeTsKLSAgICBGVF9Ecml2ZXIgICAgICAgIGRyaXZlcjsKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6OwotCi0gICAgRlRfU2l6ZSAgICAgICAgICBzaXplID0gMDsKLSAgICBGVF9MaXN0Tm9kZSAgICAgIG5vZGUgPSAwOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKLQotICAgIGlmICggIWFzaXplICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TaXplX0hhbmRsZTsKLQotICAgIGlmICggIWZhY2UtPmRyaXZlciApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRHJpdmVyX0hhbmRsZTsKLQotICAgICphc2l6ZSA9IDA7Ci0KLSAgICBkcml2ZXIgPSBmYWNlLT5kcml2ZXI7Ci0gICAgY2xhenogID0gZHJpdmVyLT5jbGF6ejsKLSAgICBtZW1vcnkgPSBmYWNlLT5tZW1vcnk7Ci0KLSAgICAvKiBBbGxvY2F0ZSBuZXcgc2l6ZSBvYmplY3QgYW5kIHBlcmZvcm0gYmFzaWMgaW5pdGlhbGlzYXRpb24gKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBzaXplLCBjbGF6ei0+c2l6ZV9vYmplY3Rfc2l6ZSApIHx8IEZUX05FVyggbm9kZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHNpemUtPmZhY2UgPSBmYWNlOwotCi0gICAgLyogZm9yIG5vdywgZG8gbm90IHVzZSBhbnkgaW50ZXJuYWwgZmllbGRzIGluIHNpemUgb2JqZWN0cyAqLwotICAgIHNpemUtPmludGVybmFsID0gMDsKLQotICAgIGlmICggY2xhenotPmluaXRfc2l6ZSApCi0gICAgICBlcnJvciA9IGNsYXp6LT5pbml0X3NpemUoIHNpemUgKTsKLQotICAgIC8qIGluIGNhc2Ugb2Ygc3VjY2VzcywgYWRkIHRvIHRoZSBmYWNlJ3MgbGlzdCAqLwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICAqYXNpemUgICAgID0gc2l6ZTsKLSAgICAgIG5vZGUtPmRhdGEgPSBzaXplOwotICAgICAgRlRfTGlzdF9BZGQoICZmYWNlLT5zaXplc19saXN0LCBub2RlICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfRlJFRSggbm9kZSApOwotICAgICAgRlRfRlJFRSggc2l6ZSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9TaXplKCBGVF9TaXplICBzaXplICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9Ecml2ZXIgICAgZHJpdmVyOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnk7Ci0gICAgRlRfRmFjZSAgICAgIGZhY2U7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGU7Ci0KLQotICAgIGlmICggIXNpemUgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1NpemVfSGFuZGxlOwotCi0gICAgZmFjZSA9IHNpemUtPmZhY2U7Ci0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7Ci0KLSAgICBkcml2ZXIgPSBmYWNlLT5kcml2ZXI7Ci0gICAgaWYgKCAhZHJpdmVyICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Ecml2ZXJfSGFuZGxlOwotCi0gICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLQotICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIG5vZGUgID0gRlRfTGlzdF9GaW5kKCAmZmFjZS0+c2l6ZXNfbGlzdCwgc2l6ZSApOwotICAgIGlmICggbm9kZSApCi0gICAgewotICAgICAgRlRfTGlzdF9SZW1vdmUoICZmYWNlLT5zaXplc19saXN0LCBub2RlICk7Ci0gICAgICBGVF9GUkVFKCBub2RlICk7Ci0KLSAgICAgIGlmICggZmFjZS0+c2l6ZSA9PSBzaXplICkKLSAgICAgIHsKLSAgICAgICAgZmFjZS0+c2l6ZSA9IDA7Ci0gICAgICAgIGlmICggZmFjZS0+c2l6ZXNfbGlzdC5oZWFkICkKLSAgICAgICAgICBmYWNlLT5zaXplID0gKEZUX1NpemUpKGZhY2UtPnNpemVzX2xpc3QuaGVhZC0+ZGF0YSk7Ci0gICAgICB9Ci0KLSAgICAgIGRlc3Ryb3lfc2l6ZSggbWVtb3J5LCBzaXplLCBkcml2ZXIgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TaXplX0hhbmRsZTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX01hdGNoX1NpemUoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEsCi0gICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgaWdub3JlX3dpZHRoLAotICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgIHNpemVfaW5kZXggKQotICB7Ci0gICAgRlRfSW50ICAgaTsKLSAgICBGVF9Mb25nICB3LCBoOwotCi0KLSAgICBpZiAoICFGVF9IQVNfRklYRURfU0laRVMoIGZhY2UgKSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7Ci0KLSAgICAvKiBGVF9CaXRtYXBfU2l6ZSBkb2Vzbid0IHByb3ZpZGUgZW5vdWdoIGluZm8uLi4gKi8KLSAgICBpZiAoIHJlcS0+dHlwZSAhPSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMICkKLSAgICAgIHJldHVybiBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlOwotCi0gICAgdyA9IEZUX1JFUVVFU1RfV0lEVEggKCByZXEgKTsKLSAgICBoID0gRlRfUkVRVUVTVF9IRUlHSFQoIHJlcSApOwotCi0gICAgaWYgKCByZXEtPndpZHRoICYmICFyZXEtPmhlaWdodCApCi0gICAgICBoID0gdzsKLSAgICBlbHNlIGlmICggIXJlcS0+d2lkdGggJiYgcmVxLT5oZWlnaHQgKQotICAgICAgdyA9IGg7Ci0KLSAgICB3ID0gRlRfUElYX1JPVU5EKCB3ICk7Ci0gICAgaCA9IEZUX1BJWF9ST1VORCggaCApOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBmYWNlLT5udW1fZml4ZWRfc2l6ZXM7IGkrKyApCi0gICAgewotICAgICAgRlRfQml0bWFwX1NpemUqICBic2l6ZSA9IGZhY2UtPmF2YWlsYWJsZV9zaXplcyArIGk7Ci0KLQotICAgICAgaWYgKCBoICE9IEZUX1BJWF9ST1VORCggYnNpemUtPnlfcHBlbSApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggdyA9PSBGVF9QSVhfUk9VTkQoIGJzaXplLT54X3BwZW0gKSB8fCBpZ25vcmVfd2lkdGggKQotICAgICAgewotICAgICAgICBpZiAoIHNpemVfaW5kZXggKQotICAgICAgICAgICpzaXplX2luZGV4ID0gKEZUX1VMb25nKWk7Ci0KLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfUGl4ZWxfU2l6ZTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfc3ludGhlc2l6ZV92ZXJ0aWNhbF9tZXRyaWNzKCBGVF9HbHlwaF9NZXRyaWNzKiAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgYWR2YW5jZSApCi0gIHsKLSAgICAvKiB0aGUgZmFjdG9yIDEuMiBpcyBhIGhldXJpc3RpY2FsIHZhbHVlICovCi0gICAgaWYgKCAhYWR2YW5jZSApCi0gICAgICBhZHZhbmNlID0gbWV0cmljcy0+aGVpZ2h0ICogMTIgLyAxMDsKLQotICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IC0oIG1ldHJpY3MtPndpZHRoIC8gMiApOwotICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9ICggYWR2YW5jZSAtIG1ldHJpY3MtPmhlaWdodCApIC8gMjsKLSAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSBhZHZhbmNlOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9yZWNvbXB1dGVfc2NhbGVkX21ldHJpY3MoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyApCi0gIHsKLSAgICAvKiBDb21wdXRlIHJvb3QgYXNjZW5kZXIsIGRlc2NlbmRlciwgdGVzdCBoZWlnaHQsIGFuZCBtYXhfYWR2YW5jZSAqLwotCi0jaWZkZWYgR1JJRF9GSVRfTUVUUklDUwotICAgIG1ldHJpY3MtPmFzY2VuZGVyICAgID0gRlRfUElYX0NFSUwoIEZUX011bEZpeCggZmFjZS0+YXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gRlRfUElYX0ZMT09SKCBGVF9NdWxGaXgoIGZhY2UtPmRlc2NlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gRlRfUElYX1JPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gRlRfUElYX1JPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPm1heF9hZHZhbmNlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnhfc2NhbGUgKSApOwotI2Vsc2UgLyogIUdSSURfRklUX01FVFJJQ1MgKi8KLSAgICBtZXRyaWNzLT5hc2NlbmRlciAgICA9IEZUX011bEZpeCggZmFjZS0+YXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gRlRfTXVsRml4KCBmYWNlLT5kZXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gRlRfTXVsRml4KCBmYWNlLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gRlRfTXVsRml4KCBmYWNlLT5tYXhfYWR2YW5jZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSApOwotI2VuZGlmIC8qICFHUklEX0ZJVF9NRVRSSUNTICovCi0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfU2VsZWN0X01ldHJpY3MoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHN0cmlrZV9pbmRleCApCi0gIHsKLSAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzOwotICAgIEZUX0JpdG1hcF9TaXplKiAgIGJzaXplOwotCi0KLSAgICBtZXRyaWNzID0gJmZhY2UtPnNpemUtPm1ldHJpY3M7Ci0gICAgYnNpemUgICA9IGZhY2UtPmF2YWlsYWJsZV9zaXplcyArIHN0cmlrZV9pbmRleDsKLQotICAgIG1ldHJpY3MtPnhfcHBlbSA9IChGVF9VU2hvcnQpKCAoIGJzaXplLT54X3BwZW0gKyAzMiApID4+IDYgKTsKLSAgICBtZXRyaWNzLT55X3BwZW0gPSAoRlRfVVNob3J0KSggKCBic2l6ZS0+eV9wcGVtICsgMzIgKSA+PiA2ICk7Ci0KLSAgICBpZiAoIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkgKQotICAgIHsKLSAgICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBGVF9EaXZGaXgoIGJzaXplLT54X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT51bml0c19wZXJfRU0gKTsKLSAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSBGVF9EaXZGaXgoIGJzaXplLT55X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT51bml0c19wZXJfRU0gKTsKLQotICAgICAgZnRfcmVjb21wdXRlX3NjYWxlZF9tZXRyaWNzKCBmYWNlLCBtZXRyaWNzICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtZXRyaWNzLT54X3NjYWxlICAgICA9IDFMIDw8IDIyOwotICAgICAgbWV0cmljcy0+eV9zY2FsZSAgICAgPSAxTCA8PCAyMjsKLSAgICAgIG1ldHJpY3MtPmFzY2VuZGVyICAgID0gYnNpemUtPnlfcHBlbTsKLSAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gMDsKLSAgICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gYnNpemUtPmhlaWdodCA8PCA2OwotICAgICAgbWV0cmljcy0+bWF4X2FkdmFuY2UgPSBic2l6ZS0+eF9wcGVtOwotICAgIH0KLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9SZXF1ZXN0X01ldHJpY3MoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApCi0gIHsKLSAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzOwotCi0KLSAgICBtZXRyaWNzID0gJmZhY2UtPnNpemUtPm1ldHJpY3M7Ci0KLSAgICBpZiAoIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgIHcgPSAwLCBoID0gMCwgc2NhbGVkX3cgPSAwLCBzY2FsZWRfaCA9IDA7Ci0KLQotICAgICAgc3dpdGNoICggcmVxLT50eXBlICkKLSAgICAgIHsKLSAgICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTDoKLSAgICAgICAgdyA9IGggPSBmYWNlLT51bml0c19wZXJfRU07Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1JFQUxfRElNOgotICAgICAgICB3ID0gaCA9IGZhY2UtPmFzY2VuZGVyIC0gZmFjZS0+ZGVzY2VuZGVyOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9CQk9YOgotICAgICAgICB3ID0gZmFjZS0+YmJveC54TWF4IC0gZmFjZS0+YmJveC54TWluOwotICAgICAgICBoID0gZmFjZS0+YmJveC55TWF4IC0gZmFjZS0+YmJveC55TWluOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9DRUxMOgotICAgICAgICB3ID0gZmFjZS0+bWF4X2FkdmFuY2Vfd2lkdGg7Ci0gICAgICAgIGggPSBmYWNlLT5hc2NlbmRlciAtIGZhY2UtPmRlc2NlbmRlcjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfU0NBTEVTOgotICAgICAgICBtZXRyaWNzLT54X3NjYWxlID0gKEZUX0ZpeGVkKXJlcS0+d2lkdGg7Ci0gICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSAoRlRfRml4ZWQpcmVxLT5oZWlnaHQ7Ci0gICAgICAgIGlmICggIW1ldHJpY3MtPnhfc2NhbGUgKQotICAgICAgICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBtZXRyaWNzLT55X3NjYWxlOwotICAgICAgICBlbHNlIGlmICggIW1ldHJpY3MtPnlfc2NhbGUgKQotICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSBtZXRyaWNzLT54X3NjYWxlOwotICAgICAgICBnb3RvIENhbGN1bGF0ZV9QcGVtOwotCi0gICAgICBjYXNlIEZUX1NJWkVfUkVRVUVTVF9UWVBFX01BWDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgKi8KLSAgICAgIGlmICggdyA8IDAgKQotICAgICAgICB3ID0gLXc7Ci0KLSAgICAgIGlmICggaCA8IDAgKQotICAgICAgICBoID0gLWg7Ci0KLSAgICAgIHNjYWxlZF93ID0gRlRfUkVRVUVTVF9XSURUSCAoIHJlcSApOwotICAgICAgc2NhbGVkX2ggPSBGVF9SRVFVRVNUX0hFSUdIVCggcmVxICk7Ci0KLSAgICAgIC8qIGRldGVybWluZSBzY2FsZXMgKi8KLSAgICAgIGlmICggcmVxLT53aWR0aCApCi0gICAgICB7Ci0gICAgICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBGVF9EaXZGaXgoIHNjYWxlZF93LCB3ICk7Ci0KLSAgICAgICAgaWYgKCByZXEtPmhlaWdodCApCi0gICAgICAgIHsKLSAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gRlRfRGl2Rml4KCBzY2FsZWRfaCwgaCApOwotCi0gICAgICAgICAgaWYgKCByZXEtPnR5cGUgPT0gRlRfU0laRV9SRVFVRVNUX1RZUEVfQ0VMTCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBtZXRyaWNzLT55X3NjYWxlID4gbWV0cmljcy0+eF9zY2FsZSApCi0gICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSBtZXRyaWNzLT54X3NjYWxlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlID0gbWV0cmljcy0+eV9zY2FsZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSA9IG1ldHJpY3MtPnhfc2NhbGU7Ci0gICAgICAgICAgc2NhbGVkX2ggPSBGVF9NdWxEaXYoIHNjYWxlZF93LCBoLCB3ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbWV0cmljcy0+eF9zY2FsZSA9IG1ldHJpY3MtPnlfc2NhbGUgPSBGVF9EaXZGaXgoIHNjYWxlZF9oLCBoICk7Ci0gICAgICAgIHNjYWxlZF93ID0gRlRfTXVsRGl2KCBzY2FsZWRfaCwgdywgaCApOwotICAgICAgfQotCi0gIENhbGN1bGF0ZV9QcGVtOgotICAgICAgLyogY2FsY3VsYXRlIHRoZSBwcGVtcyAqLwotICAgICAgaWYgKCByZXEtPnR5cGUgIT0gRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTCApCi0gICAgICB7Ci0gICAgICAgIHNjYWxlZF93ID0gRlRfTXVsRml4KCBmYWNlLT51bml0c19wZXJfRU0sIG1ldHJpY3MtPnhfc2NhbGUgKTsKLSAgICAgICAgc2NhbGVkX2ggPSBGVF9NdWxGaXgoIGZhY2UtPnVuaXRzX3Blcl9FTSwgbWV0cmljcy0+eV9zY2FsZSApOwotICAgICAgfQotCi0gICAgICBtZXRyaWNzLT54X3BwZW0gPSAoRlRfVVNob3J0KSggKCBzY2FsZWRfdyArIDMyICkgPj4gNiApOwotICAgICAgbWV0cmljcy0+eV9wcGVtID0gKEZUX1VTaG9ydCkoICggc2NhbGVkX2ggKyAzMiApID4+IDYgKTsKLQotICAgICAgZnRfcmVjb21wdXRlX3NjYWxlZF9tZXRyaWNzKCBmYWNlLCBtZXRyaWNzICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9aRVJPKCBtZXRyaWNzICk7Ci0gICAgICBtZXRyaWNzLT54X3NjYWxlID0gMUwgPDwgMjI7Ci0gICAgICBtZXRyaWNzLT55X3NjYWxlID0gMUwgPDwgMjI7Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9TaXplKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgc3RyaWtlX2luZGV4ICkKLSAgewotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7Ci0KLQotICAgIGlmICggIWZhY2UgfHwgIUZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKLQotICAgIGlmICggc3RyaWtlX2luZGV4IDwgMCB8fCBzdHJpa2VfaW5kZXggPj0gZmFjZS0+bnVtX2ZpeGVkX3NpemVzICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIGNsYXp6ID0gZmFjZS0+ZHJpdmVyLT5jbGF6ejsKLQotICAgIGlmICggY2xhenotPnNlbGVjdF9zaXplICkKLSAgICAgIHJldHVybiBjbGF6ei0+c2VsZWN0X3NpemUoIGZhY2UtPnNpemUsIChGVF9VTG9uZylzdHJpa2VfaW5kZXggKTsKLQotICAgIEZUX1NlbGVjdF9NZXRyaWNzKCBmYWNlLCAoRlRfVUxvbmcpc3RyaWtlX2luZGV4ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1JlcXVlc3RfU2l6ZSggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICkKLSAgewotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7Ci0gICAgRlRfVUxvbmcgICAgICAgICBzdHJpa2VfaW5kZXg7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOwotCi0gICAgaWYgKCAhcmVxIHx8IHJlcS0+d2lkdGggPCAwIHx8IHJlcS0+aGVpZ2h0IDwgMCB8fAotICAgICAgICAgcmVxLT50eXBlID49IEZUX1NJWkVfUkVRVUVTVF9UWVBFX01BWCApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBjbGF6eiA9IGZhY2UtPmRyaXZlci0+Y2xheno7Ci0KLSAgICBpZiAoIGNsYXp6LT5yZXF1ZXN0X3NpemUgKQotICAgICAgcmV0dXJuIGNsYXp6LT5yZXF1ZXN0X3NpemUoIGZhY2UtPnNpemUsIHJlcSApOwotCi0gICAgLyoKLSAgICAgKiBUaGUgcmVhc29uIHRoYXQgYSBkcml2ZXIgZG9lc24ndCBoYXZlIGByZXF1ZXN0X3NpemUnIGRlZmluZWQgaXMKLSAgICAgKiBlaXRoZXIgdGhhdCB0aGUgc2NhbGluZyBoZXJlIHN1ZmZpY2VzIG9yIHRoYXQgdGhlIHN1cHBvcnRlZCBmb3JtYXRzCi0gICAgICogYXJlIGJpdG1hcC1vbmx5IGFuZCBzaXplIG1hdGNoaW5nIGlzIG5vdCBpbXBsZW1lbnRlZC4KLSAgICAgKgotICAgICAqIEluIHRoZSBsYXR0ZXIgY2FzZSwgYSBzaW1wbGUgc2l6ZSBtYXRjaGluZyBpcyBkb25lLgotICAgICAqLwotICAgIGlmICggIUZUX0lTX1NDQUxBQkxFKCBmYWNlICkgJiYgRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkgKQotICAgIHsKLSAgICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgICBlcnJvciA9IEZUX01hdGNoX1NpemUoIGZhY2UsIHJlcSwgMCwgJnN0cmlrZV9pbmRleCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgRlRfVFJBQ0UzKCggIkZUX1JlcXVlc3RfU2l6ZTogYml0bWFwIHN0cmlrZSAlbHUgbWF0Y2hlZFxuIiwKLSAgICAgICAgICAgICAgICAgIHN0cmlrZV9pbmRleCApKTsKLQotICAgICAgcmV0dXJuIEZUX1NlbGVjdF9TaXplKCBmYWNlLCAoRlRfSW50KXN0cmlrZV9pbmRleCApOwotICAgIH0KLQotICAgIEZUX1JlcXVlc3RfTWV0cmljcyggZmFjZSwgcmVxICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9DaGFyX1NpemUoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBob3J6X3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHZlcnRfcmVzb2x1dGlvbiApCi0gIHsKLSAgICBGVF9TaXplX1JlcXVlc3RSZWMgIHJlcTsKLQotCi0gICAgaWYgKCAhY2hhcl93aWR0aCApCi0gICAgICBjaGFyX3dpZHRoID0gY2hhcl9oZWlnaHQ7Ci0gICAgZWxzZSBpZiAoICFjaGFyX2hlaWdodCApCi0gICAgICBjaGFyX2hlaWdodCA9IGNoYXJfd2lkdGg7Ci0KLSAgICBpZiAoICFob3J6X3Jlc29sdXRpb24gKQotICAgICAgaG9yel9yZXNvbHV0aW9uID0gdmVydF9yZXNvbHV0aW9uOwotICAgIGVsc2UgaWYgKCAhdmVydF9yZXNvbHV0aW9uICkKLSAgICAgIHZlcnRfcmVzb2x1dGlvbiA9IGhvcnpfcmVzb2x1dGlvbjsKLQotICAgIGlmICggY2hhcl93aWR0aCAgPCAxICogNjQgKQotICAgICAgY2hhcl93aWR0aCAgPSAxICogNjQ7Ci0gICAgaWYgKCBjaGFyX2hlaWdodCA8IDEgKiA2NCApCi0gICAgICBjaGFyX2hlaWdodCA9IDEgKiA2NDsKLQotICAgIGlmICggIWhvcnpfcmVzb2x1dGlvbiApCi0gICAgICBob3J6X3Jlc29sdXRpb24gPSB2ZXJ0X3Jlc29sdXRpb24gPSA3MjsKLQotICAgIHJlcS50eXBlICAgICAgICAgICA9IEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUw7Ci0gICAgcmVxLndpZHRoICAgICAgICAgID0gY2hhcl93aWR0aDsKLSAgICByZXEuaGVpZ2h0ICAgICAgICAgPSBjaGFyX2hlaWdodDsKLSAgICByZXEuaG9yaVJlc29sdXRpb24gPSBob3J6X3Jlc29sdXRpb247Ci0gICAgcmVxLnZlcnRSZXNvbHV0aW9uID0gdmVydF9yZXNvbHV0aW9uOwotCi0gICAgcmV0dXJuIEZUX1JlcXVlc3RfU2l6ZSggZmFjZSwgJnJlcSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9QaXhlbF9TaXplcyggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF9oZWlnaHQgKQotICB7Ci0gICAgRlRfU2l6ZV9SZXF1ZXN0UmVjICByZXE7Ci0KLQotICAgIGlmICggcGl4ZWxfd2lkdGggPT0gMCApCi0gICAgICBwaXhlbF93aWR0aCA9IHBpeGVsX2hlaWdodDsKLSAgICBlbHNlIGlmICggcGl4ZWxfaGVpZ2h0ID09IDAgKQotICAgICAgcGl4ZWxfaGVpZ2h0ID0gcGl4ZWxfd2lkdGg7Ci0KLSAgICBpZiAoIHBpeGVsX3dpZHRoICA8IDEgKQotICAgICAgcGl4ZWxfd2lkdGggID0gMTsKLSAgICBpZiAoIHBpeGVsX2hlaWdodCA8IDEgKQotICAgICAgcGl4ZWxfaGVpZ2h0ID0gMTsKLQotICAgIC8qIHVzZSBgPj0nIHRvIGF2b2lkIHBvdGVudGlhbCBjb21waWxlciB3YXJuaW5nIG9uIDE2Yml0IHBsYXRmb3JtcyAqLwotICAgIGlmICggcGl4ZWxfd2lkdGggID49IDB4RkZGRlUgKQotICAgICAgcGl4ZWxfd2lkdGggID0gMHhGRkZGVTsKLSAgICBpZiAoIHBpeGVsX2hlaWdodCA+PSAweEZGRkZVICkKLSAgICAgIHBpeGVsX2hlaWdodCA9IDB4RkZGRlU7Ci0KLSAgICByZXEudHlwZSAgICAgICAgICAgPSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMOwotICAgIHJlcS53aWR0aCAgICAgICAgICA9IHBpeGVsX3dpZHRoIDw8IDY7Ci0gICAgcmVxLmhlaWdodCAgICAgICAgID0gcGl4ZWxfaGVpZ2h0IDw8IDY7Ci0gICAgcmVxLmhvcmlSZXNvbHV0aW9uID0gMDsKLSAgICByZXEudmVydFJlc29sdXRpb24gPSAwOwotCi0gICAgcmV0dXJuIEZUX1JlcXVlc3RfU2l6ZSggZmFjZSwgJnJlcSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9LZXJuaW5nKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAga2Vybl9tb2RlLAotICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAqYWtlcm5pbmcgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9Ecml2ZXIgIGRyaXZlcjsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7Ci0KLSAgICBpZiAoICFha2VybmluZyApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBkcml2ZXIgPSBmYWNlLT5kcml2ZXI7Ci0KLSAgICBha2VybmluZy0+eCA9IDA7Ci0gICAgYWtlcm5pbmctPnkgPSAwOwotCi0gICAgaWYgKCBkcml2ZXItPmNsYXp6LT5nZXRfa2VybmluZyApCi0gICAgewotICAgICAgZXJyb3IgPSBkcml2ZXItPmNsYXp6LT5nZXRfa2VybmluZyggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFrZXJuaW5nICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGlmICgga2Vybl9tb2RlICE9IEZUX0tFUk5JTkdfVU5TQ0FMRUQgKQotICAgICAgICB7Ci0gICAgICAgICAgYWtlcm5pbmctPnggPSBGVF9NdWxGaXgoIGFrZXJuaW5nLT54LCBmYWNlLT5zaXplLT5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgICAgICBha2VybmluZy0+eSA9IEZUX011bEZpeCggYWtlcm5pbmctPnksIGZhY2UtPnNpemUtPm1ldHJpY3MueV9zY2FsZSApOwotCi0gICAgICAgICAgaWYgKCBrZXJuX21vZGUgIT0gRlRfS0VSTklOR19VTkZJVFRFRCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogd2Ugc2NhbGUgZG93biBrZXJuaW5nIHZhbHVlcyBmb3Igc21hbGwgcHBlbSB2YWx1ZXMgKi8KLSAgICAgICAgICAgIC8qIHRvIGF2b2lkIHRoYXQgcm91bmRpbmcgbWFrZXMgdGhlbSB0b28gYmlnLiAgICAgICAgICovCi0gICAgICAgICAgICAvKiBgMjUnIGhhcyBiZWVuIGRldGVybWluZWQgaGV1cmlzdGljYWxseS4gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBmYWNlLT5zaXplLT5tZXRyaWNzLnhfcHBlbSA8IDI1ICkKLSAgICAgICAgICAgICAgYWtlcm5pbmctPnggPSBGVF9NdWxEaXYoIGFrZXJuaW5nLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+c2l6ZS0+bWV0cmljcy54X3BwZW0sIDI1ICk7Ci0gICAgICAgICAgICBpZiAoIGZhY2UtPnNpemUtPm1ldHJpY3MueV9wcGVtIDwgMjUgKQotICAgICAgICAgICAgICBha2VybmluZy0+eSA9IEZUX011bERpdiggYWtlcm5pbmctPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zaXplLT5tZXRyaWNzLnlfcHBlbSwgMjUgKTsKLQotICAgICAgICAgICAgYWtlcm5pbmctPnggPSBGVF9QSVhfUk9VTkQoIGFrZXJuaW5nLT54ICk7Ci0gICAgICAgICAgICBha2VybmluZy0+eSA9IEZUX1BJWF9ST1VORCggYWtlcm5pbmctPnkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1RyYWNrX0tlcm5pbmcoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgcG9pbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGVncmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBha2VybmluZyApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX0tlcm5pbmcgIHNlcnZpY2U7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7Ci0KLSAgICBpZiAoICFha2VybmluZyApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgS0VSTklORyApOwotICAgIGlmICggIXNlcnZpY2UgKQotICAgICAgcmV0dXJuIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7Ci0KLSAgICBlcnJvciA9IHNlcnZpY2UtPmdldF90cmFjayggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBha2VybmluZyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9DaGFybWFwKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0VuY29kaW5nICBlbmNvZGluZyApCi0gIHsKLSAgICBGVF9DaGFyTWFwKiAgY3VyOwotICAgIEZUX0NoYXJNYXAqICBsaW1pdDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7Ci0KLSAgICBpZiAoIGVuY29kaW5nID09IEZUX0VOQ09ESU5HX05PTkUgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgLyogRlRfRU5DT0RJTkdfVU5JQ09ERSBpcyBzcGVjaWFsLiAgV2UgdHJ5IHRvIGZpbmQgdGhlIGBiZXN0JyBVbmljb2RlICovCi0gICAgLyogY2hhcm1hcCBhdmFpbGFibGUsIGkuZS4sIG9uZSB3aXRoIFVDUy00IGNoYXJhY3RlcnMsIGlmIHBvc3NpYmxlLiAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhpcyBpcyBkb25lIGJ5IGZpbmRfdW5pY29kZV9jaGFybWFwKCkgYWJvdmUsIHRvIHNoYXJlIGNvZGUuICAgICAgICovCi0gICAgaWYgKCBlbmNvZGluZyA9PSBGVF9FTkNPRElOR19VTklDT0RFICkKLSAgICAgIHJldHVybiBmaW5kX3VuaWNvZGVfY2hhcm1hcCggZmFjZSApOwotCi0gICAgY3VyID0gZmFjZS0+Y2hhcm1hcHM7Ci0gICAgaWYgKCAhY3VyICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9DaGFyTWFwX0hhbmRsZTsKLQotICAgIGxpbWl0ID0gY3VyICsgZmFjZS0+bnVtX2NoYXJtYXBzOwotCi0gICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgIHsKLSAgICAgIGlmICggY3VyWzBdLT5lbmNvZGluZyA9PSBlbmNvZGluZyApCi0gICAgICB7Ci0gICAgICAgIGZhY2UtPmNoYXJtYXAgPSBjdXJbMF07Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZXRfQ2hhcm1hcCggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgKQotICB7Ci0gICAgRlRfQ2hhck1hcCogIGN1cjsKLSAgICBGVF9DaGFyTWFwKiAgbGltaXQ7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOwotCi0gICAgY3VyID0gZmFjZS0+Y2hhcm1hcHM7Ci0gICAgaWYgKCAhY3VyICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9DaGFyTWFwX0hhbmRsZTsKLSAgICBpZiAoIEZUX0dldF9DTWFwX0Zvcm1hdCggY2hhcm1hcCApID09IDE0ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIGxpbWl0ID0gY3VyICsgZmFjZS0+bnVtX2NoYXJtYXBzOwotCi0gICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgIHsKLSAgICAgIGlmICggY3VyWzBdID09IGNoYXJtYXAgKQotICAgICAgewotICAgICAgICBmYWNlLT5jaGFybWFwID0gY3VyWzBdOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9JbnQgKQotICBGVF9HZXRfQ2hhcm1hcF9JbmRleCggRlRfQ2hhck1hcCAgY2hhcm1hcCApCi0gIHsKLSAgICBGVF9JbnQgIGk7Ci0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgY2hhcm1hcC0+ZmFjZS0+bnVtX2NoYXJtYXBzOyBpKysgKQotICAgICAgaWYgKCBjaGFybWFwLT5mYWNlLT5jaGFybWFwc1tpXSA9PSBjaGFybWFwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBGVF9BU1NFUlQoIGkgPCBjaGFybWFwLT5mYWNlLT5udW1fY2hhcm1hcHMgKTsKLQotICAgIHJldHVybiBpOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIEZUX0NNYXAgIGNtYXAgKQotICB7Ci0gICAgRlRfQ01hcF9DbGFzcyAgY2xhenogID0gY21hcC0+Y2xheno7Ci0gICAgRlRfRmFjZSAgICAgICAgZmFjZSAgID0gY21hcC0+Y2hhcm1hcC5mYWNlOwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKGZhY2UpOwotCi0KLSAgICBpZiAoIGNsYXp6LT5kb25lICkKLSAgICAgIGNsYXp6LT5kb25lKCBjbWFwICk7Ci0KLSAgICBGVF9GUkVFKCBjbWFwICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfQ01hcF9Eb25lKCBGVF9DTWFwICBjbWFwICkKLSAgewotICAgIGlmICggY21hcCApCi0gICAgewotICAgICAgRlRfRmFjZSAgICBmYWNlICAgPSBjbWFwLT5jaGFybWFwLmZhY2U7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0gICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICAgRlRfSW50ICAgICBpLCBqOwotCi0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZS0+bnVtX2NoYXJtYXBzOyBpKysgKQotICAgICAgewotICAgICAgICBpZiAoIChGVF9DTWFwKWZhY2UtPmNoYXJtYXBzW2ldID09IGNtYXAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQ2hhck1hcCAgbGFzdF9jaGFybWFwID0gZmFjZS0+Y2hhcm1hcHNbZmFjZS0+bnVtX2NoYXJtYXBzIC0gMV07Ci0KLQotICAgICAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGZhY2UtPmNoYXJtYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5udW1fY2hhcm1hcHMgLSAxICkgKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgLyogcmVtb3ZlIGl0IGZyb20gb3VyIGxpc3Qgb2YgY2hhcm1hcHMgKi8KLSAgICAgICAgICBmb3IgKCBqID0gaSArIDE7IGogPCBmYWNlLT5udW1fY2hhcm1hcHM7IGorKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBqID09IGZhY2UtPm51bV9jaGFybWFwcyAtIDEgKQotICAgICAgICAgICAgICBmYWNlLT5jaGFybWFwc1tqIC0gMV0gPSBsYXN0X2NoYXJtYXA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZhY2UtPmNoYXJtYXBzW2ogLSAxXSA9IGZhY2UtPmNoYXJtYXBzW2pdOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcy0tOwotCi0gICAgICAgICAgaWYgKCAoRlRfQ01hcClmYWNlLT5jaGFybWFwID09IGNtYXAgKQotICAgICAgICAgICAgZmFjZS0+Y2hhcm1hcCA9IE5VTEw7Ci0KLSAgICAgICAgICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIGNtYXAgKTsKLQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9DTWFwX05ldyggRlRfQ01hcF9DbGFzcyAgY2xhenosCi0gICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICBpbml0X2RhdGEsCi0gICAgICAgICAgICAgICBGVF9DaGFyTWFwICAgICBjaGFybWFwLAotICAgICAgICAgICAgICAgRlRfQ01hcCAgICAgICAqYWNtYXAgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9GYWNlICAgIGZhY2U7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfQ01hcCAgICBjbWFwOwotCi0KLSAgICBpZiAoIGNsYXp6ID09IE5VTEwgfHwgY2hhcm1hcCA9PSBOVUxMIHx8IGNoYXJtYXAtPmZhY2UgPT0gTlVMTCApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBmYWNlICAgPSBjaGFybWFwLT5mYWNlOwotICAgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLSAgICBpZiAoICFGVF9BTExPQyggY21hcCwgY2xhenotPnNpemUgKSApCi0gICAgewotICAgICAgY21hcC0+Y2hhcm1hcCA9ICpjaGFybWFwOwotICAgICAgY21hcC0+Y2xhenogICA9IGNsYXp6OwotCi0gICAgICBpZiAoIGNsYXp6LT5pbml0ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBjbGF6ei0+aW5pdCggY21hcCwgaW5pdF9kYXRhICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgLyogYWRkIGl0IHRvIG91ciBsaXN0IG9mIGNoYXJtYXBzICovCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBmYWNlLT5jaGFybWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcyArIDEgKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZmFjZS0+Y2hhcm1hcHNbZmFjZS0+bnVtX2NoYXJtYXBzKytdID0gKEZUX0NoYXJNYXApY21hcDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGFjbWFwICkKLSAgICAgICphY21hcCA9IGNtYXA7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIGNtYXAgKTsKLSAgICBjbWFwID0gTlVMTDsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VJbnQgKQotICBGVF9HZXRfQ2hhcl9JbmRleCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUgKQotICB7Ci0gICAgRlRfVUludCAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCBmYWNlICYmIGZhY2UtPmNoYXJtYXAgKQotICAgIHsKLSAgICAgIEZUX0NNYXAgIGNtYXAgPSBGVF9DTUFQKCBmYWNlLT5jaGFybWFwICk7Ci0KLQotICAgICAgcmVzdWx0ID0gY21hcC0+Y2xhenotPmNoYXJfaW5kZXgoIGNtYXAsIGNoYXJjb2RlICk7Ci0gICAgfQotICAgIHJldHVybiAgcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VTG9uZyApCi0gIEZUX0dldF9GaXJzdF9DaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICphZ2luZGV4ICkKLSAgewotICAgIEZUX1VMb25nICByZXN1bHQgPSAwOwotICAgIEZUX1VJbnQgICBnaW5kZXggPSAwOwotCi0KLSAgICBpZiAoIGZhY2UgJiYgZmFjZS0+Y2hhcm1hcCApCi0gICAgewotICAgICAgZ2luZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgoIGZhY2UsIDAgKTsKLSAgICAgIGlmICggZ2luZGV4ID09IDAgKQotICAgICAgICByZXN1bHQgPSBGVF9HZXRfTmV4dF9DaGFyKCBmYWNlLCAwLCAmZ2luZGV4ICk7Ci0gICAgfQotCi0gICAgaWYgKCBhZ2luZGV4ICApCi0gICAgICAqYWdpbmRleCA9IGdpbmRleDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VMb25nICkKLSAgRlRfR2V0X05leHRfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmFnaW5kZXggKQotICB7Ci0gICAgRlRfVUxvbmcgIHJlc3VsdCA9IDA7Ci0gICAgRlRfVUludCAgIGdpbmRleCA9IDA7Ci0KLQotICAgIGlmICggZmFjZSAmJiBmYWNlLT5jaGFybWFwICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIGNvZGUgPSAoRlRfVUludDMyKWNoYXJjb2RlOwotICAgICAgRlRfQ01hcCAgICBjbWFwID0gRlRfQ01BUCggZmFjZS0+Y2hhcm1hcCApOwotCi0KLSAgICAgIGdpbmRleCA9IGNtYXAtPmNsYXp6LT5jaGFyX25leHQoIGNtYXAsICZjb2RlICk7Ci0gICAgICByZXN1bHQgPSAoIGdpbmRleCA9PSAwICkgPyAwIDogY29kZTsKLSAgICB9Ci0KLSAgICBpZiAoIGFnaW5kZXggKQotICAgICAgKmFnaW5kZXggPSBnaW5kZXg7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VSW50ICkKLSAgRlRfRmFjZV9HZXRDaGFyVmFyaWFudEluZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApCi0gIHsKLSAgICBGVF9VSW50ICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoIGZhY2UgJiYgZmFjZS0+Y2hhcm1hcCAmJgotICAgICAgICBmYWNlLT5jaGFybWFwLT5lbmNvZGluZyA9PSBGVF9FTkNPRElOR19VTklDT0RFICkKLSAgICB7Ci0gICAgICBGVF9DaGFyTWFwICBjaGFybWFwID0gZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXAoIGZhY2UgKTsKLSAgICAgIEZUX0NNYXAgICAgIHVjbWFwID0gRlRfQ01BUCggZmFjZS0+Y2hhcm1hcCApOwotCi0KLSAgICAgIGlmICggY2hhcm1hcCAhPSBOVUxMICkKLSAgICAgIHsKLSAgICAgICAgRlRfQ01hcCAgdmNtYXAgPSBGVF9DTUFQKCBjaGFybWFwICk7Ci0KLQotICAgICAgICByZXN1bHQgPSB2Y21hcC0+Y2xhenotPmNoYXJfdmFyX2luZGV4KCB2Y21hcCwgdWNtYXAsIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50U2VsZWN0b3IgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9JbnQgKQotICBGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0ludCAgcmVzdWx0ID0gLTE7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfQ2hhck1hcCAgY2hhcm1hcCA9IGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBmYWNlICk7Ci0KLQotICAgICAgaWYgKCBjaGFybWFwICE9IE5VTEwgKQotICAgICAgewotICAgICAgICBGVF9DTWFwICB2Y21hcCA9IEZUX0NNQVAoIGNoYXJtYXAgKTsKLQotCi0gICAgICAgIHJlc3VsdCA9IHZjbWFwLT5jbGF6ei0+Y2hhcl92YXJfZGVmYXVsdCggdmNtYXAsIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRTZWxlY3RvciApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VJbnQzMiogKQotICBGVF9GYWNlX0dldFZhcmlhbnRTZWxlY3RvcnMoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfVUludDMyICAqcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICB7Ci0gICAgICBGVF9DaGFyTWFwICBjaGFybWFwID0gZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXAoIGZhY2UgKTsKLQotCi0gICAgICBpZiAoIGNoYXJtYXAgIT0gTlVMTCApCi0gICAgICB7Ci0gICAgICAgIEZUX0NNYXAgICAgdmNtYXAgID0gRlRfQ01BUCggY2hhcm1hcCApOwotICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLQotICAgICAgICByZXN1bHQgPSB2Y21hcC0+Y2xhenotPnZhcmlhbnRfbGlzdCggdmNtYXAsIG1lbW9yeSApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VJbnQzMiogKQotICBGVF9GYWNlX0dldFZhcmlhbnRzT2ZDaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlICkKLSAgewotICAgIEZUX1VJbnQzMiAgKnJlc3VsdCA9IE5VTEw7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfQ2hhck1hcCAgY2hhcm1hcCA9IGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBmYWNlICk7Ci0KLQotICAgICAgaWYgKCBjaGFybWFwICE9IE5VTEwgKQotICAgICAgewotICAgICAgICBGVF9DTWFwICAgIHZjbWFwICA9IEZUX0NNQVAoIGNoYXJtYXAgKTsKLSAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICAgICAgcmVzdWx0ID0gdmNtYXAtPmNsYXp6LT5jaGFydmFyaWFudF9saXN0KCB2Y21hcCwgbWVtb3J5LCBjaGFyY29kZSApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VSW50MzIqICkKLSAgRlRfRmFjZV9HZXRDaGFyc09mVmFyaWFudCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKQotICB7Ci0gICAgRlRfVUludDMyICAqcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICB7Ci0gICAgICBGVF9DaGFyTWFwICBjaGFybWFwID0gZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXAoIGZhY2UgKTsKLQotCi0gICAgICBpZiAoIGNoYXJtYXAgIT0gTlVMTCApCi0gICAgICB7Ci0gICAgICAgIEZUX0NNYXAgICAgdmNtYXAgID0gRlRfQ01BUCggY2hhcm1hcCApOwotICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLQotICAgICAgICByZXN1bHQgPSB2Y21hcC0+Y2xhenotPnZhcmlhbnRjaGFyX2xpc3QoIHZjbWFwLCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudFNlbGVjdG9yICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludCApCi0gIEZUX0dldF9OYW1lX0luZGV4KCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApCi0gIHsKLSAgICBGVF9VSW50ICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoIGZhY2UgJiYgRlRfSEFTX0dMWVBIX05BTUVTKCBmYWNlICkgKQotICAgIHsKLSAgICAgIEZUX1NlcnZpY2VfR2x5cGhEaWN0ICBzZXJ2aWNlOwotCi0KLSAgICAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xZUEhfRElDVCApOwotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+bmFtZV9pbmRleCApCi0gICAgICAgIHJlc3VsdCA9IHNlcnZpY2UtPm5hbWVfaW5kZXgoIGZhY2UsIGdseXBoX25hbWUgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9HbHlwaF9OYW1lKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0KLSAgICAvKiBjbGVhbiB1cCBidWZmZXIgKi8KLSAgICBpZiAoIGJ1ZmZlciAmJiBidWZmZXJfbWF4ID4gMCApCi0gICAgICAoKEZUX0J5dGUqKWJ1ZmZlcilbMF0gPSAwOwotCi0gICAgaWYgKCBmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBnbHlwaF9pbmRleCA8PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICYmCi0gICAgICAgICBGVF9IQVNfR0xZUEhfTkFNRVMoIGZhY2UgKSAgICAgICAgICAgICAgICkKLSAgICB7Ci0gICAgICBGVF9TZXJ2aWNlX0dseXBoRGljdCAgc2VydmljZTsKLQotCi0gICAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMWVBIX0RJQ1QgKTsKLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPmdldF9uYW1lICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfbmFtZSggZmFjZSwgZ2x5cGhfaW5kZXgsIGJ1ZmZlciwgYnVmZmVyX21heCApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggY29uc3QgY2hhciogKQotICBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggIXJlc3VsdCApCi0gICAgewotICAgICAgRlRfU2VydmljZV9Qc0ZvbnROYW1lICBzZXJ2aWNlOwotCi0KLSAgICAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TVFNDUklQVF9GT05UX05BTUUgKTsKLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPmdldF9wc19mb250X25hbWUgKQotICAgICAgICByZXN1bHQgPSBzZXJ2aWNlLT5nZXRfcHNfZm9udF9uYW1lKCBmYWNlICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0dHRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCogKQotICBGVF9HZXRfU2ZudF9UYWJsZSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TZm50X1RhZyAgdGFnICkKLSAgewotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgdGFibGUgPSAwOwotICAgIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZSAgc2VydmljZTsKLQotCi0gICAgaWYgKCBmYWNlICYmIEZUX0lTX1NGTlQoIGZhY2UgKSApCi0gICAgewotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFNGTlRfVEFCTEUgKTsKLSAgICAgIGlmICggc2VydmljZSAhPSBOVUxMICkKLSAgICAgICAgdGFibGUgPSBzZXJ2aWNlLT5nZXRfdGFibGUoIGZhY2UsIHRhZyApOwotICAgIH0KLQotICAgIHJldHVybiB0YWJsZTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0dHRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9Mb2FkX1NmbnRfVGFibGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX1NGTlRfVGFibGUgIHNlcnZpY2U7Ci0KLQotICAgIGlmICggIWZhY2UgfHwgIUZUX0lTX1NGTlQoIGZhY2UgKSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRmFjZV9IYW5kbGU7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgU0ZOVF9UQUJMRSApOwotICAgIGlmICggc2VydmljZSA9PSBOVUxMICkKLSAgICAgIHJldHVybiBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlOwotCi0gICAgcmV0dXJuIHNlcnZpY2UtPmxvYWRfdGFibGUoIGZhY2UsIHRhZywgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHR0dGFibGVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NmbnRfVGFibGVfSW5mbyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdGFibGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICp0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpsZW5ndGggKQotICB7Ci0gICAgRlRfU2VydmljZV9TRk5UX1RhYmxlICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlIHx8ICFGVF9JU19TRk5UKCBmYWNlICkgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOwotCi0gICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFNGTlRfVEFCTEUgKTsKLSAgICBpZiAoIHNlcnZpY2UgPT0gTlVMTCApCi0gICAgICByZXR1cm4gRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLQotICAgIHJldHVybiBzZXJ2aWNlLT50YWJsZV9pbmZvKCBmYWNlLCB0YWJsZV9pbmRleCwgdGFnLCBsZW5ndGggKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0dHRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUxvbmcgKQotICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCggRlRfQ2hhck1hcCAgY2hhcm1hcCApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX1RUQ01hcHMgIHNlcnZpY2U7Ci0gICAgRlRfRmFjZSAgICAgICAgICAgICBmYWNlOwotICAgIFRUX0NNYXBJbmZvICAgICAgICAgY21hcF9pbmZvOwotCi0KLSAgICBpZiAoICFjaGFybWFwIHx8ICFjaGFybWFwLT5mYWNlICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZmFjZSA9IGNoYXJtYXAtPmZhY2U7Ci0gICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFRUX0NNQVAgKTsKLSAgICBpZiAoIHNlcnZpY2UgPT0gTlVMTCApCi0gICAgICByZXR1cm4gMDsKLSAgICBpZiAoIHNlcnZpY2UtPmdldF9jbWFwX2luZm8oIGNoYXJtYXAsICZjbWFwX2luZm8gKSkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGNtYXBfaW5mby5sYW5ndWFnZTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0dHRhYmxlcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfTG9uZyApCi0gIEZUX0dldF9DTWFwX0Zvcm1hdCggRlRfQ2hhck1hcCAgY2hhcm1hcCApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX1RUQ01hcHMgIHNlcnZpY2U7Ci0gICAgRlRfRmFjZSAgICAgICAgICAgICBmYWNlOwotICAgIFRUX0NNYXBJbmZvICAgICAgICAgY21hcF9pbmZvOwotCi0KLSAgICBpZiAoICFjaGFybWFwIHx8ICFjaGFybWFwLT5mYWNlICkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGZhY2UgPSBjaGFybWFwLT5mYWNlOwotICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBUVF9DTUFQICk7Ci0gICAgaWYgKCBzZXJ2aWNlID09IE5VTEwgKQotICAgICAgcmV0dXJuIC0xOwotICAgIGlmICggc2VydmljZS0+Z2V0X2NtYXBfaW5mbyggY2hhcm1hcCwgJmNtYXBfaW5mbyApKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgcmV0dXJuIGNtYXBfaW5mby5mb3JtYXQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzaXplcy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9BY3RpdmF0ZV9TaXplKCBGVF9TaXplICBzaXplICkKLSAgewotICAgIEZUX0ZhY2UgIGZhY2U7Ci0KLQotICAgIGlmICggc2l6ZSA9PSBOVUxMICkKLSAgICAgIHJldHVybiBGVF9FcnJfQmFkX0FyZ3VtZW50OwotCi0gICAgZmFjZSA9IHNpemUtPmZhY2U7Ci0gICAgaWYgKCBmYWNlID09IE5VTEwgfHwgZmFjZS0+ZHJpdmVyID09IE5VTEwgKQotICAgICAgcmV0dXJuIEZUX0Vycl9CYWRfQXJndW1lbnQ7Ci0KLSAgICAvKiB3ZSBkb24ndCBuZWVkIGFueXRoaW5nIG1vcmUgY29tcGxleCB0aGFuIHRoYXQ7IGFsbCBzaXplIG9iamVjdHMgKi8KLSAgICAvKiBhcmUgYWxyZWFkeSBsaXN0ZWQgYnkgdGhlIGZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmYWNlLT5zaXplID0gc2l6ZTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICBSIEUgTiBEIEUgUiBFIFIgUyAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBsb29rdXAgYSByZW5kZXJlciBieSBnbHlwaCBmb3JtYXQgaW4gdGhlIGxpYnJhcnkncyBsaXN0ICovCi0gIEZUX0JBU0VfREVGKCBGVF9SZW5kZXJlciApCi0gIEZUX0xvb2t1cF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX0Zvcm1hdCAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlKiAgICAgbm9kZSApCi0gIHsKLSAgICBGVF9MaXN0Tm9kZSAgY3VyOwotICAgIEZUX1JlbmRlcmVyICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGN1ciA9IGxpYnJhcnktPnJlbmRlcmVycy5oZWFkOwotCi0gICAgaWYgKCBub2RlICkKLSAgICB7Ci0gICAgICBpZiAoICpub2RlICkKLSAgICAgICAgY3VyID0gKCpub2RlKS0+bmV4dDsKLSAgICAgICpub2RlID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIGN1ciApCi0gICAgewotICAgICAgRlRfUmVuZGVyZXIgIHJlbmRlcmVyID0gRlRfUkVOREVSRVIoIGN1ci0+ZGF0YSApOwotCi0KLSAgICAgIGlmICggcmVuZGVyZXItPmdseXBoX2Zvcm1hdCA9PSBmb3JtYXQgKQotICAgICAgewotICAgICAgICBpZiAoIG5vZGUgKQotICAgICAgICAgICpub2RlID0gY3VyOwotCi0gICAgICAgIHJlc3VsdCA9IHJlbmRlcmVyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGN1ciA9IGN1ci0+bmV4dDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgRlRfUmVuZGVyZXIKLSAgZnRfbG9va3VwX2dseXBoX3JlbmRlcmVyKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfRmFjZSAgICAgIGZhY2UgICAgPSBzbG90LT5mYWNlOwotICAgIEZUX0xpYnJhcnkgICBsaWJyYXJ5ID0gRlRfRkFDRV9MSUJSQVJZKCBmYWNlICk7Ci0gICAgRlRfUmVuZGVyZXIgIHJlc3VsdCAgPSBsaWJyYXJ5LT5jdXJfcmVuZGVyZXI7Ci0KLQotICAgIGlmICggIXJlc3VsdCB8fCByZXN1bHQtPmdseXBoX2Zvcm1hdCAhPSBzbG90LT5mb3JtYXQgKQotICAgICAgcmVzdWx0ID0gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBzbG90LT5mb3JtYXQsIDAgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3NldF9jdXJyZW50X3JlbmRlcmVyKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1JlbmRlcmVyICByZW5kZXJlcjsKLQotCi0gICAgcmVuZGVyZXIgPSBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLCAwICk7Ci0gICAgbGlicmFyeS0+Y3VyX3JlbmRlcmVyID0gcmVuZGVyZXI7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9hZGRfcmVuZGVyZXIoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIEZUX0xpYnJhcnkgICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotICAgIEZUX01lbW9yeSAgICBtZW1vcnkgID0gbGlicmFyeS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKLQotCi0gICAgaWYgKCBGVF9ORVcoIG5vZGUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB7Ci0gICAgICBGVF9SZW5kZXJlciAgICAgICAgIHJlbmRlciA9IEZUX1JFTkRFUkVSKCBtb2R1bGUgKTsKLSAgICAgIEZUX1JlbmRlcmVyX0NsYXNzKiAgY2xhenogID0gKEZUX1JlbmRlcmVyX0NsYXNzKiltb2R1bGUtPmNsYXp6OwotCi0KLSAgICAgIHJlbmRlci0+Y2xhenogICAgICAgID0gY2xheno7Ci0gICAgICByZW5kZXItPmdseXBoX2Zvcm1hdCA9IGNsYXp6LT5nbHlwaF9mb3JtYXQ7Ci0KLSAgICAgIC8qIGFsbG9jYXRlIHJhc3RlciBvYmplY3QgaWYgbmVlZGVkICovCi0gICAgICBpZiAoIGNsYXp6LT5nbHlwaF9mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUgJiYKLSAgICAgICAgICAgY2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX25ldyApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gY2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX25ldyggbWVtb3J5LCAmcmVuZGVyLT5yYXN0ZXIgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHJlbmRlci0+cmFzdGVyX3JlbmRlciA9IGNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9yZW5kZXI7Ci0gICAgICAgIHJlbmRlci0+cmVuZGVyICAgICAgICA9IGNsYXp6LT5yZW5kZXJfZ2x5cGg7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGFkZCB0byBsaXN0ICovCi0gICAgICBub2RlLT5kYXRhID0gbW9kdWxlOwotICAgICAgRlRfTGlzdF9BZGQoICZsaWJyYXJ5LT5yZW5kZXJlcnMsIG5vZGUgKTsKLQotICAgICAgZnRfc2V0X2N1cnJlbnRfcmVuZGVyZXIoIGxpYnJhcnkgKTsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0ZSRUUoIG5vZGUgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfcmVtb3ZlX3JlbmRlcmVyKCBGVF9Nb2R1bGUgIG1vZHVsZSApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgbGlicmFyeSA9IG1vZHVsZS0+bGlicmFyeTsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKLQotCi0gICAgbm9kZSA9IEZUX0xpc3RfRmluZCggJmxpYnJhcnktPnJlbmRlcmVycywgbW9kdWxlICk7Ci0gICAgaWYgKCBub2RlICkKLSAgICB7Ci0gICAgICBGVF9SZW5kZXJlciAgcmVuZGVyID0gRlRfUkVOREVSRVIoIG1vZHVsZSApOwotCi0KLSAgICAgIC8qIHJlbGVhc2UgcmFzdGVyIG9iamVjdCwgaWYgYW55ICovCi0gICAgICBpZiAoIHJlbmRlci0+cmFzdGVyICkKLSAgICAgICAgcmVuZGVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfZG9uZSggcmVuZGVyLT5yYXN0ZXIgKTsKLQotICAgICAgLyogcmVtb3ZlIGZyb20gbGlzdCAqLwotICAgICAgRlRfTGlzdF9SZW1vdmUoICZsaWJyYXJ5LT5yZW5kZXJlcnMsIG5vZGUgKTsKLSAgICAgIEZUX0ZSRUUoIG5vZGUgKTsKLQotICAgICAgZnRfc2V0X2N1cnJlbnRfcmVuZGVyZXIoIGxpYnJhcnkgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRyZW5kZXIuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1JlbmRlcmVyICkKLSAgRlRfR2V0X1JlbmRlcmVyKCBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgRlRfR2x5cGhfRm9ybWF0ICBmb3JtYXQgKQotICB7Ci0gICAgLyogdGVzdCBmb3IgdmFsaWQgYGxpYnJhcnknIGRlbGF5ZWQgdG8gRlRfTG9va3VwX1JlbmRlcmVyKCkgKi8KLQotICAgIHJldHVybiBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIGZvcm1hdCwgMCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0cmVuZGVyLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJlciAgICByZW5kZXJlciwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtZXRlcnMgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGU7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZTsKLQotICAgIGlmICggIXJlbmRlcmVyICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIG5vZGUgPSBGVF9MaXN0X0ZpbmQoICZsaWJyYXJ5LT5yZW5kZXJlcnMsIHJlbmRlcmVyICk7Ci0gICAgaWYgKCAhbm9kZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9MaXN0X1VwKCAmbGlicmFyeS0+cmVuZGVyZXJzLCBub2RlICk7Ci0KLSAgICBpZiAoIHJlbmRlcmVyLT5nbHlwaF9mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUgKQotICAgICAgbGlicmFyeS0+Y3VyX3JlbmRlcmVyID0gcmVuZGVyZXI7Ci0KLSAgICBpZiAoIG51bV9wYXJhbXMgPiAwICkKLSAgICB7Ci0gICAgICBGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYyAgc2V0X21vZGUgPSByZW5kZXJlci0+Y2xhenotPnNldF9tb2RlOwotCi0KLSAgICAgIGZvciAoIDsgbnVtX3BhcmFtcyA+IDA7IG51bV9wYXJhbXMtLSApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gc2V0X21vZGUoIHJlbmRlcmVyLCBwYXJhbWV0ZXJzLT50YWcsIHBhcmFtZXRlcnMtPmRhdGEgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfUmVuZGVyZXIgIHJlbmRlcmVyOwotCi0KLSAgICAvKiBpZiBpdCBpcyBhbHJlYWR5IGEgYml0bWFwLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nICovCi0gICAgc3dpdGNoICggc2xvdC0+Zm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQOiAgIC8qIGFscmVhZHkgYSBiaXRtYXAsIGRvbid0IGRvIGFueXRoaW5nICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgIEZUX0xpc3ROb2RlICBub2RlICAgPSAwOwotICAgICAgICBGVF9Cb29sICAgICAgdXBkYXRlID0gMDsKLQotCi0gICAgICAgIC8qIHNtYWxsIHNob3J0Y3V0IGZvciB0aGUgdmVyeSBjb21tb24gY2FzZSAqLwotICAgICAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICAgIHsKLSAgICAgICAgICByZW5kZXJlciA9IGxpYnJhcnktPmN1cl9yZW5kZXJlcjsKLSAgICAgICAgICBub2RlICAgICA9IGxpYnJhcnktPnJlbmRlcmVycy5oZWFkOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZW5kZXJlciA9IEZUX0xvb2t1cF9SZW5kZXJlciggbGlicmFyeSwgc2xvdC0+Zm9ybWF0LCAmbm9kZSApOwotCi0gICAgICAgIGVycm9yID0gRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLSAgICAgICAgd2hpbGUgKCByZW5kZXJlciApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IHJlbmRlcmVyLT5yZW5kZXIoIHJlbmRlcmVyLCBzbG90LCByZW5kZXJfbW9kZSwgTlVMTCApOwotICAgICAgICAgIGlmICggIWVycm9yIHx8Ci0gICAgICAgICAgICAgICBGVF9FUlJPUl9CQVNFKCBlcnJvciApICE9IEZUX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgLyogRlRfRXJyX0Nhbm5vdF9SZW5kZXJfR2x5cGggaXMgcmV0dXJuZWQgaWYgdGhlIHJlbmRlciBtb2RlICAgKi8KLSAgICAgICAgICAvKiBpcyB1bnN1cHBvcnRlZCBieSB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgdGhpcyBnbHlwaCBpbWFnZSAqLwotICAgICAgICAgIC8qIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAvKiBub3csIGxvb2sgZm9yIGFub3RoZXIgcmVuZGVyZXIgdGhhdCBzdXBwb3J0cyB0aGUgc2FtZSAqLwotICAgICAgICAgIC8qIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgcmVuZGVyZXIgPSBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIHNsb3QtPmZvcm1hdCwgJm5vZGUgKTsKLSAgICAgICAgICB1cGRhdGUgICA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiB3ZSBjaGFuZ2VkIHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciB0aGUgZ2x5cGggaW1hZ2UgZm9ybWF0ICovCi0gICAgICAgIC8qIHdlIG5lZWQgdG8gc2VsZWN0IGl0IGFzIHRoZSBuZXh0IGN1cnJlbnQgb25lICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAhZXJyb3IgJiYgdXBkYXRlICYmIHJlbmRlcmVyICkKLSAgICAgICAgICBGVF9TZXRfUmVuZGVyZXIoIGxpYnJhcnksIHJlbmRlcmVyLCAwLCAwICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1JlbmRlcl9HbHlwaCggRlRfR2x5cGhTbG90ICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlICkKLSAgewotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0KLQotICAgIGlmICggIXNsb3QgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgbGlicmFyeSA9IEZUX0ZBQ0VfTElCUkFSWSggc2xvdC0+ZmFjZSApOwotCi0gICAgcmV0dXJuIEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCggbGlicmFyeSwgc2xvdCwgcmVuZGVyX21vZGUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBNIE8gRCBVIEwgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveV9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBtb2R1bGUgb2JqZWN0LiAgRm9yIGRyaXZlcnMsIHRoaXMgYWxzbyBkZXN0cm95cyAgICovCi0gIC8qICAgIGFsbCBjaGlsZCBmYWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBtb2R1bGUgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUaGUgZHJpdmVyIF9tdXN0XyBiZSBMT0NLRUQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgRGVzdHJveV9Nb2R1bGUoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSAgPSBtb2R1bGUtPm1lbW9yeTsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiAgID0gbW9kdWxlLT5jbGF6ejsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotCi0KLSAgICAvKiBmaW5hbGl6ZSBjbGllbnQtZGF0YSAtIGJlZm9yZSBhbnl0aGluZyBlbHNlICovCi0gICAgaWYgKCBtb2R1bGUtPmdlbmVyaWMuZmluYWxpemVyICkKLSAgICAgIG1vZHVsZS0+Z2VuZXJpYy5maW5hbGl6ZXIoIG1vZHVsZSApOwotCi0gICAgaWYgKCBsaWJyYXJ5ICYmIGxpYnJhcnktPmF1dG9faGludGVyID09IG1vZHVsZSApCi0gICAgICBsaWJyYXJ5LT5hdXRvX2hpbnRlciA9IDA7Ci0KLSAgICAvKiBpZiB0aGUgbW9kdWxlIGlzIGEgcmVuZGVyZXIgKi8KLSAgICBpZiAoIEZUX01PRFVMRV9JU19SRU5ERVJFUiggbW9kdWxlICkgKQotICAgICAgZnRfcmVtb3ZlX3JlbmRlcmVyKCBtb2R1bGUgKTsKLQotICAgIC8qIGlmIHRoZSBtb2R1bGUgaXMgYSBmb250IGRyaXZlciwgYWRkIHNvbWUgc3RlcHMgKi8KLSAgICBpZiAoIEZUX01PRFVMRV9JU19EUklWRVIoIG1vZHVsZSApICkKLSAgICAgIERlc3Ryb3lfRHJpdmVyKCBGVF9EUklWRVIoIG1vZHVsZSApICk7Ci0KLSAgICAvKiBmaW5hbGl6ZSB0aGUgbW9kdWxlIG9iamVjdCAqLwotICAgIGlmICggY2xhenotPm1vZHVsZV9kb25lICkKLSAgICAgIGNsYXp6LT5tb2R1bGVfZG9uZSggbW9kdWxlICk7Ci0KLSAgICAvKiBkaXNjYXJkIGl0ICovCi0gICAgRlRfRlJFRSggbW9kdWxlICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfQWRkX01vZHVsZSggRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9Nb2R1bGUgIG1vZHVsZTsKLSAgICBGVF9VSW50ICAgIG5uOwotCi0KLSNkZWZpbmUgRlJFRVRZUEVfVkVSX0ZJWEVEICAoICggKEZUX0xvbmcpRlJFRVRZUEVfTUFKT1IgPDwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFRVRZUEVfTUlOT1IgICAgICAgICAgICAgICAgICApCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZTsKLQotICAgIGlmICggIWNsYXp6ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIC8qIGNoZWNrIGZyZWV0eXBlIHZlcnNpb24gKi8KLSAgICBpZiAoIGNsYXp6LT5tb2R1bGVfcmVxdWlyZXMgPiBGUkVFVFlQRV9WRVJfRklYRUQgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1ZlcnNpb247Ci0KLSAgICAvKiBsb29rIGZvciBhIG1vZHVsZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIGxpYnJhcnkncyB0YWJsZSAqLwotICAgIGZvciAoIG5uID0gMDsgbm4gPCBsaWJyYXJ5LT5udW1fbW9kdWxlczsgbm4rKyApCi0gICAgewotICAgICAgbW9kdWxlID0gbGlicmFyeS0+bW9kdWxlc1tubl07Ci0gICAgICBpZiAoIGZ0X3N0cmNtcCggbW9kdWxlLT5jbGF6ei0+bW9kdWxlX25hbWUsIGNsYXp6LT5tb2R1bGVfbmFtZSApID09IDAgKQotICAgICAgewotICAgICAgICAvKiB0aGlzIGluc3RhbGxlZCBtb2R1bGUgaGFzIHRoZSBzYW1lIG5hbWUsIGNvbXBhcmUgdGhlaXIgdmVyc2lvbnMgKi8KLSAgICAgICAgaWYgKCBjbGF6ei0+bW9kdWxlX3ZlcnNpb24gPD0gbW9kdWxlLT5jbGF6ei0+bW9kdWxlX3ZlcnNpb24gKQotICAgICAgICAgIHJldHVybiBGVF9FcnJfTG93ZXJfTW9kdWxlX1ZlcnNpb247Ci0KLSAgICAgICAgLyogcmVtb3ZlIHRoZSBtb2R1bGUgZnJvbSBvdXIgbGlzdCwgdGhlbiBleGl0IHRoZSBsb29wIHRvIHJlcGxhY2UgKi8KLSAgICAgICAgLyogaXQgYnkgb3VyIG5ldyB2ZXJzaW9uLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgRlRfUmVtb3ZlX01vZHVsZSggbGlicmFyeSwgbW9kdWxlICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIGxpYnJhcnktPm51bV9tb2R1bGVzID49IEZUX01BWF9NT0RVTEVTICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9Ub29fTWFueV9Ecml2ZXJzOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIG1vZHVsZSBvYmplY3QgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBtb2R1bGUsIGNsYXp6LT5tb2R1bGVfc2l6ZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGJhc2UgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBtb2R1bGUtPmxpYnJhcnkgPSBsaWJyYXJ5OwotICAgIG1vZHVsZS0+bWVtb3J5ICA9IG1lbW9yeTsKLSAgICBtb2R1bGUtPmNsYXp6ICAgPSAoRlRfTW9kdWxlX0NsYXNzKiljbGF6ejsKLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIG1vZHVsZSBpcyBhIHJlbmRlcmVyIC0gdGhpcyBtdXN0IGJlIHBlcmZvcm1lZCAqLwotICAgIC8qIGJlZm9yZSB0aGUgbm9ybWFsIG1vZHVsZSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggRlRfTU9EVUxFX0lTX1JFTkRFUkVSKCBtb2R1bGUgKSApCi0gICAgewotICAgICAgLyogYWRkIHRvIHRoZSByZW5kZXJlcnMgbGlzdCAqLwotICAgICAgZXJyb3IgPSBmdF9hZGRfcmVuZGVyZXIoIG1vZHVsZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgbW9kdWxlIGEgYXV0by1oaW50ZXI/ICovCi0gICAgaWYgKCBGVF9NT0RVTEVfSVNfSElOVEVSKCBtb2R1bGUgKSApCi0gICAgICBsaWJyYXJ5LT5hdXRvX2hpbnRlciA9IG1vZHVsZTsKLQotICAgIC8qIGlmIHRoZSBtb2R1bGUgaXMgYSBmb250IGRyaXZlciAqLwotICAgIGlmICggRlRfTU9EVUxFX0lTX0RSSVZFUiggbW9kdWxlICkgKQotICAgIHsKLSAgICAgIC8qIGFsbG9jYXRlIGdseXBoIGxvYWRlciBpZiBuZWVkZWQgKi8KLSAgICAgIEZUX0RyaXZlciAgZHJpdmVyID0gRlRfRFJJVkVSKCBtb2R1bGUgKTsKLQotCi0gICAgICBkcml2ZXItPmNsYXp6ID0gKEZUX0RyaXZlcl9DbGFzcyltb2R1bGUtPmNsYXp6OwotICAgICAgaWYgKCBGVF9EUklWRVJfVVNFU19PVVRMSU5FUyggZHJpdmVyICkgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX05ldyggbWVtb3J5LCAmZHJpdmVyLT5nbHlwaF9sb2FkZXIgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggY2xhenotPm1vZHVsZV9pbml0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGNsYXp6LT5tb2R1bGVfaW5pdCggbW9kdWxlICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIGFkZCBtb2R1bGUgdG8gdGhlIGxpYnJhcnkncyB0YWJsZSAqLwotICAgIGxpYnJhcnktPm1vZHVsZXNbbGlicmFyeS0+bnVtX21vZHVsZXMrK10gPSBtb2R1bGU7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBpZiAoIEZUX01PRFVMRV9JU19EUklWRVIoIG1vZHVsZSApICkKLSAgICB7Ci0gICAgICBGVF9Ecml2ZXIgIGRyaXZlciA9IEZUX0RSSVZFUiggbW9kdWxlICk7Ci0KLQotICAgICAgaWYgKCBGVF9EUklWRVJfVVNFU19PVVRMSU5FUyggZHJpdmVyICkgKQotICAgICAgICBGVF9HbHlwaExvYWRlcl9Eb25lKCBkcml2ZXItPmdseXBoX2xvYWRlciApOwotICAgIH0KLQotICAgIGlmICggRlRfTU9EVUxFX0lTX1JFTkRFUkVSKCBtb2R1bGUgKSApCi0gICAgewotICAgICAgRlRfUmVuZGVyZXIgIHJlbmRlcmVyID0gRlRfUkVOREVSRVIoIG1vZHVsZSApOwotCi0KLSAgICAgIGlmICggcmVuZGVyZXItPnJhc3RlciApCi0gICAgICAgIHJlbmRlcmVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfZG9uZSggcmVuZGVyZXItPnJhc3RlciApOwotICAgIH0KLQotICAgIEZUX0ZSRUUoIG1vZHVsZSApOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfTW9kdWxlICkKLSAgRlRfR2V0X01vZHVsZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2R1bGVfbmFtZSApCi0gIHsKLSAgICBGVF9Nb2R1bGUgICByZXN1bHQgPSAwOwotICAgIEZUX01vZHVsZSogIGN1cjsKLSAgICBGVF9Nb2R1bGUqICBsaW1pdDsKLQotCi0gICAgaWYgKCAhbGlicmFyeSB8fCAhbW9kdWxlX25hbWUgKQotICAgICAgcmV0dXJuIHJlc3VsdDsKLQotICAgIGN1ciAgID0gbGlicmFyeS0+bW9kdWxlczsKLSAgICBsaW1pdCA9IGN1ciArIGxpYnJhcnktPm51bV9tb2R1bGVzOwotCi0gICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgICAgaWYgKCBmdF9zdHJjbXAoIGN1clswXS0+Y2xhenotPm1vZHVsZV9uYW1lLCBtb2R1bGVfbmFtZSApID09IDAgKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjdXJbMF07Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBjb25zdCB2b2lkKiApCi0gIEZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2RfbmFtZSApCi0gIHsKLSAgICBGVF9Nb2R1bGUgIG1vZHVsZTsKLQotCi0gICAgLyogdGVzdCBmb3IgdmFsaWQgYGxpYnJhcnknIGRlbGF5ZWQgdG8gRlRfR2V0X01vZHVsZSgpICovCi0KLSAgICBtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBsaWJyYXJ5LCBtb2RfbmFtZSApOwotCi0gICAgcmV0dXJuIG1vZHVsZSA/IG1vZHVsZS0+Y2xhenotPm1vZHVsZV9pbnRlcmZhY2UgOiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfUG9pbnRlciApCi0gIGZ0X21vZHVsZV9nZXRfc2VydmljZSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgc2VydmljZV9pZCApCi0gIHsKLSAgICBGVF9Qb2ludGVyICByZXN1bHQgPSBOVUxMOwotCi0gICAgaWYgKCBtb2R1bGUgKQotICAgIHsKLSAgICAgIEZUX0FTU0VSVCggbW9kdWxlLT5jbGF6eiAmJiBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlICk7Ci0KLSAgICAgLyogZmlyc3QsIGxvb2sgZm9yIHRoZSBzZXJ2aWNlIGluIHRoZSBtb2R1bGUKLSAgICAgICovCi0gICAgICBpZiAoIG1vZHVsZS0+Y2xhenotPmdldF9pbnRlcmZhY2UgKQotICAgICAgICByZXN1bHQgPSBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlKCBtb2R1bGUsIHNlcnZpY2VfaWQgKTsKLQotICAgICAgaWYgKCByZXN1bHQgPT0gTlVMTCApCi0gICAgICB7Ci0gICAgICAgLyogd2UgZGlkbid0IGZpbmQgaXQsIGxvb2sgaW4gYWxsIG90aGVyIG1vZHVsZXMgdGhlbgotICAgICAgICAqLwotICAgICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotICAgICAgICBGVF9Nb2R1bGUqICBjdXIgICAgID0gbGlicmFyeS0+bW9kdWxlczsKLSAgICAgICAgRlRfTW9kdWxlKiAgbGltaXQgICA9IGN1ciArIGxpYnJhcnktPm51bV9tb2R1bGVzOwotCi0gICAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggY3VyWzBdICE9IG1vZHVsZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfQVNTRVJUKCBjdXJbMF0tPmNsYXp6ICk7Ci0KLSAgICAgICAgICAgIGlmICggY3VyWzBdLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGN1clswXS0+Y2xhenotPmdldF9pbnRlcmZhY2UoIGN1clswXSwgc2VydmljZV9pZCApOwotICAgICAgICAgICAgICBpZiAoIHJlc3VsdCAhPSBOVUxMICkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1JlbW92ZV9Nb2R1bGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZSAgIG1vZHVsZSApCi0gIHsKLSAgICAvKiB0cnkgdG8gZmluZCB0aGUgbW9kdWxlIGZyb20gdGhlIHRhYmxlLCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZXJlICovCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZTsKLQotICAgIGlmICggbW9kdWxlICkKLSAgICB7Ci0gICAgICBGVF9Nb2R1bGUqICBjdXIgICA9IGxpYnJhcnktPm1vZHVsZXM7Ci0gICAgICBGVF9Nb2R1bGUqICBsaW1pdCA9IGN1ciArIGxpYnJhcnktPm51bV9tb2R1bGVzOwotCi0KLSAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjdXJbMF0gPT0gbW9kdWxlICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHJlbW92ZSBpdCBmcm9tIHRoZSB0YWJsZSAqLwotICAgICAgICAgIGxpYnJhcnktPm51bV9tb2R1bGVzLS07Ci0gICAgICAgICAgbGltaXQtLTsKLSAgICAgICAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjdXJbMF0gPSBjdXJbMV07Ci0gICAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbGltaXRbMF0gPSAwOwotCi0gICAgICAgICAgLyogZGVzdHJveSB0aGUgbW9kdWxlICovCi0gICAgICAgICAgRGVzdHJveV9Nb2R1bGUoIG1vZHVsZSApOwotCi0gICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfRHJpdmVyX0hhbmRsZTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBMIEkgQiBSIEEgUiBZICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfTGlicmFyeSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgICphbGlicmFyeSApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gMDsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhbWVtb3J5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0gICAgLyogaW5pdCBkZWJ1Z2dpbmcgc3VwcG9ydCAqLwotICAgIGZ0X2RlYnVnX2luaXQoKTsKLSNlbmRpZgotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBhbGxvY2F0ZSB0aGUgbGlicmFyeSBvYmplY3QgKi8KLSAgICBpZiAoIEZUX05FVyggbGlicmFyeSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGxpYnJhcnktPm1lbW9yeSA9IG1lbW9yeTsKLQotICAgIC8qIGFsbG9jYXRlIHRoZSByZW5kZXIgcG9vbCAqLwotICAgIGxpYnJhcnktPnJhc3Rlcl9wb29sX3NpemUgPSBGVF9SRU5ERVJfUE9PTF9TSVpFOwotI2lmIEZUX1JFTkRFUl9QT09MX1NJWkUgPiAwCi0gICAgaWYgKCBGVF9BTExPQyggbGlicmFyeS0+cmFzdGVyX3Bvb2wsIEZUX1JFTkRFUl9QT09MX1NJWkUgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0jZW5kaWYKLQotICAgIC8qIFRoYXQncyBvayBub3cgKi8KLSAgICAqYWxpYnJhcnkgPSBsaWJyYXJ5OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICBGYWlsOgotICAgIEZUX0ZSRUUoIGxpYnJhcnkgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9MaWJyYXJ5X1ZlcnNpb24oIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgKmFtaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYXBhdGNoICkKLSAgewotICAgIEZUX0ludCAgbWFqb3IgPSAwOwotICAgIEZUX0ludCAgbWlub3IgPSAwOwotICAgIEZUX0ludCAgcGF0Y2ggPSAwOwotCi0KLSAgICBpZiAoIGxpYnJhcnkgKQotICAgIHsKLSAgICAgIG1ham9yID0gbGlicmFyeS0+dmVyc2lvbl9tYWpvcjsKLSAgICAgIG1pbm9yID0gbGlicmFyeS0+dmVyc2lvbl9taW5vcjsKLSAgICAgIHBhdGNoID0gbGlicmFyeS0+dmVyc2lvbl9wYXRjaDsKLSAgICB9Ci0KLSAgICBpZiAoIGFtYWpvciApCi0gICAgICAqYW1ham9yID0gbWFqb3I7Ci0KLSAgICBpZiAoIGFtaW5vciApCi0gICAgICAqYW1pbm9yID0gbWlub3I7Ci0KLSAgICBpZiAoIGFwYXRjaCApCi0gICAgICAqYXBhdGNoID0gcGF0Y2g7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9MaWJyYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZTsKLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIC8qIERpc2NhcmQgY2xpZW50LWRhdGEgKi8KLSAgICBpZiAoIGxpYnJhcnktPmdlbmVyaWMuZmluYWxpemVyICkKLSAgICAgIGxpYnJhcnktPmdlbmVyaWMuZmluYWxpemVyKCBsaWJyYXJ5ICk7Ci0KLSAgICAvKiBDbG9zZSBhbGwgZmFjZXMgaW4gdGhlIGxpYnJhcnkuICBJZiB3ZSBkb24ndCBkbwotICAgICAqIHRoaXMsIHdlIGNhbiBoYXZlIHNvbWUgc3VidGxlIG1lbW9yeSBsZWFrcy4KLSAgICAgKiBFeGFtcGxlOgotICAgICAqCi0gICAgICogIC0gdGhlIGNmZiBmb250IGRyaXZlciB1c2VzIHRoZSBwc2hpbnRlciBtb2R1bGUgaW4gY2ZmX3NpemVfZG9uZQotICAgICAqICAtIGlmIHRoZSBwc2hpbnRlciBtb2R1bGUgaXMgZGVzdHJveWVkIGJlZm9yZSB0aGUgY2ZmIGZvbnQgZHJpdmVyLAotICAgICAqICAgIG9wZW5lZCBGVF9GYWNlIG9iamVjdHMgbWFuYWdlZCBieSB0aGUgZHJpdmVyIGFyZSBub3QgcHJvcGVybHkKLSAgICAgKiAgICBkZXN0cm95ZWQsIHJlc3VsdGluZyBpbiBhIG1lbW9yeSBsZWFrCi0gICAgICovCi0gICAgewotICAgICAgRlRfVUludCAgbjsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGxpYnJhcnktPm51bV9tb2R1bGVzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9Nb2R1bGUgIG1vZHVsZSA9IGxpYnJhcnktPm1vZHVsZXNbbl07Ci0gICAgICAgIEZUX0xpc3QgICAgZmFjZXM7Ci0KLQotICAgICAgICBpZiAoICggbW9kdWxlLT5jbGF6ei0+bW9kdWxlX2ZsYWdzICYgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICkgPT0gMCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZmFjZXMgPSAmRlRfRFJJVkVSKG1vZHVsZSktPmZhY2VzX2xpc3Q7Ci0gICAgICAgIHdoaWxlICggZmFjZXMtPmhlYWQgKQotICAgICAgICAgIEZUX0RvbmVfRmFjZSggRlRfRkFDRSggZmFjZXMtPmhlYWQtPmRhdGEgKSApOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIENsb3NlIGFsbCBvdGhlciBtb2R1bGVzIGluIHRoZSBsaWJyYXJ5ICovCi0jaWYgMQotICAgIC8qIFhYWCBNb2R1bGVzIGFyZSByZW1vdmVkIGluIHRoZSByZXZlcnNlZCBvcmRlciBzbyB0aGF0ICAqLwotICAgIC8qIHR5cGU0MiBtb2R1bGUgaXMgcmVtb3ZlZCBiZWZvcmUgdHJ1ZXR5cGUgbW9kdWxlLiAgVGhpcyAqLwotICAgIC8qIGF2b2lkcyBkb3VibGUgZnJlZSBpbiBzb21lIG9jY2FzaW9ucy4gIEl0IGlzIGEgaGFjay4gICAqLwotICAgIHdoaWxlICggbGlicmFyeS0+bnVtX21vZHVsZXMgPiAwICkKLSAgICAgIEZUX1JlbW92ZV9Nb2R1bGUoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LT5tb2R1bGVzW2xpYnJhcnktPm51bV9tb2R1bGVzIC0gMV0gKTsKLSNlbHNlCi0gICAgewotICAgICAgRlRfVUludCAgbjsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGxpYnJhcnktPm51bV9tb2R1bGVzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9Nb2R1bGUgIG1vZHVsZSA9IGxpYnJhcnktPm1vZHVsZXNbbl07Ci0KLQotICAgICAgICBpZiAoIG1vZHVsZSApCi0gICAgICAgIHsKLSAgICAgICAgICBEZXN0cm95X01vZHVsZSggbW9kdWxlICk7Ci0gICAgICAgICAgbGlicmFyeS0+bW9kdWxlc1tuXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIERlc3Ryb3kgcmFzdGVyIG9iamVjdHMgKi8KLSAgICBGVF9GUkVFKCBsaWJyYXJ5LT5yYXN0ZXJfcG9vbCApOwotICAgIGxpYnJhcnktPnJhc3Rlcl9wb29sX3NpemUgPSAwOwotCi0gICAgRlRfRlJFRSggbGlicmFyeSApOwotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TZXRfRGVidWdfSG9vayggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgaG9va19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0RlYnVnSG9va19GdW5jICBkZWJ1Z19ob29rICkKLSAgewotICAgIGlmICggbGlicmFyeSAmJiBkZWJ1Z19ob29rICYmCi0gICAgICAgICBob29rX2luZGV4IDwKLSAgICAgICAgICAgKCBzaXplb2YgKCBsaWJyYXJ5LT5kZWJ1Z19ob29rcyApIC8gc2l6ZW9mICggdm9pZCogKSApICkKLSAgICAgIGxpYnJhcnktPmRlYnVnX2hvb2tzW2hvb2tfaW5kZXhdID0gZGVidWdfaG9vazsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlICkKLSAgRlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1RydWVUeXBlRW5naW5lVHlwZSAgcmVzdWx0ID0gRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfTk9ORTsKLQotCi0gICAgaWYgKCBsaWJyYXJ5ICkKLSAgICB7Ci0gICAgICBGVF9Nb2R1bGUgIG1vZHVsZSA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJ0cnVldHlwZSIgKTsKLQotCi0gICAgICBpZiAoIG1vZHVsZSApCi0gICAgICB7Ci0gICAgICAgIEZUX1NlcnZpY2VfVHJ1ZVR5cGVFbmdpbmUgIHNlcnZpY2U7Ci0KLQotICAgICAgICBzZXJ2aWNlID0gKEZUX1NlcnZpY2VfVHJ1ZVR5cGVFbmdpbmUpCi0gICAgICAgICAgICAgICAgICAgIGZ0X21vZHVsZV9nZXRfc2VydmljZSggbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NFUlZJQ0VfSURfVFJVRVRZUEVfRU5HSU5FICk7Ci0gICAgICAgIGlmICggc2VydmljZSApCi0gICAgICAgICAgcmVzdWx0ID0gc2VydmljZS0+ZW5naW5lX3R5cGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBmdF9zdHViX3NldF9jaGFyX3NpemVzKCBGVF9TaXplICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBob3J6X3JlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgdmVydF9yZXMgKQotICB7Ci0gICAgRlRfU2l6ZV9SZXF1ZXN0UmVjICByZXE7Ci0gICAgRlRfRHJpdmVyICAgICAgICAgICBkcml2ZXIgPSBzaXplLT5mYWNlLT5kcml2ZXI7Ci0KLQotICAgIGlmICggZHJpdmVyLT5jbGF6ei0+cmVxdWVzdF9zaXplICkKLSAgICB7Ci0gICAgICByZXEudHlwZSAgID0gRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTDsKLSAgICAgIHJlcS53aWR0aCAgPSB3aWR0aDsKLSAgICAgIHJlcS5oZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgICAgIGlmICggaG9yel9yZXMgPT0gMCApCi0gICAgICAgIGhvcnpfcmVzID0gdmVydF9yZXM7Ci0KLSAgICAgIGlmICggdmVydF9yZXMgPT0gMCApCi0gICAgICAgIHZlcnRfcmVzID0gaG9yel9yZXM7Ci0KLSAgICAgIGlmICggaG9yel9yZXMgPT0gMCApCi0gICAgICAgIGhvcnpfcmVzID0gdmVydF9yZXMgPSA3MjsKLQotICAgICAgcmVxLmhvcmlSZXNvbHV0aW9uID0gaG9yel9yZXM7Ci0gICAgICByZXEudmVydFJlc29sdXRpb24gPSB2ZXJ0X3JlczsKLQotICAgICAgcmV0dXJuIGRyaXZlci0+Y2xhenotPnJlcXVlc3Rfc2l6ZSggc2l6ZSwgJnJlcSApOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBmdF9zdHViX3NldF9waXhlbF9zaXplcyggRlRfU2l6ZSAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgaGVpZ2h0ICkKLSAgewotICAgIEZUX1NpemVfUmVxdWVzdFJlYyAgcmVxOwotICAgIEZUX0RyaXZlciAgICAgICAgICAgZHJpdmVyID0gc2l6ZS0+ZmFjZS0+ZHJpdmVyOwotCi0KLSAgICBpZiAoIGRyaXZlci0+Y2xhenotPnJlcXVlc3Rfc2l6ZSApCi0gICAgewotICAgICAgcmVxLnR5cGUgICAgICAgICAgID0gRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTDsKLSAgICAgIHJlcS53aWR0aCAgICAgICAgICA9IHdpZHRoICA8PCA2OwotICAgICAgcmVxLmhlaWdodCAgICAgICAgID0gaGVpZ2h0IDw8IDY7Ci0gICAgICByZXEuaG9yaVJlc29sdXRpb24gPSAwOwotICAgICAgcmVxLnZlcnRSZXNvbHV0aW9uID0gMDsKLQotICAgICAgcmV0dXJuIGRyaXZlci0+Y2xhenotPnJlcXVlc3Rfc2l6ZSggc2l6ZSwgJnJlcSApOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KLQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1N1YkdseXBoX0luZm8oIEZUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIHN1Yl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqcF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAqcF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqcF9hcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpwX2FyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXggICAgKnBfdHJhbnNmb3JtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0KLSAgICBpZiAoIGdseXBoICE9IE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZ2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFICYmCi0gICAgICAgICBzdWJfaW5kZXggPCBnbHlwaC0+bnVtX3N1YmdseXBocyAgICAgICAgICAgKQotICAgIHsKLSAgICAgIEZUX1N1YkdseXBoICBzdWJnID0gZ2x5cGgtPnN1YmdseXBocyArIHN1Yl9pbmRleDsKLQotCi0gICAgICAqcF9pbmRleCAgICAgPSBzdWJnLT5pbmRleDsKLSAgICAgICpwX2ZsYWdzICAgICA9IHN1YmctPmZsYWdzOwotICAgICAgKnBfYXJnMSAgICAgID0gc3ViZy0+YXJnMTsKLSAgICAgICpwX2FyZzIgICAgICA9IHN1YmctPmFyZzI7Ci0gICAgICAqcF90cmFuc2Zvcm0gPSBzdWJnLT50cmFuc2Zvcm07Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdG91dGxuLmMgYi9zcmMvYmFzZS9mdG91dGxuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYWU4NTcuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRvdXRsbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG91dGxuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgb3V0bGluZSBtYW5hZ2VtZW50IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGwgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBpbiBmcmVldHlwZS5oLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vdXRsaW5lCi0KLQotICBzdGF0aWMKLSAgY29uc3QgRlRfT3V0bGluZSAgbnVsbF9vdXRsaW5lID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9EZWNvbXBvc2UoIEZUX091dGxpbmUqICAgICAgICAgICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3V0bGluZV9GdW5jcyogIGZ1bmNfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgIHVzZXIgKQotICB7Ci0jdW5kZWYgU0NBTEVECi0jZGVmaW5lIFNDQUxFRCggeCApICAoICggKHgpIDw8IHNoaWZ0ICkgLSBkZWx0YSApCi0KLSAgICBGVF9WZWN0b3IgICB2X2xhc3Q7Ci0gICAgRlRfVmVjdG9yICAgdl9jb250cm9sOwotICAgIEZUX1ZlY3RvciAgIHZfc3RhcnQ7Ci0KLSAgICBGVF9WZWN0b3IqICBwb2ludDsKLSAgICBGVF9WZWN0b3IqICBsaW1pdDsKLSAgICBjaGFyKiAgICAgICB0YWdzOwotCi0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0KLSAgICBGVF9JbnQgICBuOyAgICAgICAgIC8qIGluZGV4IG9mIGNvbnRvdXIgaW4gb3V0bGluZSAgICAgKi8KLSAgICBGVF9VSW50ICBmaXJzdDsgICAgIC8qIGluZGV4IG9mIGZpcnN0IHBvaW50IGluIGNvbnRvdXIgKi8KLSAgICBGVF9JbnQgICB0YWc7ICAgICAgIC8qIGN1cnJlbnQgcG9pbnQncyBzdGF0ZSAgICAgICAgICAgKi8KLQotICAgIEZUX0ludCAgIHNoaWZ0OwotICAgIEZUX1BvcyAgIGRlbHRhOwotCi0KLSAgICBpZiAoICFvdXRsaW5lIHx8ICFmdW5jX2ludGVyZmFjZSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBzaGlmdCA9IGZ1bmNfaW50ZXJmYWNlLT5zaGlmdDsKLSAgICBkZWx0YSA9IGZ1bmNfaW50ZXJmYWNlLT5kZWx0YTsKLSAgICBmaXJzdCA9IDA7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IG91dGxpbmUtPm5fY29udG91cnM7IG4rKyApCi0gICAgewotICAgICAgRlRfSW50ICBsYXN0OyAgLyogaW5kZXggb2YgbGFzdCBwb2ludCBpbiBjb250b3VyICovCi0KLQotICAgICAgbGFzdCA9IG91dGxpbmUtPmNvbnRvdXJzW25dOwotICAgICAgaWYgKCBsYXN0IDwgMCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotICAgICAgbGltaXQgPSBvdXRsaW5lLT5wb2ludHMgKyBsYXN0OwotCi0gICAgICB2X3N0YXJ0ID0gb3V0bGluZS0+cG9pbnRzW2ZpcnN0XTsKLSAgICAgIHZfbGFzdCAgPSBvdXRsaW5lLT5wb2ludHNbbGFzdF07Ci0KLSAgICAgIHZfc3RhcnQueCA9IFNDQUxFRCggdl9zdGFydC54ICk7IHZfc3RhcnQueSA9IFNDQUxFRCggdl9zdGFydC55ICk7Ci0gICAgICB2X2xhc3QueCAgPSBTQ0FMRUQoIHZfbGFzdC54ICk7ICB2X2xhc3QueSAgPSBTQ0FMRUQoIHZfbGFzdC55ICk7Ci0KLSAgICAgIHZfY29udHJvbCA9IHZfc3RhcnQ7Ci0KLSAgICAgIHBvaW50ID0gb3V0bGluZS0+cG9pbnRzICsgZmlyc3Q7Ci0gICAgICB0YWdzICA9IG91dGxpbmUtPnRhZ3MgICsgZmlyc3Q7Ci0gICAgICB0YWcgICA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgICAvKiBBIGNvbnRvdXIgY2Fubm90IHN0YXJ0IHdpdGggYSBjdWJpYyBjb250cm9sIHBvaW50ISAqLwotICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NVQklDICkKLSAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgIC8qIGNoZWNrIGZpcnN0IHBvaW50IHRvIGRldGVybWluZSBvcmlnaW4gKi8KLSAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICB7Ci0gICAgICAgIC8qIGZpcnN0IHBvaW50IGlzIGNvbmljIGNvbnRyb2wuICBZZXMsIHRoaXMgaGFwcGVucy4gKi8KLSAgICAgICAgaWYgKCBGVF9DVVJWRV9UQUcoIG91dGxpbmUtPnRhZ3NbbGFzdF0gKSA9PSBGVF9DVVJWRV9UQUdfT04gKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc3RhcnQgYXQgbGFzdCBwb2ludCBpZiBpdCBpcyBvbiB0aGUgY3VydmUgKi8KLSAgICAgICAgICB2X3N0YXJ0ID0gdl9sYXN0OwotICAgICAgICAgIGxpbWl0LS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogaWYgYm90aCBmaXJzdCBhbmQgbGFzdCBwb2ludHMgYXJlIGNvbmljLCAgICAgICAgICovCi0gICAgICAgICAgLyogc3RhcnQgYXQgdGhlaXIgbWlkZGxlIGFuZCByZWNvcmQgaXRzIHBvc2l0aW9uICAgICovCi0gICAgICAgICAgLyogZm9yIGNsb3N1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgdl9zdGFydC54ID0gKCB2X3N0YXJ0LnggKyB2X2xhc3QueCApIC8gMjsKLSAgICAgICAgICB2X3N0YXJ0LnkgPSAoIHZfc3RhcnQueSArIHZfbGFzdC55ICkgLyAyOwotCi0gICAgICAgICAgdl9sYXN0ID0gdl9zdGFydDsKLSAgICAgICAgfQotICAgICAgICBwb2ludC0tOwotICAgICAgICB0YWdzLS07Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPm1vdmVfdG8oICZ2X3N0YXJ0LCB1c2VyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICB3aGlsZSAoIHBvaW50IDwgbGltaXQgKQotICAgICAgewotICAgICAgICBwb2ludCsrOwotICAgICAgICB0YWdzKys7Ci0KLSAgICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0gICAgICAgIHN3aXRjaCAoIHRhZyApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBGVF9DVVJWRV9UQUdfT046ICAvKiBlbWl0IGEgc2luZ2xlIGxpbmVfdG8gKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzsKLQotCi0gICAgICAgICAgICB2ZWMueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICAgIHZlYy55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5saW5lX3RvKCAmdmVjLCB1c2VyICk7Ci0gICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX0NPTklDOiAgLyogY29uc3VtZSBjb25pYyBhcmNzICovCi0gICAgICAgICAgdl9jb250cm9sLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgdl9jb250cm9sLnkgPSBTQ0FMRUQoIHBvaW50LT55ICk7Ci0KLSAgICAgICAgRG9fQ29uaWM6Ci0gICAgICAgICAgaWYgKCBwb2ludCA8IGxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdl9taWRkbGU7Ci0KLQotICAgICAgICAgICAgcG9pbnQrKzsKLSAgICAgICAgICAgIHRhZ3MrKzsKLSAgICAgICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgICAgICAgICB2ZWMueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICAgIHZlYy55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgICAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfT04gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jb25pY190byggJnZfY29udHJvbCwgJnZlYywgdXNlciApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHRhZyAhPSBGVF9DVVJWRV9UQUdfQ09OSUMgKQotICAgICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgICAgdl9taWRkbGUueCA9ICggdl9jb250cm9sLnggKyB2ZWMueCApIC8gMjsKLSAgICAgICAgICAgIHZfbWlkZGxlLnkgPSAoIHZfY29udHJvbC55ICsgdmVjLnkgKSAvIDI7Ci0KLSAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdl9taWRkbGUsIHVzZXIgKTsKLSAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIHZfY29udHJvbCA9IHZlYzsKLSAgICAgICAgICAgIGdvdG8gRG9fQ29uaWM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y29uaWNfdG8oICZ2X2NvbnRyb2wsICZ2X3N0YXJ0LCB1c2VyICk7Ci0gICAgICAgICAgZ290byBDbG9zZTsKLQotICAgICAgICBkZWZhdWx0OiAgLyogRlRfQ1VSVkVfVEFHX0NVQklDICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWMxLCB2ZWMyOwotCi0KLSAgICAgICAgICAgIGlmICggcG9pbnQgKyAxID4gbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIEZUX0NVUlZFX1RBRyggdGFnc1sxXSApICE9IEZUX0NVUlZFX1RBR19DVUJJQyApCi0gICAgICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgICAgICBwb2ludCArPSAyOwotICAgICAgICAgICAgdGFncyAgKz0gMjsKLQotICAgICAgICAgICAgdmVjMS54ID0gU0NBTEVEKCBwb2ludFstMl0ueCApOyB2ZWMxLnkgPSBTQ0FMRUQoIHBvaW50Wy0yXS55ICk7Ci0gICAgICAgICAgICB2ZWMyLnggPSBTQ0FMRUQoIHBvaW50Wy0xXS54ICk7IHZlYzIueSA9IFNDQUxFRCggcG9pbnRbLTFdLnkgKTsKLQotICAgICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICAgIHZlYy55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmN1YmljX3RvKCAmdmVjMSwgJnZlYzIsICZ2ZWMsIHVzZXIgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y3ViaWNfdG8oICZ2ZWMxLCAmdmVjMiwgJnZfc3RhcnQsIHVzZXIgKTsKLSAgICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNsb3NlIHRoZSBjb250b3VyIHdpdGggYSBsaW5lIHNlZ21lbnQgKi8KLSAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmxpbmVfdG8oICZ2X3N0YXJ0LCB1c2VyICk7Ci0KLSAgICBDbG9zZToKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZpcnN0ID0gbGFzdCArIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgSW52YWxpZF9PdXRsaW5lOgotICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9PdXRsaW5lOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfTmV3X0ludGVybmFsKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bVBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBudW1Db250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICphbm91dGxpbmUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBpZiAoICFhbm91dGxpbmUgfHwgIW1lbW9yeSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICAqYW5vdXRsaW5lID0gbnVsbF9vdXRsaW5lOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGFub3V0bGluZS0+cG9pbnRzLCAgIG51bVBvaW50cyAqIDJMICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggYW5vdXRsaW5lLT50YWdzLCAgICAgbnVtUG9pbnRzICAgICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBhbm91dGxpbmUtPmNvbnRvdXJzLCBudW1Db250b3VycyAgICApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGFub3V0bGluZS0+bl9wb2ludHMgICAgPSAoRlRfVVNob3J0KW51bVBvaW50czsKLSAgICBhbm91dGxpbmUtPm5fY29udG91cnMgID0gKEZUX1Nob3J0KW51bUNvbnRvdXJzOwotICAgIGFub3V0bGluZS0+ZmxhZ3MgICAgICB8PSBGVF9PVVRMSU5FX09XTkVSOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICBGYWlsOgotICAgIGFub3V0bGluZS0+ZmxhZ3MgfD0gRlRfT1VUTElORV9PV05FUjsKLSAgICBGVF9PdXRsaW5lX0RvbmVfSW50ZXJuYWwoIG1lbW9yeSwgYW5vdXRsaW5lICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX05ldyggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApCi0gIHsKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZTsKLQotICAgIHJldHVybiBGVF9PdXRsaW5lX05ld19JbnRlcm5hbCggbGlicmFyeS0+bWVtb3J5LCBudW1Qb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db250b3VycywgYW5vdXRsaW5lICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0NoZWNrKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICBpZiAoIG91dGxpbmUgKQotICAgIHsKLSAgICAgIEZUX0ludCAgbl9wb2ludHMgICA9IG91dGxpbmUtPm5fcG9pbnRzOwotICAgICAgRlRfSW50ICBuX2NvbnRvdXJzID0gb3V0bGluZS0+bl9jb250b3VyczsKLSAgICAgIEZUX0ludCAgZW5kMCwgZW5kOwotICAgICAgRlRfSW50ICBuOwotCi0KLSAgICAgIC8qIGVtcHR5IGdseXBoPyAqLwotICAgICAgaWYgKCBuX3BvaW50cyA9PSAwICYmIG5fY29udG91cnMgPT0gMCApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICAvKiBjaGVjayBwb2ludCBhbmQgY29udG91ciBjb3VudHMgKi8KLSAgICAgIGlmICggbl9wb2ludHMgPD0gMCB8fCBuX2NvbnRvdXJzIDw9IDAgKQotICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgZW5kMCA9IGVuZCA9IC0xOwotICAgICAgZm9yICggbiA9IDA7IG4gPCBuX2NvbnRvdXJzOyBuKysgKQotICAgICAgewotICAgICAgICBlbmQgPSBvdXRsaW5lLT5jb250b3Vyc1tuXTsKLQotICAgICAgICAvKiBub3RlIHRoYXQgd2UgZG9uJ3QgYWNjZXB0IGVtcHR5IGNvbnRvdXJzICovCi0gICAgICAgIGlmICggZW5kIDw9IGVuZDAgfHwgZW5kID49IG5fcG9pbnRzICkKLSAgICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgICBlbmQwID0gZW5kOwotICAgICAgfQotCi0gICAgICBpZiAoIGVuZCAhPSBuX3BvaW50cyAtIDEgKQotICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgLyogWFhYOiBjaGVjayB0aGUgdGFncyBhcnJheSAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIEJhZDoKLSAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0NvcHkoIGNvbnN0IEZUX091dGxpbmUqICBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgICAgICAgKnRhcmdldCApCi0gIHsKLSAgICBGVF9JbnQgIGlzX293bmVyOwotCi0KLSAgICBpZiAoICFzb3VyY2UgICAgICAgICAgICB8fCAhdGFyZ2V0ICAgICAgICAgICAgfHwKLSAgICAgICAgIHNvdXJjZS0+bl9wb2ludHMgICAhPSB0YXJnZXQtPm5fcG9pbnRzICAgfHwKLSAgICAgICAgIHNvdXJjZS0+bl9jb250b3VycyAhPSB0YXJnZXQtPm5fY29udG91cnMgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgaWYgKCBzb3VyY2UgPT0gdGFyZ2V0ICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICBGVF9BUlJBWV9DT1BZKCB0YXJnZXQtPnBvaW50cywgc291cmNlLT5wb2ludHMsIHNvdXJjZS0+bl9wb2ludHMgKTsKLQotICAgIEZUX0FSUkFZX0NPUFkoIHRhcmdldC0+dGFncywgc291cmNlLT50YWdzLCBzb3VyY2UtPm5fcG9pbnRzICk7Ci0KLSAgICBGVF9BUlJBWV9DT1BZKCB0YXJnZXQtPmNvbnRvdXJzLCBzb3VyY2UtPmNvbnRvdXJzLCBzb3VyY2UtPm5fY29udG91cnMgKTsKLQotICAgIC8qIGNvcHkgYWxsIGZsYWdzLCBleGNlcHQgdGhlIGBGVF9PVVRMSU5FX09XTkVSJyBvbmUgKi8KLSAgICBpc19vd25lciAgICAgID0gdGFyZ2V0LT5mbGFncyAmIEZUX09VVExJTkVfT1dORVI7Ci0gICAgdGFyZ2V0LT5mbGFncyA9IHNvdXJjZS0+ZmxhZ3M7Ci0KLSAgICB0YXJnZXQtPmZsYWdzICY9IH5GVF9PVVRMSU5FX09XTkVSOwotICAgIHRhcmdldC0+ZmxhZ3MgfD0gaXNfb3duZXI7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICBpZiAoIG1lbW9yeSAmJiBvdXRsaW5lICkKLSAgICB7Ci0gICAgICBpZiAoIG91dGxpbmUtPmZsYWdzICYgRlRfT1VUTElORV9PV05FUiApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZSRUUoIG91dGxpbmUtPnBvaW50cyAgICk7Ci0gICAgICAgIEZUX0ZSRUUoIG91dGxpbmUtPnRhZ3MgICAgICk7Ci0gICAgICAgIEZUX0ZSRUUoIG91dGxpbmUtPmNvbnRvdXJzICk7Ci0gICAgICB9Ci0gICAgICAqb3V0bGluZSA9IG51bGxfb3V0bGluZTsKLQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9Eb25lKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICAvKiBjaGVjayBmb3IgdmFsaWQgYG91dGxpbmUnIGluIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCgpICovCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9MaWJyYXJ5X0hhbmRsZTsKLQotICAgIHJldHVybiBGVF9PdXRsaW5lX0RvbmVfSW50ZXJuYWwoIGxpYnJhcnktPm1lbW9yeSwgb3V0bGluZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9PdXRsaW5lX0dldF9DQm94KCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCAgICAgICAgICAgKmFjYm94ICkKLSAgewotICAgIEZUX1BvcyAgeE1pbiwgeU1pbiwgeE1heCwgeU1heDsKLQotCi0gICAgaWYgKCBvdXRsaW5lICYmIGFjYm94ICkKLSAgICB7Ci0gICAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzID09IDAgKQotICAgICAgewotICAgICAgICB4TWluID0gMDsKLSAgICAgICAgeU1pbiA9IDA7Ci0gICAgICAgIHhNYXggPSAwOwotICAgICAgICB5TWF4ID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yKiAgdmVjICAgPSBvdXRsaW5lLT5wb2ludHM7Ci0gICAgICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gdmVjICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgICB4TWluID0geE1heCA9IHZlYy0+eDsKLSAgICAgICAgeU1pbiA9IHlNYXggPSB2ZWMtPnk7Ci0gICAgICAgIHZlYysrOwotCi0gICAgICAgIGZvciAoIDsgdmVjIDwgbGltaXQ7IHZlYysrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgeCwgeTsKLQotCi0gICAgICAgICAgeCA9IHZlYy0+eDsKLSAgICAgICAgICBpZiAoIHggPCB4TWluICkgeE1pbiA9IHg7Ci0gICAgICAgICAgaWYgKCB4ID4geE1heCApIHhNYXggPSB4OwotCi0gICAgICAgICAgeSA9IHZlYy0+eTsKLSAgICAgICAgICBpZiAoIHkgPCB5TWluICkgeU1pbiA9IHk7Ci0gICAgICAgICAgaWYgKCB5ID4geU1heCApIHlNYXggPSB5OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBhY2JveC0+eE1pbiA9IHhNaW47Ci0gICAgICBhY2JveC0+eE1heCA9IHhNYXg7Ci0gICAgICBhY2JveC0+eU1pbiA9IHlNaW47Ci0gICAgICBhY2JveC0+eU1heCA9IHlNYXg7Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgeE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICB5T2Zmc2V0ICkKLSAgewotICAgIEZUX1VTaG9ydCAgIG47Ci0gICAgRlRfVmVjdG9yKiAgdmVjOwotCi0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybjsKLQotICAgIHZlYyA9IG91dGxpbmUtPnBvaW50czsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0bGluZS0+bl9wb2ludHM7IG4rKyApCi0gICAgewotICAgICAgdmVjLT54ICs9IHhPZmZzZXQ7Ci0gICAgICB2ZWMtPnkgKz0geU9mZnNldDsKLSAgICAgIHZlYysrOwotICAgIH0KLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfT3V0bGluZV9SZXZlcnNlKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICBGVF9VU2hvcnQgIG47Ci0gICAgRlRfSW50ICAgICBmaXJzdCwgbGFzdDsKLQotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBmaXJzdCA9IDA7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IG91dGxpbmUtPm5fY29udG91cnM7IG4rKyApCi0gICAgewotICAgICAgbGFzdCAgPSBvdXRsaW5lLT5jb250b3Vyc1tuXTsKLQotICAgICAgLyogcmV2ZXJzZSBwb2ludCB0YWJsZSAqLwotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICBwID0gb3V0bGluZS0+cG9pbnRzICsgZmlyc3Q7Ci0gICAgICAgIEZUX1ZlY3RvciogIHEgPSBvdXRsaW5lLT5wb2ludHMgKyBsYXN0OwotICAgICAgICBGVF9WZWN0b3IgICBzd2FwOwotCi0KLSAgICAgICAgd2hpbGUgKCBwIDwgcSApCi0gICAgICAgIHsKLSAgICAgICAgICBzd2FwID0gKnA7Ci0gICAgICAgICAgKnAgICA9ICpxOwotICAgICAgICAgICpxICAgPSBzd2FwOwotICAgICAgICAgIHArKzsKLSAgICAgICAgICBxLS07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogcmV2ZXJzZSB0YWdzIHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIGNoYXIqICBwID0gb3V0bGluZS0+dGFncyArIGZpcnN0OwotICAgICAgICBjaGFyKiAgcSA9IG91dGxpbmUtPnRhZ3MgKyBsYXN0OwotICAgICAgICBjaGFyICAgc3dhcDsKLQotCi0gICAgICAgIHdoaWxlICggcCA8IHEgKQotICAgICAgICB7Ci0gICAgICAgICAgc3dhcCA9ICpwOwotICAgICAgICAgICpwICAgPSAqcTsKLSAgICAgICAgICAqcSAgID0gc3dhcDsKLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgcS0tOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZpcnN0ID0gbGFzdCArIDE7Ci0gICAgfQotCi0gICAgb3V0bGluZS0+ZmxhZ3MgXj0gRlRfT1VUTElORV9SRVZFUlNFX0ZJTEw7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX1JlbmRlciggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX0Jvb2wgICAgICB1cGRhdGUgPSAwOwotICAgIEZUX1JlbmRlcmVyICByZW5kZXJlcjsKLSAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfTGlicmFyeV9IYW5kbGU7Ci0KLSAgICBpZiAoICFvdXRsaW5lIHx8ICFwYXJhbXMgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgcmVuZGVyZXIgPSBsaWJyYXJ5LT5jdXJfcmVuZGVyZXI7Ci0gICAgbm9kZSAgICAgPSBsaWJyYXJ5LT5yZW5kZXJlcnMuaGVhZDsKLQotICAgIHBhcmFtcy0+c291cmNlID0gKHZvaWQqKW91dGxpbmU7Ci0KLSAgICBlcnJvciA9IEZUX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoOwotICAgIHdoaWxlICggcmVuZGVyZXIgKQotICAgIHsKLSAgICAgIGVycm9yID0gcmVuZGVyZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlcmVyLT5yYXN0ZXIsIHBhcmFtcyApOwotICAgICAgaWYgKCAhZXJyb3IgfHwgRlRfRVJST1JfQkFTRSggZXJyb3IgKSAhPSBGVF9FcnJfQ2Fubm90X1JlbmRlcl9HbHlwaCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBGVF9FcnJfQ2Fubm90X1JlbmRlcl9HbHlwaCBpcyByZXR1cm5lZCBpZiB0aGUgcmVuZGVyIG1vZGUgICAqLwotICAgICAgLyogaXMgdW5zdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIHRoaXMgZ2x5cGggaW1hZ2UgKi8KLSAgICAgIC8qIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIG5vdywgbG9vayBmb3IgYW5vdGhlciByZW5kZXJlciB0aGF0IHN1cHBvcnRzIHRoZSBzYW1lICovCi0gICAgICAvKiBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgcmVuZGVyZXIgPSBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2RlICk7Ci0gICAgICB1cGRhdGUgICA9IDE7Ci0gICAgfQotCi0gICAgLyogaWYgd2UgY2hhbmdlZCB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgdGhlIGdseXBoIGltYWdlIGZvcm1hdCAqLwotICAgIC8qIHdlIG5lZWQgdG8gc2VsZWN0IGl0IGFzIHRoZSBuZXh0IGN1cnJlbnQgb25lICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFlcnJvciAmJiB1cGRhdGUgJiYgcmVuZGVyZXIgKQotICAgICAgRlRfU2V0X1JlbmRlcmVyKCBsaWJyYXJ5LCByZW5kZXJlciwgMCwgMCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9HZXRfQml0bWFwKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQml0bWFwICAqYWJpdG1hcCApCi0gIHsKLSAgICBGVF9SYXN0ZXJfUGFyYW1zICBwYXJhbXM7Ci0KLQotICAgIGlmICggIWFiaXRtYXAgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgLyogb3RoZXIgY2hlY2tzIGFyZSBkZWxheWVkIHRvIEZUX091dGxpbmVfUmVuZGVyKCkgKi8KLQotICAgIHBhcmFtcy50YXJnZXQgPSBhYml0bWFwOwotICAgIHBhcmFtcy5mbGFncyAgPSAwOwotCi0gICAgaWYgKCBhYml0bWFwLT5waXhlbF9tb2RlID09IEZUX1BJWEVMX01PREVfR1JBWSAgfHwKLSAgICAgICAgIGFiaXRtYXAtPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9MQ0QgICB8fAotICAgICAgICAgYWJpdG1hcC0+cGl4ZWxfbW9kZSA9PSBGVF9QSVhFTF9NT0RFX0xDRF9WICkKLSAgICAgIHBhcmFtcy5mbGFncyB8PSBGVF9SQVNURVJfRkxBR19BQTsKLQotICAgIHJldHVybiBGVF9PdXRsaW5lX1JlbmRlciggbGlicmFyeSwgb3V0bGluZSwgJnBhcmFtcyApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfVmVjdG9yX1RyYW5zZm9ybSggRlRfVmVjdG9yKiAgICAgICAgdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXggKQotICB7Ci0gICAgRlRfUG9zICB4eiwgeXo7Ci0KLQotICAgIGlmICggIXZlY3RvciB8fCAhbWF0cml4ICkKLSAgICAgIHJldHVybjsKLQotICAgIHh6ID0gRlRfTXVsRml4KCB2ZWN0b3ItPngsIG1hdHJpeC0+eHggKSArCi0gICAgICAgICBGVF9NdWxGaXgoIHZlY3Rvci0+eSwgbWF0cml4LT54eSApOwotCi0gICAgeXogPSBGVF9NdWxGaXgoIHZlY3Rvci0+eCwgbWF0cml4LT55eCApICsKLSAgICAgICAgIEZUX011bEZpeCggdmVjdG9yLT55LCBtYXRyaXgtPnl5ICk7Ci0KLSAgICB2ZWN0b3ItPnggPSB4ejsKLSAgICB2ZWN0b3ItPnkgPSB5ejsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgIG1hdHJpeCApCi0gIHsKLSAgICBGVF9WZWN0b3IqICB2ZWM7Ci0gICAgRlRfVmVjdG9yKiAgbGltaXQ7Ci0KLQotICAgIGlmICggIW91dGxpbmUgfHwgIW1hdHJpeCApCi0gICAgICByZXR1cm47Ci0KLSAgICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICBsaW1pdCA9IHZlYyArIG91dGxpbmUtPm5fcG9pbnRzOwotCi0gICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgICAgRlRfVmVjdG9yX1RyYW5zZm9ybSggdmVjLCBtYXRyaXggKTsKLSAgfQotCi0KLSNpZiAwCi0KLSNkZWZpbmUgRlRfT1VUTElORV9HRVRfQ09OVE9VUiggb3V0bGluZSwgYywgZmlyc3QsIGxhc3QgKSAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGZpcnN0KSA9ICggYyA+IDAgKSA/IChvdXRsaW5lKS0+cG9pbnRzICsgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0bGluZSktPmNvbnRvdXJzW2MgLSAxXSArIDEgXAotICAgICAgICAgICAgICAgICAgICAgICAgOiAob3V0bGluZSktPnBvaW50czsgICAgICAgICAgICAgICBcCi0gICAgKGxhc3QpID0gKG91dGxpbmUpLT5wb2ludHMgKyAob3V0bGluZSktPmNvbnRvdXJzW2NdOyAgIFwKLSAgfSB3aGlsZSAoIDAgKQotCi0KLSAgLyogSXMgYSBwb2ludCBpbiBzb21lIGNvbnRvdXI/ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgdHJlYXQgZXZlcnkgcG9pbnQgb2YgdGhlIGNvbnRvdXIgYXMgaWYgaXQgICAgKi8KLSAgLyogaXQgd2VyZSBPTi4gIFRoYXQgaXMsIHdlIGFsbG93IGZhbHNlIHBvc2l0aXZlcywgKi8KLSAgLyogYnV0IGRpc2FsbG93IGZhbHNlIG5lZ2F0aXZlcy4gIChYWFggcmVhbGx5PykgICAgKi8KLSAgc3RhdGljIEZUX0Jvb2wKLSAgZnRfY29udG91cl9oYXMoIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgRlRfU2hvcnQgICAgIGMsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgcG9pbnQgKQotICB7Ci0gICAgRlRfVmVjdG9yKiAgZmlyc3Q7Ci0gICAgRlRfVmVjdG9yKiAgbGFzdDsKLSAgICBGVF9WZWN0b3IqICBhOwotICAgIEZUX1ZlY3RvciogIGI7Ci0gICAgRlRfVUludCAgICAgbiA9IDA7Ci0KLQotICAgIEZUX09VVExJTkVfR0VUX0NPTlRPVVIoIG91dGxpbmUsIGMsIGZpcnN0LCBsYXN0ICk7Ci0KLSAgICBmb3IgKCBhID0gZmlyc3Q7IGEgPD0gbGFzdDsgYSsrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIHg7Ci0gICAgICBGVF9JbnQgIGludGVyc2VjdDsKLQotCi0gICAgICBiID0gKCBhID09IGxhc3QgKSA/IGZpcnN0IDogYSArIDE7Ci0KLSAgICAgIGludGVyc2VjdCA9ICggYS0+eSAtIHBvaW50LT55ICkgXiAoIGItPnkgLSBwb2ludC0+eSApOwotCi0gICAgICAvKiBhIGFuZCBiIGFyZSBvbiB0aGUgc2FtZSBzaWRlICovCi0gICAgICBpZiAoIGludGVyc2VjdCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBpbnRlcnNlY3QgPT0gMCAmJiBhLT55ID09IHBvaW50LT55ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggKCBhLT54IDw9IHBvaW50LT54ICYmIGItPnggPj0gcG9pbnQtPnggKSB8fAotICAgICAgICAgICAgICAgKCBhLT54ID49IHBvaW50LT54ICYmIGItPnggPD0gcG9pbnQtPnggKSApCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICB4ID0gYS0+eCArICggYi0+eCAtIGEtPnggKSAqIChwb2ludC0+eSAtIGEtPnkgKSAvICggYi0+eSAtIGEtPnkgKTsKLQotICAgICAgaWYgKCB4IDwgcG9pbnQtPnggKQotICAgICAgICBuKys7Ci0gICAgICBlbHNlIGlmICggeCA9PSBwb2ludC0+eCApCi0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiAoIG4gJSAyICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGZ0X2NvbnRvdXJfZW5jbG9zZWQoIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgYyApCi0gIHsKLSAgICBGVF9WZWN0b3IqICBmaXJzdDsKLSAgICBGVF9WZWN0b3IqICBsYXN0OwotICAgIEZUX1Nob3J0ICAgIGk7Ci0KLQotICAgIEZUX09VVExJTkVfR0VUX0NPTlRPVVIoIG91dGxpbmUsIGMsIGZpcnN0LCBsYXN0ICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG91dGxpbmUtPm5fY29udG91cnM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBpICE9IGMgJiYgZnRfY29udG91cl9oYXMoIG91dGxpbmUsIGksIGZpcnN0ICkgKQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICBwdDsKLQotCi0gICAgICAgIGZvciAoIHB0ID0gZmlyc3QgKyAxOyBwdCA8PSBsYXN0OyBwdCsrICkKLSAgICAgICAgICBpZiAoICFmdF9jb250b3VyX2hhcyggb3V0bGluZSwgaSwgcHQgKSApCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogVGhpcyB2ZXJzaW9uIGRpZmZlcnMgZnJvbSB0aGUgcHVibGljIG9uZSBpbiB0aGF0IGVhY2ggKi8KLSAgLyogcGFydCAoY29udG91ciBub3QgZW5jbG9zZWQgaW4gYW5vdGhlciBjb250b3VyKSBvZiB0aGUgKi8KLSAgLyogb3V0bGluZSBpcyBjaGVja2VkIGZvciBvcmllbnRhdGlvbi4gIFRoaXMgaXMgICAgICAgICAgKi8KLSAgLyogbmVjZXNzYXJ5IGZvciBzb21lIGJ1Z2d5IENKSyBmb250cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX09yaWVudGF0aW9uCi0gIGZ0X291dGxpbmVfZ2V0X29yaWVudGF0aW9uKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICBGVF9TaG9ydCAgICAgICAgaTsKLSAgICBGVF9WZWN0b3IqICAgICAgZmlyc3Q7Ci0gICAgRlRfVmVjdG9yKiAgICAgIGxhc3Q7Ci0gICAgRlRfT3JpZW50YXRpb24gIG9yaWVudCA9IEZUX09SSUVOVEFUSU9OX05PTkU7Ci0KLQotICAgIGZpcnN0ID0gb3V0bGluZS0+cG9pbnRzOwotICAgIGZvciAoIGkgPSAwOyBpIDwgb3V0bGluZS0+bl9jb250b3VyczsgaSsrLCBmaXJzdCA9IGxhc3QgKyAxICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICBwb2ludDsKLSAgICAgIEZUX1ZlY3RvciogIHhtaW5fcG9pbnQ7Ci0gICAgICBGVF9Qb3MgICAgICB4bWluOwotCi0KLSAgICAgIGxhc3QgPSBvdXRsaW5lLT5wb2ludHMgKyBvdXRsaW5lLT5jb250b3Vyc1tpXTsKLQotICAgICAgLyogc2tpcCBkZWdlbmVyYXRlIGNvbnRvdXJzICovCi0gICAgICBpZiAoIGxhc3QgPCBmaXJzdCArIDIgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBmdF9jb250b3VyX2VuY2xvc2VkKCBvdXRsaW5lLCBpICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgeG1pbiAgICAgICA9IGZpcnN0LT54OwotICAgICAgeG1pbl9wb2ludCA9IGZpcnN0OwotCi0gICAgICBmb3IgKCBwb2ludCA9IGZpcnN0ICsgMTsgcG9pbnQgPD0gbGFzdDsgcG9pbnQrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggcG9pbnQtPnggPCB4bWluICkKLSAgICAgICAgewotICAgICAgICAgIHhtaW4gICAgICAgPSBwb2ludC0+eDsKLSAgICAgICAgICB4bWluX3BvaW50ID0gcG9pbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogY2hlY2sgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBjb250b3VyICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciogICAgICBwcmV2OwotICAgICAgICBGVF9WZWN0b3IqICAgICAgbmV4dDsKLSAgICAgICAgRlRfT3JpZW50YXRpb24gIG87Ci0KLQotICAgICAgICBwcmV2ID0gKCB4bWluX3BvaW50ID09IGZpcnN0ICkgPyBsYXN0IDogeG1pbl9wb2ludCAtIDE7Ci0gICAgICAgIG5leHQgPSAoIHhtaW5fcG9pbnQgPT0gbGFzdCApID8gZmlyc3QgOiB4bWluX3BvaW50ICsgMTsKLQotICAgICAgICBpZiAoIEZUX0F0YW4yKCBwcmV2LT54IC0geG1pbl9wb2ludC0+eCwgcHJldi0+eSAtIHhtaW5fcG9pbnQtPnkgKSA+Ci0gICAgICAgICAgICAgRlRfQXRhbjIoIG5leHQtPnggLSB4bWluX3BvaW50LT54LCBuZXh0LT55IC0geG1pbl9wb2ludC0+eSApICkKLSAgICAgICAgICBvID0gRlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG8gPSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRTsKLQotICAgICAgICBpZiAoIG9yaWVudCA9PSBGVF9PUklFTlRBVElPTl9OT05FICkKLSAgICAgICAgICBvcmllbnQgPSBvOwotICAgICAgICBlbHNlIGlmICggb3JpZW50ICE9IG8gKQotICAgICAgICAgIHJldHVybiBGVF9PUklFTlRBVElPTl9OT05FOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBvcmllbnQ7Ci0gIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0VtYm9sZGVuKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHN0cmVuZ3RoICkKLSAgewotICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICBGVF9WZWN0b3IgICB2X3ByZXYsIHZfZmlyc3QsIHZfbmV4dCwgdl9jdXI7Ci0gICAgRlRfQW5nbGUgICAgcm90YXRlLCBhbmdsZV9pbiwgYW5nbGVfb3V0OwotICAgIEZUX0ludCAgICAgIGMsIG4sIGZpcnN0OwotICAgIEZUX0ludCAgICAgIG9yaWVudGF0aW9uOwotCi0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIHN0cmVuZ3RoIC89IDI7Ci0gICAgaWYgKCBzdHJlbmd0aCA9PSAwICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICBvcmllbnRhdGlvbiA9IEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKCBvdXRsaW5lICk7Ci0gICAgaWYgKCBvcmllbnRhdGlvbiA9PSBGVF9PUklFTlRBVElPTl9OT05FICkKLSAgICB7Ci0gICAgICBpZiAoIG91dGxpbmUtPm5fY29udG91cnMgKQotICAgICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgaWYgKCBvcmllbnRhdGlvbiA9PSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSApCi0gICAgICByb3RhdGUgPSAtRlRfQU5HTEVfUEkyOwotICAgIGVsc2UKLSAgICAgIHJvdGF0ZSA9IEZUX0FOR0xFX1BJMjsKLQotICAgIHBvaW50cyA9IG91dGxpbmUtPnBvaW50czsKLQotICAgIGZpcnN0ID0gMDsKLSAgICBmb3IgKCBjID0gMDsgYyA8IG91dGxpbmUtPm5fY29udG91cnM7IGMrKyApCi0gICAgewotICAgICAgaW50ICBsYXN0ID0gb3V0bGluZS0+Y29udG91cnNbY107Ci0KLQotICAgICAgdl9maXJzdCA9IHBvaW50c1tmaXJzdF07Ci0gICAgICB2X3ByZXYgID0gcG9pbnRzW2xhc3RdOwotICAgICAgdl9jdXIgICA9IHZfZmlyc3Q7Ci0KLSAgICAgIGZvciAoIG4gPSBmaXJzdDsgbiA8PSBsYXN0OyBuKysgKQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IgIGluLCBvdXQ7Ci0gICAgICAgIEZUX0FuZ2xlICAgYW5nbGVfZGlmZjsKLSAgICAgICAgRlRfUG9zICAgICBkOwotICAgICAgICBGVF9GaXhlZCAgIHNjYWxlOwotCi0KLSAgICAgICAgaWYgKCBuIDwgbGFzdCApCi0gICAgICAgICAgdl9uZXh0ID0gcG9pbnRzW24gKyAxXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHZfbmV4dCA9IHZfZmlyc3Q7Ci0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgaW4gYW5kIG91dCB2ZWN0b3JzICovCi0gICAgICAgIGluLnggPSB2X2N1ci54IC0gdl9wcmV2Lng7Ci0gICAgICAgIGluLnkgPSB2X2N1ci55IC0gdl9wcmV2Lnk7Ci0KLSAgICAgICAgb3V0LnggPSB2X25leHQueCAtIHZfY3VyLng7Ci0gICAgICAgIG91dC55ID0gdl9uZXh0LnkgLSB2X2N1ci55OwotCi0gICAgICAgIGFuZ2xlX2luICAgPSBGVF9BdGFuMiggaW4ueCwgaW4ueSApOwotICAgICAgICBhbmdsZV9vdXQgID0gRlRfQXRhbjIoIG91dC54LCBvdXQueSApOwotICAgICAgICBhbmdsZV9kaWZmID0gRlRfQW5nbGVfRGlmZiggYW5nbGVfaW4sIGFuZ2xlX291dCApOwotICAgICAgICBzY2FsZSAgICAgID0gRlRfQ29zKCBhbmdsZV9kaWZmIC8gMiApOwotCi0gICAgICAgIGlmICggc2NhbGUgPCAweDQwMDBMICYmIHNjYWxlID4gLTB4NDAwMEwgKQotICAgICAgICAgIGluLnggPSBpbi55ID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZCA9IEZUX0RpdkZpeCggc3RyZW5ndGgsIHNjYWxlICk7Ci0KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmluLCBkLCBhbmdsZV9pbiArIGFuZ2xlX2RpZmYgLyAyIC0gcm90YXRlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRsaW5lLT5wb2ludHNbbl0ueCA9IHZfY3VyLnggKyBzdHJlbmd0aCArIGluLng7Ci0gICAgICAgIG91dGxpbmUtPnBvaW50c1tuXS55ID0gdl9jdXIueSArIHN0cmVuZ3RoICsgaW4ueTsKLQotICAgICAgICB2X3ByZXYgPSB2X2N1cjsKLSAgICAgICAgdl9jdXIgID0gdl9uZXh0OwotICAgICAgfQotCi0gICAgICBmaXJzdCA9IGxhc3QgKyAxOwotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfT3JpZW50YXRpb24gKQotICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiggRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgRlRfUG9zICAgICAgeG1pbiAgICAgICA9IDMyNzY4TDsKLSAgICBGVF9Qb3MgICAgICB4bWluX3ltaW4gID0gMzI3NjhMOwotICAgIEZUX1BvcyAgICAgIHhtaW5feW1heCAgPSAtMzI3NjhMOwotICAgIEZUX1ZlY3RvciogIHhtaW5fZmlyc3QgPSBOVUxMOwotICAgIEZUX1ZlY3RvciogIHhtaW5fbGFzdCAgPSBOVUxMOwotCi0gICAgc2hvcnQqICAgICAgY29udG91cjsKLQotICAgIEZUX1ZlY3RvciogIGZpcnN0OwotICAgIEZUX1ZlY3RvciogIGxhc3Q7Ci0gICAgRlRfVmVjdG9yKiAgcHJldjsKLSAgICBGVF9WZWN0b3IqICBwb2ludDsKLQotICAgIGludCAgICAgICAgICAgICBpOwotICAgIEZUX1BvcyAgICAgICAgICByYXlfeVszXTsKLSAgICBGVF9PcmllbnRhdGlvbiAgcmVzdWx0WzNdOwotCi0KLSAgICBpZiAoICFvdXRsaW5lIHx8IG91dGxpbmUtPm5fcG9pbnRzIDw9IDAgKQotICAgICAgcmV0dXJuIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFOwotCi0gICAgLyogV2UgdXNlIHRoZSBub256ZXJvIHdpbmRpbmcgcnVsZSB0byBmaW5kIHRoZSBvcmllbnRhdGlvbi4gICAgICAgKi8KLSAgICAvKiBTaW5jZSBnbHlwaCBvdXRsaW5lcyBiZWhhdmUgbXVjaCBtb3JlIGByZWd1bGFyJyB0aGFuIGFyYml0cmFyeSAqLwotICAgIC8qIGN1YmljIG9yIHF1YWRyYXRpYyBjdXJ2ZXMsIHRoaXMgdGVzdCBkZWFscyB3aXRoIHRoZSBwb2x5Z29uICAgICovCi0gICAgLyogb25seSB3aGljaCBpcyBzcGFubmVkIHVwIGJ5IHRoZSBjb250cm9sIHBvaW50cy4gICAgICAgICAgICAgICAgKi8KLQotICAgIGZpcnN0ID0gb3V0bGluZS0+cG9pbnRzOwotICAgIGZvciAoIGNvbnRvdXIgPSBvdXRsaW5lLT5jb250b3VyczsKLSAgICAgICAgICBjb250b3VyIDwgb3V0bGluZS0+Y29udG91cnMgKyBvdXRsaW5lLT5uX2NvbnRvdXJzOwotICAgICAgICAgIGNvbnRvdXIrKywgZmlyc3QgPSBsYXN0ICsgMSApCi0gICAgewotICAgICAgRlRfUG9zICBjb250b3VyX3htaW4gPSAzMjc2OEw7Ci0gICAgICBGVF9Qb3MgIGNvbnRvdXJfeG1heCA9IC0zMjc2OEw7Ci0gICAgICBGVF9Qb3MgIGNvbnRvdXJfeW1pbiA9IDMyNzY4TDsKLSAgICAgIEZUX1BvcyAgY29udG91cl95bWF4ID0gLTMyNzY4TDsKLQotCi0gICAgICBsYXN0ID0gb3V0bGluZS0+cG9pbnRzICsgKmNvbnRvdXI7Ci0KLSAgICAgIC8qIHNraXAgZGVnZW5lcmF0ZSBjb250b3VycyAqLwotICAgICAgaWYgKCBsYXN0IDwgZmlyc3QgKyAyICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGZvciAoIHBvaW50ID0gZmlyc3Q7IHBvaW50IDw9IGxhc3Q7ICsrcG9pbnQgKQotICAgICAgewotICAgICAgICBpZiAoIHBvaW50LT54IDwgY29udG91cl94bWluICkKLSAgICAgICAgICBjb250b3VyX3htaW4gPSBwb2ludC0+eDsKLQotICAgICAgICBpZiAoIHBvaW50LT54ID4gY29udG91cl94bWF4ICkKLSAgICAgICAgICBjb250b3VyX3htYXggPSBwb2ludC0+eDsKLQotICAgICAgICBpZiAoIHBvaW50LT55IDwgY29udG91cl95bWluICkKLSAgICAgICAgICBjb250b3VyX3ltaW4gPSBwb2ludC0+eTsKLQotICAgICAgICBpZiAoIHBvaW50LT55ID4gY29udG91cl95bWF4ICkKLSAgICAgICAgICBjb250b3VyX3ltYXggPSBwb2ludC0+eTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBjb250b3VyX3htaW4gPCB4bWluICAgICAgICAgICYmCi0gICAgICAgICAgIGNvbnRvdXJfeG1pbiAhPSBjb250b3VyX3htYXggJiYKLSAgICAgICAgICAgY29udG91cl95bWluICE9IGNvbnRvdXJfeW1heCApCi0gICAgICB7Ci0gICAgICAgIHhtaW4gICAgICAgPSBjb250b3VyX3htaW47Ci0gICAgICAgIHhtaW5feW1pbiAgPSBjb250b3VyX3ltaW47Ci0gICAgICAgIHhtaW5feW1heCAgPSBjb250b3VyX3ltYXg7Ci0gICAgICAgIHhtaW5fZmlyc3QgPSBmaXJzdDsKLSAgICAgICAgeG1pbl9sYXN0ICA9IGxhc3Q7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCB4bWluID09IDMyNzY4ICkKLSAgICAgIHJldHVybiBGVF9PUklFTlRBVElPTl9UUlVFVFlQRTsKLQotICAgIHJheV95WzBdID0gKCB4bWluX3ltaW4gKiAzICsgeG1pbl95bWF4ICAgICApID4+IDI7Ci0gICAgcmF5X3lbMV0gPSAoIHhtaW5feW1pbiAgICAgKyB4bWluX3ltYXggICAgICkgPj4gMTsKLSAgICByYXlfeVsyXSA9ICggeG1pbl95bWluICAgICArIHhtaW5feW1heCAqIDMgKSA+PiAyOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCAzOyBpKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgICAgIGxlZnRfeDsKLSAgICAgIEZUX1BvcyAgICAgIHJpZ2h0X3g7Ci0gICAgICBGVF9WZWN0b3IqICBsZWZ0MTsKLSAgICAgIEZUX1ZlY3RvciogIGxlZnQyOwotICAgICAgRlRfVmVjdG9yKiAgcmlnaHQxOwotICAgICAgRlRfVmVjdG9yKiAgcmlnaHQyOwotCi0KLSAgICBSZWRvUmF5OgotICAgICAgbGVmdF94ICA9IDMyNzY4TDsKLSAgICAgIHJpZ2h0X3ggPSAtMzI3NjhMOwotCi0gICAgICBsZWZ0MSA9IGxlZnQyID0gcmlnaHQxID0gcmlnaHQyID0gTlVMTDsKLQotICAgICAgcHJldiA9IHhtaW5fbGFzdDsKLSAgICAgIGZvciAoIHBvaW50ID0geG1pbl9maXJzdDsgcG9pbnQgPD0geG1pbl9sYXN0OyBwcmV2ID0gcG9pbnQsICsrcG9pbnQgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIHRtcF94OwotCi0KLSAgICAgICAgaWYgKCBwb2ludC0+eSA9PSByYXlfeVtpXSB8fCBwcmV2LT55ID09IHJheV95W2ldICkKLSAgICAgICAgewotICAgICAgICAgIHJheV95W2ldKys7Ci0gICAgICAgICAgZ290byBSZWRvUmF5OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoIHBvaW50LT55IDwgcmF5X3lbaV0gJiYgcHJldi0+eSA8IHJheV95W2ldICkgfHwKLSAgICAgICAgICAgICAoIHBvaW50LT55ID4gcmF5X3lbaV0gJiYgcHJldi0+eSA+IHJheV95W2ldICkgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHRtcF94ID0gRlRfTXVsRGl2KCBwb2ludC0+eCAtIHByZXYtPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByYXlfeVtpXSAtIHByZXYtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC0+eSAtIHByZXYtPnkgKSArIHByZXYtPng7Ci0KLSAgICAgICAgaWYgKCB0bXBfeCA8IGxlZnRfeCApCi0gICAgICAgIHsKLSAgICAgICAgICBsZWZ0X3ggPSB0bXBfeDsKLSAgICAgICAgICBsZWZ0MSAgPSBwcmV2OwotICAgICAgICAgIGxlZnQyICA9IHBvaW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB0bXBfeCA+IHJpZ2h0X3ggKQotICAgICAgICB7Ci0gICAgICAgICAgcmlnaHRfeCA9IHRtcF94OwotICAgICAgICAgIHJpZ2h0MSAgPSBwcmV2OwotICAgICAgICAgIHJpZ2h0MiAgPSBwb2ludDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGxlZnQxICYmIHJpZ2h0MSApCi0gICAgICB7Ci0gICAgICAgIGlmICggbGVmdDEtPnkgPCBsZWZ0Mi0+eSAmJiByaWdodDEtPnkgPiByaWdodDItPnkgKQotICAgICAgICAgIHJlc3VsdFtpXSA9IEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFOwotICAgICAgICBlbHNlIGlmICggbGVmdDEtPnkgPiBsZWZ0Mi0+eSAmJiByaWdodDEtPnkgPCByaWdodDItPnkgKQotICAgICAgICAgIHJlc3VsdFtpXSA9IEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXN1bHRbaV0gPSBGVF9PUklFTlRBVElPTl9OT05FOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggcmVzdWx0WzBdICE9IEZUX09SSUVOVEFUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCByZXN1bHRbMF0gPT0gcmVzdWx0WzFdIHx8IHJlc3VsdFswXSA9PSByZXN1bHRbMl0gKSApCi0gICAgICByZXR1cm4gcmVzdWx0WzBdOwotCi0gICAgaWYgKCByZXN1bHRbMV0gIT0gRlRfT1JJRU5UQVRJT05fTk9ORSAmJiByZXN1bHRbMV0gPT0gcmVzdWx0WzJdICkKLSAgICAgIHJldHVybiByZXN1bHRbMV07Ci0KLSAgICByZXR1cm4gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEU7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0cGF0ZW50LmMgYi9zcmMvYmFzZS9mdHBhdGVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjNmMTkxLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0cGF0ZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRwYXRlbnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY2hlY2tpbmcgcGF0ZW50ZWQgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zICAgICovCi0vKiAgICAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNyBieSBEYXZpZCBUdXJuZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfU0ZOVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSAotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgX3R0X2NoZWNrX3BhdGVudHNfaW5fcmFuZ2UoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBzaXplICkKLSAgewotICAgIEZUX0Jvb2wgICByZXN1bHQgPSBGQUxTRTsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgRlRfQnl0ZXMgIHAsIGVuZDsKLQotCi0gICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggc2l6ZSApICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcCAgID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgZW5kID0gcCArIHNpemU7Ci0KLSAgICB3aGlsZSAoIHAgPCBlbmQgKQotICAgIHsKLSAgICAgIHN3aXRjaCAocFswXSkKLSAgICAgIHsKLSAgICAgIGNhc2UgMHgwNjogIC8qIFNQdlRMIC8vICovCi0gICAgICBjYXNlIDB4MDc6ICAvKiBTUHZUTCArICAqLwotICAgICAgY2FzZSAweDA4OiAgLyogU0Z2VEwgLy8gKi8KLSAgICAgIGNhc2UgMHgwOTogIC8qIFNGdlRMICsgICovCi0gICAgICBjYXNlIDB4MEE6ICAvKiBTUHZGUyAgICAqLwotICAgICAgY2FzZSAweDBCOiAgLyogU0Z2RlMgICAgKi8KLSAgICAgICAgcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjYXNlIDB4NDA6Ci0gICAgICAgIGlmICggcCArIDEgPj0gZW5kICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgcCArPSBwWzFdICsgMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg0MToKLSAgICAgICAgaWYgKCBwICsgMSA+PSBlbmQgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBwICs9IHBbMV0gKiAyICsgMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg3MTogIC8qIERFTFRBUDIgKi8KLSAgICAgIGNhc2UgMHg3MjogIC8qIERFTFRBUDMgKi8KLSAgICAgIGNhc2UgMHg3MzogIC8qIERFTFRBQzAgKi8KLSAgICAgIGNhc2UgMHg3NDogIC8qIERFTFRBQzEgKi8KLSAgICAgIGNhc2UgMHg3NTogIC8qIERFTFRBQzIgKi8KLSAgICAgICAgcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjYXNlIDB4QjA6Ci0gICAgICBjYXNlIDB4QjE6Ci0gICAgICBjYXNlIDB4QjI6Ci0gICAgICBjYXNlIDB4QjM6Ci0gICAgICBjYXNlIDB4QjQ6Ci0gICAgICBjYXNlIDB4QjU6Ci0gICAgICBjYXNlIDB4QjY6Ci0gICAgICBjYXNlIDB4Qjc6Ci0gICAgICAgIHAgKz0gKCBwWzBdIC0gMHhCMCApICsgMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHhCODoKLSAgICAgIGNhc2UgMHhCOToKLSAgICAgIGNhc2UgMHhCQToKLSAgICAgIGNhc2UgMHhCQjoKLSAgICAgIGNhc2UgMHhCQzoKLSAgICAgIGNhc2UgMHhCRDoKLSAgICAgIGNhc2UgMHhCRToKLSAgICAgIGNhc2UgMHhCRjoKLSAgICAgICAgcCArPSAoIHBbMF0gLSAweEI4ICkgKiAyICsgMzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHAgKz0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIF90dF9jaGVja19wYXRlbnRzX2luX3RhYmxlKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB0YWcgKQotICB7Ci0gICAgRlRfU3RyZWFtICAgICAgICAgICAgICBzdHJlYW0gPSBmYWNlLT5zdHJlYW07Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX1NGTlRfVGFibGUgIHNlcnZpY2U7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKLQotCi0gICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFNGTlRfVEFCTEUgKTsKLQotICAgIGlmICggc2VydmljZSApCi0gICAgewotICAgICAgRlRfVUxvbmcgIG9mZnNldCwgc2l6ZTsKLQotCi0gICAgICBlcnJvciA9IHNlcnZpY2UtPnRhYmxlX2luZm8oIGZhY2UsIHRhZywgJm9mZnNldCwgJnNpemUgKTsKLSAgICAgIGlmICggZXJyb3IgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgcmVzdWx0ID0gX3R0X2NoZWNrX3BhdGVudHNfaW5fcmFuZ2UoIHN0cmVhbSwgc2l6ZSApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIF90dF9mYWNlX2NoZWNrX3BhdGVudHMoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5zdHJlYW07Ci0gICAgRlRfVUludCAgICBnaW5kZXg7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9Cb29sICAgIHJlc3VsdDsKLQotICAgIEZUX1NlcnZpY2VfVFRHbHlmICBzZXJ2aWNlOwotCi0KLSAgICByZXN1bHQgPSBfdHRfY2hlY2tfcGF0ZW50c19pbl90YWJsZSggZmFjZSwgVFRBR19mcGdtICk7Ci0gICAgaWYgKCByZXN1bHQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcmVzdWx0ID0gX3R0X2NoZWNrX3BhdGVudHNfaW5fdGFibGUoIGZhY2UsIFRUQUdfcHJlcCApOwotICAgIGlmICggcmVzdWx0ICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBUVF9HTFlGICk7Ci0gICAgaWYgKCBzZXJ2aWNlID09IE5VTEwgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggZ2luZGV4ID0gMDsgZ2luZGV4IDwgKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBoczsgZ2luZGV4KysgKQotICAgIHsKLSAgICAgIEZUX1VMb25nICBvZmZzZXQsIG51bV9pbnMsIHNpemU7Ci0gICAgICBGVF9JbnQgICAgbnVtX2NvbnRvdXJzOwotCi0KLSAgICAgIG9mZnNldCA9IHNlcnZpY2UtPmdldF9sb2NhdGlvbiggZmFjZSwgZ2luZGV4LCAmc2l6ZSApOwotICAgICAgaWYgKCBzaXplID09IDAgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgICAgICB8fAotICAgICAgICAgICBGVF9SRUFEX1NIT1JUKCBudW1fY29udG91cnMgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIG51bV9jb250b3VycyA+PSAwICkgIC8qIHNpbXBsZSBnbHlwaCAqLwotICAgICAgewotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCA4ICsgbnVtX2NvbnRvdXJzICogMiApICkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgIC8qIGNvbXBvdW5kIGdseXBoICovCi0gICAgICB7Ci0gICAgICAgIEZUX0Jvb2wgIGhhc19pbnN0ciA9IDA7Ci0KLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCA4ICkgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIG5vdyByZWFkIGVhY2ggY29tcG9uZW50ICovCi0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBmbGFncywgdG9za2lwOwotCi0KLSAgICAgICAgICBpZiggRlRfUkVBRF9VU0hPUlQoIGZsYWdzICkgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICB0b3NraXAgPSAyICsgMSArIDE7Ci0KLSAgICAgICAgICBpZiAoICggZmxhZ3MgJiAoIDEgPDwgMCApICkgIT0gMCApICAgICAgIC8qIEFSR1NfQVJFX1dPUkRTICovCi0gICAgICAgICAgICB0b3NraXAgKz0gMjsKLQotICAgICAgICAgIGlmICggKCBmbGFncyAmICggMSA8PCAzICkgKSAhPSAwICkgICAgICAgLyogV0VfSEFWRV9BX1NDQUxFICovCi0gICAgICAgICAgICB0b3NraXAgKz0gMjsKLSAgICAgICAgICBlbHNlIGlmICggKCBmbGFncyAmICggMSA8PCA2ICkgKSAhPSAwICkgIC8qIFdFX0hBVkVfWF9ZX1NDQUxFICovCi0gICAgICAgICAgICB0b3NraXAgKz0gNDsKLSAgICAgICAgICBlbHNlIGlmICggKCBmbGFncyAmICggMSA8PCA3ICkgKSAhPSAwICkgIC8qIFdFX0hBVkVfQV8yeDIgKi8KLSAgICAgICAgICAgIHRvc2tpcCArPSA4OwotCi0gICAgICAgICAgaWYgKCAoIGZsYWdzICYgKCAxIDw8IDggKSApICE9IDAgKSAgICAgICAvKiBXRV9IQVZFX0lOU1RSVUNUSU9OUyAqLwotICAgICAgICAgICAgaGFzX2luc3RyID0gMTsKLQotICAgICAgICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIHRvc2tpcCApICkKLSAgICAgICAgICAgIGdvdG8gTmV4dEdseXBoOwotCi0gICAgICAgICAgaWYgKCAoIGZsYWdzICYgKCAxIDw8IDUgKSApID09IDAgKSAgICAgICAvKiBNT1JFX0NPTVBPTkVOVFMgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhaGFzX2luc3RyICkKLSAgICAgICAgICBnb3RvIE5leHRHbHlwaDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbnVtX2lucyApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIHJlc3VsdCA9IF90dF9jaGVja19wYXRlbnRzX2luX3JhbmdlKCBzdHJlYW0sIG51bV9pbnMgKTsKLSAgICAgIGlmICggcmVzdWx0ICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgTmV4dEdseXBoOgotICAgICAgOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Jvb2wgKQotICBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0Jvb2wgIHJlc3VsdCA9IEZBTFNFOwotCi0KLSAgICBpZiAoIGZhY2UgJiYgRlRfSVNfU0ZOVCggZmFjZSApICkKLSAgICAgIHJlc3VsdCA9IF90dF9mYWNlX2NoZWNrX3BhdGVudHMoIGZhY2UgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Jvb2wgKQotICBGVF9GYWNlX1NldFVucGF0ZW50ZWRIaW50aW5nKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICB2YWx1ZSApCi0gIHsKLSAgICBGVF9Cb29sICByZXN1bHQgPSAwOwotCi0KLSNpZiBkZWZpbmVkKCBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyApICYmIFwKLSAgICAhZGVmaW5lZCggVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUFJFVEVSICkKLSAgICBpZiAoIGZhY2UgJiYgRlRfSVNfU0ZOVCggZmFjZSApICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAhZmFjZS0+aW50ZXJuYWwtPmlnbm9yZV91bnBhdGVudGVkX2hpbnRlcjsKLSAgICAgIGZhY2UtPmludGVybmFsLT5pZ25vcmVfdW5wYXRlbnRlZF9oaW50ZXIgPSAhdmFsdWU7Ci0gICAgfQotI2Vsc2UKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLSAgICBGVF9VTlVTRUQoIHZhbHVlICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHJmb3JrLmMgYi9zcmMvYmFzZS9mdHJmb3JrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODM1ZWUuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRyZm9yay5jCisrKyAvZGV2L251bGwKQEAgLTEsODExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmZvcmsuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBFbWJlZGRlZCByZXNvdXJjZSBmb3JrcyBhY2Nlc3NvciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvKCkgYW5kIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX2hmc3BsdXMoKSBhcmUgICAgICovCi0vKiAgZGVyaXZlZCBmcm9tIGZ0b2Jqcy5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXZlbG9wbWVudCBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgc3VwcG9ydCBvZiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUkZPUktfSAotCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcmFjY2VzcwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgIFJlc291cmNlIGZvcmsgZGlyZWN0b3J5IGFjY2VzcyAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmZvcmtfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICptYXBfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZGF0YV9wb3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgdW5zaWduZWQgY2hhciAgaGVhZFsxNl0sIGhlYWQyWzE2XTsKLSAgICBGVF9Mb25nICAgICAgICBtYXBfcG9zLCByZGF0YV9sZW47Ci0gICAgaW50ICAgICAgICAgICAgYWxsemVyb3MsIGFsbG1hdGNoLCBpOwotICAgIEZUX0xvbmcgICAgICAgIHR5cGVfbGlzdDsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIHJmb3JrX29mZnNldCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSAqKWhlYWQsIDE2ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAqcmRhdGFfcG9zID0gcmZvcmtfb2Zmc2V0ICsgKCAoIGhlYWRbMF0gPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBoZWFkWzFdIDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaGVhZFsyXSA8PCAgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRbM10gICAgICAgICApOwotICAgIG1hcF9wb3MgICAgPSByZm9ya19vZmZzZXQgKyAoICggaGVhZFs0XSA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGhlYWRbNV0gPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBoZWFkWzZdIDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZFs3XSAgICAgICAgICk7Ci0gICAgcmRhdGFfbGVuID0gKCBoZWFkWyA4XSA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAoIGhlYWRbIDldIDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICggaGVhZFsxMF0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICBoZWFkWzExXTsKLQotICAgIC8qIG1hcF9sZW4gPSBoZWFkWzEyXSAuLiBoZWFkWzE1XSAqLwotCi0gICAgaWYgKCAqcmRhdGFfcG9zICsgcmRhdGFfbGVuICE9IG1hcF9wb3MgfHwgbWFwX3BvcyA9PSByZm9ya19vZmZzZXQgKQotICAgICAgcmV0dXJuIEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCBtYXBfcG9zICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBoZWFkMlsxNV0gPSAoRlRfQnl0ZSkoIGhlYWRbMTVdICsgMSApOyAgICAgICAvKiBtYWtlIGl0IGJlIGRpZmZlcmVudCAqLwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSopaGVhZDIsIDE2ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBhbGx6ZXJvcyA9IDE7Ci0gICAgYWxsbWF0Y2ggPSAxOwotICAgIGZvciAoIGkgPSAwOyBpIDwgMTY7ICsraSApCi0gICAgewotICAgICAgaWYgKCBoZWFkMltpXSAhPSAwICkKLSAgICAgICAgYWxsemVyb3MgPSAwOwotICAgICAgaWYgKCBoZWFkMltpXSAhPSBoZWFkW2ldICkKLSAgICAgICAgYWxsbWF0Y2ggPSAwOwotICAgIH0KLSAgICBpZiAoICFhbGx6ZXJvcyAmJiAhYWxsbWF0Y2ggKQotICAgICAgcmV0dXJuIEZUX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotCi0gICAgLyogSWYgd2UgaGF2ZSByZWFjaGVkIHRoaXMgcG9pbnQgdGhlbiBpdCBpcyBwcm9iYWJseSBhIG1hYyByZXNvdXJjZSAqLwotICAgIC8qIGZpbGUuICBOb3csIGRvZXMgaXQgY29udGFpbiBhbnkgaW50ZXJlc3RpbmcgcmVzb3VyY2VzPyAgICAgICAgICAgKi8KLSAgICAvKiBTa2lwIGhhbmRsZSB0byBuZXh0IHJlc291cmNlIG1hcCwgdGhlIGZpbGUgcmVzb3VyY2UgbnVtYmVyLCBhbmQgICovCi0gICAgLyogYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICh2b2lkKUZUX1NUUkVBTV9TS0lQKCA0ICAgICAgICAvKiBza2lwIGhhbmRsZSB0byBuZXh0IHJlc291cmNlIG1hcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICArIDIgICAgICAvKiBza2lwIGZpbGUgcmVzb3VyY2UgbnVtYmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgMiApOyAgIC8qIHNraXAgYXR0cmlidXRlcyAqLwotCi0gICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggdHlwZV9saXN0ICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIGlmICggdHlwZV9saXN0ID09IC0xICkKLSAgICAgIHJldHVybiBGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdDsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgbWFwX3BvcyArIHR5cGVfbGlzdCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgKm1hcF9vZmZzZXQgPSBtYXBfcG9zICsgdHlwZV9saXN0OwotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZnRfcmFjY2Vzc19zb3J0X3JlZl9ieV9pZCggRlRfUkZvcmtfUmVmKiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUkZvcmtfUmVmKiAgYiApCi0gIHsKLSAgICBpZiAoIGEtPnJlc19pZCA8IGItPnJlc19pZCApCi0gICAgICByZXR1cm4gLTE7Ci0gICAgZWxzZSBpZiAoIGEtPnJlc19pZCA+IGItPnJlc19pZCApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBtYXBfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmRhdGFfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICoqb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKmNvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgaW50ICAgICAgICAgICBpLCBqLCBjbnQsIHN1YmNudDsKLSAgICBGVF9Mb25nICAgICAgIHRhZ19pbnRlcm5hbCwgcnBvczsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9Mb25nICAgICAgIHRlbXA7Ci0gICAgRlRfTG9uZyAgICAgICAqb2Zmc2V0c19pbnRlcm5hbDsKLSAgICBGVF9SRm9ya19SZWYgICpyZWY7Ci0KLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgbWFwX29mZnNldCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggY250ICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIGNudCsrOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBjbnQ7ICsraSApCi0gICAgewotICAgICAgaWYgKCBGVF9SRUFEX0xPTkcoIHRhZ19pbnRlcm5hbCApIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBzdWJjbnQgKSAgICAgfHwKLSAgICAgICAgICAgRlRfUkVBRF9VU0hPUlQoIHJwb3MgKSAgICAgICApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgRlRfVFJBQ0UyKCggIlJlc291cmNlIHRhZ3M6ICVjJWMlYyVjXG4iLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweGZmICYgKCB0YWdfaW50ZXJuYWwgPj4gMjQgKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweGZmICYgKCB0YWdfaW50ZXJuYWwgPj4gMTYgKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweGZmICYgKCB0YWdfaW50ZXJuYWwgPj4gIDggKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweGZmICYgKCB0YWdfaW50ZXJuYWwgPj4gIDAgKSApICkpOwotCi0gICAgICBpZiAoIHRhZ19pbnRlcm5hbCA9PSB0YWcgKQotICAgICAgewotICAgICAgICAqY291bnQgPSBzdWJjbnQgKyAxOwotICAgICAgICBycG9zICArPSBtYXBfb2Zmc2V0OwotCi0gICAgICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgcnBvcyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHJlZiwgKmNvdW50ICkgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8ICpjb3VudDsgKytqICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIHJlZltqXS5yZXNfaWQgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggMiApICkgLyogcmVzb3VyY2UgbmFtZSAqLwotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIGlmICggRlRfUkVBRF9MT05HKCB0ZW1wICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIDQgKSApIC8qIG1ieiAqLwotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgcmVmW2pdLm9mZnNldCA9IHRlbXAgJiAweEZGRkZGRkw7Ci0gICAgICAgIH0KLQotICAgICAgICBmdF9xc29ydCggcmVmLCAqY291bnQsIHNpemVvZiAoIEZUX1JGb3JrX1JlZiApLAotICAgICAgICAgICAgICAgICAgKCBpbnQoKikoY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSApCi0gICAgICAgICAgICAgICAgICBmdF9yYWNjZXNzX3NvcnRfcmVmX2J5X2lkICk7Ci0KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIG9mZnNldHNfaW50ZXJuYWwsICpjb3VudCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogWFhYOiBkdXBsaWNhdGVkIHJlZmVyZW5jZSBJRCwKLSAgICAgICAgICogICAgICBnYXAgYmV0d2VlbiByZWZlcmVuY2UgSURzIGFyZSBhY2NlcHRhYmxlPwotICAgICAgICAgKiAgICAgIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBvbiBBcHBsZSBpbXBsZW1lbnRhdGlvbiBpcyBuZWVkZWQuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8ICpjb3VudDsgKytqICkKLSAgICAgICAgICBvZmZzZXRzX2ludGVybmFsW2pdID0gcmRhdGFfcG9zICsgcmVmW2pdLm9mZnNldDsKLQotICAgICAgICAqb2Zmc2V0cyA9IG9mZnNldHNfaW50ZXJuYWw7Ci0gICAgICAgIGVycm9yICAgID0gRlRfRXJyX09rOwotCi0gICAgICBFeGl0OgotICAgICAgICBGVF9GUkVFKCByZWYgKTsKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2U7Ci0gIH0KLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICBHdWVzc2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgIFdoZW4geW91IGFkZCBhIG5ldyBndWVzc2luZyBmdW5jdGlvbiwgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgIHVwZGF0ZSBGVF9SQUNDRVNTX05fUlVMRVMgaW4gZnRyZm9yay5oLiAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpyYWNjZXNzX2d1ZXNzX2Z1bmMpKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2FwcGxlX2RvdWJsZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19hcHBsZV9zaW5nbGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX3Vmc19leHBvcnQoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19kYXJ3aW5fbmV3dmZzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19kYXJ3aW5faGZzcGx1cyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX3ZmYXQoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2NhcCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19saW51eF9kb3VibGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfbGludXhfbmV0YXRhbGsoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEhlbHBlciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19hcHBsZV9nZW5lcmljKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICBtYWdpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfbGludXhfZG91YmxlX2Zyb21fZmlsZV9uYW1lKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqICAgICAgZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBjaGFyICoKLSAgcmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKm9yaWdpbmFsX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppbnNlcnRpb24gKTsKLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUmFjY2Vzc19HdWVzcyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICBiYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKm5ld19uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICAqZXJyb3JzICkKLSAgewotICAgIEZUX0xvbmcgIGk7Ci0KLQotICAgIHJhY2Nlc3NfZ3Vlc3NfZnVuYyAgZnVuY3NbRlRfUkFDQ0VTU19OX1JVTEVTXSA9Ci0gICAgewotICAgICAgcmFjY2Vzc19ndWVzc19hcHBsZV9kb3VibGUsCi0gICAgICByYWNjZXNzX2d1ZXNzX2FwcGxlX3NpbmdsZSwKLSAgICAgIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX3Vmc19leHBvcnQsCi0gICAgICByYWNjZXNzX2d1ZXNzX2Rhcndpbl9uZXd2ZnMsCi0gICAgICByYWNjZXNzX2d1ZXNzX2Rhcndpbl9oZnNwbHVzLAotICAgICAgcmFjY2Vzc19ndWVzc192ZmF0LAotICAgICAgcmFjY2Vzc19ndWVzc19saW51eF9jYXAsCi0gICAgICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZSwKLSAgICAgIHJhY2Nlc3NfZ3Vlc3NfbGludXhfbmV0YXRhbGssCi0gICAgfTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfUkFDQ0VTU19OX1JVTEVTOyBpKysgKQotICAgIHsKLSAgICAgIG5ld19uYW1lc1tpXSA9IE5VTEw7Ci0gICAgICBpZiAoIE5VTEwgIT0gc3RyZWFtICkKLSAgICAgICAgZXJyb3JzW2ldID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgMCApOwotICAgICAgZWxzZQotICAgICAgICBlcnJvcnNbaV0gPSBGVF9FcnJfT2s7Ci0KLSAgICAgIGlmICggZXJyb3JzW2ldICkKLSAgICAgICAgY29udGludWUgOwotCi0gICAgICBlcnJvcnNbaV0gPSAoZnVuY3NbaV0pKCBsaWJyYXJ5LCBzdHJlYW0sIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobmV3X25hbWVzW2ldKSwgJihvZmZzZXRzW2ldKSApOwotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZG91YmxlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICBGVF9JbnQzMiAgbWFnaWMgPSAoIDB4MDAgPDwgMjQgfCAweDA1IDw8IDE2IHwgMHgxNiA8PCA4IHwgMHgwNyApOwotCi0KLSAgICAqcmVzdWx0X2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgaWYgKCBOVUxMID09IHN0cmVhbSApCi0gICAgICByZXR1cm4gRlRfRXJyX0Nhbm5vdF9PcGVuX1N0cmVhbTsKLQotICAgIHJldHVybiByYWNjZXNzX2d1ZXNzX2FwcGxlX2dlbmVyaWMoIGxpYnJhcnksIHN0cmVhbSwgYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnaWMsIHJlc3VsdF9vZmZzZXQgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfc2luZ2xlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICBGVF9JbnQzMiAgbWFnaWMgPSAoMHgwMCA8PCAyNCB8IDB4MDUgPDwgMTYgfCAweDE2IDw8IDggfCAweDAwKTsKLQotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBOVUxMOwotICAgIGlmICggTlVMTCA9PSBzdHJlYW0gKQotICAgICAgcmV0dXJuIEZUX0Vycl9DYW5ub3RfT3Blbl9TdHJlYW07Ci0KLSAgICByZXR1cm4gcmFjY2Vzc19ndWVzc19hcHBsZV9nZW5lcmljKCBsaWJyYXJ5LCBzdHJlYW0sIGJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ2ljLCByZXN1bHRfb2Zmc2V0ICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2Rhcndpbl91ZnNfZXhwb3J0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIGNoYXIqICAgICAgbmV3cGF0aDsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgbWVtb3J5ICA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBuZXdwYXRoID0gcmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSggbWVtb3J5LCBiYXNlX2ZpbGVfbmFtZSwgIi5fIiApOwotICAgIGlmICggIW5ld3BhdGggKQotICAgICAgcmV0dXJuIEZUX0Vycl9PdXRfT2ZfTWVtb3J5OwotCi0gICAgZXJyb3IgPSByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZV9mcm9tX2ZpbGVfbmFtZSggbGlicmFyeSwgbmV3cGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfb2Zmc2V0ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgKnJlc3VsdF9maWxlX25hbWUgPSBuZXdwYXRoOwotICAgIGVsc2UKLSAgICAgIEZUX0ZSRUUoIG5ld3BhdGggKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX2hmc3BsdXMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgLyoKLSAgICAgIE9ubHkgbWVhbmluZ2Z1bCBvbiBzeXN0ZW1zIHdpdGggaGZzKyBkcml2ZXJzIChvciBNYWNzKS4KLSAgICAgKi8KLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIGNoYXIqICAgICAgbmV3cGF0aDsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9Mb25nICAgIGJhc2VfZmlsZV9sZW4gPSBmdF9zdHJsZW4oIGJhc2VfZmlsZV9uYW1lICk7Ci0KLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBpZiAoIGJhc2VfZmlsZV9sZW4gKyA2ID4gRlRfSU5UX01BWCApCi0gICAgICByZXR1cm4gRlRfRXJyX0FycmF5X1Rvb19MYXJnZTsKLQotICAgIGlmICggRlRfQUxMT0MoIG5ld3BhdGgsIGJhc2VfZmlsZV9sZW4gKyA2ICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgRlRfTUVNX0NPUFkoIG5ld3BhdGgsIGJhc2VfZmlsZV9uYW1lLCBiYXNlX2ZpbGVfbGVuICk7Ci0gICAgRlRfTUVNX0NPUFkoIG5ld3BhdGggKyBiYXNlX2ZpbGVfbGVuLCAiL3JzcmMiLCA2ICk7Ci0KLSAgICAqcmVzdWx0X2ZpbGVfbmFtZSA9IG5ld3BhdGg7Ci0gICAgKnJlc3VsdF9vZmZzZXQgICAgPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX25ld3ZmcyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIC8qCi0gICAgICBPbmx5IG1lYW5pbmdmdWwgb24gc3lzdGVtcyB3aXRoIE1hYyBPUyBYICg+IDEwLjEpLgotICAgICAqLwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgY2hhciogICAgICBuZXdwYXRoOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX0xvbmcgICAgYmFzZV9maWxlX2xlbiA9IGZ0X3N0cmxlbiggYmFzZV9maWxlX25hbWUgKTsKLQotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIGlmICggYmFzZV9maWxlX2xlbiArIDE4ID4gRlRfSU5UX01BWCApCi0gICAgICByZXR1cm4gRlRfRXJyX0FycmF5X1Rvb19MYXJnZTsKLQotICAgIGlmICggRlRfQUxMT0MoIG5ld3BhdGgsIGJhc2VfZmlsZV9sZW4gKyAxOCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIEZUX01FTV9DT1BZKCBuZXdwYXRoLCBiYXNlX2ZpbGVfbmFtZSwgYmFzZV9maWxlX2xlbiApOwotICAgIEZUX01FTV9DT1BZKCBuZXdwYXRoICsgYmFzZV9maWxlX2xlbiwgIi8uLm5hbWVkZm9yay9yc3JjIiwgMTggKTsKLQotICAgICpyZXN1bHRfZmlsZV9uYW1lID0gbmV3cGF0aDsKLSAgICAqcmVzdWx0X29mZnNldCAgICA9IDA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc192ZmF0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgY2hhciogICAgICBuZXdwYXRoOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgbmV3cGF0aCA9IHJhY2Nlc3NfbWFrZV9maWxlX25hbWUoIG1lbW9yeSwgYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZS5mcmsvIiApOwotICAgIGlmICggIW5ld3BhdGggKQotICAgICAgcmV0dXJuIEZUX0Vycl9PdXRfT2ZfTWVtb3J5OwotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBuZXdwYXRoOwotICAgICpyZXN1bHRfb2Zmc2V0ICAgID0gMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2NhcCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgY2hhciogICAgICBuZXdwYXRoOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgbmV3cGF0aCA9IHJhY2Nlc3NfbWFrZV9maWxlX25hbWUoIG1lbW9yeSwgYmFzZV9maWxlX25hbWUsICIucmVzb3VyY2UvIiApOwotICAgIGlmICggIW5ld3BhdGggKQotICAgICAgcmV0dXJuIEZUX0Vycl9PdXRfT2ZfTWVtb3J5OwotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBuZXdwYXRoOwotICAgICpyZXN1bHRfb2Zmc2V0ICAgID0gMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgY2hhciogICAgICBuZXdwYXRoOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBuZXdwYXRoID0gcmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSggbWVtb3J5LCBiYXNlX2ZpbGVfbmFtZSwgIiUiICk7Ci0gICAgaWYgKCAhbmV3cGF0aCApCi0gICAgICByZXR1cm4gRlRfRXJyX091dF9PZl9NZW1vcnk7Ci0KLSAgICBlcnJvciA9IHJhY2Nlc3NfZ3Vlc3NfbGludXhfZG91YmxlX2Zyb21fZmlsZV9uYW1lKCBsaWJyYXJ5LCBuZXdwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9vZmZzZXQgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICAqcmVzdWx0X2ZpbGVfbmFtZSA9IG5ld3BhdGg7Ci0gICAgZWxzZQotICAgICAgRlRfRlJFRSggbmV3cGF0aCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19saW51eF9uZXRhdGFsayggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICBjaGFyKiAgICAgIG5ld3BhdGg7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIG5ld3BhdGggPSByYWNjZXNzX21ha2VfZmlsZV9uYW1lKCBtZW1vcnksIGJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLkFwcGxlRG91YmxlLyIgKTsKLSAgICBpZiAoICFuZXdwYXRoICkKLSAgICAgIHJldHVybiBGVF9FcnJfT3V0X09mX01lbW9yeTsKLQotICAgIGVycm9yID0gcmFjY2Vzc19ndWVzc19saW51eF9kb3VibGVfZnJvbV9maWxlX25hbWUoIGxpYnJhcnksIG5ld3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X29mZnNldCApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgICpyZXN1bHRfZmlsZV9uYW1lID0gbmV3cGF0aDsKLSAgICBlbHNlCi0gICAgICBGVF9GUkVFKCBuZXdwYXRoICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2FwcGxlX2dlbmVyaWMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgIG1hZ2ljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgRlRfSW50MzIgICBtYWdpY19mcm9tX3N0cmVhbTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX0ludDMyICAgdmVyc2lvbl9udW1iZXIgPSAwOwotICAgIEZUX1VTaG9ydCAgbl9vZl9lbnRyaWVzOwotCi0gICAgaW50ICAgICAgICBpOwotICAgIEZUX1VJbnQzMiAgZW50cnlfaWQsIGVudHJ5X29mZnNldCwgZW50cnlfbGVuZ3RoID0gMDsKLQotICAgIGNvbnN0IEZUX1VJbnQzMiAgcmVzb3VyY2VfZm9ya19lbnRyeV9pZCA9IDB4MjsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotICAgIEZUX1VOVVNFRCggYmFzZV9maWxlX25hbWUgKTsKLSAgICBGVF9VTlVTRUQoIHZlcnNpb25fbnVtYmVyICk7Ci0gICAgRlRfVU5VU0VEKCBlbnRyeV9sZW5ndGggICApOwotCi0KLSAgICBpZiAoIEZUX1JFQURfTE9ORyggbWFnaWNfZnJvbV9zdHJlYW0gKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgaWYgKCBtYWdpY19mcm9tX3N0cmVhbSAhPSBtYWdpYyApCi0gICAgICByZXR1cm4gRlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQ7Ci0KLSAgICBpZiAoIEZUX1JFQURfTE9ORyggdmVyc2lvbl9udW1iZXIgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBmaWxsZXIgKi8KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9Ta2lwKCBzdHJlYW0sIDE2ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBuX29mX2VudHJpZXMgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgaWYgKCBuX29mX2VudHJpZXMgPT0gMCApCi0gICAgICByZXR1cm4gRlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG5fb2ZfZW50cmllczsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX1JFQURfTE9ORyggZW50cnlfaWQgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIGlmICggZW50cnlfaWQgPT0gcmVzb3VyY2VfZm9ya19lbnRyeV9pZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfUkVBRF9MT05HKCBlbnRyeV9vZmZzZXQgKSB8fAotICAgICAgICAgICAgIEZUX1JFQURfTE9ORyggZW50cnlfbGVuZ3RoICkgKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAqcmVzdWx0X29mZnNldCA9IGVudHJ5X29mZnNldDsKLQotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBGVF9TdHJlYW1fU2tpcCggc3RyZWFtLCA0ICsgNCApOyAgICAvKiBvZmZzZXQgKyBsZW5ndGggKi8KLSAgICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfbGludXhfZG91YmxlX2Zyb21fZmlsZV9uYW1lKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICBGVF9PcGVuX0FyZ3MgIGFyZ3MyOwotICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtMjsKLSAgICBjaGFyICogICAgICAgIG5vdXNlID0gTlVMTDsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotCi0KLSAgICBhcmdzMi5mbGFncyAgICA9IEZUX09QRU5fUEFUSE5BTUU7Ci0gICAgYXJnczIucGF0aG5hbWUgPSBmaWxlX25hbWU7Ci0gICAgZXJyb3IgPSBGVF9TdHJlYW1fTmV3KCBsaWJyYXJ5LCAmYXJnczIsICZzdHJlYW0yICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBlcnJvciA9IHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZG91YmxlKCBsaWJyYXJ5LCBzdHJlYW0yLCBmaWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vdXNlLCByZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgICBGVF9TdHJlYW1fRnJlZSggc3RyZWFtMiwgMCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgY2hhcioKLSAgcmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKm9yaWdpbmFsX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICppbnNlcnRpb24gKQotICB7Ci0gICAgY2hhciogICAgICAgIG5ld19uYW1lOwotICAgIGNoYXIqICAgICAgICB0bXA7Ci0gICAgY29uc3QgY2hhciogIHNsYXNoOwotICAgIHVuc2lnbmVkICAgICBuZXdfbGVuZ3RoOwotICAgIEZUX0Vycm9yICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgbmV3X2xlbmd0aCA9IGZ0X3N0cmxlbiggb3JpZ2luYWxfbmFtZSApICsgZnRfc3RybGVuKCBpbnNlcnRpb24gKTsKLSAgICBpZiAoIEZUX0FMTE9DKCBuZXdfbmFtZSwgbmV3X2xlbmd0aCArIDEgKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIHRtcCA9IGZ0X3N0cnJjaHIoIG9yaWdpbmFsX25hbWUsICcvJyApOwotICAgIGlmICggdG1wICkKLSAgICB7Ci0gICAgICBmdF9zdHJuY3B5KCBuZXdfbmFtZSwgb3JpZ2luYWxfbmFtZSwgdG1wIC0gb3JpZ2luYWxfbmFtZSArIDEgKTsKLSAgICAgIG5ld19uYW1lW3RtcCAtIG9yaWdpbmFsX25hbWUgKyAxXSA9ICdcMCc7Ci0gICAgICBzbGFzaCA9IHRtcCArIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzbGFzaCAgICAgICA9IG9yaWdpbmFsX25hbWU7Ci0gICAgICBuZXdfbmFtZVswXSA9ICdcMCc7Ci0gICAgfQotCi0gICAgZnRfc3RyY2F0KCBuZXdfbmFtZSwgaW5zZXJ0aW9uICk7Ci0gICAgZnRfc3RyY2F0KCBuZXdfbmFtZSwgc2xhc2ggKTsKLQotICAgIHJldHVybiBuZXdfbmFtZTsKLSAgfQotCi0KLSNlbHNlICAgLyogIUZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgIER1bW15IGZ1bmN0aW9uOyBqdXN0IHNldHMgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9SYWNjZXNzX0d1ZXNzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqbmV3X25hbWVzLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciAgICplcnJvcnMgKQotICB7Ci0gICAgaW50ICBpOwotCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLSAgICBGVF9VTlVTRUQoIGJhc2VfbmFtZSApOwotCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IEZUX1JBQ0NFU1NfTl9SVUxFUzsgaSsrICkKLSAgICB7Ci0gICAgICBuZXdfbmFtZXNbaV0gPSBOVUxMOwotICAgICAgb2Zmc2V0c1tpXSAgID0gMDsKLSAgICAgIGVycm9yc1tpXSAgICA9IEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7Ci0gICAgfQotICB9Ci0KLQotI2VuZGlmICAvKiAhRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRzdHJlYW0uYyBiL3NyYy9iYXNlL2Z0c3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OWU0NmMuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRzdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDg0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN0cmVhbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSS9PIHN0cmVhbSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOCBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3N0cmVhbQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIHNpemUgKQotICB7Ci0gICAgc3RyZWFtLT5iYXNlICAgPSAoRlRfQnl0ZSopIGJhc2U7Ci0gICAgc3RyZWFtLT5zaXplICAgPSBzaXplOwotICAgIHN0cmVhbS0+cG9zICAgID0gMDsKLSAgICBzdHJlYW0tPmN1cnNvciA9IDA7Ci0gICAgc3RyZWFtLT5yZWFkICAgPSAwOwotICAgIHN0cmVhbS0+Y2xvc2UgID0gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9TdHJlYW1fQ2xvc2UoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIGlmICggc3RyZWFtICYmIHN0cmVhbS0+Y2xvc2UgKQotICAgICAgc3RyZWFtLT5jbG9zZSggc3RyZWFtICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9TZWVrKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgcG9zICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgc3RyZWFtLT5wb3MgPSBwb3M7Ci0KLSAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgcG9zLCAwLCAwICkgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fU2VlazogaW52YWxpZCBpL287IHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICAgICAgcG9zLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOwotICAgICAgfQotICAgIH0KLSAgICAvKiBub3RlIHRoYXQgc2Vla2luZyB0byB0aGUgZmlyc3QgcG9zaXRpb24gYWZ0ZXIgdGhlIGZpbGUgaXMgdmFsaWQgKi8KLSAgICBlbHNlIGlmICggcG9zID4gc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fU2VlazogaW52YWxpZCBpL287IHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICAgIHBvcywgc3RyZWFtLT5zaXplICkpOwotCi0gICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fU2tpcCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGRpc3RhbmNlICkKLSAgewotICAgIGlmICggZGlzdGFuY2UgPCAwICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOwotCi0gICAgcmV0dXJuIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZykoIHN0cmVhbS0+cG9zICsgZGlzdGFuY2UgKSApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfTG9uZyApCi0gIEZUX1N0cmVhbV9Qb3MoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIHJldHVybiBzdHJlYW0tPnBvczsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1JlYWQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICkKLSAgewotICAgIHJldHVybiBGVF9TdHJlYW1fUmVhZEF0KCBzdHJlYW0sIHN0cmVhbS0+cG9zLCBidWZmZXIsIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcywKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1VMb25nICByZWFkX2J5dGVzOwotCi0KLSAgICBpZiAoIHBvcyA+PSBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9SZWFkQXQ6IGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgICBwb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247Ci0gICAgfQotCi0gICAgaWYgKCBzdHJlYW0tPnJlYWQgKQotICAgICAgcmVhZF9ieXRlcyA9IHN0cmVhbS0+cmVhZCggc3RyZWFtLCBwb3MsIGJ1ZmZlciwgY291bnQgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVhZF9ieXRlcyA9IHN0cmVhbS0+c2l6ZSAtIHBvczsKLSAgICAgIGlmICggcmVhZF9ieXRlcyA+IGNvdW50ICkKLSAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50OwotCi0gICAgICBGVF9NRU1fQ09QWSggYnVmZmVyLCBzdHJlYW0tPmJhc2UgKyBwb3MsIHJlYWRfYnl0ZXMgKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0tPnBvcyA9IHBvcyArIHJlYWRfYnl0ZXM7Ci0KLSAgICBpZiAoIHJlYWRfYnl0ZXMgPCBjb3VudCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1JlYWRBdDoiICkpOwotICAgICAgRlRfRVJST1IoKCAiIGludmFsaWQgcmVhZDsgZXhwZWN0ZWQgJWx1IGJ5dGVzLCBnb3QgJWx1XG4iLAotICAgICAgICAgICAgICAgICBjb3VudCwgcmVhZF9ieXRlcyApKTsKLQotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1RyeVJlYWQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICkKLSAgewotICAgIEZUX1VMb25nICByZWFkX2J5dGVzID0gMDsKLQotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyA+PSBzdHJlYW0tPnNpemUgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBzdHJlYW0tPnJlYWQgKQotICAgICAgcmVhZF9ieXRlcyA9IHN0cmVhbS0+cmVhZCggc3RyZWFtLCBzdHJlYW0tPnBvcywgYnVmZmVyLCBjb3VudCApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWFkX2J5dGVzID0gc3RyZWFtLT5zaXplIC0gc3RyZWFtLT5wb3M7Ci0gICAgICBpZiAoIHJlYWRfYnl0ZXMgPiBjb3VudCApCi0gICAgICAgIHJlYWRfYnl0ZXMgPSBjb3VudDsKLQotICAgICAgRlRfTUVNX0NPUFkoIGJ1ZmZlciwgc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3MsIHJlYWRfYnl0ZXMgKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0tPnBvcyArPSByZWFkX2J5dGVzOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHJlYWRfYnl0ZXM7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gRlRfU3RyZWFtX0VudGVyRnJhbWUoIHN0cmVhbSwgY291bnQgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgKnBieXRlcyA9IChGVF9CeXRlKilzdHJlYW0tPmN1cnNvcjsKLQotICAgICAgLyogZXF1aXZhbGVudCB0byBGVF9TdHJlYW1fRXhpdEZyYW1lKCksIHdpdGggbm8gbWVtb3J5IGJsb2NrIHJlbGVhc2UgKi8KLSAgICAgIHN0cmVhbS0+Y3Vyc29yID0gMDsKLSAgICAgIHN0cmVhbS0+bGltaXQgID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICkKLSAgewotICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgICBmdF9tZW1fZnJlZSggbWVtb3J5LCAqcGJ5dGVzICk7Ci0gICAgICAqcGJ5dGVzID0gTlVMTDsKLSNlbHNlCi0gICAgICBGVF9GUkVFKCAqcGJ5dGVzICk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgKnBieXRlcyA9IDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9FbnRlckZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1VMb25nICByZWFkX2J5dGVzOwotCi0KLSAgICAvKiBjaGVjayBmb3IgbmVzdGVkIGZyYW1lIGFjY2VzcyAqLwotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yID09IDAgKTsKLQotICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICB7Ci0gICAgICAvKiBhbGxvY2F0ZSB0aGUgZnJhbWUgaW4gbWVtb3J5ICovCi0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgICAvKiBhc3N1bWUgX2Z0X2RlYnVnX2ZpbGUgYW5kIF9mdF9kZWJ1Z19saW5lbm8gYXJlIGFscmVhZHkgc2V0ICovCi0gICAgICBzdHJlYW0tPmJhc2UgPSAodW5zaWduZWQgY2hhciopZnRfbWVtX3FhbGxvYyggbWVtb3J5LCBjb3VudCwgJmVycm9yICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotI2Vsc2UKLSAgICAgIGlmICggRlRfUUFMTE9DKCBzdHJlYW0tPmJhc2UsIGNvdW50ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0jZW5kaWYKLSAgICAgIC8qIHJlYWQgaXQgKi8KLSAgICAgIHJlYWRfYnl0ZXMgPSBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmJhc2UsIGNvdW50ICk7Ci0gICAgICBpZiAoIHJlYWRfYnl0ZXMgPCBjb3VudCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9FbnRlckZyYW1lOiIgKSk7Ci0gICAgICAgIEZUX0VSUk9SKCggIiBpbnZhbGlkIHJlYWQ7IGV4cGVjdGVkICVsdSBieXRlcywgZ290ICVsdVxuIiwKLSAgICAgICAgICAgICAgICAgICBjb3VudCwgcmVhZF9ieXRlcyApKTsKLQotICAgICAgICBGVF9GUkVFKCBzdHJlYW0tPmJhc2UgKTsKLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOwotICAgICAgfQotICAgICAgc3RyZWFtLT5jdXJzb3IgPSBzdHJlYW0tPmJhc2U7Ci0gICAgICBzdHJlYW0tPmxpbWl0ICA9IHN0cmVhbS0+Y3Vyc29yICsgY291bnQ7Ci0gICAgICBzdHJlYW0tPnBvcyAgICs9IHJlYWRfYnl0ZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBjaGVjayBjdXJyZW50IGFuZCBuZXcgcG9zaXRpb24gKi8KLSAgICAgIGlmICggc3RyZWFtLT5wb3MgPj0gc3RyZWFtLT5zaXplICAgICAgICB8fAotICAgICAgICAgICBzdHJlYW0tPnBvcyArIGNvdW50ID4gc3RyZWFtLT5zaXplICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX0VudGVyRnJhbWU6IiApKTsKLSAgICAgICAgRlRfRVJST1IoKCAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgY291bnQgPSAlbHUsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnBvcywgY291bnQsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyogc2V0IGN1cnNvciAqLwotICAgICAgc3RyZWFtLT5jdXJzb3IgPSBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKLSAgICAgIHN0cmVhbS0+bGltaXQgID0gc3RyZWFtLT5jdXJzb3IgKyBjb3VudDsKLSAgICAgIHN0cmVhbS0+cG9zICAgKz0gY291bnQ7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1N0cmVhbV9FeGl0RnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIC8qIElNUE9SVEFOVDogVGhlIGFzc2VydGlvbiBzdHJlYW0tPmN1cnNvciAhPSAwIHdhcyByZW1vdmVkLCBnaXZlbiAgICAqLwotICAgIC8qICAgICAgICAgICAgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MgYSBmcmFtZSBvZiBsZW5ndGggMCBpbiAgICAqLwotICAgIC8qICAgICAgICAgICAgc29tZSB3ZWlyZCBmb250cyAodXN1YWxseSwgd2hlbiBhY2Nlc3NpbmcgYW4gYXJyYXkgb2YgICAqLwotICAgIC8qICAgICAgICAgICAgMCByZWNvcmRzLCBsaWtlIGluIHNvbWUgc3RyYW5nZSBrZXJuIHRhYmxlcykuICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICBJbiB0aGlzIGNhc2UsIHRoZSBsb2FkZXIgY29kZSBoYW5kbGVzIHRoZSAwLWxlbmd0aCB0YWJsZSAgICAgICAgICAqLwotICAgIC8qICBncmFjZWZ1bGx5OyBob3dldmVyLCBzdHJlYW0uY3Vyc29yIGlzIHJlYWxseSBzZXQgdG8gMCBieSB0aGUgICAgICAqLwotICAgIC8qICBGVF9TdHJlYW1fRW50ZXJGcmFtZSgpIGNhbGwsIGFuZCB0aGlzIGlzIG5vdCBhbiBlcnJvci4gICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0FTU0VSVCggc3RyZWFtICk7Ci0KLSAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotICAgICAgZnRfbWVtX2ZyZWUoIG1lbW9yeSwgc3RyZWFtLT5iYXNlICk7Ci0gICAgICBzdHJlYW0tPmJhc2UgPSBOVUxMOwotI2Vsc2UKLSAgICAgIEZUX0ZSRUUoIHN0cmVhbS0+YmFzZSApOwotI2VuZGlmCi0gICAgfQotICAgIHN0cmVhbS0+Y3Vyc29yID0gMDsKLSAgICBzdHJlYW0tPmxpbWl0ICA9IDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9DaGFyICkKLSAgRlRfU3RyZWFtX0dldENoYXIoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0NoYXIgIHJlc3VsdDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gJiYgc3RyZWFtLT5jdXJzb3IgKTsKLQotICAgIHJlc3VsdCA9IDA7Ci0gICAgaWYgKCBzdHJlYW0tPmN1cnNvciA8IHN0cmVhbS0+bGltaXQgKQotICAgICAgcmVzdWx0ID0gKnN0cmVhbS0+Y3Vyc29yKys7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfU2hvcnQgKQotICBGVF9TdHJlYW1fR2V0U2hvcnQoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1Nob3J0ICByZXN1bHQ7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7Ci0KLSAgICByZXN1bHQgICAgICAgICA9IDA7Ci0gICAgcCAgICAgICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBpZiAoIHAgKyAxIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgICAgICAgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBwOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1Nob3J0ICkKLSAgRlRfU3RyZWFtX0dldFNob3J0TEUoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1Nob3J0ICByZXN1bHQ7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7Ci0KLSAgICByZXN1bHQgICAgICAgICA9IDA7Ci0gICAgcCAgICAgICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBpZiAoIHAgKyAxIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgICAgICAgPSBGVF9ORVhUX1NIT1JUX0xFKCBwICk7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBwOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0xvbmcgKQotICBGVF9TdHJlYW1fR2V0T2Zmc2V0KCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9Mb25nICAgcmVzdWx0OwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOwotCi0gICAgcmVzdWx0ICAgICAgICAgPSAwOwotICAgIHAgICAgICAgICAgICAgID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgaWYgKCBwICsgMiA8IHN0cmVhbS0+bGltaXQgKQotICAgICAgcmVzdWx0ICAgICAgID0gRlRfTkVYVF9PRkYzKCBwICk7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Mb25nICkKLSAgRlRfU3RyZWFtX0dldExvbmcoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX0xvbmcgICByZXN1bHQ7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7Ci0KLSAgICByZXN1bHQgICAgICAgICA9IDA7Ci0gICAgcCAgICAgICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBpZiAoIHAgKyAzIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgICAgICAgPSBGVF9ORVhUX0xPTkcoIHAgKTsKLSAgICBzdHJlYW0tPmN1cnNvciA9IHA7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0xvbmcgKQotICBGVF9TdHJlYW1fR2V0TG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9Mb25nICAgcmVzdWx0OwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOwotCi0gICAgcmVzdWx0ICAgICAgICAgPSAwOwotICAgIHAgICAgICAgICAgICAgID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgaWYgKCBwICsgMyA8IHN0cmVhbS0+bGltaXQgKQotICAgICAgcmVzdWx0ICAgICAgID0gRlRfTkVYVF9MT05HX0xFKCBwICk7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9DaGFyICkKLSAgRlRfU3RyZWFtX1JlYWRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKLSAgewotICAgIEZUX0J5dGUgIHJlc3VsdCA9IDA7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICk7Ci0KLSAgICAqZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsICZyZXN1bHQsIDFMICkgIT0gMUwgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cG9zIDwgc3RyZWFtLT5zaXplICkKLSAgICAgICAgcmVzdWx0ID0gc3RyZWFtLT5iYXNlW3N0cmVhbS0+cG9zXTsKLSAgICAgIGVsc2UKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLSAgICBzdHJlYW0tPnBvcysrOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBGYWlsOgotICAgICplcnJvciA9IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247Ci0gICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1JlYWRDaGFyOiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1Nob3J0ICkKLSAgRlRfU3RyZWFtX1JlYWRTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQotICB7Ci0gICAgRlRfQnl0ZSAgIHJlYWRzWzJdOwotICAgIEZUX0J5dGUqICBwID0gMDsKLSAgICBGVF9TaG9ydCAgcmVzdWx0ID0gMDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKLQotICAgICplcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGlmICggc3RyZWFtLT5wb3MgKyAxIDwgc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLCByZWFkcywgMkwgKSAhPSAyTCApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHAgPSByZWFkczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotICAgICAgfQotCi0gICAgICBpZiAoIHAgKQotICAgICAgICByZXN1bHQgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIHN0cmVhbS0+cG9zICs9IDI7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIEZhaWw6Ci0gICAgKmVycm9yID0gRlRfRXJyX0ludmFsaWRfU3RyZWFtX09wZXJhdGlvbjsKLSAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZFNob3J0OiIgKSk7Ci0gICAgRlRfRVJST1IoKCAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfU2hvcnQgKQotICBGVF9TdHJlYW1fUmVhZFNob3J0TEUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQotICB7Ci0gICAgRlRfQnl0ZSAgIHJlYWRzWzJdOwotICAgIEZUX0J5dGUqICBwID0gMDsKLSAgICBGVF9TaG9ydCAgcmVzdWx0ID0gMDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKLQotICAgICplcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGlmICggc3RyZWFtLT5wb3MgKyAxIDwgc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLCByZWFkcywgMkwgKSAhPSAyTCApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHAgPSByZWFkczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotICAgICAgfQotCi0gICAgICBpZiAoIHAgKQotICAgICAgICByZXN1bHQgPSBGVF9ORVhUX1NIT1JUX0xFKCBwICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIHN0cmVhbS0+cG9zICs9IDI7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIEZhaWw6Ci0gICAgKmVycm9yID0gRlRfRXJyX0ludmFsaWRfU3RyZWFtX09wZXJhdGlvbjsKLSAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZFNob3J0TEU6IiApKTsKLSAgICBGVF9FUlJPUigoICIgaW52YWxpZCBpL287IHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICBzdHJlYW0tPnBvcywgc3RyZWFtLT5zaXplICkpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Mb25nICkKLSAgRlRfU3RyZWFtX1JlYWRPZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApCi0gIHsKLSAgICBGVF9CeXRlICAgcmVhZHNbM107Ci0gICAgRlRfQnl0ZSogIHAgPSAwOwotICAgIEZUX0xvbmcgICByZXN1bHQgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwotCi0gICAgKmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyArIDIgPCBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKHN0cmVhbS0+cmVhZCggc3RyZWFtLCBzdHJlYW0tPnBvcywgcmVhZHMsIDNMICkgIT0gM0wgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBwID0gcmVhZHM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHAgPSBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKLSAgICAgIH0KLQotICAgICAgaWYgKCBwICkKLSAgICAgICAgcmVzdWx0ID0gRlRfTkVYVF9PRkYzKCBwICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIHN0cmVhbS0+cG9zICs9IDM7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIEZhaWw6Ci0gICAgKmVycm9yID0gRlRfRXJyX0ludmFsaWRfU3RyZWFtX09wZXJhdGlvbjsKLSAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZE9mZnNldDoiICkpOwotICAgIEZUX0VSUk9SKCggIiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0xvbmcgKQotICBGVF9TdHJlYW1fUmVhZExvbmcoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQotICB7Ci0gICAgRlRfQnl0ZSAgIHJlYWRzWzRdOwotICAgIEZUX0J5dGUqICBwID0gMDsKLSAgICBGVF9Mb25nICAgcmVzdWx0ID0gMDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKLQotICAgICplcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGlmICggc3RyZWFtLT5wb3MgKyAzIDwgc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLCByZWFkcywgNEwgKSAhPSA0TCApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHAgPSByZWFkczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotICAgICAgfQotCi0gICAgICBpZiAoIHAgKQotICAgICAgICByZXN1bHQgPSBGVF9ORVhUX0xPTkcoIHAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZ290byBGYWlsOwotCi0gICAgc3RyZWFtLT5wb3MgKz0gNDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgRmFpbDoKLSAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZExvbmc6IGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIHN0cmVhbS0+c2l6ZSApKTsKLSAgICAqZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Mb25nICkKLSAgRlRfU3RyZWFtX1JlYWRMb25nTEUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApCi0gIHsKLSAgICBGVF9CeXRlICAgcmVhZHNbNF07Ci0gICAgRlRfQnl0ZSogIHAgPSAwOwotICAgIEZUX0xvbmcgICByZXN1bHQgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwotCi0gICAgKmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyArIDMgPCBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIHJlYWRzLCA0TCApICE9IDRMICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcCA9IHJlYWRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcCApCi0gICAgICAgIHJlc3VsdCA9IEZUX05FWFRfTE9OR19MRSggcCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBzdHJlYW0tPnBvcyArPSA0OwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBGYWlsOgotICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9SZWFkTG9uZ0xFOiIgKSk7Ci0gICAgRlRfRVJST1IoKCAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIHN0cmVhbS0+c2l6ZSApKTsKLSAgICAqZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkRmllbGRzKCBGVF9TdHJlYW0gICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkKiAgZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX0Jvb2wgICBmcmFtZV9hY2Nlc3NlZCA9IDA7Ci0gICAgRlRfQnl0ZSogIGN1cnNvciA9IHN0cmVhbS0+Y3Vyc29yOwotCi0KLSAgICBpZiAoICFmaWVsZHMgfHwgIXN0cmVhbSApCi0gICAgICByZXR1cm4gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBkbwotICAgIHsKLSAgICAgIEZUX1VMb25nICB2YWx1ZTsKLSAgICAgIEZUX0ludCAgICBzaWduX3NoaWZ0OwotICAgICAgRlRfQnl0ZSogIHA7Ci0KLQotICAgICAgc3dpdGNoICggZmllbGRzLT52YWx1ZSApCi0gICAgICB7Ci0gICAgICBjYXNlIGZ0X2ZyYW1lX3N0YXJ0OiAgLyogYWNjZXNzIGEgbmV3IGZyYW1lICovCi0gICAgICAgIGVycm9yID0gRlRfU3RyZWFtX0VudGVyRnJhbWUoIHN0cmVhbSwgZmllbGRzLT5vZmZzZXQgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGZyYW1lX2FjY2Vzc2VkID0gMTsKLSAgICAgICAgY3Vyc29yICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICAgICAgZmllbGRzKys7Ci0gICAgICAgIGNvbnRpbnVlOyAgLyogbG9vcCEgKi8KLQotICAgICAgY2FzZSBmdF9mcmFtZV9ieXRlczogIC8qIHJlYWQgYSBieXRlIHNlcXVlbmNlICovCi0gICAgICBjYXNlIGZ0X2ZyYW1lX3NraXA6ICAgLyogc2tpcCBzb21lIGJ5dGVzICAgICAgKi8KLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIGxlbiA9IGZpZWxkcy0+c2l6ZTsKLQotCi0gICAgICAgICAgaWYgKCBjdXJzb3IgKyBsZW4gPiBzdHJlYW0tPmxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9PcGVyYXRpb247Ci0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBmaWVsZHMtPnZhbHVlID09IGZ0X2ZyYW1lX2J5dGVzICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwID0gKEZUX0J5dGUqKXN0cnVjdHVyZSArIGZpZWxkcy0+b2Zmc2V0OwotICAgICAgICAgICAgRlRfTUVNX0NPUFkoIHAsIGN1cnNvciwgbGVuICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGN1cnNvciArPSBsZW47Ci0gICAgICAgICAgZmllbGRzKys7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgY2FzZSBmdF9mcmFtZV9ieXRlOgotICAgICAgY2FzZSBmdF9mcmFtZV9zY2hhcjogIC8qIHJlYWQgYSBzaW5nbGUgYnl0ZSAqLwotICAgICAgICB2YWx1ZSA9IEZUX05FWFRfQllURShjdXJzb3IpOwotICAgICAgICBzaWduX3NoaWZ0ID0gMjQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGZ0X2ZyYW1lX3Nob3J0X2JlOgotICAgICAgY2FzZSBmdF9mcmFtZV91c2hvcnRfYmU6ICAvKiByZWFkIGEgMi1ieXRlIGJpZy1lbmRpYW4gc2hvcnQgKi8KLSAgICAgICAgdmFsdWUgPSBGVF9ORVhUX1VTSE9SVChjdXJzb3IpOwotICAgICAgICBzaWduX3NoaWZ0ID0gMTY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGZ0X2ZyYW1lX3Nob3J0X2xlOgotICAgICAgY2FzZSBmdF9mcmFtZV91c2hvcnRfbGU6ICAvKiByZWFkIGEgMi1ieXRlIGxpdHRsZS1lbmRpYW4gc2hvcnQgKi8KLSAgICAgICAgdmFsdWUgPSBGVF9ORVhUX1VTSE9SVF9MRShjdXJzb3IpOwotICAgICAgICBzaWduX3NoaWZ0ID0gMTY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGZ0X2ZyYW1lX2xvbmdfYmU6Ci0gICAgICBjYXNlIGZ0X2ZyYW1lX3Vsb25nX2JlOiAgLyogcmVhZCBhIDQtYnl0ZSBiaWctZW5kaWFuIGxvbmcgKi8KLSAgICAgICAgdmFsdWUgPSBGVF9ORVhUX1VMT05HKGN1cnNvcik7Ci0gICAgICAgIHNpZ25fc2hpZnQgPSAwOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBmdF9mcmFtZV9sb25nX2xlOgotICAgICAgY2FzZSBmdF9mcmFtZV91bG9uZ19sZTogIC8qIHJlYWQgYSA0LWJ5dGUgbGl0dGxlLWVuZGlhbiBsb25nICovCi0gICAgICAgIHZhbHVlID0gRlRfTkVYVF9VTE9OR19MRShjdXJzb3IpOwotICAgICAgICBzaWduX3NoaWZ0ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgZnRfZnJhbWVfb2ZmM19iZToKLSAgICAgIGNhc2UgZnRfZnJhbWVfdW9mZjNfYmU6ICAvKiByZWFkIGEgMy1ieXRlIGJpZy1lbmRpYW4gbG9uZyAqLwotICAgICAgICB2YWx1ZSA9IEZUX05FWFRfVU9GRjMoY3Vyc29yKTsKLSAgICAgICAgc2lnbl9zaGlmdCA9IDg7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGZ0X2ZyYW1lX29mZjNfbGU6Ci0gICAgICBjYXNlIGZ0X2ZyYW1lX3VvZmYzX2xlOiAgLyogcmVhZCBhIDMtYnl0ZSBsaXR0bGUtZW5kaWFuIGxvbmcgKi8KLSAgICAgICAgdmFsdWUgPSBGVF9ORVhUX1VPRkYzX0xFKGN1cnNvcik7Ci0gICAgICAgIHNpZ25fc2hpZnQgPSA4OwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLyogb3RoZXJ3aXNlLCBleGl0IHRoZSBsb29wICovCi0gICAgICAgIHN0cmVhbS0+Y3Vyc29yID0gY3Vyc29yOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdywgY29tcHV0ZSB0aGUgc2lnbmVkIHZhbHVlIGlzIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKCBmaWVsZHMtPnZhbHVlICYgRlRfRlJBTUVfT1BfU0lHTkVEICkKLSAgICAgICAgdmFsdWUgPSAoRlRfVUxvbmcpKCAoRlRfSW50MzIpKCB2YWx1ZSA8PCBzaWduX3NoaWZ0ICkgPj4gc2lnbl9zaGlmdCApOwotCi0gICAgICAvKiBmaW5hbGx5LCBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCAqLwotCi0gICAgICBwID0gKEZUX0J5dGUqKXN0cnVjdHVyZSArIGZpZWxkcy0+b2Zmc2V0OwotICAgICAgc3dpdGNoICggZmllbGRzLT5zaXplICkKLSAgICAgIHsKLSAgICAgIGNhc2UgKDggLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICooRlRfQnl0ZSopcCA9IChGVF9CeXRlKXZhbHVlOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAoMTYgLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICooRlRfVVNob3J0KilwID0gKEZUX1VTaG9ydCl2YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgKDMyIC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAqKEZUX1VJbnQzMiopcCA9IChGVF9VSW50MzIpdmFsdWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OiAgLyogZm9yIDY0LWJpdCBzeXN0ZW1zICovCi0gICAgICAgICooRlRfVUxvbmcqKXAgPSAoRlRfVUxvbmcpdmFsdWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGdvIHRvIG5leHQgZmllbGQgKi8KLSAgICAgIGZpZWxkcysrOwotICAgIH0KLSAgICB3aGlsZSAoIDEgKTsKLQotICBFeGl0OgotICAgIC8qIGNsb3NlIHRoZSBmcmFtZSBpZiBpdCB3YXMgb3BlbmVkIGJ5IHRoaXMgcmVhZCAqLwotICAgIGlmICggZnJhbWVfYWNjZXNzZWQgKQotICAgICAgRlRfU3RyZWFtX0V4aXRGcmFtZSggc3RyZWFtICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0c3Ryb2tlLmMgYi9zcmMvYmFzZS9mdHN0cm9rZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGZlZThiLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0c3Ryb2tlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3Ryb2tlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBwYXRoIHN0cm9rZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOCBieSAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9TVFJPS0VSX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1N0cm9rZXJCb3JkZXIgKQotICBGVF9PdXRsaW5lX0dldEluc2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgRlRfT3JpZW50YXRpb24gIG8gPSBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiggb3V0bGluZSApOwotCi0KLSAgICByZXR1cm4gbyA9PSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSA/IEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9TVFJPS0VSX0JPUkRFUl9MRUZUIDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfU3Ryb2tlckJvcmRlciApCi0gIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgRlRfT3JpZW50YXRpb24gIG8gPSBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiggb3V0bGluZSApOwotCi0KLSAgICByZXR1cm4gbyA9PSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSA/IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUIDsKLSAgfQotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIEJFWklFUiBDT01QVVRBVElPTlMgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEZUX1NNQUxMX0NPTklDX1RIUkVTSE9MRCAgKCBGVF9BTkdMRV9QSSAvIDYgKQotI2RlZmluZSBGVF9TTUFMTF9DVUJJQ19USFJFU0hPTEQgICggRlRfQU5HTEVfUEkgLyA2ICkKLSNkZWZpbmUgRlRfRVBTSUxPTiAgMgotCi0jZGVmaW5lIEZUX0lTX1NNQUxMKCB4ICkgICggKHgpID4gLUZUX0VQU0lMT04gJiYgKHgpIDwgRlRfRVBTSUxPTiApCi0KLQotICBzdGF0aWMgRlRfUG9zCi0gIGZ0X3Bvc19hYnMoIEZUX1BvcyAgeCApCi0gIHsKLSAgICByZXR1cm4geCA+PSAwID8geCA6IC14IDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfY29uaWNfc3BsaXQoIEZUX1ZlY3RvciogIGJhc2UgKQotICB7Ci0gICAgRlRfUG9zICBhLCBiOwotCi0KLSAgICBiYXNlWzRdLnggPSBiYXNlWzJdLng7Ci0gICAgYiA9IGJhc2VbMV0ueDsKLSAgICBhID0gYmFzZVszXS54ID0gKCBiYXNlWzJdLnggKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnggPSAoIGJhc2VbMF0ueCArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS54ID0gKCBhICsgYiApIC8gMjsKLQotICAgIGJhc2VbNF0ueSA9IGJhc2VbMl0ueTsKLSAgICBiID0gYmFzZVsxXS55OwotICAgIGEgPSBiYXNlWzNdLnkgPSAoIGJhc2VbMl0ueSArIGIgKSAvIDI7Ci0gICAgYiA9IGJhc2VbMV0ueSA9ICggYmFzZVswXS55ICsgYiApIC8gMjsKLSAgICBiYXNlWzJdLnkgPSAoIGEgKyBiICkgLyAyOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBmdF9jb25pY19pc19zbWFsbF9lbm91Z2goIEZUX1ZlY3RvciogIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAqYW5nbGVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAqYW5nbGVfb3V0ICkKLSAgewotICAgIEZUX1ZlY3RvciAgZDEsIGQyOwotICAgIEZUX0FuZ2xlICAgdGhldGE7Ci0gICAgRlRfSW50ICAgICBjbG9zZTEsIGNsb3NlMjsKLQotCi0gICAgZDEueCA9IGJhc2VbMV0ueCAtIGJhc2VbMl0ueDsKLSAgICBkMS55ID0gYmFzZVsxXS55IC0gYmFzZVsyXS55OwotICAgIGQyLnggPSBiYXNlWzBdLnggLSBiYXNlWzFdLng7Ci0gICAgZDIueSA9IGJhc2VbMF0ueSAtIGJhc2VbMV0ueTsKLQotICAgIGNsb3NlMSA9IEZUX0lTX1NNQUxMKCBkMS54ICkgJiYgRlRfSVNfU01BTEwoIGQxLnkgKTsKLSAgICBjbG9zZTIgPSBGVF9JU19TTUFMTCggZDIueCApICYmIEZUX0lTX1NNQUxMKCBkMi55ICk7Ci0KLSAgICBpZiAoIGNsb3NlMSApCi0gICAgewotICAgICAgaWYgKCBjbG9zZTIgKQotICAgICAgICAqYW5nbGVfaW4gPSAqYW5nbGVfb3V0ID0gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgKmFuZ2xlX2luID0gKmFuZ2xlX291dCA9IEZUX0F0YW4yKCBkMi54LCBkMi55ICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBjbG9zZTIgKQotICAgIHsKLSAgICAgICphbmdsZV9pbiA9ICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDEueCwgZDEueSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgKmFuZ2xlX2luICA9IEZUX0F0YW4yKCBkMS54LCBkMS55ICk7Ci0gICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQyLngsIGQyLnkgKTsKLSAgICB9Ci0KLSAgICB0aGV0YSA9IGZ0X3Bvc19hYnMoIEZUX0FuZ2xlX0RpZmYoICphbmdsZV9pbiwgKmFuZ2xlX291dCApICk7Ci0KLSAgICByZXR1cm4gRlRfQk9PTCggdGhldGEgPCBGVF9TTUFMTF9DT05JQ19USFJFU0hPTEQgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfY3ViaWNfc3BsaXQoIEZUX1ZlY3RvciogIGJhc2UgKQotICB7Ci0gICAgRlRfUG9zICBhLCBiLCBjLCBkOwotCi0KLSAgICBiYXNlWzZdLnggPSBiYXNlWzNdLng7Ci0gICAgYyA9IGJhc2VbMV0ueDsKLSAgICBkID0gYmFzZVsyXS54OwotICAgIGJhc2VbMV0ueCA9IGEgPSAoIGJhc2VbMF0ueCArIGMgKSAvIDI7Ci0gICAgYmFzZVs1XS54ID0gYiA9ICggYmFzZVszXS54ICsgZCApIC8gMjsKLSAgICBjID0gKCBjICsgZCApIC8gMjsKLSAgICBiYXNlWzJdLnggPSBhID0gKCBhICsgYyApIC8gMjsKLSAgICBiYXNlWzRdLnggPSBiID0gKCBiICsgYyApIC8gMjsKLSAgICBiYXNlWzNdLnggPSAoIGEgKyBiICkgLyAyOwotCi0gICAgYmFzZVs2XS55ID0gYmFzZVszXS55OwotICAgIGMgPSBiYXNlWzFdLnk7Ci0gICAgZCA9IGJhc2VbMl0ueTsKLSAgICBiYXNlWzFdLnkgPSBhID0gKCBiYXNlWzBdLnkgKyBjICkgLyAyOwotICAgIGJhc2VbNV0ueSA9IGIgPSAoIGJhc2VbM10ueSArIGQgKSAvIDI7Ci0gICAgYyA9ICggYyArIGQgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gYSA9ICggYSArIGMgKSAvIDI7Ci0gICAgYmFzZVs0XS55ID0gYiA9ICggYiArIGMgKSAvIDI7Ci0gICAgYmFzZVszXS55ID0gKCBhICsgYiApIC8gMjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgZnRfY3ViaWNfaXNfc21hbGxfZW5vdWdoKCBGVF9WZWN0b3IqICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgKmFuZ2xlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgKmFuZ2xlX21pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICphbmdsZV9vdXQgKQotICB7Ci0gICAgRlRfVmVjdG9yICBkMSwgZDIsIGQzOwotICAgIEZUX0FuZ2xlICAgdGhldGExLCB0aGV0YTI7Ci0gICAgRlRfSW50ICAgICBjbG9zZTEsIGNsb3NlMiwgY2xvc2UzOwotCi0KLSAgICBkMS54ID0gYmFzZVsyXS54IC0gYmFzZVszXS54OwotICAgIGQxLnkgPSBiYXNlWzJdLnkgLSBiYXNlWzNdLnk7Ci0gICAgZDIueCA9IGJhc2VbMV0ueCAtIGJhc2VbMl0ueDsKLSAgICBkMi55ID0gYmFzZVsxXS55IC0gYmFzZVsyXS55OwotICAgIGQzLnggPSBiYXNlWzBdLnggLSBiYXNlWzFdLng7Ci0gICAgZDMueSA9IGJhc2VbMF0ueSAtIGJhc2VbMV0ueTsKLQotICAgIGNsb3NlMSA9IEZUX0lTX1NNQUxMKCBkMS54ICkgJiYgRlRfSVNfU01BTEwoIGQxLnkgKTsKLSAgICBjbG9zZTIgPSBGVF9JU19TTUFMTCggZDIueCApICYmIEZUX0lTX1NNQUxMKCBkMi55ICk7Ci0gICAgY2xvc2UzID0gRlRfSVNfU01BTEwoIGQzLnggKSAmJiBGVF9JU19TTUFMTCggZDMueSApOwotCi0gICAgaWYgKCBjbG9zZTEgfHwgY2xvc2UzICkKLSAgICB7Ci0gICAgICBpZiAoIGNsb3NlMiApCi0gICAgICB7Ci0gICAgICAgIC8qIGJhc2ljYWxseSBhIHBvaW50ICovCi0gICAgICAgICphbmdsZV9pbiA9ICphbmdsZV9vdXQgPSAqYW5nbGVfbWlkID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBjbG9zZTEgKQotICAgICAgewotICAgICAgICAqYW5nbGVfaW4gID0gKmFuZ2xlX21pZCA9IEZUX0F0YW4yKCBkMi54LCBkMi55ICk7Ci0gICAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDMueCwgZDMueSApOwotICAgICAgfQotICAgICAgZWxzZSAgLyogY2xvc2UyICovCi0gICAgICB7Ci0gICAgICAgICphbmdsZV9pbiAgPSBGVF9BdGFuMiggZDEueCwgZDEueSApOwotICAgICAgICAqYW5nbGVfbWlkID0gKmFuZ2xlX291dCA9IEZUX0F0YW4yKCBkMi54LCBkMi55ICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCBjbG9zZTIgKQotICAgIHsKLSAgICAgICphbmdsZV9pbiAgPSAqYW5nbGVfbWlkID0gRlRfQXRhbjIoIGQxLngsIGQxLnkgKTsKLSAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDMueCwgZDMueSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgKmFuZ2xlX2luICA9IEZUX0F0YW4yKCBkMS54LCBkMS55ICk7Ci0gICAgICAqYW5nbGVfbWlkID0gRlRfQXRhbjIoIGQyLngsIGQyLnkgKTsKLSAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDMueCwgZDMueSApOwotICAgIH0KLQotICAgIHRoZXRhMSA9IGZ0X3Bvc19hYnMoIEZUX0FuZ2xlX0RpZmYoICphbmdsZV9pbiwgICphbmdsZV9taWQgKSApOwotICAgIHRoZXRhMiA9IGZ0X3Bvc19hYnMoIEZUX0FuZ2xlX0RpZmYoICphbmdsZV9taWQsICphbmdsZV9vdXQgKSApOwotCi0gICAgcmV0dXJuIEZUX0JPT0woIHRoZXRhMSA8IEZUX1NNQUxMX0NVQklDX1RIUkVTSE9MRCAmJgotICAgICAgICAgICAgICAgICAgICB0aGV0YTIgPCBGVF9TTUFMTF9DVUJJQ19USFJFU0hPTEQgKTsKLSAgfQotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNUUk9LRSBCT1JERVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgZW51bSAgRlRfU3Ryb2tlVGFnc18KLSAgewotICAgIEZUX1NUUk9LRV9UQUdfT04gICAgPSAxLCAgIC8qIG9uLWN1cnZlIHBvaW50ICAqLwotICAgIEZUX1NUUk9LRV9UQUdfQ1VCSUMgPSAyLCAgIC8qIGN1YmljIG9mZi1wb2ludCAqLwotICAgIEZUX1NUUk9LRV9UQUdfQkVHSU4gPSA0LCAgIC8qIHN1Yi1wYXRoIHN0YXJ0ICAqLwotICAgIEZUX1NUUk9LRV9UQUdfRU5EICAgPSA4ICAgIC8qIHN1Yi1wYXRoIGVuZCAgICAqLwotCi0gIH0gRlRfU3Ryb2tlVGFnczsKLQotI2RlZmluZSAgRlRfU1RST0tFX1RBR19CRUdJTl9FTkQgIChGVF9TVFJPS0VfVEFHX0JFR0lOfEZUX1NUUk9LRV9UQUdfRU5EKQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TdHJva2VCb3JkZXJSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICBudW1fcG9pbnRzOwotICAgIEZUX1VJbnQgICAgIG1heF9wb2ludHM7Ci0gICAgRlRfVmVjdG9yKiAgcG9pbnRzOwotICAgIEZUX0J5dGUqICAgIHRhZ3M7Ci0gICAgRlRfQm9vbCAgICAgbW92YWJsZTsKLSAgICBGVF9JbnQgICAgICBzdGFydDsgICAgLyogaW5kZXggb2YgY3VycmVudCBzdWItcGF0aCBzdGFydCBwb2ludCAqLwotICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKLSAgICBGVF9Cb29sICAgICB2YWxpZDsKLQotICB9IEZUX1N0cm9rZUJvcmRlclJlYywgKkZUX1N0cm9rZUJvcmRlcjsKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX2dyb3coIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgbmV3X3BvaW50cyApCi0gIHsKLSAgICBGVF9VSW50ICAgb2xkX21heCA9IGJvcmRlci0+bWF4X3BvaW50czsKLSAgICBGVF9VSW50ICAgbmV3X21heCA9IGJvcmRlci0+bnVtX3BvaW50cyArIG5ld19wb2ludHM7Ci0gICAgRlRfRXJyb3IgIGVycm9yICAgPSAwOwotCi0KLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgIGN1cl9tYXggPSBvbGRfbWF4OwotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgID0gYm9yZGVyLT5tZW1vcnk7Ci0KLQotICAgICAgd2hpbGUgKCBjdXJfbWF4IDwgbmV3X21heCApCi0gICAgICAgIGN1cl9tYXggKz0gKCBjdXJfbWF4ID4+IDEgKSArIDE2OwotCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBib3JkZXItPnBvaW50cywgb2xkX21heCwgY3VyX21heCApIHx8Ci0gICAgICAgICAgIEZUX1JFTkVXX0FSUkFZKCBib3JkZXItPnRhZ3MsICAgb2xkX21heCwgY3VyX21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBib3JkZXItPm1heF9wb2ludHMgPSBjdXJfbWF4OwotICAgIH0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3N0cm9rZV9ib3JkZXJfY2xvc2UoIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIHJldmVyc2UgKQotICB7Ci0gICAgRlRfVUludCAgc3RhcnQgPSBib3JkZXItPnN0YXJ0OwotICAgIEZUX1VJbnQgIGNvdW50ID0gYm9yZGVyLT5udW1fcG9pbnRzOwotCi0KLSAgICBGVF9BU1NFUlQoIGJvcmRlci0+c3RhcnQgPj0gMCApOwotCi0gICAgLyogZG9uJ3QgcmVjb3JkIGVtcHR5IHBhdGhzISAqLwotICAgIGlmICggY291bnQgPD0gc3RhcnQgKyAxVSApCi0gICAgICBib3JkZXItPm51bV9wb2ludHMgPSBzdGFydDsKLSAgICBlbHNlCi0gICAgewotICAgICAgLyogY29weSB0aGUgbGFzdCBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhpcyBzdWItcGF0aCwgc2luY2UgKi8KLSAgICAgIC8qIGl0IGNvbnRhaW5zIHRoZSBgYWRqdXN0ZWQnIHN0YXJ0aW5nIGNvb3JkaW5hdGVzICAgICAgICAgICovCi0gICAgICBib3JkZXItPm51bV9wb2ludHMgICAgPSAtLWNvdW50OwotICAgICAgYm9yZGVyLT5wb2ludHNbc3RhcnRdID0gYm9yZGVyLT5wb2ludHNbY291bnRdOwotCi0gICAgICBpZiAoIHJldmVyc2UgKQotICAgICAgewotICAgICAgICAvKiByZXZlcnNlIHRoZSBwb2ludHMgKi8KLSAgICAgICAgewotICAgICAgICAgIEZUX1ZlY3RvciogIHZlYzEgPSBib3JkZXItPnBvaW50cyArIHN0YXJ0ICsgMTsKLSAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMyID0gYm9yZGVyLT5wb2ludHMgKyBjb3VudCAtIDE7Ci0KLQotICAgICAgICAgIGZvciAoIDsgdmVjMSA8IHZlYzI7IHZlYzErKywgdmVjMi0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHRtcDsKLQotCi0gICAgICAgICAgICB0bXAgICA9ICp2ZWMxOwotICAgICAgICAgICAgKnZlYzEgPSAqdmVjMjsKLSAgICAgICAgICAgICp2ZWMyID0gdG1wOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRoZW4gdGhlIHRhZ3MgKi8KLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICB0YWcxID0gYm9yZGVyLT50YWdzICsgc3RhcnQgKyAxOwotICAgICAgICAgIEZUX0J5dGUqICB0YWcyID0gYm9yZGVyLT50YWdzICsgY291bnQgLSAxOwotCi0KLSAgICAgICAgICBmb3IgKCA7IHRhZzEgPCB0YWcyOyB0YWcxKyssIHRhZzItLSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfQnl0ZSAgdG1wOwotCi0KLSAgICAgICAgICAgIHRtcCAgID0gKnRhZzE7Ci0gICAgICAgICAgICAqdGFnMSA9ICp0YWcyOwotICAgICAgICAgICAgKnRhZzIgPSB0bXA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGJvcmRlci0+dGFnc1tzdGFydCAgICBdIHw9IEZUX1NUUk9LRV9UQUdfQkVHSU47Ci0gICAgICBib3JkZXItPnRhZ3NbY291bnQgLSAxXSB8PSBGVF9TVFJPS0VfVEFHX0VORDsKLSAgICB9Ci0KLSAgICBib3JkZXItPnN0YXJ0ICAgPSAtMTsKLSAgICBib3JkZXItPm1vdmFibGUgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgbW92YWJsZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIGJvcmRlci0+c3RhcnQgPj0gMCApOwotCi0gICAgaWYgKCBib3JkZXItPm1vdmFibGUgKQotICAgIHsKLSAgICAgIC8qIG1vdmUgbGFzdCBwb2ludCAqLwotICAgICAgYm9yZGVyLT5wb2ludHNbYm9yZGVyLT5udW1fcG9pbnRzIC0gMV0gPSAqdG87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBhZGQgb25lIHBvaW50ICovCi0gICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfZ3JvdyggYm9yZGVyLCAxICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciogIHZlYyA9IGJvcmRlci0+cG9pbnRzICsgYm9yZGVyLT5udW1fcG9pbnRzOwotICAgICAgICBGVF9CeXRlKiAgICB0YWcgPSBib3JkZXItPnRhZ3MgICArIGJvcmRlci0+bnVtX3BvaW50czsKLQotCi0gICAgICAgIHZlY1swXSA9ICp0bzsKLSAgICAgICAgdGFnWzBdID0gRlRfU1RST0tFX1RBR19PTjsKLQotICAgICAgICBib3JkZXItPm51bV9wb2ludHMgKz0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYm9yZGVyLT5tb3ZhYmxlID0gbW92YWJsZTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX2NvbmljdG8oIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIHRvICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgRlRfQVNTRVJUKCBib3JkZXItPnN0YXJ0ID49IDAgKTsKLQotICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9ncm93KCBib3JkZXIsIDIgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjID0gYm9yZGVyLT5wb2ludHMgKyBib3JkZXItPm51bV9wb2ludHM7Ci0gICAgICBGVF9CeXRlKiAgICB0YWcgPSBib3JkZXItPnRhZ3MgICArIGJvcmRlci0+bnVtX3BvaW50czsKLQotICAgICAgdmVjWzBdID0gKmNvbnRyb2w7Ci0gICAgICB2ZWNbMV0gPSAqdG87Ci0KLSAgICAgIHRhZ1swXSA9IDA7Ci0gICAgICB0YWdbMV0gPSBGVF9TVFJPS0VfVEFHX09OOwotCi0gICAgICBib3JkZXItPm51bV9wb2ludHMgKz0gMjsKLSAgICB9Ci0gICAgYm9yZGVyLT5tb3ZhYmxlID0gMDsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX2N1YmljdG8oIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICAgY29udHJvbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIHRvICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgRlRfQVNTRVJUKCBib3JkZXItPnN0YXJ0ID49IDAgKTsKLQotICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9ncm93KCBib3JkZXIsIDMgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjID0gYm9yZGVyLT5wb2ludHMgKyBib3JkZXItPm51bV9wb2ludHM7Ci0gICAgICBGVF9CeXRlKiAgICB0YWcgPSBib3JkZXItPnRhZ3MgICArIGJvcmRlci0+bnVtX3BvaW50czsKLQotCi0gICAgICB2ZWNbMF0gPSAqY29udHJvbDE7Ci0gICAgICB2ZWNbMV0gPSAqY29udHJvbDI7Ci0gICAgICB2ZWNbMl0gPSAqdG87Ci0KLSAgICAgIHRhZ1swXSA9IEZUX1NUUk9LRV9UQUdfQ1VCSUM7Ci0gICAgICB0YWdbMV0gPSBGVF9TVFJPS0VfVEFHX0NVQklDOwotICAgICAgdGFnWzJdID0gRlRfU1RST0tFX1RBR19PTjsKLQotICAgICAgYm9yZGVyLT5udW1fcG9pbnRzICs9IDM7Ci0gICAgfQotICAgIGJvcmRlci0+bW92YWJsZSA9IDA7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2RlZmluZSBGVF9BUkNfQ1VCSUNfQU5HTEUgICggRlRfQU5HTEVfUEkgLyAyICkKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX2FyY3RvKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICBjZW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICAgICAgIGFuZ2xlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICAgICAgIGFuZ2xlX2RpZmYgKQotICB7Ci0gICAgRlRfQW5nbGUgICB0b3RhbCwgYW5nbGUsIHN0ZXAsIHJvdGF0ZSwgbmV4dCwgdGhldGE7Ci0gICAgRlRfVmVjdG9yICBhLCBiLCBhMiwgYjI7Ci0gICAgRlRfRml4ZWQgICBsZW5ndGg7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IDA7Ci0KLQotICAgIC8qIGNvbXB1dGUgc3RhcnQgcG9pbnQgKi8KLSAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmEsIHJhZGl1cywgYW5nbGVfc3RhcnQgKTsKLSAgICBhLnggKz0gY2VudGVyLT54OwotICAgIGEueSArPSBjZW50ZXItPnk7Ci0KLSAgICB0b3RhbCAgPSBhbmdsZV9kaWZmOwotICAgIGFuZ2xlICA9IGFuZ2xlX3N0YXJ0OwotICAgIHJvdGF0ZSA9ICggYW5nbGVfZGlmZiA+PSAwICkgPyBGVF9BTkdMRV9QSTIgOiAtRlRfQU5HTEVfUEkyOwotCi0gICAgd2hpbGUgKCB0b3RhbCAhPSAwICkKLSAgICB7Ci0gICAgICBzdGVwID0gdG90YWw7Ci0gICAgICBpZiAoIHN0ZXAgPiBGVF9BUkNfQ1VCSUNfQU5HTEUgKQotICAgICAgICBzdGVwID0gRlRfQVJDX0NVQklDX0FOR0xFOwotCi0gICAgICBlbHNlIGlmICggc3RlcCA8IC1GVF9BUkNfQ1VCSUNfQU5HTEUgKQotICAgICAgICBzdGVwID0gLUZUX0FSQ19DVUJJQ19BTkdMRTsKLQotICAgICAgbmV4dCAgPSBhbmdsZSArIHN0ZXA7Ci0gICAgICB0aGV0YSA9IHN0ZXA7Ci0gICAgICBpZiAoIHRoZXRhIDwgMCApCi0gICAgICAgIHRoZXRhID0gLXRoZXRhOwotCi0gICAgICB0aGV0YSA+Pj0gMTsKLQotICAgICAgLyogY29tcHV0ZSBlbmQgcG9pbnQgKi8KLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmYiwgcmFkaXVzLCBuZXh0ICk7Ci0gICAgICBiLnggKz0gY2VudGVyLT54OwotICAgICAgYi55ICs9IGNlbnRlci0+eTsKLQotICAgICAgLyogY29tcHV0ZSBmaXJzdCBhbmQgc2Vjb25kIGNvbnRyb2wgcG9pbnRzICovCi0gICAgICBsZW5ndGggPSBGVF9NdWxEaXYoIHJhZGl1cywgRlRfU2luKCB0aGV0YSApICogNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCAweDEwMDAwTCArIEZUX0NvcyggdGhldGEgKSApICogMyApOwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmEyLCBsZW5ndGgsIGFuZ2xlICsgcm90YXRlICk7Ci0gICAgICBhMi54ICs9IGEueDsKLSAgICAgIGEyLnkgKz0gYS55OwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmIyLCBsZW5ndGgsIG5leHQgLSByb3RhdGUgKTsKLSAgICAgIGIyLnggKz0gYi54OwotICAgICAgYjIueSArPSBiLnk7Ci0KLSAgICAgIC8qIGFkZCBjdWJpYyBhcmMgKi8KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9jdWJpY3RvKCBib3JkZXIsICZhMiwgJmIyLCAmYiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBhcmMgPz8gKi8KLSAgICAgIGEgICAgICA9IGI7Ci0gICAgICB0b3RhbCAtPSBzdGVwOwotICAgICAgYW5nbGUgID0gbmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX21vdmV0byggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIHRvICkKLSAgewotICAgIC8qIGNsb3NlIGN1cnJlbnQgb3BlbiBwYXRoIGlmIGFueSA/ICovCi0gICAgaWYgKCBib3JkZXItPnN0YXJ0ID49IDAgKQotICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9jbG9zZSggYm9yZGVyLCAwICk7Ci0KLSAgICBib3JkZXItPnN0YXJ0ICAgPSBib3JkZXItPm51bV9wb2ludHM7Ci0gICAgYm9yZGVyLT5tb3ZhYmxlID0gMDsKLQotICAgIHJldHVybiBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCB0bywgMCApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9zdHJva2VfYm9yZGVyX2luaXQoIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ICkKLSAgewotICAgIGJvcmRlci0+bWVtb3J5ID0gbWVtb3J5OwotICAgIGJvcmRlci0+cG9pbnRzID0gTlVMTDsKLSAgICBib3JkZXItPnRhZ3MgICA9IE5VTEw7Ci0KLSAgICBib3JkZXItPm51bV9wb2ludHMgPSAwOwotICAgIGJvcmRlci0+bWF4X3BvaW50cyA9IDA7Ci0gICAgYm9yZGVyLT5zdGFydCAgICAgID0gLTE7Ci0gICAgYm9yZGVyLT52YWxpZCAgICAgID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfc3Ryb2tlX2JvcmRlcl9yZXNldCggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgKQotICB7Ci0gICAgYm9yZGVyLT5udW1fcG9pbnRzID0gMDsKLSAgICBib3JkZXItPnN0YXJ0ICAgICAgPSAtMTsKLSAgICBib3JkZXItPnZhbGlkICAgICAgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9zdHJva2VfYm9yZGVyX2RvbmUoIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gYm9yZGVyLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIGJvcmRlci0+cG9pbnRzICk7Ci0gICAgRlRfRlJFRSggYm9yZGVyLT50YWdzICk7Ci0KLSAgICBib3JkZXItPm51bV9wb2ludHMgPSAwOwotICAgIGJvcmRlci0+bWF4X3BvaW50cyA9IDA7Ci0gICAgYm9yZGVyLT5zdGFydCAgICAgID0gLTE7Ci0gICAgYm9yZGVyLT52YWxpZCAgICAgID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZV9ib3JkZXJfZ2V0X2NvdW50cyggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICphbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgKmFudW1fY29udG91cnMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yICAgICAgICA9IDA7Ci0gICAgRlRfVUludCAgIG51bV9wb2ludHMgICA9IDA7Ci0gICAgRlRfVUludCAgIG51bV9jb250b3VycyA9IDA7Ci0KLSAgICBGVF9VSW50ICAgICBjb3VudCAgICAgID0gYm9yZGVyLT5udW1fcG9pbnRzOwotICAgIEZUX1ZlY3RvciogIHBvaW50ICAgICAgPSBib3JkZXItPnBvaW50czsKLSAgICBGVF9CeXRlKiAgICB0YWdzICAgICAgID0gYm9yZGVyLT50YWdzOwotICAgIEZUX0ludCAgICAgIGluX2NvbnRvdXIgPSAwOwotCi0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgbnVtX3BvaW50cysrLCBwb2ludCsrLCB0YWdzKysgKQotICAgIHsKLSAgICAgIGlmICggdGFnc1swXSAmIEZUX1NUUk9LRV9UQUdfQkVHSU4gKQotICAgICAgewotICAgICAgICBpZiAoIGluX2NvbnRvdXIgIT0gMCApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGluX2NvbnRvdXIgPSAxOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGluX2NvbnRvdXIgPT0gMCApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgaWYgKCB0YWdzWzBdICYgRlRfU1RST0tFX1RBR19FTkQgKQotICAgICAgewotICAgICAgICBpZiAoIGluX2NvbnRvdXIgPT0gMCApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGluX2NvbnRvdXIgPSAwOwotICAgICAgICBudW1fY29udG91cnMrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGluX2NvbnRvdXIgIT0gMCApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBib3JkZXItPnZhbGlkID0gMTsKLQotICBFeGl0OgotICAgICphbnVtX3BvaW50cyAgID0gbnVtX3BvaW50czsKLSAgICAqYW51bV9jb250b3VycyA9IG51bV9jb250b3VyczsKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBudW1fcG9pbnRzICAgPSAwOwotICAgIG51bV9jb250b3VycyA9IDA7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9zdHJva2VfYm9yZGVyX2V4cG9ydCggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgIG91dGxpbmUgKQotICB7Ci0gICAgLyogY29weSBwb2ludCBsb2NhdGlvbnMgKi8KLSAgICBGVF9BUlJBWV9DT1BZKCBvdXRsaW5lLT5wb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICBib3JkZXItPnBvaW50cywKLSAgICAgICAgICAgICAgICAgICBib3JkZXItPm51bV9wb2ludHMgKTsKLQotICAgIC8qIGNvcHkgdGFncyAqLwotICAgIHsKLSAgICAgIEZUX1VJbnQgICBjb3VudCA9IGJvcmRlci0+bnVtX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICByZWFkICA9IGJvcmRlci0+dGFnczsKLSAgICAgIEZUX0J5dGUqICB3cml0ZSA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHJlYWQrKywgd3JpdGUrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnJlYWQgJiBGVF9TVFJPS0VfVEFHX09OICkKLSAgICAgICAgICAqd3JpdGUgPSBGVF9DVVJWRV9UQUdfT047Ci0gICAgICAgIGVsc2UgaWYgKCAqcmVhZCAmIEZUX1NUUk9LRV9UQUdfQ1VCSUMgKQotICAgICAgICAgICp3cml0ZSA9IEZUX0NVUlZFX1RBR19DVUJJQzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICp3cml0ZSA9IEZUX0NVUlZFX1RBR19DT05JQzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjb3B5IGNvbnRvdXJzICovCi0gICAgewotICAgICAgRlRfVUludCAgICBjb3VudCA9IGJvcmRlci0+bnVtX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICAgdGFncyAgPSBib3JkZXItPnRhZ3M7Ci0gICAgICBGVF9TaG9ydCogIHdyaXRlID0gb3V0bGluZS0+Y29udG91cnMgKyBvdXRsaW5lLT5uX2NvbnRvdXJzOwotICAgICAgRlRfU2hvcnQgICBpZHggICA9IChGVF9TaG9ydClvdXRsaW5lLT5uX3BvaW50czsKLQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgdGFncysrLCBpZHgrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnRhZ3MgJiBGVF9TVFJPS0VfVEFHX0VORCApCi0gICAgICAgIHsKLSAgICAgICAgICAqd3JpdGUrKyA9IGlkeDsKLSAgICAgICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRsaW5lLT5uX3BvaW50cyAgPSAoc2hvcnQpKCBvdXRsaW5lLT5uX3BvaW50cyArIGJvcmRlci0+bnVtX3BvaW50cyApOwotCi0gICAgRlRfQVNTRVJUKCBGVF9PdXRsaW5lX0NoZWNrKCBvdXRsaW5lICkgPT0gMCApOwotICB9Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUk9LRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRlRfU0lERV9UT19ST1RBVEUoIHMgKSAgICggRlRfQU5HTEVfUEkyIC0gKHMpICogRlRfQU5HTEVfUEkgKQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TdHJva2VyUmVjXwotICB7Ci0gICAgRlRfQW5nbGUgICAgICAgICAgICAgYW5nbGVfaW47Ci0gICAgRlRfQW5nbGUgICAgICAgICAgICAgYW5nbGVfb3V0OwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgIGNlbnRlcjsKLSAgICBGVF9Cb29sICAgICAgICAgICAgICBmaXJzdF9wb2ludDsKLSAgICBGVF9Cb29sICAgICAgICAgICAgICBzdWJwYXRoX29wZW47Ci0gICAgRlRfQW5nbGUgICAgICAgICAgICAgc3VicGF0aF9hbmdsZTsKLSAgICBGVF9WZWN0b3IgICAgICAgICAgICBzdWJwYXRoX3N0YXJ0OwotCi0gICAgRlRfU3Ryb2tlcl9MaW5lQ2FwICAgbGluZV9jYXA7Ci0gICAgRlRfU3Ryb2tlcl9MaW5lSm9pbiAgbGluZV9qb2luOwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgIG1pdGVyX2xpbWl0OwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgIHJhZGl1czsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICAgIHZhbGlkOwotICAgIEZUX1N0cm9rZUJvcmRlclJlYyAgIGJvcmRlcnNbMl07Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5OwotCi0gIH0gRlRfU3Ryb2tlclJlYzsKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9OZXcoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgKmFzdHJva2VyICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKLSAgICBGVF9TdHJva2VyICBzdHJva2VyOwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIGlmICggIUZUX05FVyggc3Ryb2tlciApICkKLSAgICB7Ci0gICAgICBzdHJva2VyLT5tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfaW5pdCggJnN0cm9rZXItPmJvcmRlcnNbMF0sIG1lbW9yeSApOwotICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9pbml0KCAmc3Ryb2tlci0+Ym9yZGVyc1sxXSwgbWVtb3J5ICk7Ci0gICAgfQotICAgICphc3Ryb2tlciA9IHN0cm9rZXI7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9TZXQoIEZUX1N0cm9rZXIgICAgICAgICAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICAgICAgICByYWRpdXMsCi0gICAgICAgICAgICAgICAgICBGVF9TdHJva2VyX0xpbmVDYXAgICBsaW5lX2NhcCwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJfTGluZUpvaW4gIGxpbmVfam9pbiwKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIG1pdGVyX2xpbWl0ICkKLSAgewotICAgIHN0cm9rZXItPnJhZGl1cyAgICAgID0gcmFkaXVzOwotICAgIHN0cm9rZXItPmxpbmVfY2FwICAgID0gbGluZV9jYXA7Ci0gICAgc3Ryb2tlci0+bGluZV9qb2luICAgPSBsaW5lX2pvaW47Ci0gICAgc3Ryb2tlci0+bWl0ZXJfbGltaXQgPSBtaXRlcl9saW1pdDsKLQotICAgIEZUX1N0cm9rZXJfUmV3aW5kKCBzdHJva2VyICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TdHJva2VyX1Jld2luZCggRlRfU3Ryb2tlciAgc3Ryb2tlciApCi0gIHsKLSAgICBpZiAoIHN0cm9rZXIgKQotICAgIHsKLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfcmVzZXQoICZzdHJva2VyLT5ib3JkZXJzWzBdICk7Ci0gICAgICBmdF9zdHJva2VfYm9yZGVyX3Jlc2V0KCAmc3Ryb2tlci0+Ym9yZGVyc1sxXSApOwotICAgIH0KLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1N0cm9rZXJfRG9uZSggRlRfU3Ryb2tlciAgc3Ryb2tlciApCi0gIHsKLSAgICBpZiAoIHN0cm9rZXIgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3Ryb2tlci0+bWVtb3J5OwotCi0KLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfZG9uZSggJnN0cm9rZXItPmJvcmRlcnNbMF0gKTsKLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfZG9uZSggJnN0cm9rZXItPmJvcmRlcnNbMV0gKTsKLQotICAgICAgc3Ryb2tlci0+bWVtb3J5ID0gTlVMTDsKLSAgICAgIEZUX0ZSRUUoIHN0cm9rZXIgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGNyZWF0ZXMgYSBjaXJjdWxhciBhcmMgYXQgYSBjb3JuZXIgb3IgY2FwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX2FyY3RvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBzaWRlICkKLSAgewotICAgIEZUX0FuZ2xlICAgICAgICAgdG90YWwsIHJvdGF0ZTsKLSAgICBGVF9GaXhlZCAgICAgICAgIHJhZGl1cyA9IHN0cm9rZXItPnJhZGl1czsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yICA9IDA7Ci0gICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzICsgc2lkZTsKLQotCi0gICAgcm90YXRlID0gRlRfU0lERV9UT19ST1RBVEUoIHNpZGUgKTsKLQotICAgIHRvdGFsID0gRlRfQW5nbGVfRGlmZiggc3Ryb2tlci0+YW5nbGVfaW4sIHN0cm9rZXItPmFuZ2xlX291dCApOwotICAgIGlmICggdG90YWwgPT0gRlRfQU5HTEVfUEkgKQotICAgICAgdG90YWwgPSAtcm90YXRlICogMjsKLQotICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9hcmN0byggYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cm9rZXItPmNlbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX2luICsgcm90YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKTsKLSAgICBib3JkZXItPm1vdmFibGUgPSAwOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogYWRkcyBhIGNhcCBhdCB0aGUgZW5kIG9mIGFuIG9wZW5lZCBwYXRoICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX2NhcCggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgc2lkZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgID0gMDsKLQotCi0gICAgaWYgKCBzdHJva2VyLT5saW5lX2NhcCA9PSBGVF9TVFJPS0VSX0xJTkVDQVBfUk9VTkQgKQotICAgIHsKLSAgICAgIC8qIGFkZCBhIHJvdW5kIGNhcCAqLwotICAgICAgc3Ryb2tlci0+YW5nbGVfaW4gID0gYW5nbGU7Ci0gICAgICBzdHJva2VyLT5hbmdsZV9vdXQgPSBhbmdsZSArIEZUX0FOR0xFX1BJOwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX2FyY3RvKCBzdHJva2VyLCBzaWRlICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBzdHJva2VyLT5saW5lX2NhcCA9PSBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFICkKLSAgICB7Ci0gICAgICAvKiBhZGQgYSBzcXVhcmUgY2FwICovCi0gICAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhLCBkZWx0YTI7Ci0gICAgICBGVF9BbmdsZSAgICAgICAgIHJvdGF0ZSA9IEZUX1NJREVfVE9fUk9UQVRFKCBzaWRlICk7Ci0gICAgICBGVF9GaXhlZCAgICAgICAgIHJhZGl1cyA9IHN0cm9rZXItPnJhZGl1czsKLSAgICAgIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVycyArIHNpZGU7Ci0KLQotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YTIsIHJhZGl1cywgYW5nbGUgKyByb3RhdGUgKTsKLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsICByYWRpdXMsIGFuZ2xlICk7Ci0KLSAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLnggKyBkZWx0YTIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnkgKyBkZWx0YTIueTsKLQotICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEyLCByYWRpdXMsIGFuZ2xlIC0gcm90YXRlICk7Ci0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCAgcmFkaXVzLCBhbmdsZSApOwotCi0gICAgICBkZWx0YS54ICs9IGRlbHRhMi54ICsgc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICBkZWx0YS55ICs9IGRlbHRhMi55ICsgc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCAwICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBwcm9jZXNzIGFuIGluc2lkZSBjb3JuZXIsIGkuZS4gY29tcHV0ZSBpbnRlcnNlY3Rpb24gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZXJfaW5zaWRlKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgc2lkZSkKLSAgewotICAgIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVycyArIHNpZGU7Ci0gICAgRlRfQW5nbGUgICAgICAgICBwaGksIHRoZXRhLCByb3RhdGU7Ci0gICAgRlRfRml4ZWQgICAgICAgICBsZW5ndGgsIHRoY29zLCBzaWdtYTsKLSAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgPSAwOwotCi0KLSAgICByb3RhdGUgPSBGVF9TSURFX1RPX1JPVEFURSggc2lkZSApOwotCi0gICAgLyogY29tcHV0ZSBtZWRpYW4gYW5nbGUgKi8KLSAgICB0aGV0YSA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLCBzdHJva2VyLT5hbmdsZV9vdXQgKTsKLSAgICBpZiAoIHRoZXRhID09IEZUX0FOR0xFX1BJICkKLSAgICAgIHRoZXRhID0gcm90YXRlOwotICAgIGVsc2UKLSAgICAgIHRoZXRhID0gdGhldGEgLyAyOwotCi0gICAgcGhpID0gc3Ryb2tlci0+YW5nbGVfaW4gKyB0aGV0YTsKLQotICAgIHRoY29zID0gRlRfQ29zKCB0aGV0YSApOwotICAgIHNpZ21hID0gRlRfTXVsRml4KCBzdHJva2VyLT5taXRlcl9saW1pdCwgdGhjb3MgKTsKLQotICAgIC8qIFRPRE86IGZpbmQgYmV0dGVyIGNyaXRlcmlvbiB0byBzd2l0Y2ggb2ZmIHRoZSBvcHRpbWl6YXRpb24gKi8KLSAgICBpZiAoIHNpZ21hIDwgMHgxMDAwMEwgKQotICAgIHsKLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIHN0cm9rZXItPnJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VyLT5hbmdsZV9vdXQgKyByb3RhdGUgKTsKLSAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICBkZWx0YS55ICs9IHN0cm9rZXItPmNlbnRlci55OwotICAgICAgYm9yZGVyLT5tb3ZhYmxlID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxlbmd0aCA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCB0aGNvcyApOwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSArIHJvdGF0ZSApOwotICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIDAgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcHJvY2VzcyBhbiBvdXRzaWRlIGNvcm5lciwgaS5lLiBjb21wdXRlIGJldmVsL21pdGVyL3JvdW5kICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX291dHNpZGUoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgc2lkZSApCi0gIHsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciA9IHN0cm9rZXItPmJvcmRlcnMgKyBzaWRlOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfQW5nbGUgICAgICAgICByb3RhdGU7Ci0KLQotICAgIGlmICggc3Ryb2tlci0+bGluZV9qb2luID09IEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQgKQotICAgIHsKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9hcmN0byggc3Ryb2tlciwgc2lkZSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogdGhpcyBpcyBhIG1pdGVyZWQgb3IgYmV2ZWxlZCBjb3JuZXIgKi8KLSAgICAgIEZUX0ZpeGVkICBzaWdtYSwgcmFkaXVzID0gc3Ryb2tlci0+cmFkaXVzOwotICAgICAgRlRfQW5nbGUgIHRoZXRhLCBwaGk7Ci0gICAgICBGVF9GaXhlZCAgdGhjb3M7Ci0gICAgICBGVF9Cb29sICAgbWl0ZXI7Ci0KLQotICAgICAgcm90YXRlID0gRlRfU0lERV9UT19ST1RBVEUoIHNpZGUgKTsKLSAgICAgIG1pdGVyICA9IEZUX0JPT0woIHN0cm9rZXItPmxpbmVfam9pbiA9PSBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSICk7Ci0KLSAgICAgIHRoZXRhICA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLCBzdHJva2VyLT5hbmdsZV9vdXQgKTsKLSAgICAgIGlmICggdGhldGEgPT0gRlRfQU5HTEVfUEkgKQotICAgICAgewotICAgICAgICB0aGV0YSA9IHJvdGF0ZTsKLSAgICAgICAgcGhpICAgPSBzdHJva2VyLT5hbmdsZV9pbjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhldGEgPSB0aGV0YSAvIDI7Ci0gICAgICAgIHBoaSAgID0gc3Ryb2tlci0+YW5nbGVfaW4gKyB0aGV0YSArIHJvdGF0ZTsKLSAgICAgIH0KLQotICAgICAgdGhjb3MgPSBGVF9Db3MoIHRoZXRhICk7Ci0gICAgICBzaWdtYSA9IEZUX011bEZpeCggc3Ryb2tlci0+bWl0ZXJfbGltaXQsIHRoY29zICk7Ci0KLSAgICAgIGlmICggc2lnbWEgPj0gMHgxMDAwMEwgKQotICAgICAgICBtaXRlciA9IDA7Ci0KLSAgICAgIGlmICggbWl0ZXIgKSAgLyogdGhpcyBpcyBhIG1pdGVyIChicm9rZW4gYW5nbGUpICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgbWlkZGxlLCBkZWx0YTsKLSAgICAgICAgRlRfRml4ZWQgICBsZW5ndGg7Ci0KLQotICAgICAgICAvKiBjb21wdXRlIG1pZGRsZSBwb2ludCAqLwotICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJm1pZGRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggcmFkaXVzLCBzdHJva2VyLT5taXRlcl9saW1pdCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhpICk7Ci0gICAgICAgIG1pZGRsZS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgICBtaWRkbGUueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICAvKiBjb21wdXRlIGZpcnN0IGFuZ2xlIHBvaW50ICovCi0gICAgICAgIGxlbmd0aCA9IEZUX011bEZpeCggcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggMHgxMDAwMEwgLSBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0X3Bvc19hYnMoIEZUX1NpbiggdGhldGEgKSApICkgKTsKLQotICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSArIHJvdGF0ZSApOwotICAgICAgICBkZWx0YS54ICs9IG1pZGRsZS54OwotICAgICAgICBkZWx0YS55ICs9IG1pZGRsZS55OwotCi0gICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCAwICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBjb21wdXRlIHNlY29uZCBhbmdsZSBwb2ludCAqLwotICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSAtIHJvdGF0ZSApOwotICAgICAgICBkZWx0YS54ICs9IG1pZGRsZS54OwotICAgICAgICBkZWx0YS55ICs9IG1pZGRsZS55OwotCi0gICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCAwICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBmaW5hbGx5LCBhZGQgYSBtb3ZhYmxlIGVuZCBwb2ludCAqLwotICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCByYWRpdXMsIHN0cm9rZXItPmFuZ2xlX291dCArIHJvdGF0ZSApOwotICAgICAgICBkZWx0YS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgICBkZWx0YS55ICs9IHN0cm9rZXItPmNlbnRlci55OwotCi0gICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCAxICk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgLyogdGhpcyBpcyBhIGJldmVsIChpbnRlcnNlY3Rpb24pICovCi0gICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICAgbGVuZ3RoOwotICAgICAgICBGVF9WZWN0b3IgIGRlbHRhOwotCi0KLSAgICAgICAgbGVuZ3RoID0gRlRfRGl2Rml4KCBzdHJva2VyLT5yYWRpdXMsIHRoY29zICk7Ci0KLSAgICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgbGVuZ3RoLCBwaGkgKTsKLSAgICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgMCApOwotICAgICAgICBpZiAoZXJyb3IpIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBub3cgYWRkIGVuZCBwb2ludCAqLwotICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBzdHJva2VyLT5yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VyLT5hbmdsZV9vdXQgKyByb3RhdGUgKTsKLSAgICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgMSApOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZXJfcHJvY2Vzc19jb3JuZXIoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gMDsKLSAgICBGVF9BbmdsZSAgdHVybjsKLSAgICBGVF9JbnQgICAgaW5zaWRlX3NpZGU7Ci0KLQotICAgIHR1cm4gPSBGVF9BbmdsZV9EaWZmKCBzdHJva2VyLT5hbmdsZV9pbiwgc3Ryb2tlci0+YW5nbGVfb3V0ICk7Ci0KLSAgICAvKiBubyBzcGVjaWZpYyBjb3JuZXIgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCBpZiB0aGUgdHVybiBpcyAwICovCi0gICAgaWYgKCB0dXJuID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogd2hlbiB3ZSB0dXJuIHRvIHRoZSByaWdodCwgdGhlIGluc2lkZSBzaWRlIGlzIDAgKi8KLSAgICBpbnNpZGVfc2lkZSA9IDA7Ci0KLSAgICAvKiBvdGhlcndpc2UsIHRoZSBpbnNpZGUgc2lkZSBpcyAxICovCi0gICAgaWYgKCB0dXJuIDwgMCApCi0gICAgICBpbnNpZGVfc2lkZSA9IDE7Ci0KLSAgICAvKiBwcm9jZXNzIHRoZSBpbnNpZGUgc2lkZSAqLwotICAgIGVycm9yID0gZnRfc3Ryb2tlcl9pbnNpZGUoIHN0cm9rZXIsIGluc2lkZV9zaWRlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBwcm9jZXNzIHRoZSBvdXRzaWRlIHNpZGUgKi8KLSAgICBlcnJvciA9IGZ0X3N0cm9rZXJfb3V0c2lkZSggc3Ryb2tlciwgMSAtIGluc2lkZV9zaWRlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGFkZCB0d28gcG9pbnRzIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBib3JkZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlICovCi0gIC8qIHN0YXJ0IG9mIHRoZSBzdWJwYXRoLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX3N1YnBhdGhfc3RhcnQoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgc3RhcnRfYW5nbGUgKQotICB7Ci0gICAgRlRfVmVjdG9yICAgICAgICBkZWx0YTsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBvaW50OwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXI7Ci0KLQotICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIHN0cm9rZXItPnJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYW5nbGUgKyBGVF9BTkdMRV9QSTIgKTsKLQotICAgIHBvaW50LnggPSBzdHJva2VyLT5jZW50ZXIueCArIGRlbHRhLng7Ci0gICAgcG9pbnQueSA9IHN0cm9rZXItPmNlbnRlci55ICsgZGVsdGEueTsKLQotICAgIGJvcmRlciA9IHN0cm9rZXItPmJvcmRlcnM7Ci0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX21vdmV0byggYm9yZGVyLCAmcG9pbnQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHBvaW50LnggPSBzdHJva2VyLT5jZW50ZXIueCAtIGRlbHRhLng7Ci0gICAgcG9pbnQueSA9IHN0cm9rZXItPmNlbnRlci55IC0gZGVsdGEueTsKLQotICAgIGJvcmRlcisrOwotICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9tb3ZldG8oIGJvcmRlciwgJnBvaW50ICk7Ci0KLSAgICAvKiBzYXZlIGFuZ2xlIGZvciBsYXN0IGNhcCAqLwotICAgIHN0cm9rZXItPnN1YnBhdGhfYW5nbGUgPSBzdGFydF9hbmdsZTsKLSAgICBzdHJva2VyLT5maXJzdF9wb2ludCAgID0gMDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0xpbmVUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgPSAwOwotICAgIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyOwotICAgIEZUX1ZlY3RvciAgICAgICAgZGVsdGE7Ci0gICAgRlRfQW5nbGUgICAgICAgICBhbmdsZTsKLSAgICBGVF9JbnQgICAgICAgICAgIHNpZGU7Ci0KLSAgICBkZWx0YS54ID0gdG8tPnggLSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICBkZWx0YS55ID0gdG8tPnkgLSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgIGFuZ2xlID0gRlRfQXRhbjIoIGRlbHRhLngsIGRlbHRhLnkgKTsKLSAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBzdHJva2VyLT5yYWRpdXMsIGFuZ2xlICsgRlRfQU5HTEVfUEkyICk7Ci0KLSAgICAvKiBwcm9jZXNzIGNvcm5lciBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBzZWdtZW50IG9mIGEgc3VicGF0aC4gIFdlIG5lZWQgdG8gICAgICovCi0gICAgICAvKiBhZGQgYSBwb2ludCB0byBlYWNoIGJvcmRlciBhdCB0aGVpciByZXNwZWN0aXZlIHN0YXJ0aW5nICovCi0gICAgICAvKiBwb2ludCBsb2NhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfc3VicGF0aF9zdGFydCggc3Ryb2tlciwgYW5nbGUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBwcm9jZXNzIHRoZSBjdXJyZW50IGNvcm5lciAqLwotICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGU7Ci0gICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfcHJvY2Vzc19jb3JuZXIoIHN0cm9rZXIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbm93IGFkZCBhIGxpbmUgc2VnbWVudCB0byBib3RoIHRoZSAiaW5zaWRlIiBhbmQgIm91dHNpZGUiIHBhdGhzICovCi0KLSAgICBmb3IgKCBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzLCBzaWRlID0gMTsgc2lkZSA+PSAwOyBzaWRlLS0sIGJvcmRlcisrICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IgIHBvaW50OwotCi0KLSAgICAgIHBvaW50LnggPSB0by0+eCArIGRlbHRhLng7Ci0gICAgICBwb2ludC55ID0gdG8tPnkgKyBkZWx0YS55OwotCi0gICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZwb2ludCwgMSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZGVsdGEueCA9IC1kZWx0YS54OwotICAgICAgZGVsdGEueSA9IC1kZWx0YS55OwotICAgIH0KLQotICAgIHN0cm9rZXItPmFuZ2xlX2luID0gYW5nbGU7Ci0gICAgc3Ryb2tlci0+Y2VudGVyICAgPSAqdG87Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9Db25pY1RvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSAwOwotICAgIEZUX1ZlY3RvciAgIGJlel9zdGFja1szNF07Ci0gICAgRlRfVmVjdG9yKiAgYXJjOwotICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gYmV6X3N0YWNrICsgMzA7Ci0gICAgRlRfQW5nbGUgICAgc3RhcnRfYW5nbGU7Ci0gICAgRlRfQm9vbCAgICAgZmlyc3RfYXJjID0gMTsKLQotCi0gICAgYXJjICAgID0gYmV6X3N0YWNrOwotICAgIGFyY1swXSA9ICp0bzsKLSAgICBhcmNbMV0gPSAqY29udHJvbDsKLSAgICBhcmNbMl0gPSBzdHJva2VyLT5jZW50ZXI7Ci0KLSAgICB3aGlsZSAoIGFyYyA+PSBiZXpfc3RhY2sgKQotICAgIHsKLSAgICAgIEZUX0FuZ2xlICBhbmdsZV9pbiwgYW5nbGVfb3V0OwotCi0KLSAgICAgIGFuZ2xlX2luID0gYW5nbGVfb3V0ID0gMDsgIC8qIHJlbW92ZSBjb21waWxlciB3YXJuaW5ncyAqLwotCi0gICAgICBpZiAoIGFyYyA8IGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgIWZ0X2NvbmljX2lzX3NtYWxsX2Vub3VnaCggYXJjLCAmYW5nbGVfaW4sICZhbmdsZV9vdXQgKSApCi0gICAgICB7Ci0gICAgICAgIGZ0X2NvbmljX3NwbGl0KCBhcmMgKTsKLSAgICAgICAgYXJjICs9IDI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGZpcnN0X2FyYyApCi0gICAgICB7Ci0gICAgICAgIGZpcnN0X2FyYyA9IDA7Ci0KLSAgICAgICAgc3RhcnRfYW5nbGUgPSBhbmdsZV9pbjsKLQotICAgICAgICAvKiBwcm9jZXNzIGNvcm5lciBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgaWYgKCBzdHJva2VyLT5maXJzdF9wb2ludCApCi0gICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3N1YnBhdGhfc3RhcnQoIHN0cm9rZXIsIHN0YXJ0X2FuZ2xlICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX291dCA9IHN0YXJ0X2FuZ2xlOwotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9wcm9jZXNzX2Nvcm5lciggc3Ryb2tlciApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRoZSBhcmMncyBhbmdsZSBpcyBzbWFsbCBlbm91Z2g7IHdlIGNhbiBhZGQgaXQgZGlyZWN0bHkgdG8gZWFjaCAqLwotICAgICAgLyogYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgY3RybCwgZW5kOwotICAgICAgICBGVF9BbmdsZSAgIHRoZXRhLCBwaGksIHJvdGF0ZTsKLSAgICAgICAgRlRfRml4ZWQgICBsZW5ndGg7Ci0gICAgICAgIEZUX0ludCAgICAgc2lkZTsKLQotCi0gICAgICAgIHRoZXRhICA9IEZUX0FuZ2xlX0RpZmYoIGFuZ2xlX2luLCBhbmdsZV9vdXQgKSAvIDI7Ci0gICAgICAgIHBoaSAgICA9IGFuZ2xlX2luICsgdGhldGE7Ci0gICAgICAgIGxlbmd0aCA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCBGVF9Db3MoIHRoZXRhICkgKTsKLQotICAgICAgICBmb3IgKCBzaWRlID0gMDsgc2lkZSA8PSAxOyBzaWRlKysgKQotICAgICAgICB7Ci0gICAgICAgICAgcm90YXRlID0gRlRfU0lERV9UT19ST1RBVEUoIHNpZGUgKTsKLQotICAgICAgICAgIC8qIGNvbXB1dGUgY29udHJvbCBwb2ludCAqLwotICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmY3RybCwgbGVuZ3RoLCBwaGkgKyByb3RhdGUgKTsKLSAgICAgICAgICBjdHJsLnggKz0gYXJjWzFdLng7Ci0gICAgICAgICAgY3RybC55ICs9IGFyY1sxXS55OwotCi0gICAgICAgICAgLyogY29tcHV0ZSBlbmQgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmVuZCwgc3Ryb2tlci0+cmFkaXVzLCBhbmdsZV9vdXQgKyByb3RhdGUgKTsKLSAgICAgICAgICBlbmQueCArPSBhcmNbMF0ueDsKLSAgICAgICAgICBlbmQueSArPSBhcmNbMF0ueTsKLQotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9jb25pY3RvKCBzdHJva2VyLT5ib3JkZXJzICsgc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0cmwsICZlbmQgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBhcmMgLT0gMjsKLQotICAgICAgaWYgKCBhcmMgPCBiZXpfc3RhY2sgKQotICAgICAgICBzdHJva2VyLT5hbmdsZV9pbiA9IGFuZ2xlX291dDsKLSAgICB9Ci0KLSAgICBzdHJva2VyLT5jZW50ZXIgPSAqdG87Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9DdWJpY1RvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gMDsKLSAgICBGVF9WZWN0b3IgICBiZXpfc3RhY2tbMzddOwotICAgIEZUX1ZlY3RvciogIGFyYzsKLSAgICBGVF9WZWN0b3IqICBsaW1pdCA9IGJlel9zdGFjayArIDMyOwotICAgIEZUX0FuZ2xlICAgIHN0YXJ0X2FuZ2xlOwotICAgIEZUX0Jvb2wgICAgIGZpcnN0X2FyYyA9IDE7Ci0KLQotICAgIGFyYyAgICA9IGJlel9zdGFjazsKLSAgICBhcmNbMF0gPSAqdG87Ci0gICAgYXJjWzFdID0gKmNvbnRyb2wyOwotICAgIGFyY1syXSA9ICpjb250cm9sMTsKLSAgICBhcmNbM10gPSBzdHJva2VyLT5jZW50ZXI7Ci0KLSAgICB3aGlsZSAoIGFyYyA+PSBiZXpfc3RhY2sgKQotICAgIHsKLSAgICAgIEZUX0FuZ2xlICBhbmdsZV9pbiwgYW5nbGVfbWlkLCBhbmdsZV9vdXQ7Ci0KLQotICAgICAgLyogcmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmdzICovCi0gICAgICBhbmdsZV9pbiA9IGFuZ2xlX291dCA9IGFuZ2xlX21pZCA9IDA7Ci0KLSAgICAgIGlmICggYXJjIDwgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICFmdF9jdWJpY19pc19zbWFsbF9lbm91Z2goIGFyYywgJmFuZ2xlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5nbGVfbWlkLCAmYW5nbGVfb3V0ICkgKQotICAgICAgewotICAgICAgICBmdF9jdWJpY19zcGxpdCggYXJjICk7Ci0gICAgICAgIGFyYyArPSAzOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBmaXJzdF9hcmMgKQotICAgICAgewotICAgICAgICBmaXJzdF9hcmMgPSAwOwotCi0gICAgICAgIC8qIHByb2Nlc3MgY29ybmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICBzdGFydF9hbmdsZSA9IGFuZ2xlX2luOwotCi0gICAgICAgIGlmICggc3Ryb2tlci0+Zmlyc3RfcG9pbnQgKQotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9zdWJwYXRoX3N0YXJ0KCBzdHJva2VyLCBzdGFydF9hbmdsZSApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJva2VyLT5hbmdsZV9vdXQgPSBzdGFydF9hbmdsZTsKLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfcHJvY2Vzc19jb3JuZXIoIHN0cm9rZXIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRoZSBhcmMncyBhbmdsZSBpcyBzbWFsbCBlbm91Z2g7IHdlIGNhbiBhZGQgaXQgZGlyZWN0bHkgdG8gZWFjaCAqLwotICAgICAgLyogYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgY3RybDEsIGN0cmwyLCBlbmQ7Ci0gICAgICAgIEZUX0FuZ2xlICAgdGhldGExLCBwaGkxLCB0aGV0YTIsIHBoaTIsIHJvdGF0ZTsKLSAgICAgICAgRlRfRml4ZWQgICBsZW5ndGgxLCBsZW5ndGgyOwotICAgICAgICBGVF9JbnQgICAgIHNpZGU7Ci0KLQotICAgICAgICB0aGV0YTEgID0gZnRfcG9zX2FicyggYW5nbGVfbWlkIC0gYW5nbGVfaW4gKSAvIDI7Ci0gICAgICAgIHRoZXRhMiAgPSBmdF9wb3NfYWJzKCBhbmdsZV9vdXQgLSBhbmdsZV9taWQgKSAvIDI7Ci0gICAgICAgIHBoaTEgICAgPSAoYW5nbGVfbWlkICsgYW5nbGVfaW4gKSAvIDI7Ci0gICAgICAgIHBoaTIgICAgPSAoYW5nbGVfbWlkICsgYW5nbGVfb3V0ICkgLyAyOwotICAgICAgICBsZW5ndGgxID0gRlRfRGl2Rml4KCBzdHJva2VyLT5yYWRpdXMsIEZUX0NvcyggdGhldGExICkgKTsKLSAgICAgICAgbGVuZ3RoMiA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCBGVF9Db3ModGhldGEyKSApOwotCi0gICAgICAgIGZvciAoIHNpZGUgPSAwOyBzaWRlIDw9IDE7IHNpZGUrKyApCi0gICAgICAgIHsKLSAgICAgICAgICByb3RhdGUgPSBGVF9TSURFX1RPX1JPVEFURSggc2lkZSApOwotCi0gICAgICAgICAgLyogY29tcHV0ZSBjb250cm9sIHBvaW50cyAqLwotICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmY3RybDEsIGxlbmd0aDEsIHBoaTEgKyByb3RhdGUgKTsKLSAgICAgICAgICBjdHJsMS54ICs9IGFyY1syXS54OwotICAgICAgICAgIGN0cmwxLnkgKz0gYXJjWzJdLnk7Ci0KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmN0cmwyLCBsZW5ndGgyLCBwaGkyICsgcm90YXRlICk7Ci0gICAgICAgICAgY3RybDIueCArPSBhcmNbMV0ueDsKLSAgICAgICAgICBjdHJsMi55ICs9IGFyY1sxXS55OwotCi0gICAgICAgICAgLyogY29tcHV0ZSBlbmQgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmVuZCwgc3Ryb2tlci0+cmFkaXVzLCBhbmdsZV9vdXQgKyByb3RhdGUgKTsKLSAgICAgICAgICBlbmQueCArPSBhcmNbMF0ueDsKLSAgICAgICAgICBlbmQueSArPSBhcmNbMF0ueTsKLQotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9jdWJpY3RvKCBzdHJva2VyLT5ib3JkZXJzICsgc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0cmwxLCAmY3RybDIsICZlbmQgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBhcmMgLT0gMzsKLSAgICAgIGlmICggYXJjIDwgYmV6X3N0YWNrICkKLSAgICAgICAgc3Ryb2tlci0+YW5nbGVfaW4gPSBhbmdsZV9vdXQ7Ci0gICAgfQotCi0gICAgc3Ryb2tlci0+Y2VudGVyID0gKnRvOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBvcGVuICkKLSAgewotICAgIC8qIFdlIGNhbm5vdCBwcm9jZXNzIHRoZSBmaXJzdCBwb2ludCwgYmVjYXVzZSB0aGVyZSBpcyBub3QgZW5vdWdoICAgICAgKi8KLSAgICAvKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgaXRzIGNvcm5lci9jYXAuICBUaGUgbGF0dGVyIHdpbGwgYmUgcHJvY2Vzc2VkICovCi0gICAgLyogaW4gdGhlICJlbmRfc3VicGF0aCIgcm91dGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBzdHJva2VyLT5maXJzdF9wb2ludCAgID0gMTsKLSAgICBzdHJva2VyLT5jZW50ZXIgICAgICAgID0gKnRvOwotICAgIHN0cm9rZXItPnN1YnBhdGhfb3BlbiAgPSBvcGVuOwotCi0gICAgLyogcmVjb3JkIHRoZSBzdWJwYXRoIHN0YXJ0IHBvaW50IGluZGV4IGZvciBlYWNoIGJvcmRlciAqLwotICAgIHN0cm9rZXItPnN1YnBhdGhfc3RhcnQgPSAqdG87Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX2FkZF9yZXZlcnNlX2xlZnQoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgb3BlbiApCi0gIHsKLSAgICBGVF9TdHJva2VCb3JkZXIgIHJpZ2h0ICA9IHN0cm9rZXItPmJvcmRlcnMgKyAwOwotICAgIEZUX1N0cm9rZUJvcmRlciAgbGVmdCAgID0gc3Ryb2tlci0+Ym9yZGVycyArIDE7Ci0gICAgRlRfSW50ICAgICAgICAgICBuZXdfcG9pbnRzOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgID0gMDsKLQotCi0gICAgRlRfQVNTRVJUKCBsZWZ0LT5zdGFydCA+PSAwICk7Ci0KLSAgICBuZXdfcG9pbnRzID0gbGVmdC0+bnVtX3BvaW50cyAtIGxlZnQtPnN0YXJ0OwotICAgIGlmICggbmV3X3BvaW50cyA+IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9ncm93KCByaWdodCwgKEZUX1VJbnQpbmV3X3BvaW50cyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICBkc3RfcG9pbnQgPSByaWdodC0+cG9pbnRzICsgcmlnaHQtPm51bV9wb2ludHM7Ci0gICAgICAgIEZUX0J5dGUqICAgIGRzdF90YWcgICA9IHJpZ2h0LT50YWdzICAgKyByaWdodC0+bnVtX3BvaW50czsKLSAgICAgICAgRlRfVmVjdG9yKiAgc3JjX3BvaW50ID0gbGVmdC0+cG9pbnRzICArIGxlZnQtPm51bV9wb2ludHMgLSAxOwotICAgICAgICBGVF9CeXRlKiAgICBzcmNfdGFnICAgPSBsZWZ0LT50YWdzICAgICsgbGVmdC0+bnVtX3BvaW50cyAtIDE7Ci0KLSAgICAgICAgd2hpbGUgKCBzcmNfcG9pbnQgPj0gbGVmdC0+cG9pbnRzICsgbGVmdC0+c3RhcnQgKQotICAgICAgICB7Ci0gICAgICAgICAgKmRzdF9wb2ludCA9ICpzcmNfcG9pbnQ7Ci0gICAgICAgICAgKmRzdF90YWcgICA9ICpzcmNfdGFnOwotCi0gICAgICAgICAgaWYgKCBvcGVuICkKLSAgICAgICAgICAgIGRzdF90YWdbMF0gJj0gfkZUX1NUUk9LRV9UQUdfQkVHSU5fRU5EOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9CeXRlICB0dGFnID0gKEZUX0J5dGUpKCBkc3RfdGFnWzBdICYgRlRfU1RST0tFX1RBR19CRUdJTl9FTkQgKTsKLQotCi0gICAgICAgICAgICAvKiBzd2l0Y2ggYmVnaW4vZW5kIHRhZ3MgaWYgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICBpZiAoIHR0YWcgPT0gRlRfU1RST0tFX1RBR19CRUdJTiB8fAotICAgICAgICAgICAgICAgICB0dGFnID09IEZUX1NUUk9LRV9UQUdfRU5EICAgKQotICAgICAgICAgICAgICBkc3RfdGFnWzBdIF49IEZUX1NUUk9LRV9UQUdfQkVHSU5fRU5EOwotCi0gICAgICAgICAgfQotCi0gICAgICAgICAgc3JjX3BvaW50LS07Ci0gICAgICAgICAgc3JjX3RhZy0tOwotICAgICAgICAgIGRzdF9wb2ludCsrOwotICAgICAgICAgIGRzdF90YWcrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBsZWZ0LT5udW1fcG9pbnRzICAgPSBsZWZ0LT5zdGFydDsKLSAgICAgIHJpZ2h0LT5udW1fcG9pbnRzICs9IG5ld19wb2ludHM7Ci0KLSAgICAgIHJpZ2h0LT5tb3ZhYmxlID0gMDsKLSAgICAgIGxlZnQtPm1vdmFibGUgID0gMDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIC8qIHRoZXJlJ3MgYSBsb3Qgb2YgbWFnaWMgaW4gdGhpcyBmdW5jdGlvbiEgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0VuZFN1YlBhdGgoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yICA9IDA7Ci0KLSAgICBpZiAoIHN0cm9rZXItPnN1YnBhdGhfb3BlbiApCi0gICAgewotICAgICAgRlRfU3Ryb2tlQm9yZGVyICByaWdodCA9IHN0cm9rZXItPmJvcmRlcnM7Ci0KLSAgICAgIC8qIEFsbCByaWdodCwgdGhpcyBpcyBhbiBvcGVuZWQgcGF0aCwgd2UgbmVlZCB0byBhZGQgYSBjYXAgYmV0d2VlbiAqLwotICAgICAgLyogcmlnaHQgJiBsZWZ0LCBhZGQgdGhlIHJldmVyc2Ugb2YgbGVmdCwgdGhlbiBhZGQgYSBmaW5hbCBjYXAgICAgICovCi0gICAgICAvKiBiZXR3ZWVuIGxlZnQgJiByaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9jYXAoIHN0cm9rZXIsIHN0cm9rZXItPmFuZ2xlX2luLCAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBhZGQgcmV2ZXJzZWQgcG9pbnRzIGZyb20gImxlZnQiIHRvICJyaWdodCIgKi8KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9hZGRfcmV2ZXJzZV9sZWZ0KCBzdHJva2VyLCAxICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBub3cgYWRkIHRoZSBmaW5hbCBjYXAgKi8KLSAgICAgIHN0cm9rZXItPmNlbnRlciA9IHN0cm9rZXItPnN1YnBhdGhfc3RhcnQ7Ci0gICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfY2FwKCBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+c3VicGF0aF9hbmdsZSArIEZUX0FOR0xFX1BJLCAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBOb3cgZW5kIHRoZSByaWdodCBzdWJwYXRoIGFjY29yZGluZ2x5LiAgVGhlIGxlZnQgb25lIGlzICovCi0gICAgICAvKiByZXdpbmQgYW5kIGRvZXNuJ3QgbmVlZCBmdXJ0aGVyIHByb2Nlc3NpbmcuICAgICAgICAgICAgICovCi0gICAgICBmdF9zdHJva2VfYm9yZGVyX2Nsb3NlKCByaWdodCwgMCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfQW5nbGUgIHR1cm47Ci0gICAgICBGVF9JbnQgICAgaW5zaWRlX3NpZGU7Ci0KLSAgICAgIC8qIGNsb3NlIHRoZSBwYXRoIGlmIG5lZWRlZCAqLwotICAgICAgaWYgKCBzdHJva2VyLT5jZW50ZXIueCAhPSBzdHJva2VyLT5zdWJwYXRoX3N0YXJ0LnggfHwKLSAgICAgICAgICAgc3Ryb2tlci0+Y2VudGVyLnkgIT0gc3Ryb2tlci0+c3VicGF0aF9zdGFydC55ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0xpbmVUbyggc3Ryb2tlciwgJnN0cm9rZXItPnN1YnBhdGhfc3RhcnQgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBwcm9jZXNzIHRoZSBjb3JuZXIgKi8KLSAgICAgIHN0cm9rZXItPmFuZ2xlX291dCA9IHN0cm9rZXItPnN1YnBhdGhfYW5nbGU7Ci0gICAgICB0dXJuICAgICAgICAgICAgICAgPSBGVF9BbmdsZV9EaWZmKCBzdHJva2VyLT5hbmdsZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX291dCApOwotCi0gICAgICAvKiBubyBzcGVjaWZpYyBjb3JuZXIgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCBpZiB0aGUgdHVybiBpcyAwICovCi0gICAgICBpZiAoIHR1cm4gIT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIHdoZW4gd2UgdHVybiB0byB0aGUgcmlnaHQsIHRoZSBpbnNpZGUgc2lkZSBpcyAwICovCi0gICAgICAgIGluc2lkZV9zaWRlID0gMDsKLQotICAgICAgICAvKiBvdGhlcndpc2UsIHRoZSBpbnNpZGUgc2lkZSBpcyAxICovCi0gICAgICAgIGlmICggdHVybiA8IDAgKQotICAgICAgICAgIGluc2lkZV9zaWRlID0gMTsKLQotICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfaW5zaWRlKCBzdHJva2VyLCBpbnNpZGVfc2lkZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogcHJvY2VzcyB0aGUgb3V0c2lkZSBzaWRlICovCi0gICAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9vdXRzaWRlKCBzdHJva2VyLCAxIC0gaW5zaWRlX3NpZGUgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiB0aGVuIGVuZCBvdXIgdHdvIHN1YnBhdGhzICovCi0gICAgICBmdF9zdHJva2VfYm9yZGVyX2Nsb3NlKCBzdHJva2VyLT5ib3JkZXJzICsgMCwgMSApOwotICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9jbG9zZSggc3Ryb2tlci0+Ym9yZGVycyArIDEsIDAgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMoIEZUX1N0cm9rZXIgICAgICAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICphbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgKmFudW1fY29udG91cnMgKQotICB7Ci0gICAgRlRfVUludCAgIG51bV9wb2ludHMgPSAwLCBudW1fY29udG91cnMgPSAwOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgaWYgKCAhc3Ryb2tlciB8fCBib3JkZXIgPiAxICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9nZXRfY291bnRzKCBzdHJva2VyLT5ib3JkZXJzICsgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX3BvaW50cywgJm51bV9jb250b3VycyApOwotICBFeGl0OgotICAgIGlmICggYW51bV9wb2ludHMgKQotICAgICAgKmFudW1fcG9pbnRzID0gbnVtX3BvaW50czsKLQotICAgIGlmICggYW51bV9jb250b3VycyApCi0gICAgICAqYW51bV9jb250b3VycyA9IG51bV9jb250b3VyczsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0dldENvdW50cyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgKmFudW1fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAqYW51bV9jb250b3VycyApCi0gIHsKLSAgICBGVF9VSW50ICAgY291bnQxLCBjb3VudDIsIG51bV9wb2ludHMgICA9IDA7Ci0gICAgRlRfVUludCAgIGNvdW50MywgY291bnQ0LCBudW1fY29udG91cnMgPSAwOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2dldF9jb3VudHMoIHN0cm9rZXItPmJvcmRlcnMgKyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQxLCAmY291bnQyICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfZ2V0X2NvdW50cyggc3Ryb2tlci0+Ym9yZGVycyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudDMsICZjb3VudDQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG51bV9wb2ludHMgICA9IGNvdW50MSArIGNvdW50MzsKLSAgICBudW1fY29udG91cnMgPSBjb3VudDIgKyBjb3VudDQ7Ci0KLSAgRXhpdDoKLSAgICAqYW51bV9wb2ludHMgICA9IG51bV9wb2ludHM7Ci0gICAgKmFudW1fY29udG91cnMgPSBudW1fY29udG91cnM7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIoIEZUX1N0cm9rZXIgICAgICAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICBvdXRsaW5lICkKLSAgewotICAgIGlmICggYm9yZGVyID09IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgIHx8Ci0gICAgICAgICBib3JkZXIgPT0gRlRfU1RST0tFUl9CT1JERVJfUklHSFQgKQotICAgIHsKLSAgICAgIEZUX1N0cm9rZUJvcmRlciAgc2JvcmRlciA9ICYgc3Ryb2tlci0+Ym9yZGVyc1tib3JkZXJdOwotCi0KLSAgICAgIGlmICggc2JvcmRlci0+dmFsaWQgKQotICAgICAgICBmdF9zdHJva2VfYm9yZGVyX2V4cG9ydCggc2JvcmRlciwgb3V0bGluZSApOwotICAgIH0KLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0KCBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBzdHJva2VyLCBGVF9TVFJPS0VSX0JPUkRFUl9MRUZULCBvdXRsaW5lICk7Ci0gICAgRlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIoIHN0cm9rZXIsIEZUX1NUUk9LRVJfQk9SREVSX1JJR0hULCBvdXRsaW5lICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIGlzIHZlcnkgc2ltaWxhciB0byBGVF9PdXRsaW5lX0RlY29tcG9zZSwgZXhjZXB0Ci0gICAqICB0aGF0IHdlIGRvIHN1cHBvcnQgb3BlbmVkIHBhdGhzLCBhbmQgZG8gbm90IHNjYWxlIHRoZSBvdXRsaW5lLgotICAgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBvcGVuZWQgKQotICB7Ci0gICAgRlRfVmVjdG9yICAgdl9sYXN0OwotICAgIEZUX1ZlY3RvciAgIHZfY29udHJvbDsKLSAgICBGVF9WZWN0b3IgICB2X3N0YXJ0OwotCi0gICAgRlRfVmVjdG9yKiAgcG9pbnQ7Ci0gICAgRlRfVmVjdG9yKiAgbGltaXQ7Ci0gICAgY2hhciogICAgICAgdGFnczsKLQotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0gICAgRlRfSW50ICAgbjsgICAgICAgICAvKiBpbmRleCBvZiBjb250b3VyIGluIG91dGxpbmUgICAgICovCi0gICAgRlRfVUludCAgZmlyc3Q7ICAgICAvKiBpbmRleCBvZiBmaXJzdCBwb2ludCBpbiBjb250b3VyICovCi0gICAgRlRfSW50ICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCi0KLQotICAgIGlmICggIW91dGxpbmUgfHwgIXN0cm9rZXIgKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgRlRfU3Ryb2tlcl9SZXdpbmQoIHN0cm9rZXIgKTsKLQotICAgIGZpcnN0ID0gMDsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0bGluZS0+bl9jb250b3VyczsgbisrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBsYXN0OyAgLyogaW5kZXggb2YgbGFzdCBwb2ludCBpbiBjb250b3VyICovCi0KLQotICAgICAgbGFzdCAgPSBvdXRsaW5lLT5jb250b3Vyc1tuXTsKLSAgICAgIGxpbWl0ID0gb3V0bGluZS0+cG9pbnRzICsgbGFzdDsKLQotICAgICAgLyogc2tpcCBlbXB0eSBwb2ludHM7IHdlIGRvbid0IHN0cm9rZSB0aGVzZSAqLwotICAgICAgaWYgKCBsYXN0IDw9IGZpcnN0ICkKLSAgICAgIHsKLSAgICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHZfc3RhcnQgPSBvdXRsaW5lLT5wb2ludHNbZmlyc3RdOwotICAgICAgdl9sYXN0ICA9IG91dGxpbmUtPnBvaW50c1tsYXN0XTsKLQotICAgICAgdl9jb250cm9sID0gdl9zdGFydDsKLQotICAgICAgcG9pbnQgPSBvdXRsaW5lLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgIHRhZ3MgID0gb3V0bGluZS0+dGFncyAgKyBmaXJzdDsKLSAgICAgIHRhZyAgID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0KLSAgICAgIC8qIEEgY29udG91ciBjYW5ub3Qgc3RhcnQgd2l0aCBhIGN1YmljIGNvbnRyb2wgcG9pbnQhICovCi0gICAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgLyogY2hlY2sgZmlyc3QgcG9pbnQgdG8gZGV0ZXJtaW5lIG9yaWdpbiAqLwotICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICAgIHsKLSAgICAgICAgLyogRmlyc3QgcG9pbnQgaXMgY29uaWMgY29udHJvbC4gIFllcywgdGhpcyBoYXBwZW5zLiAqLwotICAgICAgICBpZiAoIEZUX0NVUlZFX1RBRyggb3V0bGluZS0+dGFnc1tsYXN0XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBzdGFydCBhdCBsYXN0IHBvaW50IGlmIGl0IGlzIG9uIHRoZSBjdXJ2ZSAqLwotICAgICAgICAgIHZfc3RhcnQgPSB2X2xhc3Q7Ci0gICAgICAgICAgbGltaXQtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBpZiBib3RoIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgY29uaWMsICAgICAgICAgKi8KLSAgICAgICAgICAvKiBzdGFydCBhdCB0aGVpciBtaWRkbGUgYW5kIHJlY29yZCBpdHMgcG9zaXRpb24gICAgKi8KLSAgICAgICAgICAvKiBmb3IgY2xvc3VyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICB2X3N0YXJ0LnggPSAoIHZfc3RhcnQueCArIHZfbGFzdC54ICkgLyAyOwotICAgICAgICAgIHZfc3RhcnQueSA9ICggdl9zdGFydC55ICsgdl9sYXN0LnkgKSAvIDI7Ci0KLSAgICAgICAgICB2X2xhc3QgPSB2X3N0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHBvaW50LS07Ci0gICAgICAgIHRhZ3MtLTsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCggc3Ryb2tlciwgJnZfc3RhcnQsIG9wZW5lZCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgd2hpbGUgKCBwb2ludCA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQrKzsKLSAgICAgICAgdGFncysrOwotCi0gICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotICAgICAgICBzd2l0Y2ggKCB0YWcgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX09OOiAgLyogZW1pdCBhIHNpbmdsZSBsaW5lX3RvICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICAgICAgdmVjLnggPSBwb2ludC0+eDsKLSAgICAgICAgICAgIHZlYy55ID0gcG9pbnQtPnk7Ci0KLSAgICAgICAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9MaW5lVG8oIHN0cm9rZXIsICZ2ZWMgKTsKLSAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGVF9DVVJWRV9UQUdfQ09OSUM6ICAvKiBjb25zdW1lIGNvbmljIGFyY3MgKi8KLSAgICAgICAgICB2X2NvbnRyb2wueCA9IHBvaW50LT54OwotICAgICAgICAgIHZfY29udHJvbC55ID0gcG9pbnQtPnk7Ci0KLSAgICAgICAgRG9fQ29uaWM6Ci0gICAgICAgICAgaWYgKCBwb2ludCA8IGxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdl9taWRkbGU7Ci0KLQotICAgICAgICAgICAgcG9pbnQrKzsKLSAgICAgICAgICAgIHRhZ3MrKzsKLSAgICAgICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgICAgICAgICB2ZWMgPSBwb2ludFswXTsKLQotICAgICAgICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0NvbmljVG8oIHN0cm9rZXIsICZ2X2NvbnRyb2wsICZ2ZWMgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCB0YWcgIT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICAgICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgICAgIHZfbWlkZGxlLnggPSAoIHZfY29udHJvbC54ICsgdmVjLnggKSAvIDI7Ci0gICAgICAgICAgICB2X21pZGRsZS55ID0gKCB2X2NvbnRyb2wueSArIHZlYy55ICkgLyAyOwotCi0gICAgICAgICAgICBlcnJvciA9IEZUX1N0cm9rZXJfQ29uaWNUbyggc3Ryb2tlciwgJnZfY29udHJvbCwgJnZfbWlkZGxlICk7Ci0gICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICB2X2NvbnRyb2wgPSB2ZWM7Ci0gICAgICAgICAgICBnb3RvIERvX0NvbmljOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9Db25pY1RvKCBzdHJva2VyLCAmdl9jb250cm9sLCAmdl9zdGFydCApOwotICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0KLSAgICAgICAgZGVmYXVsdDogIC8qIEZUX0NVUlZFX1RBR19DVUJJQyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjMSwgdmVjMjsKLQotCi0gICAgICAgICAgICBpZiAoIHBvaW50ICsgMSA+IGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBGVF9DVVJWRV9UQUcoIHRhZ3NbMV0gKSAhPSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgICAgcG9pbnQgKz0gMjsKLSAgICAgICAgICAgIHRhZ3MgICs9IDI7Ci0KLSAgICAgICAgICAgIHZlYzEgPSBwb2ludFstMl07Ci0gICAgICAgICAgICB2ZWMyID0gcG9pbnRbLTFdOwotCi0gICAgICAgICAgICBpZiAoIHBvaW50IDw9IGxpbWl0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICAgICAgICB2ZWMgPSBwb2ludFswXTsKLQotICAgICAgICAgICAgICBlcnJvciA9IEZUX1N0cm9rZXJfQ3ViaWNUbyggc3Ryb2tlciwgJnZlYzEsICZ2ZWMyLCAmdmVjICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9DdWJpY1RvKCBzdHJva2VyLCAmdmVjMSwgJnZlYzIsICZ2X3N0YXJ0ICk7Ci0gICAgICAgICAgICBnb3RvIENsb3NlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgQ2xvc2U6Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IEZUX1N0cm9rZXJfRW5kU3ViUGF0aCggc3Ryb2tlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBJbnZhbGlkX091dGxpbmU6Ci0gICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX091dGxpbmU7Ci0gIH0KLQotCi0gIGV4dGVybiBjb25zdCBGVF9HbHlwaF9DbGFzcyAgZnRfb3V0bGluZV9nbHlwaF9jbGFzczsKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhfU3Ryb2tlKCBGVF9HbHlwaCAgICAqcGdseXBoLAotICAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXIgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBkZXN0cm95ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgIEZUX0dseXBoICBnbHlwaCA9IE5VTEw7Ci0KLQotICAgIGlmICggcGdseXBoID09IE5VTEwgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ2x5cGggPSAqcGdseXBoOwotICAgIGlmICggZ2x5cGggPT0gTlVMTCB8fCBnbHlwaC0+Y2xhenogIT0gJmZ0X291dGxpbmVfZ2x5cGhfY2xhc3MgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgewotICAgICAgRlRfR2x5cGggIGNvcHk7Ci0KLQotICAgICAgZXJyb3IgPSBGVF9HbHlwaF9Db3B5KCBnbHlwaCwgJmNvcHkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGdseXBoID0gY29weTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBGVF9PdXRsaW5lR2x5cGggIG9nbHlwaCAgPSAoRlRfT3V0bGluZUdseXBoKSBnbHlwaDsKLSAgICAgIEZUX091dGxpbmUqICAgICAgb3V0bGluZSA9ICZvZ2x5cGgtPm91dGxpbmU7Ci0gICAgICBGVF9VSW50ICAgICAgICAgIG51bV9wb2ludHMsIG51bV9jb250b3VyczsKLQotCi0gICAgICBlcnJvciA9IEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lKCBzdHJva2VyLCBvdXRsaW5lLCAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAodm9pZClGVF9TdHJva2VyX0dldENvdW50cyggc3Ryb2tlciwgJm51bV9wb2ludHMsICZudW1fY29udG91cnMgKTsKLQotICAgICAgRlRfT3V0bGluZV9Eb25lKCBnbHlwaC0+bGlicmFyeSwgb3V0bGluZSApOwotCi0gICAgICBlcnJvciA9IEZUX091dGxpbmVfTmV3KCBnbHlwaC0+bGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMsIG51bV9jb250b3Vycywgb3V0bGluZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgb3V0bGluZS0+bl9wb2ludHMgICA9IDA7Ci0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzID0gMDsKLQotICAgICAgRlRfU3Ryb2tlcl9FeHBvcnQoIHN0cm9rZXIsIG91dGxpbmUgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggKnBnbHlwaCApOwotCi0gICAgKnBnbHlwaCA9IGdseXBoOwotICAgIGdvdG8gRXhpdDsKLQotICBGYWlsOgotICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7Ci0gICAgZ2x5cGggPSBOVUxMOwotCi0gICAgaWYgKCAhZGVzdHJveSApCi0gICAgICAqcGdseXBoID0gTlVMTDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9TdHJva2VCb3JkZXIoIEZUX0dseXBoICAgICpwZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGluc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICBGVF9HbHlwaCAgZ2x5cGggPSBOVUxMOwotCi0KLSAgICBpZiAoIHBnbHlwaCA9PSBOVUxMICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGdseXBoID0gKnBnbHlwaDsKLSAgICBpZiAoIGdseXBoID09IE5VTEwgfHwgZ2x5cGgtPmNsYXp6ICE9ICZmdF9vdXRsaW5lX2dseXBoX2NsYXNzICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHsKLSAgICAgIEZUX0dseXBoICBjb3B5OwotCi0KLSAgICAgIGVycm9yID0gRlRfR2x5cGhfQ29weSggZ2x5cGgsICZjb3B5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBnbHlwaCA9IGNvcHk7Ci0gICAgfQotCi0gICAgewotICAgICAgRlRfT3V0bGluZUdseXBoICAgb2dseXBoICA9IChGVF9PdXRsaW5lR2x5cGgpIGdseXBoOwotICAgICAgRlRfU3Ryb2tlckJvcmRlciAgYm9yZGVyOwotICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSA9ICZvZ2x5cGgtPm91dGxpbmU7Ci0gICAgICBGVF9VSW50ICAgICAgICAgICBudW1fcG9pbnRzLCBudW1fY29udG91cnM7Ci0KLQotICAgICAgYm9yZGVyID0gRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyKCBvdXRsaW5lICk7Ci0gICAgICBpZiAoIGluc2lkZSApCi0gICAgICB7Ci0gICAgICAgIGlmICggYm9yZGVyID09IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgKQotICAgICAgICAgIGJvcmRlciA9IEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYm9yZGVyID0gRlRfU1RST0tFUl9CT1JERVJfTEVGVDsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggc3Ryb2tlciwgb3V0bGluZSwgMCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgKHZvaWQpRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMoIHN0cm9rZXIsIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX3BvaW50cywgJm51bV9jb250b3VycyApOwotCi0gICAgICBGVF9PdXRsaW5lX0RvbmUoIGdseXBoLT5saWJyYXJ5LCBvdXRsaW5lICk7Ci0KLSAgICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGdseXBoLT5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIG91dGxpbmUtPm5fcG9pbnRzICAgPSAwOwotICAgICAgb3V0bGluZS0+bl9jb250b3VycyA9IDA7Ci0KLSAgICAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBzdHJva2VyLCBib3JkZXIsIG91dGxpbmUgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggKnBnbHlwaCApOwotCi0gICAgKnBnbHlwaCA9IGdseXBoOwotICAgIGdvdG8gRXhpdDsKLQotICBGYWlsOgotICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7Ci0gICAgZ2x5cGggPSBOVUxMOwotCi0gICAgaWYgKCAhZGVzdHJveSApCi0gICAgICAqcGdseXBoID0gTlVMTDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRzeW50aC5jIGIvc3JjL2Jhc2UvZnRzeW50aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjg4Y2U5Li4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0c3ludGguYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN5bnRoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc3ludGhlc2l6aW5nIGNvZGUgZm9yIGVtYm9sZGVuaW5nIGFuZCBzbGFudGluZyAoYm9keSkuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfU1lOVEhFU0lTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICBFWFBFUklNRU5UQUwgT0JMSVFVSU5HIFNVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN5bnRoLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfR2x5cGhTbG90X09ibGlxdWUoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBGVF9NYXRyaXggICAgdHJhbnNmb3JtOwotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gJnNsb3QtPm91dGxpbmU7Ci0KLQotICAgIC8qIG9ubHkgb2JsaXF1ZSBvdXRsaW5lIGdseXBocyAqLwotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKLSAgICAgIHJldHVybjsKLQotICAgIC8qIHdlIGRvbid0IHRvdWNoIHRoZSBhZHZhbmNlIHdpZHRoICovCi0KLSAgICAvKiBGb3IgaXRhbGljLCBzaW1wbHkgYXBwbHkgYSBzaGVhciB0cmFuc2Zvcm0sIHdpdGggYW4gYW5nbGUgKi8KLSAgICAvKiBvZiBhYm91dCAxMiBkZWdyZWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHRyYW5zZm9ybS54eCA9IDB4MTAwMDBMOwotICAgIHRyYW5zZm9ybS55eCA9IDB4MDAwMDBMOwotCi0gICAgdHJhbnNmb3JtLnh5ID0gMHgwNjAwMEw7Ci0gICAgdHJhbnNmb3JtLnl5ID0gMHgxMDAwMEw7Ci0KLSAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggb3V0bGluZSwgJnRyYW5zZm9ybSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgIEVYUEVSSU1FTlRBTCBFTUJPTERFTklORy9PVVRMSU5JTkcgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhTbG90X093bl9CaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBpZiAoIHNsb3QgJiYgc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgICAmJgotICAgICAgICAgISggc2xvdC0+aW50ZXJuYWwtPmZsYWdzICYgRlRfR0xZUEhfT1dOX0JJVE1BUCApICkKLSAgICB7Ci0gICAgICBGVF9CaXRtYXAgIGJpdG1hcDsKLSAgICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgICAgRlRfQml0bWFwX05ldyggJmJpdG1hcCApOwotICAgICAgZXJyb3IgPSBGVF9CaXRtYXBfQ29weSggc2xvdC0+bGlicmFyeSwgJnNsb3QtPmJpdG1hcCwgJmJpdG1hcCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgc2xvdC0+Yml0bWFwID0gYml0bWFwOwotICAgICAgc2xvdC0+aW50ZXJuYWwtPmZsYWdzIHw9IEZUX0dMWVBIX09XTl9CSVRNQVA7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN5bnRoLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfR2x5cGhTbG90X0VtYm9sZGVuKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IHNsb3QtPmxpYnJhcnk7Ci0gICAgRlRfRmFjZSAgICAgZmFjZSAgICA9IEZUX1NMT1RfRkFDRSggc2xvdCApOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX1BvcyAgICAgIHhzdHIsIHlzdHI7Ci0KLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICYmCi0gICAgICAgICBzbG90LT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBzb21lIHJlYXNvbmFibGUgc3RyZW5ndGggKi8KLSAgICB4c3RyID0gRlRfTXVsRml4KCBmYWNlLT51bml0c19wZXJfRU0sCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+c2l6ZS0+bWV0cmljcy55X3NjYWxlICkgLyAyNDsKLSAgICB5c3RyID0geHN0cjsKLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX091dGxpbmVfRW1ib2xkZW4oICZzbG90LT5vdXRsaW5lLCB4c3RyICk7Ci0gICAgICAvKiBpZ25vcmUgZXJyb3IgKi8KLQotICAgICAgLyogdGhpcyBpcyBtb3JlIHRoYW4gZW5vdWdoIGZvciBtb3N0IGdseXBoczsgaWYgeW91IG5lZWQgYWNjdXJhdGUgKi8KLSAgICAgIC8qIHZhbHVlcywgeW91IGhhdmUgdG8gY2FsbCBGVF9PdXRsaW5lX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICovCi0gICAgICB4c3RyID0geHN0ciAqIDI7Ci0gICAgICB5c3RyID0geHN0cjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICkKLSAgICB7Ci0gICAgICB4c3RyID0gRlRfUElYX0ZMT09SKCB4c3RyICk7Ci0gICAgICBpZiAoIHhzdHIgPT0gMCApCi0gICAgICAgIHhzdHIgPSAxIDw8IDY7Ci0gICAgICB5c3RyID0gRlRfUElYX0ZMT09SKCB5c3RyICk7Ci0KLSAgICAgIGVycm9yID0gRlRfR2x5cGhTbG90X093bl9CaXRtYXAoIHNsb3QgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIGVycm9yID0gRlRfQml0bWFwX0VtYm9sZGVuKCBsaWJyYXJ5LCAmc2xvdC0+Yml0bWFwLCB4c3RyLCB5c3RyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggc2xvdC0+YWR2YW5jZS54ICkKLSAgICAgIHNsb3QtPmFkdmFuY2UueCArPSB4c3RyOwotCi0gICAgaWYgKCBzbG90LT5hZHZhbmNlLnkgKQotICAgICAgc2xvdC0+YWR2YW5jZS55ICs9IHlzdHI7Ci0KLSAgICBzbG90LT5tZXRyaWNzLndpZHRoICAgICAgICArPSB4c3RyOwotICAgIHNsb3QtPm1ldHJpY3MuaGVpZ2h0ICAgICAgICs9IHlzdHI7Ci0gICAgc2xvdC0+bWV0cmljcy5ob3JpQmVhcmluZ1kgKz0geXN0cjsKLSAgICBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlICArPSB4c3RyOwotICAgIHNsb3QtPm1ldHJpY3MudmVydEJlYXJpbmdYIC09IHhzdHIgLyAyOwotICAgIHNsb3QtPm1ldHJpY3MudmVydEJlYXJpbmdZICs9IHlzdHI7Ci0gICAgc2xvdC0+bWV0cmljcy52ZXJ0QWR2YW5jZSAgKz0geXN0cjsKLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKQotICAgICAgc2xvdC0+Yml0bWFwX3RvcCArPSB5c3RyID4+IDY7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0c3lzdGVtLmMgYi9zcmMvYmFzZS9mdHN5c3RlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjFhM2VkLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0c3lzdGVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeXN0ZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFOU0ktc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmYXVsdCBpbnRlcmZhY2UgdXNlZCBieSBGcmVlVHlwZSB0byBhY2Nlc3MgICAqLwotICAvKiBsb3ctbGV2ZWwsIGkuZS4gbWVtb3J5IG1hbmFnZW1lbnQsIGkvbyBhY2Nlc3MgYXMgd2VsbCBhcyB0aHJlYWQgICAgICAgKi8KLSAgLyogc3luY2hyb25pc2F0aW9uLiAgSXQgY2FuIGJlIHJlcGxhY2VkIGJ5IHVzZXItc3BlY2lmaWMgcm91dGluZXMgaWYgICAgICovCi0gIC8qIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9TWVNURU1fSAotI2luY2x1ZGUgRlRfRVJST1JTX0gKLSNpbmNsdWRlIEZUX1RZUEVTX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZG8gYW55IGVycm9yIGNoZWNraW5nIGZvciB0aGUgICAgICAgICAgICAgICAgICAqLwotICAvKiBhbGxvY2F0aW9uLXJlbGF0ZWQgZnVuY3Rpb25zLiAgVGhpcyB3aWxsIGJlIGRvbmUgYnkgdGhlIGhpZ2hlciBsZXZlbCAgKi8KLSAgLyogcm91dGluZXMgbGlrZSBmdF9tZW1fYWxsb2MoKSBvciBmdF9tZW1fcmVhbGxvYygpLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgIDo6IFRoZSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkKLSAgZnRfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICkKLSAgewotICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0KLSAgICByZXR1cm4gZnRfc21hbGxvYyggc2l6ZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVtb3J5IHJlYWxsb2NhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cl9zaXplIDo6IFRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2suICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmV3X3NpemUgOjogVGhlIG5ld2x5IHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibG9jayAgICA6OiBUaGUgY3VycmVudCBhZGRyZXNzIG9mIHRoZSBibG9jayBpbiBtZW1vcnkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWRkcmVzcyBvZiB0aGUgcmVhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCogKQotICBmdF9yZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgbG9uZyAgICAgICBjdXJfc2l6ZSwKLSAgICAgICAgICAgICAgbG9uZyAgICAgICBuZXdfc2l6ZSwKLSAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwotICAgIEZUX1VOVVNFRCggY3VyX3NpemUgKTsKLQotICAgIHJldHVybiBmdF9zcmVhbGxvYyggYmxvY2ssIG5ld19zaXplICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtZW1vcnkgcmVsZWFzZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxvY2sgICA6OiBUaGUgYWRkcmVzcyBvZiBibG9jayBpbiBtZW1vcnkgdG8gYmUgZnJlZWQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9mcmVlKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwotCi0gICAgZnRfc2ZyZWUoIGJsb2NrICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCi0KLSAgLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRklMRSBmb3IgY29udmVuaWVuY2UgdG8gZXh0cmFjdCB0aGUgICAgICAgKi8KLSAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8KLSNkZWZpbmUgU1RSRUFNX0ZJTEUoIHN0cmVhbSApICAoIChGVF9GSUxFKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9hbnNpX3N0cmVhbV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X2Fuc2lfc3RyZWFtX2Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBmdF9mY2xvc2UoIFNUUkVBTV9GSUxFKCBzdHJlYW0gKSApOwotCi0gICAgc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgPSBOVUxMOwotICAgIHN0cmVhbS0+c2l6ZSAgICAgICAgICAgICAgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2Fuc2lfc3RyZWFtX2lvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0IDo6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBzdHJlYW0gdG8gc3RhcnQgcmVhZGluZy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB1bnNpZ25lZCBsb25nICkKLSAgZnRfYW5zaV9zdHJlYW1faW8oIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBjb3VudCApCi0gIHsKLSAgICBGVF9GSUxFKiAgZmlsZTsKLQotCi0gICAgZmlsZSA9IFNUUkVBTV9GSUxFKCBzdHJlYW0gKTsKLQotICAgIGZ0X2ZzZWVrKCBmaWxlLCBvZmZzZXQsIFNFRUtfU0VUICk7Ci0KLSAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnRfZnJlYWQoIGJ1ZmZlciwgMSwgY291bnQsIGZpbGUgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cmVhbS5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW4oIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lICkKLSAgewotICAgIEZUX0ZJTEUqICBmaWxlOwotCi0KLSAgICBpZiAoICFzdHJlYW0gKQotICAgICAgcmV0dXJuIEZUX0Vycl9JbnZhbGlkX1N0cmVhbV9IYW5kbGU7Ci0KLSAgICBmaWxlID0gZnRfZm9wZW4oIGZpbGVwYXRobmFtZSwgInJiIiApOwotICAgIGlmICggIWZpbGUgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwotCi0gICAgICByZXR1cm4gRlRfRXJyX0Nhbm5vdF9PcGVuX1Jlc291cmNlOwotICAgIH0KLQotICAgIGZ0X2ZzZWVrKCBmaWxlLCAwLCBTRUVLX0VORCApOwotICAgIHN0cmVhbS0+c2l6ZSA9IGZ0X2Z0ZWxsKCBmaWxlICk7Ci0gICAgZnRfZnNlZWsoIGZpbGUsIDAsIFNFRUtfU0VUICk7Ci0KLSAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IGZpbGU7Ci0gICAgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyICAgPSAoY2hhciopZmlsZXBhdGhuYW1lOwotICAgIHN0cmVhbS0+cG9zICAgICAgICAgICAgICAgID0gMDsKLQotICAgIHN0cmVhbS0+cmVhZCAgPSBmdF9hbnNpX3N0cmVhbV9pbzsKLSAgICBzdHJlYW0tPmNsb3NlID0gZnRfYW5zaV9zdHJlYW1fY2xvc2U7Ci0KLSAgICBGVF9UUkFDRTEoKCAiRlRfU3RyZWFtX09wZW46IiApKTsKLSAgICBGVF9UUkFDRTEoKCAiIG9wZW5lZCBgJXMnICglZCBieXRlcykgc3VjY2Vzc2Z1bGx5XG4iLAotICAgICAgICAgICAgICAgIGZpbGVwYXRobmFtZSwgc3RyZWFtLT5zaXplICkpOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLQotICBleHRlcm4gRlRfSW50Ci0gIGZ0X21lbV9kZWJ1Z19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0gIGV4dGVybiB2b2lkCi0gIGZ0X21lbV9kZWJ1Z19kb25lKCBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0jZW5kaWYKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfTWVtb3J5ICkKLSAgRlRfTmV3X01lbW9yeSggdm9pZCApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgbWVtb3J5ID0gKEZUX01lbW9yeSlmdF9zbWFsbG9jKCBzaXplb2YgKCAqbWVtb3J5ICkgKTsKLSAgICBpZiAoIG1lbW9yeSApCi0gICAgewotICAgICAgbWVtb3J5LT51c2VyICAgID0gMDsKLSAgICAgIG1lbW9yeS0+YWxsb2MgICA9IGZ0X2FsbG9jOwotICAgICAgbWVtb3J5LT5yZWFsbG9jID0gZnRfcmVhbGxvYzsKLSAgICAgIG1lbW9yeS0+ZnJlZSAgICA9IGZ0X2ZyZWU7Ci0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgICBmdF9tZW1fZGVidWdfaW5pdCggbWVtb3J5ICk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICByZXR1cm4gbWVtb3J5OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9Eb25lX01lbW9yeSggRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgZnRfbWVtX2RlYnVnX2RvbmUoIG1lbW9yeSApOwotI2VuZGlmCi0gICAgbWVtb3J5LT5mcmVlKCBtZW1vcnksIG1lbW9yeSApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHRyaWdvbi5jIGIvc3JjL2Jhc2UvZnR0cmlnb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MTM5NC4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdHRyaWdvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHJpZ29uLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICi0KLQotICAvKiB0aGUgZm9sbG93aW5nIGlzIDAuMjcxNTcxNzY4NDQzMjIzMSAqIDJeMzAgKi8KLSNkZWZpbmUgRlRfVFJJR19DT1NDQUxFICAweDExNjE2RThFVUwKLQotICAvKiB0aGlzIHRhYmxlIHdhcyBnZW5lcmF0ZWQgZm9yIEZUX1BJID0gMTgwTCA8PCAxNiwgaS5lLiBkZWdyZWVzICovCi0jZGVmaW5lIEZUX1RSSUdfTUFYX0lURVJTICAyMwotCi0gIHN0YXRpYyBjb25zdCBGVF9GaXhlZAotICBmdF90cmlnX2FyY3Rhbl90YWJsZVsyNF0gPQotICB7Ci0gICAgNDE1NzI3M0wsIDI5NDkxMjBMLCAxNzQwOTY3TCwgOTE5ODc5TCwgNDY2OTQ1TCwgMjM0Mzc5TCwgMTE3MzA0TCwKLSAgICA1ODY2NkwsIDI5MzM1TCwgMTQ2NjhMLCA3MzM0TCwgMzY2N0wsIDE4MzNMLCA5MTdMLCA0NThMLCAyMjlMLCAxMTVMLAotICAgIDU3TCwgMjlMLCAxNEwsIDdMLCA0TCwgMkwsIDFMCi0gIH07Ci0KLSAgLyogdGhlIENvcmRpYyBzaHJpbmsgZmFjdG9yLCBtdWx0aXBsaWVkIGJ5IDJeMzIgKi8KLSNkZWZpbmUgRlRfVFJJR19TQ0FMRSAgICAxMTY2MzkxNzg1VUwgIC8qIDB4NDU4NUJBMzhVTCAqLwotCi0KLSNpZmRlZiBGVF9DT05GSUdfSEFTX0lOVDY0Ci0KLSAgLyogbXVsdGlwbHkgYSBnaXZlbiB2YWx1ZSBieSB0aGUgQ09SRElDIHNocmluayBmYWN0b3IgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGZ0X3RyaWdfZG93bnNjYWxlKCBGVF9GaXhlZCAgdmFsICkKLSAgewotICAgIEZUX0ZpeGVkICBzOwotICAgIEZUX0ludDY0ICB2OwotCi0KLSAgICBzICAgPSB2YWw7Ci0gICAgdmFsID0gKCB2YWwgPj0gMCApID8gdmFsIDogLXZhbDsKLQotICAgIHYgICA9ICggdmFsICogKEZUX0ludDY0KUZUX1RSSUdfU0NBTEUgKSArIDB4MTAwMDAwMDAwVUw7Ci0gICAgdmFsID0gKEZUX0ZpeGVkKSggdiA+PiAzMiApOwotCi0gICAgcmV0dXJuICggcyA+PSAwICkgPyB2YWwgOiAtdmFsOwotICB9Ci0KLSNlbHNlIC8qICFGVF9DT05GSUdfSEFTX0lOVDY0ICovCi0KLSAgLyogbXVsdGlwbHkgYSBnaXZlbiB2YWx1ZSBieSB0aGUgQ09SRElDIHNocmluayBmYWN0b3IgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGZ0X3RyaWdfZG93bnNjYWxlKCBGVF9GaXhlZCAgdmFsICkKLSAgewotICAgIEZUX0ZpeGVkICAgczsKLSAgICBGVF9VSW50MzIgIHYxLCB2MiwgazEsIGsyLCBoaSwgbG8xLCBsbzIsIGxvMzsKLQotCi0gICAgcyAgID0gdmFsOwotICAgIHZhbCA9ICggdmFsID49IDAgKSA/IHZhbCA6IC12YWw7Ci0KLSAgICB2MSA9IChGVF9VSW50MzIpdmFsID4+IDE2OwotICAgIHYyID0gKEZUX1VJbnQzMil2YWwgJiAweEZGRkZMOwotCi0gICAgazEgPSBGVF9UUklHX1NDQUxFID4+IDE2OyAgICAgICAvKiBjb25zdGFudCAqLwotICAgIGsyID0gRlRfVFJJR19TQ0FMRSAmIDB4RkZGRkw7ICAgLyogY29uc3RhbnQgKi8KLQotICAgIGhpICAgPSBrMSAqIHYxOwotICAgIGxvMSAgPSBrMSAqIHYyICsgazIgKiB2MTsgICAgICAgLyogY2FuJ3Qgb3ZlcmZsb3cgKi8KLQotICAgIGxvMiAgPSAoIGsyICogdjIgKSA+PiAxNjsKLSAgICBsbzMgID0gKCBsbzEgPj0gbG8yICkgPyBsbzEgOiBsbzI7Ci0gICAgbG8xICs9IGxvMjsKLQotICAgIGhpICArPSBsbzEgPj4gMTY7Ci0gICAgaWYgKCBsbzEgPCBsbzMgKQotICAgICAgaGkgKz0gMHgxMDAwMFVMOwotCi0gICAgdmFsICA9IChGVF9GaXhlZCloaTsKLQotICAgIHJldHVybiAoIHMgPj0gMCApID8gdmFsIDogLXZhbDsKLSAgfQotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19IQVNfSU5UNjQgKi8KLQotCi0gIHN0YXRpYyBGVF9JbnQKLSAgZnRfdHJpZ19wcmVub3JtKCBGVF9WZWN0b3IqICB2ZWMgKQotICB7Ci0gICAgRlRfRml4ZWQgIHgsIHksIHo7Ci0gICAgRlRfSW50ICAgIHNoaWZ0OwotCi0KLSAgICB4ID0gdmVjLT54OwotICAgIHkgPSB2ZWMtPnk7Ci0KLSAgICB6ICAgICA9ICggKCB4ID49IDAgKSA/IHggOiAtIHggKSB8ICggKHkgPj0gMCkgPyB5IDogLXkgKTsKLSAgICBzaGlmdCA9IDA7Ci0KLSNpZiAxCi0gICAgLyogZGV0ZXJtaW5lIG1zYiBiaXQgaW5kZXggaW4gYHNoaWZ0JyAqLwotICAgIGlmICggeiA+PSAoIDFMIDw8IDE2ICkgKQotICAgIHsKLSAgICAgIHogICAgID4+PSAxNjsKLSAgICAgIHNoaWZ0ICArPSAxNjsKLSAgICB9Ci0gICAgaWYgKCB6ID49ICggMUwgPDwgOCApICkKLSAgICB7Ci0gICAgICB6ICAgICA+Pj0gODsKLSAgICAgIHNoaWZ0ICArPSA4OwotICAgIH0KLSAgICBpZiAoIHogPj0gKCAxTCA8PCA0ICkgKQotICAgIHsKLSAgICAgIHogICAgID4+PSA0OwotICAgICAgc2hpZnQgICs9IDQ7Ci0gICAgfQotICAgIGlmICggeiA+PSAoIDFMIDw8IDIgKSApCi0gICAgewotICAgICAgeiAgICAgPj49IDI7Ci0gICAgICBzaGlmdCAgKz0gMjsKLSAgICB9Ci0gICAgaWYgKCB6ID49ICggMUwgPDwgMSApICkKLSAgICB7Ci0gICAgICB6ICAgID4+PSAxOwotICAgICAgc2hpZnQgKz0gMTsKLSAgICB9Ci0KLSAgICBpZiAoIHNoaWZ0IDw9IDI3ICkKLSAgICB7Ci0gICAgICBzaGlmdCAgPSAyNyAtIHNoaWZ0OwotICAgICAgdmVjLT54ID0geCA8PCBzaGlmdDsKLSAgICAgIHZlYy0+eSA9IHkgPDwgc2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaGlmdCAtPSAyNzsKLSAgICAgIHZlYy0+eCA9IHggPj4gc2hpZnQ7Ci0gICAgICB2ZWMtPnkgPSB5ID4+IHNoaWZ0OwotICAgICAgc2hpZnQgID0gLXNoaWZ0OwotICAgIH0KLQotI2Vsc2UgLyogMCAqLwotCi0gICAgaWYgKCB6IDwgKCAxTCA8PCAyNyApICkKLSAgICB7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICBzaGlmdCsrOwotICAgICAgICB6IDw8PSAxOwotICAgICAgfSB3aGlsZSAoIHogPCAoIDFMIDw8IDI3ICkgKTsKLSAgICAgIHZlYy0+eCA9IHggPDwgc2hpZnQ7Ci0gICAgICB2ZWMtPnkgPSB5IDw8IHNoaWZ0OwotICAgIH0KLSAgICBlbHNlIGlmICggeiA+ICggMUwgPDwgMjggKSApCi0gICAgewotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgc2hpZnQrKzsKLSAgICAgICAgeiA+Pj0gMTsKLSAgICAgIH0gd2hpbGUgKCB6ID4gKCAxTCA8PCAyOCApICk7Ci0KLSAgICAgIHZlYy0+eCA9IHggPj4gc2hpZnQ7Ci0gICAgICB2ZWMtPnkgPSB5ID4+IHNoaWZ0OwotICAgICAgc2hpZnQgID0gLXNoaWZ0OwotICAgIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotICAgIHJldHVybiBzaGlmdDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgdGhldGEgKQotICB7Ci0gICAgRlRfSW50ICAgICAgICAgICBpOwotICAgIEZUX0ZpeGVkICAgICAgICAgeCwgeSwgeHRlbXA7Ci0gICAgY29uc3QgRlRfRml4ZWQgICphcmN0YW5wdHI7Ci0KLQotICAgIHggPSB2ZWMtPng7Ci0gICAgeSA9IHZlYy0+eTsKLQotICAgIC8qIEdldCBhbmdsZSBiZXR3ZWVuIC05MCBhbmQgOTAgZGVncmVlcyAqLwotICAgIHdoaWxlICggdGhldGEgPD0gLUZUX0FOR0xFX1BJMiApCi0gICAgewotICAgICAgeCA9IC14OwotICAgICAgeSA9IC15OwotICAgICAgdGhldGEgKz0gRlRfQU5HTEVfUEk7Ci0gICAgfQotCi0gICAgd2hpbGUgKCB0aGV0YSA+IEZUX0FOR0xFX1BJMiApCi0gICAgewotICAgICAgeCA9IC14OwotICAgICAgeSA9IC15OwotICAgICAgdGhldGEgLT0gRlRfQU5HTEVfUEk7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbCBwc2V1ZG9yb3RhdGlvbiwgd2l0aCBsZWZ0IHNoaWZ0ICovCi0gICAgYXJjdGFucHRyID0gZnRfdHJpZ19hcmN0YW5fdGFibGU7Ci0KLSAgICBpZiAoIHRoZXRhIDwgMCApCi0gICAgewotICAgICAgeHRlbXAgID0geCArICggeSA8PCAxICk7Ci0gICAgICB5ICAgICAgPSB5IC0gKCB4IDw8IDEgKTsKLSAgICAgIHggICAgICA9IHh0ZW1wOwotICAgICAgdGhldGEgKz0gKmFyY3RhbnB0cisrOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgeHRlbXAgID0geCAtICggeSA8PCAxICk7Ci0gICAgICB5ICAgICAgPSB5ICsgKCB4IDw8IDEgKTsKLSAgICAgIHggICAgICA9IHh0ZW1wOwotICAgICAgdGhldGEgLT0gKmFyY3RhbnB0cisrOwotICAgIH0KLQotICAgIC8qIFN1YnNlcXVlbnQgcHNldWRvcm90YXRpb25zLCB3aXRoIHJpZ2h0IHNoaWZ0cyAqLwotICAgIGkgPSAwOwotICAgIGRvCi0gICAgewotICAgICAgaWYgKCB0aGV0YSA8IDAgKQotICAgICAgewotICAgICAgICB4dGVtcCAgPSB4ICsgKCB5ID4+IGkgKTsKLSAgICAgICAgeSAgICAgID0geSAtICggeCA+PiBpICk7Ci0gICAgICAgIHggICAgICA9IHh0ZW1wOwotICAgICAgICB0aGV0YSArPSAqYXJjdGFucHRyKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHh0ZW1wICA9IHggLSAoIHkgPj4gaSApOwotICAgICAgICB5ICAgICAgPSB5ICsgKCB4ID4+IGkgKTsKLSAgICAgICAgeCAgICAgID0geHRlbXA7Ci0gICAgICAgIHRoZXRhIC09ICphcmN0YW5wdHIrKzsKLSAgICAgIH0KLSAgICB9IHdoaWxlICggKytpIDwgRlRfVFJJR19NQVhfSVRFUlMgKTsKLQotICAgIHZlYy0+eCA9IHg7Ci0gICAgdmVjLT55ID0geTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUoIEZUX1ZlY3RvciogIHZlYyApCi0gIHsKLSAgICBGVF9GaXhlZCAgICAgICAgIHRoZXRhOwotICAgIEZUX0ZpeGVkICAgICAgICAgeWksIGk7Ci0gICAgRlRfRml4ZWQgICAgICAgICB4LCB5OwotICAgIGNvbnN0IEZUX0ZpeGVkICAqYXJjdGFucHRyOwotCi0KLSAgICB4ID0gdmVjLT54OwotICAgIHkgPSB2ZWMtPnk7Ci0KLSAgICAvKiBHZXQgdGhlIHZlY3RvciBpbnRvIHRoZSByaWdodCBoYWxmIHBsYW5lICovCi0gICAgdGhldGEgPSAwOwotICAgIGlmICggeCA8IDAgKQotICAgIHsKLSAgICAgIHggPSAteDsKLSAgICAgIHkgPSAteTsKLSAgICAgIHRoZXRhID0gMiAqIEZUX0FOR0xFX1BJMjsKLSAgICB9Ci0KLSAgICBpZiAoIHkgPiAwICkKLSAgICAgIHRoZXRhID0gLSB0aGV0YTsKLQotICAgIGFyY3RhbnB0ciA9IGZ0X3RyaWdfYXJjdGFuX3RhYmxlOwotCi0gICAgaWYgKCB5IDwgMCApCi0gICAgewotICAgICAgLyogUm90YXRlIHBvc2l0aXZlICovCi0gICAgICB5aSAgICAgPSB5ICsgKCB4IDw8IDEgKTsKLSAgICAgIHggICAgICA9IHggLSAoIHkgPDwgMSApOwotICAgICAgeSAgICAgID0geWk7Ci0gICAgICB0aGV0YSAtPSAqYXJjdGFucHRyKys7ICAvKiBTdWJ0cmFjdCBhbmdsZSAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogUm90YXRlIG5lZ2F0aXZlICovCi0gICAgICB5aSAgICAgPSB5IC0gKCB4IDw8IDEgKTsKLSAgICAgIHggICAgICA9IHggKyAoIHkgPDwgMSApOwotICAgICAgeSAgICAgID0geWk7Ci0gICAgICB0aGV0YSArPSAqYXJjdGFucHRyKys7ICAvKiBBZGQgYW5nbGUgKi8KLSAgICB9Ci0KLSAgICBpID0gMDsKLSAgICBkbwotICAgIHsKLSAgICAgIGlmICggeSA8IDAgKQotICAgICAgewotICAgICAgICAvKiBSb3RhdGUgcG9zaXRpdmUgKi8KLSAgICAgICAgeWkgICAgID0geSArICggeCA+PiBpICk7Ci0gICAgICAgIHggICAgICA9IHggLSAoIHkgPj4gaSApOwotICAgICAgICB5ICAgICAgPSB5aTsKLSAgICAgICAgdGhldGEgLT0gKmFyY3RhbnB0cisrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBSb3RhdGUgbmVnYXRpdmUgKi8KLSAgICAgICAgeWkgICAgID0geSAtICggeCA+PiBpICk7Ci0gICAgICAgIHggICAgICA9IHggKyAoIHkgPj4gaSApOwotICAgICAgICB5ICAgICAgPSB5aTsKLSAgICAgICAgdGhldGEgKz0gKmFyY3RhbnB0cisrOwotICAgICAgfQotICAgIH0gd2hpbGUgKCArK2kgPCBGVF9UUklHX01BWF9JVEVSUyApOwotCi0gICAgLyogcm91bmQgdGhldGEgKi8KLSAgICBpZiAoIHRoZXRhID49IDAgKQotICAgICAgdGhldGEgPSBGVF9QQURfUk9VTkQoIHRoZXRhLCAzMiApOwotICAgIGVsc2UKLSAgICAgIHRoZXRhID0gLUZUX1BBRF9ST1VORCggLXRoZXRhLCAzMiApOwotCi0gICAgdmVjLT54ID0geDsKLSAgICB2ZWMtPnkgPSB0aGV0YTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQotICBGVF9Db3MoIEZUX0FuZ2xlICBhbmdsZSApCi0gIHsKLSAgICBGVF9WZWN0b3IgIHY7Ci0KLQotICAgIHYueCA9IEZUX1RSSUdfQ09TQ0FMRSA+PiAyOwotICAgIHYueSA9IDA7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCAmdiwgYW5nbGUgKTsKLQotICAgIHJldHVybiB2LnggLyAoIDEgPDwgMTIgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQotICBGVF9TaW4oIEZUX0FuZ2xlICBhbmdsZSApCi0gIHsKLSAgICByZXR1cm4gRlRfQ29zKCBGVF9BTkdMRV9QSTIgLSBhbmdsZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9GaXhlZCApCi0gIEZUX1RhbiggRlRfQW5nbGUgIGFuZ2xlICkKLSAgewotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgdi54ID0gRlRfVFJJR19DT1NDQUxFID4+IDI7Ci0gICAgdi55ID0gMDsKLSAgICBmdF90cmlnX3BzZXVkb19yb3RhdGUoICZ2LCBhbmdsZSApOwotCi0gICAgcmV0dXJuIEZUX0RpdkZpeCggdi55LCB2LnggKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfQW5nbGUgKQotICBGVF9BdGFuMiggRlRfRml4ZWQgIGR4LAotICAgICAgICAgICAgRlRfRml4ZWQgIGR5ICkKLSAgewotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgaWYgKCBkeCA9PSAwICYmIGR5ID09IDAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICB2LnggPSBkeDsKLSAgICB2LnkgPSBkeTsKLSAgICBmdF90cmlnX3ByZW5vcm0oICZ2ICk7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUoICZ2ICk7Ci0KLSAgICByZXR1cm4gdi55OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfVmVjdG9yX1VuaXQoIEZUX1ZlY3RvciogIHZlYywKLSAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICkKLSAgewotICAgIHZlYy0+eCA9IEZUX1RSSUdfQ09TQ0FMRSA+PiAyOwotICAgIHZlYy0+eSA9IDA7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCB2ZWMsIGFuZ2xlICk7Ci0gICAgdmVjLT54ID4+PSAxMjsKLSAgICB2ZWMtPnkgPj49IDEyOwotICB9Ci0KLQotICAvKiB0aGVzZSBtYWNyb3MgcmV0dXJuIDAgZm9yIHBvc2l0aXZlIG51bWJlcnMsCi0gICAgIGFuZCAtMSBmb3IgbmVnYXRpdmUgb25lcyAqLwotI2RlZmluZSBGVF9TSUdOX0xPTkcoIHggKSAgICggKHgpID4+ICggRlRfU0laRU9GX0xPTkcgKiA4IC0gMSApICkKLSNkZWZpbmUgRlRfU0lHTl9JTlQoIHggKSAgICAoICh4KSA+PiAoIEZUX1NJWkVPRl9JTlQgKiA4IC0gMSApICkKLSNkZWZpbmUgRlRfU0lHTl9JTlQzMiggeCApICAoICh4KSA+PiAzMSApCi0jZGVmaW5lIEZUX1NJR05fSU5UMTYoIHggKSAgKCAoeCkgPj4gMTUgKQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1ZlY3Rvcl9Sb3RhdGUoIEZUX1ZlY3RvciogIHZlYywKLSAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKQotICB7Ci0gICAgRlRfSW50ICAgICBzaGlmdDsKLSAgICBGVF9WZWN0b3IgIHY7Ci0KLQotICAgIHYueCAgID0gdmVjLT54OwotICAgIHYueSAgID0gdmVjLT55OwotCi0gICAgaWYgKCBhbmdsZSAmJiAoIHYueCAhPSAwIHx8IHYueSAhPSAwICkgKQotICAgIHsKLSAgICAgIHNoaWZ0ID0gZnRfdHJpZ19wcmVub3JtKCAmdiApOwotICAgICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCAmdiwgYW5nbGUgKTsKLSAgICAgIHYueCA9IGZ0X3RyaWdfZG93bnNjYWxlKCB2LnggKTsKLSAgICAgIHYueSA9IGZ0X3RyaWdfZG93bnNjYWxlKCB2LnkgKTsKLQotICAgICAgaWYgKCBzaGlmdCA+IDAgKQotICAgICAgewotICAgICAgICBGVF9JbnQzMiAgaGFsZiA9IDFMIDw8ICggc2hpZnQgLSAxICk7Ci0KLQotICAgICAgICB2ZWMtPnggPSAoIHYueCArIGhhbGYgKyBGVF9TSUdOX0xPTkcoIHYueCApICkgPj4gc2hpZnQ7Ci0gICAgICAgIHZlYy0+eSA9ICggdi55ICsgaGFsZiArIEZUX1NJR05fTE9ORyggdi55ICkgKSA+PiBzaGlmdDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2hpZnQgID0gLXNoaWZ0OwotICAgICAgICB2ZWMtPnggPSB2LnggPDwgc2hpZnQ7Ci0gICAgICAgIHZlYy0+eSA9IHYueSA8PCBzaGlmdDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfVmVjdG9yX0xlbmd0aCggRlRfVmVjdG9yKiAgdmVjICkKLSAgewotICAgIEZUX0ludCAgICAgc2hpZnQ7Ci0gICAgRlRfVmVjdG9yICB2OwotCi0KLSAgICB2ID0gKnZlYzsKLQotICAgIC8qIGhhbmRsZSB0cml2aWFsIGNhc2VzICovCi0gICAgaWYgKCB2LnggPT0gMCApCi0gICAgewotICAgICAgcmV0dXJuICggdi55ID49IDAgKSA/IHYueSA6IC12Lnk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2LnkgPT0gMCApCi0gICAgewotICAgICAgcmV0dXJuICggdi54ID49IDAgKSA/IHYueCA6IC12Lng7Ci0gICAgfQotCi0gICAgLyogZ2VuZXJhbCBjYXNlICovCi0gICAgc2hpZnQgPSBmdF90cmlnX3ByZW5vcm0oICZ2ICk7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUoICZ2ICk7Ci0KLSAgICB2LnggPSBmdF90cmlnX2Rvd25zY2FsZSggdi54ICk7Ci0KLSAgICBpZiAoIHNoaWZ0ID4gMCApCi0gICAgICByZXR1cm4gKCB2LnggKyAoIDEgPDwgKCBzaGlmdCAtIDEgKSApICkgPj4gc2hpZnQ7Ci0KLSAgICByZXR1cm4gdi54IDw8IC1zaGlmdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1ZlY3Rvcl9Qb2xhcml6ZSggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgKmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICphbmdsZSApCi0gIHsKLSAgICBGVF9JbnQgICAgIHNoaWZ0OwotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgdiA9ICp2ZWM7Ci0KLSAgICBpZiAoIHYueCA9PSAwICYmIHYueSA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIHNoaWZ0ID0gZnRfdHJpZ19wcmVub3JtKCAmdiApOwotICAgIGZ0X3RyaWdfcHNldWRvX3BvbGFyaXplKCAmdiApOwotCi0gICAgdi54ID0gZnRfdHJpZ19kb3duc2NhbGUoIHYueCApOwotCi0gICAgKmxlbmd0aCA9ICggc2hpZnQgPj0gMCApID8gKCB2LnggPj4gc2hpZnQgKSA6ICggdi54IDw8IC1zaGlmdCApOwotICAgICphbmdsZSAgPSB2Lnk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKQotICB7Ci0gICAgdmVjLT54ID0gbGVuZ3RoOwotICAgIHZlYy0+eSA9IDA7Ci0KLSAgICBGVF9WZWN0b3JfUm90YXRlKCB2ZWMsIGFuZ2xlICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0FuZ2xlICkKLSAgRlRfQW5nbGVfRGlmZiggRlRfQW5nbGUgIGFuZ2xlMSwKLSAgICAgICAgICAgICAgICAgRlRfQW5nbGUgIGFuZ2xlMiApCi0gIHsKLSAgICBGVF9BbmdsZSAgZGVsdGEgPSBhbmdsZTIgLSBhbmdsZTE7Ci0KLQotICAgIGRlbHRhICU9IEZUX0FOR0xFXzJQSTsKLSAgICBpZiAoIGRlbHRhIDwgMCApCi0gICAgICBkZWx0YSArPSBGVF9BTkdMRV8yUEk7Ci0KLSAgICBpZiAoIGRlbHRhID4gRlRfQU5HTEVfUEkgKQotICAgICAgZGVsdGEgLT0gRlRfQU5HTEVfMlBJOwotCi0gICAgcmV0dXJuIGRlbHRhOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHV0aWwuYyBiL3NyYy9iYXNlL2Z0dXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc3YmU1Li4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Z0dXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dXRpbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgZm9yIG1lbW9yeSBhbmQgbGlzdCBtYW5hZ2VtZW50IChib2R5KS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9MSVNUX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX21lbW9yeQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICBNIEUgTSBPIFIgWSAgIE0gQSBOIEEgRyBFIE0gRSBOIFQgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfUG9pbnRlciAgYmxvY2sgPSBmdF9tZW1fcWFsbG9jKCBtZW1vcnksIHNpemUsICZlcnJvciApOwotCi0gICAgaWYgKCAhZXJyb3IgJiYgc2l6ZSA+IDAgKQotICAgICAgRlRfTUVNX1pFUk8oIGJsb2NrLCBzaXplICk7Ci0KLSAgICAqcF9lcnJvciA9IGVycm9yOwotICAgIHJldHVybiBibG9jazsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfUG9pbnRlciAgYmxvY2sgPSBOVUxMOwotCi0KLSAgICBpZiAoIHNpemUgPiAwICkKLSAgICB7Ci0gICAgICBibG9jayA9IG1lbW9yeS0+YWxsb2MoIG1lbW9yeSwgc2l6ZSApOwotICAgICAgaWYgKCBibG9jayA9PSBOVUxMICkKLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT3V0X09mX01lbW9yeTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHNpemUgPCAwICkKLSAgICB7Ci0gICAgICAvKiBtYXkgaGVscCBjYXRjaC9wcmV2ZW50IHNlY3VyaXR5IGlzc3VlcyAqLwotICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICB9Ci0KLSAgICAqcF9lcnJvciA9IGVycm9yOwotICAgIHJldHVybiBibG9jazsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGl0ZW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBuZXdfY291bnQsCi0gICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrLAotICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGJsb2NrID0gZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksIGl0ZW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2NvdW50LCBuZXdfY291bnQsIGJsb2NrLCAmZXJyb3IgKTsKLSAgICBpZiAoICFlcnJvciAmJiBuZXdfY291bnQgPiBjdXJfY291bnQgKQotICAgICAgRlRfTUVNX1pFUk8oIChjaGFyKilibG9jayArIGN1cl9jb3VudCAqIGl0ZW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAoIG5ld19jb3VudCAtIGN1cl9jb3VudCApICogaXRlbV9zaXplICk7Ci0KLSAgICAqcF9lcnJvciA9IGVycm9yOwotICAgIHJldHVybiBibG9jazsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcXJlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgaXRlbV9zaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgLyogTm90ZSB0aGF0IHdlIG5vdyBhY2NlcHQgYGl0ZW1fc2l6ZSA9PSAwJyBhcyBhIHZhbGlkIHBhcmFtZXRlciwgaW4KLSAgICAgKiBvcmRlciB0byBjb3ZlciB2ZXJ5IHdlaXJkIGNhc2VzIHdoZXJlIGFuIEFMTE9DX01VTFQgbWFjcm8gd291bGQgYmUKLSAgICAgKiBjYWxsZWQuCi0gICAgICovCi0gICAgaWYgKCBjdXJfY291bnQgPCAwIHx8IG5ld19jb3VudCA8IDAgfHwgaXRlbV9zaXplIDwgMCApCi0gICAgewotICAgICAgLyogbWF5IGhlbHAgY2F0Y2gvcHJldmVudCBuYXN0eSBzZWN1cml0eSBpc3N1ZXMgKi8KLSAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBuZXdfY291bnQgPT0gMCB8fCBpdGVtX3NpemUgPT0gMCApCi0gICAgewotICAgICAgZnRfbWVtX2ZyZWUoIG1lbW9yeSwgYmxvY2sgKTsKLSAgICAgIGJsb2NrID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG5ld19jb3VudCA+IEZUX0lOVF9NQVgvaXRlbV9zaXplICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9BcnJheV9Ub29fTGFyZ2U7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBjdXJfY291bnQgPT0gMCApCi0gICAgewotICAgICAgRlRfQVNTRVJUKCBibG9jayA9PSBOVUxMICk7Ci0KLSAgICAgIGJsb2NrID0gZnRfbWVtX2FsbG9jKCBtZW1vcnksIG5ld19jb3VudCppdGVtX3NpemUsICZlcnJvciApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfUG9pbnRlciAgYmxvY2syOwotICAgICAgRlRfTG9uZyAgICAgY3VyX3NpemUgPSBjdXJfY291bnQqaXRlbV9zaXplOwotICAgICAgRlRfTG9uZyAgICAgbmV3X3NpemUgPSBuZXdfY291bnQqaXRlbV9zaXplOwotCi0KLSAgICAgIGJsb2NrMiA9IG1lbW9yeS0+cmVhbGxvYyggbWVtb3J5LCBjdXJfc2l6ZSwgbmV3X3NpemUsIGJsb2NrICk7Ci0gICAgICBpZiAoIGJsb2NrMiA9PSBOVUxMICkKLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfT3V0X09mX01lbW9yeTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmxvY2sgPSBibG9jazI7Ci0gICAgfQotCi0gICAgKnBfZXJyb3IgPSBlcnJvcjsKLSAgICByZXR1cm4gYmxvY2s7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfbWVtX2ZyZWUoIEZUX01lbW9yeSAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKlAgKQotICB7Ci0gICAgaWYgKCBQICkKLSAgICAgIG1lbW9yeS0+ZnJlZSggbWVtb3J5LCAodm9pZCopUCApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9kdXAoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBhZGRyZXNzLAotICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgRlRfRXJyb3IgICAgKnBfZXJyb3IgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfUG9pbnRlciAgcCA9IGZ0X21lbV9xYWxsb2MoIG1lbW9yeSwgc2l6ZSwgJmVycm9yICk7Ci0KLQotICAgIGlmICggIWVycm9yICYmIGFkZHJlc3MgKQotICAgICAgZnRfbWVtY3B5KCBwLCBhZGRyZXNzLCBzaXplICk7Ci0KLSAgICAqcF9lcnJvciA9IGVycm9yOwotICAgIHJldHVybiBwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9zdHJkdXAoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzdHIsCi0gICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgICpwX2Vycm9yICkKLSAgewotICAgIEZUX1VMb25nICBsZW4gPSBzdHIgPyAoRlRfVUxvbmcpZnRfc3RybGVuKCBzdHIgKSArIDEKLSAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLQotCi0gICAgcmV0dXJuIGZ0X21lbV9kdXAoIG1lbW9yeSwgc3RyLCBsZW4sIHBfZXJyb3IgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0ludCApCi0gIGZ0X21lbV9zdHJjcHluKCBjaGFyKiAgICAgICAgZHN0LAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNyYywKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplICkKLSAgewotICAgIHdoaWxlICggc2l6ZSA+IDEgJiYgKnNyYyAhPSAwICkKLSAgICB7Ci0gICAgICAqZHN0KysgPSAqc3JjKys7Ci0gICAgICBzaXplLS07Ci0gICAgfQotCi0gICAgKmRzdCA9IDA7ICAvKiBhbHdheXMgemVyby10ZXJtaW5hdGUgKi8KLQotICAgIHJldHVybiAqc3JjICE9IDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgRCBPIFUgQiBMIFkgICBMIEkgTiBLIEUgRCAgIEwgSSBTIFQgUyAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9saXN0Ci0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGxpc3QuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0xpc3ROb2RlICkKLSAgRlRfTGlzdF9GaW5kKCBGVF9MaXN0ICBsaXN0LAotICAgICAgICAgICAgICAgIHZvaWQqICAgIGRhdGEgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGN1cjsKLQotCi0gICAgY3VyID0gbGlzdC0+aGVhZDsKLSAgICB3aGlsZSAoIGN1ciApCi0gICAgewotICAgICAgaWYgKCBjdXItPmRhdGEgPT0gZGF0YSApCi0gICAgICAgIHJldHVybiBjdXI7Ci0KLSAgICAgIGN1ciA9IGN1ci0+bmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKEZUX0xpc3ROb2RlKTA7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfTGlzdF9BZGQoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGJlZm9yZSA9IGxpc3QtPnRhaWw7Ci0KLQotICAgIG5vZGUtPm5leHQgPSAwOwotICAgIG5vZGUtPnByZXYgPSBiZWZvcmU7Ci0KLSAgICBpZiAoIGJlZm9yZSApCi0gICAgICBiZWZvcmUtPm5leHQgPSBub2RlOwotICAgIGVsc2UKLSAgICAgIGxpc3QtPmhlYWQgPSBub2RlOwotCi0gICAgbGlzdC0+dGFpbCA9IG5vZGU7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfTGlzdF9JbnNlcnQoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGFmdGVyID0gbGlzdC0+aGVhZDsKLQotCi0gICAgbm9kZS0+bmV4dCA9IGFmdGVyOwotICAgIG5vZGUtPnByZXYgPSAwOwotCi0gICAgaWYgKCAhYWZ0ZXIgKQotICAgICAgbGlzdC0+dGFpbCA9IG5vZGU7Ci0gICAgZWxzZQotICAgICAgYWZ0ZXItPnByZXYgPSBub2RlOwotCi0gICAgbGlzdC0+aGVhZCA9IG5vZGU7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfTGlzdF9SZW1vdmUoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGJlZm9yZSwgYWZ0ZXI7Ci0KLQotICAgIGJlZm9yZSA9IG5vZGUtPnByZXY7Ci0gICAgYWZ0ZXIgID0gbm9kZS0+bmV4dDsKLQotICAgIGlmICggYmVmb3JlICkKLSAgICAgIGJlZm9yZS0+bmV4dCA9IGFmdGVyOwotICAgIGVsc2UKLSAgICAgIGxpc3QtPmhlYWQgPSBhZnRlcjsKLQotICAgIGlmICggYWZ0ZXIgKQotICAgICAgYWZ0ZXItPnByZXYgPSBiZWZvcmU7Ci0gICAgZWxzZQotICAgICAgbGlzdC0+dGFpbCA9IGJlZm9yZTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGxpc3QuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9MaXN0X1VwKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGJlZm9yZSwgYWZ0ZXI7Ci0KLQotICAgIGJlZm9yZSA9IG5vZGUtPnByZXY7Ci0gICAgYWZ0ZXIgID0gbm9kZS0+bmV4dDsKLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgYXJlIGFscmVhZHkgb24gdG9wIG9mIHRoZSBsaXN0ICovCi0gICAgaWYgKCAhYmVmb3JlICkKLSAgICAgIHJldHVybjsKLQotICAgIGJlZm9yZS0+bmV4dCA9IGFmdGVyOwotCi0gICAgaWYgKCBhZnRlciApCi0gICAgICBhZnRlci0+cHJldiA9IGJlZm9yZTsKLSAgICBlbHNlCi0gICAgICBsaXN0LT50YWlsID0gYmVmb3JlOwotCi0gICAgbm9kZS0+cHJldiAgICAgICA9IDA7Ci0gICAgbm9kZS0+bmV4dCAgICAgICA9IGxpc3QtPmhlYWQ7Ci0gICAgbGlzdC0+aGVhZC0+cHJldiA9IG5vZGU7Ci0gICAgbGlzdC0+aGVhZCAgICAgICA9IG5vZGU7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xpc3RfSXRlcmF0ZSggRlRfTGlzdCAgICAgICAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgRlRfTGlzdF9JdGVyYXRvciAgIGl0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICB1c2VyICkKLSAgewotICAgIEZUX0xpc3ROb2RlICBjdXIgICA9IGxpc3QtPmhlYWQ7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICB3aGlsZSAoIGN1ciApCi0gICAgewotICAgICAgRlRfTGlzdE5vZGUgIG5leHQgPSBjdXItPm5leHQ7Ci0KLQotICAgICAgZXJyb3IgPSBpdGVyYXRvciggY3VyLCB1c2VyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGN1ciA9IG5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bGlzdC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0xpc3RfRmluYWxpemUoIEZUX0xpc3QgICAgICAgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgRlRfTGlzdF9EZXN0cnVjdG9yICBkZXN0cm95LAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICB1c2VyICkKLSAgewotICAgIEZUX0xpc3ROb2RlICBjdXI7Ci0KLQotICAgIGN1ciA9IGxpc3QtPmhlYWQ7Ci0gICAgd2hpbGUgKCBjdXIgKQotICAgIHsKLSAgICAgIEZUX0xpc3ROb2RlICBuZXh0ID0gY3VyLT5uZXh0OwotICAgICAgdm9pZCogICAgICAgIGRhdGEgPSBjdXItPmRhdGE7Ci0KLQotICAgICAgaWYgKCBkZXN0cm95ICkKLSAgICAgICAgZGVzdHJveSggbWVtb3J5LCBkYXRhLCB1c2VyICk7Ci0KLSAgICAgIEZUX0ZSRUUoIGN1ciApOwotICAgICAgY3VyID0gbmV4dDsKLSAgICB9Ci0KLSAgICBsaXN0LT5oZWFkID0gMDsKLSAgICBsaXN0LT50YWlsID0gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VJbnQzMiApCi0gIGZ0X2hpZ2hwb3cyKCBGVF9VSW50MzIgIHZhbHVlICkKLSAgewotICAgIEZUX1VJbnQzMiAgdmFsdWUyOwotCi0KLSAgICAvKgotICAgICAqICBXZSBzaW1wbHkgY2xlYXIgdGhlIGxvd2VzdCBiaXQgaW4gZWFjaCBpdGVyYXRpb24uICBXaGVuCi0gICAgICogIHdlIHJlYWNoIDAsIHdlIGtub3cgdGhhdCB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG91ciByZXN1bHQuCi0gICAgICovCi0gICAgZm9yICggOzsgKQotICAgIHsKLSAgICAgIHZhbHVlMiA9IHZhbHVlICYgKHZhbHVlIC0gMSk7ICAvKiBjbGVhciBsb3dlc3QgYml0ICovCi0gICAgICBpZiAoIHZhbHVlMiA9PSAwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHZhbHVlID0gdmFsdWUyOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfQWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgdm9pZCogICAgICpQICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgKHZvaWQpRlRfQUxMT0MoICpQLCBzaXplICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9RQWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKLSAgICAgICAgICAgICB2b2lkKiAgICAgKnAgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICAodm9pZClGVF9RQUxMT0MoICpwLCBzaXplICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgRlRfTG9uZyAgICBjdXJyZW50LAotICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUsCi0gICAgICAgICAgICAgIHZvaWQqICAgICAqUCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgICh2b2lkKUZUX1JFQUxMT0MoICpQLCBjdXJyZW50LCBzaXplICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9RUmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICBGVF9Mb25nICAgIGN1cnJlbnQsCi0gICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUsCi0gICAgICAgICAgICAgICB2b2lkKiAgICAgKnAgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICAodm9pZClGVF9RUkVBTExPQyggKnAsIGN1cnJlbnQsIHNpemUgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfRnJlZSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgIHZvaWQqICAgICAqUCApCi0gIHsKLSAgICBpZiAoICpQICkKLSAgICAgIEZUX01FTV9GUkVFKCAqUCApOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHdpbmZudC5jIGIvc3JjL2Jhc2UvZnR3aW5mbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyZTkwZS4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdHdpbmZudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR3aW5mbnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIFdpbmRvd3MgRk5UIHNwZWNpZmljIGluZm8gKGJvZHkpLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1dJTkZPTlRTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9XSU5GTlRfSAotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHdpbmZudC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfV2luRk5UX0hlYWRlciggRlRfRmFjZSAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9XaW5GTlRfSGVhZGVyUmVjICAqaGVhZGVyICkKLSAgewotICAgIEZUX1NlcnZpY2VfV2luRm50ICBzZXJ2aWNlOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIGlmICggZmFjZSAhPSBOVUxMICkKLSAgICB7Ci0gICAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBXSU5GTlQgKTsKLQotICAgICAgaWYgKCBzZXJ2aWNlICE9IE5VTEwgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9oZWFkZXIoIGZhY2UsIGhlYWRlciApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnR4Zjg2LmMgYi9zcmMvYmFzZS9mdHhmODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiZjc2Ny4uMDAwMDAwMAotLS0gYS9zcmMvYmFzZS9mdHhmODYuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0eGY4Ni5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgZm9yIFgxMSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9YRlJFRTg2X0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSAotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHhmODYuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIGNvbnN0IGNoYXIqICkKLSAgRlRfR2V0X1gxMV9Gb250X0Zvcm1hdCggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBjb25zdCBjaGFyKiAgcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCByZXN1bHQsIFhGODZfTkFNRSApOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmYuYyBiL3NyYy9jZmYvY2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDg5NTQuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBPcGVuVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImNmZmRyaXZyLmMiCi0jaW5jbHVkZSAiY2ZmcGFyc2UuYyIKLSNpbmNsdWRlICJjZmZsb2FkLmMiCi0jaW5jbHVkZSAiY2Zmb2Jqcy5jIgotI2luY2x1ZGUgImNmZmdsb2FkLmMiCi0jaW5jbHVkZSAiY2ZmY21hcC5jIgotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmY21hcC5jIGIvc3JjL2NmZi9jZmZjbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGQwNDguLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZjbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmY21hcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENGRiBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSAoY21hcCkgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiY2ZmY21hcC5oIgotI2luY2x1ZGUgImNmZmxvYWQuaCIKLQotI2luY2x1ZGUgImNmZmVycnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgQ0ZGIFNUQU5EQVJEIChBTkQgRVhQRVJUKSBFTkNPRElORyBDTUFQUyAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBjZmZfY21hcF9lbmNvZGluZ19pbml0KCBDRkZfQ01hcFN0ZCAgY21hcCApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgIGZhY2UgICAgID0gKFRUX0ZhY2UpRlRfQ01BUF9GQUNFKCBjbWFwICk7Ci0gICAgQ0ZGX0ZvbnQgICAgICBjZmYgICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIENGRl9FbmNvZGluZyAgZW5jb2RpbmcgPSAmY2ZmLT5lbmNvZGluZzsKLQotCi0gICAgY21hcC0+Z2lkcyAgPSBlbmNvZGluZy0+Y29kZXM7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgY2ZmX2NtYXBfZW5jb2RpbmdfZG9uZSggQ0ZGX0NNYXBTdGQgIGNtYXAgKQotICB7Ci0gICAgY21hcC0+Z2lkcyAgPSBOVUxMOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICBjZmZfY21hcF9lbmNvZGluZ19jaGFyX2luZGV4KCBDRkZfQ01hcFN0ZCAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoIGNoYXJfY29kZSA8IDI1NiApCi0gICAgICByZXN1bHQgPSBjbWFwLT5naWRzW2NoYXJfY29kZV07Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICBjZmZfY21hcF9lbmNvZGluZ19jaGFyX25leHQoIENGRl9DTWFwU3RkICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludCAgICByZXN1bHQgICAgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGU7Ci0KLQotICAgICpwY2hhcl9jb2RlID0gMDsKLQotICAgIGlmICggY2hhcl9jb2RlIDwgMjU1ICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBjb2RlID0gKEZUX1VJbnQpKGNoYXJfY29kZSArIDEpOwotCi0KLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIGlmICggY29kZSA+PSAyNTYgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHJlc3VsdCA9IGNtYXAtPmdpZHNbY29kZV07Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgKnBjaGFyX2NvZGUgPSBjb2RlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY29kZSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICBjZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMgPQotICB7Ci0gICAgc2l6ZW9mICggQ0ZGX0NNYXBTdGRSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgY2ZmX2NtYXBfZW5jb2RpbmdfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIGNmZl9jbWFwX2VuY29kaW5nX2RvbmUsCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyljZmZfY21hcF9lbmNvZGluZ19jaGFyX2luZGV4LAotICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgY2ZmX2NtYXBfZW5jb2RpbmdfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICB9OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICBDRkYgU1lOVEhFVElDIFVOSUNPREUgRU5DT0RJTkcgQ01BUCAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBjb25zdCBjaGFyKiApCi0gIGNmZl9zaWRfdG9fZ2x5cGhfbmFtZSggVFRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGlkeCApCi0gIHsKLSAgICBDRkZfRm9udCAgICAgICAgICAgIGNmZiAgICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBDRkZfQ2hhcnNldCAgICAgICAgIGNoYXJzZXQgPSAmY2ZmLT5jaGFyc2V0OwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpY2ZmLT5wc25hbWVzOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgc2lkICAgICA9IGNoYXJzZXQtPnNpZHNbaWR4XTsKLQotCi0gICAgcmV0dXJuIGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggJmNmZi0+c3RyaW5nX2luZGV4LCBzaWQsIHBzbmFtZXMgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgY2ZmX3NpZF9mcmVlX2dseXBoX25hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGduYW1lICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotCi0gICAgRlRfRlJFRSggZ25hbWUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGNmZl9jbWFwX3VuaWNvZGVfaW5pdCggUFNfVW5pY29kZXMgIHVuaWNvZGVzICkKLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgICAgZmFjZSAgICA9IChUVF9GYWNlKUZUX0NNQVBfRkFDRSggdW5pY29kZXMgKTsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSAgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotICAgIENGRl9Gb250ICAgICAgICAgICAgY2ZmICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIENGRl9DaGFyc2V0ICAgICAgICAgY2hhcnNldCA9ICZjZmYtPmNoYXJzZXQ7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gKEZUX1NlcnZpY2VfUHNDTWFwcyljZmYtPnBzbmFtZXM7Ci0KLQotICAgIC8qIGNhbid0IGJ1aWxkIFVuaWNvZGUgbWFwIGZvciBDSUQta2V5ZWQgZm9udCAqLwotICAgIGlmICggIWNoYXJzZXQtPnNpZHMgKQotICAgICAgcmV0dXJuIENGRl9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIHJldHVybiBwc25hbWVzLT51bmljb2Rlc19pbml0KCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmYtPm51bV9nbHlwaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19HZXRHbHlwaE5hbWVGdW5jKSZjZmZfc2lkX3RvX2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19GcmVlR2x5cGhOYW1lRnVuYykmY2ZmX3NpZF9mcmVlX2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Qb2ludGVyKWZhY2UgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgY2ZmX2NtYXBfdW5pY29kZV9kb25lKCBQU19Vbmljb2RlcyAgdW5pY29kZXMgKQotICB7Ci0gICAgRlRfRmFjZSAgICBmYWNlICAgPSBGVF9DTUFQX0ZBQ0UoIHVuaWNvZGVzICk7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICBGVF9GUkVFKCB1bmljb2Rlcy0+bWFwcyApOwotICAgIHVuaWNvZGVzLT5udW1fbWFwcyA9IDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIGNmZl9jbWFwX3VuaWNvZGVfY2hhcl9pbmRleCggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFRUX0ZhY2UpRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIENGRl9Gb250ICAgICAgICAgICAgY2ZmICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpY2ZmLT5wc25hbWVzOwotCi0KLSAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfY2hhcl9pbmRleCggdW5pY29kZXMsIGNoYXJfY29kZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICBjZmZfY21hcF91bmljb2RlX2NoYXJfbmV4dCggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFRUX0ZhY2UpRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIENGRl9Gb250ICAgICAgICAgICAgY2ZmICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpY2ZmLT5wc25hbWVzOwotCi0KLSAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfY2hhcl9uZXh0KCB1bmljb2RlcywgcGNoYXJfY29kZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICBjZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYyA9Ci0gIHsKLSAgICBzaXplb2YgKCBQU19Vbmljb2Rlc1JlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICBjZmZfY21hcF91bmljb2RlX2luaXQsCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBjZmZfY21hcF91bmljb2RlX2RvbmUsCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyljZmZfY21hcF91bmljb2RlX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSBjZmZfY21hcF91bmljb2RlX2NoYXJfbmV4dCwKLQotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmY21hcC5oIGIvc3JjL2NmZi9jZmZjbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDliODUuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZjbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZjbWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRkZDTUFQX0hfXwotI2RlZmluZSBfX0NGRkNNQVBfSF9fCi0KLSNpbmNsdWRlICJjZmZvYmpzLmgiCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgIFRZUEUxIFNUQU5EQVJEIChBTkQgRVhQRVJUKSBFTkNPRElORyBDTUFQUyAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogc3RhbmRhcmQgKGFuZCBleHBlcnQpIGVuY29kaW5nIGNtYXBzICovCi0gIHR5cGVkZWYgc3RydWN0IENGRl9DTWFwU3RkUmVjXyogIENGRl9DTWFwU3RkOwotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfQ01hcFN0ZFJlY18KLSAgewotICAgIEZUX0NNYXBSZWMgIGNtYXA7Ci0gICAgRlRfVVNob3J0KiAgZ2lkczsgICAvKiB1cCB0byAyNTYgZWxlbWVudHMgKi8KLQotICB9IENGRl9DTWFwU3RkUmVjOwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICBjZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICBDRkYgU1lOVEhFVElDIFVOSUNPREUgRU5DT0RJTkcgQ01BUCAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiB1bmljb2RlIChzeW50aGV0aWMpIGNtYXBzICovCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICBjZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYzsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NGRkNNQVBfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZmRyaXZyLmMgYi9zcmMvY2ZmL2NmZmRyaXZyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZGU4ZGMuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZkcml2ci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmRyaXZyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBmb250IGRyaXZlciBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9DSURfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICi0KLSNpbmNsdWRlICJjZmZkcml2ci5oIgotI2luY2x1ZGUgImNmZmdsb2FkLmgiCi0jaW5jbHVkZSAiY2ZmbG9hZC5oIgotI2luY2x1ZGUgImNmZmNtYXAuaCIKLQotI2luY2x1ZGUgImNmZmVycnMuaCIKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0gKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jZmZkcml2ZXIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEYgQSBDIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIFBBSVJfVEFHCi0jZGVmaW5lIFBBSVJfVEFHKCBsZWZ0LCByaWdodCApICAoICggKEZUX1VMb25nKWxlZnQgPDwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpcmlnaHQgICAgICAgICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNmZl9nZXRfa2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLwotICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICovCi0gIC8qICAgIGtlcm5pbmdzLCBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGNmZl9nZXRfa2VybmluZyggRlRfRmFjZSAgICAgdHRmYWNlLCAgICAgICAgICAvKiBUVF9GYWNlICovCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBrZXJuaW5nICkKLSAgewotICAgIFRUX0ZhY2UgICAgICAgZmFjZSA9IChUVF9GYWNlKXR0ZmFjZTsKLSAgICBTRk5UX1NlcnZpY2UgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0KLQotICAgIGtlcm5pbmctPnggPSAwOwotICAgIGtlcm5pbmctPnkgPSAwOwotCi0gICAgaWYgKCBzZm50ICkKLSAgICAgIGtlcm5pbmctPnggPSBzZm50LT5nZXRfa2VybmluZyggZmFjZSwgbGVmdF9nbHlwaCwgcmlnaHRfZ2x5cGggKTsKLQotICAgIHJldHVybiBDRkZfRXJyX09rOwotICB9Ci0KLQotI3VuZGVmIFBBSVJfVEFHCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBsb2FkIGEgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQsIGxvYWRlZCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEXz8/PyBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBMb2FkX0dseXBoKCBGVF9HbHlwaFNsb3QgIGNmZnNsb3QsICAgICAgICAvKiBDRkZfR2x5cGhTbG90ICovCi0gICAgICAgICAgICAgIEZUX1NpemUgICAgICAgY2Zmc2l6ZSwgICAgICAgIC8qIENGRl9TaXplICAgICAgKi8KLSAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotICAgIENGRl9HbHlwaFNsb3QgIHNsb3QgPSAoQ0ZGX0dseXBoU2xvdCljZmZzbG90OwotICAgIENGRl9TaXplICAgICAgIHNpemUgPSAoQ0ZGX1NpemUpY2Zmc2l6ZTsKLQotCi0gICAgaWYgKCAhc2xvdCApCi0gICAgICByZXR1cm4gQ0ZGX0Vycl9JbnZhbGlkX1Nsb3RfSGFuZGxlOwotCi0gICAgLyogY2hlY2sgd2hldGhlciB3ZSB3YW50IGEgc2NhbGVkIG91dGxpbmUgb3IgYml0bWFwICovCi0gICAgaWYgKCAhc2l6ZSApCi0gICAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fU0NBTEUgfCBGVF9MT0FEX05PX0hJTlRJTkc7Ci0KLSAgICAvKiByZXNldCB0aGUgc2l6ZSBvYmplY3QgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApCi0gICAgICBzaXplID0gTlVMTDsKLQotICAgIGlmICggc2l6ZSApCi0gICAgewotICAgICAgLyogdGhlc2UgdHdvIG9iamVjdHMgbXVzdCBoYXZlIHRoZSBzYW1lIHBhcmVudCAqLwotICAgICAgaWYgKCBjZmZzaXplLT5mYWNlICE9IGNmZnNsb3QtPmZhY2UgKQotICAgICAgICByZXR1cm4gQ0ZGX0Vycl9JbnZhbGlkX0ZhY2VfSGFuZGxlOwotICAgIH0KLQotICAgIC8qIG5vdyBsb2FkIHRoZSBnbHlwaCBvdXRsaW5lIGlmIG5lY2Vzc2FyeSAqLwotICAgIGVycm9yID0gY2ZmX3Nsb3RfbG9hZCggc2xvdCwgc2l6ZSwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MgKTsKLQotICAgIC8qIGZvcmNlIGRyb3Atb3V0IG1vZGUgdG8gMiAtIGlycmVsZXZhbnQgbm93ICovCi0gICAgLyogc2xvdC0+b3V0bGluZS5kcm9wb3V0X21vZGUgPSAyOyAqLwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoRlRfRXJyb3IpCi0gIGNmZl9nZXRfYWR2YW5jZXMoIEZUX0ZhY2UgICAgZnRmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGFkdmFuY2VzICkKLSAgewotICAgIENGRl9GYWNlICAgICAgZmFjZSA9IChDRkZfRmFjZSkgZnRmYWNlOwotICAgIEZUX1VJbnQgICAgICAgbm47Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciA9IDA7Ci0gICAgRlRfR2x5cGhTbG90ICBzbG90ID0gZmFjZS0+cm9vdC5nbHlwaDsKLQotICAgIGZsYWdzIHw9IEZUX0xPQURfQURWQU5DRV9PTkxZOwotCi0gICAgZm9yIChubiA9IDA7IG5uIDwgY291bnQ7IG5uKyspCi0gICAgewotICAgICAgZXJyb3IgPSBMb2FkX0dseXBoKCBzbG90LCBmYWNlLT5yb290LnNpemUsIHN0YXJ0K25uLCBmbGFncyApOwotICAgICAgaWYgKGVycm9yKSBicmVhazsKLQotICAgICAgYWR2YW5jZXNbbm5dID0gKGZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQpCi0gICAgICAgICAgICAgICAgICAgPyBzbG90LT5hZHZhbmNlLnkKLSAgICAgICAgICAgICAgICAgICA6IHNsb3QtPmFkdmFuY2UueDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSAvKgotICAqICBHTFlQSCBESUNUIFNFUlZJQ0UKLSAgKgotICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfZ2V0X2dseXBoX25hbWUoIENGRl9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKQotICB7Ci0gICAgQ0ZGX0ZvbnQgICAgICAgICAgICBmb250ICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0gICAgRlRfU3RyaW5nKiAgICAgICAgICBnbmFtZTsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgIHNpZDsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsKLQotCi0gICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwc25hbWVzLCBQT1NUU0NSSVBUX0NNQVBTICk7Ci0gICAgaWYgKCAhcHNuYW1lcyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiY2ZmX2dldF9nbHlwaF9uYW1lOiIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgY2Fubm90IGdldCBnbHlwaCBuYW1lIGZyb20gQ0ZGICYgQ0VGIGZvbnRzXG4iICkpOwotICAgICAgRlRfRVJST1IoKCAiICAgICAgICAgICAgICAgICAgICIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgd2l0aG91dCB0aGUgYFBTTmFtZXMnIG1vZHVsZVxuIiApKTsKLSAgICAgIGVycm9yID0gQ0ZGX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGZpcnN0LCBsb2NhdGUgdGhlIHNpZCBpbiB0aGUgY2hhcnNldCB0YWJsZSAqLwotICAgIHNpZCA9IGZvbnQtPmNoYXJzZXQuc2lkc1tnbHlwaF9pbmRleF07Ci0KLSAgICAvKiBub3csIGxvb2t1cCB0aGUgbmFtZSBpdHNlbGYgKi8KLSAgICBnbmFtZSA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggJmZvbnQtPnN0cmluZ19pbmRleCwgc2lkLCBwc25hbWVzICk7Ci0KLSAgICBpZiAoIGduYW1lICkKLSAgICAgIEZUX1NUUkNQWU4oIGJ1ZmZlciwgZ25hbWUsIGJ1ZmZlcl9tYXggKTsKLQotICAgIEZUX0ZSRUUoIGduYW1lICk7Ci0gICAgZXJyb3IgPSBDRkZfRXJyX09rOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICBjZmZfZ2V0X25hbWVfaW5kZXgoIENGRl9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApCi0gIHsKLSAgICBDRkZfRm9udCAgICAgICAgICAgIGNmZjsKLSAgICBDRkZfQ2hhcnNldCAgICAgICAgIGNoYXJzZXQ7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzOwotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLSAgICBGVF9TdHJpbmcqICAgICAgICAgIG5hbWU7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICBzaWQ7Ci0gICAgRlRfVUludCAgICAgICAgICAgICBpOwotICAgIEZUX0ludCAgICAgICAgICAgICAgcmVzdWx0OwotCi0KLSAgICBjZmYgICAgID0gKENGRl9Gb250UmVjICopZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBjaGFyc2V0ID0gJmNmZi0+Y2hhcnNldDsKLQotICAgIEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSggZmFjZSwgcHNuYW1lcywgUE9TVFNDUklQVF9DTUFQUyApOwotICAgIGlmICggIXBzbmFtZXMgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGNmZi0+bnVtX2dseXBoczsgaSsrICkKLSAgICB7Ci0gICAgICBzaWQgPSBjaGFyc2V0LT5zaWRzW2ldOwotCi0gICAgICBpZiAoIHNpZCA+IDM5MCApCi0gICAgICAgIG5hbWUgPSBjZmZfaW5kZXhfZ2V0X25hbWUoICZjZmYtPnN0cmluZ19pbmRleCwgc2lkIC0gMzkxICk7Ci0gICAgICBlbHNlCi0gICAgICAgIG5hbWUgPSAoRlRfU3RyaW5nICopcHNuYW1lcy0+YWRvYmVfc3RkX3N0cmluZ3MoIHNpZCApOwotCi0gICAgICBpZiAoICFuYW1lICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIHJlc3VsdCA9IGZ0X3N0cmNtcCggZ2x5cGhfbmFtZSwgbmFtZSApOwotCi0gICAgICBpZiAoIHNpZCA+IDM5MCApCi0gICAgICAgIEZUX0ZSRUUoIG5hbWUgKTsKLQotICAgICAgaWYgKCAhcmVzdWx0ICkKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX0dseXBoRGljdFJlYyAgY2ZmX3NlcnZpY2VfZ2x5cGhfZGljdCA9Ci0gIHsKLSAgICAoRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jKSAgY2ZmX2dldF9nbHlwaF9uYW1lLAotICAgIChGVF9HbHlwaERpY3RfTmFtZUluZGV4RnVuYyljZmZfZ2V0X25hbWVfaW5kZXgsCi0gIH07Ci0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBJTkZPIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIEZUX0ludAotICBjZmZfcHNfaGFzX2dseXBoX25hbWVzKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIHJldHVybiAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgKSA+IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfcHNfZ2V0X2ZvbnRfaW5mbyggQ0ZGX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEluZm9SZWMqICBhZm9udF9pbmZvICkKLSAgewotICAgIENGRl9Gb250ICBjZmYgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBjZmYgJiYgY2ZmLT5mb250X2luZm8gPT0gTlVMTCApCi0gICAgewotICAgICAgQ0ZGX0ZvbnRSZWNEaWN0ICAgICBkaWN0ICAgID0gJmNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0OwotICAgICAgUFNfRm9udEluZm9SZWMgICAgICpmb250X2luZm87Ci0gICAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSAgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpY2ZmLT5wc25hbWVzOwotCi0KLSAgICAgIGlmICggRlRfQUxMT0MoIGZvbnRfaW5mbywgc2l6ZW9mICggKmZvbnRfaW5mbyApICkgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGZvbnRfaW5mby0+dmVyc2lvbiAgICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoICZjZmYtPnN0cmluZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc25hbWVzICk7Ci0gICAgICBmb250X2luZm8tPm5vdGljZSAgICAgID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCAmY2ZmLT5zdHJpbmdfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5ub3RpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc25hbWVzICk7Ci0gICAgICBmb250X2luZm8tPmZ1bGxfbmFtZSAgID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCAmY2ZmLT5zdHJpbmdfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5mdWxsX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc25hbWVzICk7Ci0gICAgICBmb250X2luZm8tPmZhbWlseV9uYW1lID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCAmY2ZmLT5zdHJpbmdfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5mYW1pbHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbmFtZXMgKTsKLSAgICAgIGZvbnRfaW5mby0+d2VpZ2h0ICAgICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoICZjZmYtPnN0cmluZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPndlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbmFtZXMgKTsKLSAgICAgIGZvbnRfaW5mby0+aXRhbGljX2FuZ2xlICAgICAgICA9IGRpY3QtPml0YWxpY19hbmdsZTsKLSAgICAgIGZvbnRfaW5mby0+aXNfZml4ZWRfcGl0Y2ggICAgICA9IGRpY3QtPmlzX2ZpeGVkX3BpdGNoOwotICAgICAgZm9udF9pbmZvLT51bmRlcmxpbmVfcG9zaXRpb24gID0gKEZUX1Nob3J0KWRpY3QtPnVuZGVybGluZV9wb3NpdGlvbjsKLSAgICAgIGZvbnRfaW5mby0+dW5kZXJsaW5lX3RoaWNrbmVzcyA9IChGVF9TaG9ydClkaWN0LT51bmRlcmxpbmVfdGhpY2tuZXNzOwotCi0gICAgICBjZmYtPmZvbnRfaW5mbyA9IGZvbnRfaW5mbzsKLSAgICB9Ci0KLSAgICAqYWZvbnRfaW5mbyA9ICpjZmYtPmZvbnRfaW5mbzsKLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNJbmZvUmVjICBjZmZfc2VydmljZV9wc19pbmZvID0KLSAgewotICAgIChQU19HZXRGb250SW5mb0Z1bmMpICAgY2ZmX3BzX2dldF9mb250X2luZm8sCi0gICAgKFBTX0hhc0dseXBoTmFtZXNGdW5jKSBjZmZfcHNfaGFzX2dseXBoX25hbWVzLAotICAgIChQU19HZXRGb250UHJpdmF0ZUZ1bmMpTlVMTCAgICAgICAgIC8qIHVuc3VwcG9ydGVkIHdpdGggQ0ZGIGZvbnRzICovCi0gIH07Ci0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIGNmZl9nZXRfcHNfbmFtZSggQ0ZGX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgQ0ZGX0ZvbnQgIGNmZiA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0KLSAgICByZXR1cm4gKGNvbnN0IGNoYXIqKWNmZi0+Zm9udF9uYW1lOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9Qc0ZvbnROYW1lUmVjICBjZmZfc2VydmljZV9wc19uYW1lID0KLSAgewotICAgIChGVF9Qc05hbWVfR2V0RnVuYyljZmZfZ2V0X3BzX25hbWUKLSAgfTsKLQotCi0gIC8qCi0gICAqIFRUIENNQVAgSU5GTwotICAgKgotICAgKiBJZiB0aGUgY2hhcm1hcCBpcyBhIHN5bnRoZXRpYyBVbmljb2RlIGVuY29kaW5nIGNtYXAgb3IKLSAgICogYSBUeXBlIDEgc3RhbmRhcmQgKG9yIGV4cGVydCkgZW5jb2RpbmcgY21hcCwgaGlkZSBUVCBDTUFQIElORk8KLSAgICogc2VydmljZSBkZWZpbmVkIGluIFNGTlQgbW9kdWxlLgotICAgKgotICAgKiBPdGhlcndpc2UgY2FsbCB0aGUgc2VydmljZSBmdW5jdGlvbiBpbiB0aGUgc2ZudCBtb2R1bGUuCi0gICAqCi0gICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX2dldF9jbWFwX2luZm8oIEZUX0NoYXJNYXAgICAgY2hhcm1hcCwKLSAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICkKLSAgewotICAgIEZUX0NNYXAgICBjbWFwICA9IEZUX0NNQVAoIGNoYXJtYXAgKTsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBDRkZfRXJyX09rOwotCi0KLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gMDsKLQotICAgIGlmICggY21hcC0+Y2xhenogIT0gJmNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYyAmJgotICAgICAgICAgY21hcC0+Y2xhenogIT0gJmNmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjICApCi0gICAgewotICAgICAgRlRfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gRlRfQ01BUF9GQUNFKCBjbWFwICk7Ci0gICAgICBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnkgPSBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKTsKLSAgICAgIEZUX01vZHVsZSAgICAgICAgICAgc2ZudCAgICA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJzZm50IiApOwotICAgICAgRlRfU2VydmljZV9UVENNYXBzICBzZXJ2aWNlID0KLSAgICAgICAgKEZUX1NlcnZpY2VfVFRDTWFwcylmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIHNmbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAgKTsKLQotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+Z2V0X2NtYXBfaW5mbyApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X2NtYXBfaW5mbyggY2hhcm1hcCwgY21hcF9pbmZvICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9UVENNYXBzUmVjICBjZmZfc2VydmljZV9nZXRfY21hcF9pbmZvID0KLSAgewotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYyljZmZfZ2V0X2NtYXBfaW5mbwotICB9OwotCi0KLSAgLyoKLSAgICogIENJRCBJTkZPIFNFUlZJQ0UKLSAgICoKLSAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfZ2V0X3JvcyggQ0ZGX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqb3JkZXJpbmcsCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gQ0ZGX0Vycl9PazsKLSAgICBDRkZfRm9udCAgY2ZmICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLQotCi0gICAgaWYgKCBjZmYgKQotICAgIHsKLSAgICAgIENGRl9Gb250UmVjRGljdCAgICAgZGljdCAgICA9ICZjZmYtPnRvcF9mb250LmZvbnRfZGljdDsKLSAgICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpY2ZmLT5wc25hbWVzOwotCi0KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgKQotICAgICAgewotICAgICAgICBlcnJvciA9IENGRl9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICBpZiAoIHJlZ2lzdHJ5ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjZmYtPnJlZ2lzdHJ5ID09IE5VTEwgKQotICAgICAgICAgIGNmZi0+cmVnaXN0cnkgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoICZjZmYtPnN0cmluZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNuYW1lcyApOwotICAgICAgICAqcmVnaXN0cnkgPSBjZmYtPnJlZ2lzdHJ5OwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoIG9yZGVyaW5nICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjZmYtPm9yZGVyaW5nID09IE5VTEwgKQotICAgICAgICAgIGNmZi0+b3JkZXJpbmcgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoICZjZmYtPnN0cmluZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfb3JkZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNuYW1lcyApOwotICAgICAgICAqb3JkZXJpbmcgPSBjZmYtPm9yZGVyaW5nOwotICAgICAgfQotCi0gICAgICBpZiAoIHN1cHBsZW1lbnQgKQotICAgICAgICAqc3VwcGxlbWVudCA9IGRpY3QtPmNpZF9zdXBwbGVtZW50OwotICAgIH0KLSAgICAgIAotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfQ0lEUmVjICBjZmZfc2VydmljZV9jaWRfaW5mbyA9Ci0gIHsKLSAgICAoRlRfQ0lEX0dldFJlZ2lzdHJ5T3JkZXJpbmdTdXBwbGVtZW50RnVuYyljZmZfZ2V0X3JvcwotICB9OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICBEIFIgSSBWIEUgUiAgSSBOIFQgRSBSIEYgQSBDIEUgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2ZmX3NlcnZpY2VzW10gPQotICB7Ci0gICAgeyBGVF9TRVJWSUNFX0lEX1hGODZfTkFNRSwgICAgICAgICAgICBGVF9YRjg2X0ZPUk1BVF9DRkYgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9JTkZPLCAgICAgICZjZmZfc2VydmljZV9wc19pbmZvIH0sCi0gICAgeyBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmY2ZmX3NlcnZpY2VfcHNfbmFtZSB9LAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0dMWVBIX05BTUVTCi0gICAgeyBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QsICAgICAgICAgICAmY2ZmX3NlcnZpY2VfZ2x5cGhfZGljdCB9LAotI2VuZGlmCi0gICAgeyBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmY2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9DSUQsICAgICAgICAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2NpZF9pbmZvIH0sCi0gICAgeyBOVUxMLCBOVUxMIH0KLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfTW9kdWxlX0ludGVyZmFjZSApCi0gIGNmZl9nZXRfaW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgZHJpdmVyLCAgICAgICAvKiBDRkZfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX2ludGVyZmFjZSApCi0gIHsKLSAgICBGVF9Nb2R1bGUgICAgICAgICAgICBzZm50OwotICAgIEZUX01vZHVsZV9JbnRlcmZhY2UgIHJlc3VsdDsKLQotCi0gICAgcmVzdWx0ID0gZnRfc2VydmljZV9saXN0X2xvb2t1cCggY2ZmX3NlcnZpY2VzLCBtb2R1bGVfaW50ZXJmYWNlICk7Ci0gICAgaWYgKCByZXN1bHQgIT0gTlVMTCApCi0gICAgICByZXR1cm4gIHJlc3VsdDsKLQotICAgIC8qIHdlIHBhc3Mgb3VyIHJlcXVlc3QgdG8gdGhlIGBzZm50JyBtb2R1bGUgKi8KLSAgICBzZm50ID0gRlRfR2V0X01vZHVsZSggZHJpdmVyLT5saWJyYXJ5LCAic2ZudCIgKTsKLQotICAgIHJldHVybiBzZm50ID8gc2ZudC0+Y2xhenotPmdldF9pbnRlcmZhY2UoIHNmbnQsIG1vZHVsZV9pbnRlcmZhY2UgKSA6IDA7Ci0gIH0KLQotCi0gIC8qIFRoZSBGVF9Ecml2ZXJJbnRlcmZhY2Ugc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gZnRkcml2ZXIuaC4gKi8KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICBjZmZfZHJpdmVyX2NsYXNzID0KLSAgewotICAgIC8qIGJlZ2luIHdpdGggdGhlIEZUX01vZHVsZV9DbGFzcyBmaWVsZHMgKi8KLSAgICB7Ci0gICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIgICAgICAgfAotICAgICAgRlRfTU9EVUxFX0RSSVZFUl9TQ0FMQUJMRSAgIHwKLSAgICAgIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiwKLQotICAgICAgc2l6ZW9mKCBDRkZfRHJpdmVyUmVjICksCi0gICAgICAiY2ZmIiwKLSAgICAgIDB4MTAwMDBMLAotICAgICAgMHgyMDAwMEwsCi0KLSAgICAgIDAsICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICBjZmZfZHJpdmVyX2luaXQsCi0gICAgICBjZmZfZHJpdmVyX2RvbmUsCi0gICAgICBjZmZfZ2V0X2ludGVyZmFjZSwKLSAgICB9LAotCi0gICAgLyogbm93IHRoZSBzcGVjaWZpYyBkcml2ZXIgZmllbGRzICovCi0gICAgc2l6ZW9mKCBUVF9GYWNlUmVjICksCi0gICAgc2l6ZW9mKCBDRkZfU2l6ZVJlYyApLAotICAgIHNpemVvZiggQ0ZGX0dseXBoU2xvdFJlYyApLAotCi0gICAgY2ZmX2ZhY2VfaW5pdCwKLSAgICBjZmZfZmFjZV9kb25lLAotICAgIGNmZl9zaXplX2luaXQsCi0gICAgY2ZmX3NpemVfZG9uZSwKLSAgICBjZmZfc2xvdF9pbml0LAotICAgIGNmZl9zbG90X2RvbmUsCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLSAgICBmdF9zdHViX3NldF9jaGFyX3NpemVzLAotICAgIGZ0X3N0dWJfc2V0X3BpeGVsX3NpemVzLAotI2VuZGlmCi0KLSAgICBMb2FkX0dseXBoLAotCi0gICAgY2ZmX2dldF9rZXJuaW5nLAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfQXR0YWNoRnVuYyAgICAgICovCi0gICAgY2ZmX2dldF9hZHZhbmNlcywgICAgICAgLyogRlRfRmFjZV9HZXRBZHZhbmNlc0Z1bmMgKi8KLQotICAgIGNmZl9zaXplX3JlcXVlc3QsCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLSAgICBjZmZfc2l6ZV9zZWxlY3QKLSNlbHNlCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9TZWxlY3RGdW5jICAgICAgKi8KLSNlbmRpZgotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZkcml2ci5oIGIvc3JjL2NmZi9jZmZkcml2ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTM4NDhjLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmZHJpdnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmRyaXZyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIE9wZW5UeXBlIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGRkRSSVZFUl9IX18KLSNkZWZpbmUgX19DRkZEUklWRVJfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICBjZmZfZHJpdmVyX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fQ0ZGRFJJVkVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZlcnJzLmggYi9zcmMvY2ZmL2NmZmVycnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyYTVjOS4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZmVycnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmVycnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgQ0ZGIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19DRkZFUlJTX0hfXwotI2RlZmluZSBfX0NGRkVSUlNfSF9fCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgX19GVEVSUk9SU19IX18KLQotI2RlZmluZSBGVF9FUlJfUFJFRklYICBDRkZfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0NGRgotCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX0NGRkVSUlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZmdsb2FkLmMgYi9zcmMvY2ZmL2NmZmdsb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOTZkMTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZnbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZnbG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgR2x5cGggTG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0KLSNpbmNsdWRlICJjZmZvYmpzLmgiCi0jaW5jbHVkZSAiY2ZmbG9hZC5oIgotI2luY2x1ZGUgImNmZmdsb2FkLmgiCi0KLSNpbmNsdWRlICJjZmZlcnJzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jZmZnbG9hZAotCi0KLSAgdHlwZWRlZiBlbnVtICBDRkZfT3BlcmF0b3JfCi0gIHsKLSAgICBjZmZfb3BfdW5rbm93biA9IDAsCi0KLSAgICBjZmZfb3Bfcm1vdmV0bywKLSAgICBjZmZfb3BfaG1vdmV0bywKLSAgICBjZmZfb3Bfdm1vdmV0bywKLQotICAgIGNmZl9vcF9ybGluZXRvLAotICAgIGNmZl9vcF9obGluZXRvLAotICAgIGNmZl9vcF92bGluZXRvLAotCi0gICAgY2ZmX29wX3JyY3VydmV0bywKLSAgICBjZmZfb3BfaGhjdXJ2ZXRvLAotICAgIGNmZl9vcF9odmN1cnZldG8sCi0gICAgY2ZmX29wX3JjdXJ2ZWxpbmUsCi0gICAgY2ZmX29wX3JsaW5lY3VydmUsCi0gICAgY2ZmX29wX3ZoY3VydmV0bywKLSAgICBjZmZfb3BfdnZjdXJ2ZXRvLAotCi0gICAgY2ZmX29wX2ZsZXgsCi0gICAgY2ZmX29wX2hmbGV4LAotICAgIGNmZl9vcF9oZmxleDEsCi0gICAgY2ZmX29wX2ZsZXgxLAotCi0gICAgY2ZmX29wX2VuZGNoYXIsCi0KLSAgICBjZmZfb3BfaHN0ZW0sCi0gICAgY2ZmX29wX3ZzdGVtLAotICAgIGNmZl9vcF9oc3RlbWhtLAotICAgIGNmZl9vcF92c3RlbWhtLAotCi0gICAgY2ZmX29wX2hpbnRtYXNrLAotICAgIGNmZl9vcF9jbnRybWFzaywKLSAgICBjZmZfb3BfZG90c2VjdGlvbiwgIC8qIGRlcHJlY2F0ZWQsIGFjdHMgYXMgbm8tb3AgKi8KLQotICAgIGNmZl9vcF9hYnMsCi0gICAgY2ZmX29wX2FkZCwKLSAgICBjZmZfb3Bfc3ViLAotICAgIGNmZl9vcF9kaXYsCi0gICAgY2ZmX29wX25lZywKLSAgICBjZmZfb3BfcmFuZG9tLAotICAgIGNmZl9vcF9tdWwsCi0gICAgY2ZmX29wX3NxcnQsCi0KLSAgICBjZmZfb3BfYmxlbmQsCi0KLSAgICBjZmZfb3BfZHJvcCwKLSAgICBjZmZfb3BfZXhjaCwKLSAgICBjZmZfb3BfaW5kZXgsCi0gICAgY2ZmX29wX3JvbGwsCi0gICAgY2ZmX29wX2R1cCwKLQotICAgIGNmZl9vcF9wdXQsCi0gICAgY2ZmX29wX2dldCwKLSAgICBjZmZfb3Bfc3RvcmUsCi0gICAgY2ZmX29wX2xvYWQsCi0KLSAgICBjZmZfb3BfYW5kLAotICAgIGNmZl9vcF9vciwKLSAgICBjZmZfb3Bfbm90LAotICAgIGNmZl9vcF9lcSwKLSAgICBjZmZfb3BfaWZlbHNlLAotCi0gICAgY2ZmX29wX2NhbGxzdWJyLAotICAgIGNmZl9vcF9jYWxsZ3N1YnIsCi0gICAgY2ZmX29wX3JldHVybiwKLQotICAgIGNmZl9vcF9oc2J3LCAgICAgICAgLyogVHlwZSAxIG9wY29kZTogaW52YWxpZCBidXQgc2VlbiBpbiByZWFsIGxpZmUgKi8KLSAgICBjZmZfb3BfY2xvc2VwYXRoLCAgIC8qIGRpdHRvICovCi0KLSAgICAvKiBkbyBub3QgcmVtb3ZlICovCi0gICAgY2ZmX29wX21heAotCi0gIH0gQ0ZGX09wZXJhdG9yOwotCi0KLSNkZWZpbmUgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRIICAweDgwCi0jZGVmaW5lIENGRl9DT1VOVF9FWEFDVCAgICAgICAgMHg0MAotI2RlZmluZSBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0sgIDB4MjAKLQotCi0gIHN0YXRpYyBjb25zdCBGVF9CeXRlICBjZmZfYXJndW1lbnRfY291bnRzW10gPQotICB7Ci0gICAgMCwgIC8qIHVua25vd24gKi8KLQotICAgIDIgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEggfCBDRkZfQ09VTlRfRVhBQ1QsIC8qIHJtb3ZldG8gKi8KLSAgICAxIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRIIHwgQ0ZGX0NPVU5UX0VYQUNULAotICAgIDEgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEggfCBDRkZfQ09VTlRfRVhBQ1QsCi0KLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLCAvKiBybGluZXRvICovCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLAotCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywgLyogcnJjdXJ2ZXRvICovCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLAotICAgIDAgfCBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0ssCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLAotICAgIDAgfCBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0ssCi0KLSAgICAxMywgLyogZmxleCAqLwotICAgIDcsCi0gICAgOSwKLSAgICAxMSwKLQotICAgIDAgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsIC8qIGVuZGNoYXIgKi8KLQotICAgIDIgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsIC8qIGhzdGVtICovCi0gICAgMiB8IENGRl9DT1VOVF9DSEVDS19XSURUSCwKLSAgICAyIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRILAotICAgIDIgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsCi0KLSAgICAwIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRILCAvKiBoaW50bWFzayAqLwotICAgIDAgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsIC8qIGNudHJtYXNrICovCi0gICAgMCwgLyogZG90c2VjdGlvbiAqLwotCi0gICAgMSwgLyogYWJzICovCi0gICAgMiwKLSAgICAyLAotICAgIDIsCi0gICAgMSwKLSAgICAwLAotICAgIDIsCi0gICAgMSwKLQotICAgIDEsIC8qIGJsZW5kICovCi0KLSAgICAxLCAvKiBkcm9wICovCi0gICAgMiwKLSAgICAxLAotICAgIDIsCi0gICAgMSwKLQotICAgIDIsIC8qIHB1dCAqLwotICAgIDEsCi0gICAgNCwKLSAgICAzLAotCi0gICAgMiwgLyogYW5kICovCi0gICAgMiwKLSAgICAxLAotICAgIDIsCi0gICAgNCwKLQotICAgIDEsIC8qIGNhbGxzdWJyICovCi0gICAgMSwKLSAgICAwLAotCi0gICAgMiwgLyogaHNidyAqLwotICAgIDAKLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgR0VORVJJQyBDSEFSU1RSSU5HIFBBUlNJTkcgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNmZl9idWlsZGVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1aWxkZXIgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGluaXRpYWxpemUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICA6OiBUaGUgY3VycmVudCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgIDo6IFRoZSBjdXJyZW50IGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRpbmcgOjogV2hldGhlciBoaW50aW5nIGlzIGFjdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX2J1aWxkZXJfaW5pdCggQ0ZGX0J1aWxkZXIqICAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIGhpbnRpbmcgKQotICB7Ci0gICAgYnVpbGRlci0+cGF0aF9iZWd1biAgPSAwOwotICAgIGJ1aWxkZXItPmxvYWRfcG9pbnRzID0gMTsKLQotICAgIGJ1aWxkZXItPmZhY2UgICA9IGZhY2U7Ci0gICAgYnVpbGRlci0+Z2x5cGggID0gZ2x5cGg7Ci0gICAgYnVpbGRlci0+bWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLSAgICBpZiAoIGdseXBoICkKLSAgICB7Ci0gICAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyID0gZ2x5cGgtPnJvb3QuaW50ZXJuYWwtPmxvYWRlcjsKLQotCi0gICAgICBidWlsZGVyLT5sb2FkZXIgID0gbG9hZGVyOwotICAgICAgYnVpbGRlci0+YmFzZSAgICA9ICZsb2FkZXItPmJhc2Uub3V0bGluZTsKLSAgICAgIGJ1aWxkZXItPmN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0gICAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGxvYWRlciApOwotCi0gICAgICBidWlsZGVyLT5oaW50c19nbG9iYWxzID0gMDsKLSAgICAgIGJ1aWxkZXItPmhpbnRzX2Z1bmNzICAgPSAwOwotCi0gICAgICBpZiAoIGhpbnRpbmcgJiYgc2l6ZSApCi0gICAgICB7Ci0gICAgICAgIENGRl9JbnRlcm5hbCAgaW50ZXJuYWwgPSAoQ0ZGX0ludGVybmFsKXNpemUtPnJvb3QuaW50ZXJuYWw7Ci0KLQotICAgICAgICBidWlsZGVyLT5oaW50c19nbG9iYWxzID0gKHZvaWQgKilpbnRlcm5hbC0+dG9wZm9udDsKLSAgICAgICAgYnVpbGRlci0+aGludHNfZnVuY3MgICA9IGdseXBoLT5yb290LmludGVybmFsLT5nbHlwaF9oaW50czsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBidWlsZGVyLT5wb3NfeCA9IDA7Ci0gICAgYnVpbGRlci0+cG9zX3kgPSAwOwotCi0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnggPSAwOwotICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZy55ID0gMDsKLSAgICBidWlsZGVyLT5hZHZhbmNlLnggICAgICA9IDA7Ci0gICAgYnVpbGRlci0+YWR2YW5jZS55ICAgICAgPSAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfYnVpbGRlcl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiAgSXRzIGNvbnRlbnRzIGNhbiBzdGlsbCBiZSB1c2VkICAgKi8KLSAgLyogICAgYWZ0ZXIgdGhlIGNhbGwsIGJ1dCB0aGUgZnVuY3Rpb24gc2F2ZXMgaW1wb3J0YW50IGluZm9ybWF0aW9uICAgICAgICovCi0gIC8qICAgIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1aWxkZXIgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGZpbmFsaXplLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX2J1aWxkZXJfZG9uZSggQ0ZGX0J1aWxkZXIqICBidWlsZGVyICkKLSAgewotICAgIENGRl9HbHlwaFNsb3QgIGdseXBoID0gYnVpbGRlci0+Z2x5cGg7Ci0KLQotICAgIGlmICggZ2x5cGggKQotICAgICAgZ2x5cGgtPnJvb3Qub3V0bGluZSA9ICpidWlsZGVyLT5iYXNlOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfY29tcHV0ZV9iaWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgYmlhcyB2YWx1ZSBpbiBkZXBlbmRlbmNlIG9mIHRoZSBudW1iZXIgb2YgZ2x5cGggICAgICAgKi8KLSAgLyogICAgc3Vicm91dGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3N1YnJzIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGggc3Vicm91dGluZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJpYXMgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9JbnQKLSAgY2ZmX2NvbXB1dGVfYmlhcyggRlRfVUludCAgbnVtX3N1YnJzICkKLSAgewotICAgIEZUX0ludCAgcmVzdWx0OwotCi0KLSAgICBpZiAoIG51bV9zdWJycyA8IDEyNDAgKQotICAgICAgcmVzdWx0ID0gMTA3OwotICAgIGVsc2UgaWYgKCBudW1fc3VicnMgPCAzMzkwMFUgKQotICAgICAgcmVzdWx0ID0gMTEzMTsKLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSAzMjc2OFU7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfZGVjb2Rlcl9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIGdseXBoIGRlY29kZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWNvZGVyIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggYnVpbGRlciB0byBpbml0aWFsaXplLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgICA6OiBUaGUgY3VycmVudCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2xvdCAgICAgIDo6IFRoZSBjdXJyZW50IGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50aW5nICAgOjogV2hldGhlciBoaW50aW5nIGlzIGFjdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRfbW9kZSA6OiBUaGUgaGludGluZyBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX2RlY29kZXJfaW5pdCggQ0ZGX0RlY29kZXIqICAgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBDRkZfU2l6ZSAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX0dseXBoU2xvdCAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBoaW50aW5nLAotICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgaGludF9tb2RlICkKLSAgewotICAgIENGRl9Gb250ICBjZmYgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLQotCi0gICAgLyogY2xlYXIgZXZlcnl0aGluZyAqLwotICAgIEZUX01FTV9aRVJPKCBkZWNvZGVyLCBzaXplb2YgKCAqZGVjb2RlciApICk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGJ1aWxkZXIgKi8KLSAgICBjZmZfYnVpbGRlcl9pbml0KCAmZGVjb2Rlci0+YnVpbGRlciwgZmFjZSwgc2l6ZSwgc2xvdCwgaGludGluZyApOwotCi0gICAgLyogaW5pdGlhbGl6ZSBUeXBlMiBkZWNvZGVyICovCi0gICAgZGVjb2Rlci0+bnVtX2dsb2JhbHMgID0gY2ZmLT5udW1fZ2xvYmFsX3N1YnJzOwotICAgIGRlY29kZXItPmdsb2JhbHMgICAgICA9IGNmZi0+Z2xvYmFsX3N1YnJzOwotICAgIGRlY29kZXItPmdsb2JhbHNfYmlhcyA9IGNmZl9jb21wdXRlX2JpYXMoIGRlY29kZXItPm51bV9nbG9iYWxzICk7Ci0KLSAgICBkZWNvZGVyLT5oaW50X21vZGUgICAgPSBoaW50X21vZGU7Ci0gIH0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZGVjb2Rlcl9zZXRfd2lkdGhfb25seSggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICkKLSAgewotICAgIGRlY29kZXItPndpZHRoX29ubHkgPSAxOwotICB9Ci0KLSAgLyogdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgc3ViZm9udCAqLwotICAvKiBhbmQgdGhlIGxvY2FscyBzdWJycyBhcnJheSAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZGVjb2Rlcl9wcmVwYXJlKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCApCi0gIHsKLSAgICBDRkZfQnVpbGRlciAgKmJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKLSAgICBDRkZfRm9udCAgICAgIGNmZiAgICAgPSAoQ0ZGX0ZvbnQpYnVpbGRlci0+ZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBDRkZfU3ViRm9udCAgIHN1YiAgICAgPSAmY2ZmLT50b3BfZm9udDsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yICAgPSBDRkZfRXJyX09rOwotCi0KLSAgICAvKiBtYW5hZ2UgQ0lEIGZvbnRzICovCi0gICAgaWYgKCBjZmYtPm51bV9zdWJmb250cyApCi0gICAgewotICAgICAgRlRfQnl0ZSAgZmRfaW5kZXggPSBjZmZfZmRfc2VsZWN0X2dldCggJmNmZi0+ZmRfc2VsZWN0LCBnbHlwaF9pbmRleCApOwotCi0KLSAgICAgIGlmICggZmRfaW5kZXggPj0gY2ZmLT5udW1fc3ViZm9udHMgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiY2ZmX2RlY29kZXJfcHJlcGFyZTogaW52YWxpZCBDSUQgc3ViZm9udCBpbmRleFxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBDRkZfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgc3ViID0gY2ZmLT5zdWJmb250c1tmZF9pbmRleF07Ci0gICAgICBpZiAoIGJ1aWxkZXItPmhpbnRzX2Z1bmNzICkKLSAgICAgIHsKLSAgICAgICAgQ0ZGX0ludGVybmFsICBpbnRlcm5hbCA9IChDRkZfSW50ZXJuYWwpc2l6ZS0+cm9vdC5pbnRlcm5hbDsKLQotCi0gICAgICAgIC8qIGZvciBDRkZzIHdpdGhvdXQgc3ViZm9udHMsIHRoaXMgdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBzZXQgKi8KLSAgICAgICAgYnVpbGRlci0+aGludHNfZ2xvYmFscyA9ICh2b2lkICopaW50ZXJuYWwtPnN1YmZvbnRzW2ZkX2luZGV4XTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWNvZGVyLT5udW1fbG9jYWxzICAgID0gc3ViLT5udW1fbG9jYWxfc3VicnM7Ci0gICAgZGVjb2Rlci0+bG9jYWxzICAgICAgICA9IHN1Yi0+bG9jYWxfc3VicnM7Ci0gICAgZGVjb2Rlci0+bG9jYWxzX2JpYXMgICA9IGNmZl9jb21wdXRlX2JpYXMoIGRlY29kZXItPm51bV9sb2NhbHMgKTsKLQotICAgIGRlY29kZXItPmdseXBoX3dpZHRoICAgPSBzdWItPnByaXZhdGVfZGljdC5kZWZhdWx0X3dpZHRoOwotICAgIGRlY29kZXItPm5vbWluYWxfd2lkdGggPSBzdWItPnByaXZhdGVfZGljdC5ub21pbmFsX3dpZHRoOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgYGNvdW50JyBtb3JlIHBvaW50cyAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2hlY2tfcG9pbnRzKCBDRkZfQnVpbGRlciogIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBjb3VudCApCi0gIHsKLSAgICByZXR1cm4gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBidWlsZGVyLT5sb2FkZXIsIGNvdW50LCAwICk7Ci0gIH0KLQotCi0gIC8qIGFkZCBhIG5ldyBwb2ludCwgZG8gbm90IGNoZWNrIHNwYWNlICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmZl9idWlsZGVyX2FkZF9wb2ludCggQ0ZGX0J1aWxkZXIqICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgICBmbGFnICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLQotCi0gICAgaWYgKCBidWlsZGVyLT5sb2FkX3BvaW50cyApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgcG9pbnQgICA9IG91dGxpbmUtPnBvaW50cyArIG91dGxpbmUtPm5fcG9pbnRzOwotICAgICAgRlRfQnl0ZSogICAgY29udHJvbCA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgcG9pbnQtPnggPSB4ID4+IDE2OwotICAgICAgcG9pbnQtPnkgPSB5ID4+IDE2OwotICAgICAgKmNvbnRyb2wgPSAoRlRfQnl0ZSkoIGZsYWcgPyBGVF9DVVJWRV9UQUdfT04gOiBGVF9DVVJWRV9UQUdfQ1VCSUMgKTsKLQotICAgICAgYnVpbGRlci0+bGFzdCA9ICpwb2ludDsKLSAgICB9Ci0KLSAgICBvdXRsaW5lLT5uX3BvaW50cysrOwotICB9Ci0KLQotICAvKiBjaGVjayBzcGFjZSBmb3IgYSBuZXcgb24tY3VydmUgcG9pbnQsIHRoZW4gYWRkIGl0ICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQxKCBDRkZfQnVpbGRlciogIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBjaGVja19wb2ludHMoIGJ1aWxkZXIsIDEgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2hlY2sgc3BhY2UgZm9yIGEgbmV3IGNvbnRvdXIsIHRoZW4gYWRkIGl0ICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfYnVpbGRlcl9hZGRfY29udG91ciggQ0ZGX0J1aWxkZXIqICBidWlsZGVyICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIWJ1aWxkZXItPmxvYWRfcG9pbnRzICkKLSAgICB7Ci0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgICByZXR1cm4gQ0ZGX0Vycl9PazsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggYnVpbGRlci0+bG9hZGVyLCAwLCAxICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyA+IDAgKQotICAgICAgICBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV0gPQotICAgICAgICAgIChzaG9ydCkoIG91dGxpbmUtPm5fcG9pbnRzIC0gMSApOwotCi0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBpZiBhIHBhdGggd2FzIGJlZ3VuLCBhZGQgaXRzIGZpcnN0IG9uLWN1cnZlIHBvaW50ICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggQ0ZGX0J1aWxkZXIqICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IENGRl9FcnJfT2s7Ci0KLQotICAgIC8qIHRlc3Qgd2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgYSBuZXcgY29udG91ciAqLwotICAgIGlmICggIWJ1aWxkZXItPnBhdGhfYmVndW4gKQotICAgIHsKLSAgICAgIGJ1aWxkZXItPnBhdGhfYmVndW4gPSAxOwotICAgICAgZXJyb3IgPSBjZmZfYnVpbGRlcl9hZGRfY29udG91ciggYnVpbGRlciApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IGNmZl9idWlsZGVyX2FkZF9wb2ludDEoIGJ1aWxkZXIsIHgsIHkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGNsb3NlIHRoZSBjdXJyZW50IGNvbnRvdXIgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX2J1aWxkZXJfY2xvc2VfY29udG91ciggQ0ZGX0J1aWxkZXIqICBidWlsZGVyICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLQotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBYWFhYOiBXZSBtdXN0IG5vdCBpbmNsdWRlIHRoZSBsYXN0IHBvaW50IGluIHRoZSBwYXRoIGlmIGl0ICovCi0gICAgLyogICAgICAgaXMgbG9jYXRlZCBvbiB0aGUgZmlyc3QgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPiAxICkKLSAgICB7Ci0gICAgICBGVF9JbnQgICAgICBmaXJzdCAgID0gMDsKLSAgICAgIEZUX1ZlY3RvciogIHAxICAgICAgPSBvdXRsaW5lLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgIEZUX1ZlY3RvciogIHAyICAgICAgPSBvdXRsaW5lLT5wb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50cyAtIDE7Ci0gICAgICBGVF9CeXRlKiAgICBjb250cm9sID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3MgKyBvdXRsaW5lLT5uX3BvaW50cyAtIDE7Ci0KLQotICAgICAgaWYgKCBvdXRsaW5lLT5uX2NvbnRvdXJzID4gMSApCi0gICAgICB7Ci0gICAgICAgIGZpcnN0ID0gb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDJdICsgMTsKLSAgICAgICAgcDEgICAgPSBvdXRsaW5lLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgIH0KLQotICAgICAgLyogYGRlbGV0ZScgbGFzdCBwb2ludCBvbmx5IGlmIGl0IGNvaW5jaWRlcyB3aXRoIHRoZSBmaXJzdCAgICAqLwotICAgICAgLyogcG9pbnQgYW5kIGlmIGl0IGlzIG5vdCBhIGNvbnRyb2wgcG9pbnQgKHdoaWNoIGNhbiBoYXBwZW4pLiAqLwotICAgICAgaWYgKCBwMS0+eCA9PSBwMi0+eCAmJiBwMS0+eSA9PSBwMi0+eSApCi0gICAgICAgIGlmICggKmNvbnRyb2wgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICBvdXRsaW5lLT5uX3BvaW50cy0tOwotICAgIH0KLQotICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyA+IDAgKQotICAgICAgb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDFdID0KLSAgICAgICAgKHNob3J0KSggb3V0bGluZS0+bl9wb2ludHMgLSAxICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9JbnQKLSAgY2ZmX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggQ0ZGX0ZvbnQgIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGNoYXJjb2RlICkKLSAgewotICAgIEZUX1VJbnQgICAgbjsKLSAgICBGVF9VU2hvcnQgIGdseXBoX3NpZDsKLQotCi0gICAgLyogQ0lELWtleWVkIGZvbnRzIGRvbid0IGhhdmUgZ2x5cGggbmFtZXMgKi8KLSAgICBpZiAoICFjZmYtPmNoYXJzZXQuc2lkcyApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBjaGVjayByYW5nZSBvZiBzdGFuZGFyZCBjaGFyIGNvZGUgKi8KLSAgICBpZiAoIGNoYXJjb2RlIDwgMCB8fCBjaGFyY29kZSA+IDI1NSApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBHZXQgY29kZSB0byBTSUQgbWFwcGluZyBmcm9tIGBjZmZfc3RhbmRhcmRfZW5jb2RpbmcnLiAqLwotICAgIGdseXBoX3NpZCA9IGNmZl9nZXRfc3RhbmRhcmRfZW5jb2RpbmcoIChGVF9VSW50KWNoYXJjb2RlICk7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGNmZi0+bnVtX2dseXBoczsgbisrICkKLSAgICB7Ci0gICAgICBpZiAoIGNmZi0+Y2hhcnNldC5zaWRzW25dID09IGdseXBoX3NpZCApCi0gICAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIHJldHVybiAtMTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfZ2x5cGhfZGF0YSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICkKLSAgewotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAvKiBGb3IgaW5jcmVtZW50YWwgZm9udHMgZ2V0IHRoZSBjaGFyYWN0ZXIgZGF0YSB1c2luZyB0aGUgKi8KLSAgICAvKiBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgewotICAgICAgRlRfRGF0YSAgIGRhdGE7Ci0gICAgICBGVF9FcnJvciAgZXJyb3IgPQotICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5mdW5jcy0+Z2V0X2dseXBoX2RhdGEoCi0gICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgJmRhdGEgKTsKLQotCi0gICAgICAqcG9pbnRlciA9IChGVF9CeXRlKilkYXRhLnBvaW50ZXI7Ci0gICAgICAqbGVuZ3RoID0gZGF0YS5sZW5ndGg7Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotICAgIHsKLSAgICAgIENGRl9Gb250ICBjZmYgID0gKENGRl9Gb250KShmYWNlLT5leHRyYS5kYXRhKTsKLQotCi0gICAgICByZXR1cm4gY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50KCAmY2ZmLT5jaGFyc3RyaW5nc19pbmRleCwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyLCBsZW5ndGggKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmZl9mcmVlX2dseXBoX2RhdGEoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGxlbmd0aCApCi0gIHsKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIEZUX1VOVVNFRCggbGVuZ3RoICk7Ci0jZW5kaWYKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAvKiBGb3IgaW5jcmVtZW50YWwgZm9udHMgZ2V0IHRoZSBjaGFyYWN0ZXIgZGF0YSB1c2luZyB0aGUgKi8KLSAgICAvKiBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgewotICAgICAgRlRfRGF0YSBkYXRhOwotCi0KLSAgICAgIGRhdGEucG9pbnRlciA9ICpwb2ludGVyOwotICAgICAgZGF0YS5sZW5ndGggID0gbGVuZ3RoOwotCi0gICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5mcmVlX2dseXBoX2RhdGEoCi0gICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LCZkYXRhICk7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICB7Ci0gICAgICBDRkZfRm9udCAgY2ZmID0gKENGRl9Gb250KShmYWNlLT5leHRyYS5kYXRhKTsKLQotCi0gICAgICBjZmZfaW5kZXhfZm9yZ2V0X2VsZW1lbnQoICZjZmYtPmNoYXJzdHJpbmdzX2luZGV4LCBwb2ludGVyICk7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX29wZXJhdG9yX3NlYWMoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgYWR4LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICBhZHksCi0gICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGJjaGFyLAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBhY2hhciApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIENGRl9CdWlsZGVyKiAgYnVpbGRlciA9ICZkZWNvZGVyLT5idWlsZGVyOwotICAgIEZUX0ludCAgICAgICAgYmNoYXJfaW5kZXgsIGFjaGFyX2luZGV4OwotICAgIFRUX0ZhY2UgICAgICAgZmFjZSA9IGRlY29kZXItPmJ1aWxkZXIuZmFjZTsKLSAgICBGVF9WZWN0b3IgICAgIGxlZnRfYmVhcmluZywgYWR2YW5jZTsKLSAgICBGVF9CeXRlKiAgICAgIGNoYXJzdHJpbmc7Ci0gICAgRlRfVUxvbmcgICAgICBjaGFyc3RyaW5nX2xlbjsKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIC8qIEluY3JlbWVudGFsIGZvbnRzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgdmFsaWQgY2hhcnNldHMuICAgICAgICAqLwotICAgIC8qIFRoZXkgdXNlIHRoZSBjaGFyYWN0ZXIgY29kZSwgbm90IHRoZSBnbHlwaCBpbmRleCwgaW4gdGhpcyBjYXNlLiAqLwotICAgIGlmICggZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICkKLSAgICB7Ci0gICAgICBiY2hhcl9pbmRleCA9IGJjaGFyOwotICAgICAgYWNoYXJfaW5kZXggPSBhY2hhcjsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLSAgICB7Ci0gICAgICBDRkZfRm9udCBjZmYgPSAoQ0ZGX0ZvbnQpKGZhY2UtPmV4dHJhLmRhdGEpOwotCi0KLSAgICAgIGJjaGFyX2luZGV4ID0gY2ZmX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggY2ZmLCBiY2hhciApOwotICAgICAgYWNoYXJfaW5kZXggPSBjZmZfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlKCBjZmYsIGFjaGFyICk7Ci0gICAgfQotCi0gICAgaWYgKCBiY2hhcl9pbmRleCA8IDAgfHwgYWNoYXJfaW5kZXggPCAwICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJjZmZfb3BlcmF0b3Jfc2VhYzoiICkpOwotICAgICAgRlRfRVJST1IoKCAiIGludmFsaWQgc2VhYyBjaGFyYWN0ZXIgY29kZSBhcmd1bWVudHNcbiIgKSk7Ci0gICAgICByZXR1cm4gQ0ZGX0Vycl9TeW50YXhfRXJyb3I7Ci0gICAgfQotCi0gICAgLyogSWYgd2UgYXJlIHRyeWluZyB0byBsb2FkIGEgY29tcG9zaXRlIGdseXBoLCBkbyBub3QgbG9hZCB0aGUgKi8KLSAgICAvKiBhY2NlbnQgY2hhcmFjdGVyIGFuZCByZXR1cm4gdGhlIGFycmF5IG9mIHN1YmdseXBocy4gICAgICAgICAqLwotICAgIGlmICggYnVpbGRlci0+bm9fcmVjdXJzZSApCi0gICAgewotICAgICAgRlRfR2x5cGhTbG90ICAgIGdseXBoICA9IChGVF9HbHlwaFNsb3QpYnVpbGRlci0+Z2x5cGg7Ci0gICAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyID0gZ2x5cGgtPmludGVybmFsLT5sb2FkZXI7Ci0gICAgICBGVF9TdWJHbHlwaCAgICAgc3ViZzsKLQotCi0gICAgICAvKiByZWFsbG9jYXRlIHN1YmdseXBoIGFycmF5IGlmIG5lY2Vzc2FyeSAqLwotICAgICAgZXJyb3IgPSBGVF9HbHlwaExvYWRlcl9DaGVja1N1YkdseXBocyggbG9hZGVyLCAyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBzdWJnID0gbG9hZGVyLT5jdXJyZW50LnN1YmdseXBoczsKLQotICAgICAgLyogc3ViZ2x5cGggMCA9IGJhc2UgY2hhcmFjdGVyICovCi0gICAgICBzdWJnLT5pbmRleCA9IGJjaGFyX2luZGV4OwotICAgICAgc3ViZy0+ZmxhZ3MgPSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUyB8Ci0gICAgICAgICAgICAgICAgICAgIEZUX1NVQkdMWVBIX0ZMQUdfVVNFX01ZX01FVFJJQ1M7Ci0gICAgICBzdWJnLT5hcmcxICA9IDA7Ci0gICAgICBzdWJnLT5hcmcyICA9IDA7Ci0gICAgICBzdWJnKys7Ci0KLSAgICAgIC8qIHN1YmdseXBoIDEgPSBhY2NlbnQgY2hhcmFjdGVyICovCi0gICAgICBzdWJnLT5pbmRleCA9IGFjaGFyX2luZGV4OwotICAgICAgc3ViZy0+ZmxhZ3MgPSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUzsKLSAgICAgIHN1YmctPmFyZzEgID0gKEZUX0ludCkoIGFkeCA+PiAxNiApOwotICAgICAgc3ViZy0+YXJnMiAgPSAoRlRfSW50KSggYWR5ID4+IDE2ICk7Ci0KLSAgICAgIC8qIHNldCB1cCByZW1haW5pbmcgZ2x5cGggZmllbGRzICovCi0gICAgICBnbHlwaC0+bnVtX3N1YmdseXBocyA9IDI7Ci0gICAgICBnbHlwaC0+c3ViZ2x5cGhzICAgICA9IGxvYWRlci0+YmFzZS5zdWJnbHlwaHM7Ci0gICAgICBnbHlwaC0+Zm9ybWF0ICAgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEU7Ci0KLSAgICAgIGxvYWRlci0+Y3VycmVudC5udW1fc3ViZ2x5cGhzID0gMjsKLSAgICB9Ci0KLSAgICBGVF9HbHlwaExvYWRlcl9QcmVwYXJlKCBidWlsZGVyLT5sb2FkZXIgKTsKLQotICAgIC8qIEZpcnN0IGxvYWQgYGJjaGFyJyBpbiBidWlsZGVyICovCi0gICAgZXJyb3IgPSBjZmZfZ2V0X2dseXBoX2RhdGEoIGZhY2UsIGJjaGFyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnN0cmluZywgJmNoYXJzdHJpbmdfbGVuICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIGRlY29kZXIsIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjZmZfZnJlZV9nbHlwaF9kYXRhKCBmYWNlLCAmY2hhcnN0cmluZywgY2hhcnN0cmluZ19sZW4gKTsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIHRoZSBsZWZ0IGJlYXJpbmcgYW5kIHdpZHRoIG9mIHRoZSBiYXNlIGNoYXJhY3RlciAqLwotICAgIC8qIGFzIHRoZXkgd2lsbCBiZSBlcmFzZWQgYnkgdGhlIG5leHQgbG9hZC4gICAgICAgICAgICAgICovCi0KLSAgICBsZWZ0X2JlYXJpbmcgPSBidWlsZGVyLT5sZWZ0X2JlYXJpbmc7Ci0gICAgYWR2YW5jZSAgICAgID0gYnVpbGRlci0+YWR2YW5jZTsKLQotICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZy54ID0gMDsKLSAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueSA9IDA7Ci0KLSAgICBidWlsZGVyLT5wb3NfeCA9IGFkeDsKLSAgICBidWlsZGVyLT5wb3NfeSA9IGFkeTsKLQotICAgIC8qIE5vdyBsb2FkIGBhY2hhcicgb24gdG9wIG9mIHRoZSBiYXNlIG91dGxpbmUuICovCi0gICAgZXJyb3IgPSBjZmZfZ2V0X2dseXBoX2RhdGEoIGZhY2UsIGFjaGFyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnN0cmluZywgJmNoYXJzdHJpbmdfbGVuICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIGRlY29kZXIsIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjZmZfZnJlZV9nbHlwaF9kYXRhKCBmYWNlLCAmY2hhcnN0cmluZywgY2hhcnN0cmluZ19sZW4gKTsKLSAgICB9Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSBsZWZ0IHNpZGUgYmVhcmluZyBhbmQgYWR2YW5jZSB3aWR0aCAqLwotICAgIC8qIG9mIHRoZSBiYXNlIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nID0gbGVmdF9iZWFyaW5nOwotICAgIGJ1aWxkZXItPmFkdmFuY2UgICAgICA9IGFkdmFuY2U7Ci0KLSAgICBidWlsZGVyLT5wb3NfeCA9IDA7Ci0gICAgYnVpbGRlci0+cG9zX3kgPSAwOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQYXJzZXMgYSBnaXZlbiBUeXBlIDIgY2hhcnN0cmluZ3MgcHJvZ3JhbS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWNvZGVyICAgICAgICAgOjogVGhlIGN1cnJlbnQgVHlwZSAxIGRlY29kZXIuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2Jhc2UgOjogVGhlIGJhc2Ugb2YgdGhlIGNoYXJzdHJpbmcgc3RyZWFtLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJzdHJpbmdfbGVuICA6OiBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjaGFyc3RyaW5nIHN0cmVhbS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgIGNoYXJzdHJpbmdfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgY2hhcnN0cmluZ19sZW4gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIENGRl9EZWNvZGVyX1pvbmUqICB6b25lOwotICAgIEZUX0J5dGUqICAgICAgICAgICBpcDsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgbGltaXQ7Ci0gICAgQ0ZGX0J1aWxkZXIqICAgICAgIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKLSAgICBGVF9Qb3MgICAgICAgICAgICAgeCwgeTsKLSAgICBGVF9GaXhlZCAgICAgICAgICAgc2VlZDsKLSAgICBGVF9GaXhlZCogICAgICAgICAgc3RhY2s7Ci0KLSAgICBUMl9IaW50c19GdW5jcyAgICAgaGludGVyOwotCi0KLSAgICAvKiBzZXQgZGVmYXVsdCB3aWR0aCAqLwotICAgIGRlY29kZXItPm51bV9oaW50cyAgPSAwOwotICAgIGRlY29kZXItPnJlYWRfd2lkdGggPSAxOwotCi0gICAgLyogY29tcHV0ZSByYW5kb20gc2VlZCBmcm9tIHN0YWNrIGFkZHJlc3Mgb2YgcGFyYW1ldGVyICovCi0gICAgc2VlZCA9IChGVF9GaXhlZCkoY2hhciopJnNlZWQgICAgICAgICAgIF4KLSAgICAgICAgICAgKEZUX0ZpeGVkKShjaGFyKikmZGVjb2RlciAgICAgICAgXgotICAgICAgICAgICAoRlRfRml4ZWQpKGNoYXIqKSZjaGFyc3RyaW5nX2Jhc2U7Ci0gICAgc2VlZCA9ICggc2VlZCBeICggc2VlZCA+PiAxMCApIF4gKCBzZWVkID4+IDIwICkgKSAmIDB4RkZGRkw7Ci0gICAgaWYgKCBzZWVkID09IDAgKQotICAgICAgc2VlZCA9IDB4NzM4NDsKLQotICAgIC8qIGluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KLSAgICBkZWNvZGVyLT50b3AgID0gZGVjb2Rlci0+c3RhY2s7Ci0gICAgZGVjb2Rlci0+em9uZSA9IGRlY29kZXItPnpvbmVzOwotICAgIHpvbmUgICAgICAgICAgPSBkZWNvZGVyLT56b25lczsKLSAgICBzdGFjayAgICAgICAgID0gZGVjb2Rlci0+dG9wOwotCi0gICAgaGludGVyID0gKFQyX0hpbnRzX0Z1bmNzKWJ1aWxkZXItPmhpbnRzX2Z1bmNzOwotCi0gICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDA7Ci0KLSAgICB6b25lLT5iYXNlICAgICAgICAgICA9IGNoYXJzdHJpbmdfYmFzZTsKLSAgICBsaW1pdCA9IHpvbmUtPmxpbWl0ICA9IGNoYXJzdHJpbmdfYmFzZSArIGNoYXJzdHJpbmdfbGVuOwotICAgIGlwICAgID0gem9uZS0+Y3Vyc29yID0gem9uZS0+YmFzZTsKLQotICAgIGVycm9yID0gQ0ZGX0Vycl9PazsKLQotICAgIHggPSBidWlsZGVyLT5wb3NfeDsKLSAgICB5ID0gYnVpbGRlci0+cG9zX3k7Ci0KLSAgICAvKiBiZWdpbiBoaW50cyByZWNvcmRpbmcgc2Vzc2lvbiwgaWYgYW55ICovCi0gICAgaWYgKCBoaW50ZXIgKQotICAgICAgaGludGVyLT5vcGVuKCBoaW50ZXItPmhpbnRzICk7Ci0KLSAgICAvKiBub3cgZXhlY3V0ZSBsb29wICovCi0gICAgd2hpbGUgKCBpcCA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBDRkZfT3BlcmF0b3IgIG9wOwotICAgICAgRlRfQnl0ZSAgICAgICB2OwotCi0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIERlY29kZSBvcGVyYXRvciBvciBvcGVyYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHYgPSAqaXArKzsKLSAgICAgIGlmICggdiA+PSAzMiB8fCB2ID09IDI4ICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICAgIHNoaWZ0ID0gMTY7Ci0gICAgICAgIEZUX0ludDMyICB2YWw7Ci0KLQotICAgICAgICAvKiB0aGlzIGlzIGFuIG9wZXJhbmQsIHB1c2ggaXQgb24gdGhlIHN0YWNrICovCi0gICAgICAgIGlmICggdiA9PSAyOCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGlwICsgMSA+PSBsaW1pdCApCi0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB2YWwgPSAoRlRfU2hvcnQpKCAoIChGVF9TaG9ydClpcFswXSA8PCA4ICkgfCBpcFsxXSApOwotICAgICAgICAgIGlwICs9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHYgPCAyNDcgKQotICAgICAgICAgIHZhbCA9IChGVF9Mb25nKXYgLSAxMzk7Ci0gICAgICAgIGVsc2UgaWYgKCB2IDwgMjUxICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggaXAgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgdmFsID0gKCAoRlRfTG9uZyl2IC0gMjQ3ICkgKiAyNTYgKyAqaXArKyArIDEwODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggdiA8IDI1NSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGlwID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgIHZhbCA9IC0oIChGVF9Mb25nKXYgLSAyNTEgKSAqIDI1NiAtICppcCsrIC0gMTA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggaXAgKyAzID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgIHZhbCA9ICggKEZUX0ludDMyKWlwWzBdIDw8IDI0ICkgfAotICAgICAgICAgICAgICAgICggKEZUX0ludDMyKWlwWzFdIDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICggKEZUX0ludDMyKWlwWzJdIDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwWzNdOwotICAgICAgICAgIGlwICAgICs9IDQ7Ci0gICAgICAgICAgc2hpZnQgID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGRlY29kZXItPnRvcCAtIHN0YWNrID49IENGRl9NQVhfT1BFUkFORFMgKQotICAgICAgICAgIGdvdG8gU3RhY2tfT3ZlcmZsb3c7Ci0KLSAgICAgICAgdmFsICAgICAgICAgICA8PD0gc2hpZnQ7Ci0gICAgICAgICpkZWNvZGVyLT50b3ArKyA9IHZhbDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGlmICggISggdmFsICYgMHhGRkZGTCApICkKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiICVsZCIsIChGVF9JbnQzMikoIHZhbCA+PiAxNiApICkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiAlLjJmIiwgdmFsIC8gNjU1MzYuMCApKTsKLSNlbmRpZgotCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkKiAgYXJncyAgICAgPSBkZWNvZGVyLT50b3A7Ci0gICAgICAgIEZUX0ludCAgICAgbnVtX2FyZ3MgPSAoRlRfSW50KSggYXJncyAtIGRlY29kZXItPnN0YWNrICk7Ci0gICAgICAgIEZUX0ludCAgICAgcmVxX2FyZ3M7Ci0KLQotICAgICAgICAvKiBmaW5kIG9wZXJhdG9yICovCi0gICAgICAgIG9wID0gY2ZmX29wX3Vua25vd247Ci0KLSAgICAgICAgc3dpdGNoICggdiApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIG9wID0gY2ZmX29wX2hzdGVtOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfdnN0ZW07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICBvcCA9IGNmZl9vcF92bW92ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfcmxpbmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgIG9wID0gY2ZmX29wX2hsaW5ldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICBvcCA9IGNmZl9vcF92bGluZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfcnJjdXJ2ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfY2xvc2VwYXRoOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgIG9wID0gY2ZmX29wX2NhbGxzdWJyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgotICAgICAgICAgIG9wID0gY2ZmX29wX3JldHVybjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGlwID49IGxpbWl0ICkKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB2ID0gKmlwKys7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoIHYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9kb3RzZWN0aW9uOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfYW5kOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfb3I7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9ub3Q7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9zdG9yZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2FiczsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9hZGQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfc3ViOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2RpdjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9sb2FkOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX25lZzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9lcTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9kcm9wOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3B1dDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9nZXQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfaWZlbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3JhbmRvbTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9tdWw7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfc3FydDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9kdXA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfZXhjaDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9pbmRleDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9yb2xsOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2hmbGV4OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2ZsZXg7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfaGZsZXgxOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2ZsZXgxOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIC8qIGRlY3JlbWVudCBpcCBmb3Igc3ludGF4IGVycm9yIG1lc3NhZ2UgKi8KLSAgICAgICAgICAgICAgaXAtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfaHNidzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9lbmRjaGFyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgIG9wID0gY2ZmX29wX2JsZW5kOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4OgotICAgICAgICAgIG9wID0gY2ZmX29wX2hzdGVtaG07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfaGludG1hc2s7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfY250cm1hc2s7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgb3AgPSBjZmZfb3Bfcm1vdmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9obW92ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIzOgotICAgICAgICAgIG9wID0gY2ZmX29wX3ZzdGVtaG07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfcmN1cnZlbGluZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9ybGluZWN1cnZlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OgotICAgICAgICAgIG9wID0gY2ZmX29wX3Z2Y3VydmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9oaGN1cnZldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfY2FsbGdzdWJyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMwOgotICAgICAgICAgIG9wID0gY2ZmX29wX3ZoY3VydmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9odmN1cnZldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGlmICggb3AgPT0gY2ZmX29wX3Vua25vd24gKQotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotCi0gICAgICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLwotICAgICAgICByZXFfYXJncyA9IGNmZl9hcmd1bWVudF9jb3VudHNbb3BdOwotICAgICAgICBpZiAoIHJlcV9hcmdzICYgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRIICkKLSAgICAgICAgewotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLQotICAgICAgICAgIGlmICggbnVtX2FyZ3MgPiAwICYmIGRlY29kZXItPnJlYWRfd2lkdGggKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIGBub21pbmFsX3dpZHRoJyBpcyBub24temVybywgdGhlIG51bWJlciBpcyByZWFsbHkgYSAgICAgICovCi0gICAgICAgICAgICAvKiBkaWZmZXJlbmNlIGFnYWluc3QgYG5vbWluYWxfd2lkdGgnLiAgRWxzZSwgdGhlIG51bWJlciBoZXJlICAqLwotICAgICAgICAgICAgLyogaXMgdHJ1bHkgYSB3aWR0aCwgbm90IGEgZGlmZmVyZW5jZSBhZ2FpbnN0IGBub21pbmFsX3dpZHRoJy4gKi8KLSAgICAgICAgICAgIC8qIElmIHRoZSBmb250IGRvZXMgbm90IHNldCBgbm9taW5hbF93aWR0aCcsIHRoZW4gICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiBgbm9taW5hbF93aWR0aCcgZGVmYXVsdHMgdG8gemVybywgYW5kIHNvIHdlIGNhbiBzZXQgICAgICAgICAqLwotICAgICAgICAgICAgLyogYGdseXBoX3dpZHRoJyB0byBgbm9taW5hbF93aWR0aCcgcGx1cyBudW1iZXIgb24gdGhlIHN0YWNrICAgKi8KLSAgICAgICAgICAgIC8qIC0tIGZvciBlaXRoZXIgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIEZUX0ludCAgc2V0X3dpZHRoX29rOwotCi0KLSAgICAgICAgICAgIHN3aXRjaCAoIG9wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX2htb3ZldG86Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF92bW92ZXRvOgotICAgICAgICAgICAgICBzZXRfd2lkdGhfb2sgPSBudW1fYXJncyAmIDI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIGNmZl9vcF9oc3RlbToKLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX3ZzdGVtOgotICAgICAgICAgICAgY2FzZSBjZmZfb3BfaHN0ZW1obToKLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX3ZzdGVtaG06Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF9ybW92ZXRvOgotICAgICAgICAgICAgY2FzZSBjZmZfb3BfaGludG1hc2s6Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF9jbnRybWFzazoKLSAgICAgICAgICAgICAgc2V0X3dpZHRoX29rID0gbnVtX2FyZ3MgJiAxOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBjZmZfb3BfZW5kY2hhcjoKLSAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYSB3aWR0aCBzcGVjaWZpZWQgZm9yIGVuZGNoYXIsIHdlIGVpdGhlciBoYXZlICovCi0gICAgICAgICAgICAgIC8qIDEgYXJndW1lbnQgb3IgNSBhcmd1bWVudHMuICBXZSBsaWtlIHRvIGFyZ3VlLiAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBzZXRfd2lkdGhfb2sgPSAoICggbnVtX2FyZ3MgPT0gNSApIHx8ICggbnVtX2FyZ3MgPT0gMSApICk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBzZXRfd2lkdGhfb2sgPSAwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBzZXRfd2lkdGhfb2sgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkZWNvZGVyLT5nbHlwaF93aWR0aCA9IGRlY29kZXItPm5vbWluYWxfd2lkdGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBzdGFja1swXSA+PiAxNiApOwotCi0gICAgICAgICAgICAgIGlmIChkZWNvZGVyLT53aWR0aF9vbmx5KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2Ugb25seSB3YW50IHRoZSBhZHZhbmNlIHdpZHRoLCBzdG9wIGhlcmUgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8qIENvbnN1bWVkIGFuIGFyZ3VtZW50LiAqLwotICAgICAgICAgICAgICBudW1fYXJncy0tOwotICAgICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZGVjb2Rlci0+cmVhZF93aWR0aCA9IDA7Ci0gICAgICAgICAgcmVxX2FyZ3MgICAgICAgICAgICA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXFfYXJncyAmPSAweDAwMEY7Ci0gICAgICAgIGlmICggbnVtX2FyZ3MgPCByZXFfYXJncyApCi0gICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0gICAgICAgIGFyZ3MgICAgIC09IHJlcV9hcmdzOwotICAgICAgICBudW1fYXJncyAtPSByZXFfYXJnczsKLQotICAgICAgICBzd2l0Y2ggKCBvcCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBjZmZfb3BfaHN0ZW06Ci0gICAgICAgIGNhc2UgY2ZmX29wX3ZzdGVtOgotICAgICAgICBjYXNlIGNmZl9vcF9oc3RlbWhtOgotICAgICAgICBjYXNlIGNmZl9vcF92c3RlbWhtOgotICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGlzIGFsd2F5cyBldmVuIGhlcmUgKi8KLSAgICAgICAgICBGVF9UUkFDRTQoKCBvcCA9PSBjZmZfb3BfaHN0ZW0gICA/ICIgaHN0ZW0iICAgOgotICAgICAgICAgICAgICAgICAgICAoIG9wID09IGNmZl9vcF92c3RlbSAgID8gIiB2c3RlbSIgICA6Ci0gICAgICAgICAgICAgICAgICAgICggb3AgPT0gY2ZmX29wX2hzdGVtaG0gPyAiIGhzdGVtaG0iIDogIiB2c3RlbWhtIiApICkgKSk7Ci0KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgICBoaW50ZXItPnN0ZW1zKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBvcCA9PSBjZmZfb3BfaHN0ZW0gfHwgb3AgPT0gY2ZmX29wX2hzdGVtaG0gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hcmdzIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKTsKLQotICAgICAgICAgIGRlY29kZXItPm51bV9oaW50cyArPSBudW1fYXJncyAvIDI7Ci0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2hpbnRtYXNrOgotICAgICAgICBjYXNlIGNmZl9vcF9jbnRybWFzazoKLSAgICAgICAgICBGVF9UUkFDRTQoKCBvcCA9PSBjZmZfb3BfaGludG1hc2sgPyAiIGhpbnRtYXNrIiA6ICIgY250cm1hc2siICkpOwotCi0gICAgICAgICAgLyogaW1wbGVtZW50IHZzdGVtIHdoZW4gbmVlZGVkIC0tICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiB0aGUgc3BlY2lmaWNhdGlvbiBkb2Vzbid0IHNheSBpdCwgYnV0IHRoaXMgYWxzbyB3b3JrcyAqLwotICAgICAgICAgIC8qIHdpdGggdGhlICdjbnRybWFzaycgb3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIG51bV9hcmdzID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgICAgICBoaW50ZXItPnN0ZW1zKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYXJncyAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKTsKLQotICAgICAgICAgICAgZGVjb2Rlci0+bnVtX2hpbnRzICs9IG51bV9hcmdzIC8gMjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBvcCA9PSBjZmZfb3BfaGludG1hc2sgKQotICAgICAgICAgICAgICBoaW50ZXItPmhpbnRtYXNrKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+bnVtX2hpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBoaW50ZXItPmNvdW50ZXIoIGhpbnRlci0+aGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+bnVtX2hpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwICk7Ci0gICAgICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50IG1hc2tieXRlOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgIiApKTsKLQotICAgICAgICAgICAgZm9yICggbWFza2J5dGUgPSAwOwotICAgICAgICAgICAgICAgICAgbWFza2J5dGUgPCAoRlRfVUludCkoKCBkZWNvZGVyLT5udW1faGludHMgKyA3ICkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICBtYXNrYnl0ZSsrLCBpcCsrICkKLSAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIjB4JTAyWCIsICppcCApKTsKLSAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgIGlwICs9ICggZGVjb2Rlci0+bnVtX2hpbnRzICsgNyApID4+IDM7Ci0jZW5kaWYKLSAgICAgICAgICBpZiAoIGlwID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9ybW92ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcm1vdmV0byIgKSk7Ci0KLSAgICAgICAgICBjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBidWlsZGVyICk7Ci0gICAgICAgICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDA7Ci0gICAgICAgICAgeCAgICs9IGFyZ3NbMF07Ci0gICAgICAgICAgeSAgICs9IGFyZ3NbMV07Ci0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3Ztb3ZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiB2bW92ZXRvIiApKTsKLQotICAgICAgICAgIGNmZl9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIGJ1aWxkZXIgKTsKLSAgICAgICAgICBidWlsZGVyLT5wYXRoX2JlZ3VuID0gMDsKLSAgICAgICAgICB5ICAgKz0gYXJnc1swXTsKLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaG1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhtb3ZldG8iICkpOwotCi0gICAgICAgICAgY2ZmX2J1aWxkZXJfY2xvc2VfY29udG91ciggYnVpbGRlciApOwotICAgICAgICAgIGJ1aWxkZXItPnBhdGhfYmVndW4gPSAwOwotICAgICAgICAgIHggICArPSBhcmdzWzBdOwotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9ybGluZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmxpbmV0byIgKSk7Ci0KLSAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50ICggYnVpbGRlciwgeCwgeSApIHx8Ci0gICAgICAgICAgICAgICBjaGVja19wb2ludHMoIGJ1aWxkZXIsIG51bV9hcmdzIC8gMiApICAgICApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICBpZiAoIG51bV9hcmdzIDwgMiB8fCBudW1fYXJncyAmIDEgKQotICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgd2hpbGUgKCBhcmdzIDwgZGVjb2Rlci0+dG9wICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4ICs9IGFyZ3NbMF07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICAgIGFyZ3MgKz0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2hsaW5ldG86Ci0gICAgICAgIGNhc2UgY2ZmX29wX3ZsaW5ldG86Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBwaGFzZSA9ICggb3AgPT0gY2ZmX29wX2hsaW5ldG8gKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCBvcCA9PSBjZmZfb3BfaGxpbmV0byA/ICIgaGxpbmV0byIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiB2bGluZXRvIiApKTsKLQotICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCAoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgICBjaGVja19wb2ludHMoIGJ1aWxkZXIsIG51bV9hcmdzICkgICAgICAgICApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgICAgd2hpbGUgKCBhcmdzIDwgZGVjb2Rlci0+dG9wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCBwaGFzZSApCi0gICAgICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeSArPSBhcmdzWzBdOwotCi0gICAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfYWRkX3BvaW50MSggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgICBwaGFzZSBePSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9ycmN1cnZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBycmN1cnZldG8iICkpOwotCi0gICAgICAgICAgLyogY2hlY2sgbnVtYmVyIG9mIGFyZ3VtZW50czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDYgKi8KLSAgICAgICAgICBpZiAoIG51bV9hcmdzICUgNiAhPSAwICkKLSAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCAoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgY2hlY2tfcG9pbnRzKCBidWlsZGVyLCBudW1fYXJncyAvIDIgKSAgICAgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgeSArPSBhcmdzWzFdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICB4ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbM107Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICAgIHggKz0gYXJnc1s0XTsKLSAgICAgICAgICAgIHkgKz0gYXJnc1s1XTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgICAgYXJncyArPSA2OwotICAgICAgICAgIH0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfdnZjdXJ2ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgdnZjdXJ2ZXRvIiApKTsKLQotICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgaWYgKCBudW1fYXJncyAmIDEgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgIG51bV9hcmdzLS07Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBudW1fYXJncyAlIDQgIT0gMCApCi0gICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgIGlmICggY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAzICogKCBudW1fYXJncyAvIDQgKSApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgeSArPSBhcmdzWzBdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICB4ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICAgIHkgKz0gYXJnc1szXTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgICAgYXJncyArPSA0OwotICAgICAgICAgIH0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaGhjdXJ2ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaGhjdXJ2ZXRvIiApKTsKLQotICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgaWYgKCBudW1fYXJncyAmIDEgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHkgKz0gYXJnc1swXTsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgIG51bV9hcmdzLS07Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBudW1fYXJncyAlIDQgIT0gMCApCi0gICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgIGlmICggY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAzICogKCBudW1fYXJncyAvIDQgKSApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICB4ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICAgIHggKz0gYXJnc1szXTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgICAgYXJncyArPSA0OwotICAgICAgICAgIH0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfdmhjdXJ2ZXRvOgotICAgICAgICBjYXNlIGNmZl9vcF9odmN1cnZldG86Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBwaGFzZTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCBvcCA9PSBjZmZfb3BfdmhjdXJ2ZXRvID8gIiB2aGN1cnZldG8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBodmN1cnZldG8iICkpOwotCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICAgIGlmICggbnVtX2FyZ3MgPCA0IHx8ICggbnVtX2FyZ3MgJSA0ICkgPiAxICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIGlmICggY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAoIG51bV9hcmdzIC8gNCApICogMyApICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIHBoYXNlID0gKCBvcCA9PSBjZmZfb3BfaHZjdXJ2ZXRvICk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggbnVtX2FyZ3MgPj0gNCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG51bV9hcmdzIC09IDQ7Ci0gICAgICAgICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgICAgIHggKz0gYXJnc1sxXTsKLSAgICAgICAgICAgICAgICB5ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICAgICAgeSArPSBhcmdzWzNdOwotICAgICAgICAgICAgICAgIGlmICggbnVtX2FyZ3MgPT0gMSApCi0gICAgICAgICAgICAgICAgICB4ICs9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeSArPSBhcmdzWzBdOwotICAgICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgICAgIHggKz0gYXJnc1sxXTsKLSAgICAgICAgICAgICAgICB5ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICAgICAgeCArPSBhcmdzWzNdOwotICAgICAgICAgICAgICAgIGlmICggbnVtX2FyZ3MgPT0gMSApCi0gICAgICAgICAgICAgICAgICB5ICs9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYXJncyAgKz0gNDsKLSAgICAgICAgICAgICAgcGhhc2UgXj0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcmxpbmVjdXJ2ZToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG51bV9saW5lcyA9ICggbnVtX2FyZ3MgLSA2ICkgLyAyOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmxpbmVjdXJ2ZSIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggbnVtX2FyZ3MgPCA4IHx8ICggbnVtX2FyZ3MgLSA2ICkgJiAxICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgICBjaGVja19wb2ludHMoIGJ1aWxkZXIsIG51bV9saW5lcyArIDMgKSAgICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0KLSAgICAgICAgICAgIC8qIGZpcnN0LCBhZGQgdGhlIGxpbmUgc2VnbWVudHMgKi8KLSAgICAgICAgICAgIHdoaWxlICggbnVtX2xpbmVzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgeSArPSBhcmdzWzFdOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICAgICAgYXJncyArPSAyOwotICAgICAgICAgICAgICBudW1fbGluZXMtLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogdGhlbiB0aGUgY3VydmUgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgIHkgKz0gYXJnc1sxXTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgeCArPSBhcmdzWzJdOwotICAgICAgICAgICAgeSArPSBhcmdzWzNdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICB4ICs9IGFyZ3NbNF07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbNV07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcmN1cnZlbGluZToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG51bV9jdXJ2ZXMgPSAoIG51bV9hcmdzIC0gMiApIC8gNjsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJjdXJ2ZWxpbmUiICkpOwotCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzIDwgOCB8fCAoIG51bV9hcmdzIC0gMiApICUgNiApCi0gICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50ICggYnVpbGRlciwgeCwgeSApIHx8Ci0gICAgICAgICAgICAgICAgIGNoZWNrX3BvaW50cyggYnVpbGRlciwgbnVtX2N1cnZlcyozICsgMiApICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0KLSAgICAgICAgICAgIC8qIGZpcnN0LCBhZGQgdGhlIGN1cnZlcyAqLwotICAgICAgICAgICAgd2hpbGUgKCBudW1fY3VydmVzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgeSArPSBhcmdzWzFdOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICAgICAgeCArPSBhcmdzWzJdOwotICAgICAgICAgICAgICB5ICs9IGFyZ3NbM107Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgICB4ICs9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgIHkgKz0gYXJnc1s1XTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgICAgIGFyZ3MgKz0gNjsKLSAgICAgICAgICAgICAgbnVtX2N1cnZlcy0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB0aGVuIHRoZSBmaW5hbCBsaW5lICovCi0gICAgICAgICAgICB4ICs9IGFyZ3NbMF07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaGZsZXgxOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyBzdGFydF95OwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgaGZsZXgxIiApKTsKLQotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotCi0gICAgICAgICAgICAvKiBhZGRpbmcgZml2ZSBtb3JlIHBvaW50czsgNCBjb250cm9sIHBvaW50cywgMSBvbi1jdXJ2ZSBwb2ludCAqLwotICAgICAgICAgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgc3RhcnQgcG9pbnQgaWYgaXQgICAgKi8KLSAgICAgICAgICAgIC8qIG5lZWRzIHRvIGJlIGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgfHwKLSAgICAgICAgICAgICAgICAgY2hlY2tfcG9pbnRzKCBidWlsZGVyLCA2ICkgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgLyogUmVjb3JkIHRoZSBzdGFydGluZyBwb2ludCdzIHkgcG9zaXRpb24gZm9yIGxhdGVyIHVzZSAqLwotICAgICAgICAgICAgc3RhcnRfeSA9IHk7Ci0KLSAgICAgICAgICAgIC8qIGZpcnN0IGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgIHkgKz0gYXJnc1sxXTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAvKiBzZWNvbmQgY29udHJvbCBwb2ludCAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzJdOwotICAgICAgICAgICAgeSArPSBhcmdzWzNdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgIC8qIGpvaW4gcG9pbnQ7IG9uIGN1cnZlLCB3aXRoIHktdmFsdWUgdGhlIHNhbWUgYXMgdGhlIGxhc3QgKi8KLSAgICAgICAgICAgIC8qIGNvbnRyb2wgcG9pbnQncyB5LXZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1s0XTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICAvKiB0aGlyZCBjb250cm9sIHBvaW50LCB3aXRoIHktdmFsdWUgdGhlIHNhbWUgYXMgdGhlIGpvaW4gKi8KLSAgICAgICAgICAgIC8qIHBvaW50J3MgeS12YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzVdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgIC8qIGZvdXJ0aCBjb250cm9sIHBvaW50ICovCi0gICAgICAgICAgICB4ICs9IGFyZ3NbNl07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbN107Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogZW5kaW5nIHBvaW50LCB3aXRoIHktdmFsdWUgdGhlIHNhbWUgYXMgdGhlIHN0YXJ0ICAgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1s4XTsKLSAgICAgICAgICAgIHkgID0gc3RhcnRfeTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaGZsZXg6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zIHN0YXJ0X3k7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBoZmxleCIgKSk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLQotICAgICAgICAgICAgLyogYWRkaW5nIHNpeCBtb3JlIHBvaW50czsgNCBjb250cm9sIHBvaW50cywgMiBvbi1jdXJ2ZSBwb2ludHMgKi8KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgICBjaGVja19wb2ludHMoIGJ1aWxkZXIsIDYgKSAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICAvKiByZWNvcmQgdGhlIHN0YXJ0aW5nIHBvaW50J3MgeS1wb3NpdGlvbiBmb3IgbGF0ZXIgdXNlICovCi0gICAgICAgICAgICBzdGFydF95ID0geTsKLQotICAgICAgICAgICAgLyogZmlyc3QgY29udHJvbCBwb2ludCAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgIC8qIHNlY29uZCBjb250cm9sIHBvaW50ICovCi0gICAgICAgICAgICB4ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogam9pbiBwb2ludDsgb24gY3VydmUsIHdpdGggeS12YWx1ZSB0aGUgc2FtZSBhcyB0aGUgbGFzdCAqLwotICAgICAgICAgICAgLyogY29udHJvbCBwb2ludCdzIHktdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzNdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIC8qIHRoaXJkIGNvbnRyb2wgcG9pbnQsIHdpdGggeS12YWx1ZSB0aGUgc2FtZSBhcyB0aGUgam9pbiAqLwotICAgICAgICAgICAgLyogcG9pbnQncyB5LXZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB4ICs9IGFyZ3NbNF07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogZm91cnRoIGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1s1XTsKLSAgICAgICAgICAgIHkgID0gc3RhcnRfeTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAvKiBlbmRpbmcgcG9pbnQsIHdpdGggeS12YWx1ZSB0aGUgc2FtZSBhcyB0aGUgc3RhcnQgcG9pbnQncyAqLwotICAgICAgICAgICAgLyogeS12YWx1ZSAtLSB3ZSBkb24ndCBhZGQgdGhpcyBwb2ludCwgdGhvdWdoICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1s2XTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotCi0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZmxleDE6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICAgIHN0YXJ0X3gsIHN0YXJ0X3k7IC8qIHJlY29yZCBzdGFydCB4LCB5IHZhbHVlcyBmb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHRlciB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGVF9GaXhlZCAgZHggPSAwLCBkeSA9IDA7ICAgLyogdXNlZCBpbiBob3Jpem9udGFsL3ZlcnRpY2FsICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsZ29yaXRobSBiZWxvdyAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZUX0ludCAgICBob3Jpem9udGFsLCBjb3VudDsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGZsZXgxIiApKTsKLQotICAgICAgICAgICAgLyogYWRkaW5nIHNpeCBtb3JlIHBvaW50czsgNCBjb250cm9sIHBvaW50cywgMiBvbi1jdXJ2ZSBwb2ludHMgKi8KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgICBjaGVja19wb2ludHMoIGJ1aWxkZXIsIDYgKSAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICAvKiByZWNvcmQgdGhlIHN0YXJ0aW5nIHBvaW50J3MgeCwgeSBwb3NpdGlvbiBmb3IgbGF0ZXIgdXNlICovCi0gICAgICAgICAgICBzdGFydF94ID0geDsKLSAgICAgICAgICAgIHN0YXJ0X3kgPSB5OwotCi0gICAgICAgICAgICAvKiBYWFg6IGZpZ3VyZSBvdXQgd2hldGhlciB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIGEgaG9yaXpvbnRhbCAqLwotICAgICAgICAgICAgLyogICAgICBvciB2ZXJ0aWNhbCBmbGV4OyB0aGUgVHlwZSAyIHNwZWNpZmljYXRpb24gaXMgdmFndWUuLi4gKi8KLQotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotCi0gICAgICAgICAgICAvKiBncmFiIHVwIHRvIHRoZSBsYXN0IGFyZ3VtZW50ICovCi0gICAgICAgICAgICBmb3IgKCBjb3VudCA9IDU7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGR4ICs9IGFyZ3NbMF07Ci0gICAgICAgICAgICAgIGR5ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICAgIGFyZ3MgKz0gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogcmV3aW5kICovCi0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0KLSAgICAgICAgICAgIGlmICggZHggPCAwICkgZHggPSAtZHg7Ci0gICAgICAgICAgICBpZiAoIGR5IDwgMCApIGR5ID0gLWR5OwotCi0gICAgICAgICAgICAvKiBzdHJhbmdlIHRlc3QsIGJ1dCBoZXJlIGl0IGlzLi4uICovCi0gICAgICAgICAgICBob3Jpem9udGFsID0gKCBkeCA+IGR5ICk7Ci0KLSAgICAgICAgICAgIGZvciAoIGNvdW50ID0gNTsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgICB5ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgKEZUX0Jvb2wpKCBjb3VudCA9PSAzICkgKTsKLSAgICAgICAgICAgICAgYXJncyArPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBpcyBsYXN0IG9wZXJhbmQgYW4geC0gb3IgeS1kZWx0YT8gKi8KLSAgICAgICAgICAgIGlmICggaG9yaXpvbnRhbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgeSAgPSBzdGFydF95OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4ICA9IHN0YXJ0X3g7Ci0gICAgICAgICAgICAgIHkgKz0gYXJnc1swXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZmxleDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBjb3VudDsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGZsZXgiICkpOwotCi0gICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgfHwKLSAgICAgICAgICAgICAgICAgY2hlY2tfcG9pbnRzKCBidWlsZGVyLCA2ICkgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgICAgZm9yICggY291bnQgPSA2OyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4ICs9IGFyZ3NbMF07Ci0gICAgICAgICAgICAgIHkgKz0gYXJnc1sxXTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Cb29sKSggY291bnQgPT0gNCB8fCBjb3VudCA9PSAxICkgKTsKLSAgICAgICAgICAgICAgYXJncyArPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2VuZGNoYXI6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBlbmRjaGFyIiApKTsKLQotICAgICAgICAgIC8qIFdlIGFyZSBnb2luZyB0byBlbXVsYXRlIHRoZSBzZWFjIG9wZXJhdG9yLiAqLwotICAgICAgICAgIGlmICggbnVtX2FyZ3MgPT0gNCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogU2F2ZSBnbHlwaCB3aWR0aCBzbyB0aGF0IHRoZSBzdWJnbHlwaHMgZG9uJ3Qgb3ZlcndyaXRlIGl0LiAqLwotICAgICAgICAgICAgRlRfUG9zICBnbHlwaF93aWR0aCA9IGRlY29kZXItPmdseXBoX3dpZHRoOwotCi0KLSAgICAgICAgICAgIGVycm9yID0gY2ZmX29wZXJhdG9yX3NlYWMoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpKCBhcmdzWzJdID4+IDE2ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KSggYXJnc1szXSA+PiAxNiApICk7Ci0gICAgICAgICAgICBhcmdzICs9IDQ7Ci0KLSAgICAgICAgICAgIGRlY29kZXItPmdseXBoX3dpZHRoID0gZ2x5cGhfd2lkdGg7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgICAgIGVycm9yID0gQ0ZGX0Vycl9PazsKLQotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfY2xvc2VfY29udG91ciggYnVpbGRlciApOwotCi0gICAgICAgICAgICAvKiBjbG9zZSBoaW50cyByZWNvcmRpbmcgc2Vzc2lvbiAqLwotICAgICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIGhpbnRlci0+Y2xvc2UoIGhpbnRlci0+aGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci0+Y3VycmVudC0+bl9wb2ludHMgKSApCi0gICAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0KLSAgICAgICAgICAgICAgLyogYXBwbHkgaGludHMgdG8gdGhlIGxvYWRlZCBnbHlwaCBvdXRsaW5lIG5vdyAqLwotICAgICAgICAgICAgICBoaW50ZXItPmFwcGx5KCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLT5jdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFNIX0dsb2JhbHMpYnVpbGRlci0+aGludHNfZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+aGludF9tb2RlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGFkZCBjdXJyZW50IG91dGxpbmUgdG8gdGhlIGdseXBoIHNsb3QgKi8KLSAgICAgICAgICAgIEZUX0dseXBoTG9hZGVyX0FkZCggYnVpbGRlci0+bG9hZGVyICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogcmV0dXJuIG5vdyEgKi8KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiXG5cbiIgKSk7Ci0gICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2FiczoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGFicyIgKSk7Ci0KLSAgICAgICAgICBpZiAoIGFyZ3NbMF0gPCAwICkKLSAgICAgICAgICAgIGFyZ3NbMF0gPSAtYXJnc1swXTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfYWRkOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgYWRkIiApKTsKLQotICAgICAgICAgIGFyZ3NbMF0gKz0gYXJnc1sxXTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfc3ViOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgc3ViIiApKTsKLQotICAgICAgICAgIGFyZ3NbMF0gLT0gYXJnc1sxXTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZGl2OgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZGl2IiApKTsKLQotICAgICAgICAgIGFyZ3NbMF0gPSBGVF9EaXZGaXgoIGFyZ3NbMF0sIGFyZ3NbMV0gKTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfbmVnOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgbmVnIiApKTsKLQotICAgICAgICAgIGFyZ3NbMF0gPSAtYXJnc1swXTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcmFuZG9tOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBSYW5kOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmFuZCIgKSk7Ci0KLSAgICAgICAgICAgIFJhbmQgPSBzZWVkOwotICAgICAgICAgICAgaWYgKCBSYW5kID49IDB4ODAwMEwgKQotICAgICAgICAgICAgICBSYW5kKys7Ci0KLSAgICAgICAgICAgIGFyZ3NbMF0gPSBSYW5kOwotICAgICAgICAgICAgc2VlZCAgICA9IEZUX011bEZpeCggc2VlZCwgMHgxMDAwMEwgLSBzZWVkICk7Ci0gICAgICAgICAgICBpZiAoIHNlZWQgPT0gMCApCi0gICAgICAgICAgICAgIHNlZWQgKz0gMHgyODczOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9tdWw6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBtdWwiICkpOwotCi0gICAgICAgICAgYXJnc1swXSA9IEZUX011bEZpeCggYXJnc1swXSwgYXJnc1sxXSApOwotICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9zcXJ0OgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgc3FydCIgKSk7Ci0KLSAgICAgICAgICBpZiAoIGFyZ3NbMF0gPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgICAgY291bnQgPSA5OwotICAgICAgICAgICAgRlRfRml4ZWQgIHJvb3QgID0gYXJnc1swXTsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBuZXdfcm9vdDsKLQotCi0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXdfcm9vdCA9ICggcm9vdCArIEZUX0RpdkZpeCggYXJnc1swXSwgcm9vdCApICsgMSApID4+IDE7Ci0gICAgICAgICAgICAgIGlmICggbmV3X3Jvb3QgPT0gcm9vdCB8fCBjb3VudCA8PSAwICkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgcm9vdCA9IG5ld19yb290OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJnc1swXSA9IG5ld19yb290OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcmdzWzBdID0gMDsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZHJvcDoKLSAgICAgICAgICAvKiBub3RoaW5nICovCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBkcm9wIiApKTsKLQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2V4Y2g6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIHRtcDsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGV4Y2giICkpOwotCi0gICAgICAgICAgICB0bXAgICAgID0gYXJnc1swXTsKLSAgICAgICAgICAgIGFyZ3NbMF0gPSBhcmdzWzFdOwotICAgICAgICAgICAgYXJnc1sxXSA9IHRtcDsKLSAgICAgICAgICAgIGFyZ3MgICArPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9pbmRleDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIGlkeCA9IChGVF9JbnQpKCBhcmdzWzBdID4+IDE2ICk7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBpbmRleCIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4IDwgMCApCi0gICAgICAgICAgICAgIGlkeCA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmICggaWR4ID4gbnVtX2FyZ3MgLSAyICkKLSAgICAgICAgICAgICAgaWR4ID0gbnVtX2FyZ3MgLSAyOwotICAgICAgICAgICAgYXJnc1swXSA9IGFyZ3NbLSggaWR4ICsgMSApXTsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfcm9sbDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIGNvdW50ID0gKEZUX0ludCkoIGFyZ3NbMF0gPj4gMTYgKTsKLSAgICAgICAgICAgIEZUX0ludCAgaWR4ICAgPSAoRlRfSW50KSggYXJnc1sxXSA+PiAxNiApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcm9sbCIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggY291bnQgPD0gMCApCi0gICAgICAgICAgICAgIGNvdW50ID0gMTsKLQotICAgICAgICAgICAgYXJncyAtPSBjb3VudDsKLSAgICAgICAgICAgIGlmICggYXJncyA8IHN0YWNrICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIGlmICggaWR4ID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB3aGlsZSAoIGlkeCA+IDAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlRfRml4ZWQgIHRtcCA9IGFyZ3NbY291bnQgLSAxXTsKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgaTsKLQotCi0gICAgICAgICAgICAgICAgZm9yICggaSA9IGNvdW50IC0gMjsgaSA+PSAwOyBpLS0gKQotICAgICAgICAgICAgICAgICAgYXJnc1tpICsgMV0gPSBhcmdzW2ldOwotICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgaWR4LS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgd2hpbGUgKCBpZHggPCAwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZUX0ZpeGVkICB0bXAgPSBhcmdzWzBdOwotICAgICAgICAgICAgICAgIEZUX0ludCAgICBpOwotCi0KLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGNvdW50IC0gMTsgaSsrICkKLSAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmdzW2kgKyAxXTsKLSAgICAgICAgICAgICAgICBhcmdzW2NvdW50IC0gMV0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MgKz0gY291bnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2R1cDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGR1cCIgKSk7Ci0KLSAgICAgICAgICBhcmdzWzFdID0gYXJnc1swXTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcHV0OgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ZpeGVkICB2YWwgPSBhcmdzWzBdOwotICAgICAgICAgICAgRlRfSW50ICAgIGlkeCA9IChGVF9JbnQpKCBhcmdzWzFdID4+IDE2ICk7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBwdXQiICkpOwotCi0gICAgICAgICAgICBpZiAoIGlkeCA+PSAwICYmIGlkeCA8IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XSA9IHZhbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZ2V0OgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgICBpZHggPSAoRlRfSW50KSggYXJnc1swXSA+PiAxNiApOwotICAgICAgICAgICAgRlRfRml4ZWQgIHZhbCA9IDA7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBnZXQiICkpOwotCi0gICAgICAgICAgICBpZiAoIGlkeCA+PSAwICYmIGlkeCA8IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICB2YWwgPSBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XTsKLQotICAgICAgICAgICAgYXJnc1swXSA9IHZhbDsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfc3RvcmU6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBzdG9yZSAiKSk7Ci0KLSAgICAgICAgICBnb3RvIFVuaW1wbGVtZW50ZWQ7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfbG9hZDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGxvYWQiICkpOwotCi0gICAgICAgICAgZ290byBVbmltcGxlbWVudGVkOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2RvdHNlY3Rpb246Ci0gICAgICAgICAgLyogdGhpcyBvcGVyYXRvciBpcyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkIGJ5IHRoZSBwYXJzZXIgKi8KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGRvdHNlY3Rpb24iICkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2Nsb3NlcGF0aDoKLSAgICAgICAgICAvKiB0aGlzIGlzIGFuIGludmFsaWQgVHlwZSAyIG9wZXJhdG9yOyBob3dldmVyLCB0aGVyZSAgICAgICAgKi8KLSAgICAgICAgICAvKiBleGlzdCBmb250cyB3aGljaCBhcmUgaW5jb3JyZWN0bHkgY29udmVydGVkIGZyb20gcHJvYmFibHkgKi8KLSAgICAgICAgICAvKiBUeXBlIDEgdG8gQ0ZGLCBhbmQgc29tZSBwYXJzZXJzIHNlZW0gdG8gYWNjZXB0IGl0ICAgICAgICAgKi8KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2xvc2VwYXRoIChpbnZhbGlkIG9wKSIgKSk7Ci0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaHNidzoKLSAgICAgICAgICAvKiB0aGlzIGlzIGFuIGludmFsaWQgVHlwZSAyIG9wZXJhdG9yOyBob3dldmVyLCB0aGVyZSAgICAgICAgKi8KLSAgICAgICAgICAvKiBleGlzdCBmb250cyB3aGljaCBhcmUgaW5jb3JyZWN0bHkgY29udmVydGVkIGZyb20gcHJvYmFibHkgKi8KLSAgICAgICAgICAvKiBUeXBlIDEgdG8gQ0ZGLCBhbmQgc29tZSBwYXJzZXJzIHNlZW0gdG8gYWNjZXB0IGl0ICAgICAgICAgKi8KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaHNidyAoaW52YWxpZCBvcCkiICkpOwotCi0gICAgICAgICAgZGVjb2Rlci0+Z2x5cGhfd2lkdGggPSBkZWNvZGVyLT5ub21pbmFsX3dpZHRoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3NbMV0gPj4gMTYpOwotICAgICAgICAgIHggICAgPSBhcmdzWzBdOwotICAgICAgICAgIHkgICAgPSAwOwotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9hbmQ6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIGNvbmQgPSBhcmdzWzBdICYmIGFyZ3NbMV07Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBhbmQiICkpOwotCi0gICAgICAgICAgICBhcmdzWzBdID0gY29uZCA/IDB4MTAwMDBMIDogMDsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfb3I6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIGNvbmQgPSBhcmdzWzBdIHx8IGFyZ3NbMV07Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBvciIgKSk7Ci0KLSAgICAgICAgICAgIGFyZ3NbMF0gPSBjb25kID8gMHgxMDAwMEwgOiAwOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9lcToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgY29uZCA9ICFhcmdzWzBdOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZXEiICkpOwotCi0gICAgICAgICAgICBhcmdzWzBdID0gY29uZCA/IDB4MTAwMDBMIDogMDsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaWZlbHNlOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBjb25kID0gKCBhcmdzWzJdIDw9IGFyZ3NbM10gKTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGlmZWxzZSIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggIWNvbmQgKQotICAgICAgICAgICAgICBhcmdzWzBdID0gYXJnc1sxXTsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfY2FsbHN1YnI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgaWR4ID0gKEZUX1VJbnQpKCAoIGFyZ3NbMF0gPj4gMTYgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmxvY2Fsc19iaWFzICk7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBjYWxsc3ViciglZCkiLCBpZHggKSk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4ID49IGRlY29kZXItPm51bV9sb2NhbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiICkpOwotICAgICAgICAgICAgICBGVF9FUlJPUigoICIgaW52YWxpZCBsb2NhbCBzdWJyIGluZGV4XG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCB6b25lIC0gZGVjb2Rlci0+em9uZXMgPj0gQ0ZGX01BWF9TVUJSU19DQUxMUyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggImNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBtYW55IG5lc3RlZCBzdWJyc1xuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHpvbmUtPmN1cnNvciA9IGlwOyAgLyogc2F2ZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgKi8KLQotICAgICAgICAgICAgem9uZSsrOwotICAgICAgICAgICAgem9uZS0+YmFzZSAgID0gZGVjb2Rlci0+bG9jYWxzW2lkeF07Ci0gICAgICAgICAgICB6b25lLT5saW1pdCAgPSBkZWNvZGVyLT5sb2NhbHNbaWR4ICsgMV07Ci0gICAgICAgICAgICB6b25lLT5jdXJzb3IgPSB6b25lLT5iYXNlOwotCi0gICAgICAgICAgICBpZiAoICF6b25lLT5iYXNlIHx8IHpvbmUtPmxpbWl0ID09IHpvbmUtPmJhc2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnZva2luZyBlbXB0eSBzdWJycyFcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWNvZGVyLT56b25lID0gem9uZTsKLSAgICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5iYXNlOwotICAgICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9jYWxsZ3N1YnI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgaWR4ID0gKEZUX1VJbnQpKCAoIGFyZ3NbMF0gPj4gMTYgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmdsb2JhbHNfYmlhcyApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbGdzdWJyKCVkKSIsIGlkeCApKTsKLQotICAgICAgICAgICAgaWYgKCBpZHggPj0gZGVjb2Rlci0+bnVtX2dsb2JhbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiICkpOwotICAgICAgICAgICAgICBGVF9FUlJPUigoICIgaW52YWxpZCBnbG9iYWwgc3ViciBpbmRleFxuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggem9uZSAtIGRlY29kZXItPnpvbmVzID49IENGRl9NQVhfU1VCUlNfQ0FMTFMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiB0b28gbWFueSBuZXN0ZWQgc3VicnNcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB6b25lLT5jdXJzb3IgPSBpcDsgIC8qIHNhdmUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyICovCi0KLSAgICAgICAgICAgIHpvbmUrKzsKLSAgICAgICAgICAgIHpvbmUtPmJhc2UgICA9IGRlY29kZXItPmdsb2JhbHNbaWR4XTsKLSAgICAgICAgICAgIHpvbmUtPmxpbWl0ICA9IGRlY29kZXItPmdsb2JhbHNbaWR4ICsgMV07Ci0gICAgICAgICAgICB6b25lLT5jdXJzb3IgPSB6b25lLT5iYXNlOwotCi0gICAgICAgICAgICBpZiAoICF6b25lLT5iYXNlIHx8IHpvbmUtPmxpbWl0ID09IHpvbmUtPmJhc2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnZva2luZyBlbXB0eSBzdWJycyFcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWNvZGVyLT56b25lID0gem9uZTsKLSAgICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5iYXNlOwotICAgICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9yZXR1cm46Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiByZXR1cm4iICkpOwotCi0gICAgICAgICAgaWYgKCBkZWNvZGVyLT56b25lIDw9IGRlY29kZXItPnpvbmVzICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICIgdW5leHBlY3RlZCByZXR1cm5cbiIgKSk7Ci0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkZWNvZGVyLT56b25lLS07Ci0gICAgICAgICAgem9uZSAgPSBkZWNvZGVyLT56b25lOwotICAgICAgICAgIGlwICAgID0gem9uZS0+Y3Vyc29yOwotICAgICAgICAgIGxpbWl0ID0gem9uZS0+bGltaXQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgVW5pbXBsZW1lbnRlZDoKLSAgICAgICAgICBGVF9FUlJPUigoICJVbmltcGxlbWVudGVkIG9wY29kZTogJWQiLCBpcFstMV0gKSk7Ci0KLSAgICAgICAgICBpZiAoIGlwWy0xXSA9PSAxMiApCi0gICAgICAgICAgICBGVF9FUlJPUigoICIgJWQiLCBpcFswXSApKTsKLSAgICAgICAgICBGVF9FUlJPUigoICJcbiIgKSk7Ci0KLSAgICAgICAgICByZXR1cm4gQ0ZGX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7Ci0gICAgICAgIH0KLQotICAgICAgZGVjb2Rlci0+dG9wID0gYXJnczsKLQotICAgICAgfSAvKiBnZW5lcmFsIG9wZXJhdG9yIHByb2Nlc3NpbmcgKi8KLQotICAgIH0gLyogd2hpbGUgaXAgPCBsaW1pdCAqLwotCi0gICAgRlRfVFJBQ0U0KCggIi4uZW5kLi5cblxuIiApKTsKLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLQotICBTeW50YXhfRXJyb3I6Ci0gICAgRlRfVFJBQ0U0KCggImNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiBzeW50YXggZXJyb3IhIiApKTsKLSAgICByZXR1cm4gQ0ZGX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotCi0gIFN0YWNrX1VuZGVyZmxvdzoKLSAgICBGVF9UUkFDRTQoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IHN0YWNrIHVuZGVyZmxvdyEiICkpOwotICAgIHJldHVybiBDRkZfRXJyX1Rvb19GZXdfQXJndW1lbnRzOwotCi0gIFN0YWNrX092ZXJmbG93OgotICAgIEZUX1RSQUNFNCgoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogc3RhY2sgb3ZlcmZsb3chIiApKTsKLSAgICByZXR1cm4gQ0ZGX0Vycl9TdGFja19PdmVyZmxvdzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgIENPTVBVVEUgVEhFIE1BWElNVU0gQURWQU5DRSBXSURUSCAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBpbiBjaGFyZ2Ugb2YgY29tcHV0aW5nICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICB0aGUgbWF4aW11bSBhZHZhbmNlIHdpZHRoIG9mIHRoZSBmb250LiAgSXQgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgcXVpY2tseSBwcm9jZXNzZXMgZWFjaCBnbHlwaCBjaGFyc3RyaW5nIHRvICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20gZWl0aGVyIGEgYHNidycgb3IgYHNlYWMnICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBvcGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmIDAgLyogdW51c2VkIHVudGlsIHdlIHN1cHBvcnQgcHVyZSBDRkYgZm9udHMgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfY29tcHV0ZV9tYXhfYWR2YW5jZSggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogIG1heF9hZHZhbmNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvciA9IENGRl9FcnJfT2s7Ci0gICAgQ0ZGX0RlY29kZXIgIGRlY29kZXI7Ci0gICAgRlRfSW50ICAgICAgIGdseXBoX2luZGV4OwotICAgIENGRl9Gb250ICAgICBjZmYgPSAoQ0ZGX0ZvbnQpZmFjZS0+b3RoZXI7Ci0KLQotICAgICptYXhfYWR2YW5jZSA9IDA7Ci0KLSAgICAvKiBJbml0aWFsaXplIGxvYWQgZGVjb2RlciAqLwotICAgIGNmZl9kZWNvZGVyX2luaXQoICZkZWNvZGVyLCBmYWNlLCAwLCAwLCAwLCAwICk7Ci0KLSAgICBkZWNvZGVyLmJ1aWxkZXIubWV0cmljc19vbmx5ID0gMTsKLSAgICBkZWNvZGVyLmJ1aWxkZXIubG9hZF9wb2ludHMgID0gMDsKLQotICAgIC8qIEZvciBlYWNoIGdseXBoLCBwYXJzZSB0aGUgZ2x5cGggY2hhcnN0cmluZyBhbmQgZXh0cmFjdCAqLwotICAgIC8qIHRoZSBhZHZhbmNlIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGdseXBoX2luZGV4ID0gMDsgZ2x5cGhfaW5kZXggPCBmYWNlLT5yb290Lm51bV9nbHlwaHM7Ci0gICAgICAgICAgZ2x5cGhfaW5kZXgrKyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGNoYXJzdHJpbmc7Ci0gICAgICBGVF9VTG9uZyAgY2hhcnN0cmluZ19sZW47Ci0KLQotICAgICAgLyogbm93IGdldCBsb2FkIHRoZSB1bnNjYWxlZCBvdXRsaW5lICovCi0gICAgICBlcnJvciA9IGNmZl9nZXRfZ2x5cGhfZGF0YSggZmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzdHJpbmcsICZjaGFyc3RyaW5nX2xlbiApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGNmZl9kZWNvZGVyX3ByZXBhcmUoICZkZWNvZGVyLCBzaXplLCBnbHlwaF9pbmRleCApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgZXJyb3IgPSBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggJmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiApOwotCi0gICAgICAgIGNmZl9mcmVlX2dseXBoX2RhdGEoIGZhY2UsICZjaGFyc3RyaW5nLCAmY2hhcnN0cmluZ19sZW4gKTsKLSAgICAgIH0KLQotICAgICAgLyogaWdub3JlIHRoZSBlcnJvciBpZiBvbmUgaGFzIG9jY3VycmVkIC0tIHNraXAgdG8gbmV4dCBnbHlwaCAqLwotICAgICAgZXJyb3IgPSBDRkZfRXJyX09rOwotICAgIH0KLQotICAgICptYXhfYWR2YW5jZSA9IGRlY29kZXIuYnVpbGRlci5hZHZhbmNlLng7Ci0KLSAgICByZXR1cm4gQ0ZGX0Vycl9PazsKLSAgfQotCi0KLSNlbmRpZiAvKiAwICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX3Nsb3RfbG9hZCggQ0ZGX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgICBsb2FkX2ZsYWdzICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBDRkZfRGVjb2RlciAgZGVjb2RlcjsKLSAgICBUVF9GYWNlICAgICAgZmFjZSAgICAgPSAoVFRfRmFjZSlnbHlwaC0+cm9vdC5mYWNlOwotICAgIEZUX0Jvb2wgICAgICBoaW50aW5nLCBmb3JjZV9zY2FsaW5nOwotICAgIENGRl9Gb250ICAgICBjZmYgICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0gICAgRlRfTWF0cml4ICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICBmb250X29mZnNldDsKLQotICAgIGZvcmNlX3NjYWxpbmcgPSBGQUxTRTsKLQotICAgIC8qIGluIGEgQ0lELWtleWVkIGZvbnQsIGNvbnNpZGVyIGBnbHlwaF9pbmRleCcgYXMgYSBDSUQgYW5kIG1hcCAqLwotICAgIC8qIGl0IGltbWVkaWF0ZWx5IHRvIHRoZSByZWFsIGdseXBoX2luZGV4IC0tIGlmIGl0IGlzbid0IGEgICAgICAqLwotICAgIC8qIHN1YnNldHRlZCBmb250LCBnbHlwaF9pbmRpY2VzIGFuZCBDSURzIGFyZSBpZGVudGljYWwsIHRob3VnaCAqLwotICAgIGlmICggY2ZmLT50b3BfZm9udC5mb250X2RpY3QuY2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgJiYKLSAgICAgICAgIGNmZi0+Y2hhcnNldC5jaWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICB7Ci0gICAgICBnbHlwaF9pbmRleCA9IGNmZl9jaGFyc2V0X2NpZF90b19naW5kZXgoICZjZmYtPmNoYXJzZXQsIGdseXBoX2luZGV4ICk7Ci0gICAgICBpZiAoIGdseXBoX2luZGV4ID09IDAgKQotICAgICAgICByZXR1cm4gQ0ZGX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgIH0KLSAgICBlbHNlIGlmICggZ2x5cGhfaW5kZXggPj0gY2ZmLT5udW1fZ2x5cGhzICkKLSAgICAgIHJldHVybiBDRkZfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKQotICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19ISU5USU5HOwotCi0gICAgZ2x5cGgtPnhfc2NhbGUgPSAweDEwMDAwTDsKLSAgICBnbHlwaC0+eV9zY2FsZSA9IDB4MTAwMDBMOwotICAgIGlmICggc2l6ZSApCi0gICAgewotICAgICAgZ2x5cGgtPnhfc2NhbGUgPSBzaXplLT5yb290Lm1ldHJpY3MueF9zY2FsZTsKLSAgICAgIGdseXBoLT55X3NjYWxlID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnlfc2NhbGU7Ci0gICAgfQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgICAvKiB0cnkgdG8gbG9hZCBlbWJlZGRlZCBiaXRtYXAgaWYgYW55ICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogWFhYOiBUaGUgY29udmVudGlvbiBzaG91bGQgYmUgZW1waGFzaXplZCBpbiAgICAgKi8KLSAgICAvKiAgICAgIHRoZSBkb2N1bWVudHMgYmVjYXVzZSBpdCBjYW4gYmUgY29uZnVzaW5nLiAqLwotICAgIGlmICggc2l6ZSApCi0gICAgewotICAgICAgQ0ZGX0ZhY2UgICAgICBjZmZfZmFjZSA9IChDRkZfRmFjZSlzaXplLT5yb290LmZhY2U7Ci0gICAgICBTRk5UX1NlcnZpY2UgIHNmbnQgICAgID0gKFNGTlRfU2VydmljZSljZmZfZmFjZS0+c2ZudDsKLSAgICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtICAgPSBjZmZfZmFjZS0+cm9vdC5zdHJlYW07Ci0KLQotICAgICAgaWYgKCBzaXplLT5zdHJpa2VfaW5kZXggIT0gMHhGRkZGRkZGRlVMICAgICAgJiYKLSAgICAgICAgICAgc2ZudC0+bG9hZF9lYmxjICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fQklUTUFQICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgbWV0cmljczsKLQotCi0gICAgICAgIGVycm9yID0gc2ZudC0+bG9hZF9zYml0X2ltYWdlKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+c3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KWxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgtPnJvb3QuYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldHJpY3MgKTsKLQotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLm5fcG9pbnRzICAgPSAwOwotICAgICAgICAgIGdseXBoLT5yb290Lm91dGxpbmUubl9jb250b3VycyA9IDA7Ci0KLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLndpZHRoICA9IChGVF9Qb3MpbWV0cmljcy53aWR0aCAgPDwgNjsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhlaWdodCA9IChGVF9Qb3MpbWV0cmljcy5oZWlnaHQgPDwgNjsKLQotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWCA8PCA2OwotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWSA8PCA2OwotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLmhvcmlBZHZhbmNlICA8PCA2OwotCi0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy52ZXJ0QmVhcmluZ1ggPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdYIDw8IDY7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy52ZXJ0QmVhcmluZ1kgPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdZIDw8IDY7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy52ZXJ0QWR2YW5jZSAgPSAoRlRfUG9zKW1ldHJpY3MudmVydEFkdmFuY2UgIDw8IDY7Ci0KLSAgICAgICAgICBnbHlwaC0+cm9vdC5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQOwotCi0gICAgICAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdseXBoLT5yb290LmJpdG1hcF9sZWZ0ID0gbWV0cmljcy52ZXJ0QmVhcmluZ1g7Ci0gICAgICAgICAgICBnbHlwaC0+cm9vdC5iaXRtYXBfdG9wICA9IG1ldHJpY3MudmVydEJlYXJpbmdZOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2x5cGgtPnJvb3QuYml0bWFwX2xlZnQgPSBtZXRyaWNzLmhvcmlCZWFyaW5nWDsKLSAgICAgICAgICAgIGdseXBoLT5yb290LmJpdG1hcF90b3AgID0gbWV0cmljcy5ob3JpQmVhcmluZ1k7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAqLwotCi0gICAgLyogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHdlIG9ubHkgd2FudCB0aGUgZW1iZWRkZWQgYml0bWFwcyAqLwotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfU0JJVFNfT05MWSApCi0gICAgICByZXR1cm4gQ0ZGX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgLyogaWYgd2UgaGF2ZSBhIENJRCBzdWJmb250LCB1c2UgaXRzIG1hdHJpeCAod2hpY2ggaGFzIGFscmVhZHkgKi8KLSAgICAvKiBiZWVuIG11bHRpcGxpZWQgd2l0aCB0aGUgcm9vdCBtYXRyaXgpICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogdGhpcyBzY2FsaW5nIGlzIG9ubHkgcmVsZXZhbnQgaWYgdGhlIFBTIGhpbnRlciBpc24ndCBhY3RpdmUgKi8KLSAgICBpZiAoIGNmZi0+bnVtX3N1YmZvbnRzICkKLSAgICB7Ci0gICAgICBGVF9CeXRlICBmZF9pbmRleCA9IGNmZl9mZF9zZWxlY3RfZ2V0KCAmY2ZmLT5mZF9zZWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCApOwotCi0gICAgICBGVF9JbnQgIHRvcF91cG0gPSBjZmYtPnRvcF9mb250LmZvbnRfZGljdC51bml0c19wZXJfZW07Ci0gICAgICBGVF9JbnQgIHN1Yl91cG0gPSBjZmYtPnN1YmZvbnRzW2ZkX2luZGV4XS0+Zm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKLQotCi0gICAgICBmb250X21hdHJpeCA9IGNmZi0+c3ViZm9udHNbZmRfaW5kZXhdLT5mb250X2RpY3QuZm9udF9tYXRyaXg7Ci0gICAgICBmb250X29mZnNldCA9IGNmZi0+c3ViZm9udHNbZmRfaW5kZXhdLT5mb250X2RpY3QuZm9udF9vZmZzZXQ7Ci0KLSAgICAgIGlmICggdG9wX3VwbSAhPSBzdWJfdXBtICkKLSAgICAgIHsKLSAgICAgICAgZ2x5cGgtPnhfc2NhbGUgPSBGVF9NdWxEaXYoIGdseXBoLT54X3NjYWxlLCB0b3BfdXBtLCBzdWJfdXBtICk7Ci0gICAgICAgIGdseXBoLT55X3NjYWxlID0gRlRfTXVsRGl2KCBnbHlwaC0+eV9zY2FsZSwgdG9wX3VwbSwgc3ViX3VwbSApOwotCi0gICAgICAgIGZvcmNlX3NjYWxpbmcgPSBUUlVFOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9udF9tYXRyaXggPSBjZmYtPnRvcF9mb250LmZvbnRfZGljdC5mb250X21hdHJpeDsKLSAgICAgIGZvbnRfb2Zmc2V0ID0gY2ZmLT50b3BfZm9udC5mb250X2RpY3QuZm9udF9vZmZzZXQ7Ci0gICAgfQotCi0gICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5uX3BvaW50cyAgID0gMDsKLSAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLm5fY29udG91cnMgPSAwOwotCi0gICAgaGludGluZyA9IEZUX0JPT0woICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgICApID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HICkgPT0gMCApOwotCi0gICAgZ2x5cGgtPnJvb3QuZm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX09VVExJTkU7ICAvKiBieSBkZWZhdWx0ICovCi0KLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgY2hhcnN0cmluZzsKLSAgICAgIEZUX1VMb25nICBjaGFyc3RyaW5nX2xlbjsKLQotCi0gICAgICBjZmZfZGVjb2Rlcl9pbml0KCAmZGVjb2RlciwgZmFjZSwgc2l6ZSwgZ2x5cGgsIGhpbnRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgKTsKLQotICAgICAgaWYgKChsb2FkX2ZsYWdzICYgRlRfTE9BRF9BRFZBTkNFX09OTFkpICE9IDApCi0gICAgICAgIGNmZl9kZWNvZGVyX3NldF93aWR0aF9vbmx5KCAmZGVjb2RlciApOwotCi0gICAgICBkZWNvZGVyLmJ1aWxkZXIubm9fcmVjdXJzZSA9Ci0gICAgICAgIChGVF9Cb29sKSggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkgIT0gMCApOwotCi0gICAgICAvKiBub3cgbG9hZCB0aGUgdW5zY2FsZWQgb3V0bGluZSAqLwotICAgICAgZXJyb3IgPSBjZmZfZ2V0X2dseXBoX2RhdGEoIGZhY2UsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc3RyaW5nLCAmY2hhcnN0cmluZ19sZW4gKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBjZmZfZGVjb2Rlcl9wcmVwYXJlKCAmZGVjb2Rlciwgc2l6ZSwgZ2x5cGhfaW5kZXggKTsKLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggJmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiApOwotCi0gICAgICAgICAgY2ZmX2ZyZWVfZ2x5cGhfZGF0YSggZmFjZSwgJmNoYXJzdHJpbmcsIGNoYXJzdHJpbmdfbGVuICk7Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAgICAgICAvKiBDb250cm9sIGRhdGEgYW5kIGxlbmd0aCBtYXkgbm90IGJlIGF2YWlsYWJsZSBmb3IgaW5jcmVtZW50YWwgKi8KLSAgICAgICAgICAvKiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2x5cGgtPnJvb3QuY29udHJvbF9kYXRhID0gMDsKLSAgICAgICAgICAgIGdseXBoLT5yb290LmNvbnRyb2xfbGVuID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotICAgICAgICAgIC8qIFdlIHNldCBjb250cm9sX2RhdGEgYW5kIGNvbnRyb2xfbGVuIGlmIGNoYXJzdHJpbmdzIGlzIGxvYWRlZC4gKi8KLSAgICAgICAgICAvKiBTZWUgaG93IGNoYXJzdHJpbmcgbG9hZHMgYXQgY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50KCkgaW4gICAgICovCi0gICAgICAgICAgLyogY2ZmbG9hZC5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIENGRl9JbmRleCAgY3NpbmRleCA9ICZjZmYtPmNoYXJzdHJpbmdzX2luZGV4OwotCi0KLSAgICAgICAgICAgIGlmICggY3NpbmRleC0+b2Zmc2V0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGdseXBoLT5yb290LmNvbnRyb2xfZGF0YSA9IGNzaW5kZXgtPmJ5dGVzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2luZGV4LT5vZmZzZXRzW2dseXBoX2luZGV4XSAtIDE7Ci0gICAgICAgICAgICAgIGdseXBoLT5yb290LmNvbnRyb2xfbGVuICA9IGNoYXJzdHJpbmdfbGVuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBzYXZlIG5ldyBnbHlwaCB0YWJsZXMgKi8KLSAgICAgIGNmZl9idWlsZGVyX2RvbmUoICZkZWNvZGVyLmJ1aWxkZXIgKTsKLSAgICB9Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0KLSAgICAvKiBJbmNyZW1lbnRhbCBmb250cyBjYW4gb3B0aW9uYWxseSBvdmVycmlkZSB0aGUgbWV0cmljcy4gKi8KLSAgICBpZiAoICFlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzICkKLSAgICB7Ci0gICAgICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjICBtZXRyaWNzOwotCi0KLSAgICAgIG1ldHJpY3MuYmVhcmluZ194ID0gZGVjb2Rlci5idWlsZGVyLmxlZnRfYmVhcmluZy54OwotICAgICAgbWV0cmljcy5iZWFyaW5nX3kgPSBkZWNvZGVyLmJ1aWxkZXIubGVmdF9iZWFyaW5nLnk7Ci0gICAgICBtZXRyaWNzLmFkdmFuY2UgICA9IGRlY29kZXIuYnVpbGRlci5hZHZhbmNlLng7Ci0gICAgICBlcnJvciA9IGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzKAotICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBGQUxTRSwgJm1ldHJpY3MgKTsKLSAgICAgIGRlY29kZXIuYnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IG1ldHJpY3MuYmVhcmluZ194OwotICAgICAgZGVjb2Rlci5idWlsZGVyLmxlZnRfYmVhcmluZy55ID0gbWV0cmljcy5iZWFyaW5nX3k7Ci0gICAgICBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ICAgICAgPSBtZXRyaWNzLmFkdmFuY2U7Ci0gICAgICBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS55ICAgICAgPSAwOwotICAgIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICAvKiBOb3csIHNldCB0aGUgbWV0cmljcyAtLSB0aGlzIGlzIHJhdGhlciBzaW1wbGUsIGFzICAgKi8KLSAgICAgIC8qIHRoZSBsZWZ0IHNpZGUgYmVhcmluZyBpcyB0aGUgeE1pbiwgYW5kIHRoZSB0b3Agc2lkZSAqLwotICAgICAgLyogYmVhcmluZyB0aGUgeU1heC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIEZvciBjb21wb3NpdGUgZ2x5cGhzLCByZXR1cm4gb25seSBsZWZ0IHNpZGUgYmVhcmluZyBhbmQgKi8KLSAgICAgIC8qIGFkdmFuY2Ugd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fUkVDVVJTRSApCi0gICAgICB7Ci0gICAgICAgIEZUX1Nsb3RfSW50ZXJuYWwgIGludGVybmFsID0gZ2x5cGgtPnJvb3QuaW50ZXJuYWw7Ci0KLQotICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IGRlY29kZXIuYnVpbGRlci5sZWZ0X2JlYXJpbmcueDsKLSAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy5ob3JpQWR2YW5jZSAgPSBkZWNvZGVyLmdseXBoX3dpZHRoOwotICAgICAgICBpbnRlcm5hbC0+Z2x5cGhfbWF0cml4ICAgICAgICAgICA9IGZvbnRfbWF0cml4OwotICAgICAgICBpbnRlcm5hbC0+Z2x5cGhfZGVsdGEgICAgICAgICAgICA9IGZvbnRfb2Zmc2V0OwotICAgICAgICBpbnRlcm5hbC0+Z2x5cGhfdHJhbnNmb3JtZWQgICAgICA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX0JCb3ggICAgICAgICAgICBjYm94OwotICAgICAgICBGVF9HbHlwaF9NZXRyaWNzKiAgbWV0cmljcyA9ICZnbHlwaC0+cm9vdC5tZXRyaWNzOwotICAgICAgICBGVF9WZWN0b3IgICAgICAgICAgYWR2YW5jZTsKLSAgICAgICAgRlRfQm9vbCAgICAgICAgICAgIGhhc192ZXJ0aWNhbF9pbmZvOwotCi0KLSAgICAgICAgLyogY29weSB0aGUgX3Vuc2NhbGVkXyBhZHZhbmNlIHdpZHRoICovCi0gICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICAgICAgICAgICAgICAgICAgICA9IGRlY29kZXIuZ2x5cGhfd2lkdGg7Ci0gICAgICAgIGdseXBoLT5yb290LmxpbmVhckhvcmlBZHZhbmNlICAgICAgICAgICA9IGRlY29kZXIuZ2x5cGhfd2lkdGg7Ci0gICAgICAgIGdseXBoLT5yb290LmludGVybmFsLT5nbHlwaF90cmFuc2Zvcm1lZCA9IDA7Ci0KLSAgICAgICAgaGFzX3ZlcnRpY2FsX2luZm8gPSBGVF9CT09MKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnZlcnRpY2FsLmxvbmdfbWV0cmljcyAhPSAwICk7Ci0KLSAgICAgICAgLyogZ2V0IHRoZSB2ZXJ0aWNhbCBtZXRyaWNzIGZyb20gdGhlIHZ0bXggdGFibGUgaWYgd2UgaGF2ZSBvbmUgKi8KLSAgICAgICAgaWYgKCBoYXNfdmVydGljYWxfaW5mbyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9TaG9ydCAgIHZlcnRCZWFyaW5nWSA9IDA7Ci0gICAgICAgICAgRlRfVVNob3J0ICB2ZXJ0QWR2YW5jZSAgPSAwOwotCi0KLSAgICAgICAgICAoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0QmVhcmluZ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0QWR2YW5jZSApOwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IHZlcnRCZWFyaW5nWTsKLSAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSB2ZXJ0QWR2YW5jZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtYWtlIHVwIHZlcnRpY2FsIG9uZXMgKi8KLSAgICAgICAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgKQotICAgICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSAoRlRfUG9zKSggZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSAoRlRfUG9zKSggZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlciAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLkRlc2NlbmRlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2x5cGgtPnJvb3QubGluZWFyVmVydEFkdmFuY2UgPSBtZXRyaWNzLT52ZXJ0QWR2YW5jZTsKLQotICAgICAgICBnbHlwaC0+cm9vdC5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsKLQotICAgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLmZsYWdzID0gMDsKLSAgICAgICAgaWYgKCBzaXplICYmIHNpemUtPnJvb3QubWV0cmljcy55X3BwZW0gPCAyNCApCi0gICAgICAgICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OOwotCi0gICAgICAgIGdseXBoLT5yb290Lm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9SRVZFUlNFX0ZJTEw7Ci0KLSAgICAgICAgLyogYXBwbHkgdGhlIGZvbnQgbWF0cml4IC0tIGB4eCcgaGFzIGFscmVhZHkgYmVlbiBub3JtYWxpemVkICovCi0gICAgICAgIGlmICggISggZm9udF9tYXRyaXgueXkgPT0gMHgxMDAwMEwgJiYKLSAgICAgICAgICAgICAgICBmb250X21hdHJpeC54eSA9PSAwICAgICAgICAmJgotICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnl4ID09IDAgICAgICAgICkgKQotICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmZ2x5cGgtPnJvb3Qub3V0bGluZSwgJmZvbnRfbWF0cml4ICk7Ci0KLSAgICAgICAgaWYgKCAhKCBmb250X29mZnNldC54ID09IDAgJiYKLSAgICAgICAgICAgICAgICBmb250X29mZnNldC55ID09IDAgKSApCi0gICAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZnbHlwaC0+cm9vdC5vdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC54LCBmb250X29mZnNldC55ICk7Ci0KLSAgICAgICAgYWR2YW5jZS54ID0gbWV0cmljcy0+aG9yaUFkdmFuY2U7Ci0gICAgICAgIGFkdmFuY2UueSA9IDA7Ci0gICAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oICZhZHZhbmNlLCAmZm9udF9tYXRyaXggKTsKLSAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBhZHZhbmNlLnggKyBmb250X29mZnNldC54OwotCi0gICAgICAgIGFkdmFuY2UueCA9IDA7Ci0gICAgICAgIGFkdmFuY2UueSA9IG1ldHJpY3MtPnZlcnRBZHZhbmNlOwotICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtKCAmYWR2YW5jZSwgJmZvbnRfbWF0cml4ICk7Ci0gICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gYWR2YW5jZS55ICsgZm9udF9vZmZzZXQueTsKLQotICAgICAgICBpZiAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwIHx8IGZvcmNlX3NjYWxpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc2NhbGUgdGhlIG91dGxpbmUgYW5kIHRoZSBtZXRyaWNzICovCi0gICAgICAgICAgRlRfSW50ICAgICAgIG47Ci0gICAgICAgICAgRlRfT3V0bGluZSogIGN1ciAgICAgPSAmZ2x5cGgtPnJvb3Qub3V0bGluZTsKLSAgICAgICAgICBGVF9WZWN0b3IqICAgdmVjICAgICA9IGN1ci0+cG9pbnRzOwotICAgICAgICAgIEZUX0ZpeGVkICAgICB4X3NjYWxlID0gZ2x5cGgtPnhfc2NhbGU7Ci0gICAgICAgICAgRlRfRml4ZWQgICAgIHlfc2NhbGUgPSBnbHlwaC0+eV9zY2FsZTsKLQotCi0gICAgICAgICAgLyogRmlyc3Qgb2YgYWxsLCBzY2FsZSB0aGUgcG9pbnRzICovCi0gICAgICAgICAgaWYgKCAhaGludGluZyB8fCAhZGVjb2Rlci5idWlsZGVyLmhpbnRzX2Z1bmNzICkKLSAgICAgICAgICAgIGZvciAoIG4gPSBjdXItPm5fcG9pbnRzOyBuID4gMDsgbi0tLCB2ZWMrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZlYy0+eCA9IEZUX011bEZpeCggdmVjLT54LCB4X3NjYWxlICk7Ci0gICAgICAgICAgICAgIHZlYy0+eSA9IEZUX011bEZpeCggdmVjLT55LCB5X3NjYWxlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBUaGVuIHNjYWxlIHRoZSBtZXRyaWNzICovCi0gICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlBZHZhbmNlLCB4X3NjYWxlICk7Ci0gICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPnZlcnRBZHZhbmNlLCB5X3NjYWxlICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjb21wdXRlIHRoZSBvdGhlciBtZXRyaWNzICovCi0gICAgICAgIEZUX091dGxpbmVfR2V0X0NCb3goICZnbHlwaC0+cm9vdC5vdXRsaW5lLCAmY2JveCApOwotCi0gICAgICAgIG1ldHJpY3MtPndpZHRoICA9IGNib3gueE1heCAtIGNib3gueE1pbjsKLSAgICAgICAgbWV0cmljcy0+aGVpZ2h0ID0gY2JveC55TWF4IC0gY2JveC55TWluOwotCi0gICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IGNib3gueE1pbjsKLSAgICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZID0gY2JveC55TWF4OwotCi0gICAgICAgIGlmICggaGFzX3ZlcnRpY2FsX2luZm8gKQotICAgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IC1tZXRyaWNzLT53aWR0aCAvIDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBmdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MoIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZnbG9hZC5oIGIvc3JjL2NmZi9jZmZnbG9hZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIxNjU0Li4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmZ2xvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZnbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgR2x5cGggTG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRkZHTE9BRF9IX18KLSNkZWZpbmUgX19DRkZHTE9BRF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlICJjZmZvYmpzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBDRkZfTUFYX09QRVJBTkRTICAgICA0OAotI2RlZmluZSBDRkZfTUFYX1NVQlJTX0NBTExTICAzMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0dXJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0ZGX0J1aWxkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIGdseXBoIGxvYWRpbmcgdG8gc3RvcmUgaXRzIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgICA6OiBUaGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBsb2FkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlICAgICAgICAgIDo6IFRoZSBiYXNlIGdseXBoIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cnJlbnQgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFzdCAgICAgICAgICA6OiBUaGUgbGFzdCBwb2ludCBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3NfeCAgICAgICAgIDo6IFRoZSBob3Jpem9udGFsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc195ICAgICAgICAgOjogVGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVmdF9iZWFyaW5nICA6OiBUaGUgbGVmdCBzaWRlIGJlYXJpbmcgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlICAgICAgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2UgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJib3ggICAgICAgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGF0aF9iZWd1biAgICA6OiBBIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYSBuZXcgcGF0aCBoYXMgYmVndW4uICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX3BvaW50cyAgIDo6IElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBubyBwb2ludHMgYXJlIGxvYWRlZC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vX3JlY3Vyc2UgICAgOjogU2V0IGJ1dCBub3QgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljc19vbmx5ICA6OiBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHdlIG9ubHkgd2FudCB0byBjb21wdXRlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdGhlIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCwgbm90IGxvYWQgYWxsIG9mIGl0cyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRzX2Z1bmNzICAgOjogQXV4aWxpYXJ5IHBvaW50ZXIgZm9yIGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludHNfZ2xvYmFscyA6OiBBdXhpbGlhcnkgcG9pbnRlciBmb3IgaGludGluZy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0J1aWxkZXJfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5OwotICAgIFRUX0ZhY2UgICAgICAgICBmYWNlOwotICAgIENGRl9HbHlwaFNsb3QgICBnbHlwaDsKLSAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyOwotICAgIEZUX091dGxpbmUqICAgICBiYXNlOwotICAgIEZUX091dGxpbmUqICAgICBjdXJyZW50OwotCi0gICAgRlRfVmVjdG9yICAgICAgIGxhc3Q7Ci0KLSAgICBGVF9Qb3MgICAgICAgICAgcG9zX3g7Ci0gICAgRlRfUG9zICAgICAgICAgIHBvc195OwotCi0gICAgRlRfVmVjdG9yICAgICAgIGxlZnRfYmVhcmluZzsKLSAgICBGVF9WZWN0b3IgICAgICAgYWR2YW5jZTsKLQotICAgIEZUX0JCb3ggICAgICAgICBiYm94OyAgICAgICAgICAvKiBib3VuZGluZyBib3ggKi8KLSAgICBGVF9Cb29sICAgICAgICAgcGF0aF9iZWd1bjsKLSAgICBGVF9Cb29sICAgICAgICAgbG9hZF9wb2ludHM7Ci0gICAgRlRfQm9vbCAgICAgICAgIG5vX3JlY3Vyc2U7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgbWV0cmljc19vbmx5OwotCi0gICAgdm9pZCogICAgICAgICAgIGhpbnRzX2Z1bmNzOyAgICAvKiBoaW50ZXItc3BlY2lmaWMgKi8KLSAgICB2b2lkKiAgICAgICAgICAgaGludHNfZ2xvYmFsczsgIC8qIGhpbnRlci1zcGVjaWZpYyAqLwotCi0gIH0gQ0ZGX0J1aWxkZXI7Ci0KLQotICAvKiBleGVjdXRpb24gY29udGV4dCBjaGFyc3RyaW5nIHpvbmUgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0RlY29kZXJfWm9uZV8KLSAgewotICAgIEZUX0J5dGUqICBiYXNlOwotICAgIEZUX0J5dGUqICBsaW1pdDsKLSAgICBGVF9CeXRlKiAgY3Vyc29yOwotCi0gIH0gQ0ZGX0RlY29kZXJfWm9uZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRGVjb2Rlcl8KLSAgewotICAgIENGRl9CdWlsZGVyICAgICAgICBidWlsZGVyOwotICAgIENGRl9Gb250ICAgICAgICAgICBjZmY7Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgICAgc3RhY2tbQ0ZGX01BWF9PUEVSQU5EUyArIDFdOwotICAgIEZUX0ZpeGVkKiAgICAgICAgICB0b3A7Ci0KLSAgICBDRkZfRGVjb2Rlcl9ab25lICAgem9uZXNbQ0ZGX01BWF9TVUJSU19DQUxMUyArIDFdOwotICAgIENGRl9EZWNvZGVyX1pvbmUqICB6b25lOwotCi0gICAgRlRfSW50ICAgICAgICAgICAgIGZsZXhfc3RhdGU7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIG51bV9mbGV4X3ZlY3RvcnM7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgIGZsZXhfdmVjdG9yc1s3XTsKLQotICAgIEZUX1BvcyAgICAgICAgICAgICBnbHlwaF93aWR0aDsKLSAgICBGVF9Qb3MgICAgICAgICAgICAgbm9taW5hbF93aWR0aDsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICByZWFkX3dpZHRoOwotICAgIEZUX0Jvb2wgICAgICAgICAgICB3aWR0aF9vbmx5OwotICAgIEZUX0ludCAgICAgICAgICAgICBudW1faGludHM7Ci0gICAgRlRfRml4ZWQqICAgICAgICAgIGJ1aWxkY2hhcjsKLSAgICBGVF9JbnQgICAgICAgICAgICAgbGVuX2J1aWxkY2hhcjsKLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fbG9jYWxzOwotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fZ2xvYmFsczsKLQotICAgIEZUX0ludCAgICAgICAgICAgICBsb2NhbHNfYmlhczsKLSAgICBGVF9JbnQgICAgICAgICAgICAgZ2xvYmFsc19iaWFzOwotCi0gICAgRlRfQnl0ZSoqICAgICAgICAgIGxvY2FsczsKLSAgICBGVF9CeXRlKiogICAgICAgICAgZ2xvYmFsczsKLQotICAgIEZUX0J5dGUqKiAgICAgICAgICBnbHlwaF9uYW1lczsgICAvKiBmb3IgcHVyZSBDRkYgZm9udHMgb25seSAgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX2dseXBoczsgICAgLyogbnVtYmVyIG9mIGdseXBocyBpbiBmb250ICovCi0KLSAgICBGVF9SZW5kZXJfTW9kZSAgICAgaGludF9tb2RlOwotCi0gIH0gQ0ZGX0RlY29kZXI7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9kZWNvZGVyX2luaXQoIENGRl9EZWNvZGVyKiAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX1NpemUgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIENGRl9HbHlwaFNsb3QgICBzbG90LAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgaGludGluZywKLSAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2RlY29kZXJfc2V0X3dpZHRoX29ubHkoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9kZWNvZGVyX3ByZXBhcmUoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZGX1NpemUgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4ICk7Ci0KLSNpZiAwICAvKiB1bnVzZWQgdW50aWwgd2Ugc3VwcG9ydCBwdXJlIENGRiBmb250cyAqLwotCi0gIC8qIENvbXB1dGUgdGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBvZiBhIGZvbnQgdGhyb3VnaCBxdWljayBwYXJzaW5nICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9jb21wdXRlX21heF9hZHZhbmNlKCBUVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgbWF4X2FkdmFuY2UgKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICBjaGFyc3RyaW5nX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIGNoYXJzdHJpbmdfbGVuICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3Nsb3RfbG9hZCggQ0ZGX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19DRkZHTE9BRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmbG9hZC5jIGIvc3JjL2NmZi9jZmZsb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDMwY2YuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmxvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBhbmQgQ0ZGIGRhdGEvcHJvZ3JhbSB0YWJsZXMgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotCi0jaW5jbHVkZSAiY2ZmbG9hZC5oIgotI2luY2x1ZGUgImNmZnBhcnNlLmgiCi0KLSNpbmNsdWRlICJjZmZlcnJzLmgiCi0KLQotI2lmIDEKLSAgc3RhdGljIGNvbnN0IEZUX1VTaG9ydCAgY2ZmX2lzb2Fkb2JlX2NoYXJzZXRbMjI5XSA9Ci0gIHsKLSAgICAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywKLSAgICAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwKLSAgICAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywKLSAgICAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKLSAgICAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwKLSAgICAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKLSAgICAgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwKLSAgICAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywKLSAgICAgNjQsICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwKLSAgICAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKLSAgICAgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywKLSAgICAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKLSAgICAgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywKLSAgICAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKLSAgICAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwKLSAgICAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKLSAgICAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwKLSAgICAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKLSAgICAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwKLSAgICAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwKLSAgICAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywKLSAgICAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NSwKLSAgICAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywKLSAgICAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MSwKLSAgICAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwKLSAgICAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywKLSAgICAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwKLSAgICAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywKLSAgICAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOAotICB9OwotCi0gIHN0YXRpYyBjb25zdCBGVF9VU2hvcnQgIGNmZl9leHBlcnRfY2hhcnNldFsxNjZdID0KLSAgewotICAgICAgMCwgICAxLCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LAotICAgIDIzNSwgMjM2LCAyMzcsIDIzOCwgIDEzLCAgMTQsICAxNSwgIDk5LAotICAgIDIzOSwgMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LAotICAgIDI0NywgMjQ4LCAgMjcsICAyOCwgMjQ5LCAyNTAsIDI1MSwgMjUyLAotICAgIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLAotICAgIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDEwOSwgMTEwLAotICAgIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LAotICAgIDI3NSwgMjc2LCAyNzcsIDI3OCwgMjc5LCAyODAsIDI4MSwgMjgyLAotICAgIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLAotICAgIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LAotICAgIDI5OSwgMzAwLCAzMDEsIDMwMiwgMzAzLCAzMDQsIDMwNSwgMzA2LAotICAgIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LAotICAgIDMxNSwgMzE2LCAzMTcsIDMxOCwgMTU4LCAxNTUsIDE2MywgMzE5LAotICAgIDMyMCwgMzIxLCAzMjIsIDMyMywgMzI0LCAzMjUsIDMyNiwgMTUwLAotICAgIDE2NCwgMTY5LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLAotICAgIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLAotICAgIDM0MSwgMzQyLCAzNDMsIDM0NCwgMzQ1LCAzNDYsIDM0NywgMzQ4LAotICAgIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LAotICAgIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LAotICAgIDM2NSwgMzY2LCAzNjcsIDM2OCwgMzY5LCAzNzAsIDM3MSwgMzcyLAotICAgIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRlRfVVNob3J0ICBjZmZfZXhwZXJ0c3Vic2V0X2NoYXJzZXRbODddID0KLSAgewotICAgICAgMCwgICAxLCAyMzEsIDIzMiwgMjM1LCAyMzYsIDIzNywgMjM4LAotICAgICAxMywgIDE0LCAgMTUsICA5OSwgMjM5LCAyNDAsIDI0MSwgMjQyLAotICAgIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsICAyNywgIDI4LAotICAgIDI0OSwgMjUwLCAyNTEsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LAotICAgIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LAotICAgIDI2NiwgMTA5LCAxMTAsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcyLAotICAgIDMwMCwgMzAxLCAzMDIsIDMwNSwgMzE0LCAzMTUsIDE1OCwgMTU1LAotICAgIDE2MywgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LAotICAgIDE1MCwgMTY0LCAxNjksIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLAotICAgIDMzMiwgMzMzLCAzMzQsIDMzNSwgMzM2LCAzMzcsIDMzOCwgMzM5LAotICAgIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NgotICB9OwotCi0gIHN0YXRpYyBjb25zdCBGVF9VU2hvcnQgIGNmZl9zdGFuZGFyZF9lbmNvZGluZ1syNTZdID0KLSAgewotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LAotICAgICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LAotICAgICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LAotICAgICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwgIDMyLAotICAgICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLAotICAgICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LAotICAgICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LAotICAgICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LAotICAgICA2NSwgIDY2LCAgNjcsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLAotICAgICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLAotICAgICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LAotICAgICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLAotICAgIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLAotICAgICAgMCwgMTExLCAxMTIsIDExMywgMTE0LCAgIDAsIDExNSwgMTE2LAotICAgIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsICAgMCwgMTIzLAotICAgICAgMCwgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAotICAgIDEzMSwgICAwLCAxMzIsIDEzMywgICAwLCAxMzQsIDEzNSwgMTM2LAotICAgIDEzNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgMTM4LCAgIDAsIDEzOSwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDE0MCwgMTQxLCAxNDIsIDE0MywgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgMTQ0LCAgIDAsICAgMCwgICAwLCAxNDUsICAgMCwgICAwLAotICAgIDE0NiwgMTQ3LCAxNDgsIDE0OSwgICAwLCAgIDAsICAgMCwgICAwCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX1VTaG9ydCAgY2ZmX2V4cGVydF9lbmNvZGluZ1syNTZdID0KLSAgewotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMSwgMjI5LCAyMzAsICAgMCwgMjMxLCAyMzIsIDIzMywgMjM0LAotICAgIDIzNSwgMjM2LCAyMzcsIDIzOCwgIDEzLCAgMTQsICAxNSwgIDk5LAotICAgIDIzOSwgMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LAotICAgIDI0NywgMjQ4LCAgMjcsICAyOCwgMjQ5LCAyNTAsIDI1MSwgMjUyLAotICAgICAgMCwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsICAgMCwgICAwLAotICAgICAgMCwgMjU4LCAgIDAsICAgMCwgMjU5LCAyNjAsIDI2MSwgMjYyLAotICAgICAgMCwgICAwLCAyNjMsIDI2NCwgMjY1LCAgIDAsIDI2NiwgMTA5LAotICAgIDExMCwgMjY3LCAyNjgsIDI2OSwgICAwLCAyNzAsIDI3MSwgMjcyLAotICAgIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLAotICAgIDI4MSwgMjgyLCAyODMsIDI4NCwgMjg1LCAyODYsIDI4NywgMjg4LAotICAgIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LAotICAgIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgICAgMCwgMzA0LCAzMDUsIDMwNiwgICAwLCAgIDAsIDMwNywgMzA4LAotICAgIDMwOSwgMzEwLCAzMTEsICAgMCwgMzEyLCAgIDAsICAgMCwgMzEyLAotICAgICAgMCwgICAwLCAzMTQsIDMxNSwgICAwLCAgIDAsIDMxNiwgMzE3LAotICAgIDMxOCwgICAwLCAgIDAsICAgMCwgMTU4LCAxNTUsIDE2MywgMzE5LAotICAgIDMyMCwgMzIxLCAzMjIsIDMyMywgMzI0LCAzMjUsICAgMCwgICAwLAotICAgIDMyNiwgMTUwLCAxNjQsIDE2OSwgMzI3LCAzMjgsIDMyOSwgMzMwLAotICAgIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LAotICAgIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LAotICAgIDM0NywgMzQ4LCAzNDksIDM1MCwgMzUxLCAzNTIsIDM1MywgMzU0LAotICAgIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLAotICAgIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLAotICAgIDM3MSwgMzcyLCAzNzMsIDM3NCwgMzc1LCAzNzYsIDM3NywgMzc4Ci0gIH07Ci0jZW5kaWYgLyogMSAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VU2hvcnQgKQotICBjZmZfZ2V0X3N0YW5kYXJkX2VuY29kaW5nKCBGVF9VSW50ICBjaGFyY29kZSApCi0gIHsKLSAgICByZXR1cm4gKEZUX1VTaG9ydCkoIGNoYXJjb2RlIDwgMjU2ID8gY2ZmX3N0YW5kYXJkX2VuY29kaW5nW2NoYXJjb2RlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmZmxvYWQKLQotCi0gIC8qIHJlYWQgYW4gb2Zmc2V0IGZyb20gdGhlIGluZGV4J3Mgc3RyZWFtIGN1cnJlbnQgcG9zaXRpb24gKi8KLSAgc3RhdGljIEZUX1VMb25nCi0gIGNmZl9pbmRleF9yZWFkX29mZnNldCggQ0ZGX0luZGV4ICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICplcnJvcnAgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGlkeC0+c3RyZWFtOwotICAgIEZUX0J5dGUgICAgdG1wWzRdOwotICAgIEZUX1VMb25nICAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCAhRlRfU1RSRUFNX1JFQUQoIHRtcCwgaWR4LT5vZmZfc2l6ZSApICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIG5uOwotCi0KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBpZHgtPm9mZl9zaXplOyBubisrICkKLSAgICAgICAgcmVzdWx0ID0gKCByZXN1bHQgPDwgOCApIHwgdG1wW25uXTsKLSAgICB9Ci0KLSAgICAqZXJyb3JwID0gZXJyb3I7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9pbmRleF9pbml0KCBDRkZfSW5kZXggIGlkeCwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBsb2FkICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VU2hvcnQgIGNvdW50OwotCi0KLSAgICBGVF9NRU1fWkVSTyggaWR4LCBzaXplb2YgKCAqaWR4ICkgKTsKLQotICAgIGlkeC0+c3RyZWFtID0gc3RyZWFtOwotICAgIGlkeC0+c3RhcnQgID0gRlRfU1RSRUFNX1BPUygpOwotICAgIGlmICggIUZUX1JFQURfVVNIT1JUKCBjb3VudCApICYmCi0gICAgICAgICBjb3VudCA+IDAgICAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgICBvZmZzaXplOwotICAgICAgRlRfVUxvbmcgIHNpemU7Ci0KLQotICAgICAgLyogdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQ7IHJlYWQgdGhlIG9mZnNldCBzaXplLCAgICAgICAgICAgKi8KLSAgICAgIC8qIHRoZW4gYWNjZXNzIHRoZSBvZmZzZXQgdGFibGUgdG8gY29tcHV0ZSB0aGUgaW5kZXgncyB0b3RhbCBzaXplICovCi0gICAgICBpZiAoIEZUX1JFQURfQllURSggb2Zmc2l6ZSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIG9mZnNpemUgPCAxIHx8IG9mZnNpemUgPiA0ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9UYWJsZTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZHgtPmNvdW50ICAgID0gY291bnQ7Ci0gICAgICBpZHgtPm9mZl9zaXplID0gb2Zmc2l6ZTsKLSAgICAgIHNpemUgICAgICAgICAgPSAoRlRfVUxvbmcpKCBjb3VudCArIDEgKSAqIG9mZnNpemU7Ci0KLSAgICAgIGlkeC0+ZGF0YV9vZmZzZXQgPSBpZHgtPnN0YXJ0ICsgMyArIHNpemU7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIHNpemUgLSBvZmZzaXplICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHNpemUgPSBjZmZfaW5kZXhfcmVhZF9vZmZzZXQoIGlkeCwgJmVycm9yICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIHNpemUgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gQ0ZGX0Vycl9JbnZhbGlkX1RhYmxlOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlkeC0+ZGF0YV9zaXplID0gLS1zaXplOwotCi0gICAgICBpZiAoIGxvYWQgKQotICAgICAgewotICAgICAgICAvKiBsb2FkIHRoZSBkYXRhICovCi0gICAgICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggc2l6ZSwgaWR4LT5ieXRlcyApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHNraXAgdGhlIGRhdGEgKi8KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggc2l6ZSApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9GUkVFKCBpZHgtPm9mZnNldHMgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX2luZGV4X2RvbmUoIENGRl9JbmRleCAgaWR4ICkKLSAgewotICAgIGlmICggaWR4LT5zdHJlYW0gKQotICAgIHsKLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gaWR4LT5zdHJlYW07Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICAgIGlmICggaWR4LT5ieXRlcyApCi0gICAgICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGlkeC0+Ynl0ZXMgKTsKLQotICAgICAgRlRfRlJFRSggaWR4LT5vZmZzZXRzICk7Ci0gICAgICBGVF9NRU1fWkVSTyggaWR4LCBzaXplb2YgKCAqaWR4ICkgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfaW5kZXhfbG9hZF9vZmZzZXRzKCBDRkZfSW5kZXggIGlkeCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IDA7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBpZHgtPnN0cmVhbTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIGlkeC0+Y291bnQgPiAwICYmIGlkeC0+b2Zmc2V0cyA9PSBOVUxMICkKLSAgICB7Ci0gICAgICBGVF9CeXRlICAgIG9mZnNpemUgPSBpZHgtPm9mZl9zaXplOwotICAgICAgRlRfVUxvbmcgICBkYXRhX3NpemU7Ci0gICAgICBGVF9CeXRlKiAgIHA7Ci0gICAgICBGVF9CeXRlKiAgIHBfZW5kOwotICAgICAgRlRfVUxvbmcqICBwb2ZmOwotCi0KLSAgICAgIGRhdGFfc2l6ZSA9IChGVF9VTG9uZykoIGlkeC0+Y291bnQgKyAxICkgKiBvZmZzaXplOwotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggaWR4LT5vZmZzZXRzLCBpZHgtPmNvdW50ICsgMSApIHx8Ci0gICAgICAgICAgIEZUX1NUUkVBTV9TRUVLKCBpZHgtPnN0YXJ0ICsgMyApICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBkYXRhX3NpemUgKSAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwb2ZmICAgPSBpZHgtPm9mZnNldHM7Ci0gICAgICBwICAgICAgPSAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3I7Ci0gICAgICBwX2VuZCAgPSBwICsgZGF0YV9zaXplOwotCi0gICAgICBzd2l0Y2ggKCBvZmZzaXplICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgZm9yICggOyBwIDwgcF9lbmQ7IHArKywgcG9mZisrICkKLSAgICAgICAgICBwb2ZmWzBdID0gcFswXTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgICAgZm9yICggOyBwIDwgcF9lbmQ7IHAgKz0gMiwgcG9mZisrICkKLSAgICAgICAgICBwb2ZmWzBdID0gRlRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMzoKLSAgICAgICAgZm9yICggOyBwIDwgcF9lbmQ7IHAgKz0gMywgcG9mZisrICkKLSAgICAgICAgICBwb2ZmWzBdID0gRlRfUEVFS19PRkYzKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBmb3IgKCA7IHAgPCBwX2VuZDsgcCArPSA0LCBwb2ZmKysgKQotICAgICAgICAgIHBvZmZbMF0gPSBGVF9QRUVLX1VMT05HKCBwICk7Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0ZSRUUoIGlkeC0+b2Zmc2V0cyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBhbGxvY2F0ZSBhIHRhYmxlIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gYW4gaW5kZXgncyBlbGVtZW50cyAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX2luZGV4X2dldF9wb2ludGVycyggQ0ZGX0luZGV4ICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKioqICB0YWJsZSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IENGRl9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBpZHgtPnN0cmVhbS0+bWVtb3J5OwotICAgIEZUX1VMb25nICAgbiwgb2Zmc2V0LCBvbGRfb2Zmc2V0OwotICAgIEZUX0J5dGUqKiAgdDsKLQotCi0gICAgKnRhYmxlID0gMDsKLQotICAgIGlmICggaWR4LT5vZmZzZXRzID09IE5VTEwgKQotICAgIHsKLSAgICAgIGVycm9yID0gY2ZmX2luZGV4X2xvYWRfb2Zmc2V0cyggaWR4ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggaWR4LT5jb3VudCA+IDAgJiYgIUZUX05FV19BUlJBWSggdCwgaWR4LT5jb3VudCArIDEgKSApCi0gICAgewotICAgICAgb2xkX29mZnNldCA9IDE7Ci0gICAgICBmb3IgKCBuID0gMDsgbiA8PSBpZHgtPmNvdW50OyBuKysgKQotICAgICAgewotICAgICAgICBvZmZzZXQgPSBpZHgtPm9mZnNldHNbbl07Ci0gICAgICAgIGlmICggIW9mZnNldCApCi0gICAgICAgICAgb2Zmc2V0ID0gb2xkX29mZnNldDsKLQotICAgICAgICAvKiB0d28gc2FuaXR5IGNoZWNrcyBmb3IgaW52YWxpZCBvZmZzZXQgdGFibGVzICovCi0gICAgICAgIGVsc2UgaWYgKCBvZmZzZXQgPCBvbGRfb2Zmc2V0ICkKLSAgICAgICAgICBvZmZzZXQgPSBvbGRfb2Zmc2V0OwotCi0gICAgICAgIGVsc2UgaWYgKCBvZmZzZXQgLSAxID49IGlkeC0+ZGF0YV9zaXplICYmIG4gPCBpZHgtPmNvdW50ICkKLSAgICAgICAgICBvZmZzZXQgPSBvbGRfb2Zmc2V0OwotCi0gICAgICAgIHRbbl0gPSBpZHgtPmJ5dGVzICsgb2Zmc2V0IC0gMTsKLQotICAgICAgICBvbGRfb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgfQotICAgICAgKnRhYmxlID0gdDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoIENGRl9JbmRleCAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHBieXRlX2xlbiApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBDRkZfRXJyX09rOwotCi0KLSAgICBpZiAoIGlkeCAmJiBpZHgtPmNvdW50ID4gZWxlbWVudCApCi0gICAgewotICAgICAgLyogY29tcHV0ZSBzdGFydCBhbmQgZW5kIG9mZnNldHMgKi8KLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gaWR4LT5zdHJlYW07Ci0gICAgICBGVF9VTG9uZyAgIG9mZjEsIG9mZjIgPSAwOwotCi0KLSAgICAgIC8qIGxvYWQgb2Zmc2V0cyBmcm9tIGZpbGUgb3IgdGhlIG9mZnNldCB0YWJsZSAqLwotICAgICAgaWYgKCAhaWR4LT5vZmZzZXRzICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUxvbmcgIHBvcyA9IGVsZW1lbnQgKiBpZHgtPm9mZl9zaXplOwotCi0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggaWR4LT5zdGFydCArIDMgKyBwb3MgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIG9mZjEgPSBjZmZfaW5kZXhfcmVhZF9vZmZzZXQoIGlkeCwgJmVycm9yICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIG9mZjEgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQrKzsKLSAgICAgICAgICAgIG9mZjIgPSBjZmZfaW5kZXhfcmVhZF9vZmZzZXQoIGlkeCwgJmVycm9yICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlICggb2ZmMiA9PSAwICYmIGVsZW1lbnQgPCBpZHgtPmNvdW50ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgICAvKiB1c2Ugb2Zmc2V0cyB0YWJsZSAqLwotICAgICAgewotICAgICAgICBvZmYxID0gaWR4LT5vZmZzZXRzW2VsZW1lbnRdOwotICAgICAgICBpZiAoIG9mZjEgKQotICAgICAgICB7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50Kys7Ci0gICAgICAgICAgICBvZmYyID0gaWR4LT5vZmZzZXRzW2VsZW1lbnRdOwotCi0gICAgICAgICAgfSB3aGlsZSAoIG9mZjIgPT0gMCAmJiBlbGVtZW50IDwgaWR4LT5jb3VudCApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGFjY2VzcyBlbGVtZW50ICovCi0gICAgICBpZiAoIG9mZjEgJiYgb2ZmMiA+IG9mZjEgKQotICAgICAgewotICAgICAgICAqcGJ5dGVfbGVuID0gb2ZmMiAtIG9mZjE7Ci0KLSAgICAgICAgaWYgKCBpZHgtPmJ5dGVzICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgaW5kZXggd2FzIGNvbXBsZXRlbHkgbG9hZGVkIGluIG1lbW9yeSwgdGhhdCdzIGVhc3kgKi8KLSAgICAgICAgICAqcGJ5dGVzID0gaWR4LT5ieXRlcyArIG9mZjEgLSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgaW5kZXggaXMgc3RpbGwgb24gZGlzay9maWxlLCBhY2Nlc3MgaXQgdGhyb3VnaCBhIGZyYW1lICovCi0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggaWR4LT5kYXRhX29mZnNldCArIG9mZjEgLSAxICkgfHwKLSAgICAgICAgICAgICAgIEZUX0ZSQU1FX0VYVFJBQ1QoIG9mZjIgLSBvZmYxLCAqcGJ5dGVzICkgICAgICApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogZW1wdHkgaW5kZXggZWxlbWVudCAqLwotICAgICAgICAqcGJ5dGVzICAgID0gMDsKLSAgICAgICAgKnBieXRlX2xlbiA9IDA7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gQ0ZGX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfaW5kZXhfZm9yZ2V0X2VsZW1lbnQoIENGRl9JbmRleCAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICkKLSAgewotICAgIGlmICggaWR4LT5ieXRlcyA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGlkeC0+c3RyZWFtOwotCi0KLSAgICAgIEZUX0ZSQU1FX1JFTEVBU0UoICpwYnl0ZXMgKTsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfU3RyaW5nKiApCi0gIGNmZl9pbmRleF9nZXRfbmFtZSggQ0ZGX0luZGV4ICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBlbGVtZW50ICkKLSAgewotICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IGlkeC0+c3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfQnl0ZSogICAgYnl0ZXM7Ci0gICAgRlRfVUxvbmcgICAgYnl0ZV9sZW47Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfU3RyaW5nKiAgbmFtZSA9IDA7Ci0KLQotICAgIGVycm9yID0gY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50KCBpZHgsIGVsZW1lbnQsICZieXRlcywgJmJ5dGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoICFGVF9BTExPQyggbmFtZSwgYnl0ZV9sZW4gKyAxICkgKQotICAgIHsKLSAgICAgIEZUX01FTV9DT1BZKCBuYW1lLCBieXRlcywgYnl0ZV9sZW4gKTsKLSAgICAgIG5hbWVbYnl0ZV9sZW5dID0gMDsKLSAgICB9Ci0gICAgY2ZmX2luZGV4X2ZvcmdldF9lbGVtZW50KCBpZHgsICZieXRlcyApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfU3RyaW5nKiApCi0gIGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggQ0ZGX0luZGV4ICAgICAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICBzaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzICkKLSAgewotICAgIC8qIHZhbHVlIDB4RkZGRlUgaW5kaWNhdGVzIGEgbWlzc2luZyBkaWN0aW9uYXJ5IGVudHJ5ICovCi0gICAgaWYgKCBzaWQgPT0gMHhGRkZGVSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIGlmIGl0IGlzIG5vdCBhIHN0YW5kYXJkIHN0cmluZywgcmV0dXJuIGl0ICovCi0gICAgaWYgKCBzaWQgPiAzOTAgKQotICAgICAgcmV0dXJuIGNmZl9pbmRleF9nZXRfbmFtZSggaWR4LCBzaWQgLSAzOTEgKTsKLQotICAgIC8qIENJRC1rZXllZCBDRkYgZm9udHMgZG9uJ3QgaGF2ZSBnbHlwaCBuYW1lcyAqLwotICAgIGlmICggIXBzbmFtZXMgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiB0aGF0J3MgYSBzdGFuZGFyZCBzdHJpbmcsIGZldGNoIGEgY29weSBmcm9tIHRoZSBQU05hbWUgbW9kdWxlICovCi0gICAgewotICAgICAgRlRfU3RyaW5nKiAgIG5hbWUgICAgICAgPSAwOwotICAgICAgY29uc3QgY2hhciogIGFkb2JlX25hbWUgPSBwc25hbWVzLT5hZG9iZV9zdGRfc3RyaW5ncyggc2lkICk7Ci0KLQotICAgICAgaWYgKCBhZG9iZV9uYW1lICkKLSAgICAgIHsKLSAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBpZHgtPnN0cmVhbS0+bWVtb3J5OwotICAgICAgICBGVF9FcnJvciAgIGVycm9yOwotCi0KLSAgICAgICAgKHZvaWQpRlRfU1RSRFVQKCBuYW1lLCBhZG9iZV9uYW1lICk7Ci0KLSAgICAgICAgRlRfVU5VU0VEKCBlcnJvciApOwotICAgICAgfQotCi0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICBGRCBTZWxlY3QgdGFibGUgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgQ0ZGX0RvbmVfRkRfU2VsZWN0KCBDRkZfRkRTZWxlY3QgIGZkc2VsZWN0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtICkKLSAgewotICAgIGlmICggZmRzZWxlY3QtPmRhdGEgKQotICAgICAgRlRfRlJBTUVfUkVMRUFTRSggZmRzZWxlY3QtPmRhdGEgKTsKLQotICAgIGZkc2VsZWN0LT5kYXRhX3NpemUgICA9IDA7Ci0gICAgZmRzZWxlY3QtPmZvcm1hdCAgICAgID0gMDsKLSAgICBmZHNlbGVjdC0+cmFuZ2VfY291bnQgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgQ0ZGX0xvYWRfRkRfU2VsZWN0KCBDRkZfRkRTZWxlY3QgIGZkc2VsZWN0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIG9mZnNldCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgRlRfQnl0ZSAgIGZvcm1hdDsKLSAgICBGVF9VSW50ICAgbnVtX3JhbmdlczsKLQotCi0gICAgLyogcmVhZCBmb3JtYXQgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSB8fCBGVF9SRUFEX0JZVEUoIGZvcm1hdCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZkc2VsZWN0LT5mb3JtYXQgICAgICA9IGZvcm1hdDsKLSAgICBmZHNlbGVjdC0+Y2FjaGVfY291bnQgPSAwOyAgIC8qIGNsZWFyIGNhY2hlICovCi0KLSAgICBzd2l0Y2ggKCBmb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDA6ICAgICAvKiBmb3JtYXQgMCwgdGhhdCdzIHNpbXBsZSAqLwotICAgICAgZmRzZWxlY3QtPmRhdGFfc2l6ZSA9IG51bV9nbHlwaHM7Ci0gICAgICBnb3RvIExvYWRfRGF0YTsKLQotICAgIGNhc2UgMzogICAgIC8qIGZvcm1hdCAzLCBhIHRhZCBtb3JlIGNvbXBsZXggKi8KLSAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG51bV9yYW5nZXMgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZmRzZWxlY3QtPmRhdGFfc2l6ZSA9IG51bV9yYW5nZXMgKiAzICsgMjsKLQotICAgIExvYWRfRGF0YToKLSAgICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggZmRzZWxlY3QtPmRhdGFfc2l6ZSwgZmRzZWxlY3QtPmRhdGEgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogICAgLyogaG1tLi4uIHRoYXQncyB3cm9uZyAqLwotICAgICAgZXJyb3IgPSBDRkZfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0J5dGUgKQotICBjZmZfZmRfc2VsZWN0X2dldCggQ0ZGX0ZEU2VsZWN0ICBmZHNlbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXggKQotICB7Ci0gICAgRlRfQnl0ZSAgZmQgPSAwOwotCi0KLSAgICBzd2l0Y2ggKCBmZHNlbGVjdC0+Zm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZmQgPSBmZHNlbGVjdC0+ZGF0YVtnbHlwaF9pbmRleF07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIGZpcnN0LCBjb21wYXJlIHRvIGNhY2hlICovCi0gICAgICBpZiAoIChGVF9VSW50KSggZ2x5cGhfaW5kZXggLSBmZHNlbGVjdC0+Y2FjaGVfZmlyc3QgKSA8Ci0gICAgICAgICAgICAgICAgICAgICAgICBmZHNlbGVjdC0+Y2FjaGVfY291bnQgKQotICAgICAgewotICAgICAgICBmZCA9IGZkc2VsZWN0LT5jYWNoZV9mZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRoZW4sIGxvb2t1cCB0aGUgcmFuZ2VzIGFycmF5ICovCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBwICAgICAgID0gZmRzZWxlY3QtPmRhdGE7Ci0gICAgICAgIEZUX0J5dGUqICBwX2xpbWl0ID0gcCArIGZkc2VsZWN0LT5kYXRhX3NpemU7Ci0gICAgICAgIEZUX0J5dGUgICBmZDI7Ci0gICAgICAgIEZUX1VJbnQgICBmaXJzdCwgbGltaXQ7Ci0KLQotICAgICAgICBmaXJzdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGdseXBoX2luZGV4IDwgZmlyc3QgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBmZDIgICA9ICpwKys7Ci0gICAgICAgICAgbGltaXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAgICAgaWYgKCBnbHlwaF9pbmRleCA8IGxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmZCA9IGZkMjsKLQotICAgICAgICAgICAgLyogdXBkYXRlIGNhY2hlICovCi0gICAgICAgICAgICBmZHNlbGVjdC0+Y2FjaGVfZmlyc3QgPSBmaXJzdDsKLSAgICAgICAgICAgIGZkc2VsZWN0LT5jYWNoZV9jb3VudCA9IGxpbWl0LWZpcnN0OwotICAgICAgICAgICAgZmRzZWxlY3QtPmNhY2hlX2ZkICAgID0gZmQyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpcnN0ID0gbGltaXQ7Ci0KLSAgICAgICAgfSB3aGlsZSAoIHAgPCBwX2xpbWl0ICk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZkOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgQ0ZGIGZvbnQgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX2NoYXJzZXRfY29tcHV0ZV9jaWRzKCBDRkZfQ2hhcnNldCAgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgICA9IEZUX0Vycl9PazsKLSAgICBGVF9VSW50ICAgIGk7Ci0gICAgRlRfVVNob3J0ICBtYXhfY2lkID0gMDsKLQotCi0gICAgaWYgKCBjaGFyc2V0LT5tYXhfY2lkID4gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9nbHlwaHM7IGkrKyApCi0gICAgICBpZiAoIGNoYXJzZXQtPnNpZHNbaV0gPiBtYXhfY2lkICkKLSAgICAgICAgbWF4X2NpZCA9IGNoYXJzZXQtPnNpZHNbaV07Ci0gICAgbWF4X2NpZCsrOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGNoYXJzZXQtPmNpZHMsIG1heF9jaWQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9nbHlwaHM7IGkrKyApCi0gICAgICBjaGFyc2V0LT5jaWRzW2NoYXJzZXQtPnNpZHNbaV1dID0gKEZUX1VTaG9ydClpOwotCi0gICAgY2hhcnNldC0+bWF4X2NpZCAgICA9IG1heF9jaWQ7Ci0gICAgY2hhcnNldC0+bnVtX2dseXBocyA9IG51bV9nbHlwaHM7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUludCApCi0gIGNmZl9jaGFyc2V0X2NpZF90b19naW5kZXgoIENGRl9DaGFyc2V0ICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgY2lkICkKLSAgewotICAgIEZUX1VJbnQgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggY2lkIDwgY2hhcnNldC0+bWF4X2NpZCApCi0gICAgICByZXN1bHQgPSBjaGFyc2V0LT5jaWRzW2NpZF07Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfY2hhcnNldF9mcmVlX2NpZHMoIENGRl9DaGFyc2V0ICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRlJFRSggY2hhcnNldC0+Y2lkcyApOwotICAgIGNoYXJzZXQtPm1heF9jaWQgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfY2hhcnNldF9kb25lKCBDRkZfQ2hhcnNldCAgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICBjZmZfY2hhcnNldF9mcmVlX2NpZHMoIGNoYXJzZXQsIG1lbW9yeSApOwotCi0gICAgRlRfRlJFRSggY2hhcnNldC0+c2lkcyApOwotICAgIGNoYXJzZXQtPmZvcm1hdCA9IDA7Ci0gICAgY2hhcnNldC0+b2Zmc2V0ID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9jaGFyc2V0X2xvYWQoIENGRl9DaGFyc2V0ICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgaW52ZXJ0ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBDRkZfRXJyX09rOwotICAgIEZUX1VTaG9ydCAgZ2x5cGhfc2lkOwotCi0KLSAgICAvKiBJZiB0aGUgdGhlIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gMiwgd2UgaGF2ZSB0byBwYXJzZSB0aGUgKi8KLSAgICAvKiBjaGFyc2V0IHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIG9mZnNldCA+IDIgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGo7Ci0KLQotICAgICAgY2hhcnNldC0+b2Zmc2V0ID0gYmFzZV9vZmZzZXQgKyBvZmZzZXQ7Ci0KLSAgICAgIC8qIEdldCB0aGUgZm9ybWF0IG9mIHRoZSB0YWJsZS4gKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGNoYXJzZXQtPm9mZnNldCApIHx8Ci0gICAgICAgICAgIEZUX1JFQURfQllURSggY2hhcnNldC0+Zm9ybWF0ICkgICApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzaWRzLiAqLwotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGNoYXJzZXQtPnNpZHMsIG51bV9nbHlwaHMgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogYXNzaWduIHRoZSAubm90ZGVmIGdseXBoICovCi0gICAgICBjaGFyc2V0LT5zaWRzWzBdID0gMDsKLQotICAgICAgc3dpdGNoICggY2hhcnNldC0+Zm9ybWF0ICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgaWYgKCBudW1fZ2x5cGhzID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCAoIG51bV9nbHlwaHMgLSAxICkgKiAyICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgZm9yICggaiA9IDE7IGogPCBudW1fZ2x5cGhzOyBqKysgKQotICAgICAgICAgICAgY2hhcnNldC0+c2lkc1tqXSA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAxOgotICAgICAgY2FzZSAyOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgbmxlZnQ7Ci0gICAgICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICAgICAgaiA9IDE7Ci0KLSAgICAgICAgICB3aGlsZSAoIGogPCBudW1fZ2x5cGhzICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZWFkIHRoZSBmaXJzdCBnbHlwaCBzaWQgb2YgdGhlIHJhbmdlLiAqLwotICAgICAgICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggZ2x5cGhfc2lkICkgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIC8qIFJlYWQgdGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIHJhbmdlLiAgKi8KLSAgICAgICAgICAgIGlmICggY2hhcnNldC0+Zm9ybWF0ID09IDIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBubGVmdCApICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggRlRfUkVBRF9CWVRFKCBubGVmdCApICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIHJhbmdlIG9mIHNpZHMgLS0gYG5sZWZ0ICsgMScgZ2x5cGhzLiAqLwotICAgICAgICAgICAgZm9yICggaSA9IDA7IGogPCBudW1fZ2x5cGhzICYmIGkgPD0gbmxlZnQ7IGkrKywgaisrLCBnbHlwaF9zaWQrKyApCi0gICAgICAgICAgICAgIGNoYXJzZXQtPnNpZHNbal0gPSBnbHlwaF9zaWQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBGVF9FUlJPUigoICJjZmZfY2hhcnNldF9sb2FkOiBpbnZhbGlkIHRhYmxlIGZvcm1hdCFcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gQ0ZGX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQYXJzZSBkZWZhdWx0IHRhYmxlcyBjb3JyZXNwb25kaW5nIHRvIG9mZnNldCA9PSAwLCAxLCBvciAyLiAgKi8KLSAgICAgIC8qIENGRiBzcGVjaWZpY2F0aW9uIGludGltYXRlcyB0aGUgZm9sbG93aW5nOiAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBJbiBvcmRlciB0byB1c2UgYSBwcmVkZWZpbmVkIGNoYXJzZXQsIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSAgKi8KLSAgICAgIC8qIHRydWU6IFRoZSBjaGFyc2V0IGNvbnN0cnVjdGVkIGZvciB0aGUgZ2x5cGhzIGluIHRoZSBmb250J3MgICAqLwotICAgICAgLyogY2hhcnN0cmluZ3MgZGljdGlvbmFyeSBtdXN0IG1hdGNoIHRoZSBwcmVkZWZpbmVkIGNoYXJzZXQgaW4gICovCi0gICAgICAvKiB0aGUgZmlyc3QgbnVtX2dseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgY2hhcnNldC0+b2Zmc2V0ID0gb2Zmc2V0OyAgLyogcmVjb3JkIGNoYXJzZXQgdHlwZSAqLwotCi0gICAgICBzd2l0Y2ggKCAoRlRfVUludClvZmZzZXQgKQotICAgICAgewotICAgICAgY2FzZSAwOgotICAgICAgICBpZiAoIG51bV9nbHlwaHMgPiAyMjkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2NoYXJzZXRfbG9hZDogaW1wbGljaXQgY2hhcnNldCBsYXJnZXIgdGhhblxuIgotICAgICAgICAgICAgICAgICAgICAgInByZWRlZmluZWQgY2hhcnNldCAoQWRvYmUgSVNPLUxhdGluKSFcbiIgKSk7Ci0gICAgICAgICAgZXJyb3IgPSBDRkZfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzaWRzLiAqLwotICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggY2hhcnNldC0+c2lkcywgbnVtX2dseXBocyApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogQ29weSB0aGUgcHJlZGVmaW5lZCBjaGFyc2V0IGludG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuICovCi0gICAgICAgIEZUX0FSUkFZX0NPUFkoIGNoYXJzZXQtPnNpZHMsIGNmZl9pc29hZG9iZV9jaGFyc2V0LCBudW1fZ2x5cGhzICk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMToKLSAgICAgICAgaWYgKCBudW1fZ2x5cGhzID4gMTY2ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggImNmZl9jaGFyc2V0X2xvYWQ6IGltcGxpY2l0IGNoYXJzZXQgbGFyZ2VyIHRoYW5cbiIKLSAgICAgICAgICAgICAgICAgICAgICJwcmVkZWZpbmVkIGNoYXJzZXQgKEFkb2JlIEV4cGVydCkhXG4iICkpOwotICAgICAgICAgIGVycm9yID0gQ0ZGX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc2lkcy4gKi8KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGNoYXJzZXQtPnNpZHMsIG51bV9nbHlwaHMgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIC8qIENvcHkgdGhlIHByZWRlZmluZWQgY2hhcnNldCBpbnRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAgICAgKi8KLSAgICAgICAgRlRfQVJSQVlfQ09QWSggY2hhcnNldC0+c2lkcywgY2ZmX2V4cGVydF9jaGFyc2V0LCBudW1fZ2x5cGhzICk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKCBudW1fZ2x5cGhzID4gODcgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2NoYXJzZXRfbG9hZDogaW1wbGljaXQgY2hhcnNldCBsYXJnZXIgdGhhblxuIgotICAgICAgICAgICAgICAgICAgICAgInByZWRlZmluZWQgY2hhcnNldCAoQWRvYmUgRXhwZXJ0IFN1YnNldCkhXG4iICkpOwotICAgICAgICAgIGVycm9yID0gQ0ZGX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igc2lkcy4gKi8KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGNoYXJzZXQtPnNpZHMsIG51bV9nbHlwaHMgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIC8qIENvcHkgdGhlIHByZWRlZmluZWQgY2hhcnNldCBpbnRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAgICAgKi8KLSAgICAgICAgRlRfQVJSQVlfQ09QWSggY2hhcnNldC0+c2lkcywgY2ZmX2V4cGVydHN1YnNldF9jaGFyc2V0LCBudW1fZ2x5cGhzICk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGVycm9yID0gQ0ZGX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogd2UgaGF2ZSB0byBpbnZlcnQgdGhlIGBzaWRzJyBhcnJheSBmb3Igc3Vic2V0dGVkIENJRC1rZXllZCBmb250cyAqLwotICAgIGlmICggaW52ZXJ0ICkKLSAgICAgIGVycm9yID0gY2ZmX2NoYXJzZXRfY29tcHV0ZV9jaWRzKCBjaGFyc2V0LCBudW1fZ2x5cGhzLCBtZW1vcnkgKTsKLQotICBFeGl0OgotICAgIC8qIENsZWFuIHVwIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gKi8KLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBjaGFyc2V0LT5zaWRzICk7Ci0gICAgICBGVF9GUkVFKCBjaGFyc2V0LT5jaWRzICk7Ci0gICAgICBjaGFyc2V0LT5mb3JtYXQgPSAwOwotICAgICAgY2hhcnNldC0+b2Zmc2V0ID0gMDsKLSAgICAgIGNoYXJzZXQtPnNpZHMgICA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfZW5jb2RpbmdfZG9uZSggQ0ZGX0VuY29kaW5nICBlbmNvZGluZyApCi0gIHsKLSAgICBlbmNvZGluZy0+Zm9ybWF0ID0gMDsKLSAgICBlbmNvZGluZy0+b2Zmc2V0ID0gMDsKLSAgICBlbmNvZGluZy0+Y291bnQgID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9lbmNvZGluZ19sb2FkKCBDRkZfRW5jb2RpbmcgIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgQ0ZGX0NoYXJzZXQgICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBudW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBvZmZzZXQgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IENGRl9FcnJfT2s7Ci0gICAgRlRfVUludCAgICBjb3VudDsKLSAgICBGVF9VSW50ICAgIGo7Ci0gICAgRlRfVVNob3J0ICBnbHlwaF9zaWQ7Ci0gICAgRlRfVUludCAgICBnbHlwaF9jb2RlOwotCi0KLSAgICAvKiBDaGVjayBmb3IgY2hhcnNldC0+c2lkcy4gIElmIHdlIGRvIG5vdCBoYXZlIHRoaXMsIHdlIGZhaWwuICovCi0gICAgaWYgKCAhY2hhcnNldC0+c2lkcyApCi0gICAgewotICAgICAgZXJyb3IgPSBDRkZfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogWmVybyBvdXQgdGhlIGNvZGUgdG8gZ2lkL3NpZCBtYXBwaW5ncy4gKi8KLSAgICBmb3IgKCBqID0gMDsgaiA8IDI1NjsgaisrICkKLSAgICB7Ci0gICAgICBlbmNvZGluZy0+c2lkcyBbal0gPSAwOwotICAgICAgZW5jb2RpbmctPmNvZGVzW2pdID0gMDsKLSAgICB9Ci0KLSAgICAvKiBOb3RlOiBUaGUgZW5jb2RpbmcgdGFibGUgaW4gYSBDRkYgZm9udCBpcyBpbmRleGVkIGJ5IGdseXBoIGluZGV4OyAgKi8KLSAgICAvKiB0aGUgZmlyc3QgZW5jb2RlZCBnbHlwaCBpbmRleCBpcyAxLiAgSGVuY2UsIHdlIHJlYWQgdGhlIGNoYXJhY3RlciAgKi8KLSAgICAvKiBjb2RlIChgZ2x5cGhfY29kZScpIGF0IGluZGV4IGogYW5kIG1ha2UgdGhlIGFzc2lnbm1lbnQ6ICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBlbmNvZGluZy0+Y29kZXNbZ2x5cGhfY29kZV0gPSBqICsgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBXZSBhbHNvIG1ha2UgdGhlIGFzc2lnbm1lbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBlbmNvZGluZy0+c2lkc1tnbHlwaF9jb2RlXSA9IGNoYXJzZXQtPnNpZHNbaiArIDFdICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGlzIGdpdmVzIHVzIGJvdGggYSBjb2RlIHRvIEdJRCBhbmQgYSBjb2RlIHRvIFNJRCBtYXBwaW5nLiAgICAgICAgKi8KLQotICAgIGlmICggb2Zmc2V0ID4gMSApCi0gICAgewotICAgICAgZW5jb2RpbmctPm9mZnNldCA9IGJhc2Vfb2Zmc2V0ICsgb2Zmc2V0OwotCi0gICAgICAvKiB3ZSBuZWVkIHRvIHBhcnNlIHRoZSB0YWJsZSB0byBkZXRlcm1pbmUgaXRzIHNpemUgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGVuY29kaW5nLT5vZmZzZXQgKSB8fAotICAgICAgICAgICBGVF9SRUFEX0JZVEUoIGVuY29kaW5nLT5mb3JtYXQgKSAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfQllURSggY291bnQgKSAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHN3aXRjaCAoIGVuY29kaW5nLT5mb3JtYXQgJiAweDdGICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICBwOwotCi0KLSAgICAgICAgICAvKiBCeSBjb252ZW50aW9uLCBHSUQgMCBpcyBhbHdheXMgIi5ub3RkZWYiIGFuZCBpcyBuZXZlciAqLwotICAgICAgICAgIC8qIGNvZGVkIGluIHRoZSBmb250LiAgSGVuY2UsIHRoZSBudW1iZXIgb2YgY29kZXMgZm91bmQgICovCi0gICAgICAgICAgLyogaW4gdGhlIHRhYmxlIGlzIGBjb3VudCsxJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGVuY29kaW5nLT5jb3VudCA9IGNvdW50ICsgMTsKLQotICAgICAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGNvdW50ICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgcCA9IChGVF9CeXRlKilzdHJlYW0tPmN1cnNvcjsKLQotICAgICAgICAgIGZvciAoIGogPSAxOyBqIDw9IGNvdW50OyBqKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdseXBoX2NvZGUgPSAqcCsrOwotCi0gICAgICAgICAgICAvKiBNYWtlIHN1cmUgaiBpcyBub3QgdG9vIGJpZy4gKi8KLSAgICAgICAgICAgIGlmICggaiA8IG51bV9nbHlwaHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBBc3NpZ24gY29kZSB0byBHSUQgbWFwcGluZy4gKi8KLSAgICAgICAgICAgICAgZW5jb2RpbmctPmNvZGVzW2dseXBoX2NvZGVdID0gKEZUX1VTaG9ydClqOwotCi0gICAgICAgICAgICAgIC8qIEFzc2lnbiBjb2RlIHRvIFNJRCBtYXBwaW5nLiAqLwotICAgICAgICAgICAgICBlbmNvZGluZy0+c2lkc1tnbHlwaF9jb2RlXSA9IGNoYXJzZXQtPnNpZHNbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDE6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBubGVmdDsKLSAgICAgICAgICBGVF9VSW50ICBpID0gMTsKLSAgICAgICAgICBGVF9VSW50ICBrOwotCi0KLSAgICAgICAgICBlbmNvZGluZy0+Y291bnQgPSAwOwotCi0gICAgICAgICAgLyogUGFyc2UgdGhlIEZvcm1hdDEgcmFuZ2VzLiAqLwotICAgICAgICAgIGZvciAoIGogPSAwOyAgaiA8IGNvdW50OyBqKyssIGkgKz0gbmxlZnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlYWQgdGhlIGZpcnN0IGdseXBoIGNvZGUgb2YgdGhlIHJhbmdlLiAqLwotICAgICAgICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIGdseXBoX2NvZGUgKSApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgICAgLyogUmVhZCB0aGUgbnVtYmVyIG9mIGNvZGVzIGluIHRoZSByYW5nZS4gKi8KLSAgICAgICAgICAgIGlmICggRlRfUkVBRF9CWVRFKCBubGVmdCApICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAvKiBJbmNyZW1lbnQgbmxlZnQsIHNvIHdlIHJlYWQgYG5sZWZ0ICsgMScgY29kZXMvc2lkcy4gKi8KLSAgICAgICAgICAgIG5sZWZ0Kys7Ci0KLSAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IG51bWJlciBvZiBjaGFyYWN0ZXIgY29kZXMgKi8KLSAgICAgICAgICAgIGlmICggKEZUX1VJbnQpbmxlZnQgPiBlbmNvZGluZy0+Y291bnQgKQotICAgICAgICAgICAgICBlbmNvZGluZy0+Y291bnQgPSBubGVmdDsKLQotICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgcmFuZ2Ugb2YgY29kZXMvc2lkcy4gKi8KLSAgICAgICAgICAgIGZvciAoIGsgPSBpOyBrIDwgbmxlZnQgKyBpOyBrKyssIGdseXBoX2NvZGUrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSBrIGlzIG5vdCB0b28gYmlnLiAqLwotICAgICAgICAgICAgICBpZiAoIGsgPCBudW1fZ2x5cGhzICYmIGdseXBoX2NvZGUgPCAyNTYgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQXNzaWduIGNvZGUgdG8gR0lEIG1hcHBpbmcuICovCi0gICAgICAgICAgICAgICAgZW5jb2RpbmctPmNvZGVzW2dseXBoX2NvZGVdID0gKEZUX1VTaG9ydClrOwotCi0gICAgICAgICAgICAgICAgLyogQXNzaWduIGNvZGUgdG8gU0lEIG1hcHBpbmcuICovCi0gICAgICAgICAgICAgICAgZW5jb2RpbmctPnNpZHNbZ2x5cGhfY29kZV0gPSBjaGFyc2V0LT5zaWRzW2tdOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogc2ltcGxlIGNoZWNrOyBvbmUgbmV2ZXIga25vd3Mgd2hhdCBjYW4gYmUgZm91bmQgaW4gYSBmb250ICovCi0gICAgICAgICAgaWYgKCBlbmNvZGluZy0+Y291bnQgPiAyNTYgKQotICAgICAgICAgICAgZW5jb2RpbmctPmNvdW50ID0gMjU2OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBGVF9FUlJPUigoICJjZmZfZW5jb2RpbmdfbG9hZDogaW52YWxpZCB0YWJsZSBmb3JtYXQhXG4iICkpOwotICAgICAgICBlcnJvciA9IENGRl9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBQYXJzZSBzdXBwbGVtZW50YWwgZW5jb2RpbmdzLCBpZiBhbnkuICovCi0gICAgICBpZiAoIGVuY29kaW5nLT5mb3JtYXQgJiAweDgwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgZ2luZGV4OwotCi0KLSAgICAgICAgLyogY291bnQgc3VwcGxlbWVudHMgKi8KLSAgICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIGNvdW50ICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGNvdW50OyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogUmVhZCBzdXBwbGVtZW50YWwgZ2x5cGggY29kZS4gKi8KLSAgICAgICAgICBpZiAoIEZUX1JFQURfQllURSggZ2x5cGhfY29kZSApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIC8qIFJlYWQgdGhlIFNJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBnbHlwaCBjb2RlLiAqLwotICAgICAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIGdseXBoX3NpZCApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIC8qIEFzc2lnbiBjb2RlIHRvIFNJRCBtYXBwaW5nLiAqLwotICAgICAgICAgIGVuY29kaW5nLT5zaWRzW2dseXBoX2NvZGVdID0gZ2x5cGhfc2lkOwotCi0gICAgICAgICAgLyogRmlyc3QsIGxvb2sgdXAgR0lEIHdoaWNoIGhhcyBiZWVuIGFzc2lnbmVkIHRvICovCi0gICAgICAgICAgLyogU0lEIGdseXBoX3NpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgZm9yICggZ2luZGV4ID0gMDsgZ2luZGV4IDwgbnVtX2dseXBoczsgZ2luZGV4KysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggY2hhcnNldC0+c2lkc1tnaW5kZXhdID09IGdseXBoX3NpZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVuY29kaW5nLT5jb2Rlc1tnbHlwaF9jb2RlXSA9IChGVF9VU2hvcnQpZ2luZGV4OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IGEgQ0ZGIGZvbnQgY2FuIHVzZSBhIHByZWRlZmluZWQgKi8KLSAgICAgIC8qIGVuY29kaW5nIHdpdGhvdXQgY29udGFpbmluZyBhbGwgb2YgdGhlIGdseXBocyBlbmNvZGVkIGJ5IHRoaXMgKi8KLSAgICAgIC8qIGVuY29kaW5nIChzZWUgdGhlIG5vdGUgYXQgdGhlIGVuZCBvZiBzZWN0aW9uIDEyIGluIHRoZSBDRkYgICAgKi8KLSAgICAgIC8qIHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgc3dpdGNoICggKEZUX1VJbnQpb2Zmc2V0ICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgLyogRmlyc3QsIGNvcHkgdGhlIGNvZGUgdG8gU0lEIG1hcHBpbmcuICovCi0gICAgICAgIEZUX0FSUkFZX0NPUFkoIGVuY29kaW5nLT5zaWRzLCBjZmZfc3RhbmRhcmRfZW5jb2RpbmcsIDI1NiApOwotICAgICAgICBnb3RvIFBvcHVsYXRlOwotCi0gICAgICBjYXNlIDE6Ci0gICAgICAgIC8qIEZpcnN0LCBjb3B5IHRoZSBjb2RlIHRvIFNJRCBtYXBwaW5nLiAqLwotICAgICAgICBGVF9BUlJBWV9DT1BZKCBlbmNvZGluZy0+c2lkcywgY2ZmX2V4cGVydF9lbmNvZGluZywgMjU2ICk7Ci0KLSAgICAgIFBvcHVsYXRlOgotICAgICAgICAvKiBDb25zdHJ1Y3QgY29kZSB0byBHSUQgbWFwcGluZyBmcm9tIGNvZGUgdG8gU0lEIG1hcHBpbmcgKi8KLSAgICAgICAgLyogYW5kIGNoYXJzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgZW5jb2RpbmctPmNvdW50ID0gMDsKLQotICAgICAgICBlcnJvciA9IGNmZl9jaGFyc2V0X2NvbXB1dGVfY2lkcyggY2hhcnNldCwgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bWVtb3J5ICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IDI1NjsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHNpZCA9IGVuY29kaW5nLT5zaWRzW2pdOwotICAgICAgICAgIEZUX1VJbnQgIGdpZCA9IDA7Ci0KLQotICAgICAgICAgIGlmICggc2lkICkKLSAgICAgICAgICAgIGdpZCA9IGNmZl9jaGFyc2V0X2NpZF90b19naW5kZXgoIGNoYXJzZXQsIHNpZCApOwotCi0gICAgICAgICAgaWYgKCBnaWQgIT0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZW5jb2RpbmctPmNvZGVzW2pdID0gKEZUX1VTaG9ydClnaWQ7Ci0KLSAgICAgICAgICAgIGlmICggZW5jb2RpbmctPmNvdW50IDwgaiArIDEgKQotICAgICAgICAgICAgICBlbmNvZGluZy0+Y291bnQgPSBqICsgMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kaW5nLT5jb2Rlc1tqXSA9IDA7Ci0gICAgICAgICAgICBlbmNvZGluZy0+c2lkcyBbal0gPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2VuY29kaW5nX2xvYWQ6IGludmFsaWQgdGFibGUgZm9ybWF0IVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBDRkZfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLQotICAgIC8qIENsZWFuIHVwIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gKi8KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfc3ViZm9udF9sb2FkKCBDRkZfU3ViRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX0luZGV4ICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGZvbnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBiYXNlX29mZnNldCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIENGRl9QYXJzZXJSZWMgICAgcGFyc2VyOwotICAgIEZUX0J5dGUqICAgICAgICAgZGljdCA9IE5VTEw7Ci0gICAgRlRfVUxvbmcgICAgICAgICBkaWN0X2xlbjsKLSAgICBDRkZfRm9udFJlY0RpY3QgIHRvcCAgPSAmZm9udC0+Zm9udF9kaWN0OwotICAgIENGRl9Qcml2YXRlICAgICAgcHJpdiA9ICZmb250LT5wcml2YXRlX2RpY3Q7Ci0KLQotICAgIGNmZl9wYXJzZXJfaW5pdCggJnBhcnNlciwgQ0ZGX0NPREVfVE9QRElDVCwgJmZvbnQtPmZvbnRfZGljdCApOwotCi0gICAgLyogc2V0IGRlZmF1bHRzICovCi0gICAgRlRfTUVNX1pFUk8oIHRvcCwgc2l6ZW9mICggKnRvcCApICk7Ci0KLSAgICB0b3AtPnVuZGVybGluZV9wb3NpdGlvbiAgPSAtMTAwTCA8PCAxNjsKLSAgICB0b3AtPnVuZGVybGluZV90aGlja25lc3MgPSA1MEwgPDwgMTY7Ci0gICAgdG9wLT5jaGFyc3RyaW5nX3R5cGUgICAgID0gMjsKLSAgICB0b3AtPmZvbnRfbWF0cml4Lnh4ICAgICAgPSAweDEwMDAwTDsKLSAgICB0b3AtPmZvbnRfbWF0cml4Lnl5ICAgICAgPSAweDEwMDAwTDsKLSAgICB0b3AtPmNpZF9jb3VudCAgICAgICAgICAgPSA4NzIwOwotCi0gICAgLyogd2UgdXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBTSUQgdmFsdWUgMHhGRkZGIHRvIGluZGljYXRlICovCi0gICAgLyogbWlzc2luZyBlbnRyaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdG9wLT52ZXJzaW9uICAgICAgICAgICAgID0gMHhGRkZGVTsKLSAgICB0b3AtPm5vdGljZSAgICAgICAgICAgICAgPSAweEZGRkZVOwotICAgIHRvcC0+Y29weXJpZ2h0ICAgICAgICAgICA9IDB4RkZGRlU7Ci0gICAgdG9wLT5mdWxsX25hbWUgICAgICAgICAgID0gMHhGRkZGVTsKLSAgICB0b3AtPmZhbWlseV9uYW1lICAgICAgICAgPSAweEZGRkZVOwotICAgIHRvcC0+d2VpZ2h0ICAgICAgICAgICAgICA9IDB4RkZGRlU7Ci0gICAgdG9wLT5lbWJlZGRlZF9wb3N0c2NyaXB0ID0gMHhGRkZGVTsKLQotICAgIHRvcC0+Y2lkX3JlZ2lzdHJ5ICAgICAgICA9IDB4RkZGRlU7Ci0gICAgdG9wLT5jaWRfb3JkZXJpbmcgICAgICAgID0gMHhGRkZGVTsKLSAgICB0b3AtPmNpZF9mb250X25hbWUgICAgICAgPSAweEZGRkZVOwotCi0gICAgZXJyb3IgPSBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoIGlkeCwgZm9udF9pbmRleCwgJmRpY3QsICZkaWN0X2xlbiApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgIGVycm9yID0gY2ZmX3BhcnNlcl9ydW4oICZwYXJzZXIsIGRpY3QsIGRpY3QgKyBkaWN0X2xlbiApOwotCi0gICAgY2ZmX2luZGV4X2ZvcmdldF9lbGVtZW50KCBpZHgsICZkaWN0ICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGlmIGl0IGlzIGEgQ0lEIGZvbnQsIHdlIHN0b3AgdGhlcmUgKi8KLSAgICBpZiAoIHRvcC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcGFyc2UgdGhlIHByaXZhdGUgZGljdGlvbmFyeSwgaWYgYW55ICovCi0gICAgaWYgKCB0b3AtPnByaXZhdGVfb2Zmc2V0ICYmIHRvcC0+cHJpdmF0ZV9zaXplICkKLSAgICB7Ci0gICAgICAvKiBzZXQgZGVmYXVsdHMgKi8KLSAgICAgIEZUX01FTV9aRVJPKCBwcml2LCBzaXplb2YgKCAqcHJpdiApICk7Ci0KLSAgICAgIHByaXYtPmJsdWVfc2hpZnQgICAgICAgPSA3OwotICAgICAgcHJpdi0+Ymx1ZV9mdXp6ICAgICAgICA9IDE7Ci0gICAgICBwcml2LT5sZW5JViAgICAgICAgICAgID0gLTE7Ci0gICAgICBwcml2LT5leHBhbnNpb25fZmFjdG9yID0gKEZUX0ZpeGVkKSggMC4wNiAqIDB4MTAwMDBMICk7Ci0gICAgICBwcml2LT5ibHVlX3NjYWxlICAgICAgID0gKEZUX0ZpeGVkKSggMC4wMzk2MjUgKiAweDEwMDAwTCAqIDEwMDAgKTsKLQotICAgICAgY2ZmX3BhcnNlcl9pbml0KCAmcGFyc2VyLCBDRkZfQ09ERV9QUklWQVRFLCBwcml2ICk7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGJhc2Vfb2Zmc2V0ICsgZm9udC0+Zm9udF9kaWN0LnByaXZhdGVfb2Zmc2V0ICkgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGZvbnQtPmZvbnRfZGljdC5wcml2YXRlX3NpemUgKSAgICAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGVycm9yID0gY2ZmX3BhcnNlcl9ydW4oICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopc3RyZWFtLT5saW1pdCApOwotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogZW5zdXJlIHRoYXQgYG51bV9ibHVlX3ZhbHVlcycgaXMgZXZlbiAqLwotICAgICAgcHJpdi0+bnVtX2JsdWVfdmFsdWVzICY9IH4xOwotICAgIH0KLQotICAgIC8qIHJlYWQgdGhlIGxvY2FsIHN1YnJzLCBpZiBhbnkgKi8KLSAgICBpZiAoIHByaXYtPmxvY2FsX3N1YnJzX29mZnNldCApCi0gICAgewotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmFzZV9vZmZzZXQgKyB0b3AtPnByaXZhdGVfb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmxvY2FsX3N1YnJzX29mZnNldCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IGNmZl9pbmRleF9pbml0KCAmZm9udC0+bG9jYWxfc3VicnNfaW5kZXgsIHN0cmVhbSwgMSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9udC0+bnVtX2xvY2FsX3N1YnJzID0gZm9udC0+bG9jYWxfc3VicnNfaW5kZXguY291bnQ7Ci0gICAgICBlcnJvciA9IGNmZl9pbmRleF9nZXRfcG9pbnRlcnMoICZmb250LT5sb2NhbF9zdWJyc19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmxvY2FsX3N1YnJzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX3N1YmZvbnRfZG9uZSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX1N1YkZvbnQgIHN1YmZvbnQgKQotICB7Ci0gICAgaWYgKCBzdWJmb250ICkKLSAgICB7Ci0gICAgICBjZmZfaW5kZXhfZG9uZSggJnN1YmZvbnQtPmxvY2FsX3N1YnJzX2luZGV4ICk7Ci0gICAgICBGVF9GUkVFKCBzdWJmb250LT5sb2NhbF9zdWJycyApOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9mb250X2xvYWQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIENGRl9Gb250ICAgZm9udCApCi0gIHsKLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIGNmZl9oZWFkZXJfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgQ0ZGX0ZvbnRSZWMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDQgKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSggdmVyc2lvbl9tYWpvciApLAotICAgICAgICBGVF9GUkFNRV9CWVRFKCB2ZXJzaW9uX21pbm9yICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUoIGhlYWRlcl9zaXplICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUoIGFic29sdXRlX29mZnNpemUgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgICAgICBiYXNlX29mZnNldDsKLSAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3Q7Ci0KLQotICAgIEZUX1pFUk8oIGZvbnQgKTsKLQotICAgIGZvbnQtPnN0cmVhbSA9IHN0cmVhbTsKLSAgICBmb250LT5tZW1vcnkgPSBtZW1vcnk7Ci0gICAgZGljdCAgICAgICAgID0gJmZvbnQtPnRvcF9mb250LmZvbnRfZGljdDsKLSAgICBiYXNlX29mZnNldCAgPSBGVF9TVFJFQU1fUE9TKCk7Ci0KLSAgICAvKiByZWFkIENGRiBmb250IGhlYWRlciAqLwotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBjZmZfaGVhZGVyX2ZpZWxkcywgZm9udCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNoZWNrIGZvcm1hdCAqLwotICAgIGlmICggZm9udC0+dmVyc2lvbl9tYWpvciAgICE9IDEgfHwKLSAgICAgICAgIGZvbnQtPmhlYWRlcl9zaXplICAgICAgPCA0IHx8Ci0gICAgICAgICBmb250LT5hYnNvbHV0ZV9vZmZzaXplID4gNCApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIltub3QgYSBDRkYgZm9udCBoZWFkZXIhXVxuIiApKTsKLSAgICAgIGVycm9yID0gQ0ZGX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciAqLwotICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIGZvbnQtPmhlYWRlcl9zaXplIC0gNCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHJlYWQgdGhlIG5hbWUsIHRvcCBkaWN0LCBzdHJpbmcgYW5kIGdsb2JhbCBzdWJycyBpbmRleCAqLwotICAgIGlmICggRlRfU0VUX0VSUk9SKCBjZmZfaW5kZXhfaW5pdCggJmZvbnQtPm5hbWVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIDAgKSApICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfU0VUX0VSUk9SKCBjZmZfaW5kZXhfaW5pdCggJmZvbnQtPmZvbnRfZGljdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgMCApICkgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBGVF9TRVRfRVJST1IoIGNmZl9pbmRleF9pbml0KCAmZm9udC0+c3RyaW5nX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCAwICkgKSAgICAgICAgICAgICAgfHwKLSAgICAgICAgIEZUX1NFVF9FUlJPUiggY2ZmX2luZGV4X2luaXQoICZmb250LT5nbG9iYWxfc3VicnNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIDEgKSApICAgICAgICAgICAgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiB3ZWxsLCB3ZSBkb24ndCByZWFsbHkgZm9yZ2V0IHRoZSBgZGlzYWJsZWQnIGZvbnRzLi4uICovCi0gICAgZm9udC0+bnVtX2ZhY2VzID0gZm9udC0+bmFtZV9pbmRleC5jb3VudDsKLSAgICBpZiAoIGZhY2VfaW5kZXggPj0gKEZUX0ludClmb250LT5udW1fZmFjZXMgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNmZl9mb250X2xvYWQ6IGluY29ycmVjdCBmYWNlIGluZGV4ID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgIGZhY2VfaW5kZXggKSk7Ci0gICAgICBlcnJvciA9IENGRl9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICB9Ci0KLSAgICAvKiBpbiBjYXNlIG9mIGEgZm9udCBmb3JtYXQgY2hlY2ssIHNpbXBseSBleGl0IG5vdyAqLwotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbm93LCBwYXJzZSB0aGUgdG9wLWxldmVsIGZvbnQgZGljdGlvbmFyeSAqLwotICAgIGVycm9yID0gY2ZmX3N1YmZvbnRfbG9hZCggJmZvbnQtPnRvcF9mb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmZvbnRfZGljdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX29mZnNldCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmFzZV9vZmZzZXQgKyBkaWN0LT5jaGFyc3RyaW5nc19vZmZzZXQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IGNmZl9pbmRleF9pbml0KCAmZm9udC0+Y2hhcnN0cmluZ3NfaW5kZXgsIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbm93LCBjaGVjayBmb3IgYSBDSUQgZm9udCAqLwotICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgIHsKLSAgICAgIENGRl9JbmRleFJlYyAgZmRfaW5kZXg7Ci0gICAgICBDRkZfU3ViRm9udCAgIHN1YjsKLSAgICAgIEZUX1VJbnQgICAgICAgaWR4OwotCi0KLSAgICAgIC8qIHRoaXMgaXMgYSBDSUQta2V5ZWQgZm9udCwgd2UgbXVzdCBub3cgYWxsb2NhdGUgYSB0YWJsZSBvZiAqLwotICAgICAgLyogc3ViLWZvbnRzLCB0aGVuIGxvYWQgZWFjaCBvZiB0aGVtIHNlcGFyYXRlbHkgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBiYXNlX29mZnNldCArIGRpY3QtPmNpZF9mZF9hcnJheV9vZmZzZXQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZXJyb3IgPSBjZmZfaW5kZXhfaW5pdCggJmZkX2luZGV4LCBzdHJlYW0sIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggZmRfaW5kZXguY291bnQgPiBDRkZfTUFYX0NJRF9GT05UUyApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9mb250X2xvYWQ6IEZEIGFycmF5IHRvbyBsYXJnZSBpbiBDSUQgZm9udFxuIiApKTsKLSAgICAgICAgZ290byBGYWlsX0NJRDsKLSAgICAgIH0KLQotICAgICAgLyogYWxsb2NhdGUgJiByZWFkIGVhY2ggZm9udCBkaWN0IGluZGVwZW5kZW50bHkgKi8KLSAgICAgIGZvbnQtPm51bV9zdWJmb250cyA9IGZkX2luZGV4LmNvdW50OwotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHN1YiwgZmRfaW5kZXguY291bnQgKSApCi0gICAgICAgIGdvdG8gRmFpbF9DSUQ7Ci0KLSAgICAgIC8qIHNldCB1cCBwb2ludGVyIHRhYmxlICovCi0gICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBmZF9pbmRleC5jb3VudDsgaWR4KysgKQotICAgICAgICBmb250LT5zdWJmb250c1tpZHhdID0gc3ViICsgaWR4OwotCi0gICAgICAvKiBub3cgbG9hZCBlYWNoIHN1YmZvbnQgaW5kZXBlbmRlbnRseSAqLwotICAgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgZmRfaW5kZXguY291bnQ7IGlkeCsrICkKLSAgICAgIHsKLSAgICAgICAgc3ViID0gZm9udC0+c3ViZm9udHNbaWR4XTsKLSAgICAgICAgZXJyb3IgPSBjZmZfc3ViZm9udF9sb2FkKCBzdWIsICZmZF9pbmRleCwgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmFzZV9vZmZzZXQgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsX0NJRDsKLSAgICAgIH0KLQotICAgICAgLyogbm93IGxvYWQgdGhlIEZEIFNlbGVjdCBhcnJheSAqLwotICAgICAgZXJyb3IgPSBDRkZfTG9hZF9GRF9TZWxlY3QoICZmb250LT5mZF9zZWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+Y2hhcnN0cmluZ3NfaW5kZXguY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfb2Zmc2V0ICsgZGljdC0+Y2lkX2ZkX3NlbGVjdF9vZmZzZXQgKTsKLQotICAgIEZhaWxfQ0lEOgotICAgICAgY2ZmX2luZGV4X2RvbmUoICZmZF9pbmRleCApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICBmb250LT5udW1fc3ViZm9udHMgPSAwOwotCi0gICAgLyogcmVhZCB0aGUgY2hhcnN0cmluZ3MgaW5kZXggbm93ICovCi0gICAgaWYgKCBkaWN0LT5jaGFyc3RyaW5nc19vZmZzZXQgPT0gMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiY2ZmX2ZvbnRfbG9hZDogbm8gY2hhcnN0cmluZ3Mgb2Zmc2V0IVxuIiApKTsKLSAgICAgIGVycm9yID0gQ0ZGX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGV4cGxpY2l0IHRoZSBnbG9iYWwgc3VicnMgKi8KLSAgICBmb250LT5udW1fZ2xvYmFsX3N1YnJzID0gZm9udC0+Z2xvYmFsX3N1YnJzX2luZGV4LmNvdW50OwotICAgIGZvbnQtPm51bV9nbHlwaHMgICAgICAgPSBmb250LT5jaGFyc3RyaW5nc19pbmRleC5jb3VudDsKLQotICAgIGVycm9yID0gY2ZmX2luZGV4X2dldF9wb2ludGVycyggJmZvbnQtPmdsb2JhbF9zdWJyc19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5nbG9iYWxfc3VicnMgKSA7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHJlYWQgdGhlIENoYXJzZXQgYW5kIEVuY29kaW5nIHRhYmxlcyBpZiBhdmFpbGFibGUgKi8KLSAgICBpZiAoIGZvbnQtPm51bV9nbHlwaHMgPiAwICkKLSAgICB7Ci0gICAgICBGVF9Cb29sICBpbnZlcnQgPSBGVF9CT09MKCBkaWN0LT5jaWRfcmVnaXN0cnkgIT0gMHhGRkZGVSApOwotCi0KLSAgICAgIGVycm9yID0gY2ZmX2NoYXJzZXRfbG9hZCggJmZvbnQtPmNoYXJzZXQsIGZvbnQtPm51bV9nbHlwaHMsIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9vZmZzZXQsIGRpY3QtPmNoYXJzZXRfb2Zmc2V0LCBpbnZlcnQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIENJRC1rZXllZCBDRkZzIGRvbid0IGhhdmUgYW4gZW5jb2RpbmcgKi8KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGNmZl9lbmNvZGluZ19sb2FkKCAmZm9udC0+ZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5jaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5udW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5lbmNvZGluZ19vZmZzZXQgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAvKiBDSUQta2V5ZWQgZm9udHMgb25seSBuZWVkIENJRHMgKi8KLSAgICAgICAgRlRfRlJFRSggZm9udC0+Y2hhcnNldC5zaWRzICk7Ci0gICAgfQotCi0gICAgLyogZ2V0IHRoZSBmb250IG5hbWUgKC9DSURGb250TmFtZSBmb3IgQ0lELWtleWVkIGZvbnRzLCAqLwotICAgIC8qIC9Gb250TmFtZSBvdGhlcndpc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmb250LT5mb250X25hbWUgPSBjZmZfaW5kZXhfZ2V0X25hbWUoICZmb250LT5uYW1lX2luZGV4LCBmYWNlX2luZGV4ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmZl9mb250X2RvbmUoIENGRl9Gb250ICBmb250ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZm9udC0+bWVtb3J5OwotICAgIEZUX1VJbnQgICAgaWR4OwotCi0KLSAgICBjZmZfaW5kZXhfZG9uZSggJmZvbnQtPmdsb2JhbF9zdWJyc19pbmRleCApOwotICAgIGNmZl9pbmRleF9kb25lKCAmZm9udC0+c3RyaW5nX2luZGV4ICk7Ci0gICAgY2ZmX2luZGV4X2RvbmUoICZmb250LT5mb250X2RpY3RfaW5kZXggKTsKLSAgICBjZmZfaW5kZXhfZG9uZSggJmZvbnQtPm5hbWVfaW5kZXggKTsKLSAgICBjZmZfaW5kZXhfZG9uZSggJmZvbnQtPmNoYXJzdHJpbmdzX2luZGV4ICk7Ci0KLSAgICAvKiByZWxlYXNlIGZvbnQgZGljdGlvbmFyaWVzLCBidXQgb25seSBpZiB3b3JraW5nIHdpdGggKi8KLSAgICAvKiBhIENJRCBrZXllZCBDRkYgZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZvbnQtPm51bV9zdWJmb250cyA+IDAgKQotICAgIHsKLSAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGZvbnQtPm51bV9zdWJmb250czsgaWR4KysgKQotICAgICAgICBjZmZfc3ViZm9udF9kb25lKCBtZW1vcnksIGZvbnQtPnN1YmZvbnRzW2lkeF0gKTsKLQotICAgICAgLyogdGhlIHN1YmZvbnRzIGFycmF5IGhhcyBiZWVuIGFsbG9jYXRlZCBhcyBhIHNpbmdsZSBibG9jayAqLwotICAgICAgRlRfRlJFRSggZm9udC0+c3ViZm9udHNbMF0gKTsKLSAgICB9Ci0KLSAgICBjZmZfZW5jb2RpbmdfZG9uZSggJmZvbnQtPmVuY29kaW5nICk7Ci0gICAgY2ZmX2NoYXJzZXRfZG9uZSggJmZvbnQtPmNoYXJzZXQsIGZvbnQtPnN0cmVhbSApOwotCi0gICAgY2ZmX3N1YmZvbnRfZG9uZSggbWVtb3J5LCAmZm9udC0+dG9wX2ZvbnQgKTsKLQotICAgIENGRl9Eb25lX0ZEX1NlbGVjdCggJmZvbnQtPmZkX3NlbGVjdCwgZm9udC0+c3RyZWFtICk7Ci0KLSAgICBpZiAoZm9udC0+Zm9udF9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgRlRfRlJFRSggZm9udC0+Zm9udF9pbmZvLT52ZXJzaW9uICk7Ci0gICAgICBGVF9GUkVFKCBmb250LT5mb250X2luZm8tPm5vdGljZSApOwotICAgICAgRlRfRlJFRSggZm9udC0+Zm9udF9pbmZvLT5mdWxsX25hbWUgKTsKLSAgICAgIEZUX0ZSRUUoIGZvbnQtPmZvbnRfaW5mby0+ZmFtaWx5X25hbWUgKTsKLSAgICAgIEZUX0ZSRUUoIGZvbnQtPmZvbnRfaW5mby0+d2VpZ2h0ICk7Ci0gICAgICBGVF9GUkVFKCBmb250LT5mb250X2luZm8gKTsKLSAgICB9Ci0KLSAgICBGVF9GUkVFKCBmb250LT5yZWdpc3RyeSApOwotICAgIEZUX0ZSRUUoIGZvbnQtPm9yZGVyaW5nICk7Ci0KLSAgICBGVF9GUkVFKCBmb250LT5nbG9iYWxfc3VicnMgKTsKLSAgICBGVF9GUkVFKCBmb250LT5mb250X25hbWUgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZsb2FkLmggYi9zcmMvY2ZmL2NmZmxvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4Y2JiNS4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZmxvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSAmIENGRiBkYXRhL3Byb2dyYW0gdGFibGVzIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGRkxPQURfSF9fCi0jZGVmaW5lIF9fQ0ZGTE9BRF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJjZmZ0eXBlcy5oIgotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICBGVF9MT0NBTCggRlRfVVNob3J0ICkKLSAgY2ZmX2dldF9zdGFuZGFyZF9lbmNvZGluZyggRlRfVUludCAgY2hhcmNvZGUgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9TdHJpbmcqICkKLSAgY2ZmX2luZGV4X2dldF9uYW1lKCBDRkZfSW5kZXggIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGVsZW1lbnQgKTsKLQotICBGVF9MT0NBTCggRlRfU3RyaW5nKiApCi0gIGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggQ0ZGX0luZGV4ICAgICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNDTWFwcyBwc25hbWVzICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoIENGRl9JbmRleCAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHBieXRlX2xlbiApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2luZGV4X2ZvcmdldF9lbGVtZW50KCBDRkZfSW5kZXggIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApOwotCi0KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBjZmZfY2hhcnNldF9jaWRfdG9fZ2luZGV4KCBDRkZfQ2hhcnNldCAgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGNpZCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2ZvbnRfbG9hZCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgQ0ZGX0ZvbnQgICBmb250ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfZm9udF9kb25lKCBDRkZfRm9udCAgZm9udCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0J5dGUgKQotICBjZmZfZmRfc2VsZWN0X2dldCggQ0ZGX0ZEU2VsZWN0ICBmZHNlbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXggKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NGRkxPQURfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZm9ianMuYyBiL3NyYy9jZmYvY2Zmb2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjk5N2E5Li4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2Zmb2Jqcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZm9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBvYmplY3RzIG1hbmFnZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0jaW5jbHVkZSAiY2Zmb2Jqcy5oIgotI2luY2x1ZGUgImNmZmxvYWQuaCIKLSNpbmNsdWRlICJjZmZjbWFwLmgiCi0jaW5jbHVkZSAiY2ZmZXJycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2Zmb2JqcwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBOb3RlIHRoYXQgd2Ugc3RvcmUgdGhlIGdsb2JhbCBoaW50cyBpbiB0aGUgc2l6ZSdzIGBpbnRlcm5hbCcgcm9vdCAgICAqLwotICAvKiAgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIFBTSF9HbG9iYWxzX0Z1bmNzCi0gIGNmZl9zaXplX2dldF9nbG9iYWxzX2Z1bmNzKCBDRkZfU2l6ZSAgc2l6ZSApCi0gIHsKLSAgICBDRkZfRmFjZSAgICAgICAgICBmYWNlICAgICA9IChDRkZfRmFjZSlzaXplLT5yb290LmZhY2U7Ci0gICAgQ0ZGX0ZvbnQgICAgICAgICAgZm9udCAgICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBQU0hpbnRlcl9TZXJ2aWNlICBwc2hpbnRlciA9IChQU0hpbnRlcl9TZXJ2aWNlKWZvbnQtPnBzaGludGVyOwotICAgIEZUX01vZHVsZSAgICAgICAgIG1vZHVsZTsKLQotCi0gICAgbW9kdWxlID0gRlRfR2V0X01vZHVsZSggc2l6ZS0+cm9vdC5mYWNlLT5kcml2ZXItPnJvb3QubGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNoaW50ZXIiICk7Ci0gICAgcmV0dXJuICggbW9kdWxlICYmIHBzaGludGVyICYmIHBzaGludGVyLT5nZXRfZ2xvYmFsc19mdW5jcyApCi0gICAgICAgICAgID8gcHNoaW50ZXItPmdldF9nbG9iYWxzX2Z1bmNzKCBtb2R1bGUgKQotICAgICAgICAgICA6IDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmZl9zaXplX2RvbmUoIEZUX1NpemUgIGNmZnNpemUgKSAgICAgICAgLyogQ0ZGX1NpemUgKi8KLSAgewotICAgIENGRl9TaXplICAgICAgc2l6ZSAgICAgPSAoQ0ZGX1NpemUpY2Zmc2l6ZTsKLSAgICBDRkZfRmFjZSAgICAgIGZhY2UgICAgID0gKENGRl9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBDRkZfRm9udCAgICAgIGZvbnQgICAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgQ0ZGX0ludGVybmFsICBpbnRlcm5hbCA9IChDRkZfSW50ZXJuYWwpY2Zmc2l6ZS0+aW50ZXJuYWw7Ci0KLQotICAgIGlmICggaW50ZXJuYWwgKQotICAgIHsKLSAgICAgIFBTSF9HbG9iYWxzX0Z1bmNzICBmdW5jczsKLQotCi0gICAgICBmdW5jcyA9IGNmZl9zaXplX2dldF9nbG9iYWxzX2Z1bmNzKCBzaXplICk7Ci0gICAgICBpZiAoIGZ1bmNzICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICAgIGZ1bmNzLT5kZXN0cm95KCBpbnRlcm5hbC0+dG9wZm9udCApOwotCi0gICAgICAgIGZvciAoIGkgPSBmb250LT5udW1fc3ViZm9udHM7IGkgPiAwOyBpLS0gKQotICAgICAgICAgIGZ1bmNzLT5kZXN0cm95KCBpbnRlcm5hbC0+c3ViZm9udHNbaSAtIDFdICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGBpbnRlcm5hbCcgaXMgZnJlZWQgYnkgZGVzdHJveV9zaXplIChpbiBmdG9ianMuYykgKi8KLSAgICB9Ci0gIH0KLQotCi0gIC8qIENGRiBhbmQgVHlwZSAxIHByaXZhdGUgZGljdGlvbmFyaWVzIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50ICAgICAgKi8KLSAgLyogc3RydWN0dXJlczsgd2UgbmVlZCB0byBzeW50aGV0aXplIGEgVHlwZSAxIGRpY3Rpb25hcnkgb24gdGhlIGZseSAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGNmZl9tYWtlX3ByaXZhdGVfZGljdCggQ0ZGX1N1YkZvbnQgIHN1YmZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNfUHJpdmF0ZSAgIHByaXYgKQotICB7Ci0gICAgQ0ZGX1ByaXZhdGUgIGNwcml2ID0gJnN1YmZvbnQtPnByaXZhdGVfZGljdDsKLSAgICBGVF9VSW50ICAgICAgbiwgY291bnQ7Ci0KLQotICAgIEZUX01FTV9aRVJPKCBwcml2LCBzaXplb2YgKCAqcHJpdiApICk7Ci0KLSAgICBjb3VudCA9IHByaXYtPm51bV9ibHVlX3ZhbHVlcyA9IGNwcml2LT5udW1fYmx1ZV92YWx1ZXM7Ci0gICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHByaXYtPmJsdWVfdmFsdWVzW25dID0gKEZUX1Nob3J0KWNwcml2LT5ibHVlX3ZhbHVlc1tuXTsKLQotICAgIGNvdW50ID0gcHJpdi0+bnVtX290aGVyX2JsdWVzID0gY3ByaXYtPm51bV9vdGhlcl9ibHVlczsKLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgcHJpdi0+b3RoZXJfYmx1ZXNbbl0gPSAoRlRfU2hvcnQpY3ByaXYtPm90aGVyX2JsdWVzW25dOwotCi0gICAgY291bnQgPSBwcml2LT5udW1fZmFtaWx5X2JsdWVzID0gY3ByaXYtPm51bV9mYW1pbHlfYmx1ZXM7Ci0gICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHByaXYtPmZhbWlseV9ibHVlc1tuXSA9IChGVF9TaG9ydCljcHJpdi0+ZmFtaWx5X2JsdWVzW25dOwotCi0gICAgY291bnQgPSBwcml2LT5udW1fZmFtaWx5X290aGVyX2JsdWVzID0gY3ByaXYtPm51bV9mYW1pbHlfb3RoZXJfYmx1ZXM7Ci0gICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHByaXYtPmZhbWlseV9vdGhlcl9ibHVlc1tuXSA9IChGVF9TaG9ydCljcHJpdi0+ZmFtaWx5X290aGVyX2JsdWVzW25dOwotCi0gICAgcHJpdi0+Ymx1ZV9zY2FsZSA9IGNwcml2LT5ibHVlX3NjYWxlOwotICAgIHByaXYtPmJsdWVfc2hpZnQgPSAoRlRfSW50KWNwcml2LT5ibHVlX3NoaWZ0OwotICAgIHByaXYtPmJsdWVfZnV6eiAgPSAoRlRfSW50KWNwcml2LT5ibHVlX2Z1eno7Ci0KLSAgICBwcml2LT5zdGFuZGFyZF93aWR0aFswXSAgPSAoRlRfVVNob3J0KWNwcml2LT5zdGFuZGFyZF93aWR0aDsKLSAgICBwcml2LT5zdGFuZGFyZF9oZWlnaHRbMF0gPSAoRlRfVVNob3J0KWNwcml2LT5zdGFuZGFyZF9oZWlnaHQ7Ci0KLSAgICBjb3VudCA9IHByaXYtPm51bV9zbmFwX3dpZHRocyA9IGNwcml2LT5udW1fc25hcF93aWR0aHM7Ci0gICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHByaXYtPnNuYXBfd2lkdGhzW25dID0gKEZUX1Nob3J0KWNwcml2LT5zbmFwX3dpZHRoc1tuXTsKLQotICAgIGNvdW50ID0gcHJpdi0+bnVtX3NuYXBfaGVpZ2h0cyA9IGNwcml2LT5udW1fc25hcF9oZWlnaHRzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCi0gICAgICBwcml2LT5zbmFwX2hlaWdodHNbbl0gPSAoRlRfU2hvcnQpY3ByaXYtPnNuYXBfaGVpZ2h0c1tuXTsKLQotICAgIHByaXYtPmZvcmNlX2JvbGQgICAgID0gY3ByaXYtPmZvcmNlX2JvbGQ7Ci0gICAgcHJpdi0+bGFuZ3VhZ2VfZ3JvdXAgPSBjcHJpdi0+bGFuZ3VhZ2VfZ3JvdXA7Ci0gICAgcHJpdi0+bGVuSVYgICAgICAgICAgPSBjcHJpdi0+bGVuSVY7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfc2l6ZV9pbml0KCBGVF9TaXplICBjZmZzaXplICkgICAgICAgICAvKiBDRkZfU2l6ZSAqLwotICB7Ci0gICAgQ0ZGX1NpemUgICAgICAgICAgIHNpemUgID0gKENGRl9TaXplKWNmZnNpemU7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yID0gQ0ZGX0Vycl9PazsKLSAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3MgPSBjZmZfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggc2l6ZSApOwotCi0KLSAgICBpZiAoIGZ1bmNzICkKLSAgICB7Ci0gICAgICBDRkZfRmFjZSAgICAgIGZhY2UgICAgID0gKENGRl9GYWNlKWNmZnNpemUtPmZhY2U7Ci0gICAgICBDRkZfRm9udCAgICAgIGZvbnQgICAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsOwotCi0gICAgICBQU19Qcml2YXRlUmVjICBwcml2OwotICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ID0gY2Zmc2l6ZS0+ZmFjZS0+bWVtb3J5OwotCi0gICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgIGlmICggRlRfTkVXKCBpbnRlcm5hbCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjZmZfbWFrZV9wcml2YXRlX2RpY3QoICZmb250LT50b3BfZm9udCwgJnByaXYgKTsKLSAgICAgIGVycm9yID0gZnVuY3MtPmNyZWF0ZSggY2Zmc2l6ZS0+ZmFjZS0+bWVtb3J5LCAmcHJpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybmFsLT50b3Bmb250ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmb3IgKCBpID0gZm9udC0+bnVtX3N1YmZvbnRzOyBpID4gMDsgaS0tICkKLSAgICAgIHsKLSAgICAgICAgQ0ZGX1N1YkZvbnQgIHN1YiA9IGZvbnQtPnN1YmZvbnRzW2kgLSAxXTsKLQotCi0gICAgICAgIGNmZl9tYWtlX3ByaXZhdGVfZGljdCggc3ViLCAmcHJpdiApOwotICAgICAgICBlcnJvciA9IGZ1bmNzLT5jcmVhdGUoIGNmZnNpemUtPmZhY2UtPm1lbW9yeSwgJnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybmFsLT5zdWJmb250c1tpIC0gMV0gKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBjZmZzaXplLT5pbnRlcm5hbCA9IChGVF9TaXplX0ludGVybmFsKSh2b2lkKilpbnRlcm5hbDsKLSAgICB9Ci0KLSAgICBzaXplLT5zdHJpa2VfaW5kZXggPSAweEZGRkZGRkZGVUw7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9zaXplX3NlbGVjdCggRlRfU2l6ZSAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHN0cmlrZV9pbmRleCApCi0gIHsKLSAgICBDRkZfU2l6ZSAgICAgICAgICAgY2Zmc2l6ZSA9IChDRkZfU2l6ZSlzaXplOwotICAgIFBTSF9HbG9iYWxzX0Z1bmNzICBmdW5jczsKLQotCi0gICAgY2Zmc2l6ZS0+c3RyaWtlX2luZGV4ID0gc3RyaWtlX2luZGV4OwotCi0gICAgRlRfU2VsZWN0X01ldHJpY3MoIHNpemUtPmZhY2UsIHN0cmlrZV9pbmRleCApOwotCi0gICAgZnVuY3MgPSBjZmZfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggY2Zmc2l6ZSApOwotCi0gICAgaWYgKCBmdW5jcyApCi0gICAgewotICAgICAgQ0ZGX0ZhY2UgICAgICBmYWNlICAgICA9IChDRkZfRmFjZSlzaXplLT5mYWNlOwotICAgICAgQ0ZGX0ZvbnQgICAgICBmb250ICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgICAgQ0ZGX0ludGVybmFsICBpbnRlcm5hbCA9IChDRkZfSW50ZXJuYWwpc2l6ZS0+aW50ZXJuYWw7Ci0KLSAgICAgIEZUX0ludCAgIHRvcF91cG0gID0gZm9udC0+dG9wX2ZvbnQuZm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKLSAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgZnVuY3MtPnNldF9zY2FsZSggaW50ZXJuYWwtPnRvcGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplLT5tZXRyaWNzLnhfc2NhbGUsIHNpemUtPm1ldHJpY3MueV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAgKTsKLQotICAgICAgZm9yICggaSA9IGZvbnQtPm51bV9zdWJmb250czsgaSA+IDA7IGktLSApCi0gICAgICB7Ci0gICAgICAgIENGRl9TdWJGb250ICBzdWIgICAgID0gZm9udC0+c3ViZm9udHNbaSAtIDFdOwotICAgICAgICBGVF9JbnQgICAgICAgc3ViX3VwbSA9IHN1Yi0+Zm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKLSAgICAgICAgRlRfUG9zICAgICAgIHhfc2NhbGUsIHlfc2NhbGU7Ci0KLQotICAgICAgICBpZiAoIHRvcF91cG0gIT0gc3ViX3VwbSApCi0gICAgICAgIHsKLSAgICAgICAgICB4X3NjYWxlID0gRlRfTXVsRGl2KCBzaXplLT5tZXRyaWNzLnhfc2NhbGUsIHRvcF91cG0sIHN1Yl91cG0gKTsKLSAgICAgICAgICB5X3NjYWxlID0gRlRfTXVsRGl2KCBzaXplLT5tZXRyaWNzLnlfc2NhbGUsIHRvcF91cG0sIHN1Yl91cG0gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB4X3NjYWxlID0gc2l6ZS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgICAgIHlfc2NhbGUgPSBzaXplLT5tZXRyaWNzLnlfc2NhbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jcy0+c2V0X3NjYWxlKCBpbnRlcm5hbC0+c3ViZm9udHNbaSAtIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4X3NjYWxlLCB5X3NjYWxlLCAwLCAwICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIENGRl9FcnJfT2s7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9zaXplX3JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgQ0ZGX1NpemUgICAgICAgICAgIGNmZnNpemUgPSAoQ0ZGX1NpemUpc2l6ZTsKLSAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3M7Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0gICAgaWYgKCBGVF9IQVNfRklYRURfU0laRVMoIHNpemUtPmZhY2UgKSApCi0gICAgewotICAgICAgQ0ZGX0ZhY2UgICAgICBjZmZmYWNlID0gKENGRl9GYWNlKXNpemUtPmZhY2U7Ci0gICAgICBTRk5UX1NlcnZpY2UgIHNmbnQgICAgPSAoU0ZOVF9TZXJ2aWNlKWNmZmZhY2UtPnNmbnQ7Ci0gICAgICBGVF9VTG9uZyAgICAgIHN0cmlrZV9pbmRleDsKLQotCi0gICAgICBpZiAoIHNmbnQtPnNldF9zYml0X3N0cmlrZSggY2ZmZmFjZSwgcmVxLCAmc3RyaWtlX2luZGV4ICkgKQotICAgICAgICBjZmZzaXplLT5zdHJpa2VfaW5kZXggPSAweEZGRkZGRkZGVUw7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBjZmZfc2l6ZV9zZWxlY3QoIHNpemUsIHN0cmlrZV9pbmRleCApOwotICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAqLwotCi0gICAgRlRfUmVxdWVzdF9NZXRyaWNzKCBzaXplLT5mYWNlLCByZXEgKTsKLQotICAgIGZ1bmNzID0gY2ZmX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MoIGNmZnNpemUgKTsKLQotICAgIGlmICggZnVuY3MgKQotICAgIHsKLSAgICAgIENGRl9GYWNlICAgICAgY2ZmZmFjZSAgPSAoQ0ZGX0ZhY2Upc2l6ZS0+ZmFjZTsKLSAgICAgIENGRl9Gb250ICAgICAgZm9udCAgICAgPSAoQ0ZGX0ZvbnQpY2ZmZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICAgIENGRl9JbnRlcm5hbCAgaW50ZXJuYWwgPSAoQ0ZGX0ludGVybmFsKXNpemUtPmludGVybmFsOwotCi0gICAgICBGVF9JbnQgICB0b3BfdXBtICA9IGZvbnQtPnRvcF9mb250LmZvbnRfZGljdC51bml0c19wZXJfZW07Ci0gICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgIGZ1bmNzLT5zZXRfc2NhbGUoIGludGVybmFsLT50b3Bmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+bWV0cmljcy54X3NjYWxlLCBzaXplLT5tZXRyaWNzLnlfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAwICk7Ci0KLSAgICAgIGZvciAoIGkgPSBmb250LT5udW1fc3ViZm9udHM7IGkgPiAwOyBpLS0gKQotICAgICAgewotICAgICAgICBDRkZfU3ViRm9udCAgc3ViICAgICA9IGZvbnQtPnN1YmZvbnRzW2kgLSAxXTsKLSAgICAgICAgRlRfSW50ICAgICAgIHN1Yl91cG0gPSBzdWItPmZvbnRfZGljdC51bml0c19wZXJfZW07Ci0gICAgICAgIEZUX1BvcyAgICAgICB4X3NjYWxlLCB5X3NjYWxlOwotCi0KLSAgICAgICAgaWYgKCB0b3BfdXBtICE9IHN1Yl91cG0gKQotICAgICAgICB7Ci0gICAgICAgICAgeF9zY2FsZSA9IEZUX011bERpdiggc2l6ZS0+bWV0cmljcy54X3NjYWxlLCB0b3BfdXBtLCBzdWJfdXBtICk7Ci0gICAgICAgICAgeV9zY2FsZSA9IEZUX011bERpdiggc2l6ZS0+bWV0cmljcy55X3NjYWxlLCB0b3BfdXBtLCBzdWJfdXBtICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgeF9zY2FsZSA9IHNpemUtPm1ldHJpY3MueF9zY2FsZTsKLSAgICAgICAgICB5X3NjYWxlID0gc2l6ZS0+bWV0cmljcy55X3NjYWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgZnVuY3MtPnNldF9zY2FsZSggaW50ZXJuYWwtPnN1YmZvbnRzW2kgLSAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeF9zY2FsZSwgeV9zY2FsZSwgMCwgMCApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBDRkZfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMT1QgIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX3Nsb3RfZG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIHNsb3QtPmludGVybmFsLT5nbHlwaF9oaW50cyA9IDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfc2xvdF9pbml0KCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgQ0ZGX0ZhY2UgICAgICAgICAgZmFjZSAgICAgPSAoQ0ZGX0ZhY2Upc2xvdC0+ZmFjZTsKLSAgICBDRkZfRm9udCAgICAgICAgICBmb250ICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIFBTSGludGVyX1NlcnZpY2UgIHBzaGludGVyID0gKFBTSGludGVyX1NlcnZpY2UpZm9udC0+cHNoaW50ZXI7Ci0KLQotICAgIGlmICggcHNoaW50ZXIgKQotICAgIHsKLSAgICAgIEZUX01vZHVsZSAgbW9kdWxlOwotCi0KLSAgICAgIG1vZHVsZSA9IEZUX0dldF9Nb2R1bGUoIHNsb3QtPmZhY2UtPmRyaXZlci0+cm9vdC5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzaGludGVyIiApOwotICAgICAgaWYgKCBtb2R1bGUgKQotICAgICAgewotICAgICAgICBUMl9IaW50c19GdW5jcyAgZnVuY3M7Ci0KLQotICAgICAgICBmdW5jcyA9IHBzaGludGVyLT5nZXRfdDJfZnVuY3MoIG1vZHVsZSApOwotICAgICAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSAodm9pZCopZnVuY3M7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIENGRl9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgRlRfU3RyaW5nKgotICBjZmZfc3RyY3B5KCBGVF9NZW1vcnkgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHNvdXJjZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9TdHJpbmcqICByZXN1bHQ7Ci0KLQotICAgICh2b2lkKUZUX1NUUkRVUCggcmVzdWx0LCBzb3VyY2UgKTsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGNmZmZhY2UsICAgICAgICAvKiBDRkZfRmFjZSAqLwotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKQotICB7Ci0gICAgQ0ZGX0ZhY2UgICAgICAgICAgICBmYWNlID0gKENGRl9GYWNlKWNmZmZhY2U7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsKLSAgICBTRk5UX1NlcnZpY2UgICAgICAgIHNmbnQ7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzOwotICAgIFBTSGludGVyX1NlcnZpY2UgICAgcHNoaW50ZXI7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICBwdXJlX2NmZiAgICA9IDE7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICBzZm50X2Zvcm1hdCA9IDA7Ci0KLQotI2lmIDAKLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHNmbnQsICAgICBTRk5UICk7Ci0gICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwc25hbWVzLCAgUE9TVFNDUklQVF9OQU1FUyApOwotICAgIEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSggZmFjZSwgcHNoaW50ZXIsIFBPU1RTQ1JJUFRfSElOVEVSICk7Ci0KLSAgICBpZiAoICFzZm50ICkKLSAgICAgIGdvdG8gQmFkX0Zvcm1hdDsKLSNlbHNlCi0gICAgc2ZudCA9IChTRk5UX1NlcnZpY2UpRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoCi0gICAgICAgICAgICAgY2ZmZmFjZS0+ZHJpdmVyLT5yb290LmxpYnJhcnksICJzZm50IiApOwotICAgIGlmICggIXNmbnQgKQotICAgICAgZ290byBCYWRfRm9ybWF0OwotCi0gICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwc25hbWVzLCBQT1NUU0NSSVBUX0NNQVBTICk7Ci0KLSAgICBwc2hpbnRlciA9IChQU0hpbnRlcl9TZXJ2aWNlKUZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKAotICAgICAgICAgICAgICAgICBjZmZmYWNlLT5kcml2ZXItPnJvb3QubGlicmFyeSwgInBzaGludGVyIiApOwotI2VuZGlmCi0KLSAgICAvKiBjcmVhdGUgaW5wdXQgc3RyZWFtIGZyb20gcmVzb3VyY2UgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCAwICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgdmFsaWQgT3BlblR5cGUgZmlsZSAqLwotICAgIGVycm9yID0gc2ZudC0+aW5pdF9mYWNlKCBzdHJlYW0sIGZhY2UsIGZhY2VfaW5kZXgsIG51bV9wYXJhbXMsIHBhcmFtcyApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBpZiAoIGZhY2UtPmZvcm1hdF90YWcgIT0gMHg0RjU0NTQ0RkwgKSAgLyogYE9UVE8nOyBPcGVuVHlwZS9DRkYgZm9udCAqLwotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiW25vdCBhIHZhbGlkIE9wZW5UeXBlL0NGRiBmb250XVxuIiApKTsKLSAgICAgICAgZ290byBCYWRfRm9ybWF0OwotICAgICAgfQotCi0gICAgICAvKiBpZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHNpbXBsZSBmb250IGZvcm1hdCBjaGVjaywgZXhpdCBpbW1lZGlhdGVseSAqLwotICAgICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICAgIHJldHVybiBDRkZfRXJyX09rOwotCi0gICAgICAvKiBVTkRPQ1VNRU5URUQhICBBIENGRiBpbiBhbiBTRk5UIGNhbiBoYXZlIG9ubHkgYSBzaW5nbGUgZm9udC4gKi8KLSAgICAgIGlmICggZmFjZV9pbmRleCA+IDAgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfZmFjZV9pbml0OiBpbnZhbGlkIGZhY2UgaW5kZXhcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gQ0ZGX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHNmbnRfZm9ybWF0ID0gMTsKLQotICAgICAgLyogbm93LCB0aGUgZm9udCBjYW4gYmUgZWl0aGVyIGFuIE9wZW5UeXBlL0NGRiBmb250LCBvciBhbiBTVkcgQ0VGICovCi0gICAgICAvKiBmb250OyBpbiB0aGUgbGF0dGVyIGNhc2UgaXQgZG9lc24ndCBoYXZlIGEgYGhlYWQnIHRhYmxlICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19oZWFkLCBzdHJlYW0sIDAgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgcHVyZV9jZmYgPSAwOwotCi0gICAgICAgIC8qIGxvYWQgZm9udCBkaXJlY3RvcnkgKi8KLSAgICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX2ZhY2UoIHN0cmVhbSwgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsIG51bV9wYXJhbXMsIHBhcmFtcyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGxvYWQgdGhlIGBjbWFwJyB0YWJsZSBleHBsaWNpdGx5ICovCi0gICAgICAgIGVycm9yID0gc2ZudC0+bG9hZF9jbWFwKCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIC8qIFhYWDogd2UgZG9uJ3QgbG9hZCB0aGUgR1BPUyB0YWJsZSwgYXMgT3BlblR5cGUgTGF5b3V0ICAgICAqLwotICAgICAgICAvKiBzdXBwb3J0IHdpbGwgYmUgYWRkZWQgbGF0ZXIgdG8gYSBsYXlvdXQgbGlicmFyeSBvbiB0b3Agb2YgKi8KLSAgICAgICAgLyogRnJlZVR5cGUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBsb2FkIHRoZSBDRkYgcGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX0NGRiwgc3RyZWFtLCAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogcmV3aW5kIHRvIHN0YXJ0IG9mIGZpbGU7IHdlIGFyZSBnb2luZyB0byBsb2FkIGEgcHVyZS1DRkYgZm9udCAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMCApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgZXJyb3IgPSBDRkZfRXJyX09rOwotICAgIH0KLQotICAgIC8qIG5vdyBsb2FkIGFuZCBwYXJzZSB0aGUgQ0ZGIHRhYmxlIGluIHRoZSBmaWxlICovCi0gICAgewotICAgICAgQ0ZGX0ZvbnQgICAgICAgICBjZmY7Ci0gICAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3Q7Ci0gICAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGNmZmZhY2UtPm1lbW9yeTsKLSAgICAgIEZUX0ludDMyICAgICAgICAgZmxhZ3M7Ci0gICAgICBGVF9VSW50ICAgICAgICAgIGk7Ci0KLQotICAgICAgaWYgKCBGVF9ORVcoIGNmZiApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmYWNlLT5leHRyYS5kYXRhID0gY2ZmOwotICAgICAgZXJyb3IgPSBjZmZfZm9udF9sb2FkKCBzdHJlYW0sIGZhY2VfaW5kZXgsIGNmZiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgY2ZmLT5wc2hpbnRlciA9IHBzaGludGVyOwotICAgICAgY2ZmLT5wc25hbWVzICA9ICh2b2lkKilwc25hbWVzOwotCi0gICAgICAvKiBDb21wbGVtZW50IHRoZSByb290IGZsYWdzIHdpdGggc29tZSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbi4gKi8KLSAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBwdXJlIENGRiBhbmQgQ0VGIGZvbnRzOyAqLwotICAgICAgLyogU0ZOVCBiYXNlZCBmb250cyB1c2UgdGhlIGBuYW1lJyB0YWJsZSBpbnN0ZWFkLiAgICAgICAgICAgICAgICovCi0KLSAgICAgIGNmZmZhY2UtPm51bV9nbHlwaHMgPSBjZmYtPm51bV9nbHlwaHM7Ci0KLSAgICAgIGRpY3QgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7Ci0KLSAgICAgIC8qIHdlIG5lZWQgdGhlIGBQU05hbWVzJyBtb2R1bGUgZm9yIENGRiBhbmQgQ0VGIGZvcm1hdHMgKi8KLSAgICAgIC8qIHdoaWNoIGFyZW4ndCBDSUQta2V5ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgJiYgIXBzbmFtZXMgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfZmFjZV9pbml0OiIgKSk7Ci0gICAgICAgIEZUX0VSUk9SKCggIiBjYW5ub3Qgb3BlbiBDRkYgJiBDRUYgZm9udHNcbiIgKSk7Ci0gICAgICAgIEZUX0VSUk9SKCggIiAgICAgICAgICAgICAgIiApKTsKLSAgICAgICAgRlRfRVJST1IoKCAiIHdpdGhvdXQgdGhlIGBQU05hbWVzJyBtb2R1bGVcbiIgKSk7Ci0gICAgICAgIGdvdG8gQmFkX0Zvcm1hdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBwdXJlX2NmZiApCi0gICAgICB7Ci0gICAgICAgIGNoYXIqICBzdHlsZV9uYW1lID0gTlVMTDsKLQotCi0gICAgICAgIC8qIHNldCB1cCBudW1fZmFjZXMgKi8KLSAgICAgICAgY2ZmZmFjZS0+bnVtX2ZhY2VzID0gY2ZmLT5udW1fZmFjZXM7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBudW1iZXIgb2YgZ2x5cGhzICovCi0gICAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgICAgICAgIGNmZmZhY2UtPm51bV9nbHlwaHMgPSBjZmYtPmNoYXJzZXQubWF4X2NpZDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGNmZmZhY2UtPm51bV9nbHlwaHMgPSBjZmYtPmNoYXJzdHJpbmdzX2luZGV4LmNvdW50OwotCi0gICAgICAgIC8qIHNldCBnbG9iYWwgYmJveCwgYXMgd2VsbCBhcyBFTSBzaXplICovCi0gICAgICAgIGNmZmZhY2UtPmJib3gueE1pbiA9ICAgZGljdC0+Zm9udF9iYm94LnhNaW4gICAgICAgICAgICAgPj4gMTY7Ci0gICAgICAgIGNmZmZhY2UtPmJib3gueU1pbiA9ICAgZGljdC0+Zm9udF9iYm94LnlNaW4gICAgICAgICAgICAgPj4gMTY7Ci0gICAgICAgIGNmZmZhY2UtPmJib3gueE1heCA9ICggZGljdC0+Zm9udF9iYm94LnhNYXggKyAweEZGRkZVICkgPj4gMTY7Ci0gICAgICAgIGNmZmZhY2UtPmJib3gueU1heCA9ICggZGljdC0+Zm9udF9iYm94LnlNYXggKyAweEZGRkZVICkgPj4gMTY7Ci0KLSAgICAgICAgaWYgKCAhZGljdC0+dW5pdHNfcGVyX2VtICkKLSAgICAgICAgICBkaWN0LT51bml0c19wZXJfZW0gPSAxMDAwOwotCi0gICAgICAgIGNmZmZhY2UtPnVuaXRzX3Blcl9FTSA9IGRpY3QtPnVuaXRzX3Blcl9lbTsKLQotICAgICAgICBjZmZmYWNlLT5hc2NlbmRlciAgPSAoRlRfU2hvcnQpKCBjZmZmYWNlLT5iYm94LnlNYXggKTsKLSAgICAgICAgY2ZmZmFjZS0+ZGVzY2VuZGVyID0gKEZUX1Nob3J0KSggY2ZmZmFjZS0+YmJveC55TWluICk7Ci0KLSAgICAgICAgY2ZmZmFjZS0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggKCBjZmZmYWNlLT51bml0c19wZXJfRU0gKiAxMiApIC8gMTAgKTsKLSAgICAgICAgaWYgKCBjZmZmYWNlLT5oZWlnaHQgPCBjZmZmYWNlLT5hc2NlbmRlciAtIGNmZmZhY2UtPmRlc2NlbmRlciApCi0gICAgICAgICAgY2ZmZmFjZS0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggY2ZmZmFjZS0+YXNjZW5kZXIgLSBjZmZmYWNlLT5kZXNjZW5kZXIgKTsKLQotICAgICAgICBjZmZmYWNlLT51bmRlcmxpbmVfcG9zaXRpb24gID0KLSAgICAgICAgICAoRlRfU2hvcnQpKCBkaWN0LT51bmRlcmxpbmVfcG9zaXRpb24gPj4gMTYgKTsKLSAgICAgICAgY2ZmZmFjZS0+dW5kZXJsaW5lX3RoaWNrbmVzcyA9Ci0gICAgICAgICAgKEZUX1Nob3J0KSggZGljdC0+dW5kZXJsaW5lX3RoaWNrbmVzcyA+PiAxNiApOwotCi0gICAgICAgIC8qIHJldHJpZXZlIGZvbnQgZmFtaWx5ICYgc3R5bGUgbmFtZSAqLwotICAgICAgICBjZmZmYWNlLT5mYW1pbHlfbmFtZSA9IGNmZl9pbmRleF9nZXRfbmFtZSggJmNmZi0+bmFtZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXggKTsKLQotICAgICAgICBpZiAoIGNmZmZhY2UtPmZhbWlseV9uYW1lICkKLSAgICAgICAgewotICAgICAgICAgIGNoYXIqICBmdWxsICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoICZjZmYtPnN0cmluZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5mdWxsX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNuYW1lcyApOwotICAgICAgICAgIGNoYXIqICBmdWxscCAgPSBmdWxsOwotICAgICAgICAgIGNoYXIqICBmYW1pbHkgPSBjZmZmYWNlLT5mYW1pbHlfbmFtZTsKLSAgICAgICAgICBjaGFyKiAgZmFtaWx5X25hbWUgPSAwOwotCi0KLSAgICAgICAgICBpZiAoIGRpY3QtPmZhbWlseV9uYW1lICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYW1pbHlfbmFtZSA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggJmNmZi0+c3RyaW5nX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmZhbWlseV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbmFtZXMpOwotICAgICAgICAgICAgaWYgKCBmYW1pbHlfbmFtZSApCi0gICAgICAgICAgICAgIGZhbWlseSA9IGZhbWlseV9uYW1lOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIFdlIHRyeSB0byBleHRyYWN0IHRoZSBzdHlsZSBuYW1lIGZyb20gdGhlIGZ1bGwgbmFtZS4gICAqLwotICAgICAgICAgIC8qIFdlIG5lZWQgdG8gaWdub3JlIHNwYWNlcyBhbmQgZGFzaGVzIGR1cmluZyB0aGUgc2VhcmNoLiAqLwotICAgICAgICAgIGlmICggZnVsbCAmJiBmYW1pbHkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICggKmZ1bGxwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogc2tpcCBjb21tb24gY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQgb2YgYm90aCBzdHJpbmdzICovCi0gICAgICAgICAgICAgIGlmICggKmZ1bGxwID09ICpmYW1pbHkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFtaWx5Kys7Ci0gICAgICAgICAgICAgICAgZnVsbHArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8qIGlnbm9yZSBzcGFjZXMgYW5kIGRhc2hlcyBpbiBmdWxsIG5hbWUgZHVyaW5nIGNvbXBhcmlzb24gKi8KLSAgICAgICAgICAgICAgaWYgKCAqZnVsbHAgPT0gJyAnIHx8ICpmdWxscCA9PSAnLScgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnVsbHArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8qIGlnbm9yZSBzcGFjZXMgYW5kIGRhc2hlcyBpbiBmYW1pbHkgbmFtZSBkdXJpbmcgY29tcGFyaXNvbiAqLwotICAgICAgICAgICAgICBpZiAoICpmYW1pbHkgPT0gJyAnIHx8ICpmYW1pbHkgPT0gJy0nICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhbWlseSsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKCAhKmZhbWlseSAmJiAqZnVsbHAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhlIGZ1bGwgbmFtZSBiZWdpbnMgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJzIGFzIHRoZSAgKi8KLSAgICAgICAgICAgICAgICAvKiBmYW1pbHkgbmFtZSwgd2l0aCBzcGFjZXMgYW5kIGRhc2hlcyByZW1vdmVkLiAgSW4gdGhpcyAqLwotICAgICAgICAgICAgICAgIC8qIGNhc2UsIHRoZSByZW1haW5pbmcgc3RyaW5nIGluIGBmdWxscCcgd2lsbCBiZSB1c2VkIGFzICovCi0gICAgICAgICAgICAgICAgLyogdGhlIHN0eWxlIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBzdHlsZV9uYW1lID0gY2ZmX3N0cmNweSggbWVtb3J5LCBmdWxscCApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGZhbWlseV9uYW1lICkKLSAgICAgICAgICAgICAgRlRfRlJFRSggZmFtaWx5X25hbWUgKTsKLSAgICAgICAgICAgIEZUX0ZSRUUoIGZ1bGwgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciAgKmNpZF9mb250X25hbWUgPQotICAgICAgICAgICAgICAgICAgIGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggJmNmZi0+c3RyaW5nX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+Y2lkX2ZvbnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbmFtZXMgKTsKLQotCi0gICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIGAvRm9udE5hbWUnIGZvciBhIENJRC1rZXllZCBmb250PyAqLwotICAgICAgICAgIGlmICggY2lkX2ZvbnRfbmFtZSApCi0gICAgICAgICAgICBjZmZmYWNlLT5mYW1pbHlfbmFtZSA9IGNpZF9mb250X25hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHN0eWxlX25hbWUgKQotICAgICAgICAgIGNmZmZhY2UtPnN0eWxlX25hbWUgPSBzdHlsZV9uYW1lOwotICAgICAgICBlbHNlCi0gICAgICAgICAgLyogYXNzdW1lICJSZWd1bGFyIiBzdHlsZSBpZiB3ZSBkb24ndCBrbm93IGJldHRlciAqLwotICAgICAgICAgIGNmZmZhY2UtPnN0eWxlX25hbWUgPSBjZmZfc3RyY3B5KCBtZW1vcnksIChjaGFyICopIlJlZ3VsYXIiICk7Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBDb21wdXRlIGZhY2UgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGZsYWdzID0gRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgfCAgICAgICAvKiBzY2FsYWJsZSBvdXRsaW5lcyAqLwotICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMIHwgICAgICAgLyogaG9yaXpvbnRhbCBkYXRhICAgKi8KLSAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfSElOVEVSOyAgICAgICAgICAgIC8qIGhhcyBuYXRpdmUgaGludGVyICovCi0KLSAgICAgICAgaWYgKCBzZm50X2Zvcm1hdCApCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1NGTlQ7Ci0KLSAgICAgICAgLyogZml4ZWQgd2lkdGggZm9udD8gKi8KLSAgICAgICAgaWYgKCBkaWN0LT5pc19maXhlZF9waXRjaCApCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIOwotCi0gIC8qIFhYWDogV0UgRE8gTk9UIFNVUFBPUlQgS0VSTklORyBNRVRSSUNTIElOIFRIRSBHUE9TIFRBQkxFIEZPUiBOT1cgKi8KLSNpZiAwCi0gICAgICAgIC8qIGtlcm5pbmcgYXZhaWxhYmxlPyAqLwotICAgICAgICBpZiAoIGZhY2UtPmtlcm5fcGFpcnMgKQotICAgICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19LRVJOSU5HOwotI2VuZGlmCi0KLSAgICAgICAgY2ZmZmFjZS0+ZmFjZV9mbGFncyA9IGZsYWdzOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogQ29tcHV0ZSBzdHlsZSBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBmbGFncyA9IDA7Ci0KLSAgICAgICAgaWYgKCBkaWN0LT5pdGFsaWNfYW5nbGUgKQotICAgICAgICAgIGZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfSVRBTElDOwotCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICAqd2VpZ2h0ID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCAmY2ZmLT5zdHJpbmdfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+d2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzbmFtZXMgKTsKLQotCi0gICAgICAgICAgaWYgKCB3ZWlnaHQgKQotICAgICAgICAgICAgaWYgKCAhZnRfc3RyY21wKCB3ZWlnaHQsICJCb2xkIiAgKSB8fAotICAgICAgICAgICAgICAgICAhZnRfc3RyY21wKCB3ZWlnaHQsICJCbGFjayIgKSApCi0gICAgICAgICAgICAgIGZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfQk9MRDsKLSAgICAgICAgICBGVF9GUkVFKCB3ZWlnaHQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGRvdWJsZSBjaGVjayAqLwotICAgICAgICBpZiAoICEoZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0JPTEQpICYmIGNmZmZhY2UtPnN0eWxlX25hbWUgKQotICAgICAgICAgIGlmICggIWZ0X3N0cm5jbXAoIGNmZmZhY2UtPnN0eWxlX25hbWUsICJCb2xkIiwgNCApICB8fAotICAgICAgICAgICAgICAgIWZ0X3N0cm5jbXAoIGNmZmZhY2UtPnN0eWxlX25hbWUsICJCbGFjayIsIDUgKSApCi0gICAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7Ci0KLSAgICAgICAgY2ZmZmFjZS0+c3R5bGVfZmxhZ3MgPSBmbGFnczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCAhZGljdC0+dW5pdHNfcGVyX2VtICkKLSAgICAgICAgICBkaWN0LT51bml0c19wZXJfZW0gPSBmYWNlLT5yb290LnVuaXRzX3Blcl9FTTsKLSAgICAgIH0KLQotICAgICAgLyogTm9ybWFsaXplIHRoZSBmb250IG1hdHJpeCBzbyB0aGF0IGBtYXRyaXgtPnh4JyBpcyAxOyB0aGUgKi8KLSAgICAgIC8qIHNjYWxpbmcgaXMgZG9uZSB3aXRoIGB1bml0c19wZXJfZW0nIHRoZW4gKGF0IHRoaXMgcG9pbnQsICovCi0gICAgICAvKiBpdCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBzY2FsaW5nIGZhY3RvciwgYnV0IHdpdGhvdXQgICAgICAqLwotICAgICAgLyogbm9ybWFsaXphdGlvbiBvZiB0aGUgbWF0cml4KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBOb3RlIHRoYXQgdGhlIG9mZnNldHMgbXVzdCBiZSBleHByZXNzZWQgaW4gaW50ZWdlciBmb250ICAqLwotICAgICAgLyogdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgewotICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXggPSAmZGljdC0+Zm9udF9tYXRyaXg7Ci0gICAgICAgIEZUX1ZlY3RvciogIG9mZnNldCA9ICZkaWN0LT5mb250X29mZnNldDsKLSAgICAgICAgRlRfVUxvbmcqICAgdXBtICAgID0gJmRpY3QtPnVuaXRzX3Blcl9lbTsKLSAgICAgICAgRlRfRml4ZWQgICAgdGVtcCAgID0gRlRfQUJTKCBtYXRyaXgtPnl5ICk7Ci0KLQotICAgICAgICBpZiAoIHRlbXAgIT0gMHgxMDAwMEwgKQotICAgICAgICB7Ci0gICAgICAgICAgKnVwbSA9IEZUX0RpdkZpeCggKnVwbSwgdGVtcCApOwotCi0gICAgICAgICAgbWF0cml4LT54eCA9IEZUX0RpdkZpeCggbWF0cml4LT54eCwgdGVtcCApOwotICAgICAgICAgIG1hdHJpeC0+eXggPSBGVF9EaXZGaXgoIG1hdHJpeC0+eXgsIHRlbXAgKTsKLSAgICAgICAgICBtYXRyaXgtPnh5ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnh5LCB0ZW1wICk7Ci0gICAgICAgICAgbWF0cml4LT55eSA9IEZUX0RpdkZpeCggbWF0cml4LT55eSwgdGVtcCApOwotICAgICAgICAgIG9mZnNldC0+eCAgPSBGVF9EaXZGaXgoIG9mZnNldC0+eCwgIHRlbXAgKTsKLSAgICAgICAgICBvZmZzZXQtPnkgID0gRlRfRGl2Rml4KCBvZmZzZXQtPnksICB0ZW1wICk7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQtPnggPj49IDE2OwotICAgICAgICBvZmZzZXQtPnkgPj49IDE2OwotICAgICAgfQotCi0gICAgICBmb3IgKCBpID0gY2ZmLT5udW1fc3ViZm9udHM7IGkgPiAwOyBpLS0gKQotICAgICAgewotICAgICAgICBDRkZfRm9udFJlY0RpY3QgIHN1YiA9ICZjZmYtPnN1YmZvbnRzW2kgLSAxXS0+Zm9udF9kaWN0OwotICAgICAgICBDRkZfRm9udFJlY0RpY3QgIHRvcCA9ICZjZmYtPnRvcF9mb250LmZvbnRfZGljdDsKLQotICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXg7Ci0gICAgICAgIEZUX1ZlY3RvciogIG9mZnNldDsKLSAgICAgICAgRlRfVUxvbmcqICAgdXBtOwotICAgICAgICBGVF9GaXhlZCAgICB0ZW1wOwotCi0KLSAgICAgICAgaWYgKCBzdWItPnVuaXRzX3Blcl9lbSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIHNjYWxpbmc7Ci0KLQotICAgICAgICAgIGlmICggdG9wLT51bml0c19wZXJfZW0gPiAxICYmIHN1Yi0+dW5pdHNfcGVyX2VtID4gMSApCi0gICAgICAgICAgICBzY2FsaW5nID0gRlRfTUlOKCB0b3AtPnVuaXRzX3Blcl9lbSwgc3ViLT51bml0c19wZXJfZW0gKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBzY2FsaW5nID0gMTsKLQotICAgICAgICAgIEZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQoICZ0b3AtPmZvbnRfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWItPmZvbnRfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcgKTsKLSAgICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtX1NjYWxlZCggJnN1Yi0+Zm9udF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AtPmZvbnRfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nICk7Ci0KLSAgICAgICAgICBzdWItPnVuaXRzX3Blcl9lbSA9IEZUX011bERpdiggc3ViLT51bml0c19wZXJfZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcC0+dW5pdHNfcGVyX2VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3ViLT5mb250X21hdHJpeCA9IHRvcC0+Zm9udF9tYXRyaXg7Ci0gICAgICAgICAgc3ViLT5mb250X29mZnNldCA9IHRvcC0+Zm9udF9vZmZzZXQ7Ci0KLSAgICAgICAgICBzdWItPnVuaXRzX3Blcl9lbSA9IHRvcC0+dW5pdHNfcGVyX2VtOwotICAgICAgICB9Ci0KLSAgICAgICAgbWF0cml4ID0gJnN1Yi0+Zm9udF9tYXRyaXg7Ci0gICAgICAgIG9mZnNldCA9ICZzdWItPmZvbnRfb2Zmc2V0OwotICAgICAgICB1cG0gICAgPSAmc3ViLT51bml0c19wZXJfZW07Ci0gICAgICAgIHRlbXAgICA9IEZUX0FCUyggbWF0cml4LT55eSApOwotCi0gICAgICAgIGlmICggdGVtcCAhPSAweDEwMDAwTCApCi0gICAgICAgIHsKLSAgICAgICAgICAqdXBtID0gRlRfRGl2Rml4KCAqdXBtLCB0ZW1wICk7Ci0KLSAgICAgICAgICAvKiBpZiAqdXBtIGlzIGxhcmdlciB0aGFuIDEwMCoxMDAwIHdlIGRpdmlkZSBieSAxMDAwIC0tICAgICAqLwotICAgICAgICAgIC8qIHRoaXMgY2FuIGhhcHBlbiBpZiBlLmcuIHRoZXJlIGlzIG5vIHRvcC1mb250IEZvbnRNYXRyaXggICovCi0gICAgICAgICAgLyogYW5kIHRoZSBzdWJmb250IEZvbnRNYXRyaXggYWxyZWFkeSBjb250YWlucyB0aGUgY29tcGxldGUgKi8KLSAgICAgICAgICAvKiBzY2FsaW5nIGZvciB0aGUgc3ViZm9udCAoc2VlIHNlY3Rpb24gNS4xMSBvZiB0aGUgUExSTSkgICAqLwotCi0gICAgICAgICAgLyogMTAwIGlzIGEgaGV1cmlzdGljIHZhbHVlICovCi0KLSAgICAgICAgICBpZiAoICp1cG0gPiAxMDBMICogMTAwMEwgKQotICAgICAgICAgICAgKnVwbSA9ICggKnVwbSArIDUwMCApIC8gMTAwMDsKLQotICAgICAgICAgIG1hdHJpeC0+eHggPSBGVF9EaXZGaXgoIG1hdHJpeC0+eHgsIHRlbXAgKTsKLSAgICAgICAgICBtYXRyaXgtPnl4ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCB0ZW1wICk7Ci0gICAgICAgICAgbWF0cml4LT54eSA9IEZUX0RpdkZpeCggbWF0cml4LT54eSwgdGVtcCApOwotICAgICAgICAgIG1hdHJpeC0+eXkgPSBGVF9EaXZGaXgoIG1hdHJpeC0+eXksIHRlbXAgKTsKLSAgICAgICAgICBvZmZzZXQtPnggID0gRlRfRGl2Rml4KCBvZmZzZXQtPngsICB0ZW1wICk7Ci0gICAgICAgICAgb2Zmc2V0LT55ICA9IEZUX0RpdkZpeCggb2Zmc2V0LT55LCAgdGVtcCApOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0LT54ID4+PSAxNjsKLSAgICAgICAgb2Zmc2V0LT55ID4+PSAxNjsKLSAgICAgIH0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0dMWVBIX05BTUVTCi0gICAgICAvKiBDSUQta2V5ZWQgQ0ZGIGZvbnRzIGRvbid0IGhhdmUgZ2x5cGggbmFtZXMgLS0gdGhlIFNGTlQgbG9hZGVyICovCi0gICAgICAvKiBoYXMgdW5zZXQgdGhpcyBmbGFnIGJlY2F1c2Ugb2YgdGhlIDMuMCBgcG9zdCcgdGFibGUuICAgICAgICAgICovCi0gICAgICBpZiAoIGRpY3QtPmNpZF9yZWdpc3RyeSA9PSAweEZGRkZVICkKLSAgICAgICAgY2ZmZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVM7Ci0jZW5kaWYKLQotICAgICAgaWYgKCBkaWN0LT5jaWRfcmVnaXN0cnkgIT0gMHhGRkZGVSApCi0gICAgICAgIGNmZmZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0NJRF9LRVlFRDsKLQotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogQ29tcHV0ZSBjaGFyIG1hcHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgLyogVHJ5IHRvIHN5bnRoZXRpemUgYSBVbmljb2RlIGNoYXJtYXAgaWYgdGhlcmUgaXMgbm9uZSBhdmFpbGFibGUgKi8KLSAgICAgIC8qIGFscmVhZHkuICBJZiBhbiBPcGVuVHlwZSBmb250IGNvbnRhaW5zIGEgVW5pY29kZSAiY21hcCIsIHdlICAgICovCi0gICAgICAvKiB3aWxsIHVzZSBpdCwgd2hhdGV2ZXIgYmUgaW4gdGhlIENGRiBwYXJ0IG9mIHRoZSBmaWxlLiAgICAgICAgICAqLwotICAgICAgewotICAgICAgICBGVF9DaGFyTWFwUmVjICBjbWFwcmVjOwotICAgICAgICBGVF9DaGFyTWFwICAgICBjbWFwOwotICAgICAgICBGVF9VSW50ICAgICAgICBubjsKLSAgICAgICAgQ0ZGX0VuY29kaW5nICAgZW5jb2RpbmcgPSAmY2ZmLT5lbmNvZGluZzsKLQotCi0gICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCAoRlRfVUludCljZmZmYWNlLT5udW1fY2hhcm1hcHM7IG5uKysgKQotICAgICAgICB7Ci0gICAgICAgICAgY21hcCA9IGNmZmZhY2UtPmNoYXJtYXBzW25uXTsKLQotICAgICAgICAgIC8qIFdpbmRvd3MgVW5pY29kZSAoMywxKT8gKi8KLSAgICAgICAgICBpZiAoIGNtYXAtPnBsYXRmb3JtX2lkID09IDMgJiYgY21hcC0+ZW5jb2RpbmdfaWQgPT0gMSApCi0gICAgICAgICAgICBnb3RvIFNraXBfVW5pY29kZTsKLQotICAgICAgICAgIC8qIERlcHJlY2F0ZWQgVW5pY29kZSBwbGF0Zm9ybSBpZD8gKi8KLSAgICAgICAgICBpZiAoIGNtYXAtPnBsYXRmb3JtX2lkID09IDAgKQotICAgICAgICAgICAgZ290byBTa2lwX1VuaWNvZGU7IC8qIFN0YW5kYXJkIFVuaWNvZGUgKGRlcHJlY2F0ZWQpICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBzaW5jZSBDSUQta2V5ZWQgZm9udHMgZG9uJ3QgY29udGFpbiBnbHlwaCBuYW1lcywgd2UgY2FuJ3QgKi8KLSAgICAgICAgLyogY29uc3RydWN0IGEgY21hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggcHVyZV9jZmYgJiYgY2ZmLT50b3BfZm9udC5mb250X2RpY3QuY2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiB3ZSBkaWRuJ3QgZmluZCBhIFVuaWNvZGUgY2hhcm1hcCAtLSBzeW50aGVzaXplIG9uZSAqLwotICAgICAgICBjbWFwcmVjLmZhY2UgICAgICAgID0gY2ZmZmFjZTsKLSAgICAgICAgY21hcHJlYy5wbGF0Zm9ybV9pZCA9IDM7Ci0gICAgICAgIGNtYXByZWMuZW5jb2RpbmdfaWQgPSAxOwotICAgICAgICBjbWFwcmVjLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfVU5JQ09ERTsKLQotICAgICAgICBubiA9IChGVF9VSW50KWNmZmZhY2UtPm51bV9jaGFybWFwczsKLQotICAgICAgICBGVF9DTWFwX05ldyggJmNmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjLCBOVUxMLCAmY21hcHJlYywgTlVMTCApOwotCi0gICAgICAgIC8qIGlmIG5vIFVuaWNvZGUgY2hhcm1hcCB3YXMgcHJldmlvdXNseSBzZWxlY3RlZCwgc2VsZWN0IHRoaXMgb25lICovCi0gICAgICAgIGlmICggY2ZmZmFjZS0+Y2hhcm1hcCA9PSBOVUxMICYmIG5uICE9IChGVF9VSW50KWNmZmZhY2UtPm51bV9jaGFybWFwcyApCi0gICAgICAgICAgY2ZmZmFjZS0+Y2hhcm1hcCA9IGNmZmZhY2UtPmNoYXJtYXBzW25uXTsKLQotICAgICAgU2tpcF9Vbmljb2RlOgotICAgICAgICBpZiAoIGVuY29kaW5nLT5jb3VudCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQ01hcF9DbGFzcyAgY2xheno7Ci0KLQotICAgICAgICAgIGNtYXByZWMuZmFjZSAgICAgICAgPSBjZmZmYWNlOwotICAgICAgICAgIGNtYXByZWMucGxhdGZvcm1faWQgPSA3OyAgLyogQWRvYmUgcGxhdGZvcm0gaWQgKi8KLQotICAgICAgICAgIGlmICggZW5jb2RpbmctPm9mZnNldCA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nX2lkID0gVFRfQURPQkVfSURfU1RBTkRBUkQ7Ci0gICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQ7Ci0gICAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gJmNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIGVuY29kaW5nLT5vZmZzZXQgPT0gMSApCi0gICAgICAgICAgewotICAgICAgICAgICAgY21hcHJlYy5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX0VYUEVSVDsKLSAgICAgICAgICAgIGNtYXByZWMuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQ7Ci0gICAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gJmNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNtYXByZWMuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9DVVNUT007Ci0gICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NOwotICAgICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9ICZjZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgRlRfQ01hcF9OZXcoIGNsYXp6LCBOVUxMLCAmY21hcHJlYywgTlVMTCApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEJhZF9Gb3JtYXQ6Ci0gICAgZXJyb3IgPSBDRkZfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQ7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZmFjZV9kb25lKCBGVF9GYWNlICBjZmZmYWNlICkgICAgICAgICAvKiBDRkZfRmFjZSAqLwotICB7Ci0gICAgQ0ZGX0ZhY2UgICAgICBmYWNlICAgPSAoQ0ZGX0ZhY2UpY2ZmZmFjZTsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IGNmZmZhY2UtPm1lbW9yeTsKLSAgICBTRk5UX1NlcnZpY2UgIHNmbnQgICA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotCi0gICAgaWYgKCBzZm50ICkKLSAgICAgIHNmbnQtPmRvbmVfZmFjZSggZmFjZSApOwotCi0gICAgewotICAgICAgQ0ZGX0ZvbnQgIGNmZiA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0KLSAgICAgIGlmICggY2ZmICkKLSAgICAgIHsKLSAgICAgICAgY2ZmX2ZvbnRfZG9uZSggY2ZmICk7Ci0gICAgICAgIEZUX0ZSRUUoIGZhY2UtPmV4dHJhLmRhdGEgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0KLSAgICByZXR1cm4gQ0ZGX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX2RyaXZlcl9kb25lKCBGVF9Nb2R1bGUgIG1vZHVsZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1vZHVsZSApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZm9ianMuaCBiL3NyYy9jZmYvY2Zmb2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzgxY2VlLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2Zmb2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZm9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBvYmplY3RzIG1hbmFnZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGRk9CSlNfSF9fCi0jZGVmaW5lIF9fQ0ZGT0JKU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgImNmZnR5cGVzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDRkZfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBPcGVuVHlwZSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IENGRl9Ecml2ZXJSZWNfKiAgQ0ZGX0RyaXZlcjsKLQotICB0eXBlZGVmIFRUX0ZhY2UgIENGRl9GYWNlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0ZGX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gT3BlblR5cGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX1NpemVSZWNfCi0gIHsKLSAgICBGVF9TaXplUmVjICByb290OwotICAgIEZUX1VMb25nICAgIHN0cmlrZV9pbmRleDsgICAgLyogMHhGRkZGRkZGRiB0byBpbmRpY2F0ZSBpbnZhbGlkICovCi0KLSAgfSBDRkZfU2l6ZVJlYywgKkNGRl9TaXplOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0ZGX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gT3BlblR5cGUgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0dseXBoU2xvdFJlY18KLSAgewotICAgIEZUX0dseXBoU2xvdFJlYyAgcm9vdDsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgaGludDsKLSAgICBGVF9Cb29sICAgICAgICAgIHNjYWxlZDsKLQotICAgIEZUX0ZpeGVkICAgICAgICAgeF9zY2FsZTsKLSAgICBGVF9GaXhlZCAgICAgICAgIHlfc2NhbGU7Ci0KLSAgfSBDRkZfR2x5cGhTbG90UmVjLCAqQ0ZGX0dseXBoU2xvdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENGRl9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBpbnRlcmZhY2UgdG8gdGhlIGBpbnRlcm5hbCcgZmllbGQgb2YgYEZUX1NpemUnLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9JbnRlcm5hbFJlY18KLSAgewotICAgIFBTSF9HbG9iYWxzICB0b3Bmb250OwotICAgIFBTSF9HbG9iYWxzICBzdWJmb250c1tDRkZfTUFYX0NJRF9GT05UU107Ci0KLSAgfSBDRkZfSW50ZXJuYWxSZWMsICpDRkZfSW50ZXJuYWw7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN1YmdseXBoIHRyYW5zZm9ybWF0aW9uIHJlY29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9UcmFuc2Zvcm1fCi0gIHsKLSAgICBGVF9GaXhlZCAgICB4eCwgeHk7ICAgICAvKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggY29lZmZpY2llbnRzICovCi0gICAgRlRfRml4ZWQgICAgeXgsIHl5OwotICAgIEZUX0YyNkRvdDYgIG94LCBveTsgICAgIC8qIG9mZnNldHMgICAgICAgICovCi0KLSAgfSBDRkZfVHJhbnNmb3JtOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRydWVUeXBlIGRyaXZlciBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0RyaXZlclJlY18KLSAgewotICAgIEZUX0RyaXZlclJlYyAgcm9vdDsKLSAgICB2b2lkKiAgICAgICAgIGV4dGVuc2lvbl9jb21wb25lbnQ7Ci0KLSAgfSBDRkZfRHJpdmVyUmVjOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfaW5pdCggRlRfU2l6ZSAgc2l6ZSApOyAgICAgICAgICAgLyogQ0ZGX1NpemUgKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9zaXplX2RvbmUoIEZUX1NpemUgIHNpemUgKTsgICAgICAgICAgIC8qIENGRl9TaXplICovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfcmVxdWVzdCggRlRfU2l6ZSAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfc2VsZWN0KCBGVF9TaXplICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICk7Ci0KLSNlbmRpZgotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX3Nsb3RfZG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3Nsb3RfaW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2ZhY2VfaW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLCAgICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfZmFjZV9kb25lKCBGVF9GYWNlICBmYWNlICk7ICAgICAgICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRHJpdmVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19DRkZPQkpTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZwYXJzZS5jIGIvc3JjL2NmZi9jZmZwYXJzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQ3N2RkLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmcGFyc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDg0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZwYXJzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIHRva2VuIHN0cmVhbSBwYXJzZXIgKGJvZHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImNmZnBhcnNlLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAiY2ZmZXJycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2ZmcGFyc2UKLQotCi0gIGVudW0KLSAgewotICAgIGNmZl9raW5kX25vbmUgPSAwLAotICAgIGNmZl9raW5kX251bSwKLSAgICBjZmZfa2luZF9maXhlZCwKLSAgICBjZmZfa2luZF9maXhlZF90aG91c2FuZCwKLSAgICBjZmZfa2luZF9zdHJpbmcsCi0gICAgY2ZmX2tpbmRfYm9vbCwKLSAgICBjZmZfa2luZF9kZWx0YSwKLSAgICBjZmZfa2luZF9jYWxsYmFjaywKLQotICAgIGNmZl9raW5kX21heCAgLyogZG8gbm90IHJlbW92ZSAqLwotICB9OwotCi0KLSAgLyogbm93IGdlbmVyYXRlIGhhbmRsZXJzIGZvciB0aGUgbW9zdCBzaW1wbGUgZmllbGRzICovCi0gIHR5cGVkZWYgRlRfRXJyb3IgICgqQ0ZGX0ZpZWxkX1JlYWRlcikoIENGRl9QYXJzZXIgIHBhcnNlciApOwotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRmllbGRfSGFuZGxlcl8KLSAgewotICAgIGludCAgICAgICAgICAgICAgIGtpbmQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgY29kZTsKLSAgICBGVF9VSW50ICAgICAgICAgICBvZmZzZXQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgICAgc2l6ZTsKLSAgICBDRkZfRmllbGRfUmVhZGVyICByZWFkZXI7Ci0gICAgRlRfVUludCAgICAgICAgICAgYXJyYXlfbWF4OwotICAgIEZUX1VJbnQgICAgICAgICAgIGNvdW50X29mZnNldDsKLQotICB9IENGRl9GaWVsZF9IYW5kbGVyOwotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX3BhcnNlcl9pbml0KCBDRkZfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgY29kZSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBvYmplY3QgKQotICB7Ci0gICAgRlRfTUVNX1pFUk8oIHBhcnNlciwgc2l6ZW9mICggKnBhcnNlciApICk7Ci0KLSAgICBwYXJzZXItPnRvcCAgICAgICAgID0gcGFyc2VyLT5zdGFjazsKLSAgICBwYXJzZXItPm9iamVjdF9jb2RlID0gY29kZTsKLSAgICBwYXJzZXItPm9iamVjdCAgICAgID0gb2JqZWN0OwotICB9Ci0KLQotICAvKiByZWFkIGFuIGludGVnZXIgKi8KLSAgc3RhdGljIEZUX0xvbmcKLSAgY2ZmX3BhcnNlX2ludGVnZXIoIEZUX0J5dGUqICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCAgID0gc3RhcnQ7Ci0gICAgRlRfSW50ICAgIHYgICA9ICpwKys7Ci0gICAgRlRfTG9uZyAgIHZhbCA9IDA7Ci0KLQotICAgIGlmICggdiA9PSAyOCApCi0gICAgewotICAgICAgaWYgKCBwICsgMiA+IGxpbWl0ICkKLSAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgIHZhbCA9IChGVF9TaG9ydCkoICggKEZUX0ludClwWzBdIDw8IDggKSB8IHBbMV0gKTsKLSAgICAgIHAgICs9IDI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2ID09IDI5ICkKLSAgICB7Ci0gICAgICBpZiAoIHAgKyA0ID4gbGltaXQgKQotICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgdmFsID0gKCAoRlRfTG9uZylwWzBdIDw8IDI0ICkgfAotICAgICAgICAgICAgKCAoRlRfTG9uZylwWzFdIDw8IDE2ICkgfAotICAgICAgICAgICAgKCAoRlRfTG9uZylwWzJdIDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgICAgICBwWzNdOwotICAgICAgcCArPSA0OwotICAgIH0KLSAgICBlbHNlIGlmICggdiA8IDI0NyApCi0gICAgewotICAgICAgdmFsID0gdiAtIDEzOTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHYgPCAyNTEgKQotICAgIHsKLSAgICAgIGlmICggcCArIDEgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gQmFkOwotCi0gICAgICB2YWwgPSAoIHYgLSAyNDcgKSAqIDI1NiArIHBbMF0gKyAxMDg7Ci0gICAgICBwKys7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIHAgKyAxID4gbGltaXQgKQotICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgdmFsID0gLSggdiAtIDI1MSApICogMjU2IC0gcFswXSAtIDEwODsKLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gdmFsOwotCi0gIEJhZDoKLSAgICB2YWwgPSAwOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IEZUX0xvbmcgcG93ZXJfdGVuc1tdID0KLSAgewotICAgIDFMLAotICAgIDEwTCwKLSAgICAxMDBMLAotICAgIDEwMDBMLAotICAgIDEwMDAwTCwKLSAgICAxMDAwMDBMLAotICAgIDEwMDAwMDBMLAotICAgIDEwMDAwMDAwTCwKLSAgICAxMDAwMDAwMDBMLAotICAgIDEwMDAwMDAwMDBMCi0gIH07Ci0KLQotICAvKiByZWFkIGEgcmVhbCAqLwotICBzdGF0aWMgRlRfRml4ZWQKLSAgY2ZmX3BhcnNlX3JlYWwoIEZUX0J5dGUqICBzdGFydCwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICBwb3dlcl90ZW4sCi0gICAgICAgICAgICAgICAgICBGVF9JbnQqICAgc2NhbGluZyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IHN0YXJ0OwotICAgIEZUX1VJbnQgICBuaWI7Ci0gICAgRlRfVUludCAgIHBoYXNlOwotCi0gICAgRlRfTG9uZyAgIHJlc3VsdCwgbnVtYmVyLCByZXN0LCBleHBvbmVudDsKLSAgICBGVF9JbnQgICAgc2lnbiA9IDAsIGV4cG9uZW50X3NpZ24gPSAwOwotICAgIEZUX0ludCAgICBleHBvbmVudF9hZGQsIGludGVnZXJfbGVuZ3RoLCBmcmFjdGlvbl9sZW5ndGg7Ci0KLQotICAgIGlmICggc2NhbGluZyApCi0gICAgICAqc2NhbGluZyAgPSAwOwotCi0gICAgcmVzdWx0ID0gMDsKLQotICAgIG51bWJlciAgID0gMDsKLSAgICByZXN0ICAgICA9IDA7Ci0gICAgZXhwb25lbnQgPSAwOwotCi0gICAgZXhwb25lbnRfYWRkICAgID0gMDsKLSAgICBpbnRlZ2VyX2xlbmd0aCAgPSAwOwotICAgIGZyYWN0aW9uX2xlbmd0aCA9IDA7Ci0KLSAgICAvKiBGaXJzdCBvZiBhbGwsIHJlYWQgdGhlIGludGVnZXIgcGFydC4gKi8KLSAgICBwaGFzZSA9IDQ7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8qIElmIHdlIGVudGVyZWQgdGhpcyBpdGVyYXRpb24gd2l0aCBwaGFzZSA9PSA0LCB3ZSBuZWVkIHRvICovCi0gICAgICAvKiByZWFkIGEgbmV3IGJ5dGUuICBUaGlzIGFsc28gc2tpcHMgcGFzdCB0aGUgaW5pdGlhbCAweDFFLiAqLwotICAgICAgaWYgKCBwaGFzZSApCi0gICAgICB7Ci0gICAgICAgIHArKzsKLQotICAgICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBwYXN0IHRoZSBlbmQuICovCi0gICAgICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBHZXQgdGhlIG5pYmJsZS4gKi8KLSAgICAgIG5pYiAgID0gKCBwWzBdID4+IHBoYXNlICkgJiAweEY7Ci0gICAgICBwaGFzZSA9IDQgLSBwaGFzZTsKLQotICAgICAgaWYgKCBuaWIgPT0gMHhFICkKLSAgICAgICAgc2lnbiA9IDE7Ci0gICAgICBlbHNlIGlmICggbmliID4gOSApCi0gICAgICAgIGJyZWFrOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBJbmNyZWFzZSBleHBvbmVudCBpZiB3ZSBjYW4ndCBhZGQgdGhlIGRpZ2l0LiAqLwotICAgICAgICBpZiAoIG51bWJlciA+PSAweENDQ0NDQ0NMICkKLSAgICAgICAgICBleHBvbmVudF9hZGQrKzsKLSAgICAgICAgLyogU2tpcCBsZWFkaW5nIHplcm9zLiAqLwotICAgICAgICBlbHNlIGlmICggbmliIHx8IG51bWJlciApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnRlZ2VyX2xlbmd0aCsrOwotICAgICAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgbmliOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogUmVhZCBmcmFjdGlvbiBwYXJ0LCBpZiBhbnkuICovCi0gICAgaWYgKCBuaWIgPT0gMHhhICkKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIC8qIElmIHdlIGVudGVyZWQgdGhpcyBpdGVyYXRpb24gd2l0aCBwaGFzZSA9PSA0LCB3ZSBuZWVkICovCi0gICAgICAgIC8qIHRvIHJlYWQgYSBuZXcgYnl0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICB7Ci0gICAgICAgICAgcCsrOwotCi0gICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgcGFzdCB0aGUgZW5kLiAqLwotICAgICAgICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBHZXQgdGhlIG5pYmJsZS4gKi8KLSAgICAgICAgbmliICAgPSAoIHBbMF0gPj4gcGhhc2UgKSAmIDB4RjsKLSAgICAgICAgcGhhc2UgPSA0IC0gcGhhc2U7Ci0gICAgICAgIGlmICggbmliID49IDEwICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBTa2lwIGxlYWRpbmcgemVyb3MgaWYgcG9zc2libGUuICovCi0gICAgICAgIGlmICggIW5pYiAmJiAhbnVtYmVyICkKLSAgICAgICAgICBleHBvbmVudF9hZGQtLTsKLSAgICAgICAgLyogT25seSBhZGQgZGlnaXQgaWYgd2UgZG9uJ3Qgb3ZlcmZsb3cuICovCi0gICAgICAgIGVsc2UgaWYgKCBudW1iZXIgPCAweENDQ0NDQ0NMICkKLSAgICAgICAgewotICAgICAgICAgIGZyYWN0aW9uX2xlbmd0aCsrOwotICAgICAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgbmliOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAvKiBSZWFkIGV4cG9uZW50LCBpZiBhbnkuICovCi0gICAgaWYgKCBuaWIgPT0gMTIgKQotICAgIHsKLSAgICAgIGV4cG9uZW50X3NpZ24gPSAxOwotICAgICAgbmliICAgICAgICAgICA9IDExOwotICAgIH0KLQotICAgIGlmICggbmliID09IDExICkKLSAgICB7Ci0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICAvKiBJZiB3ZSBlbnRlcmVkIHRoaXMgaXRlcmF0aW9uIHdpdGggcGhhc2UgPT0gNCwgKi8KLSAgICAgICAgLyogd2UgbmVlZCB0byByZWFkIGEgbmV3IGJ5dGUuICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICB7Ci0gICAgICAgICAgcCsrOwotCi0gICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgcGFzdCB0aGUgZW5kLiAqLwotICAgICAgICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBHZXQgdGhlIG5pYmJsZS4gKi8KLSAgICAgICAgbmliICAgPSAoIHBbMF0gPj4gcGhhc2UgKSAmIDB4RjsKLSAgICAgICAgcGhhc2UgPSA0IC0gcGhhc2U7Ci0gICAgICAgIGlmICggbmliID49IDEwICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBleHBvbmVudCA9IGV4cG9uZW50ICogMTAgKyBuaWI7Ci0KLSAgICAgICAgLyogQXJiaXRyYXJpbHkgbGltaXQgZXhwb25lbnQuICovCi0gICAgICAgIGlmICggZXhwb25lbnQgPiAxMDAwICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXhwb25lbnRfc2lnbiApCi0gICAgICAgIGV4cG9uZW50ID0gLWV4cG9uZW50OwotICAgIH0KLQotICAgIC8qIFdlIGRvbid0IGNoZWNrIGBwb3dlcl90ZW4nIGFuZCBgZXhwb25lbnRfYWRkJy4gKi8KLSAgICBleHBvbmVudCArPSBwb3dlcl90ZW4gKyBleHBvbmVudF9hZGQ7Ci0KLSAgICBpZiAoIHNjYWxpbmcgKQotICAgIHsKLSAgICAgIC8qIE9ubHkgdXNlIGBmcmFjdGlvbl9sZW5ndGgnLiAqLwotICAgICAgZnJhY3Rpb25fbGVuZ3RoICs9IGludGVnZXJfbGVuZ3RoOwotICAgICAgZXhwb25lbnQgICAgICAgICs9IGludGVnZXJfbGVuZ3RoOwotCi0gICAgICBpZiAoIGZyYWN0aW9uX2xlbmd0aCA8PSA1ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBudW1iZXIgPiAweDdGRkZMICkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCAgID0gRlRfRGl2Rml4KCBudW1iZXIsIDEwICk7Ci0gICAgICAgICAgKnNjYWxpbmcgPSBleHBvbmVudCAtIGZyYWN0aW9uX2xlbmd0aCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBleHBvbmVudCA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgbmV3X2ZyYWN0aW9uX2xlbmd0aCwgc2hpZnQ7Ci0KLQotICAgICAgICAgICAgLyogTWFrZSBgc2NhbGluZycgYXMgc21hbGwgYXMgcG9zc2libGUuICovCi0gICAgICAgICAgICBuZXdfZnJhY3Rpb25fbGVuZ3RoID0gRlRfTUlOKCBleHBvbmVudCwgNSApOwotICAgICAgICAgICAgZXhwb25lbnQgICAgICAgICAgIC09IG5ld19mcmFjdGlvbl9sZW5ndGg7Ci0gICAgICAgICAgICBzaGlmdCAgICAgICAgICAgICAgID0gbmV3X2ZyYWN0aW9uX2xlbmd0aCAtIGZyYWN0aW9uX2xlbmd0aDsKLQotICAgICAgICAgICAgbnVtYmVyICo9IHBvd2VyX3RlbnNbc2hpZnRdOwotICAgICAgICAgICAgaWYgKCBudW1iZXIgPiAweDdGRkZMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbnVtYmVyICAgLz0gMTA7Ci0gICAgICAgICAgICAgIGV4cG9uZW50ICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGV4cG9uZW50IC09IGZyYWN0aW9uX2xlbmd0aDsKLQotICAgICAgICAgIHJlc3VsdCAgID0gbnVtYmVyIDw8IDE2OwotICAgICAgICAgICpzY2FsaW5nID0gZXhwb25lbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCAoIG51bWJlciAvIHBvd2VyX3RlbnNbZnJhY3Rpb25fbGVuZ3RoIC0gNV0gKSA+IDB4N0ZGRkwgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICAgPSBGVF9EaXZGaXgoIG51bWJlciwgcG93ZXJfdGVuc1tmcmFjdGlvbl9sZW5ndGggLSA0XSApOwotICAgICAgICAgICpzY2FsaW5nID0gZXhwb25lbnQgLSA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCAgID0gRlRfRGl2Rml4KCBudW1iZXIsIHBvd2VyX3RlbnNbZnJhY3Rpb25fbGVuZ3RoIC0gNV0gKTsKLSAgICAgICAgICAqc2NhbGluZyA9IGV4cG9uZW50IC0gNTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW50ZWdlcl9sZW5ndGggICs9IGV4cG9uZW50OwotICAgICAgZnJhY3Rpb25fbGVuZ3RoIC09IGV4cG9uZW50OwotCi0gICAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdy4gKi8KLSAgICAgIGlmICggRlRfQUJTKCBpbnRlZ2VyX2xlbmd0aCApID4gNSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogQ29udmVydCBpbnRvIDE2LjE2IGZvcm1hdC4gKi8KLSAgICAgIGlmICggZnJhY3Rpb25fbGVuZ3RoID4gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggKCBudW1iZXIgLyBwb3dlcl90ZW5zW2ZyYWN0aW9uX2xlbmd0aF0gKSA+IDB4N0ZGRkwgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICByZXN1bHQgPSBGVF9EaXZGaXgoIG51bWJlciwgcG93ZXJfdGVuc1tmcmFjdGlvbl9sZW5ndGhdICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG51bWJlciAqPSBwb3dlcl90ZW5zWy1mcmFjdGlvbl9sZW5ndGhdOwotCi0gICAgICAgIGlmICggbnVtYmVyID4gMHg3RkZGTCApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIHJlc3VsdCA9IG51bWJlciA8PCAxNjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHNpZ24gKQotICAgICAgcmVzdWx0ID0gLXJlc3VsdDsKLQotICBFeGl0OgotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIHJlYWQgYSBudW1iZXIsIGVpdGhlciBpbnRlZ2VyIG9yIHJlYWwgKi8KLSAgc3RhdGljIEZUX0xvbmcKLSAgY2ZmX3BhcnNlX251bSggRlRfQnl0ZSoqICBkICkKLSAgewotICAgIHJldHVybiAqKmQgPT0gMzAgPyAoIGNmZl9wYXJzZV9yZWFsKCBkWzBdLCBkWzFdLCAwLCBOVUxMICkgPj4gMTYgKQotICAgICAgICAgICAgICAgICAgICAgOiAgIGNmZl9wYXJzZV9pbnRlZ2VyKCBkWzBdLCBkWzFdICk7Ci0gIH0KLQotCi0gIC8qIHJlYWQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGVpdGhlciBpbnRlZ2VyIG9yIHJlYWwgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGNmZl9wYXJzZV9maXhlZCggRlRfQnl0ZSoqICBkICkKLSAgewotICAgIHJldHVybiAqKmQgPT0gMzAgPyBjZmZfcGFyc2VfcmVhbCggZFswXSwgZFsxXSwgMCwgTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICA6IGNmZl9wYXJzZV9pbnRlZ2VyKCBkWzBdLCBkWzFdICkgPDwgMTY7Ci0gIH0KLQotCi0gIC8qIHJlYWQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGVpdGhlciBpbnRlZ2VyIG9yIHJlYWwsICovCi0gIC8qIGJ1dCByZXR1cm4gYDEwXnNjYWxpbmcnIHRpbWVzIHRoZSBudW1iZXIgcmVhZCBpbiAgICAgICovCi0gIHN0YXRpYyBGVF9GaXhlZAotICBjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKCBGVF9CeXRlKiogIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgc2NhbGluZyApCi0gIHsKLSAgICByZXR1cm4gKipkID09Ci0gICAgICAzMCA/IGNmZl9wYXJzZV9yZWFsKCBkWzBdLCBkWzFdLCBzY2FsaW5nLCBOVUxMICkKLSAgICAgICAgIDogKEZUX0ZpeGVkKUZUX011bEZpeCggY2ZmX3BhcnNlX2ludGVnZXIoIGRbMF0sIGRbMV0gKSA8PCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyX3RlbnNbc2NhbGluZ10gKTsKLSAgfQotCi0KLSAgLyogcmVhZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgZWl0aGVyIGludGVnZXIgb3IgcmVhbCwgICAgICovCi0gIC8qIGFuZCByZXR1cm4gaXQgYXMgcHJlY2lzZSBhcyBwb3NzaWJsZSAtLSBgc2NhbGluZycgcmV0dXJucyAqLwotICAvKiB0aGUgc2NhbGluZyBmYWN0b3IgKGFzIGEgcG93ZXIgb2YgMTApICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGNmZl9wYXJzZV9maXhlZF9keW5hbWljKCBGVF9CeXRlKiogIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgIHNjYWxpbmcgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBzY2FsaW5nICk7Ci0KLSAgICBpZiAoICoqZCA9PSAzMCApCi0gICAgICByZXR1cm4gY2ZmX3BhcnNlX3JlYWwoIGRbMF0sIGRbMV0sIDAsIHNjYWxpbmcgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfTG9uZyAgbnVtYmVyOwotICAgICAgRlRfSW50ICAgaW50ZWdlcl9sZW5ndGg7Ci0KLQotICAgICAgbnVtYmVyID0gY2ZmX3BhcnNlX2ludGVnZXIoIGRbMF0sIGRbMV0gKTsKLQotICAgICAgaWYgKCBudW1iZXIgPiAweDdGRkZMICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaW50ZWdlcl9sZW5ndGggPSA1OyBpbnRlZ2VyX2xlbmd0aCA8IDEwOyBpbnRlZ2VyX2xlbmd0aCsrICkKLSAgICAgICAgICBpZiAoIG51bWJlciA8IHBvd2VyX3RlbnNbaW50ZWdlcl9sZW5ndGhdICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggKCBudW1iZXIgLyBwb3dlcl90ZW5zW2ludGVnZXJfbGVuZ3RoIC0gNV0gKSA+IDB4N0ZGRkwgKQotICAgICAgICB7Ci0gICAgICAgICAgKnNjYWxpbmcgPSBpbnRlZ2VyX2xlbmd0aCAtIDQ7Ci0gICAgICAgICAgcmV0dXJuIEZUX0RpdkZpeCggbnVtYmVyLCBwb3dlcl90ZW5zW2ludGVnZXJfbGVuZ3RoIC0gNF0gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqc2NhbGluZyA9IGludGVnZXJfbGVuZ3RoIC0gNTsKLSAgICAgICAgICByZXR1cm4gRlRfRGl2Rml4KCBudW1iZXIsIHBvd2VyX3RlbnNbaW50ZWdlcl9sZW5ndGggLSA1XSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICpzY2FsaW5nID0gMDsKLSAgICAgICAgcmV0dXJuIG51bWJlciA8PCAxNjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfcGFyc2VfZm9udF9tYXRyaXgoIENGRl9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3QgICA9IChDRkZfRm9udFJlY0RpY3QpcGFyc2VyLT5vYmplY3Q7Ci0gICAgRlRfTWF0cml4KiAgICAgICBtYXRyaXggPSAmZGljdC0+Zm9udF9tYXRyaXg7Ci0gICAgRlRfVmVjdG9yKiAgICAgICBvZmZzZXQgPSAmZGljdC0+Zm9udF9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcqICAgICAgICB1cG0gICAgPSAmZGljdC0+dW5pdHNfcGVyX2VtOwotICAgIEZUX0J5dGUqKiAgICAgICAgZGF0YSAgID0gcGFyc2VyLT5zdGFjazsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yICA9IENGRl9FcnJfU3RhY2tfVW5kZXJmbG93OwotCi0KLSAgICBpZiAoIHBhcnNlci0+dG9wID49IHBhcnNlci0+c3RhY2sgKyA2ICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIHNjYWxpbmc7Ci0KLQotICAgICAgZXJyb3IgPSBDRkZfRXJyX09rOwotCi0gICAgICAvKiBXZSBleHBlY3QgYSB3ZWxsLWZvcm1lZCBmb250IG1hdHJpeCwgdGhpcyBpcywgdGhlIG1hdHJpeCBlbGVtZW50cyAqLwotICAgICAgLyogYHh4JyBhbmQgYHl5JyBhcmUgb2YgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBtYWduaXR1ZGUuICBUbyBhdm9pZCAgKi8KLSAgICAgIC8qIGxvc3Mgb2YgcHJlY2lzaW9uLCB3ZSB1c2UgdGhlIG1hZ25pdHVkZSBvZiBlbGVtZW50IGB4eCcgdG8gc2NhbGUgICovCi0gICAgICAvKiBhbGwgb3RoZXIgZWxlbWVudHMuICBUaGUgc2NhbGluZyBmYWN0b3IgaXMgdGhlbiBjb250YWluZWQgaW4gdGhlICAqLwotICAgICAgLyogYHVuaXRzX3Blcl9lbScgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgbWF0cml4LT54eCA9IGNmZl9wYXJzZV9maXhlZF9keW5hbWljKCBkYXRhKyssICZzY2FsaW5nICk7Ci0KLSAgICAgIHNjYWxpbmcgPSAtc2NhbGluZzsKLQotICAgICAgaWYgKCBzY2FsaW5nIDwgMCB8fCBzY2FsaW5nID4gOSApCi0gICAgICB7Ci0gICAgICAgIC8qIFJldHVybiBkZWZhdWx0IG1hdHJpeCBpbiBjYXNlIG9mIHVubGlrZWx5IHZhbHVlcy4gKi8KLSAgICAgICAgbWF0cml4LT54eCA9IDB4MTAwMDBMOwotICAgICAgICBtYXRyaXgtPnl4ID0gMDsKLSAgICAgICAgbWF0cml4LT55eCA9IDA7Ci0gICAgICAgIG1hdHJpeC0+eXkgPSAweDEwMDAwTDsKLSAgICAgICAgb2Zmc2V0LT54ICA9IDA7Ci0gICAgICAgIG9mZnNldC0+eSAgPSAwOwotICAgICAgICAqdXBtICAgICAgID0gMTsKLQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIG1hdHJpeC0+eXggPSBjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKCBkYXRhKyssIHNjYWxpbmcgKTsKLSAgICAgIG1hdHJpeC0+eHkgPSBjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKCBkYXRhKyssIHNjYWxpbmcgKTsKLSAgICAgIG1hdHJpeC0+eXkgPSBjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKCBkYXRhKyssIHNjYWxpbmcgKTsKLSAgICAgIG9mZnNldC0+eCAgPSBjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKCBkYXRhKyssIHNjYWxpbmcgKTsKLSAgICAgIG9mZnNldC0+eSAgPSBjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKCBkYXRhLCAgIHNjYWxpbmcgKTsKLQotICAgICAgKnVwbSA9IHBvd2VyX3RlbnNbc2NhbGluZ107Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3BhcnNlX2ZvbnRfYmJveCggQ0ZGX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIENGRl9Gb250UmVjRGljdCAgZGljdCA9IChDRkZfRm9udFJlY0RpY3QpcGFyc2VyLT5vYmplY3Q7Ci0gICAgRlRfQkJveCogICAgICAgICBiYm94ID0gJmRpY3QtPmZvbnRfYmJveDsKLSAgICBGVF9CeXRlKiogICAgICAgIGRhdGEgPSBwYXJzZXItPnN0YWNrOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gQ0ZGX0Vycl9TdGFja19VbmRlcmZsb3c7Ci0KLSAgICBpZiAoIHBhcnNlci0+dG9wID49IHBhcnNlci0+c3RhY2sgKyA0ICkKLSAgICB7Ci0gICAgICBiYm94LT54TWluID0gRlRfUm91bmRGaXgoIGNmZl9wYXJzZV9maXhlZCggZGF0YSsrICkgKTsKLSAgICAgIGJib3gtPnlNaW4gPSBGVF9Sb3VuZEZpeCggY2ZmX3BhcnNlX2ZpeGVkKCBkYXRhKysgKSApOwotICAgICAgYmJveC0+eE1heCA9IEZUX1JvdW5kRml4KCBjZmZfcGFyc2VfZml4ZWQoIGRhdGErKyApICk7Ci0gICAgICBiYm94LT55TWF4ID0gRlRfUm91bmRGaXgoIGNmZl9wYXJzZV9maXhlZCggZGF0YSAgICkgKTsKLSAgICAgIGVycm9yID0gQ0ZGX0Vycl9PazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfcGFyc2VfcHJpdmF0ZV9kaWN0KCBDRkZfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgQ0ZGX0ZvbnRSZWNEaWN0ICBkaWN0ID0gKENGRl9Gb250UmVjRGljdClwYXJzZXItPm9iamVjdDsKLSAgICBGVF9CeXRlKiogICAgICAgIGRhdGEgPSBwYXJzZXItPnN0YWNrOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gQ0ZGX0Vycl9TdGFja19VbmRlcmZsb3c7Ci0KLSAgICBpZiAoIHBhcnNlci0+dG9wID49IHBhcnNlci0+c3RhY2sgKyAyICkKLSAgICB7Ci0gICAgICBkaWN0LT5wcml2YXRlX3NpemUgICA9IGNmZl9wYXJzZV9udW0oIGRhdGErKyApOwotICAgICAgZGljdC0+cHJpdmF0ZV9vZmZzZXQgPSBjZmZfcGFyc2VfbnVtKCBkYXRhICAgKTsKLSAgICAgIGVycm9yID0gQ0ZGX0Vycl9PazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfcGFyc2VfY2lkX3JvcyggQ0ZGX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIENGRl9Gb250UmVjRGljdCAgZGljdCA9IChDRkZfRm9udFJlY0RpY3QpcGFyc2VyLT5vYmplY3Q7Ci0gICAgRlRfQnl0ZSoqICAgICAgICBkYXRhID0gcGFyc2VyLT5zdGFjazsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IENGRl9FcnJfU3RhY2tfVW5kZXJmbG93OwotCi0gICAgaWYgKCBwYXJzZXItPnRvcCA+PSBwYXJzZXItPnN0YWNrICsgMyApCi0gICAgewotICAgICAgZGljdC0+Y2lkX3JlZ2lzdHJ5ICAgPSAoRlRfVUludCljZmZfcGFyc2VfbnVtICggZGF0YSsrICk7Ci0gICAgICBkaWN0LT5jaWRfb3JkZXJpbmcgICA9IChGVF9VSW50KWNmZl9wYXJzZV9udW0gKCBkYXRhKysgKTsKLSAgICAgIGRpY3QtPmNpZF9zdXBwbGVtZW50ID0gKEZUX1VMb25nKWNmZl9wYXJzZV9udW0oIGRhdGEgKTsKLSAgICAgIGVycm9yID0gQ0ZGX0Vycl9PazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jZGVmaW5lIENGRl9GSUVMRF9OVU0oIGNvZGUsIG5hbWUgKSBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBjZmZfa2luZF9udW0gKQotI2RlZmluZSBDRkZfRklFTERfRklYRUQoIGNvZGUsIG5hbWUgKSBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBjZmZfa2luZF9maXhlZCApCi0jZGVmaW5lIENGRl9GSUVMRF9GSVhFRF8xMDAwKCBjb2RlLCBuYW1lICkgXAotICAgICAgICAgIENGRl9GSUVMRCggY29kZSwgbmFtZSwgY2ZmX2tpbmRfZml4ZWRfdGhvdXNhbmQgKQotI2RlZmluZSBDRkZfRklFTERfU1RSSU5HKCBjb2RlLCBuYW1lICkgXAotICAgICAgICAgIENGRl9GSUVMRCggY29kZSwgbmFtZSwgY2ZmX2tpbmRfc3RyaW5nICkKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0JPT0woIGNvZGUsIG5hbWUgKSBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBjZmZfa2luZF9ib29sICkKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0RFTFRBKCBjb2RlLCBuYW1lLCBtYXggKSBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBjZmZfa2luZF9kZWx0YSApCi0KLSNkZWZpbmUgQ0ZGX0ZJRUxEX0NBTExCQUNLKCBjb2RlLCBuYW1lICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfa2luZF9jYWxsYmFjaywgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvZGUgfCBDRkZDT0RFLCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfcGFyc2VfICMjIG5hbWUsICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSN1bmRlZiAgQ0ZGX0ZJRUxECi0jZGVmaW5lIENGRl9GSUVMRCggY29kZSwgbmFtZSwga2luZCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBraW5kLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29kZSB8IENGRkNPREUsICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggbmFtZSApLCBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFKCBuYW1lICksICAgXAotICAgICAgICAgICAgMCwgMCwgMCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jdW5kZWYgIENGRl9GSUVMRF9ERUxUQQotI2RlZmluZSBDRkZfRklFTERfREVMVEEoIGNvZGUsIG5hbWUsIG1heCApIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2ZmX2tpbmRfZGVsdGEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvZGUgfCBDRkZDT0RFLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIG5hbWUgKSwgICAgICAgICBcCi0gICAgICAgICAgRlRfRklFTERfU0laRV9ERUxUQSggbmFtZSApLCAgICAgXAotICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBtYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBudW1fICMjIG5hbWUgKSAgXAotICAgICAgICB9LAotCi0jZGVmaW5lIENGRkNPREVfVE9QRElDVCAgMHgxMDAwCi0jZGVmaW5lIENGRkNPREVfUFJJVkFURSAgMHgyMDAwCi0KLSAgc3RhdGljIGNvbnN0IENGRl9GaWVsZF9IYW5kbGVyICBjZmZfZmllbGRfaGFuZGxlcnNbXSA9Ci0gIHsKLQotI2luY2x1ZGUgImNmZnRva2VuLmgiCi0KLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfQotICB9OwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9wYXJzZXJfcnVuKCBDRkZfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGxpbWl0ICkKLSAgewotICAgIEZUX0J5dGUqICBwICAgICA9IHN0YXJ0OwotICAgIEZUX0Vycm9yICBlcnJvciA9IENGRl9FcnJfT2s7Ci0KLQotICAgIHBhcnNlci0+dG9wICAgID0gcGFyc2VyLT5zdGFjazsKLSAgICBwYXJzZXItPnN0YXJ0ICA9IHN0YXJ0OwotICAgIHBhcnNlci0+bGltaXQgID0gbGltaXQ7Ci0gICAgcGFyc2VyLT5jdXJzb3IgPSBzdGFydDsKLQotICAgIHdoaWxlICggcCA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICB2ID0gKnA7Ci0KLQotICAgICAgaWYgKCB2ID49IDI3ICYmIHYgIT0gMzEgKQotICAgICAgewotICAgICAgICAvKiBpdCdzIGEgbnVtYmVyOyB3ZSB3aWxsIHB1c2ggaXRzIHBvc2l0aW9uIG9uIHRoZSBzdGFjayAqLwotICAgICAgICBpZiAoIHBhcnNlci0+dG9wIC0gcGFyc2VyLT5zdGFjayA+PSBDRkZfTUFYX1NUQUNLX0RFUFRIICkKLSAgICAgICAgICBnb3RvIFN0YWNrX092ZXJmbG93OwotCi0gICAgICAgICpwYXJzZXItPnRvcCArKyA9IHA7Ci0KLSAgICAgICAgLyogbm93LCBza2lwIGl0ICovCi0gICAgICAgIGlmICggdiA9PSAzMCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBza2lwIHJlYWwgbnVtYmVyICovCi0gICAgICAgICAgcCsrOwotICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB2ID0gcFswXSA+PiA0OwotICAgICAgICAgICAgaWYgKCB2ID09IDE1ICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB2ID0gcFswXSAmIDB4RjsKLSAgICAgICAgICAgIGlmICggdiA9PSAxNSApCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggdiA9PSAyOCApCi0gICAgICAgICAgcCArPSAyOwotICAgICAgICBlbHNlIGlmICggdiA9PSAyOSApCi0gICAgICAgICAgcCArPSA0OwotICAgICAgICBlbHNlIGlmICggdiA+IDI0NiApCi0gICAgICAgICAgcCArPSAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBUaGlzIGlzIG5vdCBhIG51bWJlciwgaGVuY2UgaXQncyBhbiBvcGVyYXRvci4gIENvbXB1dGUgaXRzIGNvZGUgKi8KLSAgICAgICAgLyogYW5kIGxvb2sgZm9yIGl0IGluIG91ciBjdXJyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgICAgICBjb2RlOwotICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgICAgIG51bV9hcmdzID0gKEZUX1VJbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHBhcnNlci0+dG9wIC0gcGFyc2VyLT5zdGFjayApOwotICAgICAgICBjb25zdCBDRkZfRmllbGRfSGFuZGxlciogIGZpZWxkOwotCi0KLSAgICAgICAgKnBhcnNlci0+dG9wID0gcDsKLSAgICAgICAgY29kZSA9IHY7Ci0gICAgICAgIGlmICggdiA9PSAxMiApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB0d28gYnl0ZSBvcGVyYXRvciAqLwotICAgICAgICAgIHArKzsKLSAgICAgICAgICBpZiAoIHAgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0KLSAgICAgICAgICBjb2RlID0gMHgxMDAgfCBwWzBdOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgPSBjb2RlIHwgcGFyc2VyLT5vYmplY3RfY29kZTsKLQotICAgICAgICBmb3IgKCBmaWVsZCA9IGNmZl9maWVsZF9oYW5kbGVyczsgZmllbGQtPmtpbmQ7IGZpZWxkKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBmaWVsZC0+Y29kZSA9PSAoRlRfSW50KWNvZGUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHdlIGZvdW5kIG91ciBmaWVsZCdzIGhhbmRsZXI7IHJlYWQgaXQgKi8KLSAgICAgICAgICAgIEZUX0xvbmcgICB2YWw7Ci0gICAgICAgICAgICBGVF9CeXRlKiAgcSA9IChGVF9CeXRlKilwYXJzZXItPm9iamVjdCArIGZpZWxkLT5vZmZzZXQ7Ci0KLQotICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGVub3VnaCBhcmd1bWVudHMgLS0gZXhjZXB0IGZvciAqLwotICAgICAgICAgICAgLyogZGVsdGEgZW5jb2RlZCBhcnJheXMsIHdoaWNoIGNhbiBiZSBlbXB0eSAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBmaWVsZC0+a2luZCAhPSBjZmZfa2luZF9kZWx0YSAmJiBudW1fYXJncyA8IDEgKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgc3dpdGNoICggZmllbGQtPmtpbmQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9ib29sOgotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9zdHJpbmc6Ci0gICAgICAgICAgICBjYXNlIGNmZl9raW5kX251bToKLSAgICAgICAgICAgICAgdmFsID0gY2ZmX3BhcnNlX251bSggcGFyc2VyLT5zdGFjayApOwotICAgICAgICAgICAgICBnb3RvIFN0b3JlX051bWJlcjsKLQotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9maXhlZDoKLSAgICAgICAgICAgICAgdmFsID0gY2ZmX3BhcnNlX2ZpeGVkKCBwYXJzZXItPnN0YWNrICk7Ci0gICAgICAgICAgICAgIGdvdG8gU3RvcmVfTnVtYmVyOwotCi0gICAgICAgICAgICBjYXNlIGNmZl9raW5kX2ZpeGVkX3Rob3VzYW5kOgotICAgICAgICAgICAgICB2YWwgPSBjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKCBwYXJzZXItPnN0YWNrLCAzICk7Ci0KLSAgICAgICAgICAgIFN0b3JlX051bWJlcjoKLSAgICAgICAgICAgICAgc3dpdGNoICggZmllbGQtPnNpemUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgKDggLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgICAgICAgKihGVF9CeXRlKilxID0gKEZUX0J5dGUpdmFsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgKDE2IC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICAgICAgICooRlRfU2hvcnQqKXEgPSAoRlRfU2hvcnQpdmFsOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgKDMyIC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICAgICAgICooRlRfSW50MzIqKXEgPSAoRlRfSW50KXZhbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBkZWZhdWx0OiAgLyogZm9yIDY0LWJpdCBzeXN0ZW1zICovCi0gICAgICAgICAgICAgICAgKihGVF9Mb25nKilxID0gdmFsOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIGNmZl9raW5kX2RlbHRhOgotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlRfQnl0ZSogICBxY291bnQgPSAoRlRfQnl0ZSopcGFyc2VyLT5vYmplY3QgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y291bnRfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBkYXRhID0gcGFyc2VyLT5zdGFjazsKLQotCi0gICAgICAgICAgICAgICAgaWYgKCBudW1fYXJncyA+IGZpZWxkLT5hcnJheV9tYXggKQotICAgICAgICAgICAgICAgICAgbnVtX2FyZ3MgPSBmaWVsZC0+YXJyYXlfbWF4OwotCi0gICAgICAgICAgICAgICAgLyogc3RvcmUgY291bnQgKi8KLSAgICAgICAgICAgICAgICAqcWNvdW50ID0gKEZUX0J5dGUpbnVtX2FyZ3M7Ci0KLSAgICAgICAgICAgICAgICB2YWwgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICggbnVtX2FyZ3MgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB2YWwgKz0gY2ZmX3BhcnNlX251bSggZGF0YSsrICk7Ci0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBmaWVsZC0+c2l6ZSApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlICg4IC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICAgICAgICAgICAqKEZUX0J5dGUqKXEgPSAoRlRfQnl0ZSl2YWw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBjYXNlICgxNiAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAgICAgICAgICAgKihGVF9TaG9ydCopcSA9IChGVF9TaG9ydCl2YWw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBjYXNlICgzMiAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAgICAgICAgICAgKihGVF9JbnQzMiopcSA9IChGVF9JbnQpdmFsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDogIC8qIGZvciA2NC1iaXQgc3lzdGVtcyAqLwotICAgICAgICAgICAgICAgICAgICAqKEZUX0xvbmcqKXEgPSB2YWw7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIHEgKz0gZmllbGQtPnNpemU7Ci0gICAgICAgICAgICAgICAgICBudW1fYXJncy0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogIC8qIGNhbGxiYWNrICovCi0gICAgICAgICAgICAgIGVycm9yID0gZmllbGQtPnJlYWRlciggcGFyc2VyICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gRm91bmQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogdGhpcyBpcyBhbiB1bmtub3duIG9wZXJhdG9yLCBvciBpdCBpcyB1bnN1cHBvcnRlZDsgKi8KLSAgICAgICAgLyogd2Ugd2lsbCBpZ25vcmUgaXQgZm9yIG5vdy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgRm91bmQ6Ci0gICAgICAgIC8qIGNsZWFyIHN0YWNrICovCi0gICAgICAgIHBhcnNlci0+dG9wID0gcGFyc2VyLT5zdGFjazsKLSAgICAgIH0KLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgU3RhY2tfT3ZlcmZsb3c6Ci0gICAgZXJyb3IgPSBDRkZfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgZ290byBFeGl0OwotCi0gIFN0YWNrX1VuZGVyZmxvdzoKLSAgICBlcnJvciA9IENGRl9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICBnb3RvIEV4aXQ7Ci0KLSAgU3ludGF4X0Vycm9yOgotICAgIGVycm9yID0gQ0ZGX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZwYXJzZS5oIGIvc3JjL2NmZi9jZmZwYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjNmYTU4Li4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmcGFyc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZnBhcnNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgdG9rZW4gc3RyZWFtIHBhcnNlciAoc3BlY2lmaWNhdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGRl9QQVJTRV9IX18KLSNkZWZpbmUgX19DRkZfUEFSU0VfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiY2ZmdHlwZXMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgQ0ZGX01BWF9TVEFDS19ERVBUSCAgOTYKLQotI2RlZmluZSBDRkZfQ09ERV9UT1BESUNUICAweDEwMDAKLSNkZWZpbmUgQ0ZGX0NPREVfUFJJVkFURSAgMHgyMDAwCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX1BhcnNlclJlY18KLSAgewotICAgIEZUX0J5dGUqICAgc3RhcnQ7Ci0gICAgRlRfQnl0ZSogICBsaW1pdDsKLSAgICBGVF9CeXRlKiAgIGN1cnNvcjsKLQotICAgIEZUX0J5dGUqICAgc3RhY2tbQ0ZGX01BWF9TVEFDS19ERVBUSCArIDFdOwotICAgIEZUX0J5dGUqKiAgdG9wOwotCi0gICAgRlRfVUludCAgICBvYmplY3RfY29kZTsKLSAgICB2b2lkKiAgICAgIG9iamVjdDsKLQotICB9IENGRl9QYXJzZXJSZWMsICpDRkZfUGFyc2VyOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfcGFyc2VyX2luaXQoIENGRl9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBjb2RlLAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgIG9iamVjdCApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9wYXJzZXJfcnVuKCBDRkZfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGxpbWl0ICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0NGRl9QQVJTRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmdG9rZW4uaCBiL3NyYy9jZmYvY2ZmdG9rZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiMjdkNS4uMDAwMDAwMAotLS0gYS9zcmMvY2ZmL2NmZnRva2VuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZ0b2tlbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIHRva2VuIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgQ0ZGX0ZvbnRSZWNEaWN0UmVjCi0KLSN1bmRlZiAgQ0ZGQ09ERQotI2RlZmluZSBDRkZDT0RFICAgICAgIENGRkNPREVfVE9QRElDVAotCi0gIENGRl9GSUVMRF9TVFJJTkcgICggMCwgICAgIHZlcnNpb24gKQotICBDRkZfRklFTERfU1RSSU5HICAoIDEsICAgICBub3RpY2UgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDB4MTAwLCBjb3B5cmlnaHQgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDIsICAgICBmdWxsX25hbWUgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDMsICAgICBmYW1pbHlfbmFtZSApCi0gIENGRl9GSUVMRF9TVFJJTkcgICggNCwgICAgIHdlaWdodCApCi0gIENGRl9GSUVMRF9CT09MICAgICggMHgxMDEsIGlzX2ZpeGVkX3BpdGNoICkKLSAgQ0ZGX0ZJRUxEX0ZJWEVEICAgKCAweDEwMiwgaXRhbGljX2FuZ2xlICkKLSAgQ0ZGX0ZJRUxEX0ZJWEVEICAgKCAweDEwMywgdW5kZXJsaW5lX3Bvc2l0aW9uICkKLSAgQ0ZGX0ZJRUxEX0ZJWEVEICAgKCAweDEwNCwgdW5kZXJsaW5lX3RoaWNrbmVzcyApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMDUsIHBhaW50X3R5cGUgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTA2LCBjaGFyc3RyaW5nX3R5cGUgKQotICBDRkZfRklFTERfQ0FMTEJBQ0soIDB4MTA3LCBmb250X21hdHJpeCApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMTMsICAgIHVuaXF1ZV9pZCApCi0gIENGRl9GSUVMRF9DQUxMQkFDSyggNSwgICAgIGZvbnRfYmJveCApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMDgsIHN0cm9rZV93aWR0aCApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMTUsICAgIGNoYXJzZXRfb2Zmc2V0ICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAxNiwgICAgZW5jb2Rpbmdfb2Zmc2V0ICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAxNywgICAgY2hhcnN0cmluZ3Nfb2Zmc2V0ICkKLSAgQ0ZGX0ZJRUxEX0NBTExCQUNLKCAxOCwgICAgcHJpdmF0ZV9kaWN0ICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDExNCwgc3ludGhldGljX2Jhc2UgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDB4MTE1LCBlbWJlZGRlZF9wb3N0c2NyaXB0ICkKLQotI2lmIDAKLSAgQ0ZGX0ZJRUxEX1NUUklORyAgKCAweDExNiwgYmFzZV9mb250X25hbWUgKQotICBDRkZfRklFTERfREVMVEEgICAoIDB4MTE3LCBiYXNlX2ZvbnRfYmxlbmQsIDE2ICkKLSAgQ0ZGX0ZJRUxEX0NBTExCQUNLKCAweDExOCwgbXVsdGlwbGVfbWFzdGVyICkKLSAgQ0ZGX0ZJRUxEX0NBTExCQUNLKCAweDExOSwgYmxlbmRfYXhpc190eXBlcyApCi0jZW5kaWYKLQotICBDRkZfRklFTERfQ0FMTEJBQ0soIDB4MTFFLCBjaWRfcm9zICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDExRiwgY2lkX2ZvbnRfdmVyc2lvbiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjAsIGNpZF9mb250X3JldmlzaW9uICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEyMSwgY2lkX2ZvbnRfdHlwZSApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjIsIGNpZF9jb3VudCApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjMsIGNpZF91aWRfYmFzZSApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjQsIGNpZF9mZF9hcnJheV9vZmZzZXQgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTI1LCBjaWRfZmRfc2VsZWN0X29mZnNldCApCi0gIENGRl9GSUVMRF9TVFJJTkcgICggMHgxMjYsIGNpZF9mb250X25hbWUgKQotCi0jaWYgMAotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTI3LCBjaGFtZWxlb24gKQotI2VuZGlmCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBDRkZfUHJpdmF0ZVJlYwotI3VuZGVmICBDRkZDT0RFCi0jZGVmaW5lIENGRkNPREUgICAgICAgQ0ZGQ09ERV9QUklWQVRFCi0KLSAgQ0ZGX0ZJRUxEX0RFTFRBICAgICAoIDYsICAgICBibHVlX3ZhbHVlcywgMTQgKQotICBDRkZfRklFTERfREVMVEEgICAgICggNywgICAgIG90aGVyX2JsdWVzLCAxMCApCi0gIENGRl9GSUVMRF9ERUxUQSAgICAgKCA4LCAgICAgZmFtaWx5X2JsdWVzLCAxNCApCi0gIENGRl9GSUVMRF9ERUxUQSAgICAgKCA5LCAgICAgZmFtaWx5X290aGVyX2JsdWVzLCAxMCApCi0gIENGRl9GSUVMRF9GSVhFRF8xMDAwKCAweDEwOSwgYmx1ZV9zY2FsZSApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAweDEwQSwgYmx1ZV9zaGlmdCApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAweDEwQiwgYmx1ZV9mdXp6ICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDEwLCAgICBzdGFuZGFyZF93aWR0aCApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAxMSwgICAgc3RhbmRhcmRfaGVpZ2h0ICkKLSAgQ0ZGX0ZJRUxEX0RFTFRBICAgICAoIDB4MTBDLCBzbmFwX3dpZHRocywgMTMgKQotICBDRkZfRklFTERfREVMVEEgICAgICggMHgxMEQsIHNuYXBfaGVpZ2h0cywgMTMgKQotICBDRkZfRklFTERfQk9PTCAgICAgICggMHgxMEUsIGZvcmNlX2JvbGQgKQotICBDRkZfRklFTERfRklYRUQgICAgICggMHgxMEYsIGZvcmNlX2JvbGRfdGhyZXNob2xkICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDB4MTEwLCBsZW5JViApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAweDExMSwgbGFuZ3VhZ2VfZ3JvdXAgKQotICBDRkZfRklFTERfRklYRUQgICAgICggMHgxMTIsIGV4cGFuc2lvbl9mYWN0b3IgKQotICBDRkZfRklFTERfTlVNICAgICAgICggMHgxMTMsIGluaXRpYWxfcmFuZG9tX3NlZWQgKQotICBDRkZfRklFTERfTlVNICAgICAgICggMTksICAgIGxvY2FsX3N1YnJzX29mZnNldCApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAyMCwgICAgZGVmYXVsdF93aWR0aCApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAyMSwgICAgbm9taW5hbF93aWR0aCApCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZnR5cGVzLmggYi9zcmMvY2ZmL2NmZnR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NmVhM2IuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZ0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZnR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCYXNpYyBPcGVuVHlwZS9DRkYgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAgICAqLwotLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRkZUWVBFU19IX18KLSNkZWZpbmUgX19DRkZUWVBFU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDRkZfSW5kZXhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgQ0ZGIEluZGV4IHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICA6OiBUaGUgc291cmNlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0YXJ0ICAgICAgIDo6IFRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgaW5kZXggYnl0ZSBpbiB0aGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGV4LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2ZmX3NpemUgICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2Ygb2JqZWN0IG9mZnNldHMgaW4gaW5kZXguICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhX29mZnNldCA6OiBUaGUgcG9zaXRpb24gb2YgZmlyc3QgZGF0YSBieXRlIGluIHRoZSBpbmRleCdzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhX3NpemUgICA6OiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSB0YWJsZSBpbiB0aGlzIGluZGV4LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldHMgICAgIDo6IEEgdGFibGUgb2YgZWxlbWVudCBvZmZzZXRzIGluIHRoZSBpbmRleC4gIE11c3QgYmUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBsb2FkZWQgZXhwbGljaXRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ5dGVzICAgICAgIDo6IElmIHRoZSBpbmRleCBpcyBsb2FkZWQgaW4gbWVtb3J5LCBpdHMgYnl0ZXMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9JbmRleFJlY18KLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotICAgIEZUX1VMb25nICAgc3RhcnQ7Ci0gICAgRlRfVUludCAgICBjb3VudDsKLSAgICBGVF9CeXRlICAgIG9mZl9zaXplOwotICAgIEZUX1VMb25nICAgZGF0YV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBkYXRhX3NpemU7Ci0KLSAgICBGVF9VTG9uZyogIG9mZnNldHM7Ci0gICAgRlRfQnl0ZSogICBieXRlczsKLQotICB9IENGRl9JbmRleFJlYywgKkNGRl9JbmRleDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRW5jb2RpbmdSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICBmb3JtYXQ7Ci0gICAgRlRfVUxvbmcgICAgb2Zmc2V0OwotCi0gICAgRlRfVUludCAgICAgY291bnQ7Ci0gICAgRlRfVVNob3J0ICAgc2lkcyBbMjU2XTsgIC8qIGF2b2lkIGR5bmFtaWMgYWxsb2NhdGlvbnMgKi8KLSAgICBGVF9VU2hvcnQgICBjb2Rlc1syNTZdOwotCi0gIH0gQ0ZGX0VuY29kaW5nUmVjLCAqQ0ZGX0VuY29kaW5nOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9DaGFyc2V0UmVjXwotICB7Ci0KLSAgICBGVF9VSW50ICAgICBmb3JtYXQ7Ci0gICAgRlRfVUxvbmcgICAgb2Zmc2V0OwotCi0gICAgRlRfVVNob3J0KiAgc2lkczsKLSAgICBGVF9VU2hvcnQqICBjaWRzOyAgICAgICAvKiB0aGUgaW52ZXJzZSBtYXBwaW5nIG9mIGBzaWRzJzsgb25seSBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgQ0lELWtleWVkIGZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgICBtYXhfY2lkOwotICAgIEZUX1VJbnQgICAgIG51bV9nbHlwaHM7Ci0KLSAgfSBDRkZfQ2hhcnNldFJlYywgKkNGRl9DaGFyc2V0OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9Gb250UmVjRGljdFJlY18KLSAgewotICAgIEZUX1VJbnQgICAgdmVyc2lvbjsKLSAgICBGVF9VSW50ICAgIG5vdGljZTsKLSAgICBGVF9VSW50ICAgIGNvcHlyaWdodDsKLSAgICBGVF9VSW50ICAgIGZ1bGxfbmFtZTsKLSAgICBGVF9VSW50ICAgIGZhbWlseV9uYW1lOwotICAgIEZUX1VJbnQgICAgd2VpZ2h0OwotICAgIEZUX0Jvb2wgICAgaXNfZml4ZWRfcGl0Y2g7Ci0gICAgRlRfRml4ZWQgICBpdGFsaWNfYW5nbGU7Ci0gICAgRlRfRml4ZWQgICB1bmRlcmxpbmVfcG9zaXRpb247Ci0gICAgRlRfRml4ZWQgICB1bmRlcmxpbmVfdGhpY2tuZXNzOwotICAgIEZUX0ludCAgICAgcGFpbnRfdHlwZTsKLSAgICBGVF9JbnQgICAgIGNoYXJzdHJpbmdfdHlwZTsKLSAgICBGVF9NYXRyaXggIGZvbnRfbWF0cml4OwotICAgIEZUX1VMb25nICAgdW5pdHNfcGVyX2VtOyAgLyogdGVtcG9yYXJpbHkgdXNlZCBhcyBzY2FsaW5nIHZhbHVlIGFsc28gKi8KLSAgICBGVF9WZWN0b3IgIGZvbnRfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgdW5pcXVlX2lkOwotICAgIEZUX0JCb3ggICAgZm9udF9iYm94OwotICAgIEZUX1BvcyAgICAgc3Ryb2tlX3dpZHRoOwotICAgIEZUX1VMb25nICAgY2hhcnNldF9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBlbmNvZGluZ19vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBjaGFyc3RyaW5nc19vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBwcml2YXRlX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIHByaXZhdGVfc2l6ZTsKLSAgICBGVF9Mb25nICAgIHN5bnRoZXRpY19iYXNlOwotICAgIEZUX1VJbnQgICAgZW1iZWRkZWRfcG9zdHNjcmlwdDsKLQotICAgIC8qIHRoZXNlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRoZSB0b3AtbGV2ZWwgZm9udCBkaWN0aW9uYXJ5ICovCi0gICAgRlRfVUludCAgICBjaWRfcmVnaXN0cnk7Ci0gICAgRlRfVUludCAgICBjaWRfb3JkZXJpbmc7Ci0gICAgRlRfVUxvbmcgICBjaWRfc3VwcGxlbWVudDsKLQotICAgIEZUX0xvbmcgICAgY2lkX2ZvbnRfdmVyc2lvbjsKLSAgICBGVF9Mb25nICAgIGNpZF9mb250X3JldmlzaW9uOwotICAgIEZUX0xvbmcgICAgY2lkX2ZvbnRfdHlwZTsKLSAgICBGVF9VTG9uZyAgIGNpZF9jb3VudDsKLSAgICBGVF9VTG9uZyAgIGNpZF91aWRfYmFzZTsKLSAgICBGVF9VTG9uZyAgIGNpZF9mZF9hcnJheV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBjaWRfZmRfc2VsZWN0X29mZnNldDsKLSAgICBGVF9VSW50ICAgIGNpZF9mb250X25hbWU7Ci0KLSAgfSBDRkZfRm9udFJlY0RpY3RSZWMsICpDRkZfRm9udFJlY0RpY3Q7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX1ByaXZhdGVSZWNfCi0gIHsKLSAgICBGVF9CeXRlICAgbnVtX2JsdWVfdmFsdWVzOwotICAgIEZUX0J5dGUgICBudW1fb3RoZXJfYmx1ZXM7Ci0gICAgRlRfQnl0ZSAgIG51bV9mYW1pbHlfYmx1ZXM7Ci0gICAgRlRfQnl0ZSAgIG51bV9mYW1pbHlfb3RoZXJfYmx1ZXM7Ci0KLSAgICBGVF9Qb3MgICAgYmx1ZV92YWx1ZXNbMTRdOwotICAgIEZUX1BvcyAgICBvdGhlcl9ibHVlc1sxMF07Ci0gICAgRlRfUG9zICAgIGZhbWlseV9ibHVlc1sxNF07Ci0gICAgRlRfUG9zICAgIGZhbWlseV9vdGhlcl9ibHVlc1sxMF07Ci0KLSAgICBGVF9GaXhlZCAgYmx1ZV9zY2FsZTsKLSAgICBGVF9Qb3MgICAgYmx1ZV9zaGlmdDsKLSAgICBGVF9Qb3MgICAgYmx1ZV9mdXp6OwotICAgIEZUX1BvcyAgICBzdGFuZGFyZF93aWR0aDsKLSAgICBGVF9Qb3MgICAgc3RhbmRhcmRfaGVpZ2h0OwotCi0gICAgRlRfQnl0ZSAgIG51bV9zbmFwX3dpZHRoczsKLSAgICBGVF9CeXRlICAgbnVtX3NuYXBfaGVpZ2h0czsKLSAgICBGVF9Qb3MgICAgc25hcF93aWR0aHNbMTNdOwotICAgIEZUX1BvcyAgICBzbmFwX2hlaWdodHNbMTNdOwotICAgIEZUX0Jvb2wgICBmb3JjZV9ib2xkOwotICAgIEZUX0ZpeGVkICBmb3JjZV9ib2xkX3RocmVzaG9sZDsKLSAgICBGVF9JbnQgICAgbGVuSVY7Ci0gICAgRlRfSW50ICAgIGxhbmd1YWdlX2dyb3VwOwotICAgIEZUX0ZpeGVkICBleHBhbnNpb25fZmFjdG9yOwotICAgIEZUX0xvbmcgICBpbml0aWFsX3JhbmRvbV9zZWVkOwotICAgIEZUX1VMb25nICBsb2NhbF9zdWJyc19vZmZzZXQ7Ci0gICAgRlRfUG9zICAgIGRlZmF1bHRfd2lkdGg7Ci0gICAgRlRfUG9zICAgIG5vbWluYWxfd2lkdGg7Ci0KLSAgfSBDRkZfUHJpdmF0ZVJlYywgKkNGRl9Qcml2YXRlOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9GRFNlbGVjdFJlY18KLSAgewotICAgIEZUX0J5dGUgICBmb3JtYXQ7Ci0gICAgRlRfVUludCAgIHJhbmdlX2NvdW50OwotCi0gICAgLyogdGhhdCdzIHRoZSB0YWJsZSwgdGFrZW4gZnJvbSB0aGUgZmlsZSBgYXMgaXMnICovCi0gICAgRlRfQnl0ZSogIGRhdGE7Ci0gICAgRlRfVUludCAgIGRhdGFfc2l6ZTsKLQotICAgIC8qIHNtYWxsIGNhY2hlIGZvciBmb3JtYXQgMyBvbmx5ICovCi0gICAgRlRfVUludCAgIGNhY2hlX2ZpcnN0OwotICAgIEZUX1VJbnQgICBjYWNoZV9jb3VudDsKLSAgICBGVF9CeXRlICAgY2FjaGVfZmQ7Ci0KLSAgfSBDRkZfRkRTZWxlY3RSZWMsICpDRkZfRkRTZWxlY3Q7Ci0KLQotICAvKiBBIFN1YkZvbnQgcGFja3MgYSBmb250IGRpY3QgYW5kIGEgcHJpdmF0ZSBkaWN0IHRvZ2V0aGVyLiAgVGhleSBhcmUgKi8KLSAgLyogbmVlZGVkIHRvIHN1cHBvcnQgQ0lELWtleWVkIENGRiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfU3ViRm9udFJlY18KLSAgewotICAgIENGRl9Gb250UmVjRGljdFJlYyAgZm9udF9kaWN0OwotICAgIENGRl9Qcml2YXRlUmVjICAgICAgcHJpdmF0ZV9kaWN0OwotCi0gICAgQ0ZGX0luZGV4UmVjICAgICAgICBsb2NhbF9zdWJyc19pbmRleDsKLSAgICBGVF9VSW50ICAgICAgICAgICAgIG51bV9sb2NhbF9zdWJyczsKLSAgICBGVF9CeXRlKiogICAgICAgICAgIGxvY2FsX3N1YnJzOwotCi0gIH0gQ0ZGX1N1YkZvbnRSZWMsICpDRkZfU3ViRm9udDsKLQotCi0gIC8qIG1heGltdW0gbnVtYmVyIG9mIHN1Yi1mb250cyBpbiBhIENJRC1rZXllZCBmaWxlICovCi0jZGVmaW5lIENGRl9NQVhfQ0lEX0ZPTlRTICAzMgotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9Gb250UmVjXwotICB7Ci0gICAgRlRfU3RyZWFtICAgICAgICBzdHJlYW07Ci0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnk7Ci0gICAgRlRfVUludCAgICAgICAgICBudW1fZmFjZXM7Ci0gICAgRlRfVUludCAgICAgICAgICBudW1fZ2x5cGhzOwotCi0gICAgRlRfQnl0ZSAgICAgICAgICB2ZXJzaW9uX21ham9yOwotICAgIEZUX0J5dGUgICAgICAgICAgdmVyc2lvbl9taW5vcjsKLSAgICBGVF9CeXRlICAgICAgICAgIGhlYWRlcl9zaXplOwotICAgIEZUX0J5dGUgICAgICAgICAgYWJzb2x1dGVfb2Zmc2l6ZTsKLQotCi0gICAgQ0ZGX0luZGV4UmVjICAgICBuYW1lX2luZGV4OwotICAgIENGRl9JbmRleFJlYyAgICAgdG9wX2RpY3RfaW5kZXg7Ci0gICAgQ0ZGX0luZGV4UmVjICAgICBzdHJpbmdfaW5kZXg7Ci0gICAgQ0ZGX0luZGV4UmVjICAgICBnbG9iYWxfc3VicnNfaW5kZXg7Ci0KLSAgICBDRkZfRW5jb2RpbmdSZWMgIGVuY29kaW5nOwotICAgIENGRl9DaGFyc2V0UmVjICAgY2hhcnNldDsKLQotICAgIENGRl9JbmRleFJlYyAgICAgY2hhcnN0cmluZ3NfaW5kZXg7Ci0gICAgQ0ZGX0luZGV4UmVjICAgICBmb250X2RpY3RfaW5kZXg7Ci0gICAgQ0ZGX0luZGV4UmVjICAgICBwcml2YXRlX2luZGV4OwotICAgIENGRl9JbmRleFJlYyAgICAgbG9jYWxfc3VicnNfaW5kZXg7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgIGZvbnRfbmFtZTsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9nbG9iYWxfc3VicnM7Ci0gICAgRlRfQnl0ZSoqICAgICAgICBnbG9iYWxfc3VicnM7Ci0KLSAgICBDRkZfU3ViRm9udFJlYyAgIHRvcF9mb250OwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX3N1YmZvbnRzOwotICAgIENGRl9TdWJGb250ICAgICAgc3ViZm9udHNbQ0ZGX01BWF9DSURfRk9OVFNdOwotCi0gICAgQ0ZGX0ZEU2VsZWN0UmVjICBmZF9zZWxlY3Q7Ci0KLSAgICAvKiBpbnRlcmZhY2UgdG8gUG9zdFNjcmlwdCBoaW50ZXIgKi8KLSAgICB2b2lkKiAgICAgICAgICAgIHBzaGludGVyOwotCi0gICAgLyogaW50ZXJmYWNlIHRvIFBvc3RzY3JpcHQgTmFtZXMgc2VydmljZSAqLwotICAgIHZvaWQqICAgICAgICAgICAgcHNuYW1lczsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4zLjAgKi8KLSAgICBQU19Gb250SW5mb1JlYyogIGZvbnRfaW5mbzsgICAvKiBmb250IGluZm8gZGljdGlvbmFyeSAqLwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjMuNiAqLwotICAgIEZUX1N0cmluZyogICAgICAgcmVnaXN0cnk7Ci0gICAgRlRfU3RyaW5nKiAgICAgICBvcmRlcmluZzsKLSAgICAgIAotICB9IENGRl9Gb250UmVjLCAqQ0ZGX0ZvbnQ7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19DRkZUWVBFU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9hZm1wYXJzZS5jIGIvc3JjL3BzYXV4L2FmbXBhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjhmZTYuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L2FmbXBhcnNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZtcGFyc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFGTSBwYXJzZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJhZm1wYXJzZS5oIgotI2luY2x1ZGUgInBzY29udi5oIgotCi0jaW5jbHVkZSAicHNhdXhlcnIuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFGTV9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHVzZSBvZiBBRk1fU3RyZWFtIGlzIGxhcmdlbHkgaW5zcGlyZWQgYnkgcGFyc2VBRk0uW2NoXSBmcm9tIHQxbGliLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIGVudW0KLSAgewotICAgIEFGTV9TVFJFQU1fU1RBVFVTX05PUk1BTCwKLSAgICBBRk1fU1RSRUFNX1NUQVRVU19FT0MsCi0gICAgQUZNX1NUUkVBTV9TVEFUVVNfRU9MLAotICAgIEFGTV9TVFJFQU1fU1RBVFVTX0VPRgotICB9OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9TdHJlYW1SZWNfCi0gIHsKLSAgICBGVF9CeXRlKiAgY3Vyc29yOwotICAgIEZUX0J5dGUqICBiYXNlOwotICAgIEZUX0J5dGUqICBsaW1pdDsKLQotICAgIEZUX0ludCAgICBzdGF0dXM7Ci0KLSAgfSBBRk1fU3RyZWFtUmVjOwotCi0KLSNpZm5kZWYgRU9GCi0jZGVmaW5lIEVPRiAtMQotI2VuZGlmCi0KLQotICAvKiB0aGlzIHdvcmtzIGJlY2F1c2UgZW1wdHkgbGluZXMgYXJlIGlnbm9yZWQgKi8KLSNkZWZpbmUgQUZNX0lTX05FV0xJTkUoIGNoICkgICggKGNoKSA9PSAnXHInIHx8IChjaCkgPT0gJ1xuJyApCi0KLSNkZWZpbmUgQUZNX0lTX0VPRiggY2ggKSAgICAgICggKGNoKSA9PSBFT0YgIHx8IChjaCkgPT0gJ1x4MWEnICkKLSNkZWZpbmUgQUZNX0lTX1NQQUNFKCBjaCApICAgICggKGNoKSA9PSAnICcgIHx8IChjaCkgPT0gJ1x0JyApCi0KLSAgLyogY29sdW1uIHNlcGFyYXRvcjsgdGhlcmUgaXMgbm8gYGNvbHVtbicgaW4gdGhlIHNwZWMgYWN0dWFsbHkgKi8KLSNkZWZpbmUgQUZNX0lTX1NFUCggY2ggKSAgICAgICggKGNoKSA9PSAnOycgKQotCi0jZGVmaW5lIEFGTV9HRVRDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKCAoc3RyZWFtKS0+Y3Vyc29yIDwgKHN0cmVhbSktPmxpbWl0ICkgPyAqKHN0cmVhbSktPmN1cnNvcisrIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRU9GICkKLQotI2RlZmluZSBBRk1fU1RSRUFNX0tFWV9CRUdJTiggc3RyZWFtICkgICAgXAotICAgICAgICAgIChjaGFyKikoIChzdHJlYW0pLT5jdXJzb3IgLSAxICkKLQotI2RlZmluZSBBRk1fU1RSRUFNX0tFWV9MRU4oIHN0cmVhbSwga2V5ICkgICAgICAgXAotICAgICAgICAgICggKGNoYXIqKShzdHJlYW0pLT5jdXJzb3IgLSBrZXkgLSAxICkKLQotI2RlZmluZSBBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgXAotICAgICAgICAgICggKHN0cmVhbSktPnN0YXR1cyA+PSBBRk1fU1RSRUFNX1NUQVRVU19FT0MgKQotCi0jZGVmaW5lIEFGTV9TVEFUVVNfRU9MKCBzdHJlYW0gKSBcCi0gICAgICAgICAgKCAoc3RyZWFtKS0+c3RhdHVzID49IEFGTV9TVFJFQU1fU1RBVFVTX0VPTCApCi0KLSNkZWZpbmUgQUZNX1NUQVRVU19FT0YoIHN0cmVhbSApIFwKLSAgICAgICAgICAoIChzdHJlYW0pLT5zdGF0dXMgPj0gQUZNX1NUUkVBTV9TVEFUVVNfRU9GICkKLQotCi0gIHN0YXRpYyBpbnQKLSAgYWZtX3N0cmVhbV9za2lwX3NwYWNlcyggQUZNX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIGludCAgY2ggPSAwOyAgLyogbWFrZSBzdHVwaWQgY29tcGlsZXIgaGFwcHkgKi8KLQotCi0gICAgaWYgKCBBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgKQotICAgICAgcmV0dXJuICc7JzsKLQotICAgIHdoaWxlICggMSApCi0gICAgewotICAgICAgY2ggPSBBRk1fR0VUQygpOwotICAgICAgaWYgKCAhQUZNX0lTX1NQQUNFKCBjaCApICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCBBRk1fSVNfTkVXTElORSggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPTDsKLSAgICBlbHNlIGlmICggQUZNX0lTX1NFUCggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPQzsKLSAgICBlbHNlIGlmICggQUZNX0lTX0VPRiggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPRjsKLQotICAgIHJldHVybiBjaDsKLSAgfQotCi0KLSAgLyogcmVhZCBhIGtleSBvciB2YWx1ZSBpbiBjdXJyZW50IGNvbHVtbiAqLwotICBzdGF0aWMgY2hhcioKLSAgYWZtX3N0cmVhbV9yZWFkX29uZSggQUZNX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIGNoYXIqICBzdHI7Ci0gICAgaW50ICAgIGNoOwotCi0KLSAgICBhZm1fc3RyZWFtX3NraXBfc3BhY2VzKCBzdHJlYW0gKTsKLSAgICBpZiAoIEFGTV9TVEFUVVNfRU9DKCBzdHJlYW0gKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIHN0ciA9IEFGTV9TVFJFQU1fS0VZX0JFR0lOKCBzdHJlYW0gKTsKLQotICAgIHdoaWxlICggMSApCi0gICAgewotICAgICAgY2ggPSBBRk1fR0VUQygpOwotICAgICAgaWYgKCBBRk1fSVNfU1BBQ0UoIGNoICkgKQotICAgICAgICBicmVhazsKLSAgICAgIGVsc2UgaWYgKCBBRk1fSVNfTkVXTElORSggY2ggKSApCi0gICAgICB7Ci0gICAgICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfRU9MOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBBRk1fSVNfU0VQKCBjaCApICkKLSAgICAgIHsKLSAgICAgICAgc3RyZWFtLT5zdGF0dXMgPSBBRk1fU1RSRUFNX1NUQVRVU19FT0M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIEFGTV9JU19FT0YoIGNoICkgKQotICAgICAgewotICAgICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPRjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0cjsKLSAgfQotCi0KLSAgLyogcmVhZCBhIHN0cmluZyAoaS5lLiwgcmVhZCB0byBFT0wpICovCi0gIHN0YXRpYyBjaGFyKgotICBhZm1fc3RyZWFtX3JlYWRfc3RyaW5nKCBBRk1fU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgY2hhciogIHN0cjsKLSAgICBpbnQgICAgY2g7Ci0KLQotICAgIGFmbV9zdHJlYW1fc2tpcF9zcGFjZXMoIHN0cmVhbSApOwotICAgIGlmICggQUZNX1NUQVRVU19FT0woIHN0cmVhbSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgc3RyID0gQUZNX1NUUkVBTV9LRVlfQkVHSU4oIHN0cmVhbSApOwotCi0gICAgLyogc2NhbiB0byBlb2wgKi8KLSAgICB3aGlsZSAoIDEgKQotICAgIHsKLSAgICAgIGNoID0gQUZNX0dFVEMoKTsKLSAgICAgIGlmICggQUZNX0lTX05FV0xJTkUoIGNoICkgKQotICAgICAgewotICAgICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggQUZNX0lTX0VPRiggY2ggKSApCi0gICAgICB7Ci0gICAgICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfRU9GOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFGTV9QYXJzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogYWxsIGtleXMgZGVmaW5lZCBpbiBDaC4gNy0xMCBvZiA1MDA0LkFGTV9TcGVjLnBkZiAqLwotICB0eXBlZGVmIGVudW0gIEFGTV9Ub2tlbl8KLSAgewotICAgIEFGTV9UT0tFTl9BU0NFTkRFUiwKLSAgICBBRk1fVE9LRU5fQVhJU0xBQkVMLAotICAgIEFGTV9UT0tFTl9BWElTVFlQRSwKLSAgICBBRk1fVE9LRU5fQiwKLSAgICBBRk1fVE9LRU5fQkxFTkRBWElTVFlQRVMsCi0gICAgQUZNX1RPS0VOX0JMRU5EREVTSUdOTUFQLAotICAgIEFGTV9UT0tFTl9CTEVORERFU0lHTlBPU0lUSU9OUywKLSAgICBBRk1fVE9LRU5fQywKLSAgICBBRk1fVE9LRU5fQ0MsCi0gICAgQUZNX1RPS0VOX0NILAotICAgIEFGTV9UT0tFTl9DQVBIRUlHSFQsCi0gICAgQUZNX1RPS0VOX0NIQVJXSURUSCwKLSAgICBBRk1fVE9LRU5fQ0hBUkFDVEVSU0VULAotICAgIEFGTV9UT0tFTl9DSEFSQUNURVJTLAotICAgIEFGTV9UT0tFTl9ERVNDRU5ERVIsCi0gICAgQUZNX1RPS0VOX0VOQ09ESU5HU0NIRU1FLAotICAgIEFGTV9UT0tFTl9FTkRBWElTLAotICAgIEFGTV9UT0tFTl9FTkRDSEFSTUVUUklDUywKLSAgICBBRk1fVE9LRU5fRU5EQ09NUE9TSVRFUywKLSAgICBBRk1fVE9LRU5fRU5ERElSRUNUSU9OLAotICAgIEFGTV9UT0tFTl9FTkRGT05UTUVUUklDUywKLSAgICBBRk1fVE9LRU5fRU5ES0VSTkRBVEEsCi0gICAgQUZNX1RPS0VOX0VOREtFUk5QQUlSUywKLSAgICBBRk1fVE9LRU5fRU5EVFJBQ0tLRVJOLAotICAgIEFGTV9UT0tFTl9FU0NDSEFSLAotICAgIEFGTV9UT0tFTl9GQU1JTFlOQU1FLAotICAgIEFGTV9UT0tFTl9GT05UQkJPWCwKLSAgICBBRk1fVE9LRU5fRk9OVE5BTUUsCi0gICAgQUZNX1RPS0VOX0ZVTExOQU1FLAotICAgIEFGTV9UT0tFTl9JU0JBU0VGT05ULAotICAgIEFGTV9UT0tFTl9JU0NJREZPTlQsCi0gICAgQUZNX1RPS0VOX0lTRklYRURQSVRDSCwKLSAgICBBRk1fVE9LRU5fSVNGSVhFRFYsCi0gICAgQUZNX1RPS0VOX0lUQUxJQ0FOR0xFLAotICAgIEFGTV9UT0tFTl9LUCwKLSAgICBBRk1fVE9LRU5fS1BILAotICAgIEFGTV9UT0tFTl9LUFgsCi0gICAgQUZNX1RPS0VOX0tQWSwKLSAgICBBRk1fVE9LRU5fTCwKLSAgICBBRk1fVE9LRU5fTUFQUElOR1NDSEVNRSwKLSAgICBBRk1fVE9LRU5fTUVUUklDU1NFVFMsCi0gICAgQUZNX1RPS0VOX04sCi0gICAgQUZNX1RPS0VOX05PVElDRSwKLSAgICBBRk1fVE9LRU5fUENDLAotICAgIEFGTV9UT0tFTl9TVEFSVEFYSVMsCi0gICAgQUZNX1RPS0VOX1NUQVJUQ0hBUk1FVFJJQ1MsCi0gICAgQUZNX1RPS0VOX1NUQVJUQ09NUE9TSVRFUywKLSAgICBBRk1fVE9LRU5fU1RBUlRESVJFQ1RJT04sCi0gICAgQUZNX1RPS0VOX1NUQVJURk9OVE1FVFJJQ1MsCi0gICAgQUZNX1RPS0VOX1NUQVJUS0VSTkRBVEEsCi0gICAgQUZNX1RPS0VOX1NUQVJUS0VSTlBBSVJTLAotICAgIEFGTV9UT0tFTl9TVEFSVEtFUk5QQUlSUzAsCi0gICAgQUZNX1RPS0VOX1NUQVJUS0VSTlBBSVJTMSwKLSAgICBBRk1fVE9LRU5fU1RBUlRUUkFDS0tFUk4sCi0gICAgQUZNX1RPS0VOX1NUREhXLAotICAgIEFGTV9UT0tFTl9TVERWVywKLSAgICBBRk1fVE9LRU5fVFJBQ0tLRVJOLAotICAgIEFGTV9UT0tFTl9VTkRFUkxJTkVQT1NJVElPTiwKLSAgICBBRk1fVE9LRU5fVU5ERVJMSU5FVEhJQ0tORVNTLAotICAgIEFGTV9UT0tFTl9WViwKLSAgICBBRk1fVE9LRU5fVlZFQ1RPUiwKLSAgICBBRk1fVE9LRU5fVkVSU0lPTiwKLSAgICBBRk1fVE9LRU5fVywKLSAgICBBRk1fVE9LRU5fVzAsCi0gICAgQUZNX1RPS0VOX1cwWCwKLSAgICBBRk1fVE9LRU5fVzBZLAotICAgIEFGTV9UT0tFTl9XMSwKLSAgICBBRk1fVE9LRU5fVzFYLAotICAgIEFGTV9UT0tFTl9XMVksCi0gICAgQUZNX1RPS0VOX1dYLAotICAgIEFGTV9UT0tFTl9XWSwKLSAgICBBRk1fVE9LRU5fV0VJR0hULAotICAgIEFGTV9UT0tFTl9XRUlHSFRWRUNUT1IsCi0gICAgQUZNX1RPS0VOX1hIRUlHSFQsCi0gICAgTl9BRk1fVE9LRU5TLAotICAgIEFGTV9UT0tFTl9VTktOT1dOCi0KLSAgfSBBRk1fVG9rZW47Ci0KLQotICBzdGF0aWMgY29uc3QgY2hhciogIGNvbnN0IGFmbV9rZXlfdGFibGVbTl9BRk1fVE9LRU5TXSA9Ci0gIHsKLSAgICAiQXNjZW5kZXIiLAotICAgICJBeGlzTGFiZWwiLAotICAgICJBeGlzVHlwZSIsCi0gICAgIkIiLAotICAgICJCbGVuZEF4aXNUeXBlcyIsCi0gICAgIkJsZW5kRGVzaWduTWFwIiwKLSAgICAiQmxlbmREZXNpZ25Qb3NpdGlvbnMiLAotICAgICJDIiwKLSAgICAiQ0MiLAotICAgICJDSCIsCi0gICAgIkNhcEhlaWdodCIsCi0gICAgIkNoYXJXaWR0aCIsCi0gICAgIkNoYXJhY3RlclNldCIsCi0gICAgIkNoYXJhY3RlcnMiLAotICAgICJEZXNjZW5kZXIiLAotICAgICJFbmNvZGluZ1NjaGVtZSIsCi0gICAgIkVuZEF4aXMiLAotICAgICJFbmRDaGFyTWV0cmljcyIsCi0gICAgIkVuZENvbXBvc2l0ZXMiLAotICAgICJFbmREaXJlY3Rpb24iLAotICAgICJFbmRGb250TWV0cmljcyIsCi0gICAgIkVuZEtlcm5EYXRhIiwKLSAgICAiRW5kS2VyblBhaXJzIiwKLSAgICAiRW5kVHJhY2tLZXJuIiwKLSAgICAiRXNjQ2hhciIsCi0gICAgIkZhbWlseU5hbWUiLAotICAgICJGb250QkJveCIsCi0gICAgIkZvbnROYW1lIiwKLSAgICAiRnVsbE5hbWUiLAotICAgICJJc0Jhc2VGb250IiwKLSAgICAiSXNDSURGb250IiwKLSAgICAiSXNGaXhlZFBpdGNoIiwKLSAgICAiSXNGaXhlZFYiLAotICAgICJJdGFsaWNBbmdsZSIsCi0gICAgIktQIiwKLSAgICAiS1BIIiwKLSAgICAiS1BYIiwKLSAgICAiS1BZIiwKLSAgICAiTCIsCi0gICAgIk1hcHBpbmdTY2hlbWUiLAotICAgICJNZXRyaWNzU2V0cyIsCi0gICAgIk4iLAotICAgICJOb3RpY2UiLAotICAgICJQQ0MiLAotICAgICJTdGFydEF4aXMiLAotICAgICJTdGFydENoYXJNZXRyaWNzIiwKLSAgICAiU3RhcnRDb21wb3NpdGVzIiwKLSAgICAiU3RhcnREaXJlY3Rpb24iLAotICAgICJTdGFydEZvbnRNZXRyaWNzIiwKLSAgICAiU3RhcnRLZXJuRGF0YSIsCi0gICAgIlN0YXJ0S2VyblBhaXJzIiwKLSAgICAiU3RhcnRLZXJuUGFpcnMwIiwKLSAgICAiU3RhcnRLZXJuUGFpcnMxIiwKLSAgICAiU3RhcnRUcmFja0tlcm4iLAotICAgICJTdGRIVyIsCi0gICAgIlN0ZFZXIiwKLSAgICAiVHJhY2tLZXJuIiwKLSAgICAiVW5kZXJsaW5lUG9zaXRpb24iLAotICAgICJVbmRlcmxpbmVUaGlja25lc3MiLAotICAgICJWViIsCi0gICAgIlZWZWN0b3IiLAotICAgICJWZXJzaW9uIiwKLSAgICAiVyIsCi0gICAgIlcwIiwKLSAgICAiVzBYIiwKLSAgICAiVzBZIiwKLSAgICAiVzEiLAotICAgICJXMVgiLAotICAgICJXMVkiLAotICAgICJXWCIsCi0gICAgIldZIiwKLSAgICAiV2VpZ2h0IiwKLSAgICAiV2VpZ2h0VmVjdG9yIiwKLSAgICAiWEhlaWdodCIKLSAgfTsKLQotCi0gIC8qCi0gICAqIGBhZm1fcGFyc2VyX3JlYWRfdmFscycgYW5kIGBhZm1fcGFyc2VyX25leHRfa2V5JyBwcm92aWRlCi0gICAqIGhpZ2gtbGV2ZWwgb3BlcmF0aW9ucyB0byBhbiBBRk1fU3RyZWFtLiAgVGhlIHJlc3Qgb2YgdGhlCi0gICAqIHBhcnNlciBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0aGVtIHdpdGhvdXQgYWNjZXNzaW5nIHRoZQotICAgKiBBRk1fU3RyZWFtIGRpcmVjdGx5LgotICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCi0gIGFmbV9wYXJzZXJfcmVhZF92YWxzKCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBRk1fVmFsdWUgICB2YWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgbiApCi0gIHsKLSAgICBBRk1fU3RyZWFtICBzdHJlYW0gPSBwYXJzZXItPnN0cmVhbTsKLSAgICBjaGFyKiAgICAgICBzdHI7Ci0gICAgRlRfSW50ICAgICAgaTsKLQotCi0gICAgaWYgKCBuID4gQUZNX01BWF9BUkdVTUVOVFMgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG47IGkrKyApCi0gICAgewotICAgICAgRlRfVUludCAgICBsZW47Ci0gICAgICBBRk1fVmFsdWUgIHZhbCA9IHZhbHMgKyBpOwotCi0KLSAgICAgIGlmICggdmFsLT50eXBlID09IEFGTV9WQUxVRV9UWVBFX1NUUklORyApCi0gICAgICAgIHN0ciA9IGFmbV9zdHJlYW1fcmVhZF9zdHJpbmcoIHN0cmVhbSApOwotICAgICAgZWxzZQotICAgICAgICBzdHIgPSBhZm1fc3RyZWFtX3JlYWRfb25lKCBzdHJlYW0gKTsKLQotICAgICAgaWYgKCAhc3RyICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGxlbiA9IEFGTV9TVFJFQU1fS0VZX0xFTiggc3RyZWFtLCBzdHIgKTsKLQotICAgICAgc3dpdGNoICggdmFsLT50eXBlICkKLSAgICAgIHsKLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfU1RSSU5HOgotICAgICAgY2FzZSBBRk1fVkFMVUVfVFlQRV9OQU1FOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPm1lbW9yeTsKLSAgICAgICAgICBGVF9FcnJvciAgIGVycm9yOwotCi0KLSAgICAgICAgICBpZiAoICFGVF9RQUxMT0MoIHZhbC0+dS5zLCBsZW4gKyAxICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZ0X21lbWNweSggdmFsLT51LnMsIHN0ciwgbGVuICk7Ci0gICAgICAgICAgICB2YWwtPnUuc1tsZW5dID0gJ1wwJzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfRklYRUQ6Ci0gICAgICAgIHZhbC0+dS5mID0gUFNfQ29udl9Ub0ZpeGVkKCAoRlRfQnl0ZSoqKSh2b2lkKikmc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKXN0ciArIGxlbiwgMCApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVkFMVUVfVFlQRV9JTlRFR0VSOgotICAgICAgICB2YWwtPnUuaSA9IFBTX0NvbnZfVG9JbnQoIChGVF9CeXRlKiopKHZvaWQqKSZzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKXN0ciArIGxlbiApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVkFMVUVfVFlQRV9CT09MOgotICAgICAgICB2YWwtPnUuYiA9IEZUX0JPT0woIGxlbiA9PSA0ICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ0X3N0cm5jbXAoIHN0ciwgInRydWUiLCA0ICkgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfSU5ERVg6Ci0gICAgICAgIGlmICggcGFyc2VyLT5nZXRfaW5kZXggKQotICAgICAgICAgIHZhbC0+dS5pID0gcGFyc2VyLT5nZXRfaW5kZXgoIHN0ciwgbGVuLCBwYXJzZXItPnVzZXJfZGF0YSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdmFsLT51LmkgPSAwOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBjaGFyKiApCi0gIGFmbV9wYXJzZXJfbmV4dF9rZXkoIEFGTV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCogICAgbGVuICkKLSAgewotICAgIEFGTV9TdHJlYW0gIHN0cmVhbSA9IHBhcnNlci0+c3RyZWFtOwotICAgIGNoYXIqICAgICAgIGtleSAgICA9IDA7ICAvKiBtYWtlIHN0dXBpZCBjb21waWxlciBoYXBweSAqLwotCi0KLSAgICBpZiAoIGxpbmUgKQotICAgIHsKLSAgICAgIHdoaWxlICggMSApCi0gICAgICB7Ci0gICAgICAgIC8qIHNraXAgY3VycmVudCBsaW5lICovCi0gICAgICAgIGlmICggIUFGTV9TVEFUVVNfRU9MKCBzdHJlYW0gKSApCi0gICAgICAgICAgYWZtX3N0cmVhbV9yZWFkX3N0cmluZyggc3RyZWFtICk7Ci0KLSAgICAgICAgc3RyZWFtLT5zdGF0dXMgPSBBRk1fU1RSRUFNX1NUQVRVU19OT1JNQUw7Ci0gICAgICAgIGtleSA9IGFmbV9zdHJlYW1fcmVhZF9vbmUoIHN0cmVhbSApOwotCi0gICAgICAgIC8qIHNraXAgZW1wdHkgbGluZSAqLwotICAgICAgICBpZiAoICFrZXkgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAhQUZNX1NUQVRVU19FT0YoIHN0cmVhbSApICYmCi0gICAgICAgICAgICAgQUZNX1NUQVRVU19FT0woIHN0cmVhbSApICApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoIDEgKQotICAgICAgewotICAgICAgICAvKiBza2lwIGN1cnJlbnQgY29sdW1uICovCi0gICAgICAgIHdoaWxlICggIUFGTV9TVEFUVVNfRU9DKCBzdHJlYW0gKSApCi0gICAgICAgICAgYWZtX3N0cmVhbV9yZWFkX29uZSggc3RyZWFtICk7Ci0KLSAgICAgICAgc3RyZWFtLT5zdGF0dXMgPSBBRk1fU1RSRUFNX1NUQVRVU19OT1JNQUw7Ci0gICAgICAgIGtleSA9IGFmbV9zdHJlYW1fcmVhZF9vbmUoIHN0cmVhbSApOwotCi0gICAgICAgIC8qIHNraXAgZW1wdHkgY29sdW1uICovCi0gICAgICAgIGlmICggIWtleSAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICFBRk1fU1RBVFVTX0VPRiggc3RyZWFtICkgJiYKLSAgICAgICAgICAgICBBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGxlbiApCi0gICAgICAqbGVuID0gKCBrZXkgKSA/IEFGTV9TVFJFQU1fS0VZX0xFTiggc3RyZWFtLCBrZXkgKQotICAgICAgICAgICAgICAgICAgICAgOiAwOwotCi0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0KLSAgc3RhdGljIEFGTV9Ub2tlbgotICBhZm1fdG9rZW5pemUoIGNvbnN0IGNoYXIqICBrZXksCi0gICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGxlbiApCi0gIHsKLSAgICBpbnQgIG47Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgTl9BRk1fVE9LRU5TOyBuKysgKQotICAgIHsKLSAgICAgIGlmICggKiggYWZtX2tleV90YWJsZVtuXSApID09ICprZXkgKQotICAgICAgewotICAgICAgICBmb3IgKCA7IG4gPCBOX0FGTV9UT0tFTlM7IG4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICooIGFmbV9rZXlfdGFibGVbbl0gKSAhPSAqa2V5ICkKLSAgICAgICAgICAgIHJldHVybiBBRk1fVE9LRU5fVU5LTk9XTjsKLQotICAgICAgICAgIGlmICggZnRfc3RybmNtcCggYWZtX2tleV90YWJsZVtuXSwga2V5LCBsZW4gKSA9PSAwICkKLSAgICAgICAgICAgIHJldHVybiAoQUZNX1Rva2VuKSBuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEFGTV9UT0tFTl9VTktOT1dOOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZtX3BhcnNlcl9pbml0KCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKQotICB7Ci0gICAgQUZNX1N0cmVhbSAgc3RyZWFtOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0KLSAgICBpZiAoIEZUX05FVyggc3RyZWFtICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgc3RyZWFtLT5jdXJzb3IgPSBzdHJlYW0tPmJhc2UgPSBiYXNlOwotICAgIHN0cmVhbS0+bGltaXQgID0gbGltaXQ7Ci0KLSAgICAvKiBkb24ndCBza2lwIHRoZSBmaXJzdCBsaW5lIGR1cmluZyB0aGUgZmlyc3QgY2FsbCAqLwotICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfRU9MOwotCi0gICAgcGFyc2VyLT5tZW1vcnkgICAgPSBtZW1vcnk7Ci0gICAgcGFyc2VyLT5zdHJlYW0gICAgPSBzdHJlYW07Ci0gICAgcGFyc2VyLT5Gb250SW5mbyAgPSBOVUxMOwotICAgIHBhcnNlci0+Z2V0X2luZGV4ID0gTlVMTDsKLQotICAgIHJldHVybiBQU2F1eF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZtX3BhcnNlcl9kb25lKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggcGFyc2VyLT5zdHJlYW0gKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmbV9wYXJzZXJfcmVhZF9pbnQoIEFGTV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgICAgYWludCApCi0gIHsKLSAgICBBRk1fVmFsdWVSZWMgIHZhbDsKLQotCi0gICAgdmFsLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9JTlRFR0VSOwotCi0gICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfdmFscyggcGFyc2VyLCAmdmFsLCAxICkgPT0gMSApCi0gICAgewotICAgICAgKmFpbnQgPSB2YWwudS5pOwotCi0gICAgICByZXR1cm4gUFNhdXhfRXJyX09rOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gUFNhdXhfRXJyX1N5bnRheF9FcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmbV9wYXJzZV90cmFja19rZXJuKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgQUZNX0ZvbnRJbmZvICAgZmkgPSBwYXJzZXItPkZvbnRJbmZvOwotICAgIEFGTV9UcmFja0tlcm4gIHRrOwotICAgIGNoYXIqICAgICAgICAgIGtleTsKLSAgICBGVF9VSW50ICAgICAgICBsZW47Ci0gICAgaW50ICAgICAgICAgICAgbiA9IC0xOwotCi0KLSAgICBpZiAoIGFmbV9wYXJzZXJfcmVhZF9pbnQoIHBhcnNlciwgJmZpLT5OdW1UcmFja0tlcm4gKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgIGlmICggZmktPk51bVRyYWNrS2VybiApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPm1lbW9yeTsKLSAgICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgICAgaWYgKCBGVF9RTkVXX0FSUkFZKCBmaS0+VHJhY2tLZXJucywgZmktPk51bVRyYWNrS2VybiApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIHdoaWxlICggKCBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsICZsZW4gKSApICE9IDAgKQotICAgIHsKLSAgICAgIEFGTV9WYWx1ZVJlYyAgc2hhcmVkX3ZhbHNbNV07Ci0KLQotICAgICAgc3dpdGNoICggYWZtX3Rva2VuaXplKCBrZXksIGxlbiApICkKLSAgICAgIHsKLSAgICAgIGNhc2UgQUZNX1RPS0VOX1RSQUNLS0VSTjoKLSAgICAgICAgbisrOwotCi0gICAgICAgIGlmICggbiA+PSBmaS0+TnVtVHJhY2tLZXJuICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgdGsgPSBmaS0+VHJhY2tLZXJucyArIG47Ci0KLSAgICAgICAgc2hhcmVkX3ZhbHNbMF0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0lOVEVHRVI7Ci0gICAgICAgIHNoYXJlZF92YWxzWzFdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9GSVhFRDsKLSAgICAgICAgc2hhcmVkX3ZhbHNbMl0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBzaGFyZWRfdmFsc1szXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIHNoYXJlZF92YWxzWzRdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9GSVhFRDsKLSAgICAgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfdmFscyggcGFyc2VyLCBzaGFyZWRfdmFscywgNSApICE9IDUgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICB0ay0+ZGVncmVlICAgICA9IHNoYXJlZF92YWxzWzBdLnUuaTsKLSAgICAgICAgdGstPm1pbl9wdHNpemUgPSBzaGFyZWRfdmFsc1sxXS51LmY7Ci0gICAgICAgIHRrLT5taW5fa2VybiAgID0gc2hhcmVkX3ZhbHNbMl0udS5mOwotICAgICAgICB0ay0+bWF4X3B0c2l6ZSA9IHNoYXJlZF92YWxzWzNdLnUuZjsKLSAgICAgICAgdGstPm1heF9rZXJuICAgPSBzaGFyZWRfdmFsc1s0XS51LmY7Ci0KLSAgICAgICAgLyogaXMgdGhpcyBjb3JyZWN0PyAqLwotICAgICAgICBpZiAoIHRrLT5kZWdyZWUgPCAwICYmIHRrLT5taW5fa2VybiA+IDAgKQotICAgICAgICAgIHRrLT5taW5fa2VybiA9IC10ay0+bWluX2tlcm47Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRUUkFDS0tFUk46Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRLRVJOREFUQToKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTOgotICAgICAgICBmaS0+TnVtVHJhY2tLZXJuID0gbiArIDE7Ci0gICAgICAgIHJldHVybiBQU2F1eF9FcnJfT2s7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX1VOS05PV046Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIFBTYXV4X0Vycl9TeW50YXhfRXJyb3I7Ci0gIH0KLQotCi0jdW5kZWYgIEtFUk5fSU5ERVgKLSNkZWZpbmUgS0VSTl9JTkRFWCggZzEsIGcyICkgICggKCAoRlRfVUxvbmcpZzEgPDwgMTYgKSB8IGcyICkKLQotCi0gIC8qIGNvbXBhcmUgdHdvIGtlcm5pbmcgcGFpcnMgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQotICBhZm1fY29tcGFyZV9rZXJuX3BhaXJzKCBjb25zdCB2b2lkKiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIGIgKQotICB7Ci0gICAgQUZNX0tlcm5QYWlyICBrcDEgPSAoQUZNX0tlcm5QYWlyKWE7Ci0gICAgQUZNX0tlcm5QYWlyICBrcDIgPSAoQUZNX0tlcm5QYWlyKWI7Ci0KLSAgICBGVF9VTG9uZyAgaW5kZXgxID0gS0VSTl9JTkRFWCgga3AxLT5pbmRleDEsIGtwMS0+aW5kZXgyICk7Ci0gICAgRlRfVUxvbmcgIGluZGV4MiA9IEtFUk5fSU5ERVgoIGtwMi0+aW5kZXgxLCBrcDItPmluZGV4MiApOwotCi0KLSAgICByZXR1cm4gKGludCkoIGluZGV4MSAtIGluZGV4MiApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZtX3BhcnNlX2tlcm5fcGFpcnMoIEFGTV9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBBRk1fRm9udEluZm8gIGZpID0gcGFyc2VyLT5Gb250SW5mbzsKLSAgICBBRk1fS2VyblBhaXIgIGtwOwotICAgIGNoYXIqICAgICAgICAga2V5OwotICAgIEZUX1VJbnQgICAgICAgbGVuOwotICAgIGludCAgICAgICAgICAgbiA9IC0xOwotCi0KLSAgICBpZiAoIGFmbV9wYXJzZXJfcmVhZF9pbnQoIHBhcnNlciwgJmZpLT5OdW1LZXJuUGFpciApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGlmICggZmktPk51bUtlcm5QYWlyICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+bWVtb3J5OwotICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLQotCi0gICAgICBpZiAoIEZUX1FORVdfQVJSQVkoIGZpLT5LZXJuUGFpcnMsIGZpLT5OdW1LZXJuUGFpciApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIHdoaWxlICggKCBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsICZsZW4gKSApICE9IDAgKQotICAgIHsKLSAgICAgIEFGTV9Ub2tlbiAgdG9rZW4gPSBhZm1fdG9rZW5pemUoIGtleSwgbGVuICk7Ci0KLQotICAgICAgc3dpdGNoICggdG9rZW4gKQotICAgICAgewotICAgICAgY2FzZSBBRk1fVE9LRU5fS1A6Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9LUFg6Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9LUFk6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgICAgICAgIHI7Ci0gICAgICAgICAgQUZNX1ZhbHVlUmVjICBzaGFyZWRfdmFsc1s0XTsKLQotCi0gICAgICAgICAgbisrOwotCi0gICAgICAgICAgaWYgKCBuID49IGZpLT5OdW1LZXJuUGFpciApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICBrcCA9IGZpLT5LZXJuUGFpcnMgKyBuOwotCi0gICAgICAgICAgc2hhcmVkX3ZhbHNbMF0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0lOREVYOwotICAgICAgICAgIHNoYXJlZF92YWxzWzFdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9JTkRFWDsKLSAgICAgICAgICBzaGFyZWRfdmFsc1syXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfSU5URUdFUjsKLSAgICAgICAgICBzaGFyZWRfdmFsc1szXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfSU5URUdFUjsKLSAgICAgICAgICByID0gYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDQgKTsKLSAgICAgICAgICBpZiAoIHIgPCAzICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIGtwLT5pbmRleDEgPSBzaGFyZWRfdmFsc1swXS51Lmk7Ci0gICAgICAgICAga3AtPmluZGV4MiA9IHNoYXJlZF92YWxzWzFdLnUuaTsKLSAgICAgICAgICBpZiAoIHRva2VuID09IEFGTV9UT0tFTl9LUFkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGtwLT54ID0gMDsKLSAgICAgICAgICAgIGtwLT55ID0gc2hhcmVkX3ZhbHNbMl0udS5pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAga3AtPnggPSBzaGFyZWRfdmFsc1syXS51Lmk7Ci0gICAgICAgICAgICBrcC0+eSA9ICggdG9rZW4gPT0gQUZNX1RPS0VOX0tQICYmIHIgPT0gNCApCi0gICAgICAgICAgICAgICAgICAgICAgPyBzaGFyZWRfdmFsc1szXS51LmkgOiAwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVE9LRU5fRU5ES0VSTlBBSVJTOgotICAgICAgY2FzZSBBRk1fVE9LRU5fRU5ES0VSTkRBVEE6Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRGT05UTUVUUklDUzoKLSAgICAgICAgZmktPk51bUtlcm5QYWlyID0gbiArIDE7Ci0gICAgICAgIGZ0X3Fzb3J0KCBmaS0+S2VyblBhaXJzLCBmaS0+TnVtS2VyblBhaXIsCi0gICAgICAgICAgICAgICAgICBzaXplb2YoIEFGTV9LZXJuUGFpclJlYyApLAotICAgICAgICAgICAgICAgICAgYWZtX2NvbXBhcmVfa2Vybl9wYWlycyApOwotICAgICAgICByZXR1cm4gUFNhdXhfRXJyX09rOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9VTktOT1dOOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBQU2F1eF9FcnJfU3ludGF4X0Vycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgYWZtX3BhcnNlX2tlcm5fZGF0YSggQUZNX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBjaGFyKiAgICAga2V5OwotICAgIEZUX1VJbnQgICBsZW47Ci0KLQotICAgIHdoaWxlICggKCBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsICZsZW4gKSApICE9IDAgKQotICAgIHsKLSAgICAgIHN3aXRjaCAoIGFmbV90b2tlbml6ZSgga2V5LCBsZW4gKSApCi0gICAgICB7Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9TVEFSVFRSQUNLS0VSTjoKLSAgICAgICAgZXJyb3IgPSBhZm1fcGFyc2VfdHJhY2tfa2VybiggcGFyc2VyICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX1NUQVJUS0VSTlBBSVJTOgotICAgICAgY2FzZSBBRk1fVE9LRU5fU1RBUlRLRVJOUEFJUlMwOgotICAgICAgICBlcnJvciA9IGFmbV9wYXJzZV9rZXJuX3BhaXJzKCBwYXJzZXIgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVE9LRU5fRU5ES0VSTkRBVEE6Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRGT05UTUVUUklDUzoKLSAgICAgICAgcmV0dXJuIFBTYXV4X0Vycl9PazsKLQotICAgICAgY2FzZSBBRk1fVE9LRU5fVU5LTk9XTjoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gUFNhdXhfRXJyX1N5bnRheF9FcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmbV9wYXJzZXJfc2tpcF9zZWN0aW9uKCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZNX1Rva2VuICAgZW5kX3NlY3Rpb24gKQotICB7Ci0gICAgY2hhciogICAga2V5OwotICAgIEZUX1VJbnQgIGxlbjsKLQotCi0gICAgd2hpbGUgKCBuLS0gPiAwICkKLSAgICB7Ci0gICAgICBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsIE5VTEwgKTsKLSAgICAgIGlmICggIWtleSApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoICgga2V5ID0gYWZtX3BhcnNlcl9uZXh0X2tleSggcGFyc2VyLCAxLCAmbGVuICkgKSAhPSAwICkKLSAgICB7Ci0gICAgICBBRk1fVG9rZW4gIHRva2VuID0gYWZtX3Rva2VuaXplKCBrZXksIGxlbiApOwotCi0KLSAgICAgIGlmICggdG9rZW4gPT0gZW5kX3NlY3Rpb24gfHwgdG9rZW4gPT0gQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTICkKLSAgICAgICAgcmV0dXJuIFBTYXV4X0Vycl9PazsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gUFNhdXhfRXJyX1N5bnRheF9FcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGFmbV9wYXJzZXJfcGFyc2UoIEFGTV9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IHBhcnNlci0+bWVtb3J5OwotICAgIEFGTV9Gb250SW5mbyAgZmkgICAgID0gcGFyc2VyLT5Gb250SW5mbzsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yICA9IFBTYXV4X0Vycl9TeW50YXhfRXJyb3I7Ci0gICAgY2hhciogICAgICAgICBrZXk7Ci0gICAgRlRfVUludCAgICAgICBsZW47Ci0gICAgRlRfSW50ICAgICAgICBtZXRyaWNzX3NldHMgPSAwOwotCi0KLSAgICBpZiAoICFmaSApCi0gICAgICByZXR1cm4gUFNhdXhfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsICZsZW4gKTsKLSAgICBpZiAoICFrZXkgfHwgbGVuICE9IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGZ0X3N0cm5jbXAoIGtleSwgIlN0YXJ0Rm9udE1ldHJpY3MiLCAxNiApICE9IDAgKQotICAgICAgcmV0dXJuIFBTYXV4X0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotCi0gICAgd2hpbGUgKCAoIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgJmxlbiApICkgIT0gMCApCi0gICAgewotICAgICAgQUZNX1ZhbHVlUmVjICBzaGFyZWRfdmFsc1s0XTsKLQotCi0gICAgICBzd2l0Y2ggKCBhZm1fdG9rZW5pemUoIGtleSwgbGVuICkgKQotICAgICAgewotICAgICAgY2FzZSBBRk1fVE9LRU5fTUVUUklDU1NFVFM6Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX2ludCggcGFyc2VyLCAmbWV0cmljc19zZXRzICkgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBpZiAoIG1ldHJpY3Nfc2V0cyAhPSAwICYmIG1ldHJpY3Nfc2V0cyAhPSAyICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gUFNhdXhfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLQotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVE9LRU5fSVNDSURGT05UOgotICAgICAgICBzaGFyZWRfdmFsc1swXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfQk9PTDsKLSAgICAgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfdmFscyggcGFyc2VyLCBzaGFyZWRfdmFscywgMSApICE9IDEgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBmaS0+SXNDSURGb250ID0gc2hhcmVkX3ZhbHNbMF0udS5iOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVE9LRU5fRk9OVEJCT1g6Ci0gICAgICAgIHNoYXJlZF92YWxzWzBdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9GSVhFRDsKLSAgICAgICAgc2hhcmVkX3ZhbHNbMV0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBzaGFyZWRfdmFsc1syXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIHNoYXJlZF92YWxzWzNdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9GSVhFRDsKLSAgICAgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfdmFscyggcGFyc2VyLCBzaGFyZWRfdmFscywgNCApICE9IDQgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBmaS0+Rm9udEJCb3gueE1pbiA9IHNoYXJlZF92YWxzWzBdLnUuZjsKLSAgICAgICAgZmktPkZvbnRCQm94LnlNaW4gPSBzaGFyZWRfdmFsc1sxXS51LmY7Ci0gICAgICAgIGZpLT5Gb250QkJveC54TWF4ID0gc2hhcmVkX3ZhbHNbMl0udS5mOwotICAgICAgICBmaS0+Rm9udEJCb3gueU1heCA9IHNoYXJlZF92YWxzWzNdLnUuZjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0FTQ0VOREVSOgotICAgICAgICBzaGFyZWRfdmFsc1swXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDEgKSAhPSAxICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZmktPkFzY2VuZGVyID0gc2hhcmVkX3ZhbHNbMF0udS5mOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVE9LRU5fREVTQ0VOREVSOgotICAgICAgICBzaGFyZWRfdmFsc1swXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDEgKSAhPSAxICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZmktPkRlc2NlbmRlciA9IHNoYXJlZF92YWxzWzBdLnUuZjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX1NUQVJUQ0hBUk1FVFJJQ1M6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIG4gPSAwOwotCi0KLSAgICAgICAgICBpZiAoIGFmbV9wYXJzZXJfcmVhZF9pbnQoIHBhcnNlciwgJm4gKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICBlcnJvciA9IGFmbV9wYXJzZXJfc2tpcF9zZWN0aW9uKCBwYXJzZXIsIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZNX1RPS0VOX0VORENIQVJNRVRSSUNTICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX1NUQVJUS0VSTkRBVEE6Ci0gICAgICAgIGVycm9yID0gYWZtX3BhcnNlX2tlcm5fZGF0YSggcGFyc2VyICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgLyogZmFsbCB0aHJvdWdoIHNpbmNlIHdlIG9ubHkgc3VwcG9ydCBrZXJuIGRhdGEgKi8KLQotICAgICAgY2FzZSBBRk1fVE9LRU5fRU5ERk9OVE1FVFJJQ1M6Ci0gICAgICAgIHJldHVybiBQU2F1eF9FcnJfT2s7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIEZUX0ZSRUUoIGZpLT5UcmFja0tlcm5zICk7Ci0gICAgZmktPk51bVRyYWNrS2VybiA9IDA7Ci0KLSAgICBGVF9GUkVFKCBmaS0+S2VyblBhaXJzICk7Ci0gICAgZmktPk51bUtlcm5QYWlyID0gMDsKLQotICAgIGZpLT5Jc0NJREZvbnQgPSAwOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvYWZtcGFyc2UuaCBiL3NyYy9wc2F1eC9hZm1wYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZjZTc1Li4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC9hZm1wYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZtcGFyc2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFGTSBwYXJzZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQUZNUEFSU0VfSF9fCi0jZGVmaW5lIF9fQUZNUEFSU0VfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBhZm1fcGFyc2VyX2luaXQoIEFGTV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBsaW1pdCApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBhZm1fcGFyc2VyX2RvbmUoIEFGTV9QYXJzZXIgIHBhcnNlciApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZtX3BhcnNlcl9wYXJzZSggQUZNX1BhcnNlciAgcGFyc2VyICk7Ci0KLQotICBlbnVtICBBRk1fVmFsdWVUeXBlXwotICB7Ci0gICAgQUZNX1ZBTFVFX1RZUEVfU1RSSU5HLAotICAgIEFGTV9WQUxVRV9UWVBFX05BTUUsCi0gICAgQUZNX1ZBTFVFX1RZUEVfRklYRUQsICAgLyogcmVhbCBudW1iZXIgKi8KLSAgICBBRk1fVkFMVUVfVFlQRV9JTlRFR0VSLAotICAgIEFGTV9WQUxVRV9UWVBFX0JPT0wsCi0gICAgQUZNX1ZBTFVFX1RZUEVfSU5ERVggICAgLyogZ2x5cGggaW5kZXggKi8KLSAgfTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fVmFsdWVSZWNfCi0gIHsKLSAgICBlbnVtIEFGTV9WYWx1ZVR5cGVfICB0eXBlOwotICAgIHVuaW9uIHsKLSAgICAgIGNoYXIqICAgICBzOwotICAgICAgRlRfRml4ZWQgIGY7Ci0gICAgICBGVF9JbnQgICAgaTsKLSAgICAgIEZUX0Jvb2wgICBiOwotCi0gICAgfSB1OwotCi0gIH0gQUZNX1ZhbHVlUmVjLCAqQUZNX1ZhbHVlOwotCi0jZGVmaW5lICBBRk1fTUFYX0FSR1VNRU5UUyAgNQotCi0gIEZUX0xPQ0FMKCBGVF9JbnQgKQotICBhZm1fcGFyc2VyX3JlYWRfdmFscyggQUZNX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgQUZNX1ZhbHVlICAgdmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIG4gKTsKLQotICAvKiByZWFkIHRoZSBuZXh0IGtleSBmcm9tIHRoZSBuZXh0IGxpbmUgb3IgY29sdW1uICovCi0gIEZUX0xPQ0FMKCBjaGFyKiApCi0gIGFmbV9wYXJzZXJfbmV4dF9rZXkoIEFGTV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCogICAgbGVuICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fQUZNUEFSU0VfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNhdXguYyBiL3NyYy9wc2F1eC9wc2F1eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGI5YzVjLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC9wc2F1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGF1eGlsaWFyeSBQb3N0U2NyaXB0IGRyaXZlciBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAicHNvYmpzLmMiCi0jaW5jbHVkZSAicHNhdXhtb2QuYyIKLSNpbmNsdWRlICJ0MWRlY29kZS5jIgotI2luY2x1ZGUgInQxY21hcC5jIgotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0jaW5jbHVkZSAiYWZtcGFyc2UuYyIKLSNlbmRpZgotCi0jaW5jbHVkZSAicHNjb252LmMiCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNhdXhlcnIuaCBiL3NyYy9wc2F1eC9wc2F1eGVyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJhYTNjLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC9wc2F1eGVyci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXhlcnIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBTIGF1eGlsaWFyeSBtb2R1bGUgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBQUyBhdXhpbGlhcnkgbW9kdWxlIGVycm9yIGVudW1lcmF0aW9uICovCi0gIC8qIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19QU0FVWEVSUl9IX18KLSNkZWZpbmUgX19QU0FVWEVSUl9IX18KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBfX0ZURVJST1JTX0hfXwotCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIFBTYXV4X0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9QU2F1eAotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogX19QU0FVWEVSUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2F1eG1vZC5jIGIvc3JjL3BzYXV4L3BzYXV4bW9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzU3OWYuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L3BzYXV4bW9kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXhtb2QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGF1eGlsaWFyeSBQb3N0U2NyaXB0IG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMDEsIDIwMDIsIDIwMDMsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJwc2F1eG1vZC5oIgotI2luY2x1ZGUgInBzb2Jqcy5oIgotI2luY2x1ZGUgInQxZGVjb2RlLmgiCi0jaW5jbHVkZSAidDFjbWFwLmgiCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLSNpbmNsdWRlICJhZm1wYXJzZS5oIgotI2VuZGlmCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgUFNfVGFibGVfRnVuY3NSZWMgIHBzX3RhYmxlX2Z1bmNzID0KLSAgewotICAgIHBzX3RhYmxlX25ldywKLSAgICBwc190YWJsZV9kb25lLAotICAgIHBzX3RhYmxlX2FkZCwKLSAgICBwc190YWJsZV9yZWxlYXNlCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgUFNfUGFyc2VyX0Z1bmNzUmVjICBwc19wYXJzZXJfZnVuY3MgPQotICB7Ci0gICAgcHNfcGFyc2VyX2luaXQsCi0gICAgcHNfcGFyc2VyX2RvbmUsCi0gICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzLAotICAgIHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuLAotICAgIHBzX3BhcnNlcl90b19pbnQsCi0gICAgcHNfcGFyc2VyX3RvX2ZpeGVkLAotICAgIHBzX3BhcnNlcl90b19ieXRlcywKLSAgICBwc19wYXJzZXJfdG9fY29vcmRfYXJyYXksCi0gICAgcHNfcGFyc2VyX3RvX2ZpeGVkX2FycmF5LAotICAgIHBzX3BhcnNlcl90b190b2tlbiwKLSAgICBwc19wYXJzZXJfdG9fdG9rZW5fYXJyYXksCi0gICAgcHNfcGFyc2VyX2xvYWRfZmllbGQsCi0gICAgcHNfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUKLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBUMV9CdWlsZGVyX0Z1bmNzUmVjICB0MV9idWlsZGVyX2Z1bmNzID0KLSAgewotICAgIHQxX2J1aWxkZXJfaW5pdCwKLSAgICB0MV9idWlsZGVyX2RvbmUsCi0gICAgdDFfYnVpbGRlcl9jaGVja19wb2ludHMsCi0gICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQsCi0gICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQxLAotICAgIHQxX2J1aWxkZXJfYWRkX2NvbnRvdXIsCi0gICAgdDFfYnVpbGRlcl9zdGFydF9wb2ludCwKLSAgICB0MV9idWlsZGVyX2Nsb3NlX2NvbnRvdXIKLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBUMV9EZWNvZGVyX0Z1bmNzUmVjICB0MV9kZWNvZGVyX2Z1bmNzID0KLSAgewotICAgIHQxX2RlY29kZXJfaW5pdCwKLSAgICB0MV9kZWNvZGVyX2RvbmUsCi0gICAgdDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncwotICB9OwotCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEFGTV9QYXJzZXJfRnVuY3NSZWMgIGFmbV9wYXJzZXJfZnVuY3MgPQotICB7Ci0gICAgYWZtX3BhcnNlcl9pbml0LAotICAgIGFmbV9wYXJzZXJfZG9uZSwKLSAgICBhZm1fcGFyc2VyX3BhcnNlCi0gIH07Ci0jZW5kaWYKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBUMV9DTWFwX0NsYXNzZXNSZWMgIHQxX2NtYXBfY2xhc3NlcyA9Ci0gIHsKLSAgICAmdDFfY21hcF9zdGFuZGFyZF9jbGFzc19yZWMsCi0gICAgJnQxX2NtYXBfZXhwZXJ0X2NsYXNzX3JlYywKLSAgICAmdDFfY21hcF9jdXN0b21fY2xhc3NfcmVjLAotICAgICZ0MV9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjCi0gIH07Ci0KLQotICBzdGF0aWMKLSAgY29uc3QgUFNBdXhfSW50ZXJmYWNlICBwc2F1eF9pbnRlcmZhY2UgPQotICB7Ci0gICAgJnBzX3RhYmxlX2Z1bmNzLAotICAgICZwc19wYXJzZXJfZnVuY3MsCi0gICAgJnQxX2J1aWxkZXJfZnVuY3MsCi0gICAgJnQxX2RlY29kZXJfZnVuY3MsCi0gICAgdDFfZGVjcnlwdCwKLQotICAgIChjb25zdCBUMV9DTWFwX0NsYXNzZXNSZWMqKSAmdDFfY21hcF9jbGFzc2VzLAotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0gICAgJmFmbV9wYXJzZXJfZnVuY3MsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgIHBzYXV4X21vZHVsZV9jbGFzcyA9Ci0gIHsKLSAgICAwLAotICAgIHNpemVvZiggRlRfTW9kdWxlUmVjICksCi0gICAgInBzYXV4IiwKLSAgICAweDIwMDAwTCwKLSAgICAweDIwMDAwTCwKLQotICAgICZwc2F1eF9pbnRlcmZhY2UsICAvKiBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKTAsCi0gICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSAwLAotICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgMAotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3BzYXV4bW9kLmggYi9zcmMvcHNhdXgvcHNhdXhtb2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhYzA1Ni4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvcHNhdXhtb2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYXV4bW9kLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBtb2R1bGUgaW1wbGVtZW50YXRpb24gKHNwZWNpZmljYXRpb24pLiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTQVVYTU9EX0hfXwotI2RlZmluZSBfX1BTQVVYTU9EX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX01vZHVsZV9DbGFzcyApICBwc2F1eF9kcml2ZXJfY2xhc3M7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19QU0FVWE1PRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2NvbnYuYyBiL3NyYy9wc2F1eC9wc2NvbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyNGI1OS4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvcHNjb252LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNjb252LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNvbWUgY29udmVuaWVuY2UgY29udmVyc2lvbnMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgInBzY29udi5oIgotI2luY2x1ZGUgInBzb2Jqcy5oIgotI2luY2x1ZGUgInBzYXV4ZXJyLmgiCi0KLQotICAvKiBUaGUgZm9sbG93aW5nIGFycmF5IGlzIHVzZWQgYnkgdmFyaW91cyBmdW5jdGlvbnMgdG8gcXVpY2tseSBjb252ZXJ0ICovCi0gIC8qIGRpZ2l0cyAoYm90aCBkZWNpbWFsIGFuZCBub24tZGVjaW1hbCkgaW50byBudW1iZXJzLiAgICAgICAgICAgICAgICAgKi8KLQotI2lmICdBJyA9PSA2NQotICAvKiBBU0NJSSAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9DaGFyICBmdF9jaGFyX3RhYmxlWzEyOF0gPQotICB7Ci0gICAgLyogMHgwMCAqLwotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAotICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAotICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICB9OwotCi0gIC8qIG5vIGNoYXJhY3RlciA+PSAweDgwIGNhbiByZXByZXNlbnQgYSB2YWxpZCBudW1iZXIgKi8KLSNkZWZpbmUgT1AgID49Ci0KLSNlbmRpZiAvKiAnQScgPT0gNjUgKi8KLQotI2lmICdBJyA9PSAxOTMKLSAgLyogRUJDRElDICovCi0KLSAgc3RhdGljIGNvbnN0IEZUX0NoYXIgIGZ0X2NoYXJfdGFibGVbMTI4XSA9Ci0gIHsKLSAgICAvKiAweDgwICovCi0gICAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIC0xLCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIC0xLCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gIH07Ci0KLSAgLyogbm8gY2hhcmFjdGVyIDwgMHg4MCBjYW4gcmVwcmVzZW50IGEgdmFsaWQgbnVtYmVyICovCi0jZGVmaW5lIE9QICA8Ci0KLSNlbmRpZiAvKiAnQScgPT0gMTkzICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCi0gIFBTX0NvbnZfU3RydG9sKCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGJhc2UgKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSAqY3Vyc29yOwotICAgIEZUX0ludCAgICBudW0gPSAwOwotICAgIEZUX0Jvb2wgICBzaWduID0gMDsKLQotCi0gICAgaWYgKCBwID09IGxpbWl0IHx8IGJhc2UgPCAyIHx8IGJhc2UgPiAzNiApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggKnAgPT0gJy0nIHx8ICpwID09ICcrJyApCi0gICAgewotICAgICAgc2lnbiA9IEZUX0JPT0woICpwID09ICctJyApOwotCi0gICAgICBwKys7Ci0gICAgICBpZiAoIHAgPT0gbGltaXQgKQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmb3IgKCA7IHAgPCBsaW1pdDsgcCsrICkKLSAgICB7Ci0gICAgICBGVF9DaGFyICBjOwotCi0KLSAgICAgIGlmICggSVNfUFNfU1BBQ0UoICpwICkgfHwgKnAgT1AgMHg4MCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjID0gZnRfY2hhcl90YWJsZVsqcCAmIDB4N2ZdOwotCi0gICAgICBpZiAoIGMgPCAwIHx8IGMgPj0gYmFzZSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBudW0gPSBudW0gKiBiYXNlICsgYzsKLSAgICB9Ci0KLSAgICBpZiAoIHNpZ24gKQotICAgICAgbnVtID0gLW51bTsKLQotICAgICpjdXJzb3IgPSBwOwotCi0gICAgcmV0dXJuIG51bTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9JbnQgKQotICBQU19Db252X1RvSW50KCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0KLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX0ludCAgICBudW07Ci0KLQotICAgIG51bSA9IFBTX0NvbnZfU3RydG9sKCBjdXJzb3IsIGxpbWl0LCAxMCApOwotICAgIHAgICA9ICpjdXJzb3I7Ci0KLSAgICBpZiAoIHAgPCBsaW1pdCAmJiAqcCA9PSAnIycgKQotICAgIHsKLSAgICAgICpjdXJzb3IgPSBwICsgMTsKLQotICAgICAgcmV0dXJuIFBTX0NvbnZfU3RydG9sKCBjdXJzb3IsIGxpbWl0LCBudW0gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9GaXhlZCApCi0gIFBTX0NvbnZfVG9GaXhlZCggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIHBvd2VyX3RlbiApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9ICpjdXJzb3I7Ci0gICAgRlRfRml4ZWQgIGludGVncmFsOwotICAgIEZUX0xvbmcgICBkZWNpbWFsID0gMCwgZGl2aWRlciA9IDE7Ci0gICAgRlRfQm9vbCAgIHNpZ24gPSAwOwotCi0KLSAgICBpZiAoIHAgPT0gbGltaXQgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoICpwID09ICctJyB8fCAqcCA9PSAnKycgKQotICAgIHsKLSAgICAgIHNpZ24gPSBGVF9CT09MKCAqcCA9PSAnLScgKTsKLQotICAgICAgcCsrOwotICAgICAgaWYgKCBwID09IGxpbWl0ICkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCAqcCAhPSAnLicgKQotICAgICAgaW50ZWdyYWwgPSBQU19Db252X1RvSW50KCAmcCwgbGltaXQgKSA8PCAxNjsKLSAgICBlbHNlCi0gICAgICBpbnRlZ3JhbCA9IDA7Ci0KLSAgICAvKiByZWFkIHRoZSBkZWNpbWFsIHBhcnQgKi8KLSAgICBpZiAoIHAgPCBsaW1pdCAmJiAqcCA9PSAnLicgKQotICAgIHsKLSAgICAgIHArKzsKLQotICAgICAgZm9yICggOyBwIDwgbGltaXQ7IHArKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0NoYXIgIGM7Ci0KLQotICAgICAgICBpZiAoIElTX1BTX1NQQUNFKCAqcCApIHx8ICpwIE9QIDB4ODAgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGMgPSBmdF9jaGFyX3RhYmxlWypwICYgMHg3Zl07Ci0KLSAgICAgICAgaWYgKCBjIDwgMCB8fCBjID49IDEwICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoICFpbnRlZ3JhbCAmJiBwb3dlcl90ZW4gPiAwICkKLSAgICAgICAgewotICAgICAgICAgIHBvd2VyX3Rlbi0tOwotICAgICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsICogMTAgKyBjOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggZGl2aWRlciA8IDEwMDAwMDAwTCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgKiAxMCArIGM7Ci0gICAgICAgICAgICBkaXZpZGVyICo9IDEwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlYWQgZXhwb25lbnQsIGlmIGFueSAqLwotICAgIGlmICggcCArIDEgPCBsaW1pdCAmJiAoICpwID09ICdlJyB8fCAqcCA9PSAnRScgKSApCi0gICAgewotICAgICAgcCsrOwotICAgICAgcG93ZXJfdGVuICs9IFBTX0NvbnZfVG9JbnQoICZwLCBsaW1pdCApOwotICAgIH0KLQotICAgIHdoaWxlICggcG93ZXJfdGVuID4gMCApCi0gICAgewotICAgICAgaW50ZWdyYWwgKj0gMTA7Ci0gICAgICBkZWNpbWFsICAqPSAxMDsKLSAgICAgIHBvd2VyX3Rlbi0tOwotICAgIH0KLQotICAgIHdoaWxlICggcG93ZXJfdGVuIDwgMCApCi0gICAgewotICAgICAgaW50ZWdyYWwgLz0gMTA7Ci0gICAgICBkaXZpZGVyICAqPSAxMDsKLSAgICAgIHBvd2VyX3RlbisrOwotICAgIH0KLQotICAgIGlmICggZGVjaW1hbCApCi0gICAgICBpbnRlZ3JhbCArPSBGVF9EaXZGaXgoIGRlY2ltYWwsIGRpdmlkZXIgKTsKLQotICAgIGlmICggc2lnbiApCi0gICAgICBpbnRlZ3JhbCA9IC1pbnRlZ3JhbDsKLQotICAgICpjdXJzb3IgPSBwOwotCi0gICAgcmV0dXJuIGludGVncmFsOwotICB9Ci0KLQotI2lmIDAKLSAgRlRfTE9DQUxfREVGKCBGVF9VSW50ICkKLSAgUFNfQ29udl9TdHJpbmdEZWNvZGUoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBuICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VJbnQgICByID0gMDsKLQotCi0gICAgZm9yICggcCA9ICpjdXJzb3I7IHIgPCBuICYmIHAgPCBsaW1pdDsgcCsrICkKLSAgICB7Ci0gICAgICBGVF9CeXRlICBiOwotCi0KLSAgICAgIGlmICggKnAgIT0gJ1xcJyApCi0gICAgICB7Ci0gICAgICAgIGJ1ZmZlcltyKytdID0gKnA7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHArKzsKLQotICAgICAgc3dpdGNoICggKnAgKQotICAgICAgewotICAgICAgY2FzZSAnbic6Ci0gICAgICAgIGIgPSAnXG4nOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3InOgotICAgICAgICBiID0gJ1xyJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICd0JzoKLSAgICAgICAgYiA9ICdcdCc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnYic6Ci0gICAgICAgIGIgPSAnXGInOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2YnOgotICAgICAgICBiID0gJ1xmJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdccic6Ci0gICAgICAgIHArKzsKLSAgICAgICAgaWYgKCAqcCAhPSAnXG4nICkKLSAgICAgICAgewotICAgICAgICAgIGIgPSAqcDsKLQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8qIG5vIGJyZWFrICovCi0gICAgICBjYXNlICdcbic6Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICggSVNfUFNfRElHSVQoICpwICkgKQotICAgICAgICB7Ci0gICAgICAgICAgYiA9ICpwIC0gJzAnOwotCi0gICAgICAgICAgcCsrOwotCi0gICAgICAgICAgaWYgKCBJU19QU19ESUdJVCggKnAgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgYiA9IGIgKiA4ICsgKnAgLSAnMCc7Ci0KLSAgICAgICAgICAgIHArKzsKLQotICAgICAgICAgICAgaWYgKCBJU19QU19ESUdJVCggKnAgKSApCi0gICAgICAgICAgICAgIGIgPSBiICogOCArICpwIC0gJzAnOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBidWZmZXJbcisrXSA9IGI7Ci0gICAgICAgICAgICAgIGIgPSAqcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlcltyKytdID0gYjsKLSAgICAgICAgICAgIGIgPSAqcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGIgPSAqcDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlcltyKytdID0gYjsKLSAgICB9Ci0KLSAgICAqY3Vyc29yID0gcDsKLQotICAgIHJldHVybiByOwotICB9Ci0jZW5kaWYgLyogMCAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VSW50ICkKLSAgUFNfQ29udl9BU0NJSUhleERlY29kZSggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG4gKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIHIgICA9IDA7Ci0gICAgRlRfVUludCAgIHcgICA9IDA7Ci0gICAgRlRfVUludCAgIHBhZCA9IDB4MDE7Ci0KLQotICAgIG4gKj0gMjsKLQotI2lmIDEKLQotICAgIHAgID0gKmN1cnNvcjsKLSAgICBpZiAoIG4gPiAoRlRfVUludCkoIGxpbWl0IC0gcCApICkKLSAgICAgIG4gPSAoRlRfVUludCkoIGxpbWl0IC0gcCApOwotCi0gICAgLyogd2UgdHJ5IHRvIHByb2Nlc3MgdHdvIG5pYmJsZXMgYXQgYSB0aW1lIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUgKi8KLSAgICBmb3IgKCA7IHIgPCBuOyByKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGMgPSBwW3JdOwotCi0KLSAgICAgIGlmICggSVNfUFNfU1BBQ0UoIGMgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIGMgT1AgMHg4MCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjID0gZnRfY2hhcl90YWJsZVtjICYgMHg3Rl07Ci0gICAgICBpZiAoICh1bnNpZ25lZCljID49IDE2ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHBhZCA9ICggcGFkIDw8IDQgKSB8IGM7Ci0gICAgICBpZiAoIHBhZCAmIDB4MTAwICkKLSAgICAgIHsKLSAgICAgICAgYnVmZmVyW3crK10gPSAoRlRfQnl0ZSlwYWQ7Ci0gICAgICAgIHBhZCAgICAgICAgID0gMHgwMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHBhZCAhPSAweDAxICkKLSAgICAgIGJ1ZmZlclt3KytdID0gKEZUX0J5dGUpKCBwYWQgPDwgNCApOwotCi0gICAgKmN1cnNvciA9IHAgKyByOwotCi0gICAgcmV0dXJuIHc7Ci0KLSNlbHNlIC8qIDAgKi8KLQotICAgIGZvciAoIHIgPSAwOyByIDwgbjsgcisrICkKLSAgICB7Ci0gICAgICBGVF9DaGFyICBjOwotCi0KLSAgICAgIGlmICggSVNfUFNfU1BBQ0UoICpwICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCAqcCBPUCAweDgwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGMgPSBmdF9jaGFyX3RhYmxlWypwICYgMHg3Zl07Ci0KLSAgICAgIGlmICggKHVuc2lnbmVkKWMgPj0gMTYgKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCByICYgMSApCi0gICAgICB7Ci0gICAgICAgICpidWZmZXIgPSAoRlRfQnl0ZSkoKmJ1ZmZlciArIGMpOwotICAgICAgICBidWZmZXIrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgKmJ1ZmZlciA9IChGVF9CeXRlKShjIDw8IDQpOwotCi0gICAgICByKys7Ci0gICAgfQotCi0gICAgKmN1cnNvciA9IHA7Ci0KLSAgICByZXR1cm4gKCByICsgMSApIC8gMjsKLQotI2VuZGlmIC8qIDAgKi8KLQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1VJbnQgKQotICBQU19Db252X0VleGVjRGVjb2RlKCBGVF9CeXRlKiogICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIG4sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIHNlZWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIHI7Ci0gICAgRlRfVUludCAgIHMgPSAqc2VlZDsKLQotCi0jaWYgMQotCi0gICAgcCA9ICpjdXJzb3I7Ci0gICAgaWYgKCBuID4gKEZUX1VJbnQpKGxpbWl0IC0gcCkgKQotICAgICAgbiA9IChGVF9VSW50KShsaW1pdCAtIHApOwotCi0gICAgZm9yICggciA9IDA7IHIgPCBuOyByKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIHZhbCA9IHBbcl07Ci0gICAgICBGVF9VSW50ICBiICAgPSAoIHZhbCBeICggcyA+PiA4ICkgKTsKLQotCi0gICAgICBzICAgICAgICAgPSAoICh2YWwgKyBzKSo1Mjg0NVUgKyAyMjcxOSApICYgMHhGRkZGVTsKLSAgICAgIGJ1ZmZlcltyXSA9IChGVF9CeXRlKSBiOwotICAgIH0KLQotICAgICpjdXJzb3IgPSBwICsgbjsKLSAgICAqc2VlZCAgID0gKEZUX1VTaG9ydClzOwotCi0jZWxzZSAvKiAwICovCi0KLSAgICBmb3IgKCByID0gMCwgcCA9ICpjdXJzb3I7IHIgPCBuICYmIHAgPCBsaW1pdDsgcisrLCBwKysgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgIGIgPSAoRlRfQnl0ZSkoICpwIF4gKCBzID4+IDggKSApOwotCi0KLSAgICAgIHMgPSAoRlRfVVNob3J0KSggKCAqcCArIHMgKSAqIDUyODQ1VSArIDIyNzE5ICk7Ci0gICAgICAqYnVmZmVyKysgPSBiOwotICAgIH0KLSAgICAqY3Vyc29yID0gcDsKLSAgICAqc2VlZCAgID0gczsKLQotI2VuZGlmIC8qIDAgKi8KLQotICAgIHJldHVybiByOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNjb252LmggYi9zcmMvcHNhdXgvcHNjb252LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTEyNDEuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L3BzY29udi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNjb252LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNvbWUgY29udmVuaWVuY2UgY29udmVyc2lvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fUFNDT05WX0hfXwotI2RlZmluZSBfX1BTQ09OVl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfSW50ICkKLSAgUFNfQ29udl9TdHJ0b2woIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgYmFzZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0ludCApCi0gIFBTX0NvbnZfVG9JbnQoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0ZpeGVkICkKLSAgUFNfQ29udl9Ub0ZpeGVkKCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICk7Ci0KLSNpZiAwCi0gIEZUX0xPQ0FMKCBGVF9VSW50ICkKLSAgUFNfQ29udl9TdHJpbmdEZWNvZGUoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBuICk7Ci0jZW5kaWYKLQotICBGVF9MT0NBTCggRlRfVUludCApCi0gIFBTX0NvbnZfQVNDSUlIZXhEZWNvZGUoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBuICk7Ci0KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBQU19Db252X0VleGVjRGVjb2RlKCBGVF9CeXRlKiogICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIG4sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIHNlZWQgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1BTQ09OVl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc29ianMuYyBiL3NyYy9wc2F1eC9wc29ianMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiODRhYy4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvcHNvYmpzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzb2Jqcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBQb3N0U2NyaXB0IGZvbnRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJwc29ianMuaCIKLSNpbmNsdWRlICJwc2NvbnYuaCIKLQotI2luY2x1ZGUgInBzYXV4ZXJyLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9wc29ianMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBzX3RhYmxlX25ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgUFNfVGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlICA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICA6OiBUaGUgdGFibGUgc2l6ZSA9IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IFRoZSBtZW1vcnkgb2JqZWN0IHRvIHVzZSBmb3IgYWxsIHN1YnNlcXVlbnQgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICByZWFsbG9jYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHBzX3RhYmxlX25ldyggUFNfVGFibGUgICB0YWJsZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAotICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgdGFibGUtPm1lbW9yeSA9IG1lbW9yeTsKLSAgICBpZiAoIEZUX05FV19BUlJBWSggdGFibGUtPmVsZW1lbnRzLCBjb3VudCApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHRhYmxlLT5sZW5ndGhzLCAgY291bnQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB0YWJsZS0+bWF4X2VsZW1zID0gY291bnQ7Ci0gICAgdGFibGUtPmluaXQgICAgICA9IDB4REVBREJFRUZVTDsKLSAgICB0YWJsZS0+bnVtX2VsZW1zID0gMDsKLSAgICB0YWJsZS0+YmxvY2sgICAgID0gMDsKLSAgICB0YWJsZS0+Y2FwYWNpdHkgID0gMDsKLSAgICB0YWJsZS0+Y3Vyc29yICAgID0gMDsKLQotICAgICooUFNfVGFibGVfRnVuY3NSZWMqKSZ0YWJsZS0+ZnVuY3MgPSBwc190YWJsZV9mdW5jczsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfRlJFRSggdGFibGUtPmVsZW1lbnRzICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHNoaWZ0X2VsZW1lbnRzKCBQU19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgb2xkX2Jhc2UgKQotICB7Ci0gICAgRlRfUHRyRGlzdCAgZGVsdGEgID0gdGFibGUtPmJsb2NrIC0gb2xkX2Jhc2U7Ci0gICAgRlRfQnl0ZSoqICAgb2Zmc2V0ID0gdGFibGUtPmVsZW1lbnRzOwotICAgIEZUX0J5dGUqKiAgIGxpbWl0ICA9IG9mZnNldCArIHRhYmxlLT5tYXhfZWxlbXM7Ci0KLQotICAgIGZvciAoIDsgb2Zmc2V0IDwgbGltaXQ7IG9mZnNldCsrICkKLSAgICB7Ci0gICAgICBpZiAoIG9mZnNldFswXSApCi0gICAgICAgIG9mZnNldFswXSArPSBkZWx0YTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByZWFsbG9jYXRlX3QxX3RhYmxlKCBQU19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICBuZXdfc2l6ZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSAgID0gdGFibGUtPm1lbW9yeTsKLSAgICBGVF9CeXRlKiAgIG9sZF9iYXNlID0gdGFibGUtPmJsb2NrOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLQotICAgIC8qIGFsbG9jYXRlIG5ldyBiYXNlIGJsb2NrICovCi0gICAgaWYgKCBGVF9BTExPQyggdGFibGUtPmJsb2NrLCBuZXdfc2l6ZSApICkKLSAgICB7Ci0gICAgICB0YWJsZS0+YmxvY2sgPSBvbGRfYmFzZTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IGVsZW1lbnRzIGFuZCBzaGlmdCBvZmZzZXRzICovCi0gICAgaWYgKCBvbGRfYmFzZSApCi0gICAgewotICAgICAgRlRfTUVNX0NPUFkoIHRhYmxlLT5ibG9jaywgb2xkX2Jhc2UsIHRhYmxlLT5jYXBhY2l0eSApOwotICAgICAgc2hpZnRfZWxlbWVudHMoIHRhYmxlLCBvbGRfYmFzZSApOwotICAgICAgRlRfRlJFRSggb2xkX2Jhc2UgKTsKLSAgICB9Ci0KLSAgICB0YWJsZS0+Y2FwYWNpdHkgPSBuZXdfc2l6ZTsKLQotICAgIHJldHVybiBQU2F1eF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBzX3RhYmxlX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkZHMgYW4gb2JqZWN0IHRvIGEgUFNfVGFibGUsIHBvc3NpYmx5IGdyb3dpbmcgaXRzIG1lbW9yeSBibG9jay4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlICA6OiBUaGUgdGFyZ2V0IHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlkeCAgICA6OiBUaGUgaW5kZXggb2YgdGhlIG9iamVjdCBpbiB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2JqZWN0IDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QgdG8gY29weSBpbiBtZW1vcnkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgc291cmNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgYSAgKi8KLSAgLyogICAgcmVhbGxvY2F0aW9uIGZhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcHNfdGFibGVfYWRkKCBQU19UYWJsZSAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgdm9pZCogICAgICAgb2JqZWN0LAotICAgICAgICAgICAgICAgIEZUX1B0ckRpc3QgIGxlbmd0aCApCi0gIHsKLSAgICBpZiAoIGlkeCA8IDAgfHwgaWR4ID49IHRhYmxlLT5tYXhfZWxlbXMgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInBzX3RhYmxlX2FkZDogaW52YWxpZCBpbmRleFxuIiApKTsKLSAgICAgIHJldHVybiBQU2F1eF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICB9Ci0KLSAgICAvKiBncm93IHRoZSBiYXNlIGJsb2NrIGlmIG5lZWRlZCAqLwotICAgIGlmICggdGFibGUtPmN1cnNvciArIGxlbmd0aCA+IHRhYmxlLT5jYXBhY2l0eSApCi0gICAgewotICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICAgIEZUX09mZnNldCAgbmV3X3NpemUgID0gdGFibGUtPmNhcGFjaXR5OwotICAgICAgRlRfTG9uZyAgICBpbl9vZmZzZXQ7Ci0KLQotICAgICAgaW5fb2Zmc2V0ID0gKEZUX0xvbmcpKChGVF9CeXRlKilvYmplY3QgLSB0YWJsZS0+YmxvY2spOwotICAgICAgaWYgKCAoRlRfVUxvbmcpaW5fb2Zmc2V0ID49IHRhYmxlLT5jYXBhY2l0eSApCi0gICAgICAgIGluX29mZnNldCA9IC0xOwotCi0gICAgICB3aGlsZSAoIG5ld19zaXplIDwgdGFibGUtPmN1cnNvciArIGxlbmd0aCApCi0gICAgICB7Ci0gICAgICAgIC8qIGluY3JlYXNlIHNpemUgYnkgMjUlIGFuZCByb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZQotICAgICAgICAgICBvZiAxMDI0ICovCi0gICAgICAgIG5ld19zaXplICs9ICggbmV3X3NpemUgPj4gMiApICsgMTsKLSAgICAgICAgbmV3X3NpemUgID0gRlRfUEFEX0NFSUwoIG5ld19zaXplLCAxMDI0ICk7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gcmVhbGxvY2F0ZV90MV90YWJsZSggdGFibGUsIG5ld19zaXplICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBpZiAoIGluX29mZnNldCA+PSAwICkKLSAgICAgICAgb2JqZWN0ID0gdGFibGUtPmJsb2NrICsgaW5fb2Zmc2V0OwotICAgIH0KLQotICAgIC8qIGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBiYXNlIGJsb2NrIGFuZCBhZGp1c3Qgb2Zmc2V0ICovCi0gICAgdGFibGUtPmVsZW1lbnRzW2lkeF0gPSB0YWJsZS0+YmxvY2sgKyB0YWJsZS0+Y3Vyc29yOwotICAgIHRhYmxlLT5sZW5ndGhzIFtpZHhdID0gbGVuZ3RoOwotICAgIEZUX01FTV9DT1BZKCB0YWJsZS0+YmxvY2sgKyB0YWJsZS0+Y3Vyc29yLCBvYmplY3QsIGxlbmd0aCApOwotCi0gICAgdGFibGUtPmN1cnNvciArPSBsZW5ndGg7Ci0gICAgcmV0dXJuIFBTYXV4X0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHNfdGFibGVfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluYWxpemVzIGEgUFNfVGFibGVSZWMgKGkuZS4sIHJlYWxsb2NhdGUgaXQgdG8gaXRzIGN1cnJlbnQgICAgICAgICovCi0gIC8qICAgIGN1cnNvcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlIDo6IFRoZSB0YXJnZXQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgcmVsZWFzZSB0aGUgaGVhcCdzIG1lbW9yeSBibG9jay4gIEl0IGlzIHVwICAqLwotICAvKiAgICB0byB0aGUgY2FsbGVyIHRvIGNsZWFuIGl0LCBvciByZWZlcmVuY2UgaXQgaW4gaXRzIG93biBzdHJ1Y3R1cmVzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3RhYmxlX2RvbmUoIFBTX1RhYmxlICB0YWJsZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHRhYmxlLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9CeXRlKiAgIG9sZF9iYXNlID0gdGFibGUtPmJsb2NrOwotCi0KLSAgICAvKiBzaG91bGQgbmV2ZXIgZmFpbCwgYmVjYXVzZSByZWMuY3Vyc29yIDw9IHJlYy5zaXplICovCi0gICAgaWYgKCAhb2xkX2Jhc2UgKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCBGVF9BTExPQyggdGFibGUtPmJsb2NrLCB0YWJsZS0+Y3Vyc29yICkgKQotICAgICAgcmV0dXJuOwotICAgIEZUX01FTV9DT1BZKCB0YWJsZS0+YmxvY2ssIG9sZF9iYXNlLCB0YWJsZS0+Y3Vyc29yICk7Ci0gICAgc2hpZnRfZWxlbWVudHMoIHRhYmxlLCBvbGRfYmFzZSApOwotCi0gICAgdGFibGUtPmNhcGFjaXR5ID0gdGFibGUtPmN1cnNvcjsKLSAgICBGVF9GUkVFKCBvbGRfYmFzZSApOwotCi0gICAgRlRfVU5VU0VEKCBlcnJvciApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc190YWJsZV9yZWxlYXNlKCBQU19UYWJsZSAgdGFibGUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSB0YWJsZS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIChGVF9VTG9uZyl0YWJsZS0+aW5pdCA9PSAweERFQURCRUVGVUwgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIHRhYmxlLT5ibG9jayApOwotICAgICAgRlRfRlJFRSggdGFibGUtPmVsZW1lbnRzICk7Ci0gICAgICBGVF9GUkVFKCB0YWJsZS0+bGVuZ3RocyApOwotICAgICAgdGFibGUtPmluaXQgPSAwOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFBBUlNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhbHJlYWR5IHBhcnQgb2YgdGhlIGNvbW1lbnQgKi8KLQotICBzdGF0aWMgdm9pZAotICBza2lwX2NvbW1lbnQoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0ICkKLSAgewotICAgIEZUX0J5dGUqICBjdXIgPSAqYWN1cjsKLQotCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgaWYgKCBJU19QU19ORVdMSU5FKCAqY3VyICkgKQotICAgICAgICBicmVhazsKLSAgICAgIGN1cisrOwotICAgIH0KLQotICAgICphY3VyID0gY3VyOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBza2lwX3NwYWNlcyggRlRfQnl0ZSogICphY3VyLAotICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyID0gKmFjdXI7Ci0KLQotICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIGlmICggIUlTX1BTX1NQQUNFKCAqY3VyICkgKQotICAgICAgewotICAgICAgICBpZiAoICpjdXIgPT0gJyUnICkKLSAgICAgICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIFBMUk0sIGEgY29tbWVudCBpcyBlcXVhbCB0byBhIHNwYWNlLiAqLwotICAgICAgICAgIHNraXBfY29tbWVudCggJmN1ciwgbGltaXQgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY3VyKys7Ci0gICAgfQotCi0gICAgKmFjdXIgPSBjdXI7Ci0gIH0KLQotCi0jZGVmaW5lIElTX09DVEFMX0RJR0lUKCBjICkgKCAnMCcgPD0gKGMpICYmIChjKSA8PSAnNycgKQotCi0KLSAgLyogZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgYCgnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAqYWN1ciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGNsb3NpbmcgYCknICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHNraXBfbGl0ZXJhbF9zdHJpbmcoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgICAgIGN1ciAgID0gKmFjdXI7Ci0gICAgRlRfSW50ICAgICAgICBlbWJlZCA9IDA7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciA9IFBTYXV4X0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgIHVuc2lnbmVkIGludCAgaTsKLQotCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgRlRfQnl0ZSAgYyA9ICpjdXI7Ci0KLQotICAgICAgKytjdXI7Ci0KLSAgICAgIGlmICggYyA9PSAnXFwnICkKLSAgICAgIHsKLSAgICAgICAgLyogUmVkIEJvb2sgM3JkIGVkLiwgc2VjdGlvbiBgTGl0ZXJhbCBUZXh0IFN0cmluZ3MnLCBwLiAyOTogICAgICovCi0gICAgICAgIC8qIEEgYmFja3NsYXNoIGNhbiBpbnRyb2R1Y2UgdGhyZWUgZGlmZmVyZW50IHR5cGVzICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBvZiBlc2NhcGUgc2VxdWVuY2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAtIGEgc3BlY2lhbCBlc2NhcGVkIGNoYXIgbGlrZSBcciwgXG4sIGV0Yy4gICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgLSBhIG9uZS0sIHR3by0sIG9yIHRocmVlLWRpZ2l0IG9jdGFsIG51bWJlciAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgIC0gbm9uZSBvZiB0aGUgYWJvdmUgaW4gd2hpY2ggY2FzZSB0aGUgYmFja3NsYXNoIGlzIGlnbm9yZWQgKi8KLQotICAgICAgICBpZiAoIGN1ciA9PSBsaW1pdCApCi0gICAgICAgICAgLyogZXJyb3IgKG9yIHRvIGJlIGlnbm9yZWQ/KSAqLwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHN3aXRjaCAoICpjdXIgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc2tpcCBgc3BlY2lhbCcgZXNjYXBlICovCi0gICAgICAgIGNhc2UgJ24nOgotICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgIGNhc2UgJ2InOgotICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICBjYXNlICcoJzoKLSAgICAgICAgY2FzZSAnKSc6Ci0gICAgICAgICAgKytjdXI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAvKiBza2lwIG9jdGFsIGVzY2FwZSBvciBpZ25vcmUgYmFja3NsYXNoICovCi0gICAgICAgICAgZm9yICggaSA9IDA7IGkgPCAzICYmIGN1ciA8IGxpbWl0OyArK2kgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggISBJU19PQ1RBTF9ESUdJVCggKmN1ciApICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICsrY3VyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGMgPT0gJygnICkKLSAgICAgICAgZW1iZWQrKzsKLSAgICAgIGVsc2UgaWYgKCBjID09ICcpJyApCi0gICAgICB7Ci0gICAgICAgIGVtYmVkLS07Ci0gICAgICAgIGlmICggZW1iZWQgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IFBTYXV4X0Vycl9PazsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICphY3VyID0gY3VyOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBgPCcgKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgc2tpcF9zdHJpbmcoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1ciA9ICphY3VyOwotICAgIEZUX0Vycm9yICBlcnIgPSAgUFNhdXhfRXJyX09rOwotCi0KLSAgICB3aGlsZSAoICsrY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIC8qIEFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIGlnbm9yZWQuICovCi0gICAgICBza2lwX3NwYWNlcyggJmN1ciwgbGltaXQgKTsKLSAgICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggIUlTX1BTX1hESUdJVCggKmN1ciApICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCBjdXIgPCBsaW1pdCAmJiAqY3VyICE9ICc+JyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAic2tpcF9zdHJpbmc6IG1pc3NpbmcgY2xvc2luZyBkZWxpbWl0ZXIgYD4nXG4iICkpOwotICAgICAgZXJyID0gUFNhdXhfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGN1cisrOwotCi0gICAgKmFjdXIgPSBjdXI7Ci0gICAgcmV0dXJuIGVycjsKLSAgfQotCi0KLSAgLyogZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgdGhlIG9wZW5pbmcgYnJhY2UgdGhhdCAqLwotICAvKiBzdGFydHMgdGhlIHByb2NlZHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogTkI6IFsgYW5kIF0gbmVlZCBub3QgbWF0Y2g6ICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgL2ZvbyB7W30gZGVmJyBpcyBhIHZhbGlkIFBvc3RTY3JpcHQgZnJhZ21lbnQsICovCi0gIC8qIGV2ZW4gd2l0aGluIGEgVHlwZTEgZm9udCAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgc2tpcF9wcm9jZWR1cmUoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1cjsKLSAgICBGVF9JbnQgICAgZW1iZWQgPSAwOwotICAgIEZUX0Vycm9yICBlcnJvciA9IFBTYXV4X0Vycl9PazsKLQotCi0gICAgRlRfQVNTRVJUKCAqKmFjdXIgPT0gJ3snICk7Ci0KLSAgICBmb3IgKCBjdXIgPSAqYWN1cjsgY3VyIDwgbGltaXQgJiYgZXJyb3IgPT0gUFNhdXhfRXJyX09rOyArK2N1ciApCi0gICAgewotICAgICAgc3dpdGNoICggKmN1ciApCi0gICAgICB7Ci0gICAgICBjYXNlICd7JzoKLSAgICAgICAgKytlbWJlZDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgJ30nOgotICAgICAgICAtLWVtYmVkOwotICAgICAgICBpZiAoIGVtYmVkID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgKytjdXI7Ci0gICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgJygnOgotICAgICAgICBlcnJvciA9IHNraXBfbGl0ZXJhbF9zdHJpbmcoICZjdXIsIGxpbWl0ICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlICc8JzoKLSAgICAgICAgZXJyb3IgPSBza2lwX3N0cmluZyggJmN1ciwgbGltaXQgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgJyUnOgotICAgICAgICBza2lwX2NvbW1lbnQoICZjdXIsIGxpbWl0ICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICBlbmQ6Ci0gICAgaWYgKCBlbWJlZCAhPSAwICkKLSAgICAgIGVycm9yID0gUFNhdXhfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0KLSAgICAqYWN1ciA9IGN1cjsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbCBleHBvcnRlZCBwYXJzaW5nIHJvdXRpbmVzIGhhbmRsZSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHN0b3AgYXQgKi8KLSAgLyogdGhlIGZpcnN0IGNoYXJhY3RlciB3aGljaCBpc24ndCBwYXJ0IG9mIHRoZSBqdXN0IGhhbmRsZWQgdG9rZW4uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBQU19QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICAvKiBOb3RlOiBQb3N0U2NyaXB0IGFsbG93cyBhbnkgbm9uLWRlbGltaXRpbmcsIG5vbi13aGl0ZXNwYWNlICAgICAgICAqLwotICAgIC8qICAgICAgIGNoYXJhY3RlciBpbiBhIG5hbWUgKFBTIFJlZiBNYW51YWwsIDNyZCBlZCwgcDMxKS4gICAgICAgICAgICovCi0gICAgLyogICAgICAgUG9zdFNjcmlwdCBkZWxpbWl0ZXJzIGFyZSAoLCApLCA8LCA+LCBbLCBdLCB7LCB9LCAvLCBhbmQgJS4gKi8KLQotICAgIEZUX0J5dGUqICBjdXIgICA9IHBhcnNlci0+Y3Vyc29yOwotICAgIEZUX0J5dGUqICBsaW1pdCA9IHBhcnNlci0+bGltaXQ7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gUFNhdXhfRXJyX09rOwotCi0KLSAgICBza2lwX3NwYWNlcyggJmN1ciwgbGltaXQgKTsgICAgICAgICAgICAgLyogdGhpcyBhbHNvIHNraXBzIGNvbW1lbnRzICovCi0gICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2VsZi1kZWxpbWl0aW5nLCBzaW5nbGUtY2hhcmFjdGVyIHRva2VucyAqLwotICAgIGlmICggKmN1ciA9PSAnWycgfHwgKmN1ciA9PSAnXScgKQotICAgIHsKLSAgICAgIGN1cisrOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHNraXAgYmFsYW5jZWQgZXhwcmVzc2lvbnMgKHByb2NlZHVyZXMgYW5kIHN0cmluZ3MpICovCi0KLSAgICBpZiAoICpjdXIgPT0gJ3snICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB7Li4ufSAqLwotICAgIHsKLSAgICAgIGVycm9yID0gc2tpcF9wcm9jZWR1cmUoICZjdXIsIGxpbWl0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAqY3VyID09ICcoJyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKC4uLikgKi8KLSAgICB7Ci0gICAgICBlcnJvciA9IHNraXBfbGl0ZXJhbF9zdHJpbmcoICZjdXIsIGxpbWl0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAqY3VyID09ICc8JyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPC4uLj4gKi8KLSAgICB7Ci0gICAgICBpZiAoIGN1ciArIDEgPCBsaW1pdCAmJiAqKGN1ciArIDEpID09ICc8JyApICAgLyogPDwgKi8KLSAgICAgIHsKLSAgICAgICAgY3VyKys7Ci0gICAgICAgIGN1cisrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IHNraXBfc3RyaW5nKCAmY3VyLCBsaW1pdCApOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAqY3VyID09ICc+JyApCi0gICAgewotICAgICAgY3VyKys7Ci0gICAgICBpZiAoIGN1ciA+PSBsaW1pdCB8fCAqY3VyICE9ICc+JyApICAgICAgICAgICAgIC8qID4+ICovCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX3BhcnNlcl9za2lwX1BTX3Rva2VuOiAiCi0gICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgY2xvc2luZyBkZWxpbWl0ZXIgYD4nXG4iICkpOwotICAgICAgICBlcnJvciA9IFBTYXV4X0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBjdXIrKzsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoICpjdXIgPT0gJy8nICkKLSAgICAgIGN1cisrOwotCi0gICAgLyogYW55dGhpbmcgZWxzZSAqLwotICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIC8qICpjdXIgbWlnaHQgYmUgaW52YWxpZCAoZS5nLiwgJyknIG9yICd9JyksIGJ1dCB0aGlzICAgKi8KLSAgICAgIC8qIGlzIGhhbmRsZWQgYnkgdGhlIHRlc3QgYGN1ciA9PSBwYXJzZXItPmN1cnNvcicgYmVsb3cgKi8KLSAgICAgIGlmICggSVNfUFNfREVMSU0oICpjdXIgKSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjdXIrKzsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGN1ciA9PSBwYXJzZXItPmN1cnNvciApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicHNfcGFyc2VyX3NraXBfUFNfdG9rZW46ICIKLSAgICAgICAgICAgICAgICAgImN1cnJlbnQgdG9rZW4gaXMgYCVjJywgd2hpY2ggaXMgc2VsZi1kZWxpbWl0aW5nICIKLSAgICAgICAgICAgICAgICAgImJ1dCBpbnZhbGlkIGF0IHRoaXMgcG9pbnRcbiIsCi0gICAgICAgICAgICAgICAgICpjdXIgKSk7Ci0KLSAgICAgIGVycm9yID0gUFNhdXhfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5lcnJvciAgPSBlcnJvcjsKLSAgICBwYXJzZXItPmN1cnNvciA9IGN1cjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBQU19QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBza2lwX3NwYWNlcyggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0ICk7Ci0gIH0KLQotCi0gIC8qIGB0b2tlbicgaGVyZSBtZWFucyBlaXRoZXIgc29tZXRoaW5nIGJldHdlZW4gYmFsYW5jZWQgZGVsaW1pdGVycyAqLwotICAvKiBvciB0aGUgbmV4dCB0b2tlbjsgdGhlIGRlbGltaXRlcnMgYXJlIG5vdCByZW1vdmVkLiAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc19wYXJzZXJfdG9fdG9rZW4oIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuICAgdG9rZW4gKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1cjsKLSAgICBGVF9CeXRlKiAgbGltaXQ7Ci0gICAgRlRfSW50ICAgIGVtYmVkOwotCi0KLSAgICB0b2tlbi0+dHlwZSAgPSBUMV9UT0tFTl9UWVBFX05PTkU7Ci0gICAgdG9rZW4tPnN0YXJ0ID0gMDsKLSAgICB0b2tlbi0+bGltaXQgPSAwOwotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICBjdXIgICA9IHBhcnNlci0+Y3Vyc29yOwotICAgIGxpbWl0ID0gcGFyc2VyLT5saW1pdDsKLQotICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgIHJldHVybjsKLQotICAgIHN3aXRjaCAoICpjdXIgKQotICAgIHsKLSAgICAgIC8qKioqKioqKioqKioqIGNoZWNrIGZvciBsaXRlcmFsIHN0cmluZyAqKioqKioqKioqKioqKioqKi8KLSAgICBjYXNlICcoJzoKLSAgICAgIHRva2VuLT50eXBlICA9IFQxX1RPS0VOX1RZUEVfU1RSSU5HOwotICAgICAgdG9rZW4tPnN0YXJ0ID0gY3VyOwotCi0gICAgICBpZiAoIHNraXBfbGl0ZXJhbF9zdHJpbmcoICZjdXIsIGxpbWl0ICkgPT0gUFNhdXhfRXJyX09rICkKLSAgICAgICAgdG9rZW4tPmxpbWl0ID0gY3VyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qKioqKioqKioqKioqIGNoZWNrIGZvciBwcm9ncmFtcy9hcnJheSAqKioqKioqKioqKioqKioqKi8KLSAgICBjYXNlICd7JzoKLSAgICAgIHRva2VuLT50eXBlICA9IFQxX1RPS0VOX1RZUEVfQVJSQVk7Ci0gICAgICB0b2tlbi0+c3RhcnQgPSBjdXI7Ci0KLSAgICAgIGlmICggc2tpcF9wcm9jZWR1cmUoICZjdXIsIGxpbWl0ICkgPT0gUFNhdXhfRXJyX09rICkKLSAgICAgICAgdG9rZW4tPmxpbWl0ID0gY3VyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qKioqKioqKioqKioqIGNoZWNrIGZvciB0YWJsZS9hcnJheSAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qIFhYWDogaW4gdGhlb3J5IHdlIHNob3VsZCBhbHNvIGxvb2sgZm9yICI8PCIgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgc2luY2UgdGhpcyBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byAiWyI7ICAgKi8KLSAgICAgIC8qICAgICAgaW4gcHJhY3RpY2UgaXQgZG9lc24ndCBtYXR0ZXIgKD8pICAgICAgICAgICAgICAgKi8KLSAgICBjYXNlICdbJzoKLSAgICAgIHRva2VuLT50eXBlICA9IFQxX1RPS0VOX1RZUEVfQVJSQVk7Ci0gICAgICBlbWJlZCAgICAgICAgPSAxOwotICAgICAgdG9rZW4tPnN0YXJ0ID0gY3VyKys7Ci0KLSAgICAgIC8qIHdlIG5lZWQgdGhpcyB0byBjYXRjaCBgWyBdJyAqLwotICAgICAgcGFyc2VyLT5jdXJzb3IgPSBjdXI7Ci0gICAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIHBhcnNlciApOwotICAgICAgY3VyID0gcGFyc2VyLT5jdXJzb3I7Ci0KLSAgICAgIHdoaWxlICggY3VyIDwgbGltaXQgJiYgIXBhcnNlci0+ZXJyb3IgKQotICAgICAgewotICAgICAgICAvKiBYWFg6IHRoaXMgaXMgd3JvbmcgYmVjYXVzZSBpdCBkb2VzIG5vdCAgICAgICovCi0gICAgICAgIC8qICAgICAgc2tpcCBjb21tZW50cywgcHJvY2VkdXJlcywgYW5kIHN0cmluZ3MgKi8KLSAgICAgICAgaWYgKCAqY3VyID09ICdbJyApCi0gICAgICAgICAgZW1iZWQrKzsKLSAgICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJ10nICkKLSAgICAgICAgewotICAgICAgICAgIGVtYmVkLS07Ci0gICAgICAgICAgaWYgKCBlbWJlZCA8PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0b2tlbi0+bGltaXQgPSArK2N1cjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBhcnNlci0+Y3Vyc29yID0gY3VyOwotICAgICAgICBwc19wYXJzZXJfc2tpcF9QU190b2tlbiggcGFyc2VyICk7Ci0gICAgICAgIC8qIHdlIG5lZWQgdGhpcyB0byBjYXRjaCBgW1hYWCBdJyAqLwotICAgICAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMgICggcGFyc2VyICk7Ci0gICAgICAgIGN1ciA9IHBhcnNlci0+Y3Vyc29yOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qICoqKioqKioqKioqKiBvdGhlcndpc2UsIGl0IGlzIGFueSB0b2tlbiAqKioqKioqKioqKioqKi8KLSAgICBkZWZhdWx0OgotICAgICAgdG9rZW4tPnN0YXJ0ID0gY3VyOwotICAgICAgdG9rZW4tPnR5cGUgID0gKCAqY3VyID09ICcvJyA/IFQxX1RPS0VOX1RZUEVfS0VZIDogVDFfVE9LRU5fVFlQRV9BTlkgKTsKLSAgICAgIHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBwYXJzZXIgKTsKLSAgICAgIGN1ciA9IHBhcnNlci0+Y3Vyc29yOwotICAgICAgaWYgKCAhcGFyc2VyLT5lcnJvciApCi0gICAgICAgIHRva2VuLT5saW1pdCA9IGN1cjsKLSAgICB9Ci0KLSAgICBpZiAoICF0b2tlbi0+bGltaXQgKQotICAgIHsKLSAgICAgIHRva2VuLT5zdGFydCA9IDA7Ci0gICAgICB0b2tlbi0+dHlwZSAgPSBUMV9UT0tFTl9UWVBFX05PTkU7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jdXJzb3IgPSBjdXI7Ci0gIH0KLQotCi0gIC8qIE5COiBgdG9rZW5zJyBjYW4gYmUgTlVMTCBpZiB3ZSBvbmx5IHdhbnQgdG8gY291bnQgKi8KLSAgLyogdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3BhcnNlcl90b190b2tlbl9hcnJheSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfVG9rZW4gICB0b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBtYXhfdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogICAgcG51bV90b2tlbnMgKQotICB7Ci0gICAgVDFfVG9rZW5SZWMgIG1hc3RlcjsKLQotCi0gICAgKnBudW1fdG9rZW5zID0gLTE7Ci0KLSAgICAvKiB0aGlzIGFsc28gaGFuZGxlcyBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgICBwc19wYXJzZXJfdG9fdG9rZW4oIHBhcnNlciwgJm1hc3RlciApOwotCi0gICAgaWYgKCBtYXN0ZXIudHlwZSA9PSBUMV9UT0tFTl9UWVBFX0FSUkFZICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgb2xkX2N1cnNvciA9IHBhcnNlci0+Y3Vyc29yOwotICAgICAgRlRfQnl0ZSogIG9sZF9saW1pdCAgPSBwYXJzZXItPmxpbWl0OwotICAgICAgVDFfVG9rZW4gIGN1ciAgICAgICAgPSB0b2tlbnM7Ci0gICAgICBUMV9Ub2tlbiAgbGltaXQgICAgICA9IGN1ciArIG1heF90b2tlbnM7Ci0KLQotICAgICAgLyogZG9uJ3QgaW5jbHVkZSBvdXRlcm1vc3QgZGVsaW1pdGVycyAqLwotICAgICAgcGFyc2VyLT5jdXJzb3IgPSBtYXN0ZXIuc3RhcnQgKyAxOwotICAgICAgcGFyc2VyLT5saW1pdCAgPSBtYXN0ZXIubGltaXQgLSAxOwotCi0gICAgICB3aGlsZSAoIHBhcnNlci0+Y3Vyc29yIDwgcGFyc2VyLT5saW1pdCApCi0gICAgICB7Ci0gICAgICAgIFQxX1Rva2VuUmVjICB0b2tlbjsKLQotCi0gICAgICAgIHBzX3BhcnNlcl90b190b2tlbiggcGFyc2VyLCAmdG9rZW4gKTsKLSAgICAgICAgaWYgKCAhdG9rZW4udHlwZSApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCB0b2tlbnMgIT0gTlVMTCAmJiBjdXIgPCBsaW1pdCApCi0gICAgICAgICAgKmN1ciA9IHRva2VuOwotCi0gICAgICAgIGN1cisrOwotICAgICAgfQotCi0gICAgICAqcG51bV90b2tlbnMgPSAoRlRfSW50KSggY3VyIC0gdG9rZW5zICk7Ci0KLSAgICAgIHBhcnNlci0+Y3Vyc29yID0gb2xkX2N1cnNvcjsKLSAgICAgIHBhcnNlci0+bGltaXQgID0gb2xkX2xpbWl0OwotICAgIH0KLSAgfQotCi0KLSAgLyogZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgYSBkZWxpbWl0ZXIgb3IgYSBwYXJ0IG9mIGEgbnVtYmVyICovCi0gIC8qIE5COiBgY29vcmRzJyBjYW4gYmUgTlVMTCBpZiB3ZSBqdXN0IHdhbnQgdG8gc2tpcCB0aGUgICAgICAqLwotICAvKiAgICAgYXJyYXk7IGluIHRoaXMgY2FzZSB3ZSBpZ25vcmUgYG1heF9jb29yZHMnICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgRlRfSW50Ci0gIHBzX3RvY29vcmRhcnJheSggRlRfQnl0ZSogICphY3VyLAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfY29vcmRzLAotICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgY29vcmRzICkKLSAgewotICAgIEZUX0J5dGUqICBjdXIgICA9ICphY3VyOwotICAgIEZUX0ludCAgICBjb3VudCA9IDA7Ci0gICAgRlRfQnl0ZSAgIGMsIGVuZGVyOwotCi0KLSAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayBmb3IgdGhlIGJlZ2lubmluZyBvZiBhbiBhcnJheTsgb3RoZXJ3aXNlLCBvbmx5IG9uZSBudW1iZXIgKi8KLSAgICAvKiB3aWxsIGJlIHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBjICAgICA9ICpjdXI7Ci0gICAgZW5kZXIgPSAwOwotCi0gICAgaWYgKCBjID09ICdbJyApCi0gICAgICBlbmRlciA9ICddJzsKLSAgICBlbHNlIGlmICggYyA9PSAneycgKQotICAgICAgZW5kZXIgPSAnfSc7Ci0KLSAgICBpZiAoIGVuZGVyICkKLSAgICAgIGN1cisrOwotCi0gICAgLyogbm93LCByZWFkIHRoZSBjb29yZGluYXRlcyAqLwotICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIEZUX1Nob3J0ICBkdW1teTsKLSAgICAgIEZUX0J5dGUqICBvbGRfY3VyOwotCi0KLSAgICAgIC8qIHNraXAgd2hpdGVzcGFjZSBpbiBmcm9udCBvZiBkYXRhICovCi0gICAgICBza2lwX3NwYWNlcyggJmN1ciwgbGltaXQgKTsKLSAgICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoICpjdXIgPT0gZW5kZXIgKQotICAgICAgewotICAgICAgICBjdXIrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIG9sZF9jdXIgPSBjdXI7Ci0KLSAgICAgIGlmICggY29vcmRzICE9IE5VTEwgJiYgY291bnQgPj0gbWF4X2Nvb3JkcyApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBjYWxsIFBTX0NvbnZfVG9GaXhlZCgpIGV2ZW4gaWYgY29vcmRzID09IE5VTEwgKi8KLSAgICAgIC8qIHRvIHByb3Blcmx5IHBhcnNlIG51bWJlciBhdCBgY3VyJyAgICAgICAgICAgICAqLwotICAgICAgKiggY29vcmRzICE9IE5VTEwgPyAmY29vcmRzW2NvdW50XSA6ICZkdW1teSApID0KLSAgICAgICAgKEZUX1Nob3J0KSggUFNfQ29udl9Ub0ZpeGVkKCAmY3VyLCBsaW1pdCwgMCApID4+IDE2ICk7Ci0KLSAgICAgIGlmICggb2xkX2N1ciA9PSBjdXIgKQotICAgICAgewotICAgICAgICBjb3VudCA9IC0xOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGNvdW50Kys7Ci0KLSAgICAgIGlmICggIWVuZGVyICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKmFjdXIgPSBjdXI7Ci0gICAgcmV0dXJuIGNvdW50OwotICB9Ci0KLQotICAvKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGRlbGltaXRlciBvciBhIHBhcnQgb2YgYSBudW1iZXIgKi8KLSAgLyogTkI6IGB2YWx1ZXMnIGNhbiBiZSBOVUxMIGlmIHdlIGp1c3Qgd2FudCB0byBza2lwIHRoZSAgICAgICovCi0gIC8qICAgICBhcnJheTsgaW4gdGhpcyBjYXNlIHdlIGlnbm9yZSBgbWF4X3ZhbHVlcycgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9JbnQKLSAgcHNfdG9maXhlZGFycmF5KCBGVF9CeXRlKiAgKmFjdXIsCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIG1heF92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1ciAgID0gKmFjdXI7Ci0gICAgRlRfSW50ICAgIGNvdW50ID0gMDsKLSAgICBGVF9CeXRlICAgYywgZW5kZXI7Ci0KLQotICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFuIGFycmF5LiAgT3RoZXJ3aXNlLCBvbmx5IG9uZSBudW1iZXIgKi8KLSAgICAvKiB3aWxsIGJlIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgYyAgICAgPSAqY3VyOwotICAgIGVuZGVyID0gMDsKLQotICAgIGlmICggYyA9PSAnWycgKQotICAgICAgZW5kZXIgPSAnXSc7Ci0gICAgZWxzZSBpZiAoIGMgPT0gJ3snICkKLSAgICAgIGVuZGVyID0gJ30nOwotCi0gICAgaWYgKCBlbmRlciApCi0gICAgICBjdXIrKzsKLQotICAgIC8qIG5vdywgcmVhZCB0aGUgdmFsdWVzICovCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgRlRfRml4ZWQgIGR1bW15OwotICAgICAgRlRfQnl0ZSogIG9sZF9jdXI7Ci0KLQotICAgICAgLyogc2tpcCB3aGl0ZXNwYWNlIGluIGZyb250IG9mIGRhdGEgKi8KLSAgICAgIHNraXBfc3BhY2VzKCAmY3VyLCBsaW1pdCApOwotICAgICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggKmN1ciA9PSBlbmRlciApCi0gICAgICB7Ci0gICAgICAgIGN1cisrOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgb2xkX2N1ciA9IGN1cjsKLQotICAgICAgaWYgKCB2YWx1ZXMgIT0gTlVMTCAmJiBjb3VudCA+PSBtYXhfdmFsdWVzICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNhbGwgUFNfQ29udl9Ub0ZpeGVkKCkgZXZlbiBpZiBjb29yZHMgPT0gTlVMTCAqLwotICAgICAgLyogdG8gcHJvcGVybHkgcGFyc2UgbnVtYmVyIGF0IGBjdXInICAgICAgICAgICAgICovCi0gICAgICAqKCB2YWx1ZXMgIT0gTlVMTCA/ICZ2YWx1ZXNbY291bnRdIDogJmR1bW15ICkgPQotICAgICAgICBQU19Db252X1RvRml4ZWQoICZjdXIsIGxpbWl0LCBwb3dlcl90ZW4gKTsKLQotICAgICAgaWYgKCBvbGRfY3VyID09IGN1ciApCi0gICAgICB7Ci0gICAgICAgIGNvdW50ID0gLTE7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgY291bnQrKzsKLQotICAgICAgaWYgKCAhZW5kZXIgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICAqYWN1ciA9IGN1cjsKLSAgICByZXR1cm4gY291bnQ7Ci0gIH0KLQotCi0jaWYgMAotCi0gIHN0YXRpYyBGVF9TdHJpbmcqCi0gIHBzX3Rvc3RyaW5nKCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9CeXRlKiAgICBjdXIgPSAqY3Vyc29yOwotICAgIEZUX1B0ckRpc3QgIGxlbiA9IDA7Ci0gICAgRlRfSW50ICAgICAgY291bnQ7Ci0gICAgRlRfU3RyaW5nKiAgcmVzdWx0OwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0KLSAgICAvKiBYWFg6IHNvbWUgc3R1cGlkIGZvbnRzIGhhdmUgYSBgTm90aWNlJyBvciBgQ29weXJpZ2h0JyBzdHJpbmcgICAgICovCi0gICAgLyogICAgICB0aGF0IHNpbXBseSBkb2Vzbid0IGJlZ2luIHdpdGggYW4gb3BlbmluZyBwYXJlbnRoZXNpcywgZXZlbiAqLwotICAgIC8qICAgICAgdGhvdWdoIHRoZXkgaGF2ZSBhIGNsb3Npbmcgb25lISAgRS5nLiAiYW11bmNpYWwucGZiIiAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICBXZSBtdXN0IGRlYWwgd2l0aCB0aGVzZSBpbGwtZmF0ZWQgY2FzZXMgdGhlcmUuICBOb3RlIHRoYXQgICAqLwotICAgIC8qICAgICAgdGhlc2UgZm9udHMgZGlkbid0IHdvcmsgd2l0aCB0aGUgb2xkIFR5cGUgMSBkcml2ZXIgYXMgdGhlICAgKi8KLSAgICAvKiAgICAgIG5vdGljZS9jb3B5cmlnaHQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgdmFsaWQgc3RyaW5nIHRva2VuICovCi0gICAgLyogICAgICBhbmQgbWFkZSB0aGUgb2xkIHRva2VuIHBhcnNlciBjb21taXQgZXJyb3JzLiAgICAgICAgICAgICAgICAqLwotCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCAmJiAoICpjdXIgPT0gJyAnIHx8ICpjdXIgPT0gJ1x0JyApICkKLSAgICAgIGN1cisrOwotICAgIGlmICggY3VyICsgMSA+PSBsaW1pdCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggKmN1ciA9PSAnKCcgKQotICAgICAgY3VyKys7ICAvKiBza2lwIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzLCBpZiB0aGVyZSBpcyBvbmUgKi8KLQotICAgICpjdXJzb3IgPSBjdXI7Ci0gICAgY291bnQgICA9IDA7Ci0KLSAgICAvKiB0aGVuLCBjb3VudCBpdHMgbGVuZ3RoICovCi0gICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgIHsKLSAgICAgIGlmICggKmN1ciA9PSAnKCcgKQotICAgICAgICBjb3VudCsrOwotCi0gICAgICBlbHNlIGlmICggKmN1ciA9PSAnKScgKQotICAgICAgewotICAgICAgICBjb3VudC0tOwotICAgICAgICBpZiAoIGNvdW50IDwgMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbGVuID0gY3VyIC0gKmN1cnNvcjsKLSAgICBpZiAoIGN1ciA+PSBsaW1pdCB8fCBGVF9BTExPQyggcmVzdWx0LCBsZW4gKyAxICkgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBub3cgY29weSB0aGUgc3RyaW5nICovCi0gICAgRlRfTUVNX0NPUFkoIHJlc3VsdCwgKmN1cnNvciwgbGVuICk7Ci0gICAgcmVzdWx0W2xlbl0gPSAnXDAnOwotICAgICpjdXJzb3IgPSBjdXI7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgc3RhdGljIGludAotICBwc190b2Jvb2woIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0ICkKLSAgewotICAgIEZUX0J5dGUqICBjdXIgICAgPSAqYWN1cjsKLSAgICBGVF9Cb29sICAgcmVzdWx0ID0gMDsKLQotCi0gICAgLyogcmV0dXJuIDEgaWYgd2UgZmluZCBgdHJ1ZScsIDAgb3RoZXJ3aXNlICovCi0gICAgaWYgKCBjdXIgKyAzIDwgbGltaXQgJiYKLSAgICAgICAgIGN1clswXSA9PSAndCcgICAmJgotICAgICAgICAgY3VyWzFdID09ICdyJyAgICYmCi0gICAgICAgICBjdXJbMl0gPT0gJ3UnICAgJiYKLSAgICAgICAgIGN1clszXSA9PSAnZScgICApCi0gICAgewotICAgICAgcmVzdWx0ID0gMTsKLSAgICAgIGN1ciAgICs9IDU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBjdXIgKyA0IDwgbGltaXQgJiYKLSAgICAgICAgICAgICAgY3VyWzBdID09ICdmJyAgICYmCi0gICAgICAgICAgICAgIGN1clsxXSA9PSAnYScgICAmJgotICAgICAgICAgICAgICBjdXJbMl0gPT0gJ2wnICAgJiYKLSAgICAgICAgICAgICAgY3VyWzNdID09ICdzJyAgICYmCi0gICAgICAgICAgICAgIGN1cls0XSA9PSAnZScgICApCi0gICAgewotICAgICAgcmVzdWx0ID0gMDsKLSAgICAgIGN1ciAgICs9IDY7Ci0gICAgfQotCi0gICAgKmFjdXIgPSBjdXI7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogbG9hZCBhIHNpbXBsZSBmaWVsZCAoaS5lLiBub24tdGFibGUpIGludG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBvYmplY3RzICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHBzX3BhcnNlcl9sb2FkX2ZpZWxkKCBQU19QYXJzZXIgICAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqICAgICAgICAgIG9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbWF4X29iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICkKLSAgewotICAgIFQxX1Rva2VuUmVjICB0b2tlbjsKLSAgICBGVF9CeXRlKiAgICAgY3VyOwotICAgIEZUX0J5dGUqICAgICBsaW1pdDsKLSAgICBGVF9VSW50ICAgICAgY291bnQ7Ci0gICAgRlRfVUludCAgICAgIGlkeDsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0KLQotICAgIC8qIHRoaXMgYWxzbyBza2lwcyBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgICBwc19wYXJzZXJfdG9fdG9rZW4oIHBhcnNlciwgJnRva2VuICk7Ci0gICAgaWYgKCAhdG9rZW4udHlwZSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBjb3VudCA9IDE7Ci0gICAgaWR4ICAgPSAwOwotICAgIGN1ciAgID0gdG9rZW4uc3RhcnQ7Ci0gICAgbGltaXQgPSB0b2tlbi5saW1pdDsKLQotICAgIC8qIHdlIG11c3QgZGV0ZWN0IGFycmF5cyBpbiAvRm9udEJCb3ggKi8KLSAgICBpZiAoIGZpZWxkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfQkJPWCApCi0gICAgewotICAgICAgVDFfVG9rZW5SZWMgIHRva2VuMjsKLSAgICAgIEZUX0J5dGUqICAgICBvbGRfY3VyICAgPSBwYXJzZXItPmN1cnNvcjsKLSAgICAgIEZUX0J5dGUqICAgICBvbGRfbGltaXQgPSBwYXJzZXItPmxpbWl0OwotCi0KLSAgICAgIC8qIGRvbid0IGluY2x1ZGUgZGVsaW1pdGVycyAqLwotICAgICAgcGFyc2VyLT5jdXJzb3IgPSB0b2tlbi5zdGFydCArIDE7Ci0gICAgICBwYXJzZXItPmxpbWl0ICA9IHRva2VuLmxpbWl0IC0gMTsKLQotICAgICAgcHNfcGFyc2VyX3RvX3Rva2VuKCBwYXJzZXIsICZ0b2tlbjIgKTsKLSAgICAgIHBhcnNlci0+Y3Vyc29yID0gb2xkX2N1cjsKLSAgICAgIHBhcnNlci0+bGltaXQgID0gb2xkX2xpbWl0OwotCi0gICAgICBpZiAoIHRva2VuMi50eXBlID09IFQxX1RPS0VOX1RZUEVfQVJSQVkgKQotICAgICAgICBnb3RvIEZpZWxkQXJyYXk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB0b2tlbi50eXBlID09IFQxX1RPS0VOX1RZUEVfQVJSQVkgKQotICAgIHsKLSAgICBGaWVsZEFycmF5OgotICAgICAgLyogaWYgdGhpcyBpcyBhbiBhcnJheSBhbmQgd2UgaGF2ZSBubyBibGVuZCwgYW4gZXJyb3Igb2NjdXJzICovCi0gICAgICBpZiAoIG1heF9vYmplY3RzID09IDAgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGNvdW50ID0gbWF4X29iamVjdHM7Ci0gICAgICBpZHggICA9IDE7Ci0KLSAgICAgIC8qIGRvbid0IGluY2x1ZGUgZGVsaW1pdGVycyAqLwotICAgICAgY3VyKys7Ci0gICAgICBsaW1pdC0tOwotICAgIH0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBpZHgrKyApCi0gICAgewotICAgICAgRlRfQnl0ZSogICAgcSA9IChGVF9CeXRlKilvYmplY3RzW2lkeF0gKyBmaWVsZC0+b2Zmc2V0OwotICAgICAgRlRfTG9uZyAgICAgdmFsOwotICAgICAgRlRfU3RyaW5nKiAgc3RyaW5nOwotCi0KLSAgICAgIHNraXBfc3BhY2VzKCAmY3VyLCBsaW1pdCApOwotCi0gICAgICBzd2l0Y2ggKCBmaWVsZC0+dHlwZSApCi0gICAgICB7Ci0gICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfQk9PTDoKLSAgICAgICAgdmFsID0gcHNfdG9ib29sKCAmY3VyLCBsaW1pdCApOwotICAgICAgICBnb3RvIFN0b3JlX0ludGVnZXI7Ci0KLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9GSVhFRDoKLSAgICAgICAgdmFsID0gUFNfQ29udl9Ub0ZpeGVkKCAmY3VyLCBsaW1pdCwgMCApOwotICAgICAgICBnb3RvIFN0b3JlX0ludGVnZXI7Ci0KLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9GSVhFRF8xMDAwOgotICAgICAgICB2YWwgPSBQU19Db252X1RvRml4ZWQoICZjdXIsIGxpbWl0LCAzICk7Ci0gICAgICAgIGdvdG8gU3RvcmVfSW50ZWdlcjsKLQotICAgICAgY2FzZSBUMV9GSUVMRF9UWVBFX0lOVEVHRVI6Ci0gICAgICAgIHZhbCA9IFBTX0NvbnZfVG9JbnQoICZjdXIsIGxpbWl0ICk7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0gICAgICBTdG9yZV9JbnRlZ2VyOgotICAgICAgICBzd2l0Y2ggKCBmaWVsZC0+c2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAoOCAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAqKEZUX0J5dGUqKXEgPSAoRlRfQnl0ZSl2YWw7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoMTYgLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgKihGVF9VU2hvcnQqKXEgPSAoRlRfVVNob3J0KXZhbDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICgzMiAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAqKEZUX1VJbnQzMiopcSA9IChGVF9VSW50MzIpdmFsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGZvciA2NC1iaXQgc3lzdGVtcyAqLwotICAgICAgICAgICooRlRfTG9uZyopcSA9IHZhbDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBUMV9GSUVMRF9UWVBFX1NUUklORzoKLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9LRVk6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+bWVtb3J5OwotICAgICAgICAgIEZUX1VJbnQgICAgbGVuICAgID0gKEZUX1VJbnQpKCBsaW1pdCAtIGN1ciApOwotCi0KLSAgICAgICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIC8qIHdlIGFsbG93IGJvdGggYSBzdHJpbmcgb3IgYSBuYW1lICAgKi8KLSAgICAgICAgICAvKiBmb3IgY2FzZXMgbGlrZSAvRm9udE5hbWUgKGZvbykgZGVmICovCi0gICAgICAgICAgaWYgKCB0b2tlbi50eXBlID09IFQxX1RPS0VOX1RZUEVfS0VZICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkb24ndCBpbmNsdWRlIGxlYWRpbmcgYC8nICovCi0gICAgICAgICAgICBsZW4tLTsKLSAgICAgICAgICAgIGN1cisrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggdG9rZW4udHlwZSA9PSBUMV9UT0tFTl9UWVBFX1NUUklORyApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogZG9uJ3QgaW5jbHVkZSBkZWxpbWl0aW5nIHBhcmVudGhlc2VzICAgICovCi0gICAgICAgICAgICAvKiBYWFggd2UgZG9uJ3QgaGFuZGxlIDw8Li4uPj4gaGVyZSAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIFhYWCBzaG91bGQgd2UgY29udmVydCBvY3RhbCBlc2NhcGVzPyAgICAqLwotICAgICAgICAgICAgLyogICAgIGlmIHNvLCB3aGF0IGVuY29kaW5nIHNob3VsZCB3ZSB1c2U/ICovCi0gICAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICAgIGxlbiAtPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRVJST1IoKCAicHNfcGFyc2VyX2xvYWRfZmllbGQ6IGV4cGVjdGVkIGEgbmFtZSBvciBzdHJpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIHRva2VuIG9mIHR5cGUgJWQgaW5zdGVhZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSApKTsKLSAgICAgICAgICAgIGVycm9yID0gUFNhdXhfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogZm9yIHRoaXMgdG8gd29yayAoRlRfU3RyaW5nKiopcSBtdXN0IGhhdmUgYmVlbiAqLwotICAgICAgICAgIC8qIGluaXRpYWxpemVkIHRvIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoICooRlRfU3RyaW5nKiopcSAhPSBOVUxMICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTAoKCAicHNfcGFyc2VyX2xvYWRfZmllbGQ6IG92ZXJ3cml0aW5nIGZpZWxkICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmlkZW50ICkpOwotICAgICAgICAgICAgRlRfRlJFRSggKihGVF9TdHJpbmcqKilxICk7Ci0gICAgICAgICAgICAqKEZUX1N0cmluZyoqKXEgPSBOVUxMOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggRlRfQUxMT0MoIHN0cmluZywgbGVuICsgMSApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIEZUX01FTV9DT1BZKCBzdHJpbmcsIGN1ciwgbGVuICk7Ci0gICAgICAgICAgc3RyaW5nW2xlbl0gPSAwOwotCi0gICAgICAgICAgKihGVF9TdHJpbmcqKilxID0gc3RyaW5nOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfQkJPWDoKLSAgICAgICAgewotICAgICAgICAgIEZUX0ZpeGVkICB0ZW1wWzRdOwotICAgICAgICAgIEZUX0JCb3gqICBiYm94ID0gKEZUX0JCb3gqKXE7Ci0gICAgICAgICAgRlRfSW50ICAgIHJlc3VsdDsKLQotCi0gICAgICAgICAgcmVzdWx0ID0gcHNfdG9maXhlZGFycmF5KCAmY3VyLCBsaW1pdCwgNCwgdGVtcCwgMCApOwotCi0gICAgICAgICAgaWYgKCByZXN1bHQgPCAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJwc19wYXJzZXJfbG9hZF9maWVsZDogIgotICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgZm91ciBpbnRlZ2VycyBpbiBib3VuZGluZyBib3hcbiIgKSk7Ci0gICAgICAgICAgICBlcnJvciA9IFBTYXV4X0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGJib3gtPnhNaW4gPSBGVF9Sb3VuZEZpeCggdGVtcFswXSApOwotICAgICAgICAgIGJib3gtPnlNaW4gPSBGVF9Sb3VuZEZpeCggdGVtcFsxXSApOwotICAgICAgICAgIGJib3gtPnhNYXggPSBGVF9Sb3VuZEZpeCggdGVtcFsyXSApOwotICAgICAgICAgIGJib3gtPnlNYXggPSBGVF9Sb3VuZEZpeCggdGVtcFszXSApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAvKiBhbiBlcnJvciBvY2N1cnJlZCAqLwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgfQotCi0jaWYgMCAgLyogb2Jzb2xldGUgLS0ga2VlcCBmb3IgcmVmZXJlbmNlICovCi0gICAgaWYgKCBwZmxhZ3MgKQotICAgICAgKnBmbGFncyB8PSAxTCA8PCBmaWVsZC0+ZmxhZ19iaXQ7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggcGZsYWdzICk7Ci0jZW5kaWYKLQotICAgIGVycm9yID0gUFNhdXhfRXJyX09rOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEZhaWw6Ci0gICAgZXJyb3IgPSBQU2F1eF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0jZGVmaW5lIFQxX01BWF9UQUJMRV9FTEVNRU5UUyAgMzIKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwc19wYXJzZXJfbG9hZF9maWVsZF90YWJsZSggUFNfUGFyc2VyICAgICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIG1heF9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApCi0gIHsKLSAgICBUMV9Ub2tlblJlYyAgZWxlbWVudHNbVDFfTUFYX1RBQkxFX0VMRU1FTlRTXTsKLSAgICBUMV9Ub2tlbiAgICAgdG9rZW47Ci0gICAgRlRfSW50ICAgICAgIG51bV9lbGVtZW50czsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBQU2F1eF9FcnJfT2s7Ci0gICAgRlRfQnl0ZSogICAgIG9sZF9jdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgIG9sZF9saW1pdDsKLSAgICBUMV9GaWVsZFJlYyAgZmllbGRyZWMgPSAqKFQxX0ZpZWxkKWZpZWxkOwotCi0KLSAgICBmaWVsZHJlYy50eXBlID0gVDFfRklFTERfVFlQRV9JTlRFR0VSOwotICAgIGlmICggZmllbGQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSB8fAotICAgICAgICAgZmllbGQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9CQk9YICAgICAgICApCi0gICAgICBmaWVsZHJlYy50eXBlID0gVDFfRklFTERfVFlQRV9GSVhFRDsKLQotICAgIHBzX3BhcnNlcl90b190b2tlbl9hcnJheSggcGFyc2VyLCBlbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX01BWF9UQUJMRV9FTEVNRU5UUywgJm51bV9lbGVtZW50cyApOwotICAgIGlmICggbnVtX2VsZW1lbnRzIDwgMCApCi0gICAgewotICAgICAgZXJyb3IgPSBQU2F1eF9FcnJfSWdub3JlOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBpZiAoIChGVF9VSW50KW51bV9lbGVtZW50cyA+IGZpZWxkLT5hcnJheV9tYXggKQotICAgICAgbnVtX2VsZW1lbnRzID0gZmllbGQtPmFycmF5X21heDsKLQotICAgIG9sZF9jdXJzb3IgPSBwYXJzZXItPmN1cnNvcjsKLSAgICBvbGRfbGltaXQgID0gcGFyc2VyLT5saW1pdDsKLQotICAgIC8qIHdlIHN0b3JlIHRoZSBlbGVtZW50cyBjb3VudCBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAoIGZpZWxkLT50eXBlICE9IFQxX0ZJRUxEX1RZUEVfQkJPWCApCi0gICAgICAqKEZUX0J5dGUqKSggKEZUX0J5dGUqKW9iamVjdHNbMF0gKyBmaWVsZC0+Y291bnRfb2Zmc2V0ICkgPQotICAgICAgICAoRlRfQnl0ZSludW1fZWxlbWVudHM7Ci0KLSAgICAvKiB3ZSBub3cgbG9hZCBlYWNoIGVsZW1lbnQsIGFkanVzdGluZyB0aGUgZmllbGQub2Zmc2V0IG9uIGVhY2ggb25lICovCi0gICAgdG9rZW4gPSBlbGVtZW50czsKLSAgICBmb3IgKCA7IG51bV9lbGVtZW50cyA+IDA7IG51bV9lbGVtZW50cy0tLCB0b2tlbisrICkKLSAgICB7Ci0gICAgICBwYXJzZXItPmN1cnNvciA9IHRva2VuLT5zdGFydDsKLSAgICAgIHBhcnNlci0+bGltaXQgID0gdG9rZW4tPmxpbWl0OwotICAgICAgcHNfcGFyc2VyX2xvYWRfZmllbGQoIHBhcnNlciwgJmZpZWxkcmVjLCBvYmplY3RzLCBtYXhfb2JqZWN0cywgMCApOwotICAgICAgZmllbGRyZWMub2Zmc2V0ICs9IGZpZWxkcmVjLnNpemU7Ci0gICAgfQotCi0jaWYgMCAgLyogb2Jzb2xldGUgLS0ga2VlcCBmb3IgcmVmZXJlbmNlICovCi0gICAgaWYgKCBwZmxhZ3MgKQotICAgICAgKnBmbGFncyB8PSAxTCA8PCBmaWVsZC0+ZmxhZ19iaXQ7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggcGZsYWdzICk7Ci0jZW5kaWYKLQotICAgIHBhcnNlci0+Y3Vyc29yID0gb2xkX2N1cnNvcjsKLSAgICBwYXJzZXItPmxpbWl0ICA9IG9sZF9saW1pdDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Mb25nICkKLSAgcHNfcGFyc2VyX3RvX2ludCggUFNfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBwYXJzZXIgKTsKLSAgICByZXR1cm4gUFNfQ29udl9Ub0ludCggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0ICk7Ci0gIH0KLQotCi0gIC8qIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGA8JyBpZiBgZGVsaW1pdGVycycgaXMgbm9uLXplcm8gKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcHNfcGFyc2VyX3RvX2J5dGVzKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbWF4X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgcG51bV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGRlbGltaXRlcnMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gUFNhdXhfRXJyX09rOwotICAgIEZUX0J5dGUqICBjdXI7Ci0KLQotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0gICAgY3VyID0gcGFyc2VyLT5jdXJzb3I7Ci0KLSAgICBpZiAoIGN1ciA+PSBwYXJzZXItPmxpbWl0ICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggZGVsaW1pdGVycyApCi0gICAgewotICAgICAgaWYgKCAqY3VyICE9ICc8JyApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX3BhcnNlcl90b19ieXRlczogTWlzc2luZyBzdGFydGluZyBkZWxpbWl0ZXIgYDwnXG4iICkpOwotICAgICAgICBlcnJvciA9IFBTYXV4X0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGN1cisrOwotICAgIH0KLQotICAgICpwbnVtX2J5dGVzID0gUFNfQ29udl9BU0NJSUhleERlY29kZSggJmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+bGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9ieXRlcyApOwotCi0gICAgaWYgKCBkZWxpbWl0ZXJzICkKLSAgICB7Ci0gICAgICBpZiAoIGN1ciA8IHBhcnNlci0+bGltaXQgJiYgKmN1ciAhPSAnPicgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJwc19wYXJzZXJfdG9fYnl0ZXM6IE1pc3NpbmcgY2xvc2luZyBkZWxpbWl0ZXIgYD4nXG4iICkpOwotICAgICAgICBlcnJvciA9IFBTYXV4X0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGN1cisrOwotICAgIH0KLQotICAgIHBhcnNlci0+Y3Vyc29yID0gY3VyOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0ZpeGVkICkKLSAgcHNfcGFyc2VyX3RvX2ZpeGVkKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIHBvd2VyX3RlbiApCi0gIHsKLSAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIHBhcnNlciApOwotICAgIHJldHVybiBQU19Db252X1RvRml4ZWQoICZwYXJzZXItPmN1cnNvciwgcGFyc2VyLT5saW1pdCwgcG93ZXJfdGVuICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfSW50ICkKLSAgcHNfcGFyc2VyX3RvX2Nvb3JkX2FycmF5KCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIG1heF9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICBjb29yZHMgKQotICB7Ci0gICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBwYXJzZXIgKTsKLSAgICByZXR1cm4gcHNfdG9jb29yZGFycmF5KCAmcGFyc2VyLT5jdXJzb3IsIHBhcnNlci0+bGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Nvb3JkcywgY29vcmRzICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfSW50ICkKLSAgcHNfcGFyc2VyX3RvX2ZpeGVkX2FycmF5KCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIG1heF92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKQotICB7Ci0gICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBwYXJzZXIgKTsKLSAgICByZXR1cm4gcHNfdG9maXhlZGFycmF5KCAmcGFyc2VyLT5jdXJzb3IsIHBhcnNlci0+bGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbHVlcywgdmFsdWVzLCBwb3dlcl90ZW4gKTsKLSAgfQotCi0KLSNpZiAwCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9TdHJpbmcqICkKLSAgVDFfVG9TdHJpbmcoIFBTX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIHJldHVybiBwc190b3N0cmluZyggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0LCBwYXJzZXItPm1lbW9yeSApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQotICBUMV9Ub0Jvb2woIFBTX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIHJldHVybiBwc190b2Jvb2woICZwYXJzZXItPmN1cnNvciwgcGFyc2VyLT5saW1pdCApOwotICB9Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc19wYXJzZXJfaW5pdCggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgcGFyc2VyLT5lcnJvciAgPSBQU2F1eF9FcnJfT2s7Ci0gICAgcGFyc2VyLT5iYXNlICAgPSBiYXNlOwotICAgIHBhcnNlci0+bGltaXQgID0gbGltaXQ7Ci0gICAgcGFyc2VyLT5jdXJzb3IgPSBiYXNlOwotICAgIHBhcnNlci0+bWVtb3J5ID0gbWVtb3J5OwotICAgIHBhcnNlci0+ZnVuY3MgID0gcHNfcGFyc2VyX2Z1bmNzOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc19wYXJzZXJfZG9uZSggUFNfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBwYXJzZXIgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIEJVSUxERVIgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdDFfYnVpbGRlcl9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVpbGRlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGl6ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgIDo6IFRoZSBjdXJyZW50IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludGluZyA6OiBXaGV0aGVyIGhpbnRpbmcgc2hvdWxkIGJlIGFwcGxpZWQuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0MV9idWlsZGVyX2luaXQoIFQxX0J1aWxkZXIgICAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICBoaW50aW5nICkKLSAgewotICAgIGJ1aWxkZXItPnBhcnNlX3N0YXRlID0gVDFfUGFyc2VfU3RhcnQ7Ci0gICAgYnVpbGRlci0+bG9hZF9wb2ludHMgPSAxOwotCi0gICAgYnVpbGRlci0+ZmFjZSAgID0gZmFjZTsKLSAgICBidWlsZGVyLT5nbHlwaCAgPSBnbHlwaDsKLSAgICBidWlsZGVyLT5tZW1vcnkgPSBmYWNlLT5tZW1vcnk7Ci0KLSAgICBpZiAoIGdseXBoICkKLSAgICB7Ci0gICAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyID0gZ2x5cGgtPmludGVybmFsLT5sb2FkZXI7Ci0KLQotICAgICAgYnVpbGRlci0+bG9hZGVyICA9IGxvYWRlcjsKLSAgICAgIGJ1aWxkZXItPmJhc2UgICAgPSAmbG9hZGVyLT5iYXNlLm91dGxpbmU7Ci0gICAgICBidWlsZGVyLT5jdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudC5vdXRsaW5lOwotICAgICAgRlRfR2x5cGhMb2FkZXJfUmV3aW5kKCBsb2FkZXIgKTsKLQotICAgICAgYnVpbGRlci0+aGludHNfZ2xvYmFscyA9IHNpemUtPmludGVybmFsOwotICAgICAgYnVpbGRlci0+aGludHNfZnVuY3MgICA9IDA7Ci0KLSAgICAgIGlmICggaGludGluZyApCi0gICAgICAgIGJ1aWxkZXItPmhpbnRzX2Z1bmNzID0gZ2x5cGgtPmludGVybmFsLT5nbHlwaF9oaW50czsKLSAgICB9Ci0KLSAgICBidWlsZGVyLT5wb3NfeCA9IDA7Ci0gICAgYnVpbGRlci0+cG9zX3kgPSAwOwotCi0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnggPSAwOwotICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZy55ID0gMDsKLSAgICBidWlsZGVyLT5hZHZhbmNlLnggICAgICA9IDA7Ci0gICAgYnVpbGRlci0+YWR2YW5jZS55ICAgICAgPSAwOwotCi0gICAgYnVpbGRlci0+ZnVuY3MgPSB0MV9idWlsZGVyX2Z1bmNzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MV9idWlsZGVyX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiAgSXRzIGNvbnRlbnRzIGNhbiBzdGlsbCBiZSB1c2VkICAgKi8KLSAgLyogICAgYWZ0ZXIgdGhlIGNhbGwsIGJ1dCB0aGUgZnVuY3Rpb24gc2F2ZXMgaW1wb3J0YW50IGluZm9ybWF0aW9uICAgICAgICovCi0gIC8qICAgIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1aWxkZXIgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGZpbmFsaXplLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdDFfYnVpbGRlcl9kb25lKCBUMV9CdWlsZGVyICBidWlsZGVyICkKLSAgewotICAgIEZUX0dseXBoU2xvdCAgZ2x5cGggPSBidWlsZGVyLT5nbHlwaDsKLQotCi0gICAgaWYgKCBnbHlwaCApCi0gICAgICBnbHlwaC0+b3V0bGluZSA9ICpidWlsZGVyLT5iYXNlOwotICB9Ci0KLQotICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgYGNvdW50JyBtb3JlIHBvaW50cyAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdDFfYnVpbGRlcl9jaGVja19wb2ludHMoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBjb3VudCApCi0gIHsKLSAgICByZXR1cm4gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBidWlsZGVyLT5sb2FkZXIsIGNvdW50LCAwICk7Ci0gIH0KLQotCi0gIC8qIGFkZCBhIG5ldyBwb2ludCwgZG8gbm90IGNoZWNrIHNwYWNlICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlICAgICBmbGFnICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLQotCi0gICAgaWYgKCBidWlsZGVyLT5sb2FkX3BvaW50cyApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgcG9pbnQgICA9IG91dGxpbmUtPnBvaW50cyArIG91dGxpbmUtPm5fcG9pbnRzOwotICAgICAgRlRfQnl0ZSogICAgY29udHJvbCA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgaWYgKCBidWlsZGVyLT5zaGlmdCApCi0gICAgICB7Ci0gICAgICAgIHggPj49IDE2OwotICAgICAgICB5ID4+PSAxNjsKLSAgICAgIH0KLSAgICAgIHBvaW50LT54ID0geDsKLSAgICAgIHBvaW50LT55ID0geTsKLSAgICAgICpjb250cm9sID0gKEZUX0J5dGUpKCBmbGFnID8gRlRfQ1VSVkVfVEFHX09OIDogRlRfQ1VSVkVfVEFHX0NVQklDICk7Ci0KLSAgICAgIGJ1aWxkZXItPmxhc3QgPSAqcG9pbnQ7Ci0gICAgfQotICAgIG91dGxpbmUtPm5fcG9pbnRzKys7Ci0gIH0KLQotCi0gIC8qIGNoZWNrIHNwYWNlIGZvciBhIG5ldyBvbi1jdXJ2ZSBwb2ludCwgdGhlbiBhZGQgaXQgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHQxX2J1aWxkZXJfYWRkX3BvaW50MSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IHQxX2J1aWxkZXJfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAxICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2hlY2sgc3BhY2UgZm9yIGEgbmV3IGNvbnRvdXIsIHRoZW4gYWRkIGl0ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX2FkZF9jb250b3VyKCBUMV9CdWlsZGVyICBidWlsZGVyICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIWJ1aWxkZXItPmxvYWRfcG9pbnRzICkKLSAgICB7Ci0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgICByZXR1cm4gUFNhdXhfRXJyX09rOwotICAgIH0KLQotICAgIGVycm9yID0gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBidWlsZGVyLT5sb2FkZXIsIDAsIDEgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgaWYgKCBvdXRsaW5lLT5uX2NvbnRvdXJzID4gMCApCi0gICAgICAgIG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAxXSA9Ci0gICAgICAgICAgKHNob3J0KSggb3V0bGluZS0+bl9wb2ludHMgLSAxICk7Ci0KLSAgICAgIG91dGxpbmUtPm5fY29udG91cnMrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGlmIGEgcGF0aCB3YXMgYmVndW4sIGFkZCBpdHMgZmlyc3Qgb24tY3VydmUgcG9pbnQgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHQxX2J1aWxkZXJfc3RhcnRfcG9pbnQoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gUFNhdXhfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0KLQotICAgIC8qIHRlc3Qgd2hldGhlciB3ZSBhcmUgYnVpbGRpbmcgYSBuZXcgY29udG91ciAqLwotCi0gICAgaWYgKCBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9PSBUMV9QYXJzZV9IYXZlX1BhdGggKQotICAgICAgZXJyb3IgPSBQU2F1eF9FcnJfT2s7Ci0gICAgZWxzZSBpZiAoIGJ1aWxkZXItPnBhcnNlX3N0YXRlID09IFQxX1BhcnNlX0hhdmVfTW92ZXRvICkKLSAgICB7Ci0gICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX0hhdmVfUGF0aDsKLSAgICAgIGVycm9yID0gdDFfYnVpbGRlcl9hZGRfY29udG91ciggYnVpbGRlciApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHQxX2J1aWxkZXJfYWRkX3BvaW50MSggYnVpbGRlciwgeCwgeSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2xvc2UgdGhlIGN1cnJlbnQgY29udG91ciAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0MV9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSBidWlsZGVyLT5jdXJyZW50OwotCi0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybjsKLQotICAgIC8qIFhYWFg6IFdlIG11c3Qgbm90IGluY2x1ZGUgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIHBhdGggaWYgaXQgKi8KLSAgICAvKiAgICAgICBpcyBsb2NhdGVkIG9uIHRoZSBmaXJzdCBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA+IDEgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICAgIGZpcnN0ICAgPSAwOwotICAgICAgRlRfVmVjdG9yKiAgcDEgICAgICA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwotICAgICAgRlRfVmVjdG9yKiAgcDIgICAgICA9IG91dGxpbmUtPnBvaW50cyArIG91dGxpbmUtPm5fcG9pbnRzIC0gMTsKLSAgICAgIEZUX0J5dGUqICAgIGNvbnRyb2wgPSAoRlRfQnl0ZSopb3V0bGluZS0+dGFncyArIG91dGxpbmUtPm5fcG9pbnRzIC0gMTsKLQotCi0gICAgICBpZiAoIG91dGxpbmUtPm5fY29udG91cnMgPiAxICkKLSAgICAgIHsKLSAgICAgICAgZmlyc3QgPSBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMl0gKyAxOwotICAgICAgICBwMSAgICA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwotICAgICAgfQotCi0gICAgICAvKiBgZGVsZXRlJyBsYXN0IHBvaW50IG9ubHkgaWYgaXQgY29pbmNpZGVzIHdpdGggdGhlIGZpcnN0ICovCi0gICAgICAvKiBwb2ludCBhbmQgaXQgaXMgbm90IGEgY29udHJvbCBwb2ludCAod2hpY2ggY2FuIGhhcHBlbikuICovCi0gICAgICBpZiAoIHAxLT54ID09IHAyLT54ICYmIHAxLT55ID09IHAyLT55ICkKLSAgICAgICAgaWYgKCAqY29udHJvbCA9PSBGVF9DVVJWRV9UQUdfT04gKQotICAgICAgICAgIG91dGxpbmUtPm5fcG9pbnRzLS07Ci0gICAgfQotCi0gICAgaWYgKCBvdXRsaW5lLT5uX2NvbnRvdXJzID4gMCApCi0gICAgICBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV0gPQotICAgICAgICAoc2hvcnQpKCBvdXRsaW5lLT5uX3BvaW50cyAtIDEgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdDFfZGVjcnlwdCggRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgIEZUX09mZnNldCAgbGVuZ3RoLAotICAgICAgICAgICAgICBGVF9VU2hvcnQgIHNlZWQgKQotICB7Ci0gICAgUFNfQ29udl9FZXhlY0RlY29kZSggJmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmc2VlZCApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNvYmpzLmggYi9zcmMvcHNhdXgvcHNvYmpzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2JmMmMuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L3Bzb2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzb2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBQb3N0U2NyaXB0IGZvbnRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTT0JKU19IX18KLSNkZWZpbmUgX19QU09CSlNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFCi0gIGNvbnN0IFBTX1RhYmxlX0Z1bmNzUmVjICAgIHBzX3RhYmxlX2Z1bmNzOwotCi0gIEZUX0NBTExCQUNLX1RBQkxFCi0gIGNvbnN0IFBTX1BhcnNlcl9GdW5jc1JlYyAgIHBzX3BhcnNlcl9mdW5jczsKLQotICBGVF9DQUxMQkFDS19UQUJMRQotICBjb25zdCBUMV9CdWlsZGVyX0Z1bmNzUmVjICB0MV9idWlsZGVyX2Z1bmNzOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcHNfdGFibGVfbmV3KCBQU19UYWJsZSAgIHRhYmxlLAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwc190YWJsZV9hZGQoIFBTX1RhYmxlICAgIHRhYmxlLAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBvYmplY3QsCi0gICAgICAgICAgICAgICAgRlRfUHRyRGlzdCAgbGVuZ3RoICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc190YWJsZV9kb25lKCBQU19UYWJsZSAgdGFibGUgKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfdGFibGVfcmVsZWFzZSggUFNfVGFibGUgIHRhYmxlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgUEFSU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfcGFyc2VyX3NraXBfUFNfdG9rZW4oIFBTX1BhcnNlciAgcGFyc2VyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19wYXJzZXJfdG9fdG9rZW4oIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuICAgdG9rZW4gKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX3BhcnNlcl90b190b2tlbl9hcnJheSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfVG9rZW4gICB0b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBtYXhfdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogICAgcG51bV90b2tlbnMgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwc19wYXJzZXJfbG9hZF9maWVsZCggUFNfUGFyc2VyICAgICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIG1heF9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBzX3BhcnNlcl9sb2FkX2ZpZWxkX3RhYmxlKCBQU19QYXJzZXIgICAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqICAgICAgICAgIG9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbWF4X29iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0xvbmcgKQotICBwc19wYXJzZXJfdG9faW50KCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcHNfcGFyc2VyX3RvX2J5dGVzKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbWF4X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgcG51bV9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGRlbGltaXRlcnMgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9GaXhlZCApCi0gIHBzX3BhcnNlcl90b19maXhlZCggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9JbnQgKQotICBwc19wYXJzZXJfdG9fY29vcmRfYXJyYXkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9JbnQgKQotICBwc19wYXJzZXJfdG9fZml4ZWRfYXJyYXkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIHBvd2VyX3RlbiApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19wYXJzZXJfaW5pdCggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX3BhcnNlcl9kb25lKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIEJVSUxERVIgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0MV9idWlsZGVyX2luaXQoIFQxX0J1aWxkZXIgICAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICBoaW50aW5nICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0MV9idWlsZGVyX2RvbmUoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX2NoZWNrX3BvaW50cyggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGNvdW50ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0MV9idWlsZGVyX2FkZF9wb2ludCggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgZmxhZyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHQxX2J1aWxkZXJfYWRkX3BvaW50MSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHkgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX2FkZF9jb250b3VyKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX3N0YXJ0X3BvaW50KCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5ICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHQxX2J1aWxkZXJfY2xvc2VfY29udG91ciggVDFfQnVpbGRlciAgYnVpbGRlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0MV9kZWNyeXB0KCBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBsZW5ndGgsCi0gICAgICAgICAgICAgIEZUX1VTaG9ydCAgc2VlZCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fUFNPQkpTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3QxY21hcC5jIGIvc3JjL3BzYXV4L3QxY21hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2EyM2RiLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC90MWNtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWNtYXAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIGNoYXJhY3RlciBtYXAgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJ0MWNtYXAuaCIKLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAicHNhdXhlcnIuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICBUWVBFMSBTVEFOREFSRCAoQU5EIEVYUEVSVCkgRU5DT0RJTkcgQ01BUFMgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHQxX2NtYXBfc3RkX2luaXQoIFQxX0NNYXBTdGQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGlzX2V4cGVydCApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgICAgICAgIGZhY2UgICAgPSAoVDFfRmFjZSlGVF9DTUFQX0ZBQ0UoIGNtYXAgKTsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXMgPSAoRlRfU2VydmljZV9Qc0NNYXBzKWZhY2UtPnBzbmFtZXM7Ci0KLQotICAgIGNtYXAtPm51bV9nbHlwaHMgICAgPSBmYWNlLT50eXBlMS5udW1fZ2x5cGhzOwotICAgIGNtYXAtPmdseXBoX25hbWVzICAgPSAoY29uc3QgY2hhciogY29uc3QqKWZhY2UtPnR5cGUxLmdseXBoX25hbWVzOwotICAgIGNtYXAtPnNpZF90b19zdHJpbmcgPSBwc25hbWVzLT5hZG9iZV9zdGRfc3RyaW5nczsKLSAgICBjbWFwLT5jb2RlX3RvX3NpZCAgID0gaXNfZXhwZXJ0ID8gcHNuYW1lcy0+YWRvYmVfZXhwZXJ0X2VuY29kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBzbmFtZXMtPmFkb2JlX3N0ZF9lbmNvZGluZzsKLQotICAgIEZUX0FTU0VSVCggY21hcC0+Y29kZV90b19zaWQgIT0gTlVMTCApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICB0MV9jbWFwX3N0ZF9kb25lKCBUMV9DTWFwU3RkICBjbWFwICkKLSAgewotICAgIGNtYXAtPm51bV9nbHlwaHMgICAgPSAwOwotICAgIGNtYXAtPmdseXBoX25hbWVzICAgPSBOVUxMOwotICAgIGNtYXAtPnNpZF90b19zdHJpbmcgPSBOVUxMOwotICAgIGNtYXAtPmNvZGVfdG9fc2lkICAgPSBOVUxMOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0MV9jbWFwX3N0ZF9jaGFyX2luZGV4KCBUMV9DTWFwU3RkICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludCAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCBjaGFyX2NvZGUgPCAyNTYgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgICBjb2RlLCBuOwotICAgICAgY29uc3QgY2hhciogIGdseXBoX25hbWU7Ci0KLQotICAgICAgLyogY29udmVydCBjaGFyYWN0ZXIgY29kZSB0byBBZG9iZSBTSUQgc3RyaW5nICovCi0gICAgICBjb2RlICAgICAgID0gY21hcC0+Y29kZV90b19zaWRbY2hhcl9jb2RlXTsKLSAgICAgIGdseXBoX25hbWUgPSBjbWFwLT5zaWRfdG9fc3RyaW5nKCBjb2RlICk7Ci0KLSAgICAgIC8qIGxvb2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIG5hbWUgKi8KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgY21hcC0+bnVtX2dseXBoczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogZ25hbWUgPSBjbWFwLT5nbHlwaF9uYW1lc1tuXTsKLQotCi0gICAgICAgIGlmICggZ25hbWUgJiYgZ25hbWVbMF0gPT0gZ2x5cGhfbmFtZVswXSAgJiYKLSAgICAgICAgICAgICBmdF9zdHJjbXAoIGduYW1lLCBnbHlwaF9uYW1lICkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdDFfY21hcF9zdGRfY2hhcl9uZXh0KCBUMV9DTWFwU3RkICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCAgICA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7Ci0KLQotICAgIHdoaWxlICggY2hhcl9jb2RlIDwgMjU2ICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0MV9jbWFwX3N0ZF9jaGFyX2luZGV4KCBjbWFwLCBjaGFyX2NvZGUgKTsKLSAgICAgIGlmICggcmVzdWx0ICE9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGNoYXJfY29kZSsrOwotICAgIH0KLSAgICBjaGFyX2NvZGUgPSAwOwotCi0gIEV4aXQ6Ci0gICAgKnBjaGFyX2NvZGUgPSBjaGFyX2NvZGU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHQxX2NtYXBfc3RhbmRhcmRfaW5pdCggVDFfQ01hcFN0ZCAgY21hcCApCi0gIHsKLSAgICB0MV9jbWFwX3N0ZF9pbml0KCBjbWFwLCAwICk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiBjb25zdCBGVF9DTWFwX0NsYXNzUmVjCi0gIHQxX2NtYXBfc3RhbmRhcmRfY2xhc3NfcmVjID0KLSAgewotICAgIHNpemVvZiAoIFQxX0NNYXBTdGRSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdDFfY21hcF9zdGFuZGFyZF9pbml0LAotICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgdDFfY21hcF9zdGRfZG9uZSwKLSAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXQxX2NtYXBfc3RkX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0MV9jbWFwX3N0ZF9jaGFyX25leHQsCi0KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdDFfY21hcF9leHBlcnRfaW5pdCggVDFfQ01hcFN0ZCAgY21hcCApCi0gIHsKLSAgICB0MV9jbWFwX3N0ZF9pbml0KCBjbWFwLCAxICk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX2V4cGVydF9jbGFzc19yZWMgPQotICB7Ci0gICAgc2l6ZW9mICggVDFfQ01hcFN0ZFJlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0MV9jbWFwX2V4cGVydF9pbml0LAotICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgdDFfY21hcF9zdGRfZG9uZSwKLSAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXQxX2NtYXBfc3RkX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0MV9jbWFwX3N0ZF9jaGFyX25leHQsCi0KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIFRZUEUxIENVU1RPTSBFTkNPRElORyBDTUFQICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0MV9jbWFwX2N1c3RvbV9pbml0KCBUMV9DTWFwQ3VzdG9tICBjbWFwICkKLSAgewotICAgIFQxX0ZhY2UgICAgICBmYWNlICAgICA9IChUMV9GYWNlKUZUX0NNQVBfRkFDRSggY21hcCApOwotICAgIFQxX0VuY29kaW5nICBlbmNvZGluZyA9ICZmYWNlLT50eXBlMS5lbmNvZGluZzsKLQotCi0gICAgY21hcC0+Zmlyc3QgICA9IGVuY29kaW5nLT5jb2RlX2ZpcnN0OwotICAgIGNtYXAtPmNvdW50ICAgPSAoRlRfVUludCkoIGVuY29kaW5nLT5jb2RlX2xhc3QgLSBjbWFwLT5maXJzdCArIDEgKTsKLSAgICBjbWFwLT5pbmRpY2VzID0gZW5jb2RpbmctPmNoYXJfaW5kZXg7Ci0KLSAgICBGVF9BU1NFUlQoIGNtYXAtPmluZGljZXMgIT0gTlVMTCApOwotICAgIEZUX0FTU0VSVCggZW5jb2RpbmctPmNvZGVfZmlyc3QgPD0gZW5jb2RpbmctPmNvZGVfbGFzdCApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHQxX2NtYXBfY3VzdG9tX2RvbmUoIFQxX0NNYXBDdXN0b20gIGNtYXAgKQotICB7Ci0gICAgY21hcC0+aW5kaWNlcyA9IE5VTEw7Ci0gICAgY21hcC0+Zmlyc3QgICA9IDA7Ci0gICAgY21hcC0+Y291bnQgICA9IDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHQxX2NtYXBfY3VzdG9tX2NoYXJfaW5kZXgoIFQxX0NNYXBDdXN0b20gIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICAgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggKCBjaGFyX2NvZGUgPj0gY21hcC0+Zmlyc3QgKSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIGNoYXJfY29kZSA8ICggY21hcC0+Zmlyc3QgKyBjbWFwLT5jb3VudCApICkgKQotICAgICAgcmVzdWx0ID0gY21hcC0+aW5kaWNlc1tjaGFyX2NvZGVdOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdDFfY21hcF9jdXN0b21fY2hhcl9uZXh0KCBUMV9DTWFwQ3VzdG9tICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludCAgICByZXN1bHQgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGU7Ci0KLQotICAgICsrY2hhcl9jb2RlOwotCi0gICAgaWYgKCBjaGFyX2NvZGUgPCBjbWFwLT5maXJzdCApCi0gICAgICBjaGFyX2NvZGUgPSBjbWFwLT5maXJzdDsKLQotICAgIGZvciAoIDsgY2hhcl9jb2RlIDwgKCBjbWFwLT5maXJzdCArIGNtYXAtPmNvdW50ICk7IGNoYXJfY29kZSsrICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjbWFwLT5pbmRpY2VzW2NoYXJfY29kZV07Ci0gICAgICBpZiAoIHJlc3VsdCAhPSAwICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGNoYXJfY29kZSA9IDA7Ci0KLSAgRXhpdDoKLSAgICAqcGNoYXJfY29kZSA9IGNoYXJfY29kZTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX2N1c3RvbV9jbGFzc19yZWMgPQotICB7Ci0gICAgc2l6ZW9mICggVDFfQ01hcEN1c3RvbVJlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0MV9jbWFwX2N1c3RvbV9pbml0LAotICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgdDFfY21hcF9jdXN0b21fZG9uZSwKLSAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXQxX2NtYXBfY3VzdG9tX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0MV9jbWFwX2N1c3RvbV9jaGFyX25leHQsCi0KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICBUWVBFMSBTWU5USEVUSUMgVU5JQ09ERSBFTkNPRElORyBDTUFQICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9DQUxMQkFDS19ERUYoIGNvbnN0IGNoYXIgKiApCi0gIHQxX2dldF9nbHlwaF9uYW1lKCBUMV9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgaWR4ICkKLSAgewotICAgIHJldHVybiBmYWNlLT50eXBlMS5nbHlwaF9uYW1lc1tpZHhdOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdDFfY21hcF91bmljb2RlX2luaXQoIFBTX1VuaWNvZGVzICB1bmljb2RlcyApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgICAgICAgIGZhY2UgICAgPSAoVDFfRmFjZSlGVF9DTUFQX0ZBQ0UoIHVuaWNvZGVzICk7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXMgPSAoRlRfU2VydmljZV9Qc0NNYXBzKWZhY2UtPnBzbmFtZXM7Ci0KLQotICAgIHJldHVybiBwc25hbWVzLT51bmljb2Rlc19pbml0KCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50eXBlMS5udW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFNfR2V0R2x5cGhOYW1lRnVuYykmdDFfZ2V0X2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19GcmVlR2x5cGhOYW1lRnVuYylOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfUG9pbnRlcilmYWNlICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHQxX2NtYXBfdW5pY29kZV9kb25lKCBQU19Vbmljb2RlcyAgdW5pY29kZXMgKQotICB7Ci0gICAgRlRfRmFjZSAgICBmYWNlICAgPSBGVF9DTUFQX0ZBQ0UoIHVuaWNvZGVzICk7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICBGVF9GUkVFKCB1bmljb2Rlcy0+bWFwcyApOwotICAgIHVuaWNvZGVzLT5udW1fbWFwcyA9IDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHQxX2NtYXBfdW5pY29kZV9jaGFyX2luZGV4KCBQU19Vbmljb2RlcyAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgY2hhcl9jb2RlICkKLSAgewotICAgIFQxX0ZhY2UgICAgICAgICAgICAgZmFjZSAgICA9IChUMV9GYWNlKUZUX0NNQVBfRkFDRSggdW5pY29kZXMgKTsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXMgPSAoRlRfU2VydmljZV9Qc0NNYXBzKWZhY2UtPnBzbmFtZXM7Ci0KLQotICAgIHJldHVybiBwc25hbWVzLT51bmljb2Rlc19jaGFyX2luZGV4KCB1bmljb2RlcywgY2hhcl9jb2RlICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHQxX2NtYXBfdW5pY29kZV9jaGFyX25leHQoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgVDFfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFQxX0ZhY2UpRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpZmFjZS0+cHNuYW1lczsKLQotCi0gICAgcmV0dXJuIHBzbmFtZXMtPnVuaWNvZGVzX2NoYXJfbmV4dCggdW5pY29kZXMsIHBjaGFyX2NvZGUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF91bmljb2RlX2NsYXNzX3JlYyA9Ci0gIHsKLSAgICBzaXplb2YgKCBQU19Vbmljb2Rlc1JlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0MV9jbWFwX3VuaWNvZGVfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIHQxX2NtYXBfdW5pY29kZV9kb25lLAotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdDFfY21hcF91bmljb2RlX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0MV9jbWFwX3VuaWNvZGVfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3QxY21hcC5oIGIvc3JjL3BzYXV4L3QxY21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWU2NWQyLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2F1eC90MWNtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIGNoYXJhY3RlciBtYXAgc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UMUNNQVBfSF9fCi0jZGVmaW5lIF9fVDFDTUFQX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICBUWVBFMSBTVEFOREFSRCAoQU5EIEVYUEVSVCkgRU5DT0RJTkcgQ01BUFMgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHN0YW5kYXJkIChhbmQgZXhwZXJ0KSBlbmNvZGluZyBjbWFwcyAqLwotICB0eXBlZGVmIHN0cnVjdCBUMV9DTWFwU3RkUmVjXyogIFQxX0NNYXBTdGQ7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0NNYXBTdGRSZWNfCi0gIHsKLSAgICBGVF9DTWFwUmVjICAgICAgICAgICAgICAgIGNtYXA7Ci0KLSAgICBjb25zdCBGVF9VU2hvcnQqICAgICAgICAgIGNvZGVfdG9fc2lkOwotICAgIFBTX0Fkb2JlX1N0ZF9TdHJpbmdzRnVuYyAgc2lkX3RvX3N0cmluZzsKLQotICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgbnVtX2dseXBoczsKLSAgICBjb25zdCBjaGFyKiBjb25zdCogICAgICAgIGdseXBoX25hbWVzOwotCi0gIH0gVDFfQ01hcFN0ZFJlYzsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF9zdGFuZGFyZF9jbGFzc19yZWM7Ci0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX2V4cGVydF9jbGFzc19yZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICBUWVBFMSBDVVNUT00gRU5DT0RJTkcgQ01BUCAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCBUMV9DTWFwQ3VzdG9tUmVjXyogIFQxX0NNYXBDdXN0b207Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0NNYXBDdXN0b21SZWNfCi0gIHsKLSAgICBGVF9DTWFwUmVjICBjbWFwOwotICAgIEZUX1VJbnQgICAgIGZpcnN0OwotICAgIEZUX1VJbnQgICAgIGNvdW50OwotICAgIEZUX1VTaG9ydCogIGluZGljZXM7Ci0KLSAgfSBUMV9DTWFwQ3VzdG9tUmVjOwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX2N1c3RvbV9jbGFzc19yZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgVFlQRTEgU1lOVEhFVElDIFVOSUNPREUgRU5DT0RJTkcgQ01BUCAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiB1bmljb2RlIChzeW50aGV0aWMpIGNtYXBzICovCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjOwotCi0gLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1QxQ01BUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC90MWRlY29kZS5jIGIvc3JjL3BzYXV4L3QxZGVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MGJhNjQuLjAwMDAwMDAKLS0tIGEvc3JjL3BzYXV4L3QxZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxZGVjb2RlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IFR5cGUgMSBkZWNvZGluZyByb3V0aW5lcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotCi0jaW5jbHVkZSAidDFkZWNvZGUuaCIKLSNpbmNsdWRlICJwc29ianMuaCIKLQotI2luY2x1ZGUgInBzYXV4ZXJyLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90MWRlY29kZQotCi0KLSAgdHlwZWRlZiBlbnVtICBUMV9PcGVyYXRvcl8KLSAgewotICAgIG9wX25vbmUgPSAwLAotICAgIG9wX2VuZGNoYXIsCi0gICAgb3BfaHNidywKLSAgICBvcF9zZWFjLAotICAgIG9wX3NidywKLSAgICBvcF9jbG9zZXBhdGgsCi0gICAgb3BfaGxpbmV0bywKLSAgICBvcF9obW92ZXRvLAotICAgIG9wX2h2Y3VydmV0bywKLSAgICBvcF9ybGluZXRvLAotICAgIG9wX3Jtb3ZldG8sCi0gICAgb3BfcnJjdXJ2ZXRvLAotICAgIG9wX3ZoY3VydmV0bywKLSAgICBvcF92bGluZXRvLAotICAgIG9wX3Ztb3ZldG8sCi0gICAgb3BfZG90c2VjdGlvbiwKLSAgICBvcF9oc3RlbSwKLSAgICBvcF9oc3RlbTMsCi0gICAgb3BfdnN0ZW0sCi0gICAgb3BfdnN0ZW0zLAotICAgIG9wX2RpdiwKLSAgICBvcF9jYWxsb3RoZXJzdWJyLAotICAgIG9wX2NhbGxzdWJyLAotICAgIG9wX3BvcCwKLSAgICBvcF9yZXR1cm4sCi0gICAgb3Bfc2V0Y3VycmVudHBvaW50LAotICAgIG9wX3Vua25vd24xNSwKLQotICAgIG9wX21heCAgICAvKiBuZXZlciByZW1vdmUgdGhpcyBvbmUgKi8KLQotICB9IFQxX09wZXJhdG9yOwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX0ludCAgdDFfYXJnc19jb3VudFtvcF9tYXhdID0KLSAgewotICAgIDAsIC8qIG5vbmUgKi8KLSAgICAwLCAvKiBlbmRjaGFyICovCi0gICAgMiwgLyogaHNidyAqLwotICAgIDUsIC8qIHNlYWMgKi8KLSAgICA0LCAvKiBzYncgKi8KLSAgICAwLCAvKiBjbG9zZXBhdGggKi8KLSAgICAxLCAvKiBobGluZXRvICovCi0gICAgMSwgLyogaG1vdmV0byAqLwotICAgIDQsIC8qIGh2Y3VydmV0byAqLwotICAgIDIsIC8qIHJsaW5ldG8gKi8KLSAgICAyLCAvKiBybW92ZXRvICovCi0gICAgNiwgLyogcnJjdXJ2ZXRvICovCi0gICAgNCwgLyogdmhjdXJ2ZXRvICovCi0gICAgMSwgLyogdmxpbmV0byAqLwotICAgIDEsIC8qIHZtb3ZldG8gKi8KLSAgICAwLCAvKiBkb3RzZWN0aW9uICovCi0gICAgMiwgLyogaHN0ZW0gKi8KLSAgICA2LCAvKiBoc3RlbTMgKi8KLSAgICAyLCAvKiB2c3RlbSAqLwotICAgIDYsIC8qIHZzdGVtMyAqLwotICAgIDIsIC8qIGRpdiAqLwotICAgLTEsIC8qIGNhbGxvdGhlcnN1YnIgKi8KLSAgICAxLCAvKiBjYWxsc3ViciAqLwotICAgIDAsIC8qIHBvcCAqLwotICAgIDAsIC8qIHJldHVybiAqLwotICAgIDIsIC8qIHNldGN1cnJlbnRwb2ludCAqLwotICAgIDIgIC8qIG9wY29kZSAxNSAodW5kb2N1bWVudGVkIGFuZCBvYnNvbGV0ZSkgKi8KLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHQxX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvb2tzIHVwIGEgZ2l2ZW4gZ2x5cGggYnkgaXRzIFN0YW5kYXJkRW5jb2RpbmcgY2hhcmNvZGUuICBVc2VkIHRvICAqLwotICAvKiAgICBpbXBsZW1lbnQgdGhlIFNFQUMgVHlwZSAxIG9wZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6IFRoZSBjaGFyYWN0ZXIgY29kZSB0byBsb29rIGZvci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZ2x5cGggaW5kZXggaW4gdGhlIGZvbnQgZmFjZS4gIFJldHVybnMgLTEgaWYgdGhlIGNvcnJlc3BvbmRpbmcgICAqLwotICAvKiAgICBnbHlwaCB3YXNuJ3QgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9JbnQKLSAgdDFfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGNoYXJjb2RlICkKLSAgewotICAgIEZUX1VJbnQgICAgICAgICAgICAgbjsKLSAgICBjb25zdCBGVF9TdHJpbmcqICAgIGdseXBoX25hbWU7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gZGVjb2Rlci0+cHNuYW1lczsKLQotCi0gICAgLyogY2hlY2sgcmFuZ2Ugb2Ygc3RhbmRhcmQgY2hhciBjb2RlICovCi0gICAgaWYgKCBjaGFyY29kZSA8IDAgfHwgY2hhcmNvZGUgPiAyNTUgKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgZ2x5cGhfbmFtZSA9IHBzbmFtZXMtPmFkb2JlX3N0ZF9zdHJpbmdzKAotICAgICAgICAgICAgICAgICAgIHBzbmFtZXMtPmFkb2JlX3N0ZF9lbmNvZGluZ1tjaGFyY29kZV0pOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBkZWNvZGVyLT5udW1fZ2x5cGhzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX1N0cmluZyogIG5hbWUgPSAoRlRfU3RyaW5nKilkZWNvZGVyLT5nbHlwaF9uYW1lc1tuXTsKLQotCi0gICAgICBpZiAoIG5hbWUgJiYgbmFtZVswXSA9PSBnbHlwaF9uYW1lWzBdICAmJgotICAgICAgICAgICBmdF9zdHJjbXAoIG5hbWUsIGdseXBoX25hbWUgKSA9PSAwICkKLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MW9wZXJhdG9yX3NlYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbXBsZW1lbnRzIHRoZSBgc2VhYycgVHlwZSAxIG9wZXJhdG9yIGZvciBhIFR5cGUgMSBkZWNvZGVyLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWNvZGVyIDo6IFRoZSBjdXJyZW50IENJRCBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzYiAgICAgOjogVGhlIGFjY2VudCdzIHNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR4ICAgICA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIGFjY2VudC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHkgICAgIDo6IFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIGFjY2VudC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJjaGFyICAgOjogVGhlIGJhc2UgY2hhcmFjdGVyJ3MgU3RhbmRhcmRFbmNvZGluZyBjaGFyY29kZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNoYXIgICA6OiBUaGUgYWNjZW50IGNoYXJhY3RlcidzIFN0YW5kYXJkRW5jb2RpbmcgY2hhcmNvZGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdDFvcGVyYXRvcl9zZWFjKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIGFzYiwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICBhZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgYWR5LAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGJjaGFyLAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGFjaGFyICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9JbnQgICAgICAgYmNoYXJfaW5kZXgsIGFjaGFyX2luZGV4OwotI2lmIDAKLSAgICBGVF9JbnQgICAgICAgbl9iYXNlX3BvaW50czsKLSAgICBGVF9PdXRsaW5lKiAgYmFzZSA9IGRlY29kZXItPmJ1aWxkZXIuYmFzZTsKLSNlbmRpZgotICAgIEZUX1ZlY3RvciAgICBsZWZ0X2JlYXJpbmcsIGFkdmFuY2U7Ci0KLQotICAgIC8qIHNlYWMgd2VpcmRuZXNzICovCi0gICAgYWR4ICs9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLng7Ci0KLSAgICAvKiBgZ2x5cGhfbmFtZXMnIGlzIHNldCB0byAwIGZvciBDSUQgZm9udHMgd2hpY2ggZG8gbm90ICovCi0gICAgLyogaW5jbHVkZSBhbiBlbmNvZGluZy4gIEhvdyBjYW4gd2UgZGVhbCB3aXRoIHRoZXNlPyAgICAqLwotICAgIGlmICggZGVjb2Rlci0+Z2x5cGhfbmFtZXMgPT0gMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidDFvcGVyYXRvcl9zZWFjOiIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgZ2x5cGggbmFtZXMgdGFibGUgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGZvbnQhXG4iICkpOwotICAgICAgcmV0dXJuIFBTYXV4X0Vycl9TeW50YXhfRXJyb3I7Ci0gICAgfQotCi0gICAgYmNoYXJfaW5kZXggPSB0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGRlY29kZXIsIGJjaGFyICk7Ci0gICAgYWNoYXJfaW5kZXggPSB0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGRlY29kZXIsIGFjaGFyICk7Ci0KLSAgICBpZiAoIGJjaGFyX2luZGV4IDwgMCB8fCBhY2hhcl9pbmRleCA8IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQxb3BlcmF0b3Jfc2VhYzoiICkpOwotICAgICAgRlRfRVJST1IoKCAiIGludmFsaWQgc2VhYyBjaGFyYWN0ZXIgY29kZSBhcmd1bWVudHNcbiIgKSk7Ci0gICAgICByZXR1cm4gUFNhdXhfRXJyX1N5bnRheF9FcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBpZiB3ZSBhcmUgdHJ5aW5nIHRvIGxvYWQgYSBjb21wb3NpdGUgZ2x5cGgsIGRvIG5vdCBsb2FkIHRoZSAqLwotICAgIC8qIGFjY2VudCBjaGFyYWN0ZXIgYW5kIHJldHVybiB0aGUgYXJyYXkgb2Ygc3ViZ2x5cGhzLiAgICAgICAgICovCi0gICAgaWYgKCBkZWNvZGVyLT5idWlsZGVyLm5vX3JlY3Vyc2UgKQotICAgIHsKLSAgICAgIEZUX0dseXBoU2xvdCAgICBnbHlwaCAgPSAoRlRfR2x5cGhTbG90KWRlY29kZXItPmJ1aWxkZXIuZ2x5cGg7Ci0gICAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyID0gZ2x5cGgtPmludGVybmFsLT5sb2FkZXI7Ci0gICAgICBGVF9TdWJHbHlwaCAgICAgc3ViZzsKLQotCi0gICAgICAvKiByZWFsbG9jYXRlIHN1YmdseXBoIGFycmF5IGlmIG5lY2Vzc2FyeSAqLwotICAgICAgZXJyb3IgPSBGVF9HbHlwaExvYWRlcl9DaGVja1N1YkdseXBocyggbG9hZGVyLCAyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBzdWJnID0gbG9hZGVyLT5jdXJyZW50LnN1YmdseXBoczsKLQotICAgICAgLyogc3ViZ2x5cGggMCA9IGJhc2UgY2hhcmFjdGVyICovCi0gICAgICBzdWJnLT5pbmRleCA9IGJjaGFyX2luZGV4OwotICAgICAgc3ViZy0+ZmxhZ3MgPSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUyB8Ci0gICAgICAgICAgICAgICAgICAgIEZUX1NVQkdMWVBIX0ZMQUdfVVNFX01ZX01FVFJJQ1M7Ci0gICAgICBzdWJnLT5hcmcxICA9IDA7Ci0gICAgICBzdWJnLT5hcmcyICA9IDA7Ci0gICAgICBzdWJnKys7Ci0KLSAgICAgIC8qIHN1YmdseXBoIDEgPSBhY2NlbnQgY2hhcmFjdGVyICovCi0gICAgICBzdWJnLT5pbmRleCA9IGFjaGFyX2luZGV4OwotICAgICAgc3ViZy0+ZmxhZ3MgPSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUzsKLSAgICAgIHN1YmctPmFyZzEgID0gKEZUX0ludCkoIGFkeCAtIGFzYiApOwotICAgICAgc3ViZy0+YXJnMiAgPSAoRlRfSW50KWFkeTsKLQotICAgICAgLyogc2V0IHVwIHJlbWFpbmluZyBnbHlwaCBmaWVsZHMgKi8KLSAgICAgIGdseXBoLT5udW1fc3ViZ2x5cGhzID0gMjsKLSAgICAgIGdseXBoLT5zdWJnbHlwaHMgICAgID0gbG9hZGVyLT5iYXNlLnN1YmdseXBoczsKLSAgICAgIGdseXBoLT5mb3JtYXQgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURTsKLQotICAgICAgbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHMgPSAyOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIEZpcnN0IGxvYWQgYGJjaGFyJyBpbiBidWlsZGVyICovCi0gICAgLyogbm93IGxvYWQgdGhlIHVuc2NhbGVkIG91dGxpbmUgKi8KLQotICAgIEZUX0dseXBoTG9hZGVyX1ByZXBhcmUoIGRlY29kZXItPmJ1aWxkZXIubG9hZGVyICk7ICAvKiBwcmVwYXJlIGxvYWRlciAqLwotCi0gICAgZXJyb3IgPSB0MV9kZWNvZGVyX3BhcnNlX2dseXBoKCBkZWNvZGVyLCBiY2hhcl9pbmRleCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2F2ZSB0aGUgbGVmdCBiZWFyaW5nIGFuZCB3aWR0aCBvZiB0aGUgYmFzZSBjaGFyYWN0ZXIgKi8KLSAgICAvKiBhcyB0aGV5IHdpbGwgYmUgZXJhc2VkIGJ5IHRoZSBuZXh0IGxvYWQuICAgICAgICAgICAgICAqLwotCi0gICAgbGVmdF9iZWFyaW5nID0gZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmc7Ci0gICAgYWR2YW5jZSAgICAgID0gZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlOwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IDA7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueSA9IDA7Ci0KLSAgICBkZWNvZGVyLT5idWlsZGVyLnBvc194ID0gYWR4IC0gYXNiOwotICAgIGRlY29kZXItPmJ1aWxkZXIucG9zX3kgPSBhZHk7Ci0KLSAgICAvKiBOb3cgbG9hZCBgYWNoYXInIG9uIHRvcCBvZiAqLwotICAgIC8qIHRoZSBiYXNlIG91dGxpbmUgICAgICAgICAgICovCi0gICAgZXJyb3IgPSB0MV9kZWNvZGVyX3BhcnNlX2dseXBoKCBkZWNvZGVyLCBhY2hhcl9pbmRleCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcmVzdG9yZSB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgYW5kICAgKi8KLSAgICAvKiBhZHZhbmNlIHdpZHRoIG9mIHRoZSBiYXNlIGNoYXJhY3RlciAqLwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcgPSBsZWZ0X2JlYXJpbmc7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlICAgICAgPSBhZHZhbmNlOwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5wb3NfeCA9IDA7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5wb3NfeSA9IDA7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlcyBhIGdpdmVuIFR5cGUgMSBjaGFyc3RyaW5ncyBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlY29kZXIgICAgICAgICA6OiBUaGUgY3VycmVudCBUeXBlIDEgZGVjb2Rlci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcnN0cmluZ19iYXNlIDo6IFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNoYXJzdHJpbmcgc3RyZWFtLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBjaGFyc3RyaW5nX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGNoYXJzdHJpbmdfbGVuICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgVDFfRGVjb2Rlcl9ab25lICB6b25lOwotICAgIEZUX0J5dGUqICAgICAgICAgaXA7Ci0gICAgRlRfQnl0ZSogICAgICAgICBsaW1pdDsKLSAgICBUMV9CdWlsZGVyICAgICAgIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKLSAgICBGVF9Qb3MgICAgICAgICAgIHgsIHksIG9yaWdfeCwgb3JpZ195OwotICAgIEZUX0ludCAgICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgICA9IDA7Ci0gICAgRlRfSW50ICAgICAgICAgICB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gMDsKLQotICAgIFQxX0hpbnRzX0Z1bmNzICAgaGludGVyOwotCi0KLSAgICAvKiB3ZSBkb24ndCB3YW50IHRvIHRvdWNoIHRoZSBzb3VyY2UgY29kZSAtLSB1c2UgbWFjcm8gdHJpY2sgKi8KLSNkZWZpbmUgc3RhcnRfcG9pbnQgICAgdDFfYnVpbGRlcl9zdGFydF9wb2ludAotI2RlZmluZSBjaGVja19wb2ludHMgICB0MV9idWlsZGVyX2NoZWNrX3BvaW50cwotI2RlZmluZSBhZGRfcG9pbnQgICAgICB0MV9idWlsZGVyX2FkZF9wb2ludAotI2RlZmluZSBhZGRfcG9pbnQxICAgICB0MV9idWlsZGVyX2FkZF9wb2ludDEKLSNkZWZpbmUgYWRkX2NvbnRvdXIgICAgdDFfYnVpbGRlcl9hZGRfY29udG91cgotI2RlZmluZSBjbG9zZV9jb250b3VyICB0MV9idWlsZGVyX2Nsb3NlX2NvbnRvdXIKLQotICAgIC8qIEZpcnN0IG9mIGFsbCwgaW5pdGlhbGl6ZSB0aGUgZGVjb2RlciAqLwotICAgIGRlY29kZXItPnRvcCAgPSBkZWNvZGVyLT5zdGFjazsKLSAgICBkZWNvZGVyLT56b25lID0gZGVjb2Rlci0+em9uZXM7Ci0gICAgem9uZSAgICAgICAgICA9IGRlY29kZXItPnpvbmVzOwotCi0gICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9TdGFydDsKLQotICAgIGhpbnRlciA9IChUMV9IaW50c19GdW5jcylidWlsZGVyLT5oaW50c19mdW5jczsKLQotICAgIC8qIGEgZm9udCB0aGF0IHJlYWRzIEJ1aWxkQ2hhckFycmF5IHdpdGhvdXQgc2V0dGluZyAqLwotICAgIC8qIGl0cyB2YWx1ZXMgZmlyc3QgaXMgYnVnZ3ksIGJ1dCAuLi4gICAgICAgICAgICAgICAqLwotICAgIEZUX0FTU0VSVCggKCBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyID09IDAgKSA9PQotICAgICAgICAgICAgICAgKCBkZWNvZGVyLT5idWlsZGNoYXIgPT0gTlVMTCApICk7Ci0KLSAgICBpZiAoIGRlY29kZXItPmxlbl9idWlsZGNoYXIgPiAwICkKLSAgICAgIG1lbXNldCggJmRlY29kZXItPmJ1aWxkY2hhclswXSwKLSAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgc2l6ZW9mKCBkZWNvZGVyLT5idWlsZGNoYXJbMF0gKSAqCi0gICAgICAgICAgICAgICAgZGVjb2Rlci0+bGVuX2J1aWxkY2hhciApOwotCi0gICAgRlRfVFJBQ0U0KCggIlxuU3RhcnQgY2hhcnN0cmluZ1xuIiApKTsKLQotICAgIHpvbmUtPmJhc2UgICAgICAgICAgID0gY2hhcnN0cmluZ19iYXNlOwotICAgIGxpbWl0ID0gem9uZS0+bGltaXQgID0gY2hhcnN0cmluZ19iYXNlICsgY2hhcnN0cmluZ19sZW47Ci0gICAgaXAgICAgPSB6b25lLT5jdXJzb3IgPSB6b25lLT5iYXNlOwotCi0gICAgZXJyb3IgPSBQU2F1eF9FcnJfT2s7Ci0KLSAgICB4ID0gb3JpZ194ID0gYnVpbGRlci0+cG9zX3g7Ci0gICAgeSA9IG9yaWdfeSA9IGJ1aWxkZXItPnBvc195OwotCi0gICAgLyogYmVnaW4gaGludHMgcmVjb3JkaW5nIHNlc3Npb24sIGlmIGFueSAqLwotICAgIGlmICggaGludGVyICkKLSAgICAgIGhpbnRlci0+b3BlbiggaGludGVyLT5oaW50cyApOwotCi0gICAgLyogbm93LCBleGVjdXRlIGxvb3AgKi8KLSAgICB3aGlsZSAoIGlwIDwgbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0xvbmcqICAgICB0b3AgICA9IGRlY29kZXItPnRvcDsKLSAgICAgIFQxX09wZXJhdG9yICBvcCAgICA9IG9wX25vbmU7Ci0gICAgICBGVF9Mb25nICAgICAgdmFsdWUgPSAwOwotCi0KLSAgICAgIEZUX0FTU0VSVCgga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPT0gMCAgIHx8Ci0gICAgICAgICAgICAgICAgIHVua25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPT0gMCApOwotCi0gICAgICBGVF9UUkFDRTUoKCAiICglZCkiLCBkZWNvZGVyLT50b3AgLSBkZWNvZGVyLT5zdGFjayApKTsKLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBEZWNvZGUgb3BlcmF0b3Igb3Igb3BlcmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIGZpcnN0IG9mIGFsbCwgZGVjb21wcmVzcyBvcGVyYXRvciBvciB2YWx1ZSAqLwotICAgICAgc3dpdGNoICggKmlwKysgKQotICAgICAgewotICAgICAgY2FzZSAxOgotICAgICAgICBvcCA9IG9wX2hzdGVtOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAzOgotICAgICAgICBvcCA9IG9wX3ZzdGVtOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgb3AgPSBvcF92bW92ZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNToKLSAgICAgICAgb3AgPSBvcF9ybGluZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjoKLSAgICAgICAgb3AgPSBvcF9obGluZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNzoKLSAgICAgICAgb3AgPSBvcF92bGluZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgODoKLSAgICAgICAgb3AgPSBvcF9ycmN1cnZldG87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA5OgotICAgICAgICBvcCA9IG9wX2Nsb3NlcGF0aDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwOgotICAgICAgICBvcCA9IG9wX2NhbGxzdWJyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE6Ci0gICAgICAgIG9wID0gb3BfcmV0dXJuOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAxMzoKLSAgICAgICAgb3AgPSBvcF9oc2J3OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTQ6Ci0gICAgICAgIG9wID0gb3BfZW5kY2hhcjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMTU6ICAgICAgICAgIC8qIHVuZG9jdW1lbnRlZCwgb2Jzb2xldGUgb3BlcmF0b3IgKi8KLSAgICAgICAgb3AgPSBvcF91bmtub3duMTU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDIxOgotICAgICAgICBvcCA9IG9wX3Jtb3ZldG87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyMjoKLSAgICAgICAgb3AgPSBvcF9obW92ZXRvOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAzMDoKLSAgICAgICAgb3AgPSBvcF92aGN1cnZldG87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzMToKLSAgICAgICAgb3AgPSBvcF9odmN1cnZldG87Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDEyOgotICAgICAgICBpZiAoIGlwID4gbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZXNjYXBlICgxMitFT0YpXG4iICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoICggKmlwKysgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBvcCA9IG9wX2RvdHNlY3Rpb247Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICBvcCA9IG9wX3ZzdGVtMzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgIG9wID0gb3BfaHN0ZW0zOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgb3AgPSBvcF9zZWFjOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgb3AgPSBvcF9zYnc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgb3AgPSBvcF9kaXY7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgb3AgPSBvcF9jYWxsb3RoZXJzdWJyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3OgotICAgICAgICAgIG9wID0gb3BfcG9wOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMzOgotICAgICAgICAgIG9wID0gb3Bfc2V0Y3VycmVudHBvaW50OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZXNjYXBlICgxMislZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICBpcFstMV0gKSk7Ci0gICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjU1OiAgICAvKiBmb3VyIGJ5dGVzIGludGVnZXIgKi8KLSAgICAgICAgaWYgKCBpcCArIDQgPiBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiAiCi0gICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBFT0YgaW4gaW50ZWdlclxuIiApKTsKLSAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gKEZUX0ludDMyKSggKChGVF9Mb25nKWlwWzBdIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGVF9Mb25nKWlwWzFdIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGVF9Mb25nKWlwWzJdIDw8IDggKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwWzNdICk7Ci0gICAgICAgIGlwICs9IDQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoIGlwWy0xXSA+PSAzMiApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGlwWy0xXSA8IDI0NyApCi0gICAgICAgICAgICB2YWx1ZSA9IChGVF9Mb25nKWlwWy0xXSAtIDEzOTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCArK2lwID4gbGltaXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiAiICkpOwotICAgICAgICAgICAgICBGVF9FUlJPUigoICJ1bmV4cGVjdGVkIEVPRiBpbiBpbnRlZ2VyXG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBpcFstMl0gPCAyNTEgKQotICAgICAgICAgICAgICB2YWx1ZSA9ICAoICggKEZUX0xvbmcpaXBbLTJdIC0gMjQ3ICkgPDwgOCApICsgaXBbLTFdICsgMTA4OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB2YWx1ZSA9IC0oICggKCAoRlRfTG9uZylpcFstMl0gLSAyNTEgKSA8PCA4ICkgKyBpcFstMV0gKyAxMDggKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgYnl0ZSAoJWQpXG4iLCBpcFstMV0gKSk7Ci0gICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID4gMCApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIG9wICkKLSAgICAgICAgewotICAgICAgICBjYXNlIG9wX2NhbGxzdWJyOgotICAgICAgICBjYXNlIG9wX3JldHVybjoKLSAgICAgICAgY2FzZSBvcF9ub25lOgotICAgICAgICBjYXNlIG9wX3BvcDoKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIC8qIGFsbCBvcGVyYW5kcyBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgYnkgcHJldmlvdXMgcG9wcyAqLwotICAgICAgICAgIHVua25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogIFB1c2ggdmFsdWUgb24gc3RhY2ssIG9yIHByb2Nlc3Mgb3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBvcCA9PSBvcF9ub25lICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCB0b3AgLSBkZWNvZGVyLT5zdGFjayA+PSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogc3RhY2sgb3ZlcmZsb3chXG4iICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgRlRfVFJBQ0U0KCggIiAlbGQiLCB2YWx1ZSApKTsKLQotICAgICAgICAqdG9wKysgICAgICAgPSB2YWx1ZTsKLSAgICAgICAgZGVjb2Rlci0+dG9wID0gdG9wOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIG9wID09IG9wX2NhbGxvdGhlcnN1YnIgKSAgLyogY2FsbG90aGVyc3ViciAqLwotICAgICAgewotICAgICAgICBGVF9JbnQgIHN1YnJfbm87Ci0gICAgICAgIEZUX0ludCAgYXJnX2NudDsKLQotCi0gICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbG90aGVyc3ViciIgKSk7Ci0KLSAgICAgICAgaWYgKCB0b3AgLSBkZWNvZGVyLT5zdGFjayA8IDIgKQotICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgIHRvcCAtPSAyOwotCi0gICAgICAgIHN1YnJfbm8gPSAoRlRfSW50KXRvcFsxXTsKLSAgICAgICAgYXJnX2NudCA9IChGVF9JbnQpdG9wWzBdOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiByZW1vdmUgYWxsIG9wZXJhbmRzIHRvIGNhbGxvdGhlcnN1YnIgZnJvbSB0aGUgc3RhY2sgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogZm9yIGhhbmRsZWQgb3RoZXJzdWJycywgd2hlcmUgd2Uga25vdyB0aGUgbnVtYmVyIG9mICAgICAqLwotICAgICAgICAvKiBhcmd1bWVudHMsIHdlIGluY3JlYXNlIHRoZSBzdGFjayBieSB0aGUgdmFsdWUgb2YgICAgICAgICovCi0gICAgICAgIC8qIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBmb3IgdW5oYW5kbGVkIG90aGVyc3VicnMgdGhlIGZvbGxvd2luZyBwb3BzIGFkanVzdCB0aGUgICovCi0gICAgICAgIC8qIHN0YWNrIHBvaW50ZXIgYXMgbmVjZXNzYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBpZiAoIGFyZ19jbnQgPiB0b3AgLSBkZWNvZGVyLT5zdGFjayApCi0gICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgdG9wIC09IGFyZ19jbnQ7Ci0KLSAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgICA9IDA7Ci0gICAgICAgIHVua25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAwOwotCi0gICAgICAgIC8qIFhYWCBUT0RPOiBUaGUgY2hlY2tzIHRvIGBhcmdfY291bnQgPT0gPHdoYXRldmVyPicgICAgICAgKi8KLSAgICAgICAgLyogbWlnaHQgbm90IGJlIGNvcnJlY3Q7IGFuIG90aGVyc3ViciBleHBlY3RzIGEgY2VydGFpbiAgICAqLwotICAgICAgICAvKiBudW1iZXIgb2Ygb3BlcmFuZHMgb24gdGhlIFBvc3RTY3JpcHQgc3RhY2sgKGFzIG9wcG9zZWQgICovCi0gICAgICAgIC8qIHRvIHRoZSBUMSBzdGFjaykgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0byBwdXQgdGhlbSB0aGVyZSAgKi8KLSAgICAgICAgLyogYnkgaXRzZWxmOyBwcmV2aW91cyBvdGhlcnN1YnJzIG1pZ2h0IGhhdmUgbGVmdCB0aGUgICAgICAqLwotICAgICAgICAvKiBvcGVyYW5kcyB0aGVyZSBpZiB0aGV5IHdlcmUgbm90IGZvbGxvd2VkIGJ5IGFuICAgICAgICAgICovCi0gICAgICAgIC8qIGFwcHJvcHJpYXRlIG51bWJlciBvZiBwb3BzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBPbiB0aGUgb3RoZXIgaGFuZCwgQWRvYmUgUmVhZGVyIDcuMC44IGZvciBMaW51eCBkb2Vzbid0ICovCi0gICAgICAgIC8qIGFjY2VwdCBhIGZvbnQgdGhhdCBjb250YWlucyBjaGFyc3RyaW5ncyBsaWtlICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgMTAwIDIwMCAyIDIwIGNhbGxvdGhlcnN1YnIgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAzMDAgMSAyMCBjYWxsb3RoZXJzdWJyIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBQZXJoYXBzIHRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgQnVpbGRDaGFyQXJyYXkgZXhpc3RzLiAgICovCi0KLSAgICAgICAgc3dpdGNoICggc3Vicl9ubyApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGZsZXggZmVhdHVyZSAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAwICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBkZWNvZGVyLT5mbGV4X3N0YXRlICAgICAgICA9IDE7Ci0gICAgICAgICAgZGVjb2Rlci0+bnVtX2ZsZXhfdmVjdG9ycyAgPSAwOwotICAgICAgICAgIGlmICggc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgY2hlY2tfcG9pbnRzKCBidWlsZGVyLCA2ICkgICApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCBmbGV4IHZlY3RvcnMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIGlkeDsKLQotCi0gICAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMCApCi0gICAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICAgIC8qIG5vdGUgdGhhdCB3ZSBzaG91bGQgbm90IGFkZCBhIHBvaW50IGZvciBpbmRleCAwOyAqLwotICAgICAgICAgICAgLyogdGhpcyB3aWxsIG1vdmUgb3VyIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIGZsZXggICovCi0gICAgICAgICAgICAvKiBwb2ludCB3aXRob3V0IGFkZGluZyBhbnkgcG9pbnQgdG8gdGhlIG91dGxpbmUgICAgKi8KLSAgICAgICAgICAgIGlkeCA9IGRlY29kZXItPm51bV9mbGV4X3ZlY3RvcnMrKzsKLSAgICAgICAgICAgIGlmICggaWR4ID4gMCAmJiBpZHggPCA3ICkKLSAgICAgICAgICAgICAgYWRkX3BvaW50KCBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSkoIGlkeCA9PSAzIHx8IGlkeCA9PSA2ICkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBmbGV4IGZlYXR1cmUgKi8KLSAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMyApCi0gICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgaWYgKCBkZWNvZGVyLT5mbGV4X3N0YXRlICAgICAgID09IDAgfHwKLSAgICAgICAgICAgICAgIGRlY29kZXItPm51bV9mbGV4X3ZlY3RvcnMgIT0gNyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBmbGV4IGVuZFxuIiApKTsKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHRoZSB0d28gYHJlc3VsdHMnIGFyZSBwb3BwZWQgYnkgdGhlIGZvbGxvd2luZyBzZXRjdXJyZW50cG9pbnQgKi8KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5nZSBoaW50cyAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAxICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgICBoaW50ZXItPnJlc2V0KCBoaW50ZXItPmhpbnRzLCBidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cyApOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAvKiBjb3VudGVyIGNvbnRyb2wgaGludHMsIGNsZWFyIHN0YWNrICovCi0gICAgICAgICAgdG9wID0gZGVjb2Rlci0+c3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgY2FzZSAxODogICAgICAgICAgICAgICAgICAgIC8qIG11bHRpcGxlIG1hc3RlcnMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQU19CbGVuZCAgYmxlbmQgPSBkZWNvZGVyLT5ibGVuZDsKLSAgICAgICAgICAgIEZUX1VJbnQgICBudW1fcG9pbnRzLCBubiwgbW07Ci0gICAgICAgICAgICBGVF9Mb25nKiAgZGVsdGE7Ci0gICAgICAgICAgICBGVF9Mb25nKiAgdmFsdWVzOwotCi0KLSAgICAgICAgICAgIGlmICggIWJsZW5kICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIiApKTsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidW5leHBlY3RlZCBtdWx0aXBsZSBtYXN0ZXJzIG9wZXJhdG9yIVxuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG51bV9wb2ludHMgPSAoRlRfVUludClzdWJyX25vIC0gMTMgKyAoIHN1YnJfbm8gPT0gMTggKTsKLSAgICAgICAgICAgIGlmICggYXJnX2NudCAhPSAoRlRfSW50KSggbnVtX3BvaW50cyAqIGJsZW5kLT5udW1fZGVzaWducyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIiApKTsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAiaW5jb3JyZWN0IG51bWJlciBvZiBtbSBhcmd1bWVudHNcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB3ZSB3YW50IHRvIGNvbXB1dGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICBhMCp3MCArIGExKncxICsgLi4uICsgYWsqd2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogYnV0IHdlIG9ubHkgaGF2ZSB0aGUgYTAsIGExLWEwLCBhMi1hMCwgLi4gYWstYTAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIGhvd2V2ZXIsIGdpdmVuIHRoYXQgdzAgKyB3MSArIC4uLiArIHdrID09IDEsIHdlIGNhbiAgICovCi0gICAgICAgICAgICAvKiByZXdyaXRlIGl0IGVhc2lseSBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICBhMCArIChhMS1hMCkqdzEgKyAoYTItYTApKncyICsgLi4gKyAoYWstYTApKndrICAgICAgICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogd2hlcmUgayA9PSBudW1fZGVzaWducy0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiBJIGd1ZXNzIHRoYXQncyB3aHkgaXQncyB3cml0dGVuIGluIHRoaXMgYGNvbXBhY3QnICAgICAqLwotICAgICAgICAgICAgLyogZm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBkZWx0YSAgPSB0b3AgKyBudW1fcG9pbnRzOwotICAgICAgICAgICAgdmFsdWVzID0gdG9wOwotICAgICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9wb2ludHM7IG5uKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9Mb25nICB0bXAgPSB2YWx1ZXNbMF07Ci0KLQotICAgICAgICAgICAgICBmb3IgKCBtbSA9IDE7IG1tIDwgYmxlbmQtPm51bV9kZXNpZ25zOyBtbSsrICkKLSAgICAgICAgICAgICAgICB0bXAgKz0gRlRfTXVsRml4KCAqZGVsdGErKywgYmxlbmQtPndlaWdodF92ZWN0b3JbbW1dICk7Ci0KLSAgICAgICAgICAgICAgKnZhbHVlcysrID0gdG1wOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IG51bV9wb2ludHM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSNpZmRlZiBDQU5fSEFORExFX05PTl9JTlRFR1JBTF9UMV9PUEVSQU5EUwotCi0gICAgICAgICAgLyogV2UgY2Fubm90IHlldCBlbmFibGUgdGhlc2Ugc2luY2UgY3VycmVudGx5ICAqLwotICAgICAgICAgIC8qIG91ciBUMSBzdGFjayBzdG9yZXMgaW50ZWdlcnMgd2hpY2ggbGFjayB0aGUgKi8KLSAgICAgICAgICAvKiBwcmVjaXNpb24gdG8gZXhwcmVzcyB0aGUgdmFsdWVzICAgICAgICAgICAgICovCi0KLSAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAvKiA8aWR4PiAxIDE5IGNhbGxvdGhlcnN1YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogPT4gcmVwbGFjZSBlbGVtZW50cyBzdGFydGluZyBmcm9tIGluZGV4IGN2aSggPGlkeD4gKSAqLwotICAgICAgICAgIC8qICAgIG9mIEJ1aWxkQ2hhckFycmF5IHdpdGggV2VpZ2h0VmVjdG9yICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgICAgaWR4OwotICAgICAgICAgICAgUFNfQmxlbmQgIGJsZW5kID0gZGVjb2Rlci0+YmxlbmQ7Ci0KLQotICAgICAgICAgICAgaWYgKCBhcmdfY250ICE9IDEgfHwgYmxlbmQgPT0gTlVMTCApCi0gICAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICAgIGlkeCA9IHRvcFswXTsKLQotICAgICAgICAgICAgaWYgKCBpZHggPCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIGlkeCArIGJsZW5kLT5udW1fZGVzaWducyA+IGRlY29kZXItPmZhY2UtPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBtZW1jcHkoICZkZWNvZGVyLT5idWlsZGNoYXJbaWR4XSwKLSAgICAgICAgICAgICAgICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIGJsZW5kLT5udW1fZGVzaWducyAqCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBibGVuZC0+d2VpZ2h0X3ZlY3RvclsgMCBdICkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAvKiA8YXJnMT4gPGFyZzI+IDIgMjAgY2FsbG90aGVyc3ViciBwb3AgICAqLwotICAgICAgICAgIC8qID09PiBwdXNoIDxhcmcxPiArIDxhcmcyPiBvbnRvIFQxIHN0YWNrICovCi0gICAgICAgICAgaWYgKCBhcmdfY250ICE9IDIgKQotICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgIHRvcFswXSArPSB0b3BbMV07IC8qIFhYWCAob3Zlcnx1bmRlcilmbG93ICovCi0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAvKiA8YXJnMT4gPGFyZzI+IDIgMjEgY2FsbG90aGVyc3ViciBwb3AgICAqLwotICAgICAgICAgIC8qID09PiBwdXNoIDxhcmcxPiAtIDxhcmcyPiBvbnRvIFQxIHN0YWNrICovCi0gICAgICAgICAgaWYgKCBhcmdfY250ICE9IDIgKQotICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgIHRvcFswXSAtPSB0b3BbMV07IC8qIFhYWCAob3Zlcnx1bmRlcilmbG93ICovCi0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAvKiA8YXJnMT4gPGFyZzI+IDIgMjIgY2FsbG90aGVyc3ViciBwb3AgICAqLwotICAgICAgICAgIC8qID09PiBwdXNoIDxhcmcxPiAqIDxhcmcyPiBvbnRvIFQxIHN0YWNrICovCi0gICAgICAgICAgaWYgKCBhcmdfY250ICE9IDIgKQotICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgIHRvcFswXSAqPSB0b3BbMV07IC8qIFhYWCAob3Zlcnx1bmRlcilmbG93ICovCi0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAvKiA8YXJnMT4gPGFyZzI+IDIgMjMgY2FsbG90aGVyc3ViciBwb3AgICAqLwotICAgICAgICAgIC8qID09PiBwdXNoIDxhcmcxPiAvIDxhcmcyPiBvbnRvIFQxIHN0YWNrICovCi0gICAgICAgICAgaWYgKCBhcmdfY250ICE9IDIgfHwgdG9wWzFdID09IDAgKQotICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgIHRvcFswXSAvPSB0b3BbMV07IC8qIFhYWCAob3Zlcnx1bmRlcilmbG93ICovCi0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSNlbmRpZiAvKiBDQU5fSEFORExFX05PTl9JTlRFR1JBTF9UMV9PUEVSQU5EUyAqLwotCi0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgLyogPHZhbD4gPGlkeD4gMiAyNCBjYWxsb3RoZXJzdWJyICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qID0+IHNldCBCdWlsZENoYXJBcnJheVtjdmkoIDxpZHg+ICldID0gPHZhbD4gKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgICAgaWR4OwotICAgICAgICAgICAgUFNfQmxlbmQgIGJsZW5kID0gZGVjb2Rlci0+YmxlbmQ7Ci0KLSAgICAgICAgICAgIGlmICggYXJnX2NudCAhPSAyIHx8IGJsZW5kID09IE5VTEwgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBpZHggPSB0b3BbMV07Ci0KLSAgICAgICAgICAgIGlmICggaWR4IDwgMCB8fCAoRlRfVUludCkgaWR4ID49IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XSA9IHRvcFswXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAvKiA8aWR4PiAxIDI1IGNhbGxvdGhlcnN1YnIgcG9wICAgICAgICovCi0gICAgICAgICAgLyogPT4gcHVzaCBCdWlsZENoYXJBcnJheVtjdmkoIGlkeCApXSAqLwotICAgICAgICAgIC8qICAgIG9udG8gVDEgc3RhY2sgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgICAgaWR4OwotICAgICAgICAgICAgUFNfQmxlbmQgIGJsZW5kID0gZGVjb2Rlci0+YmxlbmQ7Ci0KLSAgICAgICAgICAgIGlmICggYXJnX2NudCAhPSAxIHx8IGJsZW5kID09IE5VTEwgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBpZHggPSB0b3BbMF07Ci0KLSAgICAgICAgICAgIGlmICggaWR4IDwgMCB8fCAoRlRfVUludCkgaWR4ID49IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICB0b3BbMF0gPSBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSNpZiAwCi0gICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgLyogPHZhbD4gbWFyayA8aWR4PiA9PT4gc2V0IEJ1aWxkQ2hhckFycmF5W2N2aSggPGlkeD4gKV0gPSA8dmFsPiwgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICBsZWF2ZSBtYXJrIG9uIFQxIHN0YWNrICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIDx2YWw+IDxpZHg+ICAgICAgPT0+IHNldCBCdWlsZENoYXJBcnJheVtjdmkoIDxpZHg+ICldID0gPHZhbD4gICovCi0gICAgICAgICAgWFhYIHdobyBoYXMgbGVmdCBoaXMgbWFyayBvbiB0aGUgKFBvc3RTY3JpcHQpIHN0YWNrID87Ci0gICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICBjYXNlIDI3OgotICAgICAgICAgIC8qIDxyZXMxPiA8cmVzMj4gPHZhbDE+IDx2YWwyPiA0IDI3IGNhbGxvdGhlcnN1YnIgcG9wICovCi0gICAgICAgICAgLyogPT0+IHB1c2ggPHJlczE+IG9udG8gVDEgc3RhY2sgaWYgPHZhbDE+IDw9IDx2YWwyPiwgICovCi0gICAgICAgICAgLyogICAgIG90aGVyd2lzZSBwdXNoIDxyZXMyPiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gNCApCi0gICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgaWYgKCB0b3BbMl0gPiB0b3BbM10gKQotICAgICAgICAgICAgdG9wWzBdID0gdG9wWzFdOwotCi0gICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAxOwotICAgICAgICAgIGJyZWFrOwotCi0jaWZkZWYgQ0FOX0hBTkRMRV9OT05fSU5URUdSQUxfVDFfT1BFUkFORFMKLSAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAvKiAwIDI4IGNhbGxvdGhlcnN1YnIgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogPT4gcHVzaCByYW5kb20gdmFsdWUgZnJvbSBpbnRlcnZhbCBbMCwgMSkgb250byBzdGFjayAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAwICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICB0b3BbMF0gPSBGVF9yYW5kKCk7Ci0gICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAxOwotICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiAiCi0gICAgICAgICAgICAgICAgICAgICAidW5rbm93biBvdGhlcnN1YnIgWyVkICVkXSwgd2lzaCBtZSBsdWNrIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGFyZ19jbnQsIHN1YnJfbm8gKSk7Ci0gICAgICAgICAgdW5rbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IGFyZ19jbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgVW5leHBlY3RlZF9PdGhlclN1YnI6Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgb3RoZXJzdWJyIFslZCAlZF0hXG4iLCBhcmdfY250LCBzdWJyX25vICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgdG9wICs9IGtub3duX290aGVyc3Vicl9yZXN1bHRfY250OwotCi0gICAgICAgIGRlY29kZXItPnRvcCA9IHRvcDsKLSAgICAgIH0KLSAgICAgIGVsc2UgIC8qIGdlbmVyYWwgb3BlcmF0b3IgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICBudW1fYXJncyA9IHQxX2FyZ3NfY291bnRbb3BdOwotCi0KLSAgICAgICAgRlRfQVNTRVJUKCBudW1fYXJncyA+PSAwICk7Ci0KLSAgICAgICAgaWYgKCB0b3AgLSBkZWNvZGVyLT5zdGFjayA8IG51bV9hcmdzICkKLSAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAvKiBYWFggT3BlcmF0b3JzIHVzdWFsbHkgdGFrZSB0aGVpciBvcGVyYW5kcyBmcm9tIHRoZSAgICAgICAgKi8KLSAgICAgICAgLyogICAgIGJvdHRvbSBvZiB0aGUgc3RhY2ssIGkuZS4sIHRoZSBvcGVyYW5kcyBhcmUgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICBkZWNvZGVyLT5zdGFja1swXSwgLi4uLCBkZWNvZGVyLT5zdGFja1tudW1fYXJncyAtIDFdOyAqLwotICAgICAgICAvKiAgICAgb25seSBkaXYsIGNhbGxzdWJyLCBhbmQgY2FsbG90aGVyc3ViciBhcmUgZGlmZmVyZW50LiAgKi8KLSAgICAgICAgLyogICAgIEluIHByYWN0aWNlIGl0IGRvZXNuJ3QgbWF0dGVyICg/KS4gICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gICAgICAgIHN3aXRjaCAoIG9wICkKLSAgICAgICAgewotICAgICAgICBjYXNlIG9wX2NhbGxzdWJyOgotICAgICAgICBjYXNlIG9wX2RpdjoKLSAgICAgICAgY2FzZSBvcF9jYWxsb3RoZXJzdWJyOgotICAgICAgICBjYXNlIG9wX3BvcDoKLSAgICAgICAgY2FzZSBvcF9yZXR1cm46Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBpZiAoIHRvcCAtIGRlY29kZXItPnN0YWNrICE9IG51bV9hcmdzICkKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAidG9vIG11Y2ggb3BlcmFuZHMgb24gdGhlIHN0YWNrICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIoc2VlbiAlZCwgZXhwZWN0ZWQgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdG9wIC0gZGVjb2Rlci0+c3RhY2ssIG51bV9hcmdzICkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSAgICAgICAgdG9wIC09IG51bV9hcmdzOwotCi0gICAgICAgIHN3aXRjaCAoIG9wICkKLSAgICAgICAgewotICAgICAgICBjYXNlIG9wX2VuZGNoYXI6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBlbmRjaGFyIiApKTsKLQotICAgICAgICAgIGNsb3NlX2NvbnRvdXIoIGJ1aWxkZXIgKTsKLQotICAgICAgICAgIC8qIGNsb3NlIGhpbnRzIHJlY29yZGluZyBzZXNzaW9uICovCi0gICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoaW50ZXItPmNsb3NlKCBoaW50ZXItPmhpbnRzLCBidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cyApKQotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLQotICAgICAgICAgICAgLyogYXBwbHkgaGludHMgdG8gdGhlIGxvYWRlZCBnbHlwaCBvdXRsaW5lIG5vdyAqLwotICAgICAgICAgICAgaGludGVyLT5hcHBseSggaGludGVyLT5oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXItPmN1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoUFNIX0dsb2JhbHMpIGJ1aWxkZXItPmhpbnRzX2dsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5oaW50X21vZGUgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBhZGQgY3VycmVudCBvdXRsaW5lIHRvIHRoZSBnbHlwaCBzbG90ICovCi0gICAgICAgICAgRlRfR2x5cGhMb2FkZXJfQWRkKCBidWlsZGVyLT5sb2FkZXIgKTsKLQotICAgICAgICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0KLSAgICAgICAgICAvKiB0aGUgY29tcGlsZXIgc2hvdWxkIG9wdGltaXplIGF3YXkgdGhpcyBlbXB0eSBsb29wIGJ1dCAuLi4gKi8KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSAgICAgICAgICBpZiAoIGRlY29kZXItPmxlbl9idWlsZGNoYXIgPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICJCdWlsZENoYXJBcnJheSA9IFsgIiApKTsKLQotICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyOyArK2kgKQotICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiJWQgIiwgZGVjb2Rlci0+YnVpbGRjaGFyWyBpIF0gKSk7Ci0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICJdXG4iICkpOwotICAgICAgICAgIH0KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotCi0gICAgICAgICAgLyogcmV0dXJuIG5vdyEgKi8KLSAgICAgICAgICByZXR1cm4gUFNhdXhfRXJyX09rOwotCi0gICAgICAgIGNhc2Ugb3BfaHNidzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhzYnciICkpOwotCi0gICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX1dpZHRoOwotCi0gICAgICAgICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnggKz0gdG9wWzBdOwotICAgICAgICAgIGJ1aWxkZXItPmFkdmFuY2UueCAgICAgICA9IHRvcFsxXTsKLSAgICAgICAgICBidWlsZGVyLT5hZHZhbmNlLnkgICAgICAgPSAwOwotCi0gICAgICAgICAgb3JpZ194ID0gYnVpbGRlci0+bGFzdC54ID0geCA9IGJ1aWxkZXItPnBvc194ICsgdG9wWzBdOwotICAgICAgICAgIG9yaWdfeSA9IGJ1aWxkZXItPmxhc3QueSA9IHkgPSBidWlsZGVyLT5wb3NfeTsKLQotICAgICAgICAgIEZUX1VOVVNFRCggb3JpZ195ICk7Ci0KLSAgICAgICAgICAvKiB0aGUgYG1ldHJpY3Nfb25seScgaW5kaWNhdGVzIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgKi8KLSAgICAgICAgICAvKiB0aGUgZ2x5cGgncyBtZXRyaWNzIChsc2IgKyBhZHZhbmNlIHdpZHRoKSwgbm90IGxvYWQgdGhlICAgKi8KLSAgICAgICAgICAvKiByZXN0IG9mIGl0OyBzbyBleGl0IGltbWVkaWF0ZWx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGJ1aWxkZXItPm1ldHJpY3Nfb25seSApCi0gICAgICAgICAgICByZXR1cm4gUFNhdXhfRXJyX09rOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9zZWFjOgotICAgICAgICAgIC8qIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJvY2Vzc2luZyAqLwotICAgICAgICAgIHJldHVybiB0MW9wZXJhdG9yX3NlYWMoIGRlY29kZXIsIHRvcFswXSwgdG9wWzFdLCB0b3BbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludCl0b3BbM10sIChGVF9JbnQpdG9wWzRdICk7Ci0KLSAgICAgICAgY2FzZSBvcF9zYnc6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBzYnciICkpOwotCi0gICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX1dpZHRoOwotCi0gICAgICAgICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnggKz0gdG9wWzBdOwotICAgICAgICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZy55ICs9IHRvcFsxXTsKLSAgICAgICAgICBidWlsZGVyLT5hZHZhbmNlLnggICAgICAgPSB0b3BbMl07Ci0gICAgICAgICAgYnVpbGRlci0+YWR2YW5jZS55ICAgICAgID0gdG9wWzNdOwotCi0gICAgICAgICAgYnVpbGRlci0+bGFzdC54ID0geCA9IGJ1aWxkZXItPnBvc194ICsgdG9wWzBdOwotICAgICAgICAgIGJ1aWxkZXItPmxhc3QueSA9IHkgPSBidWlsZGVyLT5wb3NfeSArIHRvcFsxXTsKLQotICAgICAgICAgIC8qIHRoZSBgbWV0cmljc19vbmx5JyBpbmRpY2F0ZXMgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gY29tcHV0ZSAqLwotICAgICAgICAgIC8qIHRoZSBnbHlwaCdzIG1ldHJpY3MgKGxzYiArIGFkdmFuY2Ugd2lkdGgpLCBub3QgbG9hZCB0aGUgICAqLwotICAgICAgICAgIC8qIHJlc3Qgb2YgaXQ7IHNvIGV4aXQgaW1tZWRpYXRlbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggYnVpbGRlci0+bWV0cmljc19vbmx5ICkKLSAgICAgICAgICAgIHJldHVybiBQU2F1eF9FcnJfT2s7Ci0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2Nsb3NlcGF0aDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNsb3NlcGF0aCIgKSk7Ci0KLSAgICAgICAgICAvKiBpZiB0aGVyZSBpcyBubyBwYXRoLCBgY2xvc2VwYXRoJyBpcyBhIG5vLW9wICovCi0gICAgICAgICAgaWYgKCBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9PSBUMV9QYXJzZV9IYXZlX1BhdGggICB8fAotICAgICAgICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPT0gVDFfUGFyc2VfSGF2ZV9Nb3ZldG8gKQotICAgICAgICAgICAgY2xvc2VfY29udG91ciggYnVpbGRlciApOwotCi0gICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX1dpZHRoOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfaGxpbmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhsaW5ldG8iICkpOwotCi0gICAgICAgICAgaWYgKCBzdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIHggKz0gdG9wWzBdOwotICAgICAgICAgIGdvdG8gQWRkX0xpbmU7Ci0KLSAgICAgICAgY2FzZSBvcF9obW92ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaG1vdmV0byIgKSk7Ci0KLSAgICAgICAgICB4ICs9IHRvcFswXTsKLSAgICAgICAgICBpZiAoICFkZWNvZGVyLT5mbGV4X3N0YXRlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGJ1aWxkZXItPnBhcnNlX3N0YXRlID09IFQxX1BhcnNlX1N0YXJ0ICkKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX0hhdmVfTW92ZXRvOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2h2Y3VydmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGh2Y3VydmV0byIgKSk7Ci0KLSAgICAgICAgICBpZiAoIHN0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgfHwKLSAgICAgICAgICAgICAgIGNoZWNrX3BvaW50cyggYnVpbGRlciwgMyApICAgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgeCArPSB0b3BbMF07Ci0gICAgICAgICAgYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgeCArPSB0b3BbMV07Ci0gICAgICAgICAgeSArPSB0b3BbMl07Ci0gICAgICAgICAgYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgeSArPSB0b3BbM107Ci0gICAgICAgICAgYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9ybGluZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmxpbmV0byIgKSk7Ci0KLSAgICAgICAgICBpZiAoIHN0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgeCArPSB0b3BbMF07Ci0gICAgICAgICAgeSArPSB0b3BbMV07Ci0KLSAgICAgICAgQWRkX0xpbmU6Ci0gICAgICAgICAgaWYgKCBhZGRfcG9pbnQxKCBidWlsZGVyLCB4LCB5ICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3Bfcm1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJtb3ZldG8iICkpOwotCi0gICAgICAgICAgeCArPSB0b3BbMF07Ci0gICAgICAgICAgeSArPSB0b3BbMV07Ci0gICAgICAgICAgaWYgKCAhZGVjb2Rlci0+ZmxleF9zdGF0ZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9PSBUMV9QYXJzZV9TdGFydCApCi0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX01vdmV0bzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9ycmN1cnZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiByY3VydmV0byIgKSk7Ci0KLSAgICAgICAgICBpZiAoIHN0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgfHwKLSAgICAgICAgICAgICAgIGNoZWNrX3BvaW50cyggYnVpbGRlciwgMyApICAgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgeCArPSB0b3BbMF07Ci0gICAgICAgICAgeSArPSB0b3BbMV07Ci0gICAgICAgICAgYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICB4ICs9IHRvcFsyXTsKLSAgICAgICAgICB5ICs9IHRvcFszXTsKLSAgICAgICAgICBhZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgIHggKz0gdG9wWzRdOwotICAgICAgICAgIHkgKz0gdG9wWzVdOwotICAgICAgICAgIGFkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfdmhjdXJ2ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgdmhjdXJ2ZXRvIiApKTsKLQotICAgICAgICAgIGlmICggc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAzICkgICApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB5ICs9IHRvcFswXTsKLSAgICAgICAgICBhZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICB4ICs9IHRvcFsxXTsKLSAgICAgICAgICB5ICs9IHRvcFsyXTsKLSAgICAgICAgICBhZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICB4ICs9IHRvcFszXTsKLSAgICAgICAgICBhZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3ZsaW5ldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiB2bGluZXRvIiApKTsKLQotICAgICAgICAgIGlmICggc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB5ICs9IHRvcFswXTsKLSAgICAgICAgICBnb3RvIEFkZF9MaW5lOwotCi0gICAgICAgIGNhc2Ugb3Bfdm1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHZtb3ZldG8iICkpOwotCi0gICAgICAgICAgeSArPSB0b3BbMF07Ci0gICAgICAgICAgaWYgKCAhZGVjb2Rlci0+ZmxleF9zdGF0ZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9PSBUMV9QYXJzZV9TdGFydCApCi0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX01vdmV0bzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9kaXY6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBkaXYiICkpOwotCi0gICAgICAgICAgaWYgKCB0b3BbMV0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICp0b3AgPSB0b3BbMF0gLyB0b3BbMV07Ci0gICAgICAgICAgICArK3RvcDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IGRpdmlzaW9uIGJ5IDBcbiIgKSk7Ci0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9jYWxsc3VicjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIGlkeDsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNhbGxzdWJyIiApKTsKLQotICAgICAgICAgICAgaWR4ID0gKEZUX0ludCl0b3BbMF07Ci0gICAgICAgICAgICBpZiAoIGlkeCA8IDAgfHwgaWR4ID49IChGVF9JbnQpZGVjb2Rlci0+bnVtX3N1YnJzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHN1YnJzIGluZGV4XG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCB6b25lIC0gZGVjb2Rlci0+em9uZXMgPj0gVDFfTUFYX1NVQlJTX0NBTExTICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBuZXN0ZWQgc3VicnNcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB6b25lLT5jdXJzb3IgPSBpcDsgIC8qIHNhdmUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyICovCi0KLSAgICAgICAgICAgIHpvbmUrKzsKLQotICAgICAgICAgICAgLyogVGhlIFR5cGUgMSBkcml2ZXIgc3RvcmVzIHN1YnJvdXRpbmVzIHdpdGhvdXQgdGhlIHNlZWQgYnl0ZXMuICovCi0gICAgICAgICAgICAvKiBUaGUgQ0lEIGRyaXZlciBzdG9yZXMgc3Vicm91dGluZXMgd2l0aCBzZWVkIGJ5dGVzLiAgVGhpcyAgICAgKi8KLSAgICAgICAgICAgIC8qIGNhc2UgaXMgdGFrZW4gY2FyZSBvZiB3aGVuIGRlY29kZXItPnN1YnJzX2xlbiA9PSAwLiAgICAgICAgICAqLwotICAgICAgICAgICAgem9uZS0+YmFzZSA9IGRlY29kZXItPnN1YnJzW2lkeF07Ci0KLSAgICAgICAgICAgIGlmICggZGVjb2Rlci0+c3VicnNfbGVuICkKLSAgICAgICAgICAgICAgem9uZS0+bGltaXQgPSB6b25lLT5iYXNlICsgZGVjb2Rlci0+c3VicnNfbGVuW2lkeF07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIFdlIGFyZSB1c2luZyBzdWJyb3V0aW5lcyBmcm9tIGEgQ0lEIGZvbnQuICBXZSBtdXN0IGFkanVzdCAqLwotICAgICAgICAgICAgICAvKiBmb3IgdGhlIHNlZWQgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgem9uZS0+YmFzZSAgKz0gKCBkZWNvZGVyLT5sZW5JViA+PSAwID8gZGVjb2Rlci0+bGVuSVYgOiAwICk7Ci0gICAgICAgICAgICAgIHpvbmUtPmxpbWl0ICA9IGRlY29kZXItPnN1YnJzW2lkeCArIDFdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB6b25lLT5jdXJzb3IgPSB6b25lLT5iYXNlOwotCi0gICAgICAgICAgICBpZiAoICF6b25lLT5iYXNlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZva2luZyBlbXB0eSBzdWJycyFcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWNvZGVyLT56b25lID0gem9uZTsKLSAgICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5iYXNlOwotICAgICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGNhc2Ugb3BfcG9wOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcG9wIiApKTsKLQotICAgICAgICAgIGlmICgga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudC0tOwotICAgICAgICAgICAgLyogaWdub3JlLCB3ZSBwdXNoZWQgdGhlIG9wZXJhbmRzIG91cnNlbHZlcyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID09IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vIG1vcmUgb3BlcmFuZHMgZm9yIG90aGVyc3ViciFcbiIgKSk7Ci0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250LS07Ci0gICAgICAgICAgdG9wKys7ICAgLyogYHB1c2gnIHRoZSBvcGVyYW5kIHRvIGNhbGxvdGhlcnN1YnIgb250byB0aGUgc3RhY2sgKi8KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3JldHVybjoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJldHVybiIgKSk7Ci0KLSAgICAgICAgICBpZiAoIHpvbmUgPD0gZGVjb2Rlci0+em9uZXMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IHVuZXhwZWN0ZWQgcmV0dXJuXG4iICkpOwotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgem9uZS0tOwotICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5jdXJzb3I7Ci0gICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgIGRlY29kZXItPnpvbmUgPSB6b25lOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfZG90c2VjdGlvbjoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGRvdHNlY3Rpb24iICkpOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9oc3RlbToKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhzdGVtIiApKTsKLQotICAgICAgICAgIC8qIHJlY29yZCBob3Jpem9udGFsIGhpbnQgKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogdG9wWzBdICs9IGJ1aWxkZXItPmxlZnRfYmVhcmluZy55OyAqLwotICAgICAgICAgICAgaGludGVyLT5zdGVtKCBoaW50ZXItPmhpbnRzLCAxLCB0b3AgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2hzdGVtMzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhzdGVtMyIgKSk7Ci0KLSAgICAgICAgICAvKiByZWNvcmQgaG9yaXpvbnRhbCBjb3VudGVyLWNvbnRyb2xsZWQgaGludHMgKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgICBoaW50ZXItPnN0ZW0zKCBoaW50ZXItPmhpbnRzLCAxLCB0b3AgKTsKLQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfdnN0ZW06Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiB2c3RlbSIgKSk7Ci0KLSAgICAgICAgICAvKiByZWNvcmQgdmVydGljYWwgIGhpbnQgKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgdG9wWzBdICs9IG9yaWdfeDsKLSAgICAgICAgICAgIGhpbnRlci0+c3RlbSggaGludGVyLT5oaW50cywgMCwgdG9wICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF92c3RlbTM6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiB2c3RlbTMiICkpOwotCi0gICAgICAgICAgLyogcmVjb3JkIHZlcnRpY2FsIGNvdW50ZXItY29udHJvbGxlZCBoaW50cyAqLwotICAgICAgICAgIGlmICggaGludGVyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIGR4ID0gb3JpZ194OwotCi0KLSAgICAgICAgICAgIHRvcFswXSArPSBkeDsKLSAgICAgICAgICAgIHRvcFsyXSArPSBkeDsKLSAgICAgICAgICAgIHRvcFs0XSArPSBkeDsKLSAgICAgICAgICAgIGhpbnRlci0+c3RlbTMoIGhpbnRlci0+aGludHMsIDAsIHRvcCApOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3NldGN1cnJlbnRwb2ludDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHNldGN1cnJlbnRwb2ludCIgKSk7Ci0KLSAgICAgICAgICAvKiBGcm9tIHRoZSBUMSBzcGVjcywgc2VjdGlvbiA2LjQ6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIFRoZSBzZXRjdXJyZW50cG9pbnQgY29tbWFuZCBpcyB1c2VkIG9ubHkgaW4gICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIGNvbmp1bmN0aW9uIHdpdGggcmVzdWx0cyBmcm9tIE90aGVyU3VicnMgcHJvY2VkdXJlcy4gKi8KLQotICAgICAgICAgIC8qIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ICE9IDAgaXMgYWxyZWFkeSBoYW5kbGVkIGFib3ZlICovCi0gICAgICAgICAgaWYgKCBkZWNvZGVyLT5mbGV4X3N0YXRlICE9IDEgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6ICIgKSk7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJ1bmV4cGVjdGVkIGBzZXRjdXJyZW50cG9pbnQnXG4iICkpOwotCi0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGVjb2Rlci0+ZmxleF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF91bmtub3duMTU6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBvcGNvZGVfMTUiICkpOwotICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gZXhjZXB0IHRvIHBvcCB0aGUgdHdvIGFyZ3VtZW50cyAqLwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogIgotICAgICAgICAgICAgICAgICAgICAgInVuaGFuZGxlZCBvcGNvZGUgJWRcbiIsIG9wICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogWFhYIE9wZXJhdG9ycyB1c3VhbGx5IGNsZWFyIHRoZSBvcGVyYW5kIHN0YWNrOyAgKi8KLSAgICAgICAgLyogICAgIG9ubHkgZGl2LCBjYWxsc3ViciwgY2FsbG90aGVyc3ViciwgcG9wLCBhbmQgKi8KLSAgICAgICAgLyogICAgIHJldHVybiBhcmUgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgIEluIHByYWN0aWNlIGl0IGRvZXNuJ3QgbWF0dGVyICg/KS4gICAgICAgICAgKi8KLQotICAgICAgICBkZWNvZGVyLT50b3AgPSB0b3A7Ci0KLSAgICAgIH0gLyogZ2VuZXJhbCBvcGVyYXRvciBwcm9jZXNzaW5nICovCi0KLSAgICB9IC8qIHdoaWxlIGlwIDwgbGltaXQgKi8KLQotICAgIEZUX1RSQUNFNCgoICIuLmVuZC4uXG5cbiIgKSk7Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgU3ludGF4X0Vycm9yOgotICAgIHJldHVybiBQU2F1eF9FcnJfU3ludGF4X0Vycm9yOwotCi0gIFN0YWNrX1VuZGVyZmxvdzoKLSAgICByZXR1cm4gUFNhdXhfRXJyX1N0YWNrX1VuZGVyZmxvdzsKLSAgfQotCi0KLSAgLyogcGFyc2UgYSBzaW5nbGUgVHlwZSAxIGdseXBoICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9kZWNvZGVyX3BhcnNlX2dseXBoKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaCApCi0gIHsKLSAgICByZXR1cm4gZGVjb2Rlci0+cGFyc2VfY2FsbGJhY2soIGRlY29kZXIsIGdseXBoICk7Ci0gIH0KLQotCi0gIC8qIGluaXRpYWxpemUgVDEgZGVjb2RlciAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdDFfZGVjb2Rlcl9pbml0KCBUMV9EZWNvZGVyICAgICAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgICAgICAgICAgIGdseXBoX25hbWVzLAotICAgICAgICAgICAgICAgICAgIFBTX0JsZW5kICAgICAgICAgICAgIGJsZW5kLAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgIGhpbnRpbmcsCi0gICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgICAgaGludF9tb2RlLAotICAgICAgICAgICAgICAgICAgIFQxX0RlY29kZXJfQ2FsbGJhY2sgIHBhcnNlX2NhbGxiYWNrICkKLSAgewotICAgIEZUX01FTV9aRVJPKCBkZWNvZGVyLCBzaXplb2YgKCAqZGVjb2RlciApICk7Ci0KLSAgICAvKiByZXRyaWV2ZSBQU05hbWVzIGludGVyZmFjZSBmcm9tIGxpc3Qgb2YgY3VycmVudCBtb2R1bGVzICovCi0gICAgewotICAgICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gMDsKLQotCi0gICAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHBzbmFtZXMsIFBPU1RTQ1JJUFRfQ01BUFMgKTsKLSAgICAgIGlmICggIXBzbmFtZXMgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX2luaXQ6ICIgKSk7Ci0gICAgICAgIEZUX0VSUk9SKCggInRoZSBgcHNuYW1lcycgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGVcbiIgKSk7Ci0gICAgICAgIHJldHVybiBQU2F1eF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlOwotICAgICAgfQotCi0gICAgICBkZWNvZGVyLT5wc25hbWVzID0gcHNuYW1lczsKLSAgICB9Ci0KLSAgICB0MV9idWlsZGVyX2luaXQoICZkZWNvZGVyLT5idWlsZGVyLCBmYWNlLCBzaXplLCBzbG90LCBoaW50aW5nICk7Ci0KLSAgICAvKiBkZWNvZGVyLT5idWlsZGNoYXIgYW5kIGRlY29kZXItPmxlbl9idWlsZGNoYXIgaGF2ZSB0byBiZSAgKi8KLSAgICAvKiBpbml0aWFsaXplZCBieSB0aGUgY2FsbGVyIHNpbmNlIHdlIGNhbm5vdCBrbm93IHRoZSBsZW5ndGggKi8KLSAgICAvKiBvZiB0aGUgQnVpbGRDaGFyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGRlY29kZXItPm51bV9nbHlwaHMgICAgID0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBoczsKLSAgICBkZWNvZGVyLT5nbHlwaF9uYW1lcyAgICA9IGdseXBoX25hbWVzOwotICAgIGRlY29kZXItPmhpbnRfbW9kZSAgICAgID0gaGludF9tb2RlOwotICAgIGRlY29kZXItPmJsZW5kICAgICAgICAgID0gYmxlbmQ7Ci0gICAgZGVjb2Rlci0+cGFyc2VfY2FsbGJhY2sgPSBwYXJzZV9jYWxsYmFjazsKLQotICAgIGRlY29kZXItPmZ1bmNzICAgICAgICAgID0gdDFfZGVjb2Rlcl9mdW5jczsKLQotICAgIHJldHVybiBQU2F1eF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGZpbmFsaXplIFQxIGRlY29kZXIgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdDFfZGVjb2Rlcl9kb25lKCBUMV9EZWNvZGVyICBkZWNvZGVyICkKLSAgewotICAgIHQxX2J1aWxkZXJfZG9uZSggJmRlY29kZXItPmJ1aWxkZXIgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3QxZGVjb2RlLmggYi9zcmMvcHNhdXgvdDFkZWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3MjhkYi4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvdDFkZWNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxZGVjb2RlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IFR5cGUgMSBkZWNvZGluZyByb3V0aW5lcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDAxLCAyMDAyLCAyMDAzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1QxREVDT0RFX0hfXwotI2RlZmluZSBfX1QxREVDT0RFX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUKLSAgY29uc3QgVDFfRGVjb2Rlcl9GdW5jc1JlYyAgdDFfZGVjb2Rlcl9mdW5jczsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHQxX2RlY29kZXJfcGFyc2VfZ2x5cGgoIFQxX0RlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVuICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdDFfZGVjb2Rlcl9pbml0KCBUMV9EZWNvZGVyICAgICAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgICAgICAgICAgIGdseXBoX25hbWVzLAotICAgICAgICAgICAgICAgICAgIFBTX0JsZW5kICAgICAgICAgICAgIGJsZW5kLAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgIGhpbnRpbmcsCi0gICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgICAgaGludF9tb2RlLAotICAgICAgICAgICAgICAgICAgIFQxX0RlY29kZXJfQ2FsbGJhY2sgIHBhcnNlX2dseXBoICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0MV9kZWNvZGVyX2RvbmUoIFQxX0RlY29kZXIgIGRlY29kZXIgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1QxREVDT0RFX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaGFsZ28uYyBiL3NyYy9wc2hpbnRlci9wc2hhbGdvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkN2UyZjQuLjAwMDAwMDAKLS0tIGEvc3JjL3BzaGludGVyL3BzaGFsZ28uYworKysgL2Rldi9udWxsCkBAIC0xLDIzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoYWxnby5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgaGludGluZyBhbGdvcml0aG0gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSAicHNoYWxnby5oIgotCi0jaW5jbHVkZSAicHNobnRlcnIuaCIKLQotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3BzaGFsZ28yCi0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICBQU0hfSGludF9UYWJsZSAgcHNfZGVidWdfaGludF90YWJsZSA9IDA7Ci0gIFBTSF9IaW50RnVuYyAgICBwc19kZWJ1Z19oaW50X2Z1bmMgID0gMDsKLSAgUFNIX0dseXBoICAgICAgIHBzX2RlYnVnX2dseXBoICAgICAgPSAwOwotI2VuZGlmCi0KLQotI2RlZmluZSAgQ09NUFVURV9JTkZMRVhTICAvKiBjb21wdXRlIGluZmxlY3Rpb24gcG9pbnRzIHRvIG9wdGltaXplIGBTJyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgc2ltaWxhciBnbHlwaHMgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgU1RST05HRVIgICAgICAgICAvKiBzbGlnaHRseSBpbmNyZWFzZSB0aGUgY29udHJhc3Qgb2Ygc21vb3RoICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaW50aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgQkFTSUMgSElOVFMgUkVDT1JESU5HUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogcmV0dXJuIHRydWUgaWYgdHdvIHN0ZW0gaGludHMgb3ZlcmxhcCAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHBzaF9oaW50X292ZXJsYXAoIFBTSF9IaW50ICBoaW50MSwKLSAgICAgICAgICAgICAgICAgICAgUFNIX0hpbnQgIGhpbnQyICkKLSAgewotICAgIHJldHVybiBoaW50MS0+b3JnX3BvcyArIGhpbnQxLT5vcmdfbGVuID49IGhpbnQyLT5vcmdfcG9zICYmCi0gICAgICAgICAgIGhpbnQyLT5vcmdfcG9zICsgaGludDItPm9yZ19sZW4gPj0gaGludDEtPm9yZ19wb3M7Ci0gIH0KLQotCi0gIC8qIGRlc3Ryb3kgaGludHMgdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfdGFibGVfZG9uZSggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0ZSRUUoIHRhYmxlLT56b25lcyApOwotICAgIHRhYmxlLT5udW1fem9uZXMgPSAwOwotICAgIHRhYmxlLT56b25lICAgICAgPSAwOwotCi0gICAgRlRfRlJFRSggdGFibGUtPnNvcnQgKTsKLSAgICBGVF9GUkVFKCB0YWJsZS0+aGludHMgKTsKLSAgICB0YWJsZS0+bnVtX2hpbnRzICAgPSAwOwotICAgIHRhYmxlLT5tYXhfaGludHMgICA9IDA7Ci0gICAgdGFibGUtPnNvcnRfZ2xvYmFsID0gMDsKLSAgfQotCi0KLSAgLyogZGVhY3RpdmF0ZSBhbGwgaGludHMgaW4gYSB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF90YWJsZV9kZWFjdGl2YXRlKCBQU0hfSGludF9UYWJsZSAgdGFibGUgKQotICB7Ci0gICAgRlRfVUludCAgIGNvdW50ID0gdGFibGUtPm1heF9oaW50czsKLSAgICBQU0hfSGludCAgaGludCAgPSB0YWJsZS0+aGludHM7Ci0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBoaW50KysgKQotICAgIHsKLSAgICAgIHBzaF9oaW50X2RlYWN0aXZhdGUoIGhpbnQgKTsKLSAgICAgIGhpbnQtPm9yZGVyID0gLTE7Ci0gICAgfQotICB9Ci0KLQotICAvKiBpbnRlcm5hbCBmdW5jdGlvbiB0byByZWNvcmQgYSBuZXcgaGludCAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF90YWJsZV9yZWNvcmQoIFBTSF9IaW50X1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgaWR4ICkKLSAgewotICAgIFBTSF9IaW50ICBoaW50ID0gdGFibGUtPmhpbnRzICsgaWR4OwotCi0KLSAgICBpZiAoIGlkeCA+PSB0YWJsZS0+bWF4X2hpbnRzICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJwc2hfaGludF90YWJsZV9yZWNvcmQ6IGludmFsaWQgaGludCBpbmRleCAlZFxuIiwgaWR4ICkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGlnbm9yZSBhY3RpdmUgaGludHMgKi8KLSAgICBpZiAoIHBzaF9oaW50X2lzX2FjdGl2ZSggaGludCApICkKLSAgICAgIHJldHVybjsKLQotICAgIHBzaF9oaW50X2FjdGl2YXRlKCBoaW50ICk7Ci0KLSAgICAvKiBub3cgc2NhbiB0aGUgY3VycmVudCBhY3RpdmUgaGludCBzZXQgdG8gY2hlY2sgKi8KLSAgICAvKiB3aGV0aGVyIGBoaW50JyBvdmVybGFwcyB3aXRoIGFub3RoZXIgaGludCAgICAgKi8KLSAgICB7Ci0gICAgICBQU0hfSGludCogIHNvcnRlZCA9IHRhYmxlLT5zb3J0X2dsb2JhbDsKLSAgICAgIEZUX1VJbnQgICAgY291bnQgID0gdGFibGUtPm51bV9oaW50czsKLSAgICAgIFBTSF9IaW50ICAgaGludDI7Ci0KLQotICAgICAgaGludC0+cGFyZW50ID0gMDsKLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzb3J0ZWQrKyApCi0gICAgICB7Ci0gICAgICAgIGhpbnQyID0gc29ydGVkWzBdOwotCi0gICAgICAgIGlmICggcHNoX2hpbnRfb3ZlcmxhcCggaGludCwgaGludDIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBoaW50LT5wYXJlbnQgPSBoaW50MjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICggdGFibGUtPm51bV9oaW50cyA8IHRhYmxlLT5tYXhfaGludHMgKQotICAgICAgdGFibGUtPnNvcnRfZ2xvYmFsW3RhYmxlLT5udW1faGludHMrK10gPSBoaW50OwotICAgIGVsc2UKLSAgICAgIEZUX0VSUk9SKCggInBzaF9oaW50X3RhYmxlX3JlY29yZDogdG9vIG1hbnkgc29ydGVkIGhpbnRzISAgQlVHIVxuIiApKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfdGFibGVfcmVjb3JkX21hc2soIFBTSF9IaW50X1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX01hc2sgICAgICAgICBoaW50X21hc2sgKQotICB7Ci0gICAgRlRfSW50ICAgIG1hc2sgPSAwLCB2YWwgPSAwOwotICAgIEZUX0J5dGUqICBjdXJzb3IgPSBoaW50X21hc2stPmJ5dGVzOwotICAgIEZUX1VJbnQgICBpZHgsIGxpbWl0OwotCi0KLSAgICBsaW1pdCA9IGhpbnRfbWFzay0+bnVtX2JpdHM7Ci0KLSAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBsaW1pdDsgaWR4KysgKQotICAgIHsKLSAgICAgIGlmICggbWFzayA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgdmFsICA9ICpjdXJzb3IrKzsKLSAgICAgICAgbWFzayA9IDB4ODA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdmFsICYgbWFzayApCi0gICAgICAgIHBzaF9oaW50X3RhYmxlX3JlY29yZCggdGFibGUsIGlkeCApOwotCi0gICAgICBtYXNrID4+PSAxOwotICAgIH0KLSAgfQotCi0KLSAgLyogY3JlYXRlIGhpbnRzIHRhYmxlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc2hfaGludF90YWJsZV9pbml0KCBQU0hfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX0hpbnRfVGFibGUgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfTWFza19UYWJsZSAgIGhpbnRfbWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX01hc2tfVGFibGUgICBjb3VudGVyX21hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX1VJbnQgICBjb3VudDsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICBGVF9VTlVTRUQoIGNvdW50ZXJfbWFza3MgKTsKLQotCi0gICAgY291bnQgPSBoaW50cy0+bnVtX2hpbnRzOwotCi0gICAgLyogYWxsb2NhdGUgb3VyIHRhYmxlcyAqLwotICAgIGlmICggRlRfTkVXX0FSUkFZKCB0YWJsZS0+c29ydCwgIDIgKiBjb3VudCAgICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCB0YWJsZS0+aGludHMsICAgICBjb3VudCAgICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCB0YWJsZS0+em9uZXMsIDIgKiBjb3VudCArIDEgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB0YWJsZS0+bWF4X2hpbnRzICAgPSBjb3VudDsKLSAgICB0YWJsZS0+c29ydF9nbG9iYWwgPSB0YWJsZS0+c29ydCArIGNvdW50OwotICAgIHRhYmxlLT5udW1faGludHMgICA9IDA7Ci0gICAgdGFibGUtPm51bV96b25lcyAgID0gMDsKLSAgICB0YWJsZS0+em9uZSAgICAgICAgPSAwOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgYHRhYmxlLT5oaW50cycgYXJyYXkgKi8KLSAgICB7Ci0gICAgICBQU0hfSGludCAgd3JpdGUgPSB0YWJsZS0+aGludHM7Ci0gICAgICBQU19IaW50ICAgcmVhZCAgPSBoaW50cy0+aGludHM7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHdyaXRlKyssIHJlYWQrKyApCi0gICAgICB7Ci0gICAgICAgIHdyaXRlLT5vcmdfcG9zID0gcmVhZC0+cG9zOwotICAgICAgICB3cml0ZS0+b3JnX2xlbiA9IHJlYWQtPmxlbjsKLSAgICAgICAgd3JpdGUtPmZsYWdzICAgPSByZWFkLT5mbGFnczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB3ZSBub3cgbmVlZCB0byBkZXRlcm1pbmUgdGhlIGluaXRpYWwgYHBhcmVudCcgc3RlbXM7IGZpcnN0ICAqLwotICAgIC8qIGFjdGl2YXRlIHRoZSBoaW50cyB0aGF0IGFyZSBnaXZlbiBieSB0aGUgaW5pdGlhbCBoaW50IG1hc2tzICovCi0gICAgaWYgKCBoaW50X21hc2tzICkKLSAgICB7Ci0gICAgICBQU19NYXNrICBtYXNrID0gaGludF9tYXNrcy0+bWFza3M7Ci0KLQotICAgICAgY291bnQgICAgICAgICAgICAgPSBoaW50X21hc2tzLT5udW1fbWFza3M7Ci0gICAgICB0YWJsZS0+aGludF9tYXNrcyA9IGhpbnRfbWFza3M7Ci0KLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBtYXNrKysgKQotICAgICAgICBwc2hfaGludF90YWJsZV9yZWNvcmRfbWFzayggdGFibGUsIG1hc2sgKTsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5LCBkbyBhIGxpbmVhciBwYXJzZSBpbiBjYXNlIHNvbWUgaGludHMgd2VyZSBsZWZ0IGFsb25lICovCi0gICAgaWYgKCB0YWJsZS0+bnVtX2hpbnRzICE9IHRhYmxlLT5tYXhfaGludHMgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGlkeDsKLQotCi0gICAgICBGVF9FUlJPUigoICJwc2hfaGludF90YWJsZV9pbml0OiBtaXNzaW5nL2luY29ycmVjdCBoaW50IG1hc2tzIVxuIiApKTsKLQotICAgICAgY291bnQgPSB0YWJsZS0+bWF4X2hpbnRzOwotICAgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCsrICkKLSAgICAgICAgcHNoX2hpbnRfdGFibGVfcmVjb3JkKCB0YWJsZSwgaWR4ICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrKCBQU0hfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX01hc2sgICAgICAgICBoaW50X21hc2sgKQotICB7Ci0gICAgRlRfSW50ICAgIG1hc2sgPSAwLCB2YWwgPSAwOwotICAgIEZUX0J5dGUqICBjdXJzb3IgPSBoaW50X21hc2stPmJ5dGVzOwotICAgIEZUX1VJbnQgICBpZHgsIGxpbWl0LCBjb3VudDsKLQotCi0gICAgbGltaXQgPSBoaW50X21hc2stPm51bV9iaXRzOwotICAgIGNvdW50ID0gMDsKLQotICAgIHBzaF9oaW50X3RhYmxlX2RlYWN0aXZhdGUoIHRhYmxlICk7Ci0KLSAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBsaW1pdDsgaWR4KysgKQotICAgIHsKLSAgICAgIGlmICggbWFzayA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgdmFsICA9ICpjdXJzb3IrKzsKLSAgICAgICAgbWFzayA9IDB4ODA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdmFsICYgbWFzayApCi0gICAgICB7Ci0gICAgICAgIFBTSF9IaW50ICBoaW50ID0gJnRhYmxlLT5oaW50c1tpZHhdOwotCi0KLSAgICAgICAgaWYgKCAhcHNoX2hpbnRfaXNfYWN0aXZlKCBoaW50ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgICAgY291bnQyOwotCi0jaWYgMAotICAgICAgICAgIFBTSF9IaW50KiAgc29ydCA9IHRhYmxlLT5zb3J0OwotICAgICAgICAgIFBTSF9IaW50ICAgaGludDI7Ci0KLQotICAgICAgICAgIGZvciAoIGNvdW50MiA9IGNvdW50OyBjb3VudDIgPiAwOyBjb3VudDItLSwgc29ydCsrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoaW50MiA9IHNvcnRbMF07Ci0gICAgICAgICAgICBpZiAoIHBzaF9oaW50X292ZXJsYXAoIGhpbnQsIGhpbnQyICkgKQotICAgICAgICAgICAgICBGVF9FUlJPUigoICJwc2hfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvdW5kIG92ZXJsYXBwaW5nIGhpbnRzXG4iICkpCi0gICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICBjb3VudDIgPSAwOwotI2VuZGlmCi0KLSAgICAgICAgICBpZiAoIGNvdW50MiA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwc2hfaGludF9hY3RpdmF0ZSggaGludCApOwotICAgICAgICAgICAgaWYgKCBjb3VudCA8IHRhYmxlLT5tYXhfaGludHMgKQotICAgICAgICAgICAgICB0YWJsZS0+c29ydFtjb3VudCsrXSA9IGhpbnQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInBzaF9oaW50X3RhYmxlYWN0aXZhdGVfbWFzazoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiB0b28gbWFueSBhY3RpdmUgaGludHNcbiIgKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIG1hc2sgPj49IDE7Ci0gICAgfQotICAgIHRhYmxlLT5udW1faGludHMgPSBjb3VudDsKLQotICAgIC8qIG5vdywgc29ydCB0aGUgaGludHM7IHRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gbm90IG92ZXJsYXAgKi8KLSAgICAvKiBzbyB3ZSBjYW4gY29tcGFyZSB0aGVpciAib3JnX3BvcyIgZmllbGQgZGlyZWN0bHkgICAgICAgICovCi0gICAgewotICAgICAgRlRfSW50ICAgICBpMSwgaTI7Ci0gICAgICBQU0hfSGludCAgIGhpbnQxLCBoaW50MjsKLSAgICAgIFBTSF9IaW50KiAgc29ydCA9IHRhYmxlLT5zb3J0OwotCi0KLSAgICAgIC8qIGEgc2ltcGxlIGJ1YmJsZSBzb3J0IHdpbGwgZG8sIHNpbmNlIGluIDk5JSBvZiBjYXNlcywgdGhlIGhpbnRzICovCi0gICAgICAvKiB3aWxsIGJlIGFscmVhZHkgc29ydGVkIC0tIGFuZCB0aGUgc29ydCB3aWxsIGJlIGxpbmVhciAgICAgICAgICAqLwotICAgICAgZm9yICggaTEgPSAxOyBpMSA8IChGVF9JbnQpY291bnQ7IGkxKysgKQotICAgICAgewotICAgICAgICBoaW50MSA9IHNvcnRbaTFdOwotICAgICAgICBmb3IgKCBpMiA9IGkxIC0gMTsgaTIgPj0gMDsgaTItLSApCi0gICAgICAgIHsKLSAgICAgICAgICBoaW50MiA9IHNvcnRbaTJdOwotCi0gICAgICAgICAgaWYgKCBoaW50Mi0+b3JnX3BvcyA8IGhpbnQxLT5vcmdfcG9zICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgc29ydFtpMiArIDFdID0gaGludDI7Ci0gICAgICAgICAgc29ydFtpMl0gICAgID0gaGludDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgIEhJTlRTIEdSSUQtRklUVElORyBBTkQgT1BUSU1JWkFUSU9OICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgMQotICBzdGF0aWMgRlRfUG9zCi0gIHBzaF9kaW1lbnNpb25fcXVhbnRpemVfbGVuKCBQU0hfRGltZW5zaW9uICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICBkb19zbmFwcGluZyApCi0gIHsKLSAgICBpZiAoIGxlbiA8PSA2NCApCi0gICAgICBsZW4gPSA2NDsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfUG9zICBkZWx0YSA9IGxlbiAtIGRpbS0+c3Rkdy53aWR0aHNbMF0uY3VyOwotCi0KLSAgICAgIGlmICggZGVsdGEgPCAwICkKLSAgICAgICAgZGVsdGEgPSAtZGVsdGE7Ci0KLSAgICAgIGlmICggZGVsdGEgPCA0MCApCi0gICAgICB7Ci0gICAgICAgIGxlbiA9IGRpbS0+c3Rkdy53aWR0aHNbMF0uY3VyOwotICAgICAgICBpZiAoIGxlbiA8IDQ4ICkKLSAgICAgICAgICBsZW4gPSA0ODsKLSAgICAgIH0KLQotICAgICAgaWYgKCBsZW4gPCAzICogNjQgKQotICAgICAgewotICAgICAgICBkZWx0YSA9ICggbGVuICYgNjMgKTsKLSAgICAgICAgbGVuICAmPSAtNjQ7Ci0KLSAgICAgICAgaWYgKCBkZWx0YSA8IDEwICkKLSAgICAgICAgICBsZW4gKz0gZGVsdGE7Ci0KLSAgICAgICAgZWxzZSBpZiAoIGRlbHRhIDwgMzIgKQotICAgICAgICAgIGxlbiArPSAxMDsKLQotICAgICAgICBlbHNlIGlmICggZGVsdGEgPCA1NCApCi0gICAgICAgICAgbGVuICs9IDU0OwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBsZW4gKz0gZGVsdGE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGxlbiA9IEZUX1BJWF9ST1VORCggbGVuICk7Ci0gICAgfQotCi0gICAgaWYgKCBkb19zbmFwcGluZyApCi0gICAgICBsZW4gPSBGVF9QSVhfUk9VTkQoIGxlbiApOwotCi0gICAgcmV0dXJuICBsZW47Ci0gIH0KLSNlbmRpZiAvKiAwICovCi0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotCi0gIHN0YXRpYyB2b2lkCi0gIHBzX3NpbXBsZV9zY2FsZSggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICAgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGRpbWVuc2lvbiApCi0gIHsKLSAgICBQU0hfSGludCAgaGludDsKLSAgICBGVF9VSW50ICAgY291bnQ7Ci0KLQotICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCB0YWJsZS0+bWF4X2hpbnRzOyBjb3VudCsrICkKLSAgICB7Ci0gICAgICBoaW50ID0gdGFibGUtPmhpbnRzICsgY291bnQ7Ci0KLSAgICAgIGhpbnQtPmN1cl9wb3MgPSBGVF9NdWxGaXgoIGhpbnQtPm9yZ19wb3MsIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgIGhpbnQtPmN1cl9sZW4gPSBGVF9NdWxGaXgoIGhpbnQtPm9yZ19sZW4sIHNjYWxlICk7Ci0KLSAgICAgIGlmICggcHNfZGVidWdfaGludF9mdW5jICkKLSAgICAgICAgcHNfZGVidWdfaGludF9mdW5jKCBoaW50LCBkaW1lbnNpb24gKTsKLSAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIERFQlVHX0hJTlRFUiAqLwotCi0KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIHBzaF9oaW50X3NuYXBfc3RlbV9zaWRlX2RlbHRhKCBGVF9GaXhlZCAgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgIGxlbiApCi0gIHsKLSAgICBGVF9GaXhlZCAgZGVsdGExID0gRlRfUElYX1JPVU5EKCBwb3MgKSAtIHBvczsKLSAgICBGVF9GaXhlZCAgZGVsdGEyID0gRlRfUElYX1JPVU5EKCBwb3MgKyBsZW4gKSAtIHBvcyAtIGxlbjsKLQotCi0gICAgaWYgKCBGVF9BQlMoIGRlbHRhMSApIDw9IEZUX0FCUyggZGVsdGEyICkgKQotICAgICAgcmV0dXJuIGRlbHRhMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZGVsdGEyOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF9hbGlnbiggUFNIX0hpbnQgICAgIGhpbnQsCi0gICAgICAgICAgICAgICAgICBQU0hfR2xvYmFscyAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICBQU0hfR2x5cGggICAgZ2x5cGggKQotICB7Ci0gICAgUFNIX0RpbWVuc2lvbiAgZGltICAgPSAmZ2xvYmFscy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0gICAgRlRfRml4ZWQgICAgICAgc2NhbGUgPSBkaW0tPnNjYWxlX211bHQ7Ci0gICAgRlRfRml4ZWQgICAgICAgZGVsdGEgPSBkaW0tPnNjYWxlX2RlbHRhOwotCi0KLSAgICBpZiAoICFwc2hfaGludF9pc19maXR0ZWQoIGhpbnQgKSApCi0gICAgewotICAgICAgRlRfUG9zICBwb3MgPSBGVF9NdWxGaXgoIGhpbnQtPm9yZ19wb3MsIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgIEZUX1BvcyAgbGVuID0gRlRfTXVsRml4KCBoaW50LT5vcmdfbGVuLCBzY2FsZSApOwotCi0gICAgICBGVF9JbnQgICAgICAgICAgICBkb19zbmFwcGluZzsKLSAgICAgIEZUX1BvcyAgICAgICAgICAgIGZpdF9sZW47Ci0gICAgICBQU0hfQWxpZ25tZW50UmVjICBhbGlnbjsKLQotCi0gICAgICAvKiBpZ25vcmUgc3RlbSBhbGlnbm1lbnRzIHdoZW4gcmVxdWVzdGVkIHRocm91Z2ggdGhlIGhpbnQgZmxhZ3MgKi8KLSAgICAgIGlmICggKCBkaW1lbnNpb24gPT0gMCAmJiAhZ2x5cGgtPmRvX2hvcnpfaGludHMgKSB8fAotICAgICAgICAgICAoIGRpbWVuc2lvbiA9PSAxICYmICFnbHlwaC0+ZG9fdmVydF9oaW50cyApICkKLSAgICAgIHsKLSAgICAgICAgaGludC0+Y3VyX3BvcyA9IHBvczsKLSAgICAgICAgaGludC0+Y3VyX2xlbiA9IGxlbjsKLQotICAgICAgICBwc2hfaGludF9zZXRfZml0dGVkKCBoaW50ICk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLyogcGVyZm9ybSBzdGVtIHNuYXBwaW5nIHdoZW4gcmVxdWVzdGVkIC0gdGhpcyBpcyBuZWNlc3NhcnkKLSAgICAgICAqIGZvciBtb25vY2hyb21lIGFuZCBMQ0QgaGludGluZyBtb2RlcyBvbmx5Ci0gICAgICAgKi8KLSAgICAgIGRvX3NuYXBwaW5nID0gKCBkaW1lbnNpb24gPT0gMCAmJiBnbHlwaC0+ZG9faG9yel9zbmFwcGluZyApIHx8Ci0gICAgICAgICAgICAgICAgICAgICggZGltZW5zaW9uID09IDEgJiYgZ2x5cGgtPmRvX3ZlcnRfc25hcHBpbmcgKTsKLQotICAgICAgaGludC0+Y3VyX2xlbiA9IGZpdF9sZW4gPSBsZW47Ci0KLSAgICAgIC8qIGNoZWNrIGJsdWUgem9uZXMgZm9yIGhvcml6b250YWwgc3RlbXMgKi8KLSAgICAgIGFsaWduLmFsaWduICAgICA9IFBTSF9CTFVFX0FMSUdOX05PTkU7Ci0gICAgICBhbGlnbi5hbGlnbl9ib3QgPSBhbGlnbi5hbGlnbl90b3AgPSAwOwotCi0gICAgICBpZiAoIGRpbWVuc2lvbiA9PSAxICkKLSAgICAgICAgcHNoX2JsdWVzX3NuYXBfc3RlbSggJmdsb2JhbHMtPmJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LT5vcmdfcG9zICsgaGludC0+b3JnX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduICk7Ci0KLSAgICAgIHN3aXRjaCAoIGFsaWduLmFsaWduICkKLSAgICAgIHsKLSAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fVE9QOgotICAgICAgICAvKiB0aGUgdG9wIG9mIHRoZSBzdGVtIGlzIGFsaWduZWQgYWdhaW5zdCBhIGJsdWUgem9uZSAqLwotICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fdG9wIC0gZml0X2xlbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fQk9UOgotICAgICAgICAvKiB0aGUgYm90dG9tIG9mIHRoZSBzdGVtIGlzIGFsaWduZWQgYWdhaW5zdCBhIGJsdWUgem9uZSAqLwotICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fYm90OwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9UT1AgfCBQU0hfQkxVRV9BTElHTl9CT1Q6Ci0gICAgICAgIC8qIGJvdGggZWRnZXMgb2YgdGhlIHN0ZW0gYXJlIGFsaWduZWQgYWdhaW5zdCBibHVlIHpvbmVzICovCi0gICAgICAgIGhpbnQtPmN1cl9wb3MgPSBhbGlnbi5hbGlnbl9ib3Q7Ci0gICAgICAgIGhpbnQtPmN1cl9sZW4gPSBhbGlnbi5hbGlnbl90b3AgLSBhbGlnbi5hbGlnbl9ib3Q7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgUFNIX0hpbnQgIHBhcmVudCA9IGhpbnQtPnBhcmVudDsKLQotCi0gICAgICAgICAgaWYgKCBwYXJlbnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgcGFyX29yZ19jZW50ZXIsIHBhcl9jdXJfY2VudGVyOwotICAgICAgICAgICAgRlRfUG9zICBjdXJfb3JnX2NlbnRlciwgY3VyX2RlbHRhOwotCi0KLSAgICAgICAgICAgIC8qIGVuc3VyZSB0aGF0IHBhcmVudCBpcyBhbHJlYWR5IGZpdHRlZCAqLwotICAgICAgICAgICAgaWYgKCAhcHNoX2hpbnRfaXNfZml0dGVkKCBwYXJlbnQgKSApCi0gICAgICAgICAgICAgIHBzaF9oaW50X2FsaWduKCBwYXJlbnQsIGdsb2JhbHMsIGRpbWVuc2lvbiwgZ2x5cGggKTsKLQotICAgICAgICAgICAgLyoga2VlcCBvcmlnaW5hbCByZWxhdGlvbiBiZXR3ZWVuIGhpbnRzLCB0aGlzIGlzLCB1c2UgdGhlICovCi0gICAgICAgICAgICAvKiBzY2FsZWQgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY2VudGVycyBvZiB0aGUgaGludHMgdG8gICAgKi8KLSAgICAgICAgICAgIC8qIGNvbXB1dGUgdGhlIG5ldyBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcGFyX29yZ19jZW50ZXIgPSBwYXJlbnQtPm9yZ19wb3MgKyAoIHBhcmVudC0+b3JnX2xlbiA+PiAxICk7Ci0gICAgICAgICAgICBwYXJfY3VyX2NlbnRlciA9IHBhcmVudC0+Y3VyX3BvcyArICggcGFyZW50LT5jdXJfbGVuID4+IDEgKTsKLSAgICAgICAgICAgIGN1cl9vcmdfY2VudGVyID0gaGludC0+b3JnX3BvcyAgICsgKCBoaW50LT5vcmdfbGVuICAgPj4gMSApOwotCi0gICAgICAgICAgICBjdXJfZGVsdGEgPSBGVF9NdWxGaXgoIGN1cl9vcmdfY2VudGVyIC0gcGFyX29yZ19jZW50ZXIsIHNjYWxlICk7Ci0gICAgICAgICAgICBwb3MgICAgICAgPSBwYXJfY3VyX2NlbnRlciArIGN1cl9kZWx0YSAtICggbGVuID4+IDEgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBoaW50LT5jdXJfcG9zID0gcG9zOwotICAgICAgICAgIGhpbnQtPmN1cl9sZW4gPSBmaXRfbGVuOwotCi0gICAgICAgICAgLyogU3RlbSBhZGp1c3RtZW50IHRyaWVzIHRvIHNuYXAgc3RlbSB3aWR0aHMgdG8gc3RhbmRhcmQKLSAgICAgICAgICAgKiBvbmVzLiAgVGhpcyBpcyBpbXBvcnRhbnQgdG8gcHJldmVudCB1bnBsZWFzYW50IHJvdW5kaW5nCi0gICAgICAgICAgICogYXJ0ZWZhY3RzLgotICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggZ2x5cGgtPmRvX3N0ZW1fYWRqdXN0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGxlbiA8PSA2NCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHRoZSBzdGVtIGlzIGxlc3MgdGhhbiBvbmUgcGl4ZWw7IHdlIHdpbGwgY2VudGVyIGl0Ci0gICAgICAgICAgICAgICAqIGFyb3VuZCB0aGUgbmVhcmVzdCBwaXhlbCBjZW50ZXIKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIGlmICggbGVuID49IDMyICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgYWxzbyB3aWRlbiB0aGUgc3RlbQotICAgICAgICAgICAgICAgICAqIGFuZCBhbGlnbiBpdCB0byB0aGUgcGl4ZWwgZ3JpZC4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqICAgc3RlbV9jZW50ZXIgICAgICAgICAgPSBwb3MgKyAobGVuLzIpCi0gICAgICAgICAgICAgICAgICogICBuZWFyZXN0X3BpeGVsX2NlbnRlciA9IEZUX1JPVU5EKHN0ZW1fY2VudGVyLTMyKSszMgotICAgICAgICAgICAgICAgICAqICAgbmV3X3BvcyAgICAgICAgICAgICAgPSBuZWFyZXN0X3BpeGVsX2NlbnRlci0zMgotICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgPSBGVF9ST1VORChzdGVtX2NlbnRlci0zMikKLSAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgID0gRlRfRkxPT1Ioc3RlbV9jZW50ZXItMzIrMzIpCi0gICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICA9IEZUX0ZMT09SKHN0ZW1fY2VudGVyKQotICAgICAgICAgICAgICAgICAqICAgbmV3X2xlbiAgICAgICAgICAgICAgPSA2NAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBvcyA9IEZUX1BJWF9GTE9PUiggcG9zICsgKCBsZW4gPj4gMSApICk7Ci0gICAgICAgICAgICAgICAgbGVuID0gNjQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoIGxlbiA+IDAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhIHZlcnkgc21hbGwgc3RlbTsgd2Ugc2ltcGx5IGFsaWduIGl0IHRvIHRoZQotICAgICAgICAgICAgICAgICAqIHBpeGVsIGdyaWQsIHRyeWluZyB0byBmaW5kIHRoZSBtaW5pbWFsIGRpc3BsYWNlbWVudC4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIGxlZnQgICAgICAgICAgICAgICA9IHBvcwotICAgICAgICAgICAgICAgICAqIHJpZ2h0ICAgICAgICAgICAgICA9IHBvcyArIGxlbgotICAgICAgICAgICAgICAgICAqIGxlZnRfbmVhcmVzdF9lZGdlICA9IFJPVU5EKHBvcykKLSAgICAgICAgICAgICAgICAgKiByaWdodF9uZWFyZXN0X2VkZ2UgPSBST1VORChyaWdodCkKLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIGlmICggQUJTKGxlZnRfbmVhcmVzdF9lZGdlIC0gbGVmdCkgPD0KLSAgICAgICAgICAgICAgICAgKiAgICAgIEFCUyhyaWdodF9uZWFyZXN0X2VkZ2UgLSByaWdodCkgKQotICAgICAgICAgICAgICAgICAqICAgIG5ld19wb3MgPSBsZWZ0Ci0gICAgICAgICAgICAgICAgICogZWxzZQotICAgICAgICAgICAgICAgICAqICAgIG5ld19wb3MgPSByaWdodAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEZUX1BvcyAgbGVmdF9uZWFyZXN0ICA9IEZUX1BJWF9ST1VORCggcG9zICk7Ci0gICAgICAgICAgICAgICAgRlRfUG9zICByaWdodF9uZWFyZXN0ID0gRlRfUElYX1JPVU5EKCBwb3MgKyBsZW4gKTsKLSAgICAgICAgICAgICAgICBGVF9Qb3MgIGxlZnRfZGlzcCAgICAgPSBsZWZ0X25lYXJlc3QgLSBwb3M7Ci0gICAgICAgICAgICAgICAgRlRfUG9zICByaWdodF9kaXNwICAgID0gcmlnaHRfbmVhcmVzdCAtICggcG9zICsgbGVuICk7Ci0KLQotICAgICAgICAgICAgICAgIGlmICggbGVmdF9kaXNwIDwgMCApCi0gICAgICAgICAgICAgICAgICBsZWZ0X2Rpc3AgPSAtbGVmdF9kaXNwOwotICAgICAgICAgICAgICAgIGlmICggcmlnaHRfZGlzcCA8IDAgKQotICAgICAgICAgICAgICAgICAgcmlnaHRfZGlzcCA9IC1yaWdodF9kaXNwOwotICAgICAgICAgICAgICAgIGlmICggbGVmdF9kaXNwIDw9IHJpZ2h0X2Rpc3AgKQotICAgICAgICAgICAgICAgICAgcG9zID0gbGVmdF9uZWFyZXN0OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHBvcyA9IHJpZ2h0X25lYXJlc3Q7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogdGhpcyBpcyBhIGdob3N0IHN0ZW07IHdlIHNpbXBseSByb3VuZCBpdCAqLwotICAgICAgICAgICAgICAgIHBvcyA9IEZUX1BJWF9ST1VORCggcG9zICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGVuID0gcHNoX2RpbWVuc2lvbl9xdWFudGl6ZV9sZW4oIGRpbSwgbGVuLCAwICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogbm93IHRoYXQgd2UgaGF2ZSBhIGdvb2QgaGludGVkIHN0ZW0gd2lkdGgsIHRyeSB0byBwb3NpdGlvbiAqLwotICAgICAgICAgIC8qIHRoZSBzdGVtIGFsb25nIGEgcGl4ZWwgZ3JpZCBpbnRlZ2VyIGNvb3JkaW5hdGUgICAgICAgICAgICAgKi8KLSAgICAgICAgICBoaW50LT5jdXJfcG9zID0gcG9zICsgcHNoX2hpbnRfc25hcF9zdGVtX3NpZGVfZGVsdGEoIHBvcywgbGVuICk7Ci0gICAgICAgICAgaGludC0+Y3VyX2xlbiA9IGxlbjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGRvX3NuYXBwaW5nICkKLSAgICAgIHsKLSAgICAgICAgcG9zID0gaGludC0+Y3VyX3BvczsKLSAgICAgICAgbGVuID0gaGludC0+Y3VyX2xlbjsKLQotICAgICAgICBpZiAoIGxlbiA8IDY0ICkKLSAgICAgICAgICBsZW4gPSA2NDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGxlbiA9IEZUX1BJWF9ST1VORCggbGVuICk7Ci0KLSAgICAgICAgc3dpdGNoICggYWxpZ24uYWxpZ24gKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9UT1A6Ci0gICAgICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fdG9wIC0gbGVuOwotICAgICAgICAgICAgaGludC0+Y3VyX2xlbiA9IGxlbjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9CT1Q6Ci0gICAgICAgICAgICBoaW50LT5jdXJfbGVuID0gbGVuOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX0JPVCB8IFBTSF9CTFVFX0FMSUdOX1RPUDoKLSAgICAgICAgICAgIC8qIGRvbid0IHRvdWNoICovCi0gICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGhpbnQtPmN1cl9sZW4gPSBsZW47Ci0gICAgICAgICAgICBpZiAoIGxlbiAmIDY0ICkKLSAgICAgICAgICAgICAgcG9zID0gRlRfUElYX0ZMT09SKCBwb3MgKyAoIGxlbiA+PiAxICkgKSArIDMyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBwb3MgPSBGVF9QSVhfUk9VTkQoIHBvcyArICggbGVuID4+IDEgKSApOwotCi0gICAgICAgICAgICBoaW50LT5jdXJfcG9zID0gcG9zIC0gKCBsZW4gPj4gMSApOwotICAgICAgICAgICAgaGludC0+Y3VyX2xlbiA9IGxlbjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwc2hfaGludF9zZXRfZml0dGVkKCBoaW50ICk7Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgICAgIGlmICggcHNfZGVidWdfaGludF9mdW5jICkKLSAgICAgICAgcHNfZGVidWdfaGludF9mdW5jKCBoaW50LCBkaW1lbnNpb24gKTsKLSNlbmRpZgotICAgIH0KLSAgfQotCi0KLSNpZiAwICAvKiBub3QgdXNlZCBmb3Igbm93LCBleHBlcmltZW50YWwgKi8KLQotIC8qCi0gICogIEEgdmFyaWFudCB0byBwZXJmb3JtICJsaWdodCIgaGludGluZyAoaS5lLiBGVF9SRU5ERVJfTU9ERV9MSUdIVCkKLSAgKiAgb2Ygc3RlbXMKLSAgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfYWxpZ25fbGlnaHQoIFBTSF9IaW50ICAgICBoaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dseXBoICAgIGdseXBoICkKLSAgewotICAgIFBTSF9EaW1lbnNpb24gIGRpbSAgID0gJmdsb2JhbHMtPmRpbWVuc2lvbltkaW1lbnNpb25dOwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlID0gZGltLT5zY2FsZV9tdWx0OwotICAgIEZUX0ZpeGVkICAgICAgIGRlbHRhID0gZGltLT5zY2FsZV9kZWx0YTsKLQotCi0gICAgaWYgKCAhcHNoX2hpbnRfaXNfZml0dGVkKCBoaW50ICkgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgcG9zID0gRlRfTXVsRml4KCBoaW50LT5vcmdfcG9zLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICBGVF9Qb3MgIGxlbiA9IEZUX011bEZpeCggaGludC0+b3JnX2xlbiwgc2NhbGUgKTsKLQotICAgICAgRlRfUG9zICBmaXRfbGVuOwotCi0gICAgICBQU0hfQWxpZ25tZW50UmVjICBhbGlnbjsKLQotCi0gICAgICAvKiBpZ25vcmUgc3RlbSBhbGlnbm1lbnRzIHdoZW4gcmVxdWVzdGVkIHRocm91Z2ggdGhlIGhpbnQgZmxhZ3MgKi8KLSAgICAgIGlmICggKCBkaW1lbnNpb24gPT0gMCAmJiAhZ2x5cGgtPmRvX2hvcnpfaGludHMgKSB8fAotICAgICAgICAgICAoIGRpbWVuc2lvbiA9PSAxICYmICFnbHlwaC0+ZG9fdmVydF9oaW50cyApICkKLSAgICAgIHsKLSAgICAgICAgaGludC0+Y3VyX3BvcyA9IHBvczsKLSAgICAgICAgaGludC0+Y3VyX2xlbiA9IGxlbjsKLQotICAgICAgICBwc2hfaGludF9zZXRfZml0dGVkKCBoaW50ICk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgZml0X2xlbiA9IGxlbjsKLQotICAgICAgaGludC0+Y3VyX2xlbiA9IGZpdF9sZW47Ci0KLSAgICAgIC8qIGNoZWNrIGJsdWUgem9uZXMgZm9yIGhvcml6b250YWwgc3RlbXMgKi8KLSAgICAgIGFsaWduLmFsaWduID0gUFNIX0JMVUVfQUxJR05fTk9ORTsKLSAgICAgIGFsaWduLmFsaWduX2JvdCA9IGFsaWduLmFsaWduX3RvcCA9IDA7Ci0KLSAgICAgIGlmICggZGltZW5zaW9uID09IDEgKQotICAgICAgICBwc2hfYmx1ZXNfc25hcF9zdGVtKCAmZ2xvYmFscy0+Ymx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQtPm9yZ19wb3MgKyBoaW50LT5vcmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LT5vcmdfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24gKTsKLQotICAgICAgc3dpdGNoICggYWxpZ24uYWxpZ24gKQotICAgICAgewotICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9UT1A6Ci0gICAgICAgIC8qIHRoZSB0b3Agb2YgdGhlIHN0ZW0gaXMgYWxpZ25lZCBhZ2FpbnN0IGEgYmx1ZSB6b25lICovCi0gICAgICAgIGhpbnQtPmN1cl9wb3MgPSBhbGlnbi5hbGlnbl90b3AgLSBmaXRfbGVuOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9CT1Q6Ci0gICAgICAgIC8qIHRoZSBib3R0b20gb2YgdGhlIHN0ZW0gaXMgYWxpZ25lZCBhZ2FpbnN0IGEgYmx1ZSB6b25lICovCi0gICAgICAgIGhpbnQtPmN1cl9wb3MgPSBhbGlnbi5hbGlnbl9ib3Q7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX1RPUCB8IFBTSF9CTFVFX0FMSUdOX0JPVDoKLSAgICAgICAgLyogYm90aCBlZGdlcyBvZiB0aGUgc3RlbSBhcmUgYWxpZ25lZCBhZ2FpbnN0IGJsdWUgem9uZXMgKi8KLSAgICAgICAgaGludC0+Y3VyX3BvcyA9IGFsaWduLmFsaWduX2JvdDsKLSAgICAgICAgaGludC0+Y3VyX2xlbiA9IGFsaWduLmFsaWduX3RvcCAtIGFsaWduLmFsaWduX2JvdDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBQU0hfSGludCAgcGFyZW50ID0gaGludC0+cGFyZW50OwotCi0KLSAgICAgICAgICBpZiAoIHBhcmVudCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICBwYXJfb3JnX2NlbnRlciwgcGFyX2N1cl9jZW50ZXI7Ci0gICAgICAgICAgICBGVF9Qb3MgIGN1cl9vcmdfY2VudGVyLCBjdXJfZGVsdGE7Ci0KLQotICAgICAgICAgICAgLyogZW5zdXJlIHRoYXQgcGFyZW50IGlzIGFscmVhZHkgZml0dGVkICovCi0gICAgICAgICAgICBpZiAoICFwc2hfaGludF9pc19maXR0ZWQoIHBhcmVudCApICkKLSAgICAgICAgICAgICAgcHNoX2hpbnRfYWxpZ25fbGlnaHQoIHBhcmVudCwgZ2xvYmFscywgZGltZW5zaW9uLCBnbHlwaCApOwotCi0gICAgICAgICAgICBwYXJfb3JnX2NlbnRlciA9IHBhcmVudC0+b3JnX3BvcyArICggcGFyZW50LT5vcmdfbGVuIC8gMiApOwotICAgICAgICAgICAgcGFyX2N1cl9jZW50ZXIgPSBwYXJlbnQtPmN1cl9wb3MgKyAoIHBhcmVudC0+Y3VyX2xlbiAvIDIgKTsKLSAgICAgICAgICAgIGN1cl9vcmdfY2VudGVyID0gaGludC0+b3JnX3BvcyAgICsgKCBoaW50LT5vcmdfbGVuICAgLyAyICk7Ci0KLSAgICAgICAgICAgIGN1cl9kZWx0YSA9IEZUX011bEZpeCggY3VyX29yZ19jZW50ZXIgLSBwYXJfb3JnX2NlbnRlciwgc2NhbGUgKTsKLSAgICAgICAgICAgIHBvcyAgICAgICA9IHBhcl9jdXJfY2VudGVyICsgY3VyX2RlbHRhIC0gKCBsZW4gPj4gMSApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIFN0ZW1zIGxlc3MgdGhhbiBvbmUgcGl4ZWwgd2lkZSBhcmUgZWFzeSAtLSB3ZSB3YW50IHRvCi0gICAgICAgICAgICogbWFrZSB0aGVtIGFzIGRhcmsgYXMgcG9zc2libGUsIHNvIHRoZXkgbXVzdCBmYWxsIHdpdGhpbgotICAgICAgICAgICAqIG9uZSBwaXhlbC4gIElmIHRoZSBzdGVtIGlzIHNwbGl0IGJldHdlZW4gdHdvIHBpeGVscwotICAgICAgICAgICAqIHRoZW4gc25hcCB0aGUgZWRnZSB0aGF0IGlzIG5lYXJlciB0byB0aGUgcGl4ZWwgYm91bmRhcnkKLSAgICAgICAgICAgKiB0byB0aGUgcGl4ZWwgYm91bmRhcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBsZW4gPD0gNjQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKCBwb3MgKyBsZW4gKyA2MyApIC8gNjQgICE9IHBvcyAvIDY0ICsgMSApCi0gICAgICAgICAgICAgIHBvcyArPSBwc2hfaGludF9zbmFwX3N0ZW1fc2lkZV9kZWx0YSAoIHBvcywgbGVuICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogUG9zaXRpb24gc3RlbXMgb3RoZXIgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBtaWQtZ3JheXMuCi0gICAgICAgICAgICogVGhlcmUgYXJlLCBpbiBnZW5lcmFsLCB0d28gcG9zaXRpb25zIHRoYXQgZG8gdGhpcywKLSAgICAgICAgICAgKiBpbGx1c3RyYXRlZCBhcyBBKSBhbmQgQikgYmVsb3cuCi0gICAgICAgICAgICoKLSAgICAgICAgICAgKiAgICsgICAgICAgICAgICAgICAgICAgKyAgICAgICAgICAgICAgICAgICArICAgICAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgKgotICAgICAgICAgICAqIEEpICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAgICAgICAgICAgKiBCKSAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAgICAgICAgICAgKiBDKSAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gICAgICAgICAgICoKLSAgICAgICAgICAgKiBQb3NpdGlvbiBBKSAoc3BsaXQgdGhlIGV4Y2VzcyBzdGVtIGVxdWFsbHkpIHNob3VsZCBiZSBiZXR0ZXIKLSAgICAgICAgICAgKiBmb3Igc3RlbXMgb2Ygd2lkdGggTiArIGYgd2hlcmUgZiA8IDAuNS4KLSAgICAgICAgICAgKgotICAgICAgICAgICAqIFBvc2l0aW9uIEIpIChzcGxpdCB0aGUgZGVmaWNpZW5jeSBlcXVhbGx5KSBzaG91bGQgYmUgYmV0dGVyCi0gICAgICAgICAgICogZm9yIHN0ZW1zIG9mIHdpZHRoIE4gKyBmIHdoZXJlIGYgPiAwLjUuCi0gICAgICAgICAgICoKLSAgICAgICAgICAgKiBJdCB0dXJucyBvdXQgdGhvdWdoIHRoYXQgbWluaW1pemluZyB0aGUgdG90YWwgbnVtYmVyIG9mIGxpdAotICAgICAgICAgICAqIHBpeGVscyBpcyBhbHNvIGltcG9ydGFudCwgc28gcG9zaXRpb24gQyksIHdpdGggb25lIGVkZ2UKLSAgICAgICAgICAgKiBhbGlnbmVkIHdpdGggYSBwaXhlbCBib3VuZGFyeSBpcyBhY3R1YWxseSBwcmVmZXJhYmxlCi0gICAgICAgICAgICogdG8gQSkuICBUaGVyZSBhcmUgYWxzbyBtb3JlIHBvc3NpYmlsZSBwb3NpdGlvbnMgZm9yIEMpIHRoYW4KLSAgICAgICAgICAgKiBmb3IgQSkgb3IgQiksIHNvIGl0IGludm9sdmVzIGxlc3MgZGlzdG9ydGlvbiBvZiB0aGUgb3ZlcmFsbAotICAgICAgICAgICAqIGNoYXJhY3RlciBzaGFwZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBlbHNlIC8qIGxlbiA+IDY0ICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIGZyYWNfbGVuID0gbGVuICYgNjM7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgY2VudGVyID0gcG9zICsgKCBsZW4gPj4gMSApOwotICAgICAgICAgICAgRlRfRml4ZWQgIGRlbHRhX2EsIGRlbHRhX2I7Ci0KLQotICAgICAgICAgICAgaWYgKCAoIGxlbiAvIDY0ICkgJiAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVsdGFfYSA9IEZUX1BJWF9GTE9PUiggY2VudGVyICkgKyAzMiAtIGNlbnRlcjsKLSAgICAgICAgICAgICAgZGVsdGFfYiA9IEZUX1BJWF9ST1VORCggY2VudGVyICkgLSBjZW50ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRlbHRhX2EgPSBGVF9QSVhfUk9VTkQoIGNlbnRlciApIC0gY2VudGVyOwotICAgICAgICAgICAgICBkZWx0YV9iID0gRlRfUElYX0ZMT09SKCBjZW50ZXIgKSArIDMyIC0gY2VudGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBXZSBjaG9vc2UgYmV0d2VlbiBCKSBhbmQgQykgYWJvdmUgYmFzZWQgb24gdGhlIGFtb3VudAotICAgICAgICAgICAgICogb2YgZnJhY3RpbmFsIHN0ZW0gd2lkdGg7IGZvciBzbWFsbCBhbW91bnRzLCBjaG9vc2UKLSAgICAgICAgICAgICAqIEMpIGFsd2F5cywgZm9yIGxhcmdlIGFtb3VudHMsIEIpIGFsd2F5cywgYW5kIGluYmV0d2VlbiwKLSAgICAgICAgICAgICAqIHBpY2sgd2hpY2hldmVyIG9uZSBpbnZvbHZlcyBsZXNzIHN0ZW0gbW92ZW1lbnQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggZnJhY19sZW4gPCAzMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvcyArPSBwc2hfaGludF9zbmFwX3N0ZW1fc2lkZV9kZWx0YSAoIHBvcywgbGVuICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggZnJhY19sZW4gPCA0OCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0ZpeGVkICBzaWRlX2RlbHRhID0gcHNoX2hpbnRfc25hcF9zdGVtX3NpZGVfZGVsdGEgKCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKTsKLQotICAgICAgICAgICAgICBpZiAoIEZUX0FCUyggc2lkZV9kZWx0YSApIDwgRlRfQUJTKCBkZWx0YV9iICkgKQotICAgICAgICAgICAgICAgIHBvcyArPSBzaWRlX2RlbHRhOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcG9zICs9IGRlbHRhX2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvcyArPSBkZWx0YV9iOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGhpbnQtPmN1cl9wb3MgPSBwb3M7Ci0gICAgICAgIH0KLSAgICAgIH0gIC8qIHN3aXRjaCAqLwotCi0gICAgICBwc2hfaGludF9zZXRfZml0dGVkKCBoaW50ICk7Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgICAgIGlmICggcHNfZGVidWdfaGludF9mdW5jICkKLSAgICAgICAgcHNfZGVidWdfaGludF9mdW5jKCBoaW50LCBkaW1lbnNpb24gKTsKLSNlbmRpZgotICAgIH0KLSAgfQotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfdGFibGVfYWxpZ25faGludHMoIFBTSF9IaW50X1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICAgICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbHlwaCAgICAgICBnbHlwaCApCi0gIHsKLSAgICBQU0hfSGludCAgICAgICBoaW50OwotICAgIEZUX1VJbnQgICAgICAgIGNvdW50OwotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0KLSAgICBQU0hfRGltZW5zaW9uICBkaW0gICA9ICZnbG9iYWxzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZSA9IGRpbS0+c2NhbGVfbXVsdDsKLSAgICBGVF9GaXhlZCAgICAgICBkZWx0YSA9IGRpbS0+c2NhbGVfZGVsdGE7Ci0KLQotICAgIGlmICggcHNfZGVidWdfbm9fdmVydF9oaW50cyAmJiBkaW1lbnNpb24gPT0gMCApCi0gICAgewotICAgICAgcHNfc2ltcGxlX3NjYWxlKCB0YWJsZSwgc2NhbGUsIGRlbHRhLCBkaW1lbnNpb24gKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIHBzX2RlYnVnX25vX2hvcnpfaGludHMgJiYgZGltZW5zaW9uID09IDEgKQotICAgIHsKLSAgICAgIHBzX3NpbXBsZV9zY2FsZSggdGFibGUsIHNjYWxlLCBkZWx0YSwgZGltZW5zaW9uICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jZW5kaWYgLyogREVCVUdfSElOVEVSKi8KLQotICAgIGhpbnQgID0gdGFibGUtPmhpbnRzOwotICAgIGNvdW50ID0gdGFibGUtPm1heF9oaW50czsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBoaW50KysgKQotICAgICAgcHNoX2hpbnRfYWxpZ24oIGhpbnQsIGdsb2JhbHMsIGRpbWVuc2lvbiwgZ2x5cGggKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgIFBPSU5UUyBJTlRFUlBPTEFUSU9OIFJPVVRJTkVTICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgUFNIX1pPTkVfTUlOICAtMzIwMDAwMEwKLSNkZWZpbmUgUFNIX1pPTkVfTUFYICArMzIwMDAwMEwKLQotI2RlZmluZSB4eERFQlVHX1pPTkVTCi0KLQotI2lmZGVmIERFQlVHX1pPTkVTCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9wcmludF96b25lKCBQU0hfWm9uZSAgem9uZSApCi0gIHsKLSAgICBwcmludGYoICJ6b25lIFtzY2FsZSxkZWx0YSxtaW4sbWF4XSA9IFslLjNmLCUuM2YsJWQsJWRdXG4iLAotICAgICAgICAgICAgIHpvbmUtPnNjYWxlIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICB6b25lLT5kZWx0YSAvIDY0LjAsCi0gICAgICAgICAgICAgem9uZS0+bWluLAotICAgICAgICAgICAgIHpvbmUtPm1heCApOwotICB9Ci0KLSNlbHNlCi0KLSNkZWZpbmUgcHNoX3ByaW50X3pvbmUoIHggKSAgZG8geyB9IHdoaWxlICggMCApCi0KLSNlbmRpZiAvKiBERUJVR19aT05FUyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBISU5URVIgR0xZUEggTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAxCi0KLSNkZWZpbmUgIHBzaF9jb3JuZXJfaXNfZmxhdCAgICAgIGZ0X2Nvcm5lcl9pc19mbGF0Ci0jZGVmaW5lICBwc2hfY29ybmVyX29yaWVudGF0aW9uICBmdF9jb3JuZXJfb3JpZW50YXRpb24KLQotI2Vsc2UKLQotICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCi0gIHBzaF9jb3JuZXJfaXNfZmxhdCggRlRfUG9zICB4X2luLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgeV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIHhfb3V0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgeV9vdXQgKQotICB7Ci0gICAgRlRfUG9zICBheCA9IHhfaW47Ci0gICAgRlRfUG9zICBheSA9IHlfaW47Ci0KLSAgICBGVF9Qb3MgIGRfaW4sIGRfb3V0LCBkX2Nvcm5lcjsKLQotCi0gICAgaWYgKCBheCA8IDAgKQotICAgICAgYXggPSAtYXg7Ci0gICAgaWYgKCBheSA8IDAgKQotICAgICAgYXkgPSAtYXk7Ci0gICAgZF9pbiA9IGF4ICsgYXk7Ci0KLSAgICBheCA9IHhfb3V0OwotICAgIGlmICggYXggPCAwICkKLSAgICAgIGF4ID0gLWF4OwotICAgIGF5ID0geV9vdXQ7Ci0gICAgaWYgKCBheSA8IDAgKQotICAgICAgYXkgPSAtYXk7Ci0gICAgZF9vdXQgPSBheCArIGF5OwotCi0gICAgYXggPSB4X291dCArIHhfaW47Ci0gICAgaWYgKCBheCA8IDAgKQotICAgICAgYXggPSAtYXg7Ci0gICAgYXkgPSB5X291dCArIHlfaW47Ci0gICAgaWYgKCBheSA8IDAgKQotICAgICAgYXkgPSAtYXk7Ci0gICAgZF9jb3JuZXIgPSBheCArIGF5OwotCi0gICAgcmV0dXJuICggZF9pbiArIGRfb3V0IC0gZF9jb3JuZXIgKSA8ICggZF9jb3JuZXIgPj4gNCApOwotICB9Ci0KLSAgc3RhdGljIEZUX0ludAotICBwc2hfY29ybmVyX29yaWVudGF0aW9uKCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgaW5feSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApCi0gIHsKLSAgICBGVF9JbnQgIHJlc3VsdDsKLQotCi0gICAgLyogZGVhbCB3aXRoIHRoZSB0cml2aWFsIGNhc2VzIHF1aWNrbHkgKi8KLSAgICBpZiAoIGluX3kgPT0gMCApCi0gICAgewotICAgICAgaWYgKCBpbl94ID49IDAgKQotICAgICAgICByZXN1bHQgPSBvdXRfeTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gLW91dF95OwotICAgIH0KLSAgICBlbHNlIGlmICggaW5feCA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIGluX3kgPj0gMCApCi0gICAgICAgIHJlc3VsdCA9IC1vdXRfeDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gb3V0X3g7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBvdXRfeSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIG91dF94ID49IDAgKQotICAgICAgICByZXN1bHQgPSBpbl95OwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAtaW5feTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG91dF94ID09IDAgKQotICAgIHsKLSAgICAgIGlmICggb3V0X3kgPj0gMCApCi0gICAgICAgIHJlc3VsdCA9IC1pbl94OwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAgaW5feDsKLSAgICB9Ci0gICAgZWxzZSAvKiBnZW5lcmFsIGNhc2UgKi8KLSAgICB7Ci0gICAgICBsb25nIGxvbmcgIGRlbHRhID0gKGxvbmcgbG9uZylpbl94ICogb3V0X3kgLSAobG9uZyBsb25nKWluX3kgKiBvdXRfeDsKLQotICAgICAgaWYgKCBkZWx0YSA9PSAwICkKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gMSAtIDIgKiAoIGRlbHRhIDwgMCApOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotI2VuZGlmIC8qICExICovCi0KLQotI2lmZGVmIENPTVBVVEVfSU5GTEVYUwotCi0gIC8qIGNvbXB1dGUgYWxsIGluZmxleCBwb2ludHMgaW4gYSBnaXZlbiBnbHlwaCAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfY29tcHV0ZV9pbmZsZWN0aW9ucyggUFNIX0dseXBoICBnbHlwaCApCi0gIHsKLSAgICBGVF9VSW50ICBuOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGdseXBoLT5udW1fY29udG91cnM7IG4rKyApCi0gICAgewotICAgICAgUFNIX1BvaW50ICBmaXJzdCwgc3RhcnQsIGVuZCwgYmVmb3JlLCBhZnRlcjsKLSAgICAgIEZUX1BvcyAgICAgaW5feCwgaW5feSwgb3V0X3gsIG91dF95OwotICAgICAgRlRfSW50ICAgICBvcmllbnRfcHJldiwgb3JpZW50X2N1cjsKLSAgICAgIEZUX0ludCAgICAgZmluaXNoZWQgPSAwOwotCi0KLSAgICAgIC8qIHdlIG5lZWQgYXQgbGVhc3QgNCBwb2ludHMgdG8gY3JlYXRlIGFuIGluZmxlY3Rpb24gcG9pbnQgKi8KLSAgICAgIGlmICggZ2x5cGgtPmNvbnRvdXJzW25dLmNvdW50IDwgNCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBjb21wdXRlIGZpcnN0IHNlZ21lbnQgaW4gY29udG91ciAqLwotICAgICAgZmlyc3QgPSBnbHlwaC0+Y29udG91cnNbbl0uc3RhcnQ7Ci0KLSAgICAgIHN0YXJ0ID0gZW5kID0gZmlyc3Q7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICBlbmQgPSBlbmQtPm5leHQ7Ci0gICAgICAgIGlmICggZW5kID09IGZpcnN0ICkKLSAgICAgICAgICBnb3RvIFNraXA7Ci0KLSAgICAgICAgaW5feCA9IGVuZC0+b3JnX3UgLSBzdGFydC0+b3JnX3U7Ci0gICAgICAgIGluX3kgPSBlbmQtPm9yZ192IC0gc3RhcnQtPm9yZ192OwotCi0gICAgICB9IHdoaWxlICggaW5feCA9PSAwICYmIGluX3kgPT0gMCApOwotCi0gICAgICAvKiBleHRlbmQgdGhlIHNlZ21lbnQgc3RhcnQgd2hlbmV2ZXIgcG9zc2libGUgKi8KLSAgICAgIGJlZm9yZSA9IHN0YXJ0OwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIHN0YXJ0ICA9IGJlZm9yZTsKLSAgICAgICAgICBiZWZvcmUgPSBiZWZvcmUtPnByZXY7Ci0gICAgICAgICAgaWYgKCBiZWZvcmUgPT0gZmlyc3QgKQotICAgICAgICAgICAgZ290byBTa2lwOwotCi0gICAgICAgICAgb3V0X3ggPSBzdGFydC0+b3JnX3UgLSBiZWZvcmUtPm9yZ191OwotICAgICAgICAgIG91dF95ID0gc3RhcnQtPm9yZ192IC0gYmVmb3JlLT5vcmdfdjsKLQotICAgICAgICB9IHdoaWxlICggb3V0X3ggPT0gMCAmJiBvdXRfeSA9PSAwICk7Ci0KLSAgICAgICAgb3JpZW50X3ByZXYgPSBwc2hfY29ybmVyX29yaWVudGF0aW9uKCBpbl94LCBpbl95LCBvdXRfeCwgb3V0X3kgKTsKLQotICAgICAgfSB3aGlsZSAoIG9yaWVudF9wcmV2ID09IDAgKTsKLQotICAgICAgZmlyc3QgPSBzdGFydDsKLSAgICAgIGluX3ggID0gb3V0X3g7Ci0gICAgICBpbl95ICA9IG91dF95OwotCi0gICAgICAvKiBub3csIHByb2Nlc3MgYWxsIHNlZ21lbnRzIGluIHRoZSBjb250b3VyICovCi0gICAgICBkbwotICAgICAgewotICAgICAgICAvKiBmaXJzdCwgZXh0ZW5kIGN1cnJlbnQgc2VnbWVudCdzIGVuZCB3aGVuZXZlciBwb3NzaWJsZSAqLwotICAgICAgICBhZnRlciA9IGVuZDsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgZW5kICAgPSBhZnRlcjsKLSAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXItPm5leHQ7Ci0gICAgICAgICAgICBpZiAoIGFmdGVyID09IGZpcnN0ICkKLSAgICAgICAgICAgICAgZmluaXNoZWQgPSAxOwotCi0gICAgICAgICAgICBvdXRfeCA9IGFmdGVyLT5vcmdfdSAtIGVuZC0+b3JnX3U7Ci0gICAgICAgICAgICBvdXRfeSA9IGFmdGVyLT5vcmdfdiAtIGVuZC0+b3JnX3Y7Ci0KLSAgICAgICAgICB9IHdoaWxlICggb3V0X3ggPT0gMCAmJiBvdXRfeSA9PSAwICk7Ci0KLSAgICAgICAgICBvcmllbnRfY3VyID0gcHNoX2Nvcm5lcl9vcmllbnRhdGlvbiggaW5feCwgaW5feSwgb3V0X3gsIG91dF95ICk7Ci0KLSAgICAgICAgfSB3aGlsZSAoIG9yaWVudF9jdXIgPT0gMCApOwotCi0gICAgICAgIGlmICggKCBvcmllbnRfY3VyIF4gb3JpZW50X3ByZXYgKSA8IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwc2hfcG9pbnRfc2V0X2luZmxleCggc3RhcnQgKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQtPm5leHQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlICggc3RhcnQgIT0gZW5kICk7Ci0KLSAgICAgICAgICBwc2hfcG9pbnRfc2V0X2luZmxleCggc3RhcnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXJ0ICAgICAgID0gZW5kOwotICAgICAgICBlbmQgICAgICAgICA9IGFmdGVyOwotICAgICAgICBvcmllbnRfcHJldiA9IG9yaWVudF9jdXI7Ci0gICAgICAgIGluX3ggICAgICAgID0gb3V0X3g7Ci0gICAgICAgIGluX3kgICAgICAgID0gb3V0X3k7Ci0KLSAgICAgIH0gd2hpbGUgKCAhZmluaXNoZWQgKTsKLQotICAgIFNraXA6Ci0gICAgICA7Ci0gICAgfQotICB9Ci0KLSNlbmRpZiAvKiBDT01QVVRFX0lORkxFWFMgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9kb25lKCBQU0hfR2x5cGggIGdseXBoICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZ2x5cGgtPm1lbW9yeTsKLQotCi0gICAgcHNoX2hpbnRfdGFibGVfZG9uZSggJmdseXBoLT5oaW50X3RhYmxlc1sxXSwgbWVtb3J5ICk7Ci0gICAgcHNoX2hpbnRfdGFibGVfZG9uZSggJmdseXBoLT5oaW50X3RhYmxlc1swXSwgbWVtb3J5ICk7Ci0KLSAgICBGVF9GUkVFKCBnbHlwaC0+cG9pbnRzICk7Ci0gICAgRlRfRlJFRSggZ2x5cGgtPmNvbnRvdXJzICk7Ci0KLSAgICBnbHlwaC0+bnVtX3BvaW50cyAgID0gMDsKLSAgICBnbHlwaC0+bnVtX2NvbnRvdXJzID0gMDsKLQotICAgIGdseXBoLT5tZW1vcnkgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIHBzaF9jb21wdXRlX2RpciggRlRfUG9zICBkeCwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICkKLSAgewotICAgIEZUX1BvcyAgYXgsIGF5OwotICAgIGludCAgICAgcmVzdWx0ID0gUFNIX0RJUl9OT05FOwotCi0KLSAgICBheCA9ICggZHggPj0gMCApID8gZHggOiAtZHg7Ci0gICAgYXkgPSAoIGR5ID49IDAgKSA/IGR5IDogLWR5OwotCi0gICAgaWYgKCBheSAqIDEyIDwgYXggKQotICAgIHsKLSAgICAgIC8qIHxkeXwgPDw8IHxkeHwgIG1lYW5zIGEgbmVhci1ob3Jpem9udGFsIHNlZ21lbnQgKi8KLSAgICAgIHJlc3VsdCA9ICggZHggPj0gMCApID8gUFNIX0RJUl9SSUdIVCA6IFBTSF9ESVJfTEVGVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGF4ICogMTIgPCBheSApCi0gICAgewotICAgICAgLyogfGR4fCA8PDwgfGR5fCAgbWVhbnMgYSBuZWFyLXZlcnRpY2FsIHNlZ21lbnQgKi8KLSAgICAgIHJlc3VsdCA9ICggZHkgPj0gMCApID8gUFNIX0RJUl9VUCA6IFBTSF9ESVJfRE9XTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBsb2FkIG91dGxpbmUgcG9pbnQgY29vcmRpbmF0ZXMgaW50byBoaW50ZXIgZ2x5cGggKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2xvYWRfcG9pbnRzKCBQU0hfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGltZW5zaW9uICkKLSAgewotICAgIEZUX1ZlY3RvciogIHZlYyAgID0gZ2x5cGgtPm91dGxpbmUtPnBvaW50czsKLSAgICBQU0hfUG9pbnQgICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0gICAgRlRfVUludCAgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKLQotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KyssIHZlYysrICkKLSAgICB7Ci0gICAgICBwb2ludC0+ZmxhZ3MyID0gMDsKLSAgICAgIHBvaW50LT5oaW50ICAgPSBOVUxMOwotICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHBvaW50LT5vcmdfdSA9IHZlYy0+eDsKLSAgICAgICAgcG9pbnQtPm9yZ192ID0gdmVjLT55OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwb2ludC0+b3JnX3UgPSB2ZWMtPnk7Ci0gICAgICAgIHBvaW50LT5vcmdfdiA9IHZlYy0+eDsKLSAgICAgIH0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgICAgcG9pbnQtPm9yZ194ID0gdmVjLT54OwotICAgICAgcG9pbnQtPm9yZ195ID0gdmVjLT55OwotI2VuZGlmCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIHNhdmUgaGludGVkIHBvaW50IGNvb3JkaW5hdGVzIGJhY2sgdG8gb3V0bGluZSAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfc2F2ZV9wb2ludHMoIFBTSF9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24gKQotICB7Ci0gICAgRlRfVUludCAgICAgbjsKLSAgICBQU0hfUG9pbnQgICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0gICAgRlRfVmVjdG9yKiAgdmVjICAgPSBnbHlwaC0+b3V0bGluZS0+cG9pbnRzOwotICAgIGNoYXIqICAgICAgIHRhZ3MgID0gZ2x5cGgtPm91dGxpbmUtPnRhZ3M7Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgZ2x5cGgtPm51bV9wb2ludHM7IG4rKyApCi0gICAgewotICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMCApCi0gICAgICAgIHZlY1tuXS54ID0gcG9pbnQtPmN1cl91OwotICAgICAgZWxzZQotICAgICAgICB2ZWNbbl0ueSA9IHBvaW50LT5jdXJfdTsKLQotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfc3Ryb25nKCBwb2ludCApICkKLSAgICAgICAgdGFnc1tuXSB8PSAoY2hhcikoICggZGltZW5zaW9uID09IDAgKSA/IDMyIDogNjQgKTsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotCi0gICAgICBpZiAoIGRpbWVuc2lvbiA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPmN1cl94ICAgPSBwb2ludC0+Y3VyX3U7Ci0gICAgICAgIHBvaW50LT5mbGFnc194ID0gcG9pbnQtPmZsYWdzMiB8IHBvaW50LT5mbGFnczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPmN1cl95ICAgPSBwb2ludC0+Y3VyX3U7Ci0gICAgICAgIHBvaW50LT5mbGFnc195ID0gcG9pbnQtPmZsYWdzMiB8IHBvaW50LT5mbGFnczsKLSAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgIHBvaW50Kys7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNoX2dseXBoX2luaXQoIFBTSF9HbHlwaCAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgUFNfSGludHMgICAgIHBzX2hpbnRzLAotICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgIGdsb2JhbHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgLyogY2xlYXIgYWxsIGZpZWxkcyAqLwotICAgIEZUX01FTV9aRVJPKCBnbHlwaCwgc2l6ZW9mICggKmdseXBoICkgKTsKLQotICAgIG1lbW9yeSA9IGdseXBoLT5tZW1vcnkgPSBnbG9iYWxzLT5tZW1vcnk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBhbmQgc2V0dXAgcG9pbnRzICsgY29udG91cnMgYXJyYXlzICovCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGdseXBoLT5wb2ludHMsICAgb3V0bGluZS0+bl9wb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIGdseXBoLT5jb250b3Vycywgb3V0bGluZS0+bl9jb250b3VycyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGdseXBoLT5udW1fcG9pbnRzICAgPSBvdXRsaW5lLT5uX3BvaW50czsKLSAgICBnbHlwaC0+bnVtX2NvbnRvdXJzID0gb3V0bGluZS0+bl9jb250b3VyczsKLQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgICBmaXJzdCA9IDAsIG5leHQsIG47Ci0gICAgICBQU0hfUG9pbnQgICAgcG9pbnRzICA9IGdseXBoLT5wb2ludHM7Ci0gICAgICBQU0hfQ29udG91ciAgY29udG91ciA9IGdseXBoLT5jb250b3VyczsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGdseXBoLT5udW1fY29udG91cnM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgICAgY291bnQ7Ci0gICAgICAgIFBTSF9Qb2ludCAgcG9pbnQ7Ci0KLQotICAgICAgICBuZXh0ICA9IG91dGxpbmUtPmNvbnRvdXJzW25dICsgMTsKLSAgICAgICAgY291bnQgPSBuZXh0IC0gZmlyc3Q7Ci0KLSAgICAgICAgY29udG91ci0+c3RhcnQgPSBwb2ludHMgKyBmaXJzdDsKLSAgICAgICAgY29udG91ci0+Y291bnQgPSAoRlRfVUludCljb3VudDsKLQotICAgICAgICBpZiAoIGNvdW50ID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBwb2ludCA9IHBvaW50cyArIGZpcnN0OwotCi0gICAgICAgICAgcG9pbnQtPnByZXYgICAgPSBwb2ludHMgKyBuZXh0IC0gMTsKLSAgICAgICAgICBwb2ludC0+Y29udG91ciA9IGNvbnRvdXI7Ci0KLSAgICAgICAgICBmb3IgKCA7IGNvdW50ID4gMTsgY291bnQtLSApCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9pbnRbMF0ubmV4dCA9IHBvaW50ICsgMTsKLSAgICAgICAgICAgIHBvaW50WzFdLnByZXYgPSBwb2ludDsKLSAgICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgICAgICBwb2ludC0+Y29udG91ciA9IGNvbnRvdXI7Ci0gICAgICAgICAgfQotICAgICAgICAgIHBvaW50LT5uZXh0ID0gcG9pbnRzICsgZmlyc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250b3VyKys7Ci0gICAgICAgIGZpcnN0ID0gbmV4dDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICBQU0hfUG9pbnQgICBwb2ludHMgPSBnbHlwaC0+cG9pbnRzOwotICAgICAgUFNIX1BvaW50ICAgcG9pbnQgID0gcG9pbnRzOwotICAgICAgRlRfVmVjdG9yKiAgdmVjICAgID0gb3V0bGluZS0+cG9pbnRzOwotICAgICAgRlRfVUludCAgICAgbjsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGdseXBoLT5udW1fcG9pbnRzOyBuKyssIHBvaW50KysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIG5fcHJldiA9IChGVF9JbnQpKCBwb2ludC0+cHJldiAtIHBvaW50cyApOwotICAgICAgICBGVF9JbnQgIG5fbmV4dCA9IChGVF9JbnQpKCBwb2ludC0+bmV4dCAtIHBvaW50cyApOwotICAgICAgICBGVF9Qb3MgIGR4aSwgZHlpLCBkeG8sIGR5bzsKLQotCi0gICAgICAgIGlmICggISggb3V0bGluZS0+dGFnc1tuXSAmIEZUX0NVUlZFX1RBR19PTiApICkKLSAgICAgICAgICBwb2ludC0+ZmxhZ3MgPSBQU0hfUE9JTlRfT0ZGOwotCi0gICAgICAgIGR4aSA9IHZlY1tuXS54IC0gdmVjW25fcHJldl0ueDsKLSAgICAgICAgZHlpID0gdmVjW25dLnkgLSB2ZWNbbl9wcmV2XS55OwotCi0gICAgICAgIHBvaW50LT5kaXJfaW4gPSAoRlRfQ2hhcilwc2hfY29tcHV0ZV9kaXIoIGR4aSwgZHlpICk7Ci0KLSAgICAgICAgZHhvID0gdmVjW25fbmV4dF0ueCAtIHZlY1tuXS54OwotICAgICAgICBkeW8gPSB2ZWNbbl9uZXh0XS55IC0gdmVjW25dLnk7Ci0KLSAgICAgICAgcG9pbnQtPmRpcl9vdXQgPSAoRlRfQ2hhcilwc2hfY29tcHV0ZV9kaXIoIGR4bywgZHlvICk7Ci0KLSAgICAgICAgLyogZGV0ZWN0IHNtb290aCBwb2ludHMgKi8KLSAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MgJiBQU0hfUE9JTlRfT0ZGICkKLSAgICAgICAgICBwb2ludC0+ZmxhZ3MgfD0gUFNIX1BPSU5UX1NNT09USDsKLQotICAgICAgICBlbHNlIGlmICggcG9pbnQtPmRpcl9pbiA9PSBwb2ludC0+ZGlyX291dCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHBvaW50LT5kaXJfb3V0ICE9IFBTSF9ESVJfTk9ORSAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIHBzaF9jb3JuZXJfaXNfZmxhdCggZHhpLCBkeWksIGR4bywgZHlvICkgKQotICAgICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IFBTSF9QT0lOVF9TTU9PVEg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBnbHlwaC0+b3V0bGluZSA9IG91dGxpbmU7Ci0gICAgZ2x5cGgtPmdsb2JhbHMgPSBnbG9iYWxzOwotCi0jaWZkZWYgQ09NUFVURV9JTkZMRVhTCi0gICAgcHNoX2dseXBoX2xvYWRfcG9pbnRzKCBnbHlwaCwgMCApOwotICAgIHBzaF9nbHlwaF9jb21wdXRlX2luZmxlY3Rpb25zKCBnbHlwaCApOwotI2VuZGlmIC8qIENPTVBVVEVfSU5GTEVYUyAqLwotCi0gICAgLyogbm93IGRlYWwgd2l0aCBoaW50cyB0YWJsZXMgKi8KLSAgICBlcnJvciA9IHBzaF9oaW50X3RhYmxlX2luaXQoICZnbHlwaC0+aGludF90YWJsZXMgWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMF0uaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNfaGludHMtPmRpbWVuc2lvblswXS5tYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc19oaW50cy0+ZGltZW5zaW9uWzBdLmNvdW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IHBzaF9oaW50X3RhYmxlX2luaXQoICZnbHlwaC0+aGludF90YWJsZXMgWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMV0uaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNfaGludHMtPmRpbWVuc2lvblsxXS5tYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc19oaW50cy0+ZGltZW5zaW9uWzFdLmNvdW50ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGNvbXB1dGUgYWxsIGV4dHJlbWEgaW4gYSBnbHlwaCBmb3IgYSBnaXZlbiBkaW1lbnNpb24gKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2NvbXB1dGVfZXh0cmVtYSggUFNIX0dseXBoICBnbHlwaCApCi0gIHsKLSAgICBGVF9VSW50ICBuOwotCi0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIGNvbXB1dGUgYWxsIGxvY2FsIGV4dHJlbWEgKi8KLSAgICBmb3IgKCBuID0gMDsgbiA8IGdseXBoLT5udW1fY29udG91cnM7IG4rKyApCi0gICAgewotICAgICAgUFNIX1BvaW50ICBmaXJzdCA9IGdseXBoLT5jb250b3Vyc1tuXS5zdGFydDsKLSAgICAgIFBTSF9Qb2ludCAgcG9pbnQsIGJlZm9yZSwgYWZ0ZXI7Ci0KLQotICAgICAgaWYgKCBnbHlwaC0+Y29udG91cnNbbl0uY291bnQgPT0gMCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBwb2ludCAgPSBmaXJzdDsKLSAgICAgIGJlZm9yZSA9IHBvaW50OwotICAgICAgYWZ0ZXIgID0gcG9pbnQ7Ci0KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIGJlZm9yZSA9IGJlZm9yZS0+cHJldjsKLSAgICAgICAgaWYgKCBiZWZvcmUgPT0gZmlyc3QgKQotICAgICAgICAgIGdvdG8gU2tpcDsKLQotICAgICAgfSB3aGlsZSAoIGJlZm9yZS0+b3JnX3UgPT0gcG9pbnQtPm9yZ191ICk7Ci0KLSAgICAgIGZpcnN0ID0gcG9pbnQgPSBiZWZvcmUtPm5leHQ7Ci0KLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIGFmdGVyID0gcG9pbnQ7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICBhZnRlciA9IGFmdGVyLT5uZXh0OwotICAgICAgICAgIGlmICggYWZ0ZXIgPT0gZmlyc3QgKQotICAgICAgICAgICAgZ290byBOZXh0OwotCi0gICAgICAgIH0gd2hpbGUgKCBhZnRlci0+b3JnX3UgPT0gcG9pbnQtPm9yZ191ICk7Ci0KLSAgICAgICAgaWYgKCBiZWZvcmUtPm9yZ191IDwgcG9pbnQtPm9yZ191ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggYWZ0ZXItPm9yZ191IDwgcG9pbnQtPm9yZ191ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBsb2NhbCBtYXhpbXVtICovCi0gICAgICAgICAgICBnb3RvIEV4dHJlbXVtOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGJlZm9yZS0+b3JnX3UgPiBwb2ludC0+b3JnX3UgKi8KLSAgICAgICAgewotICAgICAgICAgIGlmICggYWZ0ZXItPm9yZ191ID4gcG9pbnQtPm9yZ191ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBsb2NhbCBtaW5pbXVtICovCi0gICAgICAgICAgRXh0cmVtdW06Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwc2hfcG9pbnRfc2V0X2V4dHJlbXVtKCBwb2ludCApOwotICAgICAgICAgICAgICBwb2ludCA9IHBvaW50LT5uZXh0OwotCi0gICAgICAgICAgICB9IHdoaWxlICggcG9pbnQgIT0gYWZ0ZXIgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBiZWZvcmUgPSBhZnRlci0+cHJldjsKLSAgICAgICAgcG9pbnQgID0gYWZ0ZXI7Ci0KLSAgICAgIH0gLyogZm9yICAqLwotCi0gICAgTmV4dDoKLSAgICAgIDsKLSAgICB9Ci0KLSAgICAvKiBmb3IgZWFjaCBleHRyZW11bSwgZGV0ZXJtaW5lIGl0cyBkaXJlY3Rpb24gYWxvbmcgdGhlICovCi0gICAgLyogb3J0aG9nb25hbCBheGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIG4gPSAwOyBuIDwgZ2x5cGgtPm51bV9wb2ludHM7IG4rKyApCi0gICAgewotICAgICAgUFNIX1BvaW50ICBwb2ludCwgYmVmb3JlLCBhZnRlcjsKLQotCi0gICAgICBwb2ludCAgPSAmZ2x5cGgtPnBvaW50c1tuXTsKLSAgICAgIGJlZm9yZSA9IHBvaW50OwotICAgICAgYWZ0ZXIgID0gcG9pbnQ7Ci0KLSAgICAgIGlmICggcHNoX3BvaW50X2lzX2V4dHJlbXVtKCBwb2ludCApICkKLSAgICAgIHsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZS0+cHJldjsKLSAgICAgICAgICBpZiAoIGJlZm9yZSA9PSBwb2ludCApCi0gICAgICAgICAgICBnb3RvIFNraXA7Ci0KLSAgICAgICAgfSB3aGlsZSAoIGJlZm9yZS0+b3JnX3YgPT0gcG9pbnQtPm9yZ192ICk7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIGFmdGVyID0gYWZ0ZXItPm5leHQ7Ci0gICAgICAgICAgaWYgKCBhZnRlciA9PSBwb2ludCApCi0gICAgICAgICAgICBnb3RvIFNraXA7Ci0KLSAgICAgICAgfSB3aGlsZSAoIGFmdGVyLT5vcmdfdiA9PSBwb2ludC0+b3JnX3YgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBiZWZvcmUtPm9yZ192IDwgcG9pbnQtPm9yZ192ICYmCi0gICAgICAgICAgIGFmdGVyLT5vcmdfdiAgPiBwb2ludC0+b3JnX3YgKQotICAgICAgewotICAgICAgICBwc2hfcG9pbnRfc2V0X3Bvc2l0aXZlKCBwb2ludCApOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGJlZm9yZS0+b3JnX3YgPiBwb2ludC0+b3JnX3YgJiYKLSAgICAgICAgICAgICAgICBhZnRlci0+b3JnX3YgIDwgcG9pbnQtPm9yZ192ICkKLSAgICAgIHsKLSAgICAgICAgcHNoX3BvaW50X3NldF9uZWdhdGl2ZSggcG9pbnQgKTsKLSAgICAgIH0KLQotICAgIFNraXA6Ci0gICAgICA7Ci0gICAgfQotICB9Ci0KLQotICAvKiBtYWpvcl9kaXIgaXMgdGhlIGRpcmVjdGlvbiBmb3IgcG9pbnRzIG9uIHRoZSBib3R0b20vbGVmdCBvZiB0aGUgc3RlbTsgKi8KLSAgLyogUG9pbnRzIG9uIHRoZSB0b3AvcmlnaHQgb2YgdGhlIHN0ZW0gd2lsbCBoYXZlIGEgZGlyZWN0aW9uIG9mICAgICAgICAgICovCi0gIC8qIC1tYWpvcl9kaXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9oaW50X3RhYmxlX2ZpbmRfc3Ryb25nX3BvaW50cyggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9Qb2ludCAgICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgbWFqb3JfZGlyICkKLSAgewotICAgIFBTSF9IaW50KiAgc29ydCAgICAgID0gdGFibGUtPnNvcnQ7Ci0gICAgRlRfVUludCAgICBudW1faGludHMgPSB0YWJsZS0+bnVtX2hpbnRzOwotCi0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcG9pbnQrKyApCi0gICAgewotICAgICAgRlRfSW50ICBwb2ludF9kaXIgPSAwOwotICAgICAgRlRfUG9zICBvcmdfdSAgICAgPSBwb2ludC0+b3JnX3U7Ci0KLQotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfc3Ryb25nKCBwb2ludCApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggUFNIX0RJUl9DT01QQVJFKCBwb2ludC0+ZGlyX2luLCBtYWpvcl9kaXIgKSApCi0gICAgICAgIHBvaW50X2RpciA9IHBvaW50LT5kaXJfaW47Ci0KLSAgICAgIGVsc2UgaWYgKCBQU0hfRElSX0NPTVBBUkUoIHBvaW50LT5kaXJfb3V0LCBtYWpvcl9kaXIgKSApCi0gICAgICAgIHBvaW50X2RpciA9IHBvaW50LT5kaXJfb3V0OwotCi0gICAgICBpZiAoIHBvaW50X2RpciApCi0gICAgICB7Ci0gICAgICAgIGlmICggcG9pbnRfZGlyID09IG1ham9yX2RpciApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBubjsKLQotCi0gICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9oaW50czsgbm4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgUFNIX0hpbnQgIGhpbnQgPSBzb3J0W25uXTsKLSAgICAgICAgICAgIEZUX1BvcyAgICBkICAgID0gb3JnX3UgLSBoaW50LT5vcmdfcG9zOwotCi0KLSAgICAgICAgICAgIGlmICggZCA8IHRocmVzaG9sZCAmJiAtZCA8IHRocmVzaG9sZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgICAgICAgICAgICBwb2ludC0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9FREdFX01JTjsKLSAgICAgICAgICAgICAgcG9pbnQtPmhpbnQgICAgPSBoaW50OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHBvaW50X2RpciA9PSAtbWFqb3JfZGlyICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIG5uOwotCi0KLSAgICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX2hpbnRzOyBubisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQU0hfSGludCAgaGludCA9IHNvcnRbbm5dOwotICAgICAgICAgICAgRlRfUG9zICAgIGQgICAgPSBvcmdfdSAtIGhpbnQtPm9yZ19wb3MgLSBoaW50LT5vcmdfbGVuOwotCi0KLSAgICAgICAgICAgIGlmICggZCA8IHRocmVzaG9sZCAmJiAtZCA8IHRocmVzaG9sZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgICAgICAgICAgICBwb2ludC0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9FREdFX01BWDsKLSAgICAgICAgICAgICAgcG9pbnQtPmhpbnQgICAgPSBoaW50OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotI2lmIDEKLSAgICAgIGVsc2UgaWYgKCBwc2hfcG9pbnRfaXNfZXh0cmVtdW0oIHBvaW50ICkgKQotICAgICAgewotICAgICAgICAvKiB0cmVhdCBleHRyZW1hIGFzIHNwZWNpYWwgY2FzZXMgZm9yIHN0ZW0gZWRnZSBhbGlnbm1lbnQgKi8KLSAgICAgICAgRlRfVUludCAgbm4sIG1pbl9mbGFnLCBtYXhfZmxhZzsKLQotCi0gICAgICAgIGlmICggbWFqb3JfZGlyID09IFBTSF9ESVJfSE9SSVpPTlRBTCApCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5fZmxhZyA9IFBTSF9QT0lOVF9QT1NJVElWRTsKLSAgICAgICAgICBtYXhfZmxhZyA9IFBTSF9QT0lOVF9ORUdBVElWRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5fZmxhZyA9IFBTSF9QT0lOVF9ORUdBVElWRTsKLSAgICAgICAgICBtYXhfZmxhZyA9IFBTSF9QT0lOVF9QT1NJVElWRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcG9pbnQtPmZsYWdzMiAmIG1pbl9mbGFnICkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1faGludHM7IG5uKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBTSF9IaW50ICBoaW50ID0gc29ydFtubl07Ci0gICAgICAgICAgICBGVF9Qb3MgICAgZCAgICA9IG9yZ191IC0gaGludC0+b3JnX3BvczsKLQotCi0gICAgICAgICAgICBpZiAoIGQgPCB0aHJlc2hvbGQgJiYgLWQgPCB0aHJlc2hvbGQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwb2ludC0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9FREdFX01JTjsKLSAgICAgICAgICAgICAgcG9pbnQtPmhpbnQgICAgPSBoaW50OwotICAgICAgICAgICAgICBwc2hfcG9pbnRfc2V0X3N0cm9uZyggcG9pbnQgKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBwb2ludC0+ZmxhZ3MyICYgbWF4X2ZsYWcgKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9oaW50czsgbm4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgUFNIX0hpbnQgIGhpbnQgPSBzb3J0W25uXTsKLSAgICAgICAgICAgIEZUX1BvcyAgICBkICAgID0gb3JnX3UgLSBoaW50LT5vcmdfcG9zIC0gaGludC0+b3JnX2xlbjsKLQotCi0gICAgICAgICAgICBpZiAoIGQgPCB0aHJlc2hvbGQgJiYgLWQgPCB0aHJlc2hvbGQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwb2ludC0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9FREdFX01BWDsKLSAgICAgICAgICAgICAgcG9pbnQtPmhpbnQgICAgPSBoaW50OwotICAgICAgICAgICAgICBwc2hfcG9pbnRfc2V0X3N0cm9uZyggcG9pbnQgKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwb2ludC0+aGludCA9PSBOVUxMICkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1faGludHM7IG5uKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBTSF9IaW50ICBoaW50ID0gc29ydFtubl07Ci0KLQotICAgICAgICAgICAgaWYgKCBvcmdfdSA+PSBoaW50LT5vcmdfcG9zICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIG9yZ191IDw9IGhpbnQtPm9yZ19wb3MgKyBoaW50LT5vcmdfbGVuICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG9pbnQtPmhpbnQgPSBoaW50OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotI2VuZGlmIC8qIDEgKi8KLSAgICB9Ci0gIH0KLQotCi0gIC8qIHRoZSBhY2NlcHRlZCBzaGlmdCBmb3Igc3Ryb25nIHBvaW50cyBpbiBmcmFjdGlvbmFsIHBpeGVscyAqLwotI2RlZmluZSBQU0hfU1RST05HX1RIUkVTSE9MRCAgMzIKLQotICAvKiB0aGUgbWF4aW11bSBzaGlmdCB2YWx1ZSBpbiBmb250IHVuaXRzICovCi0jZGVmaW5lIFBTSF9TVFJPTkdfVEhSRVNIT0xEX01BWElNVU0gIDMwCi0KLQotICAvKiBmaW5kIHN0cm9uZyBwb2ludHMgaW4gYSBnbHlwaCAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfZmluZF9zdHJvbmdfcG9pbnRzKCBQU0hfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRpbWVuc2lvbiApCi0gIHsKLSAgICAvKiBhIHBvaW50IGlzIGBzdHJvbmcnIGlmIGl0IGlzIGxvY2F0ZWQgb24gYSBzdGVtIGVkZ2UgYW5kICAgICAgICovCi0gICAgLyogaGFzIGFuIGBpbicgb3IgYG91dCcgdGFuZ2VudCBwYXJhbGxlbCB0byB0aGUgaGludCdzIGRpcmVjdGlvbiAqLwotCi0gICAgUFNIX0hpbnRfVGFibGUgIHRhYmxlICAgICA9ICZnbHlwaC0+aGludF90YWJsZXNbZGltZW5zaW9uXTsKLSAgICBQU19NYXNrICAgICAgICAgbWFzayAgICAgID0gdGFibGUtPmhpbnRfbWFza3MtPm1hc2tzOwotICAgIEZUX1VJbnQgICAgICAgICBudW1fbWFza3MgPSB0YWJsZS0+aGludF9tYXNrcy0+bnVtX21hc2tzOwotICAgIEZUX1VJbnQgICAgICAgICBmaXJzdCAgICAgPSAwOwotICAgIEZUX0ludCAgICAgICAgICBtYWpvcl9kaXIgPSBkaW1lbnNpb24gPT0gMCA/IFBTSF9ESVJfVkVSVElDQUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQU0hfRElSX0hPUklaT05UQUw7Ci0gICAgUFNIX0RpbWVuc2lvbiAgIGRpbSAgICAgICA9ICZnbHlwaC0+Z2xvYmFscy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0gICAgRlRfRml4ZWQgICAgICAgIHNjYWxlICAgICA9IGRpbS0+c2NhbGVfbXVsdDsKLSAgICBGVF9JbnQgICAgICAgICAgdGhyZXNob2xkOwotCi0KLSAgICB0aHJlc2hvbGQgPSAoRlRfSW50KUZUX0RpdkZpeCggUFNIX1NUUk9OR19USFJFU0hPTEQsIHNjYWxlICk7Ci0gICAgaWYgKCB0aHJlc2hvbGQgPiBQU0hfU1RST05HX1RIUkVTSE9MRF9NQVhJTVVNICkKLSAgICAgIHRocmVzaG9sZCA9IFBTSF9TVFJPTkdfVEhSRVNIT0xEX01BWElNVU07Ci0KLSAgICAvKiBwcm9jZXNzIHNlY29uZGFyeSBoaW50cyB0byBgc2VsZWN0ZWQnIHBvaW50cyAqLwotICAgIGlmICggbnVtX21hc2tzID4gMSAmJiBnbHlwaC0+bnVtX3BvaW50cyA+IDAgKQotICAgIHsKLSAgICAgIGZpcnN0ID0gbWFzay0+ZW5kX3BvaW50OwotICAgICAgbWFzaysrOwotICAgICAgZm9yICggOyBudW1fbWFza3MgPiAxOyBudW1fbWFza3MtLSwgbWFzaysrICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgbmV4dDsKLSAgICAgICAgRlRfSW50ICAgY291bnQ7Ci0KLQotICAgICAgICBuZXh0ICA9IG1hc2stPmVuZF9wb2ludDsKLSAgICAgICAgY291bnQgPSBuZXh0IC0gZmlyc3Q7Ci0gICAgICAgIGlmICggY291bnQgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIFBTSF9Qb2ludCAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzICsgZmlyc3Q7Ci0KLQotICAgICAgICAgIHBzaF9oaW50X3RhYmxlX2FjdGl2YXRlX21hc2soIHRhYmxlLCBtYXNrICk7Ci0KLSAgICAgICAgICBwc2hfaGludF90YWJsZV9maW5kX3N0cm9uZ19wb2ludHMoIHRhYmxlLCBwb2ludCwgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQsIG1ham9yX2RpciApOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gbmV4dDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwcm9jZXNzIHByaW1hcnkgaGludHMgZm9yIGFsbCBwb2ludHMgKi8KLSAgICBpZiAoIG51bV9tYXNrcyA9PSAxICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7Ci0gICAgICBQU0hfUG9pbnQgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKLQotCi0gICAgICBwc2hfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrKCB0YWJsZSwgdGFibGUtPmhpbnRfbWFza3MtPm1hc2tzICk7Ci0KLSAgICAgIHBzaF9oaW50X3RhYmxlX2ZpbmRfc3Ryb25nX3BvaW50cyggdGFibGUsIHBvaW50LCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkLCBtYWpvcl9kaXIgKTsKLSAgICB9Ci0KLSAgICAvKiBub3csIGNlcnRhaW4gcG9pbnRzIG1heSBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gYSBoaW50IGFuZCAqLwotICAgIC8qIG5vdCBtYXJrZWQgYXMgc3Ryb25nOyB1cGRhdGUgdGhlaXIgZmxhZ3MgdGhlbiAgICAgICAgICAgICovCi0gICAgewotICAgICAgRlRfVUludCAgICBjb3VudCA9IGdseXBoLT5udW1fcG9pbnRzOwotICAgICAgUFNIX1BvaW50ICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KysgKQotICAgICAgICBpZiAoIHBvaW50LT5oaW50ICYmICFwc2hfcG9pbnRfaXNfc3Ryb25nKCBwb2ludCApICkKLSAgICAgICAgICBwc2hfcG9pbnRfc2V0X3N0cm9uZyggcG9pbnQgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGZpbmQgcG9pbnRzIGluIGEgZ2x5cGggd2hpY2ggYXJlIGluIGEgYmx1ZSB6b25lIGFuZCBoYXZlIGBpbicgb3IgKi8KLSAgLyogYG91dCcgdGFuZ2VudHMgcGFyYWxsZWwgdG8gdGhlIGhvcml6b250YWwgYXhpcyAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfZmluZF9ibHVlX3BvaW50cyggUFNIX0JsdWVzICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbHlwaCAgZ2x5cGggKQotICB7Ci0gICAgUFNIX0JsdWVfVGFibGUgIHRhYmxlOwotICAgIFBTSF9CbHVlX1pvbmUgICB6b25lOwotICAgIEZUX1VJbnQgICAgICAgICBnbHlwaF9jb3VudCA9IGdseXBoLT5udW1fcG9pbnRzOwotICAgIEZUX1VJbnQgICAgICAgICBibHVlX2NvdW50OwotICAgIFBTSF9Qb2ludCAgICAgICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0KLQotICAgIGZvciAoIDsgZ2x5cGhfY291bnQgPiAwOyBnbHlwaF9jb3VudC0tLCBwb2ludCsrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIHk7Ci0KLQotICAgICAgLyogY2hlY2sgdGFuZ2VudHMgKi8KLSAgICAgIGlmICggIVBTSF9ESVJfQ09NUEFSRSggcG9pbnQtPmRpcl9pbiwgIFBTSF9ESVJfSE9SSVpPTlRBTCApICYmCi0gICAgICAgICAgICFQU0hfRElSX0NPTVBBUkUoIHBvaW50LT5kaXJfb3V0LCBQU0hfRElSX0hPUklaT05UQUwgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBza2lwIHN0cm9uZyBwb2ludHMgKi8KLSAgICAgIGlmICggcHNoX3BvaW50X2lzX3N0cm9uZyggcG9pbnQgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICB5ID0gcG9pbnQtPm9yZ191OwotCi0gICAgICAvKiBsb29rIHVwIHRvcCB6b25lcyAqLwotICAgICAgdGFibGUgICAgICA9ICZibHVlcy0+bm9ybWFsX3RvcDsKLSAgICAgIGJsdWVfY291bnQgPSB0YWJsZS0+Y291bnQ7Ci0gICAgICB6b25lICAgICAgID0gdGFibGUtPnpvbmVzOwotCi0gICAgICBmb3IgKCA7IGJsdWVfY291bnQgPiAwOyBibHVlX2NvdW50LS0sIHpvbmUrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgZGVsdGEgPSB5IC0gem9uZS0+b3JnX2JvdHRvbTsKLQotCi0gICAgICAgIGlmICggZGVsdGEgPCAtYmx1ZXMtPmJsdWVfZnV6eiApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCB5IDw9IHpvbmUtPm9yZ190b3AgKyBibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgICAgICBpZiAoIGJsdWVzLT5ub19vdmVyc2hvb3RzIHx8IGRlbHRhIDw9IGJsdWVzLT5ibHVlX3RocmVzaG9sZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gem9uZS0+Y3VyX2JvdHRvbTsKLSAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgICAgICAgICAgcHNoX3BvaW50X3NldF9maXR0ZWQoIHBvaW50ICk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBsb29rIHVwIGJvdHRvbSB6b25lcyAqLwotICAgICAgdGFibGUgICAgICA9ICZibHVlcy0+bm9ybWFsX2JvdHRvbTsKLSAgICAgIGJsdWVfY291bnQgPSB0YWJsZS0+Y291bnQ7Ci0gICAgICB6b25lICAgICAgID0gdGFibGUtPnpvbmVzICsgYmx1ZV9jb3VudCAtIDE7Ci0KLSAgICAgIGZvciAoIDsgYmx1ZV9jb3VudCA+IDA7IGJsdWVfY291bnQtLSwgem9uZS0tICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkZWx0YSA9IHpvbmUtPm9yZ190b3AgLSB5OwotCi0KLSAgICAgICAgaWYgKCBkZWx0YSA8IC1ibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIHkgPj0gem9uZS0+b3JnX2JvdHRvbSAtIGJsdWVzLT5ibHVlX2Z1enogKQotICAgICAgICAgIGlmICggYmx1ZXMtPm5vX292ZXJzaG9vdHMgfHwgZGVsdGEgPCBibHVlcy0+Ymx1ZV90aHJlc2hvbGQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IHpvbmUtPmN1cl90b3A7Ci0gICAgICAgICAgICBwc2hfcG9pbnRfc2V0X3N0cm9uZyggcG9pbnQgKTsKLSAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfZml0dGVkKCBwb2ludCApOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIGludGVycG9sYXRlIHN0cm9uZyBwb2ludHMgd2l0aCB0aGUgaGVscCBvZiBoaW50ZWQgY29vcmRpbmF0ZXMgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2ludGVycG9sYXRlX3N0cm9uZ19wb2ludHMoIFBTSF9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRpbWVuc2lvbiApCi0gIHsKLSAgICBQU0hfRGltZW5zaW9uICBkaW0gICA9ICZnbHlwaC0+Z2xvYmFscy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0gICAgRlRfRml4ZWQgICAgICAgc2NhbGUgPSBkaW0tPnNjYWxlX211bHQ7Ci0KLSAgICBGVF9VSW50ICAgICAgICBjb3VudCA9IGdseXBoLT5udW1fcG9pbnRzOwotICAgIFBTSF9Qb2ludCAgICAgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKLQotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KysgKQotICAgIHsKLSAgICAgIFBTSF9IaW50ICBoaW50ID0gcG9pbnQtPmhpbnQ7Ci0KLQotICAgICAgaWYgKCBoaW50ICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBkZWx0YTsKLQotCi0gICAgICAgIGlmICggcHNoX3BvaW50X2lzX2VkZ2VfbWluKCBwb2ludCApICkKLSAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBoaW50LT5jdXJfcG9zOwotCi0gICAgICAgIGVsc2UgaWYgKCBwc2hfcG9pbnRfaXNfZWRnZV9tYXgoIHBvaW50ICkgKQotICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuOwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRlbHRhID0gcG9pbnQtPm9yZ191IC0gaGludC0+b3JnX3BvczsKLQotICAgICAgICAgIGlmICggZGVsdGEgPD0gMCApCi0gICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBoaW50LT5jdXJfcG9zICsgRlRfTXVsRml4KCBkZWx0YSwgc2NhbGUgKTsKLQotICAgICAgICAgIGVsc2UgaWYgKCBkZWx0YSA+PSBoaW50LT5vcmdfbGVuICkKLSAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBkZWx0YSAtIGhpbnQtPm9yZ19sZW4sIHNjYWxlICk7Ci0KLSAgICAgICAgICBlbHNlIGlmICggaGludC0+b3JnX2xlbiA+IDAgKQotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggZGVsdGEsIGhpbnQtPmN1cl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX2xlbiApOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGhpbnQtPmN1cl9wb3M7Ci0gICAgICAgIH0KLSAgICAgICAgcHNoX3BvaW50X3NldF9maXR0ZWQoIHBvaW50ICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotI2RlZmluZSAgUFNIX01BWF9TVFJPTkdfSU5URVJOQUwgIDE2Ci0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2ludGVycG9sYXRlX25vcm1hbF9wb2ludHMoIFBTSF9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRpbWVuc2lvbiApCi0gIHsKLQotI2lmIDEKLSAgICAvKiBmaXJzdCB0ZWNobmlxdWU6IGEgcG9pbnQgaXMgc3Ryb25nIGlmIGl0IGlzIGEgbG9jYWwgZXh0cmVtdW0gKi8KLQotICAgIFBTSF9EaW1lbnNpb24gIGRpbSAgICA9ICZnbHlwaC0+Z2xvYmFscy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0gICAgRlRfRml4ZWQgICAgICAgc2NhbGUgID0gZGltLT5zY2FsZV9tdWx0OwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSA9IGdseXBoLT5tZW1vcnk7Ci0KLSAgICBQU0hfUG9pbnQqICAgICBzdHJvbmdzICAgICA9IE5VTEw7Ci0gICAgUFNIX1BvaW50ICAgICAgc3Ryb25nc18wW1BTSF9NQVhfU1RST05HX0lOVEVSTkFMXTsKLSAgICBGVF9VSW50ICAgICAgICBudW1fc3Ryb25ncyA9IDA7Ci0KLSAgICBQU0hfUG9pbnQgICAgICBwb2ludHMgPSBnbHlwaC0+cG9pbnRzOwotICAgIFBTSF9Qb2ludCAgICAgIHBvaW50c19lbmQgPSBwb2ludHMgKyBnbHlwaC0+bnVtX3BvaW50czsKLSAgICBQU0hfUG9pbnQgICAgICBwb2ludDsKLQotCi0gICAgLyogZmlyc3QgY291bnQgdGhlIG51bWJlciBvZiBzdHJvbmcgcG9pbnRzICovCi0gICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRzX2VuZDsgcG9pbnQrKyApCi0gICAgewotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfc3Ryb25nKCBwb2ludCApICkKLSAgICAgICAgbnVtX3N0cm9uZ3MrKzsKLSAgICB9Ci0KLSAgICBpZiAoIG51bV9zdHJvbmdzID09IDAgKSAgLyogbm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBhbGxvY2F0ZSBhbiBhcnJheSB0byBzdG9yZSBhIGxpc3Qgb2YgcG9pbnRzLCAqLwotICAgIC8qIHN0b3JlZCBpbiBpbmNyZWFzaW5nIG9yZ191IG9yZGVyICAgICAgICAgICAgICovCi0gICAgaWYgKCBudW1fc3Ryb25ncyA8PSBQU0hfTUFYX1NUUk9OR19JTlRFUk5BTCApCi0gICAgICBzdHJvbmdzID0gc3Ryb25nc18wOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHN0cm9uZ3MsIG51bV9zdHJvbmdzICkgKQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbnVtX3N0cm9uZ3MgPSAwOwotICAgIGZvciAoIHBvaW50ID0gcG9pbnRzOyBwb2ludCA8IHBvaW50c19lbmQ7IHBvaW50KysgKQotICAgIHsKLSAgICAgIFBTSF9Qb2ludCogIGluc2VydDsKLQotCi0gICAgICBpZiAoICFwc2hfcG9pbnRfaXNfc3Ryb25nKCBwb2ludCApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGZvciAoIGluc2VydCA9IHN0cm9uZ3MgKyBudW1fc3Ryb25nczsgaW5zZXJ0ID4gc3Ryb25nczsgaW5zZXJ0LS0gKQotICAgICAgewotICAgICAgICBpZiAoIGluc2VydFstMV0tPm9yZ191IDw9IHBvaW50LT5vcmdfdSApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaW5zZXJ0WzBdID0gaW5zZXJ0Wy0xXTsKLSAgICAgIH0KLSAgICAgIGluc2VydFswXSA9IHBvaW50OwotICAgICAgbnVtX3N0cm9uZ3MrKzsKLSAgICB9Ci0KLSAgICAvKiBub3cgdHJ5IHRvIGludGVycG9sYXRlIGFsbCBub3JtYWwgcG9pbnRzICovCi0gICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRzX2VuZDsgcG9pbnQrKyApCi0gICAgewotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfc3Ryb25nKCBwb2ludCApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIHNvbWV0aW1lcywgc29tZSBsb2NhbCBleHRyZW1hIGFyZSBzbW9vdGggcG9pbnRzICovCi0gICAgICBpZiAoIHBzaF9wb2ludF9pc19zbW9vdGgoIHBvaW50ICkgKQotICAgICAgewotICAgICAgICBpZiAoIHBvaW50LT5kaXJfaW4gPT0gUFNIX0RJUl9OT05FICAgfHwKLSAgICAgICAgICAgICBwb2ludC0+ZGlyX2luICE9IHBvaW50LT5kaXJfb3V0ICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoICFwc2hfcG9pbnRfaXNfZXh0cmVtdW0oIHBvaW50ICkgJiYKLSAgICAgICAgICAgICAhcHNoX3BvaW50X2lzX2luZmxleCggcG9pbnQgKSAgICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBwb2ludC0+ZmxhZ3MgJj0gflBTSF9QT0lOVF9TTU9PVEg7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGZpbmQgYmVzdCBlbmNsb3NpbmcgcG9pbnQgY29vcmRpbmF0ZXMgdGhlbiBpbnRlcnBvbGF0ZSAqLwotICAgICAgewotICAgICAgICBQU0hfUG9pbnQgICBiZWZvcmUsIGFmdGVyOwotICAgICAgICBGVF9VSW50ICAgICBubjsKLQotCi0gICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fc3Ryb25nczsgbm4rKyApCi0gICAgICAgICAgaWYgKCBzdHJvbmdzW25uXS0+b3JnX3UgPiBwb2ludC0+b3JnX3UgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCBubiA9PSAwICkgIC8qIHBvaW50IGJlZm9yZSB0aGUgZmlyc3Qgc3Ryb25nIHBvaW50ICovCi0gICAgICAgIHsKLSAgICAgICAgICBhZnRlciA9IHN0cm9uZ3NbMF07Ci0KLSAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBhZnRlci0+Y3VyX3UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBwb2ludC0+b3JnX3UgLSBhZnRlci0+b3JnX3UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYmVmb3JlID0gc3Ryb25nc1tubiAtIDFdOwotCi0gICAgICAgICAgZm9yICggbm4gPSBudW1fc3Ryb25nczsgbm4gPiAwOyBubi0tICkKLSAgICAgICAgICAgIGlmICggc3Ryb25nc1tubiAtIDFdLT5vcmdfdSA8IHBvaW50LT5vcmdfdSApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgaWYgKCBubiA9PSBudW1fc3Ryb25ncyApICAvKiBwb2ludCBpcyBhZnRlciBsYXN0IHN0cm9uZyBwb2ludCAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJlZm9yZSA9IHN0cm9uZ3Nbbm4gLSAxXTsKLQotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gYmVmb3JlLT5jdXJfdSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggcG9pbnQtPm9yZ191IC0gYmVmb3JlLT5vcmdfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSApOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICB1OwotCi0KLSAgICAgICAgICAgIGFmdGVyID0gc3Ryb25nc1tubl07Ci0KLSAgICAgICAgICAgIC8qIG5vdyBpbnRlcnBvbGF0ZSBwb2ludCBiZXR3ZWVuIGJlZm9yZSBhbmQgYWZ0ZXIgKi8KLSAgICAgICAgICAgIHUgPSBwb2ludC0+b3JnX3U7Ci0KLSAgICAgICAgICAgIGlmICggdSA9PSBiZWZvcmUtPm9yZ191ICkKLSAgICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gYmVmb3JlLT5jdXJfdTsKLQotICAgICAgICAgICAgZWxzZSBpZiAoIHUgPT0gYWZ0ZXItPm9yZ191ICkKLSAgICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gYWZ0ZXItPmN1cl91OwotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGJlZm9yZS0+Y3VyX3UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggdSAtIGJlZm9yZS0+b3JnX3UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci0+Y3VyX3UgLSBiZWZvcmUtPmN1cl91LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPm9yZ191IC0gYmVmb3JlLT5vcmdfdSApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwc2hfcG9pbnRfc2V0X2ZpdHRlZCggcG9pbnQgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHN0cm9uZ3MgIT0gc3Ryb25nc18wICkKLSAgICAgIEZUX0ZSRUUoIHN0cm9uZ3MgKTsKLQotI2VuZGlmIC8qIDEgKi8KLQotICB9Ci0KLQotICAvKiBpbnRlcnBvbGF0ZSBvdGhlciBwb2ludHMgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2ludGVycG9sYXRlX290aGVyX3BvaW50cyggUFNIX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24gKQotICB7Ci0gICAgUFNIX0RpbWVuc2lvbiAgZGltICAgICAgICAgID0gJmdseXBoLT5nbG9iYWxzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZSAgICAgICAgPSBkaW0tPnNjYWxlX211bHQ7Ci0gICAgRlRfRml4ZWQgICAgICAgZGVsdGEgICAgICAgID0gZGltLT5zY2FsZV9kZWx0YTsKLSAgICBQU0hfQ29udG91ciAgICBjb250b3VyICAgICAgPSBnbHlwaC0+Y29udG91cnM7Ci0gICAgRlRfVUludCAgICAgICAgbnVtX2NvbnRvdXJzID0gZ2x5cGgtPm51bV9jb250b3VyczsKLQotCi0gICAgZm9yICggOyBudW1fY29udG91cnMgPiAwOyBudW1fY29udG91cnMtLSwgY29udG91cisrICkKLSAgICB7Ci0gICAgICBQU0hfUG9pbnQgIHN0YXJ0ID0gY29udG91ci0+c3RhcnQ7Ci0gICAgICBQU0hfUG9pbnQgIGZpcnN0LCBuZXh0LCBwb2ludDsKLSAgICAgIEZUX1VJbnQgICAgZml0X2NvdW50OwotCi0KLSAgICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2Ygc3Ryb25nIHBvaW50cyBpbiB0aGlzIGNvbnRvdXIgKi8KLSAgICAgIG5leHQgICAgICA9IHN0YXJ0ICsgY29udG91ci0+Y291bnQ7Ci0gICAgICBmaXRfY291bnQgPSAwOwotICAgICAgZmlyc3QgICAgID0gMDsKLQotICAgICAgZm9yICggcG9pbnQgPSBzdGFydDsgcG9pbnQgPCBuZXh0OyBwb2ludCsrICkKLSAgICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfZml0dGVkKCBwb2ludCApICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggIWZpcnN0ICkKLSAgICAgICAgICAgIGZpcnN0ID0gcG9pbnQ7Ci0KLSAgICAgICAgICBmaXRfY291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAvKiBpZiB0aGVyZSBhcmUgbGVzcyB0aGFuIDIgZml0dGVkIHBvaW50cyBpbiB0aGUgY29udG91ciwgd2UgKi8KLSAgICAgIC8qIHNpbXBseSBzY2FsZSBhbmQgZXZlbnR1YWxseSB0cmFuc2xhdGUgdGhlIGNvbnRvdXIgcG9pbnRzICAqLwotICAgICAgaWYgKCBmaXRfY291bnQgPCAyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBmaXRfY291bnQgPT0gMSApCi0gICAgICAgICAgZGVsdGEgPSBmaXJzdC0+Y3VyX3UgLSBGVF9NdWxGaXgoIGZpcnN0LT5vcmdfdSwgc2NhbGUgKTsKLQotICAgICAgICBmb3IgKCBwb2ludCA9IHN0YXJ0OyBwb2ludCA8IG5leHQ7IHBvaW50KysgKQotICAgICAgICAgIGlmICggcG9pbnQgIT0gZmlyc3QgKQotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gRlRfTXVsRml4KCBwb2ludC0+b3JnX3UsIHNjYWxlICkgKyBkZWx0YTsKLQotICAgICAgICBnb3RvIE5leHRfQ29udG91cjsKLSAgICAgIH0KLQotICAgICAgLyogdGhlcmUgYXJlIG1vcmUgdGhhbiAyIHN0cm9uZyBwb2ludHMgaW4gdGhpcyBjb250b3VyOyB3ZSAqLwotICAgICAgLyogbmVlZCB0byBpbnRlcnBvbGF0ZSB3ZWFrIHBvaW50cyBiZXR3ZWVuIHRoZW0gICAgICAgICAgICAqLwotICAgICAgc3RhcnQgPSBmaXJzdDsKLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIHBvaW50ID0gZmlyc3Q7Ci0KLSAgICAgICAgLyogc2tpcCBjb25zZWN1dGl2ZSBmaXR0ZWQgcG9pbnRzICovCi0gICAgICAgIGZvciAoOzspCi0gICAgICAgIHsKLSAgICAgICAgICBuZXh0ID0gZmlyc3QtPm5leHQ7Ci0gICAgICAgICAgaWYgKCBuZXh0ID09IHN0YXJ0ICkKLSAgICAgICAgICAgIGdvdG8gTmV4dF9Db250b3VyOwotCi0gICAgICAgICAgaWYgKCAhcHNoX3BvaW50X2lzX2ZpdHRlZCggbmV4dCApICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZmlyc3QgPSBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZmluZCBuZXh0IGZpdHRlZCBwb2ludCBhZnRlciB1bmZpdHRlZCBvbmUgKi8KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIG5leHQgPSBuZXh0LT5uZXh0OwotICAgICAgICAgIGlmICggcHNoX3BvaW50X2lzX2ZpdHRlZCggbmV4dCApICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm93IGludGVycG9sYXRlIGJldHdlZW4gdGhlbSAqLwotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICAgIG9yZ19hLCBvcmdfYWIsIGN1cl9hLCBjdXJfYWI7Ci0gICAgICAgICAgRlRfUG9zICAgIG9yZ19jLCBvcmdfYWMsIGN1cl9jOwotICAgICAgICAgIEZUX0ZpeGVkICBzY2FsZV9hYjsKLQotCi0gICAgICAgICAgaWYgKCBmaXJzdC0+b3JnX3UgPD0gbmV4dC0+b3JnX3UgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9yZ19hICA9IGZpcnN0LT5vcmdfdTsKLSAgICAgICAgICAgIGN1cl9hICA9IGZpcnN0LT5jdXJfdTsKLSAgICAgICAgICAgIG9yZ19hYiA9IG5leHQtPm9yZ191IC0gb3JnX2E7Ci0gICAgICAgICAgICBjdXJfYWIgPSBuZXh0LT5jdXJfdSAtIGN1cl9hOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgb3JnX2EgID0gbmV4dC0+b3JnX3U7Ci0gICAgICAgICAgICBjdXJfYSAgPSBuZXh0LT5jdXJfdTsKLSAgICAgICAgICAgIG9yZ19hYiA9IGZpcnN0LT5vcmdfdSAtIG9yZ19hOwotICAgICAgICAgICAgY3VyX2FiID0gZmlyc3QtPmN1cl91IC0gY3VyX2E7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc2NhbGVfYWIgPSAweDEwMDAwTDsKLSAgICAgICAgICBpZiAoIG9yZ19hYiA+IDAgKQotICAgICAgICAgICAgc2NhbGVfYWIgPSBGVF9EaXZGaXgoIGN1cl9hYiwgb3JnX2FiICk7Ci0KLSAgICAgICAgICBwb2ludCA9IGZpcnN0LT5uZXh0OwotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgb3JnX2MgID0gcG9pbnQtPm9yZ191OwotICAgICAgICAgICAgb3JnX2FjID0gb3JnX2MgLSBvcmdfYTsKLQotICAgICAgICAgICAgaWYgKCBvcmdfYWMgPD0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIG9uIHRoZSBsZWZ0IG9mIHRoZSBpbnRlcnBvbGF0aW9uIHpvbmUgKi8KLSAgICAgICAgICAgICAgY3VyX2MgPSBjdXJfYSArIEZUX011bEZpeCggb3JnX2FjLCBzY2FsZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIG9yZ19hYyA+PSBvcmdfYWIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBvbiB0aGUgcmlnaHQgb24gdGhlIGludGVycG9sYXRpb24gem9uZSAqLwotICAgICAgICAgICAgICBjdXJfYyA9IGN1cl9hICsgY3VyX2FiICsgRlRfTXVsRml4KCBvcmdfYWMgLSBvcmdfYWIsIHNjYWxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgaW50ZXJwb2xhdGlvbiB6b25lICovCi0gICAgICAgICAgICAgIGN1cl9jID0gY3VyX2EgKyBGVF9NdWxGaXgoIG9yZ19hYywgc2NhbGVfYWIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gY3VyX2M7Ci0KLSAgICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0KLSAgICAgICAgICB9IHdoaWxlICggcG9pbnQgIT0gbmV4dCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoga2VlcCBnb2luZyB1bnRpbCBhbGwgcG9pbnRzIGluIHRoZSBjb250b3VycyBoYXZlIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgICAgIGZpcnN0ID0gbmV4dDsKLQotICAgICAgfSB3aGlsZSAoIGZpcnN0ICE9IHN0YXJ0ICk7Ci0KLSAgICBOZXh0X0NvbnRvdXI6Ci0gICAgICA7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICBISUdILUxFVkVMIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9FcnJvcgotICBwc19oaW50c19hcHBseSggUFNfSGludHMgICAgICAgIHBzX2hpbnRzLAotICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICBQU0hfR2xvYmFscyAgICAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKQotICB7Ci0gICAgUFNIX0dseXBoUmVjICBnbHlwaHJlYzsKLSAgICBQU0hfR2x5cGggICAgIGdseXBoID0gJmdseXBocmVjOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0jaWZkZWYgREVCVUdfSElOVEVSCi0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnk7Ci0jZW5kaWYKLSAgICBGVF9JbnQgICAgICAgIGRpbWVuc2lvbjsKLQotCi0gICAgLyogc29tZXRoaW5nIHRvIGRvPyAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCB8fCBvdXRsaW5lLT5uX2NvbnRvdXJzID09IDAgKQotICAgICAgcmV0dXJuIFBTSF9FcnJfT2s7Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLQotICAgIG1lbW9yeSA9IGdsb2JhbHMtPm1lbW9yeTsKLQotICAgIGlmICggcHNfZGVidWdfZ2x5cGggKQotICAgIHsKLSAgICAgIHBzaF9nbHlwaF9kb25lKCBwc19kZWJ1Z19nbHlwaCApOwotICAgICAgRlRfRlJFRSggcHNfZGVidWdfZ2x5cGggKTsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX05FVyggZ2x5cGggKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBwc19kZWJ1Z19nbHlwaCA9IGdseXBoOwotCi0jZW5kaWYgLyogREVCVUdfSElOVEVSICovCi0KLSAgICBlcnJvciA9IHBzaF9nbHlwaF9pbml0KCBnbHlwaCwgb3V0bGluZSwgcHNfaGludHMsIGdsb2JhbHMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHRyeSB0byBvcHRpbWl6ZSB0aGUgeV9zY2FsZSBzbyB0aGF0IHRoZSB0b3Agb2Ygbm9uLWNhcGl0YWwgbGV0dGVycwotICAgICAqIGlzIGFsaWduZWQgb24gYSBwaXhlbCBib3VuZGFyeSB3aGVuZXZlciBwb3NzaWJsZQotICAgICAqLwotICAgIHsKLSAgICAgIFBTSF9EaW1lbnNpb24gIGRpbV94ID0gJmdseXBoLT5nbG9iYWxzLT5kaW1lbnNpb25bMF07Ci0gICAgICBQU0hfRGltZW5zaW9uICBkaW1feSA9ICZnbHlwaC0+Z2xvYmFscy0+ZGltZW5zaW9uWzFdOwotCi0gICAgICBGVF9GaXhlZCAgeF9zY2FsZSA9IGRpbV94LT5zY2FsZV9tdWx0OwotICAgICAgRlRfRml4ZWQgIHlfc2NhbGUgPSBkaW1feS0+c2NhbGVfbXVsdDsKLQotICAgICAgRlRfRml4ZWQgIG9sZF94X3NjYWxlID0geF9zY2FsZTsKLSAgICAgIEZUX0ZpeGVkICBvbGRfeV9zY2FsZSA9IHlfc2NhbGU7Ci0KLSAgICAgIEZUX0ZpeGVkICBzY2FsZWQ7Ci0gICAgICBGVF9GaXhlZCAgZml0dGVkOwotCi0gICAgICBGVF9Cb29sICByZXNjYWxlID0gRkFMU0U7Ci0KLQotICAgICAgc2NhbGVkID0gRlRfTXVsRml4KCBnbG9iYWxzLT5ibHVlcy5ub3JtYWxfdG9wLnpvbmVzLT5vcmdfcmVmLCB5X3NjYWxlICk7Ci0gICAgICBmaXR0ZWQgPSBGVF9QSVhfUk9VTkQoIHNjYWxlZCApOwotCi0gICAgICBpZiAoIGZpdHRlZCAhPSAwICYmIHNjYWxlZCAhPSBmaXR0ZWQgKQotICAgICAgewotICAgICAgICByZXNjYWxlID0gVFJVRTsKLQotICAgICAgICB5X3NjYWxlID0gRlRfTXVsRGl2KCB5X3NjYWxlLCBmaXR0ZWQsIHNjYWxlZCApOwotCi0gICAgICAgIGlmICggZml0dGVkIDwgc2NhbGVkICkKLSAgICAgICAgICB4X3NjYWxlIC09IHhfc2NhbGUgLyA1MDsKLQotICAgICAgICBwc2hfZ2xvYmFsc19zZXRfc2NhbGUoIGdseXBoLT5nbG9iYWxzLCB4X3NjYWxlLCB5X3NjYWxlLCAwLCAwICk7Ci0gICAgICB9Ci0KLSAgICAgIGdseXBoLT5kb19ob3J6X2hpbnRzID0gMTsKLSAgICAgIGdseXBoLT5kb192ZXJ0X2hpbnRzID0gMTsKLQotICAgICAgZ2x5cGgtPmRvX2hvcnpfc25hcHBpbmcgPSBGVF9CT09MKCBoaW50X21vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50X21vZGUgPT0gRlRfUkVOREVSX01PREVfTENEICApOwotCi0gICAgICBnbHlwaC0+ZG9fdmVydF9zbmFwcGluZyA9IEZUX0JPT0woIGhpbnRfbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9NT05PICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50X21vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1YgKTsKLQotICAgICAgZ2x5cGgtPmRvX3N0ZW1fYWRqdXN0ICAgPSBGVF9CT09MKCBoaW50X21vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgKTsKLQotICAgICAgZm9yICggZGltZW5zaW9uID0gMDsgZGltZW5zaW9uIDwgMjsgZGltZW5zaW9uKysgKQotICAgICAgewotICAgICAgICAvKiBsb2FkIG91dGxpbmUgY29vcmRpbmF0ZXMgaW50byBnbHlwaCAqLwotICAgICAgICBwc2hfZ2x5cGhfbG9hZF9wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKLQotICAgICAgICAvKiBjb21wdXRlIGxvY2FsIGV4dHJlbWEgKi8KLSAgICAgICAgcHNoX2dseXBoX2NvbXB1dGVfZXh0cmVtYSggZ2x5cGggKTsKLQotICAgICAgICAvKiBjb21wdXRlIGFsaWduZWQgc3RlbS9oaW50cyBwb3NpdGlvbnMgKi8KLSAgICAgICAgcHNoX2hpbnRfdGFibGVfYWxpZ25faGludHMoICZnbHlwaC0+aGludF90YWJsZXNbZGltZW5zaW9uXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5nbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggKTsKLQotICAgICAgICAvKiBmaW5kIHN0cm9uZyBwb2ludHMsIGFsaWduIHRoZW0sIHRoZW4gaW50ZXJwb2xhdGUgb3RoZXJzICovCi0gICAgICAgIHBzaF9nbHlwaF9maW5kX3N0cm9uZ19wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKLSAgICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMSApCi0gICAgICAgICAgcHNoX2dseXBoX2ZpbmRfYmx1ZV9wb2ludHMoICZnbG9iYWxzLT5ibHVlcywgZ2x5cGggKTsKLSAgICAgICAgcHNoX2dseXBoX2ludGVycG9sYXRlX3N0cm9uZ19wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKLSAgICAgICAgcHNoX2dseXBoX2ludGVycG9sYXRlX25vcm1hbF9wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKLSAgICAgICAgcHNoX2dseXBoX2ludGVycG9sYXRlX290aGVyX3BvaW50cyggZ2x5cGgsIGRpbWVuc2lvbiApOwotCi0gICAgICAgIC8qIHNhdmUgaGludGVkIGNvb3JkaW5hdGVzIGJhY2sgdG8gb3V0bGluZSAqLwotICAgICAgICBwc2hfZ2x5cGhfc2F2ZV9wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKLQotICAgICAgICBpZiAoIHJlc2NhbGUgKQotICAgICAgICAgIHBzaF9nbG9iYWxzX3NldF9zY2FsZSggZ2x5cGgtPmdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfeF9zY2FsZSwgb2xkX3lfc2NhbGUsIDAsIDAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLQotI2lmbmRlZiBERUJVR19ISU5URVIKLSAgICBwc2hfZ2x5cGhfZG9uZSggZ2x5cGggKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNoYWxnby5oIGIvc3JjL3BzaGludGVyL3BzaGFsZ28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyNDhhNy4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNoYWxnby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaGFsZ28uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IGhpbnRpbmcgYWxnb3JpdGhtIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMywgMjAwOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTSEFMR09fSF9fCi0jZGVmaW5lIF9fUFNIQUxHT19IX18KLQotCi0jaW5jbHVkZSAicHNocmVjLmgiCi0jaW5jbHVkZSAicHNoZ2xvYi5oIgotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIGhhbmRsZSB0byBIaW50IHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIHN0cnVjdCBQU0hfSGludFJlY18qICBQU0hfSGludDsKLQotICAvKiBoaW50IGJpdC1mbGFncyAqLwotICB0eXBlZGVmIGVudW0gIFBTSF9IaW50X0ZsYWdzXwotICB7Ci0gICAgUFNIX0hJTlRfR0hPU1QgID0gUFNfSElOVF9GTEFHX0dIT1NULAotICAgIFBTSF9ISU5UX0JPVFRPTSA9IFBTX0hJTlRfRkxBR19CT1RUT00sCi0gICAgUFNIX0hJTlRfQUNUSVZFID0gNCwKLSAgICBQU0hfSElOVF9GSVRURUQgPSA4Ci0KLSAgfSBQU0hfSGludF9GbGFnczsKLQotCi0jZGVmaW5lIHBzaF9oaW50X2lzX2FjdGl2ZSggeCApICAoICggKHgpLT5mbGFncyAmIFBTSF9ISU5UX0FDVElWRSApICE9IDAgKQotI2RlZmluZSBwc2hfaGludF9pc19naG9zdCggeCApICAgKCAoICh4KS0+ZmxhZ3MgJiBQU0hfSElOVF9HSE9TVCAgKSAhPSAwICkKLSNkZWZpbmUgcHNoX2hpbnRfaXNfZml0dGVkKCB4ICkgICggKCAoeCktPmZsYWdzICYgUFNIX0hJTlRfRklUVEVEICkgIT0gMCApCi0KLSNkZWZpbmUgcHNoX2hpbnRfYWN0aXZhdGUoIHggKSAgICAoeCktPmZsYWdzIHw9ICBQU0hfSElOVF9BQ1RJVkUKLSNkZWZpbmUgcHNoX2hpbnRfZGVhY3RpdmF0ZSggeCApICAoeCktPmZsYWdzICY9IH5QU0hfSElOVF9BQ1RJVkUKLSNkZWZpbmUgcHNoX2hpbnRfc2V0X2ZpdHRlZCggeCApICAoeCktPmZsYWdzIHw9ICBQU0hfSElOVF9GSVRURUQKLQotICAvKiBoaW50IHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0hpbnRSZWNfCi0gIHsKLSAgICBGVF9JbnQgICAgb3JnX3BvczsKLSAgICBGVF9JbnQgICAgb3JnX2xlbjsKLSAgICBGVF9Qb3MgICAgY3VyX3BvczsKLSAgICBGVF9Qb3MgICAgY3VyX2xlbjsKLSAgICBGVF9VSW50ICAgZmxhZ3M7Ci0gICAgUFNIX0hpbnQgIHBhcmVudDsKLSAgICBGVF9JbnQgICAgb3JkZXI7Ci0KLSAgfSBQU0hfSGludFJlYzsKLQotCi0gIC8qIHRoaXMgaXMgYW4gaW50ZXJwb2xhdGlvbiB6b25lIHVzZWQgZm9yIHN0cm9uZyBwb2ludHM7ICAqLwotICAvKiB3ZWFrIHBvaW50cyBhcmUgaW50ZXJwb2xhdGVkIGFjY29yZGluZyB0byB0aGVpciBzdHJvbmcgKi8KLSAgLyogbmVpZ2hib3VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfWm9uZVJlY18KLSAgewotICAgIEZUX0ZpeGVkICBzY2FsZTsKLSAgICBGVF9GaXhlZCAgZGVsdGE7Ci0gICAgRlRfUG9zICAgIG1pbjsKLSAgICBGVF9Qb3MgICAgbWF4OwotCi0gIH0gUFNIX1pvbmVSZWMsICpQU0hfWm9uZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfSGludF9UYWJsZVJlY18KLSAgewotICAgIEZUX1VJbnQgICAgICAgIG1heF9oaW50czsKLSAgICBGVF9VSW50ICAgICAgICBudW1faGludHM7Ci0gICAgUFNIX0hpbnQgICAgICAgaGludHM7Ci0gICAgUFNIX0hpbnQqICAgICAgc29ydDsKLSAgICBQU0hfSGludCogICAgICBzb3J0X2dsb2JhbDsKLSAgICBGVF9VSW50ICAgICAgICBudW1fem9uZXM7Ci0gICAgUFNIX1pvbmVSZWMqICAgem9uZXM7Ci0gICAgUFNIX1pvbmUgICAgICAgem9uZTsKLSAgICBQU19NYXNrX1RhYmxlICBoaW50X21hc2tzOwotICAgIFBTX01hc2tfVGFibGUgIGNvdW50ZXJfbWFza3M7Ci0KLSAgfSBQU0hfSGludF9UYWJsZVJlYywgKlBTSF9IaW50X1RhYmxlOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNIX1BvaW50UmVjXyogICAgUFNIX1BvaW50OwotICB0eXBlZGVmIHN0cnVjdCBQU0hfQ29udG91clJlY18qICBQU0hfQ29udG91cjsKLQotICBlbnVtCi0gIHsKLSAgICBQU0hfRElSX05PTkUgID0gIDQsCi0gICAgUFNIX0RJUl9VUCAgICA9IC0xLAotICAgIFBTSF9ESVJfRE9XTiAgPSAgMSwKLSAgICBQU0hfRElSX0xFRlQgID0gLTIsCi0gICAgUFNIX0RJUl9SSUdIVCA9ICAyCi0gIH07Ci0KLSNkZWZpbmUgUFNIX0RJUl9IT1JJWk9OVEFMICAyCi0jZGVmaW5lIFBTSF9ESVJfVkVSVElDQUwgICAgMQotCi0jZGVmaW5lIFBTSF9ESVJfQ09NUEFSRSggZDEsIGQyICkgICAoIChkMSkgPT0gKGQyKSB8fCAoZDEpID09IC0oZDIpICkKLSNkZWZpbmUgUFNIX0RJUl9JU19IT1JJWk9OVEFMKCBkICkgIFBTSF9ESVJfQ09NUEFSRSggZCwgUFNIX0RJUl9IT1JJWk9OVEFMICkKLSNkZWZpbmUgUFNIX0RJUl9JU19WRVJUSUNBTCggZCApICAgIFBTSF9ESVJfQ09NUEFSRSggZCwgUFNIX0RJUl9WRVJUSUNBTCApCi0KLQotIC8qIHRoZSBmb2xsb3dpbmcgYml0LWZsYWdzIGFyZSBjb21wdXRlZCBvbmNlIGJ5IHRoZSBnbHlwaCAqLwotIC8qIGFuYWx5emVyLCBmb3IgYm90aCBkaW1lbnNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBlbnVtCi0gIHsKLSAgICBQU0hfUE9JTlRfT0ZGICAgID0gMSwgICAvKiBwb2ludCBpcyBvZmYgdGhlIGN1cnZlICovCi0gICAgUFNIX1BPSU5UX1NNT09USCA9IDIsICAgLyogcG9pbnQgaXMgc21vb3RoICAgICAgICAqLwotICAgIFBTSF9QT0lOVF9JTkZMRVggPSA0ICAgIC8qIHBvaW50IGlzIGluZmxlY3Rpb24gICAgKi8KLSAgfTsKLQotI2RlZmluZSBwc2hfcG9pbnRfaXNfc21vb3RoKCBwICkgICggKHApLT5mbGFncyAmIFBTSF9QT0lOVF9TTU9PVEggKQotI2RlZmluZSBwc2hfcG9pbnRfaXNfb2ZmKCBwICkgICAgICggKHApLT5mbGFncyAmIFBTSF9QT0lOVF9PRkYgICAgKQotI2RlZmluZSBwc2hfcG9pbnRfaXNfaW5mbGV4KCBwICkgICggKHApLT5mbGFncyAmIFBTSF9QT0lOVF9JTkZMRVggKQotCi0jZGVmaW5lIHBzaF9wb2ludF9zZXRfc21vb3RoKCBwICkgIChwKS0+ZmxhZ3MgfD0gUFNIX1BPSU5UX1NNT09USAotI2RlZmluZSBwc2hfcG9pbnRfc2V0X29mZiggcCApICAgICAocCktPmZsYWdzIHw9IFBTSF9QT0lOVF9PRkYKLSNkZWZpbmUgcHNoX3BvaW50X3NldF9pbmZsZXgoIHAgKSAgKHApLT5mbGFncyB8PSBQU0hfUE9JTlRfSU5GTEVYCi0KLSAgLyogdGhlIGZvbGxvd2luZyBiaXQtZmxhZ3MgYXJlIHJlLWNvbXB1dGVkIGZvciBlYWNoIGRpbWVuc2lvbiAqLwotICBlbnVtCi0gIHsKLSAgICBQU0hfUE9JTlRfU1RST05HICAgPSAxNiwgICAvKiBwb2ludCBpcyBzdHJvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFBTSF9QT0lOVF9GSVRURUQgICA9IDMyLCAgIC8qIHBvaW50IGlzIGFscmVhZHkgZml0dGVkICAgICAgICAgICAgICAgICAgICovCi0gICAgUFNIX1BPSU5UX0VYVFJFTVVNID0gNjQsICAgLyogcG9pbnQgaXMgbG9jYWwgZXh0cmVtdW0gICAgICAgICAgICAgICAgICAgKi8KLSAgICBQU0hfUE9JTlRfUE9TSVRJVkUgPSAxMjgsICAvKiBleHRyZW11bSBoYXMgcG9zaXRpdmUgY29udG91ciBmbG93ICAgICAgICAqLwotICAgIFBTSF9QT0lOVF9ORUdBVElWRSA9IDI1NiwgIC8qIGV4dHJlbXVtIGhhcyBuZWdhdGl2ZSBjb250b3VyIGZsb3cgICAgICAgICovCi0gICAgUFNIX1BPSU5UX0VER0VfTUlOID0gNTEyLCAgLyogcG9pbnQgaXMgYWxpZ25lZCB0byBsZWZ0L2JvdHRvbSBzdGVtIGVkZ2UgKi8KLSAgICBQU0hfUE9JTlRfRURHRV9NQVggPSAxMDI0ICAvKiBwb2ludCBpcyBhbGlnbmVkIHRvIHRvcC9yaWdodCBzdGVtIGVkZ2UgICAqLwotICB9OwotCi0jZGVmaW5lIHBzaF9wb2ludF9pc19zdHJvbmcoIHAgKSAgICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX1NUUk9ORyApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19maXR0ZWQoIHAgKSAgICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX0ZJVFRFRCApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19leHRyZW11bSggcCApICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX0VYVFJFTVVNICkKLSNkZWZpbmUgcHNoX3BvaW50X2lzX3Bvc2l0aXZlKCBwICkgICggKHApLT5mbGFnczIgJiBQU0hfUE9JTlRfUE9TSVRJVkUgKQotI2RlZmluZSBwc2hfcG9pbnRfaXNfbmVnYXRpdmUoIHAgKSAgKCAocCktPmZsYWdzMiAmIFBTSF9QT0lOVF9ORUdBVElWRSApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19lZGdlX21pbiggcCApICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX0VER0VfTUlOICkKLSNkZWZpbmUgcHNoX3BvaW50X2lzX2VkZ2VfbWF4KCBwICkgICggKHApLT5mbGFnczIgJiBQU0hfUE9JTlRfRURHRV9NQVggKQotCi0jZGVmaW5lIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwICkgICAgKHApLT5mbGFnczIgfD0gUFNIX1BPSU5UX1NUUk9ORwotI2RlZmluZSBwc2hfcG9pbnRfc2V0X2ZpdHRlZCggcCApICAgIChwKS0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9GSVRURUQKLSNkZWZpbmUgcHNoX3BvaW50X3NldF9leHRyZW11bSggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfRVhUUkVNVU0KLSNkZWZpbmUgcHNoX3BvaW50X3NldF9wb3NpdGl2ZSggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfUE9TSVRJVkUKLSNkZWZpbmUgcHNoX3BvaW50X3NldF9uZWdhdGl2ZSggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfTkVHQVRJVkUKLSNkZWZpbmUgcHNoX3BvaW50X3NldF9lZGdlX21pbiggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfRURHRV9NSU4KLSNkZWZpbmUgcHNoX3BvaW50X3NldF9lZGdlX21heCggcCApICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfRURHRV9NQVgKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfUG9pbnRSZWNfCi0gIHsKLSAgICBQU0hfUG9pbnQgICAgcHJldjsKLSAgICBQU0hfUG9pbnQgICAgbmV4dDsKLSAgICBQU0hfQ29udG91ciAgY29udG91cjsKLSAgICBGVF9VSW50ICAgICAgZmxhZ3M7Ci0gICAgRlRfVUludCAgICAgIGZsYWdzMjsKLSAgICBGVF9DaGFyICAgICAgZGlyX2luOwotICAgIEZUX0NoYXIgICAgICBkaXJfb3V0OwotICAgIEZUX0FuZ2xlICAgICBhbmdsZV9pbjsKLSAgICBGVF9BbmdsZSAgICAgYW5nbGVfb3V0OwotICAgIFBTSF9IaW50ICAgICBoaW50OwotICAgIEZUX1BvcyAgICAgICBvcmdfdTsKLSAgICBGVF9Qb3MgICAgICAgb3JnX3Y7Ci0gICAgRlRfUG9zICAgICAgIGN1cl91OwotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgIEZUX1BvcyAgICAgICBvcmdfeDsKLSAgICBGVF9Qb3MgICAgICAgY3VyX3g7Ci0gICAgRlRfUG9zICAgICAgIG9yZ195OwotICAgIEZUX1BvcyAgICAgICBjdXJfeTsKLSAgICBGVF9VSW50ICAgICAgZmxhZ3NfeDsKLSAgICBGVF9VSW50ICAgICAgZmxhZ3NfeTsKLSNlbmRpZgotCi0gIH0gUFNIX1BvaW50UmVjOwotCi0KLSNkZWZpbmUgUFNIX1BPSU5UX0VRVUFMX09SRyggYSwgYiApICAoIChhKS0+b3JnX3UgPT0gKGIpLT5vcmdfdSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSktPm9yZ192ID09IChiKS0+b3JnX3YgKQotCi0jZGVmaW5lIFBTSF9QT0lOVF9BTkdMRSggYSwgYiApICBGVF9BdGFuMiggKGIpLT5vcmdfdSAtIChhKS0+b3JnX3UsICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIpLT5vcmdfdiAtIChhKS0+b3JnX3YgKQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfQ29udG91clJlY18KLSAgewotICAgIFBTSF9Qb2ludCAgc3RhcnQ7Ci0gICAgRlRfVUludCAgICBjb3VudDsKLQotICB9IFBTSF9Db250b3VyUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9HbHlwaFJlY18KLSAgewotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fcG9pbnRzOwotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fY29udG91cnM7Ci0KLSAgICBQU0hfUG9pbnQgICAgICAgICAgcG9pbnRzOwotICAgIFBTSF9Db250b3VyICAgICAgICBjb250b3VyczsKLQotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnk7Ci0gICAgRlRfT3V0bGluZSogICAgICAgIG91dGxpbmU7Ci0gICAgUFNIX0dsb2JhbHMgICAgICAgIGdsb2JhbHM7Ci0gICAgUFNIX0hpbnRfVGFibGVSZWMgIGhpbnRfdGFibGVzWzJdOwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHZlcnRpY2FsOwotICAgIEZUX0ludCAgICAgICAgICAgICBtYWpvcl9kaXI7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIG1pbm9yX2RpcjsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICBkb19ob3J6X2hpbnRzOwotICAgIEZUX0Jvb2wgICAgICAgICAgICBkb192ZXJ0X2hpbnRzOwotICAgIEZUX0Jvb2wgICAgICAgICAgICBkb19ob3J6X3NuYXBwaW5nOwotICAgIEZUX0Jvb2wgICAgICAgICAgICBkb192ZXJ0X3NuYXBwaW5nOwotICAgIEZUX0Jvb2wgICAgICAgICAgICBkb19zdGVtX2FkanVzdDsKLQotICB9IFBTSF9HbHlwaFJlYywgKlBTSF9HbHlwaDsKLQotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gIGV4dGVybiBQU0hfSGludF9UYWJsZSAgcHNfZGVidWdfaGludF90YWJsZTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpQU0hfSGludEZ1bmMpKCBQU0hfSGludCAgaGludCwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgdmVydGljYWwgKTsKLQotICBleHRlcm4gUFNIX0hpbnRGdW5jICAgIHBzX2RlYnVnX2hpbnRfZnVuYzsKLQotICBleHRlcm4gUFNIX0dseXBoICAgICAgIHBzX2RlYnVnX2dseXBoOwotI2VuZGlmCi0KLQotICBleHRlcm4gRlRfRXJyb3IKLSAgcHNfaGludHNfYXBwbHkoIFBTX0hpbnRzICAgICAgICBwc19oaW50cywKLSAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgaGludF9tb2RlICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1BTSEFMR09fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5jIGIvc3JjL3BzaGludGVyL3BzaGdsb2IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2OWFhMS4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaGdsb2IuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IGhpbnRlciBnbG9iYWwgaGludGluZyBtYW5hZ2VtZW50IChib2R5KS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgSW5zcGlyZWQgYnkgdGhlIG5ldyBhdXRvLWhpbnRlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLwotLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAicHNoZ2xvYi5oIgotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gIFBTSF9HbG9iYWxzICBwc19kZWJ1Z19nbG9iYWxzID0gMDsKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBTVEFOREFSRCBXSURUSFMgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBzY2FsZSB0aGUgd2lkdGhzL2hlaWdodHMgdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dsb2JhbHNfc2NhbGVfd2lkdGhzKCBQU0hfR2xvYmFscyAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgZGlyZWN0aW9uICkKLSAgewotICAgIFBTSF9EaW1lbnNpb24gIGRpbSAgID0gJmdsb2JhbHMtPmRpbWVuc2lvbltkaXJlY3Rpb25dOwotICAgIFBTSF9XaWR0aHMgICAgIHN0ZHcgID0gJmRpbS0+c3RkdzsKLSAgICBGVF9VSW50ICAgICAgICBjb3VudCA9IHN0ZHctPmNvdW50OwotICAgIFBTSF9XaWR0aCAgICAgIHdpZHRoID0gc3Rkdy0+d2lkdGhzOwotICAgIFBTSF9XaWR0aCAgICAgIHN0YW5kID0gd2lkdGg7ICAgICAgICAgICAgICAgLyogc3RhbmRhcmQgd2lkdGgvaGVpZ2h0ICovCi0gICAgRlRfRml4ZWQgICAgICAgc2NhbGUgPSBkaW0tPnNjYWxlX211bHQ7Ci0KLQotICAgIGlmICggY291bnQgPiAwICkKLSAgICB7Ci0gICAgICB3aWR0aC0+Y3VyID0gRlRfTXVsRml4KCB3aWR0aC0+b3JnLCBzY2FsZSApOwotICAgICAgd2lkdGgtPmZpdCA9IEZUX1BJWF9ST1VORCggd2lkdGgtPmN1ciApOwotCi0gICAgICB3aWR0aCsrOwotICAgICAgY291bnQtLTsKLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHdpZHRoKysgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIHcsIGRpc3Q7Ci0KLQotICAgICAgICB3ICAgID0gRlRfTXVsRml4KCB3aWR0aC0+b3JnLCBzY2FsZSApOwotICAgICAgICBkaXN0ID0gdyAtIHN0YW5kLT5jdXI7Ci0KLSAgICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgICAgZGlzdCA9IC1kaXN0OwotCi0gICAgICAgIGlmICggZGlzdCA8IDEyOCApCi0gICAgICAgICAgdyA9IHN0YW5kLT5jdXI7Ci0KLSAgICAgICAgd2lkdGgtPmN1ciA9IHc7Ci0gICAgICAgIHdpZHRoLT5maXQgPSBGVF9QSVhfUk9VTkQoIHcgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0jaWYgMAotCi0gIC8qIG9yZ193aWR0aCBpcyBpcyBmb250IHVuaXRzLCByZXN1bHQgaW4gZGV2aWNlIHBpeGVscywgMjYuNiBmb3JtYXQgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9Qb3MgKQotICBwc2hfZGltZW5zaW9uX3NuYXBfd2lkdGgoIFBTSF9EaW1lbnNpb24gIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBvcmdfd2lkdGggKQotICB7Ci0gICAgRlRfVUludCAgbjsKLSAgICBGVF9Qb3MgICB3aWR0aCAgICAgPSBGVF9NdWxGaXgoIG9yZ193aWR0aCwgZGltZW5zaW9uLT5zY2FsZV9tdWx0ICk7Ci0gICAgRlRfUG9zICAgYmVzdCAgICAgID0gNjQgKyAzMiArIDI7Ci0gICAgRlRfUG9zICAgcmVmZXJlbmNlID0gd2lkdGg7Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgZGltZW5zaW9uLT5zdGR3LmNvdW50OyBuKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgdzsKLSAgICAgIEZUX1BvcyAgZGlzdDsKLQotCi0gICAgICB3ID0gZGltZW5zaW9uLT5zdGR3LndpZHRoc1tuXS5jdXI7Ci0gICAgICBkaXN0ID0gd2lkdGggLSB3OwotICAgICAgaWYgKCBkaXN0IDwgMCApCi0gICAgICAgIGRpc3QgPSAtZGlzdDsKLSAgICAgIGlmICggZGlzdCA8IGJlc3QgKQotICAgICAgewotICAgICAgICBiZXN0ICAgICAgPSBkaXN0OwotICAgICAgICByZWZlcmVuY2UgPSB3OwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggd2lkdGggPj0gcmVmZXJlbmNlICkKLSAgICB7Ci0gICAgICB3aWR0aCAtPSAweDIxOwotICAgICAgaWYgKCB3aWR0aCA8IHJlZmVyZW5jZSApCi0gICAgICAgIHdpZHRoID0gcmVmZXJlbmNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgd2lkdGggKz0gMHgyMTsKLSAgICAgIGlmICggd2lkdGggPiByZWZlcmVuY2UgKQotICAgICAgICB3aWR0aCA9IHJlZmVyZW5jZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gd2lkdGg7Ci0gIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgQkxVRSBaT05FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9ibHVlc19zZXRfem9uZXNfMCggUFNIX0JsdWVzICAgICAgIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgaXNfb3RoZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICByZWFkX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgICAgICByZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9CbHVlX1RhYmxlICB0b3BfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0JsdWVfVGFibGUgIGJvdF90YWJsZSApCi0gIHsKLSAgICBGVF9VSW50ICBjb3VudF90b3AgPSB0b3BfdGFibGUtPmNvdW50OwotICAgIEZUX1VJbnQgIGNvdW50X2JvdCA9IGJvdF90YWJsZS0+Y291bnQ7Ci0gICAgRlRfQm9vbCAgZmlyc3QgICAgID0gMTsKLQotICAgIEZUX1VOVVNFRCggdGFyZ2V0ICk7Ci0KLQotICAgIGZvciAoIDsgcmVhZF9jb3VudCA+IDE7IHJlYWRfY291bnQgLT0gMiApCi0gICAgewotICAgICAgRlRfSW50ICAgICAgICAgcmVmZXJlbmNlLCBkZWx0YTsKLSAgICAgIEZUX1VJbnQgICAgICAgIGNvdW50OwotICAgICAgUFNIX0JsdWVfWm9uZSAgem9uZXMsIHpvbmU7Ci0gICAgICBGVF9Cb29sICAgICAgICB0b3A7Ci0KLQotICAgICAgLyogcmVhZCBibHVlIHpvbmUgZW50cnksIGFuZCBzZWxlY3QgdGFyZ2V0IHRvcC9ib3R0b20gem9uZSAqLwotICAgICAgdG9wID0gMDsKLSAgICAgIGlmICggZmlyc3QgfHwgaXNfb3RoZXJzICkKLSAgICAgIHsKLSAgICAgICAgcmVmZXJlbmNlID0gcmVhZFsxXTsKLSAgICAgICAgZGVsdGEgICAgID0gcmVhZFswXSAtIHJlZmVyZW5jZTsKLQotICAgICAgICB6b25lcyA9IGJvdF90YWJsZS0+em9uZXM7Ci0gICAgICAgIGNvdW50ID0gY291bnRfYm90OwotICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlZmVyZW5jZSA9IHJlYWRbMF07Ci0gICAgICAgIGRlbHRhICAgICA9IHJlYWRbMV0gLSByZWZlcmVuY2U7Ci0KLSAgICAgICAgem9uZXMgPSB0b3BfdGFibGUtPnpvbmVzOwotICAgICAgICBjb3VudCA9IGNvdW50X3RvcDsKLSAgICAgICAgdG9wICAgPSAxOwotICAgICAgfQotCi0gICAgICAvKiBpbnNlcnQgaW50byBzb3J0ZWQgdGFibGUgKi8KLSAgICAgIHpvbmUgPSB6b25lczsKLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB6b25lKysgKQotICAgICAgewotICAgICAgICBpZiAoIHJlZmVyZW5jZSA8IHpvbmUtPm9yZ19yZWYgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggcmVmZXJlbmNlID09IHpvbmUtPm9yZ19yZWYgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBkZWx0YTAgPSB6b25lLT5vcmdfZGVsdGE7Ci0KLQotICAgICAgICAgIC8qIHdlIGhhdmUgdHdvIHpvbmVzIG9uIHRoZSBzYW1lIHJlZmVyZW5jZSBwb3NpdGlvbiAtLSAqLwotICAgICAgICAgIC8qIG9ubHkga2VlcCB0aGUgbGFyZ2VzdCBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggZGVsdGEgPCAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGRlbHRhIDwgZGVsdGEwICkKLSAgICAgICAgICAgICAgem9uZS0+b3JnX2RlbHRhID0gZGVsdGE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGRlbHRhID4gZGVsdGEwICkKLSAgICAgICAgICAgICAgem9uZS0+b3JnX2RlbHRhID0gZGVsdGE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGdvdG8gU2tpcDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgIHpvbmVbY291bnRdID0gem9uZVtjb3VudC0xXTsKLQotICAgICAgem9uZS0+b3JnX3JlZiAgID0gcmVmZXJlbmNlOwotICAgICAgem9uZS0+b3JnX2RlbHRhID0gZGVsdGE7Ci0KLSAgICAgIGlmICggdG9wICkKLSAgICAgICAgY291bnRfdG9wKys7Ci0gICAgICBlbHNlCi0gICAgICAgIGNvdW50X2JvdCsrOwotCi0gICAgU2tpcDoKLSAgICAgIHJlYWQgKz0gMjsKLSAgICB9Ci0KLSAgICB0b3BfdGFibGUtPmNvdW50ID0gY291bnRfdG9wOwotICAgIGJvdF90YWJsZS0+Y291bnQgPSBjb3VudF9ib3Q7Ci0gIH0KLQotCi0gIC8qIFJlLXJlYWQgYmx1ZSB6b25lcyBmcm9tIHRoZSBvcmlnaW5hbCBmb250cyBhbmQgc3RvcmUgdGhlbSBpbnRvIG91dCAqLwotICAvKiBwcml2YXRlIHN0cnVjdHVyZS4gIFRoaXMgZnVuY3Rpb24gcmUtb3JkZXJzLCBzYW5pdGl6ZXMgYW5kICAgICAgICAgKi8KLSAgLyogZnV6ei1leHBhbmRzIHRoZSB6b25lcyBhcyB3ZWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9ibHVlc19zZXRfem9uZXMoIFBTSF9CbHVlcyAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIGJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50X290aGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICBvdGhlcl9ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBmdXp6LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGZhbWlseSApCi0gIHsKLSAgICBQU0hfQmx1ZV9UYWJsZSAgdG9wX3RhYmxlLCBib3RfdGFibGU7Ci0gICAgRlRfSW50ICAgICAgICAgIGNvdW50X3RvcCwgY291bnRfYm90OwotCi0KLSAgICBpZiAoIGZhbWlseSApCi0gICAgewotICAgICAgdG9wX3RhYmxlID0gJnRhcmdldC0+ZmFtaWx5X3RvcDsKLSAgICAgIGJvdF90YWJsZSA9ICZ0YXJnZXQtPmZhbWlseV9ib3R0b207Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0b3BfdGFibGUgPSAmdGFyZ2V0LT5ub3JtYWxfdG9wOwotICAgICAgYm90X3RhYmxlID0gJnRhcmdldC0+bm9ybWFsX2JvdHRvbTsKLSAgICB9Ci0KLSAgICAvKiByZWFkIHRoZSBpbnB1dCBibHVlIHpvbmVzLCBhbmQgYnVpbGQgdHdvIHNvcnRlZCB0YWJsZXMgICovCi0gICAgLyogKG9uZSBmb3IgdGhlIHRvcCB6b25lcywgdGhlIG90aGVyIGZvciB0aGUgYm90dG9tIHpvbmVzKSAqLwotICAgIHRvcF90YWJsZS0+Y291bnQgPSAwOwotICAgIGJvdF90YWJsZS0+Y291bnQgPSAwOwotCi0gICAgLyogZmlyc3QsIHRoZSBibHVlcyAqLwotICAgIHBzaF9ibHVlc19zZXRfem9uZXNfMCggdGFyZ2V0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGJsdWVzLCB0b3BfdGFibGUsIGJvdF90YWJsZSApOwotICAgIHBzaF9ibHVlc19zZXRfem9uZXNfMCggdGFyZ2V0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfb3RoZXJzLCBvdGhlcl9ibHVlcywgdG9wX3RhYmxlLCBib3RfdGFibGUgKTsKLQotICAgIGNvdW50X3RvcCA9IHRvcF90YWJsZS0+Y291bnQ7Ci0gICAgY291bnRfYm90ID0gYm90X3RhYmxlLT5jb3VudDsKLQotICAgIC8qIHNhbml0aXplIHRvcCB0YWJsZSAqLwotICAgIGlmICggY291bnRfdG9wID4gMCApCi0gICAgewotICAgICAgUFNIX0JsdWVfWm9uZSAgem9uZSA9IHRvcF90YWJsZS0+em9uZXM7Ci0KLQotICAgICAgZm9yICggY291bnQgPSBjb3VudF90b3A7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICBkZWx0YTsKLQotCi0gICAgICAgIGlmICggY291bnQgPiAxICkKLSAgICAgICAgewotICAgICAgICAgIGRlbHRhID0gem9uZVsxXS5vcmdfcmVmIC0gem9uZVswXS5vcmdfcmVmOwotICAgICAgICAgIGlmICggem9uZS0+b3JnX2RlbHRhID4gZGVsdGEgKQotICAgICAgICAgICAgem9uZS0+b3JnX2RlbHRhID0gZGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICB6b25lLT5vcmdfYm90dG9tID0gem9uZS0+b3JnX3JlZjsKLSAgICAgICAgem9uZS0+b3JnX3RvcCAgICA9IHpvbmUtPm9yZ19kZWx0YSArIHpvbmUtPm9yZ19yZWY7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogc2FuaXRpemUgYm90dG9tIHRhYmxlICovCi0gICAgaWYgKCBjb3VudF9ib3QgPiAwICkKLSAgICB7Ci0gICAgICBQU0hfQmx1ZV9ab25lICB6b25lID0gYm90X3RhYmxlLT56b25lczsKLQotCi0gICAgICBmb3IgKCBjb3VudCA9IGNvdW50X2JvdDsgY291bnQgPiAwOyBjb3VudC0tLCB6b25lKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGRlbHRhOwotCi0KLSAgICAgICAgaWYgKCBjb3VudCA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGEgPSB6b25lWzBdLm9yZ19yZWYgLSB6b25lWzFdLm9yZ19yZWY7Ci0gICAgICAgICAgaWYgKCB6b25lLT5vcmdfZGVsdGEgPCBkZWx0YSApCi0gICAgICAgICAgICB6b25lLT5vcmdfZGVsdGEgPSBkZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIHpvbmUtPm9yZ190b3AgICAgPSB6b25lLT5vcmdfcmVmOwotICAgICAgICB6b25lLT5vcmdfYm90dG9tID0gem9uZS0+b3JnX2RlbHRhICsgem9uZS0+b3JnX3JlZjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBleHBhbmQgdG9wIGFuZCBib3R0b20gdGFibGVzIHdpdGggYmx1ZSBmdXp6ICovCi0gICAgewotICAgICAgRlRfSW50ICAgICAgICAgZGltLCB0b3AsIGJvdCwgZGVsdGE7Ci0gICAgICBQU0hfQmx1ZV9ab25lICB6b25lOwotCi0KLSAgICAgIHpvbmUgID0gdG9wX3RhYmxlLT56b25lczsKLSAgICAgIGNvdW50ID0gY291bnRfdG9wOwotCi0gICAgICBmb3IgKCBkaW0gPSAxOyBkaW0gPj0gMDsgZGltLS0gKQotICAgICAgewotICAgICAgICBpZiAoIGNvdW50ID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBleHBhbmQgdGhlIGJvdHRvbSBvZiB0aGUgbG93ZXN0IHpvbmUgbm9ybWFsbHkgKi8KLSAgICAgICAgICB6b25lLT5vcmdfYm90dG9tIC09IGZ1eno7Ci0KLSAgICAgICAgICAvKiBleHBhbmQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIGludGVybWVkaWF0ZSB6b25lczsgICAgKi8KLSAgICAgICAgICAvKiBjaGVja2luZyB0aGF0IHRoZSBpbnRlcnZhbCBpcyBzbWFsbGVyIHRoYW4gdGhlIGZ1enogKi8KLSAgICAgICAgICB0b3AgPSB6b25lLT5vcmdfdG9wOwotCi0gICAgICAgICAgZm9yICggY291bnQtLTsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBib3QgICA9IHpvbmVbMV0ub3JnX2JvdHRvbTsKLSAgICAgICAgICAgIGRlbHRhID0gYm90IC0gdG9wOwotCi0gICAgICAgICAgICBpZiAoIGRlbHRhIDwgMiAqIGZ1enogKQotICAgICAgICAgICAgICB6b25lWzBdLm9yZ190b3AgPSB6b25lWzFdLm9yZ19ib3R0b20gPSB0b3AgKyBkZWx0YSAvIDI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHpvbmVbMF0ub3JnX3RvcCAgICA9IHRvcCArIGZ1eno7Ci0gICAgICAgICAgICAgIHpvbmVbMV0ub3JnX2JvdHRvbSA9IGJvdCAtIGZ1eno7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHpvbmUrKzsKLSAgICAgICAgICAgIHRvcCA9IHpvbmUtPm9yZ190b3A7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogZXhwYW5kIHRoZSB0b3Agb2YgdGhlIGhpZ2hlc3Qgem9uZSBub3JtYWxseSAqLwotICAgICAgICAgIHpvbmUtPm9yZ190b3AgPSB0b3AgKyBmdXp6OwotICAgICAgICB9Ci0gICAgICAgIHpvbmUgID0gYm90X3RhYmxlLT56b25lczsKLSAgICAgICAgY291bnQgPSBjb3VudF9ib3Q7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiByZXNldCB0aGUgYmx1ZXMgdGFibGUgd2hlbiB0aGUgZGV2aWNlIHRyYW5zZm9ybSBjaGFuZ2VzICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9ibHVlc19zY2FsZV96b25lcyggUFNIX0JsdWVzICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgIHNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgZGVsdGEgKQotICB7Ci0gICAgRlRfVUludCAgICAgICAgIGNvdW50OwotICAgIEZUX1VJbnQgICAgICAgICBudW07Ci0gICAgUFNIX0JsdWVfVGFibGUgIHRhYmxlID0gMDsKLQotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIERldGVybWluZSB3aGV0aGVyIHdlIG5lZWQgdG8gc3VwcHJlc3Mgb3ZlcnNob290cyBvciAgICAqLwotICAgIC8qIG5vdC4gIFdlIHNpbXBseSBuZWVkIHRvIGNvbXBhcmUgdGhlIHZlcnRpY2FsIHNjYWxlICAgICAqLwotICAgIC8qIHBhcmFtZXRlciB0byB0aGUgcmF3IGJsdWVzY2FsZSB2YWx1ZS4gIEhlcmUgaXMgd2h5OiAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgV2UgbmVlZCB0byBzdXBwcmVzcyBvdmVyc2hvb3RzIGZvciBhbGwgcG9pbnRzaXplcy4gICAqLwotICAgIC8qICAgQXQgMzAwZHBpIHRoYXQgc2F0aXNmaWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgcG9pbnRzaXplIDwgMjQwKmJsdWVzY2FsZSArIDAuNDkgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgVGhpcyBjb3JyZXNwb25kcyB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgcGl4ZWxzaXplIDwgMTAwMCpibHVlc2NhbGUgKyA0OS8yNCAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgc2NhbGUqRU1fU2l6ZSA8IDEwMDAqYmx1ZXNjYWxlICsgNDkvMjQgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgSG93ZXZlciwgZm9yIG5vcm1hbCBUeXBlIDEgZm9udHMsIEVNX1NpemUgaXMgMTAwMCEgICAqLwotICAgIC8qICAgV2UgdGh1cyBvbmx5IGNoZWNrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgc2NhbGUgPCBibHVlc2NhbGUgKyA0OS8yNDAwMCAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgd2hpY2ggd2Ugc2hvcnRlbiB0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgInNjYWxlIDwgYmx1ZXNjYWxlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE5vdGUgdGhhdCBgYmx1ZV9zY2FsZScgaXMgc3RvcmVkIDEwMDAgdGltZXMgaXRzIHJlYWwgICAqLwotICAgIC8qIHZhbHVlLCBhbmQgdGhhdCBgc2NhbGUnIGNvbnZlcnRzIGZyb20gZm9udCB1bml0cyB0byAgICAqLwotICAgIC8qIGZyYWN0aW9uYWwgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogMTAwMCAvIDY0ID0gMTI1IC8gOCAqLwotICAgIGlmICggc2NhbGUgPj0gMHgyMEM0OUJBTCApCi0gICAgICBibHVlcy0+bm9fb3ZlcnNob290cyA9IEZUX0JPT0woIHNjYWxlIDwgYmx1ZXMtPmJsdWVfc2NhbGUgKiA4IC8gMTI1ICk7Ci0gICAgZWxzZQotICAgICAgYmx1ZXMtPm5vX292ZXJzaG9vdHMgPSBGVF9CT09MKCBzY2FsZSAqIDEyNSA8IGJsdWVzLT5ibHVlX3NjYWxlICogOCApOwotCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIFRoZSBibHVlIHRocmVzaG9sZCBpcyB0aGUgZm9udCB1bml0cyBkaXN0YW5jZSB1bmRlciAgICovCi0gICAgLyogIHdoaWNoIG92ZXJzaG9vdHMgYXJlIHN1cHByZXNzZWQgZHVlIHRvIHRoZSBCbHVlU2hpZnQgICovCi0gICAgLyogIGV2ZW4gaWYgdGhlIHNjYWxlIGlzIGdyZWF0ZXIgdGhhbiBCbHVlU2NhbGUuICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIEl0IGlzIHRoZSBzbWFsbGVzdCBkaXN0YW5jZSBzdWNoIHRoYXQgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgZGlzdCA8PSBCbHVlU2hpZnQgJiYgZGlzdCpzY2FsZSA8PSAwLjUgcGl4ZWxzICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgRlRfSW50ICB0aHJlc2hvbGQgPSBibHVlcy0+Ymx1ZV9zaGlmdDsKLQotCi0gICAgICB3aGlsZSAoIHRocmVzaG9sZCA+IDAgJiYgRlRfTXVsRml4KCB0aHJlc2hvbGQsIHNjYWxlICkgPiAzMiApCi0gICAgICAgIHRocmVzaG9sZC0tOwotCi0gICAgICBibHVlcy0+Ymx1ZV90aHJlc2hvbGQgPSB0aHJlc2hvbGQ7Ci0gICAgfQotCi0gICAgZm9yICggbnVtID0gMDsgbnVtIDwgNDsgbnVtKysgKQotICAgIHsKLSAgICAgIFBTSF9CbHVlX1pvbmUgIHpvbmU7Ci0KLQotICAgICAgc3dpdGNoICggbnVtICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgdGFibGUgPSAmYmx1ZXMtPm5vcm1hbF90b3A7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxOgotICAgICAgICB0YWJsZSA9ICZibHVlcy0+bm9ybWFsX2JvdHRvbTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIHRhYmxlID0gJmJsdWVzLT5mYW1pbHlfdG9wOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRhYmxlID0gJmJsdWVzLT5mYW1pbHlfYm90dG9tOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgem9uZSAgPSB0YWJsZS0+em9uZXM7Ci0gICAgICBjb3VudCA9IHRhYmxlLT5jb3VudDsKLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB6b25lKysgKQotICAgICAgewotICAgICAgICB6b25lLT5jdXJfdG9wICAgID0gRlRfTXVsRml4KCB6b25lLT5vcmdfdG9wLCAgICBzY2FsZSApICsgZGVsdGE7Ci0gICAgICAgIHpvbmUtPmN1cl9ib3R0b20gPSBGVF9NdWxGaXgoIHpvbmUtPm9yZ19ib3R0b20sIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgICAgem9uZS0+Y3VyX3JlZiAgICA9IEZUX011bEZpeCggem9uZS0+b3JnX3JlZiwgICAgc2NhbGUgKSArIGRlbHRhOwotICAgICAgICB6b25lLT5jdXJfZGVsdGEgID0gRlRfTXVsRml4KCB6b25lLT5vcmdfZGVsdGEsICBzY2FsZSApOwotCi0gICAgICAgIC8qIHJvdW5kIHNjYWxlZCByZWZlcmVuY2UgcG9zaXRpb24gKi8KLSAgICAgICAgem9uZS0+Y3VyX3JlZiA9IEZUX1BJWF9ST1VORCggem9uZS0+Y3VyX3JlZiApOwotCi0jaWYgMAotICAgICAgICBpZiAoIHpvbmUtPmN1cl9yZWYgPiB6b25lLT5jdXJfdG9wICkKLSAgICAgICAgICB6b25lLT5jdXJfcmVmIC09IDY0OwotICAgICAgICBlbHNlIGlmICggem9uZS0+Y3VyX3JlZiA8IHpvbmUtPmN1cl9ib3R0b20gKQotICAgICAgICAgIHpvbmUtPmN1cl9yZWYgKz0gNjQ7Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwcm9jZXNzIHRoZSBmYW1pbGllcyBub3cgKi8KLQotICAgIGZvciAoIG51bSA9IDA7IG51bSA8IDI7IG51bSsrICkKLSAgICB7Ci0gICAgICBQU0hfQmx1ZV9ab25lICAgem9uZTEsIHpvbmUyOwotICAgICAgRlRfVUludCAgICAgICAgIGNvdW50MSwgY291bnQyOwotICAgICAgUFNIX0JsdWVfVGFibGUgIG5vcm1hbCwgZmFtaWx5OwotCi0KLSAgICAgIHN3aXRjaCAoIG51bSApCi0gICAgICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIG5vcm1hbCA9ICZibHVlcy0+bm9ybWFsX3RvcDsKLSAgICAgICAgZmFtaWx5ID0gJmJsdWVzLT5mYW1pbHlfdG9wOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgbm9ybWFsID0gJmJsdWVzLT5ub3JtYWxfYm90dG9tOwotICAgICAgICBmYW1pbHkgPSAmYmx1ZXMtPmZhbWlseV9ib3R0b207Ci0gICAgICB9Ci0KLSAgICAgIHpvbmUxICA9IG5vcm1hbC0+em9uZXM7Ci0gICAgICBjb3VudDEgPSBub3JtYWwtPmNvdW50OwotCi0gICAgICBmb3IgKCA7IGNvdW50MSA+IDA7IGNvdW50MS0tLCB6b25lMSsrICkKLSAgICAgIHsKLSAgICAgICAgLyogdHJ5IHRvIGZpbmQgYSBmYW1pbHkgem9uZSB3aG9zZSByZWZlcmVuY2UgcG9zaXRpb24gaXMgbGVzcyAqLwotICAgICAgICAvKiB0aGFuIDEgcGl4ZWwgZmFyIGZyb20gdGhlIGN1cnJlbnQgem9uZSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHpvbmUyICA9IGZhbWlseS0+em9uZXM7Ci0gICAgICAgIGNvdW50MiA9IGZhbWlseS0+Y291bnQ7Ci0KLSAgICAgICAgZm9yICggOyBjb3VudDIgPiAwOyBjb3VudDItLSwgem9uZTIrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgIERlbHRhOwotCi0KLSAgICAgICAgICBEZWx0YSA9IHpvbmUxLT5vcmdfcmVmIC0gem9uZTItPm9yZ19yZWY7Ci0gICAgICAgICAgaWYgKCBEZWx0YSA8IDAgKQotICAgICAgICAgICAgRGVsdGEgPSAtRGVsdGE7Ci0KLSAgICAgICAgICBpZiAoIEZUX011bEZpeCggRGVsdGEsIHNjYWxlICkgPCA2NCApCi0gICAgICAgICAgewotICAgICAgICAgICAgem9uZTEtPmN1cl90b3AgICAgPSB6b25lMi0+Y3VyX3RvcDsKLSAgICAgICAgICAgIHpvbmUxLT5jdXJfYm90dG9tID0gem9uZTItPmN1cl9ib3R0b207Ci0gICAgICAgICAgICB6b25lMS0+Y3VyX3JlZiAgICA9IHpvbmUyLT5jdXJfcmVmOwotICAgICAgICAgICAgem9uZTEtPmN1cl9kZWx0YSAgPSB6b25lMi0+Y3VyX2RlbHRhOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc2hfYmx1ZXNfc25hcF9zdGVtKCBQU0hfQmx1ZXMgICAgICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgc3RlbV90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIHN0ZW1fYm90LAotICAgICAgICAgICAgICAgICAgICAgICBQU0hfQWxpZ25tZW50ICBhbGlnbm1lbnQgKQotICB7Ci0gICAgUFNIX0JsdWVfVGFibGUgIHRhYmxlOwotICAgIEZUX1VJbnQgICAgICAgICBjb3VudDsKLSAgICBGVF9Qb3MgICAgICAgICAgZGVsdGE7Ci0gICAgUFNIX0JsdWVfWm9uZSAgIHpvbmU7Ci0gICAgRlRfSW50ICAgICAgICAgIG5vX3Nob290czsKLQotCi0gICAgYWxpZ25tZW50LT5hbGlnbiA9IFBTSF9CTFVFX0FMSUdOX05PTkU7Ci0KLSAgICBub19zaG9vdHMgPSBibHVlcy0+bm9fb3ZlcnNob290czsKLQotICAgIC8qIGxvb2sgdXAgc3RlbSB0b3AgaW4gdG9wIHpvbmVzIHRhYmxlICovCi0gICAgdGFibGUgPSAmYmx1ZXMtPm5vcm1hbF90b3A7Ci0gICAgY291bnQgPSB0YWJsZS0+Y291bnQ7Ci0gICAgem9uZSAgPSB0YWJsZS0+em9uZXM7Ci0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKLSAgICB7Ci0gICAgICBkZWx0YSA9IHN0ZW1fdG9wIC0gem9uZS0+b3JnX2JvdHRvbTsKLSAgICAgIGlmICggZGVsdGEgPCAtYmx1ZXMtPmJsdWVfZnV6eiApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIHN0ZW1fdG9wIDw9IHpvbmUtPm9yZ190b3AgKyBibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBub19zaG9vdHMgfHwgZGVsdGEgPD0gYmx1ZXMtPmJsdWVfdGhyZXNob2xkICkKLSAgICAgICAgewotICAgICAgICAgIGFsaWdubWVudC0+YWxpZ24gICAgfD0gUFNIX0JMVUVfQUxJR05fVE9QOwotICAgICAgICAgIGFsaWdubWVudC0+YWxpZ25fdG9wID0gem9uZS0+Y3VyX3JlZjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBsb29rIHVwIHN0ZW0gYm90dG9tIGluIGJvdHRvbSB6b25lcyB0YWJsZSAqLwotICAgIHRhYmxlID0gJmJsdWVzLT5ub3JtYWxfYm90dG9tOwotICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwotICAgIHpvbmUgID0gdGFibGUtPnpvbmVzICsgY291bnQtMTsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB6b25lLS0gKQotICAgIHsKLSAgICAgIGRlbHRhID0gem9uZS0+b3JnX3RvcCAtIHN0ZW1fYm90OwotICAgICAgaWYgKCBkZWx0YSA8IC1ibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggc3RlbV9ib3QgPj0gem9uZS0+b3JnX2JvdHRvbSAtIGJsdWVzLT5ibHVlX2Z1enogKQotICAgICAgewotICAgICAgICBpZiAoIG5vX3Nob290cyB8fCBkZWx0YSA8IGJsdWVzLT5ibHVlX3RocmVzaG9sZCApCi0gICAgICAgIHsKLSAgICAgICAgICBhbGlnbm1lbnQtPmFsaWduICAgIHw9IFBTSF9CTFVFX0FMSUdOX0JPVDsKLSAgICAgICAgICBhbGlnbm1lbnQtPmFsaWduX2JvdCA9IHpvbmUtPmN1cl9yZWY7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUwgSElOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBwc2hfZ2xvYmFsc19kZXN0cm95KCBQU0hfR2xvYmFscyAgZ2xvYmFscyApCi0gIHsKLSAgICBpZiAoIGdsb2JhbHMgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICAgIG1lbW9yeSA9IGdsb2JhbHMtPm1lbW9yeTsKLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblswXS5zdGR3LmNvdW50ID0gMDsKLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblsxXS5zdGR3LmNvdW50ID0gMDsKLQotICAgICAgZ2xvYmFscy0+Ymx1ZXMubm9ybWFsX3RvcC5jb3VudCAgICA9IDA7Ci0gICAgICBnbG9iYWxzLT5ibHVlcy5ub3JtYWxfYm90dG9tLmNvdW50ID0gMDsKLSAgICAgIGdsb2JhbHMtPmJsdWVzLmZhbWlseV90b3AuY291bnQgICAgPSAwOwotICAgICAgZ2xvYmFscy0+Ymx1ZXMuZmFtaWx5X2JvdHRvbS5jb3VudCA9IDA7Ci0KLSAgICAgIEZUX0ZSRUUoIGdsb2JhbHMgKTsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgICAgcHNfZGVidWdfZ2xvYmFscyA9IDA7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc2hfZ2xvYmFsc19uZXcoIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIFQxX1ByaXZhdGUqICAgcHJpdiwKLSAgICAgICAgICAgICAgICAgICBQU0hfR2xvYmFscyAgKmFnbG9iYWxzICkKLSAgewotICAgIFBTSF9HbG9iYWxzICBnbG9iYWxzOwotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhRlRfTkVXKCBnbG9iYWxzICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgY291bnQ7Ci0gICAgICBGVF9TaG9ydCogIHJlYWQ7Ci0KLQotICAgICAgZ2xvYmFscy0+bWVtb3J5ID0gbWVtb3J5OwotCi0gICAgICAvKiBjb3B5IHN0YW5kYXJkIHdpZHRocyAqLwotICAgICAgewotICAgICAgICBQU0hfRGltZW5zaW9uICBkaW0gICA9ICZnbG9iYWxzLT5kaW1lbnNpb25bMV07Ci0gICAgICAgIFBTSF9XaWR0aCAgICAgIHdyaXRlID0gZGltLT5zdGR3LndpZHRoczsKLQotCi0gICAgICAgIHdyaXRlLT5vcmcgPSBwcml2LT5zdGFuZGFyZF93aWR0aFswXTsKLSAgICAgICAgd3JpdGUrKzsKLQotICAgICAgICByZWFkID0gcHJpdi0+c25hcF93aWR0aHM7Ci0gICAgICAgIGZvciAoIGNvdW50ID0gcHJpdi0+bnVtX3NuYXBfd2lkdGhzOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGUtPm9yZyA9ICpyZWFkOwotICAgICAgICAgIHdyaXRlKys7Ci0gICAgICAgICAgcmVhZCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGltLT5zdGR3LmNvdW50ID0gcHJpdi0+bnVtX3NuYXBfd2lkdGhzICsgMTsKLSAgICAgIH0KLQotICAgICAgLyogY29weSBzdGFuZGFyZCBoZWlnaHRzICovCi0gICAgICB7Ci0gICAgICAgIFBTSF9EaW1lbnNpb24gIGRpbSA9ICZnbG9iYWxzLT5kaW1lbnNpb25bMF07Ci0gICAgICAgIFBTSF9XaWR0aCAgICAgIHdyaXRlID0gZGltLT5zdGR3LndpZHRoczsKLQotCi0gICAgICAgIHdyaXRlLT5vcmcgPSBwcml2LT5zdGFuZGFyZF9oZWlnaHRbMF07Ci0gICAgICAgIHdyaXRlKys7Ci0gICAgICAgIHJlYWQgPSBwcml2LT5zbmFwX2hlaWdodHM7Ci0gICAgICAgIGZvciAoIGNvdW50ID0gcHJpdi0+bnVtX3NuYXBfaGVpZ2h0czsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgICAgewotICAgICAgICAgIHdyaXRlLT5vcmcgPSAqcmVhZDsKLSAgICAgICAgICB3cml0ZSsrOwotICAgICAgICAgIHJlYWQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGRpbS0+c3Rkdy5jb3VudCA9IHByaXYtPm51bV9zbmFwX2hlaWdodHMgKyAxOwotICAgICAgfQotCi0gICAgICAvKiBjb3B5IGJsdWUgem9uZXMgKi8KLSAgICAgIHBzaF9ibHVlc19zZXRfem9uZXMoICZnbG9iYWxzLT5ibHVlcywgcHJpdi0+bnVtX2JsdWVfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+Ymx1ZV92YWx1ZXMsIHByaXYtPm51bV9vdGhlcl9ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPm90aGVyX2JsdWVzLCBwcml2LT5ibHVlX2Z1enosIDAgKTsKLQotICAgICAgcHNoX2JsdWVzX3NldF96b25lcyggJmdsb2JhbHMtPmJsdWVzLCBwcml2LT5udW1fZmFtaWx5X2JsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+ZmFtaWx5X2JsdWVzLCBwcml2LT5udW1fZmFtaWx5X290aGVyX2JsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+ZmFtaWx5X290aGVyX2JsdWVzLCBwcml2LT5ibHVlX2Z1enosIDEgKTsKLQotICAgICAgZ2xvYmFscy0+Ymx1ZXMuYmx1ZV9zY2FsZSA9IHByaXYtPmJsdWVfc2NhbGU7Ci0gICAgICBnbG9iYWxzLT5ibHVlcy5ibHVlX3NoaWZ0ID0gcHJpdi0+Ymx1ZV9zaGlmdDsKLSAgICAgIGdsb2JhbHMtPmJsdWVzLmJsdWVfZnV6eiAgPSBwcml2LT5ibHVlX2Z1eno7Ci0KLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblswXS5zY2FsZV9tdWx0ICA9IDA7Ci0gICAgICBnbG9iYWxzLT5kaW1lbnNpb25bMF0uc2NhbGVfZGVsdGEgPSAwOwotICAgICAgZ2xvYmFscy0+ZGltZW5zaW9uWzFdLnNjYWxlX211bHQgID0gMDsKLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblsxXS5zY2FsZV9kZWx0YSA9IDA7Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgICAgIHBzX2RlYnVnX2dsb2JhbHMgPSBnbG9iYWxzOwotI2VuZGlmCi0gICAgfQotCi0gICAgKmFnbG9iYWxzID0gZ2xvYmFsczsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwc2hfZ2xvYmFsc19zZXRfc2NhbGUoIFBTSF9HbG9iYWxzICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X2RlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X2RlbHRhICkKLSAgewotICAgIFBTSF9EaW1lbnNpb24gIGRpbSA9ICZnbG9iYWxzLT5kaW1lbnNpb25bMF07Ci0KLQotICAgIGRpbSA9ICZnbG9iYWxzLT5kaW1lbnNpb25bMF07Ci0gICAgaWYgKCB4X3NjYWxlICE9IGRpbS0+c2NhbGVfbXVsdCAgfHwKLSAgICAgICAgIHhfZGVsdGEgIT0gZGltLT5zY2FsZV9kZWx0YSApCi0gICAgewotICAgICAgZGltLT5zY2FsZV9tdWx0ICA9IHhfc2NhbGU7Ci0gICAgICBkaW0tPnNjYWxlX2RlbHRhID0geF9kZWx0YTsKLQotICAgICAgcHNoX2dsb2JhbHNfc2NhbGVfd2lkdGhzKCBnbG9iYWxzLCAwICk7Ci0gICAgfQotCi0gICAgZGltID0gJmdsb2JhbHMtPmRpbWVuc2lvblsxXTsKLSAgICBpZiAoIHlfc2NhbGUgIT0gZGltLT5zY2FsZV9tdWx0ICB8fAotICAgICAgICAgeV9kZWx0YSAhPSBkaW0tPnNjYWxlX2RlbHRhICkKLSAgICB7Ci0gICAgICBkaW0tPnNjYWxlX211bHQgID0geV9zY2FsZTsKLSAgICAgIGRpbS0+c2NhbGVfZGVsdGEgPSB5X2RlbHRhOwotCi0gICAgICBwc2hfZ2xvYmFsc19zY2FsZV93aWR0aHMoIGdsb2JhbHMsIDEgKTsKLSAgICAgIHBzaF9ibHVlc19zY2FsZV96b25lcyggJmdsb2JhbHMtPmJsdWVzLCB5X3NjYWxlLCB5X2RlbHRhICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzaF9nbG9iYWxzX2Z1bmNzX2luaXQoIFBTSF9HbG9iYWxzX0Z1bmNzUmVjKiAgZnVuY3MgKQotICB7Ci0gICAgZnVuY3MtPmNyZWF0ZSAgICA9IHBzaF9nbG9iYWxzX25ldzsKLSAgICBmdW5jcy0+c2V0X3NjYWxlID0gcHNoX2dsb2JhbHNfc2V0X3NjYWxlOwotICAgIGZ1bmNzLT5kZXN0cm95ICAgPSBwc2hfZ2xvYmFsc19kZXN0cm95OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5oIGIvc3JjL3BzaGludGVyL3BzaGdsb2IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxMTYyNi4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaGdsb2IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IGhpbnRlciBnbG9iYWwgaGludGluZyBtYW5hZ2VtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTSEdMT0JfSF9fCi0jZGVmaW5lIF9fUFNIR0xPQl9IX18KLQotCi0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgR0xPQkFMIEhJTlRTIElOVEVSTkFMUyAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBAY29uc3RhbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfR0xPQkFMU19NQVhfQkxVRV9aT05FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBAZGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJsdWUgem9uZXMgaW4gYSBmb250IGdsb2JhbCBoaW50cyBzdHJ1Y3R1cmUuICovCi0gIC8qICAgIFNlZSBAUFNfR2xvYmFsc19CbHVlc1JlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUFNfR0xPQkFMU19NQVhfQkxVRV9aT05FUyAgMTYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQGNvbnN0YW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0dMT0JBTFNfTUFYX1NURF9XSURUSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQGRlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFuZGFyZCBhbmQgc25hcCB3aWR0aHMgaW4gZWl0aGVyIHRoZSAgICAgICAqLwotICAvKiAgICBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGRpcmVjdGlvbi4gIFNlZSBAUFNfR2xvYmFsc19XaWR0aHNSZWMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBTX0dMT0JBTFNfTUFYX1NURF9XSURUSFMgIDE2Ci0KLQotICAvKiBzdGFuZGFyZCBhbmQgc25hcCB3aWR0aCAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNIX1dpZHRoUmVjXwotICB7Ci0gICAgRlRfSW50ICBvcmc7Ci0gICAgRlRfUG9zICBjdXI7Ci0gICAgRlRfUG9zICBmaXQ7Ci0KLSAgfSBQU0hfV2lkdGhSZWMsICpQU0hfV2lkdGg7Ci0KLQotICAvKiBzdGFuZGFyZCBhbmQgc25hcCB3aWR0aHMgdGFibGUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9XaWR0aHNSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgIGNvdW50OwotICAgIFBTSF9XaWR0aFJlYyAgd2lkdGhzW1BTX0dMT0JBTFNfTUFYX1NURF9XSURUSFNdOwotCi0gIH0gUFNIX1dpZHRoc1JlYywgKlBTSF9XaWR0aHM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0RpbWVuc2lvblJlY18KLSAgewotICAgIFBTSF9XaWR0aHNSZWMgIHN0ZHc7Ci0gICAgRlRfRml4ZWQgICAgICAgc2NhbGVfbXVsdDsKLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZV9kZWx0YTsKLQotICB9IFBTSF9EaW1lbnNpb25SZWMsICpQU0hfRGltZW5zaW9uOwotCi0KLSAgLyogYmx1ZSB6b25lIGRlc2NyaXB0b3IgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9CbHVlX1pvbmVSZWNfCi0gIHsKLSAgICBGVF9JbnQgIG9yZ19yZWY7Ci0gICAgRlRfSW50ICBvcmdfZGVsdGE7Ci0gICAgRlRfSW50ICBvcmdfdG9wOwotICAgIEZUX0ludCAgb3JnX2JvdHRvbTsKLQotICAgIEZUX1BvcyAgY3VyX3JlZjsKLSAgICBGVF9Qb3MgIGN1cl9kZWx0YTsKLSAgICBGVF9Qb3MgIGN1cl9ib3R0b207Ci0gICAgRlRfUG9zICBjdXJfdG9wOwotCi0gIH0gUFNIX0JsdWVfWm9uZVJlYywgKlBTSF9CbHVlX1pvbmU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0JsdWVfVGFibGVSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgICBjb3VudDsKLSAgICBQU0hfQmx1ZV9ab25lUmVjICB6b25lc1tQU19HTE9CQUxTX01BWF9CTFVFX1pPTkVTXTsKLQotICB9IFBTSF9CbHVlX1RhYmxlUmVjLCAqUFNIX0JsdWVfVGFibGU7Ci0KLQotICAvKiBibHVlIHpvbmVzIHRhYmxlICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfQmx1ZXNSZWNfCi0gIHsKLSAgICBQU0hfQmx1ZV9UYWJsZVJlYyAgbm9ybWFsX3RvcDsKLSAgICBQU0hfQmx1ZV9UYWJsZVJlYyAgbm9ybWFsX2JvdHRvbTsKLSAgICBQU0hfQmx1ZV9UYWJsZVJlYyAgZmFtaWx5X3RvcDsKLSAgICBQU0hfQmx1ZV9UYWJsZVJlYyAgZmFtaWx5X2JvdHRvbTsKLQotICAgIEZUX0ZpeGVkICAgICAgICAgICBibHVlX3NjYWxlOwotICAgIEZUX0ludCAgICAgICAgICAgICBibHVlX3NoaWZ0OwotICAgIEZUX0ludCAgICAgICAgICAgICBibHVlX3RocmVzaG9sZDsKLSAgICBGVF9JbnQgICAgICAgICAgICAgYmx1ZV9mdXp6OwotICAgIEZUX0Jvb2wgICAgICAgICAgICBub19vdmVyc2hvb3RzOwotCi0gIH0gUFNIX0JsdWVzUmVjLCAqUFNIX0JsdWVzOwotCi0KLSAgLyogZm9udCBnbG9iYWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogZGltZW5zaW9uIDAgPT4gWCBjb29yZGluYXRlcyArIHZlcnRpY2FsIGhpbnRzL3N0ZW1zICAgKi8KLSAgLyogZGltZW5zaW9uIDEgPT4gWSBjb29yZGluYXRlcyArIGhvcml6b250YWwgaGludHMvc3RlbXMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9HbG9iYWxzUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5OwotICAgIFBTSF9EaW1lbnNpb25SZWMgIGRpbWVuc2lvblsyXTsKLSAgICBQU0hfQmx1ZXNSZWMgICAgICBibHVlczsKLQotICB9IFBTSF9HbG9iYWxzUmVjOwotCi0KLSNkZWZpbmUgUFNIX0JMVUVfQUxJR05fTk9ORSAgMAotI2RlZmluZSBQU0hfQkxVRV9BTElHTl9UT1AgICAxCi0jZGVmaW5lIFBTSF9CTFVFX0FMSUdOX0JPVCAgIDIKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfQWxpZ25tZW50UmVjXwotICB7Ci0gICAgaW50ICAgICBhbGlnbjsKLSAgICBGVF9Qb3MgIGFsaWduX3RvcDsKLSAgICBGVF9Qb3MgIGFsaWduX2JvdDsKLQotICB9IFBTSF9BbGlnbm1lbnRSZWMsICpQU0hfQWxpZ25tZW50OwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc2hfZ2xvYmFsc19mdW5jc19pbml0KCBQU0hfR2xvYmFsc19GdW5jc1JlYyogIGZ1bmNzICk7Ci0KLQotI2lmIDAKLSAgLyogc25hcCBhIHN0ZW0gd2lkdGggdG8gZml0dGVyIGNvb3JkaW5hdGVzLiAgYG9yZ193aWR0aCcgaXMgaW4gZm9udCAqLwotICAvKiB1bml0cy4gIFRoZSByZXN1bHQgaXMgaW4gZGV2aWNlIHBpeGVscyAoMjYuNiBmb3JtYXQpLiAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMKCBGVF9Qb3MgKQotICBwc2hfZGltZW5zaW9uX3NuYXBfd2lkdGgoIFBTSF9EaW1lbnNpb24gIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBvcmdfd2lkdGggKTsKLSNlbmRpZgotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBzaF9nbG9iYWxzX3NldF9zY2FsZSggUFNIX0dsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHhfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHlfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHhfZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHlfZGVsdGEgKTsKLQotICAvKiBzbmFwIGEgc3RlbSB0byBvbmUgb3IgdHdvIGJsdWUgem9uZXMgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc2hfYmx1ZXNfc25hcF9zdGVtKCBQU0hfQmx1ZXMgICAgICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgc3RlbV90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIHN0ZW1fYm90LAotICAgICAgICAgICAgICAgICAgICAgICBQU0hfQWxpZ25tZW50ICBhbGlnbm1lbnQgKTsKLSAgLyogKi8KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICBleHRlcm4gUFNIX0dsb2JhbHMgIHBzX2RlYnVnX2dsb2JhbHM7Ci0jZW5kaWYKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fUFNIR0xPQl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jIGIvc3JjL3BzaGludGVyL3BzaGludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlM2YxOTMuLjAwMDAwMDAKLS0tIGEvc3JjL3BzaGludGVyL3BzaGludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hpbnRlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUG9zdFNjcmlwdCBIaW50aW5nIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEsIDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJwc2hyZWMuYyIKLSNpbmNsdWRlICJwc2hnbG9iLmMiCi0jaW5jbHVkZSAicHNoYWxnby5jIgotI2luY2x1ZGUgInBzaG1vZC5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaG1vZC5jIGIvc3JjL3BzaGludGVyL3BzaG1vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWIzZDkxLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9wc2htb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2htb2QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUG9zdFNjcmlwdCBoaW50ZXIgbW9kdWxlIGltcGxlbWVudGF0aW9uIChib2R5KS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAicHNocmVjLmgiCi0jaW5jbHVkZSAicHNoYWxnby5oIgotCi0KLSAgLyogdGhlIFBvc3RzY3JpcHQgSGludGVyIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0hpbnRlcl9Nb2R1bGVfUmVjXwotICB7Ci0gICAgRlRfTW9kdWxlUmVjICAgICAgICAgIHJvb3Q7Ci0gICAgUFNfSGludHNSZWMgICAgICAgICAgIHBzX2hpbnRzOwotCi0gICAgUFNIX0dsb2JhbHNfRnVuY3NSZWMgIGdsb2JhbHNfZnVuY3M7Ci0gICAgVDFfSGludHNfRnVuY3NSZWMgICAgIHQxX2Z1bmNzOwotICAgIFQyX0hpbnRzX0Z1bmNzUmVjICAgICB0Ml9mdW5jczsKLQotICB9IFBTX0hpbnRlcl9Nb2R1bGVSZWMsICpQU19IaW50ZXJfTW9kdWxlOwotCi0KLSAgLyogZmluYWxpemUgbW9kdWxlICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHBzX2hpbnRlcl9kb25lKCBQU19IaW50ZXJfTW9kdWxlICBtb2R1bGUgKQotICB7Ci0gICAgbW9kdWxlLT50MV9mdW5jcy5oaW50cyA9IE5VTEw7Ci0gICAgbW9kdWxlLT50Ml9mdW5jcy5oaW50cyA9IE5VTEw7Ci0KLSAgICBwc19oaW50c19kb25lKCAmbW9kdWxlLT5wc19oaW50cyApOwotICB9Ci0KLQotICAvKiBpbml0aWFsaXplIG1vZHVsZSwgY3JlYXRlIGhpbnRzIHJlY29yZGVyIGFuZCB0aGUgaW50ZXJmYWNlICovCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBwc19oaW50ZXJfaW5pdCggUFNfSGludGVyX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbW9kdWxlLT5yb290Lm1lbW9yeTsKLSAgICB2b2lkKiAgICAgIHBoICAgICA9ICZtb2R1bGUtPnBzX2hpbnRzOwotCi0KLSAgICBwc19oaW50c19pbml0KCAmbW9kdWxlLT5wc19oaW50cywgbWVtb3J5ICk7Ci0KLSAgICBwc2hfZ2xvYmFsc19mdW5jc19pbml0KCAmbW9kdWxlLT5nbG9iYWxzX2Z1bmNzICk7Ci0KLSAgICB0MV9oaW50c19mdW5jc19pbml0KCAmbW9kdWxlLT50MV9mdW5jcyApOwotICAgIG1vZHVsZS0+dDFfZnVuY3MuaGludHMgPSAoVDFfSGludHMpcGg7Ci0KLSAgICB0Ml9oaW50c19mdW5jc19pbml0KCAmbW9kdWxlLT50Ml9mdW5jcyApOwotICAgIG1vZHVsZS0+dDJfZnVuY3MuaGludHMgPSAoVDJfSGludHMpcGg7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogcmV0dXJucyBnbG9iYWwgaGludHMgaW50ZXJmYWNlICovCi0gIEZUX0NBTExCQUNLX0RFRiggUFNIX0dsb2JhbHNfRnVuY3MgKQotICBwc2hpbnRlcl9nZXRfZ2xvYmFsc19mdW5jcyggRlRfTW9kdWxlICBtb2R1bGUgKQotICB7Ci0gICAgcmV0dXJuICYoKFBTX0hpbnRlcl9Nb2R1bGUpbW9kdWxlKS0+Z2xvYmFsc19mdW5jczsKLSAgfQotCi0KLSAgLyogcmV0dXJuIFR5cGUgMSBoaW50cyBpbnRlcmZhY2UgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBUMV9IaW50c19GdW5jcyApCi0gIHBzaGludGVyX2dldF90MV9mdW5jcyggRlRfTW9kdWxlICBtb2R1bGUgKQotICB7Ci0gICAgcmV0dXJuICYoKFBTX0hpbnRlcl9Nb2R1bGUpbW9kdWxlKS0+dDFfZnVuY3M7Ci0gIH0KLQotCi0gIC8qIHJldHVybiBUeXBlIDIgaGludHMgaW50ZXJmYWNlICovCi0gIEZUX0NBTExCQUNLX0RFRiggVDJfSGludHNfRnVuY3MgKQotICBwc2hpbnRlcl9nZXRfdDJfZnVuY3MoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIHJldHVybiAmKChQU19IaW50ZXJfTW9kdWxlKW1vZHVsZSktPnQyX2Z1bmNzOwotICB9Ci0KLQotICBzdGF0aWMKLSAgY29uc3QgUFNIaW50ZXJfSW50ZXJmYWNlICBwc2hpbnRlcl9pbnRlcmZhY2UgPQotICB7Ci0gICAgcHNoaW50ZXJfZ2V0X2dsb2JhbHNfZnVuY3MsCi0gICAgcHNoaW50ZXJfZ2V0X3QxX2Z1bmNzLAotICAgIHBzaGludGVyX2dldF90Ml9mdW5jcwotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX01vZHVsZV9DbGFzcyAgcHNoaW50ZXJfbW9kdWxlX2NsYXNzID0KLSAgewotICAgIDAsCi0gICAgc2l6ZW9mICggUFNfSGludGVyX01vZHVsZVJlYyApLAotICAgICJwc2hpbnRlciIsCi0gICAgMHgxMDAwMEwsCi0gICAgMHgyMDAwMEwsCi0KLSAgICAmcHNoaW50ZXJfaW50ZXJmYWNlLCAgICAgICAgICAgIC8qIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpcHNfaGludGVyX2luaXQsCi0gICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSBwc19oaW50ZXJfZG9uZSwKLSAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIDAgICAgICAgIC8qIG5vIGFkZGl0aW9uYWwgaW50ZXJmYWNlIGZvciBub3cgKi8KLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2htb2QuaCBiL3NyYy9wc2hpbnRlci9wc2htb2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5MTAyNS4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNobW9kLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2htb2QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBoaW50ZXIgbW9kdWxlIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU0hNT0RfSF9fCi0jZGVmaW5lIF9fUFNITU9EX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX01vZHVsZV9DbGFzcyApICBwc2hpbnRlcl9tb2R1bGVfY2xhc3M7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1BTSE1PRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hudGVyci5oIGIvc3JjL3BzaGludGVyL3BzaG50ZXJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMDAyOWYuLjAwMDAwMDAKLS0tIGEvc3JjL3BzaGludGVyL3BzaG50ZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hudGVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUFMgSGludGVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTSGludGVyIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fUFNITlRFUlJfSF9fCi0jZGVmaW5lIF9fUFNITlRFUlJfSF9fCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgX19GVEVSUk9SU19IX18KLQotI2RlZmluZSBGVF9FUlJfUFJFRklYICBQU0hfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1BTaGludGVyCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX1BTSE5URVJSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaHJlYy5jIGIvc3JjL3BzaGludGVyL3BzaHJlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTg4NWVmLi4wMDAwMDAwCi0tLSBhL3NyYy9wc2hpbnRlci9wc2hyZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNocmVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBvc3RTY3JpcHQgaGludHMgcmVjb3JkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgInBzaHJlYy5oIgotI2luY2x1ZGUgInBzaGFsZ28uaCIKLQotI2luY2x1ZGUgInBzaG50ZXJyLmgiCi0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcHNocmVjCi0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgUFNfSGludHMgIHBzX2RlYnVnX2hpbnRzICAgICAgICAgPSAwOwotICBpbnQgICAgICAgcHNfZGVidWdfbm9faG9yel9oaW50cyA9IDA7Ci0gIGludCAgICAgICBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzID0gMDsKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIFBTX0hJTlQgTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogZGVzdHJveSBoaW50cyB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc19oaW50X3RhYmxlX2RvbmUoIFBTX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9GUkVFKCB0YWJsZS0+aGludHMgKTsKLSAgICB0YWJsZS0+bnVtX2hpbnRzID0gMDsKLSAgICB0YWJsZS0+bWF4X2hpbnRzID0gMDsKLSAgfQotCi0KLSAgLyogZW5zdXJlIHRoYXQgYSB0YWJsZSBjYW4gY29udGFpbiAiY291bnQiIGVsZW1lbnRzICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19oaW50X3RhYmxlX2Vuc3VyZSggUFNfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9VSW50ICAgb2xkX21heCA9IHRhYmxlLT5tYXhfaGludHM7Ci0gICAgRlRfVUludCAgIG5ld19tYXggPSBjb3VudDsKLSAgICBGVF9FcnJvciAgZXJyb3IgICA9IDA7Ci0KLQotICAgIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIC8qIHRyeSB0byBncm93IHRoZSB0YWJsZSAqLwotICAgICAgbmV3X21heCA9IEZUX1BBRF9DRUlMKCBuZXdfbWF4LCA4ICk7Ci0gICAgICBpZiAoICFGVF9SRU5FV19BUlJBWSggdGFibGUtPmhpbnRzLCBvbGRfbWF4LCBuZXdfbWF4ICkgKQotICAgICAgICB0YWJsZS0+bWF4X2hpbnRzID0gbmV3X21heDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfaGludF90YWJsZV9hbGxvYyggUFNfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfSGludCAgICAgICAqYWhpbnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gMDsKLSAgICBGVF9VSW50ICAgY291bnQ7Ci0gICAgUFNfSGludCAgIGhpbnQgPSAwOwotCi0KLSAgICBjb3VudCA9IHRhYmxlLT5udW1faGludHM7Ci0gICAgY291bnQrKzsKLQotICAgIGlmICggY291bnQgPj0gdGFibGUtPm1heF9oaW50cyApCi0gICAgewotICAgICAgZXJyb3IgPSBwc19oaW50X3RhYmxlX2Vuc3VyZSggdGFibGUsIGNvdW50LCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaGludCAgICAgICAgPSB0YWJsZS0+aGludHMgKyBjb3VudCAtIDE7Ci0gICAgaGludC0+cG9zICAgPSAwOwotICAgIGhpbnQtPmxlbiAgID0gMDsKLSAgICBoaW50LT5mbGFncyA9IDA7Ci0KLSAgICB0YWJsZS0+bnVtX2hpbnRzID0gY291bnQ7Ci0KLSAgRXhpdDoKLSAgICAqYWhpbnQgPSBoaW50OwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIFBTX01BU0sgTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogZGVzdHJveSBtYXNrICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzX21hc2tfZG9uZSggUFNfTWFzayAgICBtYXNrLAotICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX0ZSRUUoIG1hc2stPmJ5dGVzICk7Ci0gICAgbWFzay0+bnVtX2JpdHMgID0gMDsKLSAgICBtYXNrLT5tYXhfYml0cyAgPSAwOwotICAgIG1hc2stPmVuZF9wb2ludCA9IDA7Ci0gIH0KLQotCi0gIC8qIGVuc3VyZSB0aGF0IGEgbWFzayBjYW4gY29udGFpbiAiY291bnQiIGJpdHMgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX21hc2tfZW5zdXJlKCBQU19NYXNrICAgIG1hc2ssCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfVUludCAgIG9sZF9tYXggPSAoIG1hc2stPm1heF9iaXRzICsgNyApID4+IDM7Ci0gICAgRlRfVUludCAgIG5ld19tYXggPSAoIGNvdW50ICAgICAgICAgICsgNyApID4+IDM7Ci0gICAgRlRfRXJyb3IgIGVycm9yICAgPSAwOwotCi0KLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDggKTsKLSAgICAgIGlmICggIUZUX1JFTkVXX0FSUkFZKCBtYXNrLT5ieXRlcywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgbWFzay0+bWF4X2JpdHMgPSBuZXdfbWF4ICogODsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiB0ZXN0IGEgYml0IHZhbHVlIGluIGEgZ2l2ZW4gbWFzayAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHBzX21hc2tfdGVzdF9iaXQoIFBTX01hc2sgIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludCAgIGlkeCApCi0gIHsKLSAgICBpZiAoIChGVF9VSW50KWlkeCA+PSBtYXNrLT5udW1fYml0cyApCi0gICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBtYXNrLT5ieXRlc1tpZHggPj4gM10gJiAoIDB4ODAgPj4gKCBpZHggJiA3ICkgKTsKLSAgfQotCi0KLSAgLyogY2xlYXIgYSBnaXZlbiBiaXQgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfbWFza19jbGVhcl9iaXQoIFBTX01hc2sgIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICBpZHggKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0KLQotICAgIGlmICggKEZUX1VJbnQpaWR4ID49IG1hc2stPm51bV9iaXRzICkKLSAgICAgIHJldHVybjsKLQotICAgIHAgICAgPSBtYXNrLT5ieXRlcyArICggaWR4ID4+IDMgKTsKLSAgICBwWzBdID0gKEZUX0J5dGUpKCBwWzBdICYgfiggMHg4MCA+PiAoIGlkeCAmIDcgKSApICk7Ci0gIH0KLQotCi0gIC8qIHNldCBhIGdpdmVuIGJpdCwgcG9zc2libHkgZ3JvdyB0aGUgbWFzayAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza19zZXRfYml0KCBQU19NYXNrICAgIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gMDsKLSAgICBGVF9CeXRlKiAgcDsKLQotCi0gICAgaWYgKCBpZHggPCAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggKEZUX1VJbnQpaWR4ID49IG1hc2stPm51bV9iaXRzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzX21hc2tfZW5zdXJlKCBtYXNrLCBpZHggKyAxLCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIG1hc2stPm51bV9iaXRzID0gaWR4ICsgMTsKLSAgICB9Ci0KLSAgICBwICAgID0gbWFzay0+Ynl0ZXMgKyAoIGlkeCA+PiAzICk7Ci0gICAgcFswXSA9IChGVF9CeXRlKSggcFswXSB8ICggMHg4MCA+PiAoIGlkeCAmIDcgKSApICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRlc3Ryb3kgbWFzayB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc19tYXNrX3RhYmxlX2RvbmUoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9VSW50ICBjb3VudCA9IHRhYmxlLT5tYXhfbWFza3M7Ci0gICAgUFNfTWFzayAgbWFzayAgPSB0YWJsZS0+bWFza3M7Ci0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBtYXNrKysgKQotICAgICAgcHNfbWFza19kb25lKCBtYXNrLCBtZW1vcnkgKTsKLQotICAgIEZUX0ZSRUUoIHRhYmxlLT5tYXNrcyApOwotICAgIHRhYmxlLT5udW1fbWFza3MgPSAwOwotICAgIHRhYmxlLT5tYXhfbWFza3MgPSAwOwotICB9Ci0KLQotICAvKiBlbnN1cmUgdGhhdCBhIG1hc2sgdGFibGUgY2FuIGNvbnRhaW4gImNvdW50IiBtYXNrcyAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza190YWJsZV9lbnN1cmUoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfVUludCAgIG9sZF9tYXggPSB0YWJsZS0+bWF4X21hc2tzOwotICAgIEZUX1VJbnQgICBuZXdfbWF4ID0gY291bnQ7Ci0gICAgRlRfRXJyb3IgIGVycm9yICAgPSAwOwotCi0KLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDggKTsKLSAgICAgIGlmICggIUZUX1JFTkVXX0FSUkFZKCB0YWJsZS0+bWFza3MsIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIHRhYmxlLT5tYXhfbWFza3MgPSBuZXdfbWF4OwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGFsbG9jYXRlIGEgbmV3IG1hc2sgaW4gYSB0YWJsZSAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza190YWJsZV9hbGxvYyggUFNfTWFza19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfTWFzayAgICAgICAqYW1hc2sgKQotICB7Ci0gICAgRlRfVUludCAgIGNvdW50OwotICAgIEZUX0Vycm9yICBlcnJvciA9IDA7Ci0gICAgUFNfTWFzayAgIG1hc2sgID0gMDsKLQotCi0gICAgY291bnQgPSB0YWJsZS0+bnVtX21hc2tzOwotICAgIGNvdW50Kys7Ci0KLSAgICBpZiAoIGNvdW50ID4gdGFibGUtPm1heF9tYXNrcyApCi0gICAgewotICAgICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX2Vuc3VyZSggdGFibGUsIGNvdW50LCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgbWFzayAgICAgICAgICAgICA9IHRhYmxlLT5tYXNrcyArIGNvdW50IC0gMTsKLSAgICBtYXNrLT5udW1fYml0cyAgID0gMDsKLSAgICBtYXNrLT5lbmRfcG9pbnQgID0gMDsKLSAgICB0YWJsZS0+bnVtX21hc2tzID0gY291bnQ7Ci0KLSAgRXhpdDoKLSAgICAqYW1hc2sgPSBtYXNrOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcmV0dXJuIGxhc3QgaGludCBtYXNrIGluIGEgdGFibGUsIGNyZWF0ZSBvbmUgaWYgdGhlIHRhYmxlIGlzIGVtcHR5ICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19tYXNrX3RhYmxlX2xhc3QoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBQU19NYXNrICAgICAgICphbWFzayApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSAwOwotICAgIEZUX1VJbnQgICBjb3VudDsKLSAgICBQU19NYXNrICAgbWFzazsKLQotCi0gICAgY291bnQgPSB0YWJsZS0+bnVtX21hc2tzOwotICAgIGlmICggY291bnQgPT0gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX2FsbG9jKCB0YWJsZSwgbWVtb3J5LCAmbWFzayApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgbWFzayA9IHRhYmxlLT5tYXNrcyArIGNvdW50IC0gMTsKLQotICBFeGl0OgotICAgICphbWFzayA9IG1hc2s7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBzZXQgYSBuZXcgbWFzayB0byBhIGdpdmVuIGJpdCByYW5nZSAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza190YWJsZV9zZXRfYml0cyggUFNfTWFza19UYWJsZSAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSAwOwotICAgIFBTX01hc2sgICBtYXNrOwotCi0KLSAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfbGFzdCggdGFibGUsIG1lbW9yeSwgJm1hc2sgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gcHNfbWFza19lbnN1cmUoIG1hc2ssIGJpdF9jb3VudCwgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBtYXNrLT5udW1fYml0cyA9IGJpdF9jb3VudDsKLQotICAgIC8qIG5vdywgY29weSBiaXRzICovCi0gICAgewotICAgICAgRlRfQnl0ZSogIHJlYWQgID0gKEZUX0J5dGUqKXNvdXJjZSArICggYml0X3BvcyA+PiAzICk7Ci0gICAgICBGVF9JbnQgICAgcm1hc2sgPSAweDgwID4+ICggYml0X3BvcyAmIDcgKTsKLSAgICAgIEZUX0J5dGUqICB3cml0ZSA9IG1hc2stPmJ5dGVzOwotICAgICAgRlRfSW50ICAgIHdtYXNrID0gMHg4MDsKLSAgICAgIEZUX0ludCAgICB2YWw7Ci0KLQotICAgICAgZm9yICggOyBiaXRfY291bnQgPiAwOyBiaXRfY291bnQtLSApCi0gICAgICB7Ci0gICAgICAgIHZhbCA9IHdyaXRlWzBdICYgfndtYXNrOwotCi0gICAgICAgIGlmICggcmVhZFswXSAmIHJtYXNrICkKLSAgICAgICAgICB2YWwgfD0gd21hc2s7Ci0KLSAgICAgICAgd3JpdGVbMF0gPSAoRlRfQnl0ZSl2YWw7Ci0KLSAgICAgICAgcm1hc2sgPj49IDE7Ci0gICAgICAgIGlmICggcm1hc2sgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICByZWFkKys7Ci0gICAgICAgICAgcm1hc2sgPSAweDgwOwotICAgICAgICB9Ci0KLSAgICAgICAgd21hc2sgPj49IDE7Ci0gICAgICAgIGlmICggd21hc2sgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZSsrOwotICAgICAgICAgIHdtYXNrID0gMHg4MDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogdGVzdCB3aGV0aGVyIHR3byBtYXNrcyBpbiBhIHRhYmxlIGludGVyc2VjdCAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHBzX21hc2tfdGFibGVfdGVzdF9pbnRlcnNlY3QoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBpbmRleDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGluZGV4MiApCi0gIHsKLSAgICBQU19NYXNrICAgbWFzazEgID0gdGFibGUtPm1hc2tzICsgaW5kZXgxOwotICAgIFBTX01hc2sgICBtYXNrMiAgPSB0YWJsZS0+bWFza3MgKyBpbmRleDI7Ci0gICAgRlRfQnl0ZSogIHAxICAgICA9IG1hc2sxLT5ieXRlczsKLSAgICBGVF9CeXRlKiAgcDIgICAgID0gbWFzazItPmJ5dGVzOwotICAgIEZUX1VJbnQgICBjb3VudDEgPSBtYXNrMS0+bnVtX2JpdHM7Ci0gICAgRlRfVUludCAgIGNvdW50MiA9IG1hc2syLT5udW1fYml0czsKLSAgICBGVF9VSW50ICAgY291bnQ7Ci0KLQotICAgIGNvdW50ID0gKCBjb3VudDEgPD0gY291bnQyICkgPyBjb3VudDEgOiBjb3VudDI7Ci0gICAgZm9yICggOyBjb3VudCA+PSA4OyBjb3VudCAtPSA4ICkKLSAgICB7Ci0gICAgICBpZiAoIHAxWzBdICYgcDJbMF0gKQotICAgICAgICByZXR1cm4gMTsKLQotICAgICAgcDErKzsKLSAgICAgIHAyKys7Ci0gICAgfQotCi0gICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuICggcDFbMF0gJiBwMlswXSApICYgfiggMHhGRiA+PiBjb3VudCApOwotICB9Ci0KLQotICAvKiBtZXJnZSB0d28gbWFza3MsIHVzZWQgYnkgcHNfbWFza190YWJsZV9tZXJnZV9hbGwgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX21hc2tfdGFibGVfbWVyZ2UoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBpbmRleDEsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGluZGV4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX1VJbnQgICB0ZW1wOwotICAgIEZUX0Vycm9yICBlcnJvciA9IDA7Ci0KLQotICAgIC8qIHN3YXAgaW5kZXgxIGFuZCBpbmRleDIgc28gdGhhdCBpbmRleDEgPCBpbmRleDIgKi8KLSAgICBpZiAoIGluZGV4MSA+IGluZGV4MiApCi0gICAgewotICAgICAgdGVtcCAgID0gaW5kZXgxOwotICAgICAgaW5kZXgxID0gaW5kZXgyOwotICAgICAgaW5kZXgyID0gdGVtcDsKLSAgICB9Ci0KLSAgICBpZiAoIGluZGV4MSA8IGluZGV4MiAmJiBpbmRleDEgPj0gMCAmJiBpbmRleDIgPCAoRlRfSW50KXRhYmxlLT5udW1fbWFza3MgKQotICAgIHsKLSAgICAgIC8qIHdlIG5lZWQgdG8gbWVyZ2UgdGhlIGJpdHNldHMgb2YgaW5kZXgxIGFuZCBpbmRleDIgd2l0aCBhICovCi0gICAgICAvKiBzaW1wbGUgdW5pb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgUFNfTWFzayAgbWFzazEgID0gdGFibGUtPm1hc2tzICsgaW5kZXgxOwotICAgICAgUFNfTWFzayAgbWFzazIgID0gdGFibGUtPm1hc2tzICsgaW5kZXgyOwotICAgICAgRlRfVUludCAgY291bnQxID0gbWFzazEtPm51bV9iaXRzOwotICAgICAgRlRfVUludCAgY291bnQyID0gbWFzazItPm51bV9iaXRzOwotICAgICAgRlRfSW50ICAgZGVsdGE7Ci0KLQotICAgICAgaWYgKCBjb3VudDIgPiAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgIHBvczsKLSAgICAgICAgRlRfQnl0ZSogIHJlYWQ7Ci0gICAgICAgIEZUX0J5dGUqICB3cml0ZTsKLQotCi0gICAgICAgIC8qIGlmICJjb3VudDIiIGlzIGdyZWF0ZXIgdGhhbiAiY291bnQxIiwgd2UgbmVlZCB0byBncm93IHRoZSAqLwotICAgICAgICAvKiBmaXJzdCBiaXRzZXQsIGFuZCBjbGVhciB0aGUgaGlnaGVzdCBiaXRzICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBjb3VudDIgPiBjb3VudDEgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBwc19tYXNrX2Vuc3VyZSggbWFzazEsIGNvdW50MiwgbWVtb3J5ICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBmb3IgKCBwb3MgPSBjb3VudDE7IHBvcyA8IGNvdW50MjsgcG9zKysgKQotICAgICAgICAgICAgcHNfbWFza19jbGVhcl9iaXQoIG1hc2sxLCBwb3MgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG1lcmdlICh1bml0ZSkgdGhlIGJpdHNldHMgKi8KLSAgICAgICAgcmVhZCAgPSBtYXNrMi0+Ynl0ZXM7Ci0gICAgICAgIHdyaXRlID0gbWFzazEtPmJ5dGVzOwotICAgICAgICBwb3MgICA9IChGVF9VSW50KSggKCBjb3VudDIgKyA3ICkgPj4gMyApOwotCi0gICAgICAgIGZvciAoIDsgcG9zID4gMDsgcG9zLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGVbMF0gPSAoRlRfQnl0ZSkoIHdyaXRlWzBdIHwgcmVhZFswXSApOwotICAgICAgICAgIHdyaXRlKys7Ci0gICAgICAgICAgcmVhZCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdywgcmVtb3ZlICJtYXNrMiIgZnJvbSB0aGUgbGlzdC4gIFdlIG5lZWQgdG8ga2VlcCB0aGUgbWFza3MgKi8KLSAgICAgIC8qIHNvcnRlZCBpbiBvcmRlciBvZiBpbXBvcnRhbmNlLCBzbyBtb3ZlIHRhYmxlIGVsZW1lbnRzLiAgICAgICAgKi8KLSAgICAgIG1hc2syLT5udW1fYml0cyAgPSAwOwotICAgICAgbWFzazItPmVuZF9wb2ludCA9IDA7Ci0KLSAgICAgIGRlbHRhID0gdGFibGUtPm51bV9tYXNrcyAtIDEgLSBpbmRleDI7IC8qIG51bWJlciBvZiBtYXNrcyB0byBtb3ZlICovCi0gICAgICBpZiAoIGRlbHRhID4gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIG1vdmUgdG8gZW5kIG9mIHRhYmxlIGZvciByZXVzZSAqLwotICAgICAgICBQU19NYXNrUmVjICBkdW1teSA9ICptYXNrMjsKLQotCi0gICAgICAgIGZ0X21lbW1vdmUoIG1hc2syLCBtYXNrMiArIDEsIGRlbHRhICogc2l6ZW9mICggUFNfTWFza1JlYyApICk7Ci0KLSAgICAgICAgbWFzazJbZGVsdGFdID0gZHVtbXk7Ci0gICAgICB9Ci0KLSAgICAgIHRhYmxlLT5udW1fbWFza3MtLTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgRlRfRVJST1IoKCAicHNfbWFza190YWJsZV9tZXJnZTogaWdub3JpbmcgaW52YWxpZCBpbmRpY2VzICglZCwlZClcbiIsCi0gICAgICAgICAgICAgICAgIGluZGV4MSwgaW5kZXgyICkpOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBUcnkgdG8gbWVyZ2UgYWxsIG1hc2tzIGluIGEgZ2l2ZW4gdGFibGUuICBUaGlzIGlzIHVzZWQgdG8gbWVyZ2UgKi8KLSAgLyogYWxsIGNvdW50ZXIgbWFza3MgaW50byBpbmRlcGVuZGVudCBjb3VudGVyICJwYXRocyIuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza190YWJsZV9tZXJnZV9hbGwoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0ludCAgICBpbmRleDEsIGluZGV4MjsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSAwOwotCi0KLSAgICBmb3IgKCBpbmRleDEgPSB0YWJsZS0+bnVtX21hc2tzIC0gMTsgaW5kZXgxID4gMDsgaW5kZXgxLS0gKQotICAgIHsKLSAgICAgIGZvciAoIGluZGV4MiA9IGluZGV4MSAtIDE7IGluZGV4MiA+PSAwOyBpbmRleDItLSApCi0gICAgICB7Ci0gICAgICAgIGlmICggcHNfbWFza190YWJsZV90ZXN0X2ludGVyc2VjdCggdGFibGUsIGluZGV4MSwgaW5kZXgyICkgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX21lcmdlKCB0YWJsZSwgaW5kZXgyLCBpbmRleDEsIG1lbW9yeSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgUFNfRElNRU5TSU9OIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogZmluYWxpemUgYSBnaXZlbiBkaW1lbnNpb24gKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfZGltZW5zaW9uX2RvbmUoIFBTX0RpbWVuc2lvbiAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKQotICB7Ci0gICAgcHNfbWFza190YWJsZV9kb25lKCAmZGltZW5zaW9uLT5jb3VudGVycywgbWVtb3J5ICk7Ci0gICAgcHNfbWFza190YWJsZV9kb25lKCAmZGltZW5zaW9uLT5tYXNrcywgICAgbWVtb3J5ICk7Ci0gICAgcHNfaGludF90YWJsZV9kb25lKCAmZGltZW5zaW9uLT5oaW50cywgICAgbWVtb3J5ICk7Ci0gIH0KLQotCi0gIC8qIGluaXRpYWxpemUgYSBnaXZlbiBkaW1lbnNpb24gKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfZGltZW5zaW9uX2luaXQoIFBTX0RpbWVuc2lvbiAgZGltZW5zaW9uICkKLSAgewotICAgIGRpbWVuc2lvbi0+aGludHMubnVtX2hpbnRzICAgID0gMDsKLSAgICBkaW1lbnNpb24tPm1hc2tzLm51bV9tYXNrcyAgICA9IDA7Ci0gICAgZGltZW5zaW9uLT5jb3VudGVycy5udW1fbWFza3MgPSAwOwotICB9Ci0KLQotI2lmIDAKLQotICAvKiBzZXQgYSBiaXQgYXQgYSBnaXZlbiBpbmRleCBpbiB0aGUgY3VycmVudCBoaW50IG1hc2sgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX2RpbWVuc2lvbl9zZXRfbWFza19iaXQoIFBTX0RpbWVuc2lvbiAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKQotICB7Ci0gICAgUFNfTWFzayAgbWFzazsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSAwOwotCi0KLSAgICAvKiBnZXQgbGFzdCBoaW50IG1hc2sgKi8KLSAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfbGFzdCggJmRpbS0+bWFza3MsIG1lbW9yeSwgJm1hc2sgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gcHNfbWFza19zZXRfYml0KCBtYXNrLCBpZHgsIG1lbW9yeSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZgotCi0gIC8qIHNldCB0aGUgZW5kIHBvaW50IGluIGEgbWFzaywgY2FsbGVkIGZyb20gIkVuZCIgJiAiUmVzZXQiIG1ldGhvZHMgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfZGltZW5zaW9uX2VuZF9tYXNrKCBQU19EaW1lbnNpb24gIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGVuZF9wb2ludCApCi0gIHsKLSAgICBGVF9VSW50ICBjb3VudCA9IGRpbS0+bWFza3MubnVtX21hc2tzOwotICAgIFBTX01hc2sgIG1hc2s7Ci0KLQotICAgIGlmICggY291bnQgPiAwICkKLSAgICB7Ci0gICAgICBtYXNrICAgICAgICAgICAgPSBkaW0tPm1hc2tzLm1hc2tzICsgY291bnQgLSAxOwotICAgICAgbWFzay0+ZW5kX3BvaW50ID0gZW5kX3BvaW50OwotICAgIH0KLSAgfQotCi0KLSAgLyogc2V0IHRoZSBlbmQgcG9pbnQgaW4gdGhlIGN1cnJlbnQgbWFzaywgdGhlbiBjcmVhdGUgYSBuZXcgZW1wdHkgb25lICovCi0gIC8qIChjYWxsZWQgYnkgIlJlc2V0IiBtZXRob2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX3Jlc2V0X21hc2soIFBTX0RpbWVuc2lvbiAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApCi0gIHsKLSAgICBQU19NYXNrICBtYXNrOwotCi0KLSAgICAvKiBlbmQgY3VycmVudCBtYXNrICovCi0gICAgcHNfZGltZW5zaW9uX2VuZF9tYXNrKCBkaW0sIGVuZF9wb2ludCApOwotCi0gICAgLyogYWxsb2NhdGUgbmV3IG9uZSAqLwotICAgIHJldHVybiBwc19tYXNrX3RhYmxlX2FsbG9jKCAmZGltLT5tYXNrcywgbWVtb3J5LCAmbWFzayApOwotICB9Ci0KLQotICAvKiBzZXQgYSBuZXcgbWFzaywgY2FsbGVkIGZyb20gdGhlICJUMlN0ZW0iIG1ldGhvZCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdHMoIFBTX0RpbWVuc2lvbiAgICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIHNvdXJjZV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgc291cmNlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZW5kX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSAwOwotCi0KLSAgICAvKiByZXNldCBjdXJyZW50IG1hc2ssIGlmIGFueSAqLwotICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3Jlc2V0X21hc2soIGRpbSwgZW5kX3BvaW50LCBtZW1vcnkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHNldCBiaXRzIGluIG5ldyBtYXNrICovCi0gICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX3NldF9iaXRzKCAmZGltLT5tYXNrcywgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3Bvcywgc291cmNlX2JpdHMsIG1lbW9yeSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBhZGQgYSBuZXcgc2luZ2xlIHN0ZW0gKGNhbGxlZCBmcm9tICJUMVN0ZW0iIG1ldGhvZCkgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX2RpbWVuc2lvbl9hZGRfdDFzdGVtKCBQU19EaW1lbnNpb24gIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqYWluZGV4ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IDA7Ci0gICAgRlRfVUludCAgIGZsYWdzID0gMDsKLQotCi0gICAgLyogZGV0ZWN0IGdob3N0IHN0ZW0gKi8KLSAgICBpZiAoIGxlbiA8IDAgKQotICAgIHsKLSAgICAgIGZsYWdzIHw9IFBTX0hJTlRfRkxBR19HSE9TVDsKLSAgICAgIGlmICggbGVuID09IC0yMSApCi0gICAgICB7Ci0gICAgICAgIGZsYWdzIHw9IFBTX0hJTlRfRkxBR19CT1RUT007Ci0gICAgICAgIHBvcyAgICs9IGxlbjsKLSAgICAgIH0KLSAgICAgIGxlbiA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCBhaW5kZXggKQotICAgICAgKmFpbmRleCA9IC0xOwotCi0gICAgLyogbm93LCBsb29rdXAgc3RlbSBpbiB0aGUgY3VycmVudCBoaW50cyB0YWJsZSAqLwotICAgIHsKLSAgICAgIFBTX01hc2sgIG1hc2s7Ci0gICAgICBGVF9VSW50ICBpZHg7Ci0gICAgICBGVF9VSW50ICBtYXggICA9IGRpbS0+aGludHMubnVtX2hpbnRzOwotICAgICAgUFNfSGludCAgaGludCAgPSBkaW0tPmhpbnRzLmhpbnRzOwotCi0KLSAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyssIGhpbnQrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggaGludC0+cG9zID09IHBvcyAmJiBoaW50LT5sZW4gPT0gbGVuICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLyogd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgaGludCBpbiB0aGUgdGFibGUgKi8KLSAgICAgIGlmICggaWR4ID49IG1heCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gcHNfaGludF90YWJsZV9hbGxvYyggJmRpbS0+aGludHMsIG1lbW9yeSwgJmhpbnQgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGhpbnQtPnBvcyAgID0gcG9zOwotICAgICAgICBoaW50LT5sZW4gICA9IGxlbjsKLSAgICAgICAgaGludC0+ZmxhZ3MgPSBmbGFnczsKLSAgICAgIH0KLQotICAgICAgLyogbm93LCBzdG9yZSB0aGUgaGludCBpbiB0aGUgY3VycmVudCBtYXNrICovCi0gICAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfbGFzdCggJmRpbS0+bWFza3MsIG1lbW9yeSwgJm1hc2sgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGVycm9yID0gcHNfbWFza19zZXRfYml0KCBtYXNrLCBpZHgsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCBhaW5kZXggKQotICAgICAgICAqYWluZGV4ID0gKEZUX0ludClpZHg7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBhZGQgYSAiaHN0ZW0zL3ZzdGVtMyIgY291bnRlciB0byBvdXIgZGltZW5zaW9uIHRhYmxlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19kaW1lbnNpb25fYWRkX2NvdW50ZXIoIFBTX0RpbWVuc2lvbiAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgaGludDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBoaW50MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGhpbnQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciAgID0gMDsKLSAgICBGVF9VSW50ICAgY291bnQgICA9IGRpbS0+Y291bnRlcnMubnVtX21hc2tzOwotICAgIFBTX01hc2sgICBjb3VudGVyID0gZGltLT5jb3VudGVycy5tYXNrczsKLQotCi0gICAgLyogdHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgY291bnRlciBtYXNrIHRoYXQgYWxyZWFkeSB1c2VzICovCi0gICAgLyogb25lIG9mIHRoZXNlIHN0ZW1zIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGNvdW50ZXIrKyApCi0gICAgewotICAgICAgaWYgKCBwc19tYXNrX3Rlc3RfYml0KCBjb3VudGVyLCBoaW50MSApIHx8Ci0gICAgICAgICAgIHBzX21hc2tfdGVzdF9iaXQoIGNvdW50ZXIsIGhpbnQyICkgfHwKLSAgICAgICAgICAgcHNfbWFza190ZXN0X2JpdCggY291bnRlciwgaGludDMgKSApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGNyZWF0ZSBhIG5ldyBjb3VudGVyIHdoZW4gbmVlZGVkICovCi0gICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfYWxsb2MoICZkaW0tPmNvdW50ZXJzLCBtZW1vcnksICZjb3VudGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIG5vdywgc2V0IHRoZSBiaXRzIGZvciBvdXIgaGludHMgaW4gdGhlIGNvdW50ZXIgbWFzayAqLwotICAgIGVycm9yID0gcHNfbWFza19zZXRfYml0KCBjb3VudGVyLCBoaW50MSwgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IHBzX21hc2tfc2V0X2JpdCggY291bnRlciwgaGludDIsIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBwc19tYXNrX3NldF9iaXQoIGNvdW50ZXIsIGhpbnQzLCBtZW1vcnkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZW5kIG9mIHJlY29yZGluZyBzZXNzaW9uIGZvciBhIGdpdmVuIGRpbWVuc2lvbiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX2VuZCggUFNfRGltZW5zaW9uICBkaW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZW5kX3BvaW50LAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApCi0gIHsKLSAgICAvKiBlbmQgaGludCBtYXNrIHRhYmxlICovCi0gICAgcHNfZGltZW5zaW9uX2VuZF9tYXNrKCBkaW0sIGVuZF9wb2ludCApOwotCi0gICAgLyogbWVyZ2UgYWxsIGNvdW50ZXIgbWFza3MgaW50byBpbmRlcGVuZGVudCAicGF0aHMiICovCi0gICAgcmV0dXJuIHBzX21hc2tfdGFibGVfbWVyZ2VfYWxsKCAmZGltLT5jb3VudGVycywgbWVtb3J5ICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgUFNfUkVDT1JERVIgTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogZGVzdHJveSBoaW50cyAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX2hpbnRzX2RvbmUoIFBTX0hpbnRzICBoaW50cyApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGhpbnRzLT5tZW1vcnk7Ci0KLQotICAgIHBzX2RpbWVuc2lvbl9kb25lKCAmaGludHMtPmRpbWVuc2lvblswXSwgbWVtb3J5ICk7Ci0gICAgcHNfZGltZW5zaW9uX2RvbmUoICZoaW50cy0+ZGltZW5zaW9uWzFdLCBtZW1vcnkgKTsKLQotICAgIGhpbnRzLT5lcnJvciAgPSAwOwotICAgIGhpbnRzLT5tZW1vcnkgPSAwOwotICB9Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwc19oaW50c19pbml0KCBQU19IaW50cyAgIGhpbnRzLAotICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9NRU1fWkVSTyggaGludHMsIHNpemVvZiAoICpoaW50cyApICk7Ci0gICAgaGludHMtPm1lbW9yeSA9IG1lbW9yeTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogaW5pdGlhbGl6ZSBhIGhpbnRzIGZvciBhIG5ldyBzZXNzaW9uICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzX2hpbnRzX29wZW4oIFBTX0hpbnRzICAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgIFBTX0hpbnRfVHlwZSAgaGludF90eXBlICkKLSAgewotICAgIHN3aXRjaCAoIGhpbnRfdHlwZSApCi0gICAgewotICAgIGNhc2UgUFNfSElOVF9UWVBFXzE6Ci0gICAgY2FzZSBQU19ISU5UX1RZUEVfMjoKLSAgICAgIGhpbnRzLT5lcnJvciAgICAgPSAwOwotICAgICAgaGludHMtPmhpbnRfdHlwZSA9IGhpbnRfdHlwZTsKLQotICAgICAgcHNfZGltZW5zaW9uX2luaXQoICZoaW50cy0+ZGltZW5zaW9uWzBdICk7Ci0gICAgICBwc19kaW1lbnNpb25faW5pdCggJmhpbnRzLT5kaW1lbnNpb25bMV0gKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGhpbnRzLT5lcnJvciAgICAgPSBQU0hfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgICBoaW50cy0+aGludF90eXBlID0gaGludF90eXBlOwotCi0gICAgICBGVF9FUlJPUigoICJwc19oaW50c19vcGVuOiBpbnZhbGlkIGNoYXJzdHJpbmcgdHlwZSFcbiIgKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGFkZCBvbmUgb3IgbW9yZSBzdGVtcyB0byB0aGUgY3VycmVudCBoaW50cyB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc19oaW50c19zdGVtKCBQU19IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyogIHN0ZW1zICkKLSAgewotICAgIGlmICggIWhpbnRzLT5lcnJvciApCi0gICAgewotICAgICAgLyogbGltaXQgImRpbWVuc2lvbiIgdG8gMC4uMSAqLwotICAgICAgaWYgKCBkaW1lbnNpb24gPCAwIHx8IGRpbWVuc2lvbiA+IDEgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJwc19oaW50c19zdGVtOiBpbnZhbGlkIGRpbWVuc2lvbiAoJWQpIHVzZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgZGltZW5zaW9uICkpOwotICAgICAgICBkaW1lbnNpb24gPSAoIGRpbWVuc2lvbiAhPSAwICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHJlY29yZCB0aGUgc3RlbXMgaW4gdGhlIGN1cnJlbnQgaGludHMvbWFza3MgdGFibGUgKi8KLSAgICAgIHN3aXRjaCAoIGhpbnRzLT5oaW50X3R5cGUgKQotICAgICAgewotICAgICAgY2FzZSBQU19ISU5UX1RZUEVfMTogIC8qIFR5cGUgMSAiaHN0ZW0iIG9yICJ2c3RlbSIgb3BlcmF0b3IgKi8KLSAgICAgIGNhc2UgUFNfSElOVF9UWVBFXzI6ICAvKiBUeXBlIDIgImhzdGVtIiBvciAidnN0ZW0iIG9wZXJhdG9yICovCi0gICAgICAgIHsKLSAgICAgICAgICBQU19EaW1lbnNpb24gIGRpbSA9ICZoaW50cy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0KLQotICAgICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzdGVtcyArPSAyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotCi0KLSAgICAgICAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX2FkZF90MXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgZGltLCAoRlRfSW50KXN0ZW1zWzBdLCAoRlRfSW50KXN0ZW1zWzFdLAotICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwgTlVMTCApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInBzX2hpbnRzX3N0ZW06IGNvdWxkIG5vdCBhZGQgc3RlbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiICglZCwlZCkgdG8gaGludHMgdGFibGVcbiIsIHN0ZW1zWzBdLCBzdGVtc1sxXSApKTsKLQotICAgICAgICAgICAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBGVF9FUlJPUigoICJwc19oaW50c19zdGVtOiBjYWxsZWQgd2l0aCBpbnZhbGlkIGhpbnQgdHlwZSAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgIGhpbnRzLT5oaW50X3R5cGUgKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogYWRkIG9uZSBUeXBlMSBjb3VudGVyIHN0ZW0gdG8gdGhlIGN1cnJlbnQgaGludHMgdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfaGludHNfdDFzdGVtMyggUFNfSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgc3RlbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gMDsKLQotCi0gICAgaWYgKCAhaGludHMtPmVycm9yICkKLSAgICB7Ci0gICAgICBQU19EaW1lbnNpb24gIGRpbTsKLSAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLSAgICAgIEZUX0ludCAgICAgICAgY291bnQ7Ci0gICAgICBGVF9JbnQgICAgICAgIGlkeFszXTsKLQotCi0gICAgICAvKiBsaW1pdCAiZGltZW5zaW9uIiB0byAwLi4xICovCi0gICAgICBpZiAoIGRpbWVuc2lvbiA8IDAgfHwgZGltZW5zaW9uID4gMSApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX2hpbnRzX3Qxc3RlbTM6IGludmFsaWQgZGltZW5zaW9uICglZCkgdXNlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24gKSk7Ci0gICAgICAgIGRpbWVuc2lvbiA9ICggZGltZW5zaW9uICE9IDAgKTsKLSAgICAgIH0KLQotICAgICAgZGltID0gJmhpbnRzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLQotICAgICAgLyogdGhlcmUgbXVzdCBiZSA2IGVsZW1lbnRzIGluIHRoZSAnc3RlbScgYXJyYXkgKi8KLSAgICAgIGlmICggaGludHMtPmhpbnRfdHlwZSA9PSBQU19ISU5UX1RZUEVfMSApCi0gICAgICB7Ci0gICAgICAgIC8qIGFkZCB0aGUgdGhyZWUgc3RlbXMgdG8gb3VyIGhpbnRzL21hc2tzIHRhYmxlICovCi0gICAgICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCAzOyBjb3VudCsrLCBzdGVtcyArPSAyICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX2FkZF90MXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgIGRpbSwgKEZUX0ludClzdGVtc1swXSwgKEZUX0ludClzdGVtc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5LCAmaWR4W2NvdW50XSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm93LCBhZGQgdGhlIGhpbnRzIHRvIHRoZSBjb3VudGVycyB0YWJsZSAqLwotICAgICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9hZGRfY291bnRlciggZGltLCBpZHhbMF0sIGlkeFsxXSwgaWR4WzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAicHNfaGludHNfdDFzdGVtMzogY2FsbGVkIHdpdGggaW52YWxpZCBoaW50IHR5cGUhXG4iICkpOwotICAgICAgICBlcnJvciA9IFBTSF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIEZUX0VSUk9SKCggInBzX2hpbnRzX3Qxc3RlbTM6IGNvdWxkIG5vdCBhZGQgY291bnRlciBzdGVtcyB0byB0YWJsZVxuIiApKTsKLSAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgLyogcmVzZXQgaGludHMgKG9ubHkgd2l0aCBUeXBlIDEgaGludHMpICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzX2hpbnRzX3QxcmVzZXQoIFBTX0hpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSAwOwotCi0KLSAgICBpZiAoICFoaW50cy0+ZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLQotCi0gICAgICBpZiAoIGhpbnRzLT5oaW50X3R5cGUgPT0gUFNfSElOVF9UWVBFXzEgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9yZXNldF9tYXNrKCAmaGludHMtPmRpbWVuc2lvblswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3BvaW50LCBtZW1vcnkgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3Jlc2V0X21hc2soICZoaW50cy0+ZGltZW5zaW9uWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsIG1lbW9yeSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGludmFsaWQgaGludCB0eXBlICovCi0gICAgICAgIGVycm9yID0gUFNIX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIGhpbnRzLT5lcnJvciA9IGVycm9yOwotICB9Ci0KLQotICAvKiBUeXBlMiAiaGludG1hc2siIG9wZXJhdG9yLCBhZGQgYSBuZXcgaGludG1hc2sgdG8gZWFjaCBkaXJlY3Rpb24gKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfaGludHNfdDJtYXNrKCBQU19IaW50cyAgICAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGVuZF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGlmICggIWhpbnRzLT5lcnJvciApCi0gICAgewotICAgICAgUFNfRGltZW5zaW9uICBkaW0gICAgPSBoaW50cy0+ZGltZW5zaW9uOwotICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgICAgRlRfVUludCAgICAgICBjb3VudDEgPSBkaW1bMF0uaGludHMubnVtX2hpbnRzOwotICAgICAgRlRfVUludCAgICAgICBjb3VudDIgPSBkaW1bMV0uaGludHMubnVtX2hpbnRzOwotCi0KLSAgICAgIC8qIGNoZWNrIGJpdCBjb3VudDsgbXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IHRvdGFsIGhpbnQgY291bnQgKi8KLSAgICAgIGlmICggYml0X2NvdW50ICE9ICBjb3VudDEgKyBjb3VudDIgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJwc19oaW50c190Mm1hc2s6ICIKLSAgICAgICAgICAgICAgICAgICAiY2FsbGVkIHdpdGggaW52YWxpZCBiaXRjb3VudCAlZCAoaW5zdGVhZCBvZiAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgYml0X2NvdW50LCBjb3VudDEgKyBjb3VudDIgKSk7Ci0KLSAgICAgICAgLyogc2ltcGx5IGlnbm9yZSB0aGUgb3BlcmF0b3IgKi8KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBzZXQtdXAgbmV3IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGhpbnQgbWFzayBub3cgKi8KLSAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdHMoICZkaW1bMF0sIGJ5dGVzLCBjb3VudDIsIGNvdW50MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9wb2ludCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9zZXRfbWFza19iaXRzKCAmZGltWzFdLCBieXRlcywgMCwgY291bnQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3BvaW50LCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIGhpbnRzLT5lcnJvciA9IGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwc19oaW50c190MmNvdW50ZXIoIFBTX0hpbnRzICAgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGlmICggIWhpbnRzLT5lcnJvciApCi0gICAgewotICAgICAgUFNfRGltZW5zaW9uICBkaW0gICAgPSBoaW50cy0+ZGltZW5zaW9uOwotICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgICAgRlRfVUludCAgICAgICBjb3VudDEgPSBkaW1bMF0uaGludHMubnVtX2hpbnRzOwotICAgICAgRlRfVUludCAgICAgICBjb3VudDIgPSBkaW1bMV0uaGludHMubnVtX2hpbnRzOwotCi0KLSAgICAgIC8qIGNoZWNrIGJpdCBjb3VudCwgbXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IHRvdGFsIGhpbnQgY291bnQgKi8KLSAgICAgIGlmICggYml0X2NvdW50ICE9ICBjb3VudDEgKyBjb3VudDIgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJwc19oaW50c190MmNvdW50ZXI6ICIKLSAgICAgICAgICAgICAgICAgICAiY2FsbGVkIHdpdGggaW52YWxpZCBiaXRjb3VudCAlZCAoaW5zdGVhZCBvZiAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgYml0X2NvdW50LCBjb3VudDEgKyBjb3VudDIgKSk7Ci0KLSAgICAgICAgLyogc2ltcGx5IGlnbm9yZSB0aGUgb3BlcmF0b3IgKi8KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBzZXQtdXAgbmV3IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGhpbnQgbWFzayBub3cgKi8KLSAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdHMoICZkaW1bMF0sIGJ5dGVzLCAwLCBjb3VudDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdHMoICZkaW1bMV0sIGJ5dGVzLCBjb3VudDEsIGNvdW50MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0gICAgcmV0dXJuOwotCi0gIEZhaWw6Ci0gICAgaGludHMtPmVycm9yID0gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGVuZCByZWNvcmRpbmcgc2Vzc2lvbiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfaGludHNfY2xvc2UoIFBTX0hpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBlbmRfcG9pbnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IGhpbnRzLT5lcnJvcjsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgICAgUFNfRGltZW5zaW9uICBkaW0gICAgPSBoaW50cy0+ZGltZW5zaW9uOwotCi0KLSAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX2VuZCggJmRpbVswXSwgZW5kX3BvaW50LCBtZW1vcnkgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fZW5kKCAmZGltWzFdLCBlbmRfcG9pbnQsIG1lbW9yeSApOwotICAgICAgfQotICAgIH0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgIGlmICggIWVycm9yICkKLSAgICAgIHBzX2RlYnVnX2hpbnRzID0gaGludHM7Ci0jZW5kaWYKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICBUWVBFIDEgSElOVFMgUkVDT1JESU5HIElOVEVSRkFDRSAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHQxX2hpbnRzX29wZW4oIFQxX0hpbnRzICBoaW50cyApCi0gIHsKLSAgICBwc19oaW50c19vcGVuKCAoUFNfSGludHMpaGludHMsIFBTX0hJTlRfVFlQRV8xICk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZAotICB0MV9oaW50c19zdGVtKCBUMV9IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKQotICB7Ci0gICAgcHNfaGludHNfc3RlbSggKFBTX0hpbnRzKWhpbnRzLCBkaW1lbnNpb24sIDEsIGNvb3JkcyApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0MV9oaW50c19mdW5jc19pbml0KCBUMV9IaW50c19GdW5jc1JlYyogIGZ1bmNzICkKLSAgewotICAgIEZUX01FTV9aRVJPKCAoY2hhciopZnVuY3MsIHNpemVvZiAoICpmdW5jcyApICk7Ci0KLSAgICBmdW5jcy0+b3BlbiAgPSAoVDFfSGludHNfT3BlbkZ1bmMpICAgIHQxX2hpbnRzX29wZW47Ci0gICAgZnVuY3MtPmNsb3NlID0gKFQxX0hpbnRzX0Nsb3NlRnVuYykgICBwc19oaW50c19jbG9zZTsKLSAgICBmdW5jcy0+c3RlbSAgPSAoVDFfSGludHNfU2V0U3RlbUZ1bmMpIHQxX2hpbnRzX3N0ZW07Ci0gICAgZnVuY3MtPnN0ZW0zID0gKFQxX0hpbnRzX1NldFN0ZW0zRnVuYylwc19oaW50c190MXN0ZW0zOwotICAgIGZ1bmNzLT5yZXNldCA9IChUMV9IaW50c19SZXNldEZ1bmMpICAgcHNfaGludHNfdDFyZXNldDsKLSAgICBmdW5jcy0+YXBwbHkgPSAoVDFfSGludHNfQXBwbHlGdW5jKSAgIHBzX2hpbnRzX2FwcGx5OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgVFlQRSAyIEhJTlRTIFJFQ09SRElORyBJTlRFUkZBQ0UgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICB0Ml9oaW50c19vcGVuKCBUMl9IaW50cyAgaGludHMgKQotICB7Ci0gICAgcHNfaGludHNfb3BlbiggKFBTX0hpbnRzKWhpbnRzLCBQU19ISU5UX1RZUEVfMiApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICB0Ml9oaW50c19zdGVtcyggVDJfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX1BvcyAgc3RlbXNbMzJdLCB5LCBuOwotICAgIEZUX0ludCAgdG90YWwgPSBjb3VudDsKLQotCi0gICAgeSA9IDA7Ci0gICAgd2hpbGUgKCB0b3RhbCA+IDAgKQotICAgIHsKLSAgICAgIC8qIGRldGVybWluZSBudW1iZXIgb2Ygc3RlbXMgdG8gd3JpdGUgKi8KLSAgICAgIGNvdW50ID0gdG90YWw7Ci0gICAgICBpZiAoIGNvdW50ID4gMTYgKQotICAgICAgICBjb3VudCA9IDE2OwotCi0gICAgICAvKiBjb21wdXRlIGludGVnZXIgc3RlbSBwb3NpdGlvbnMgaW4gZm9udCB1bml0cyAqLwotICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudCAqIDI7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIHkgICAgICAgKz0gY29vcmRzW25dOwotICAgICAgICBzdGVtc1tuXSA9ICggeSArIDB4ODAwMEwgKSA+PiAxNjsKLSAgICAgIH0KLQotICAgICAgLyogY29tcHV0ZSBsZW5ndGhzICovCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50ICogMjsgbiArPSAyICkKLSAgICAgICAgc3RlbXNbbiArIDFdID0gc3RlbXNbbiArIDFdIC0gc3RlbXNbbl07Ci0KLSAgICAgIC8qIGFkZCB0aGVtIHRvIHRoZSBjdXJyZW50IGRpbWVuc2lvbiAqLwotICAgICAgcHNfaGludHNfc3RlbSggKFBTX0hpbnRzKWhpbnRzLCBkaW1lbnNpb24sIGNvdW50LCBzdGVtcyApOwotCi0gICAgICB0b3RhbCAtPSBjb3VudDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHQyX2hpbnRzX2Z1bmNzX2luaXQoIFQyX0hpbnRzX0Z1bmNzUmVjKiAgZnVuY3MgKQotICB7Ci0gICAgRlRfTUVNX1pFUk8oIGZ1bmNzLCBzaXplb2YgKCAqZnVuY3MgKSApOwotCi0gICAgZnVuY3MtPm9wZW4gICAgPSAoVDJfSGludHNfT3BlbkZ1bmMpICAgdDJfaGludHNfb3BlbjsKLSAgICBmdW5jcy0+Y2xvc2UgICA9IChUMl9IaW50c19DbG9zZUZ1bmMpICBwc19oaW50c19jbG9zZTsKLSAgICBmdW5jcy0+c3RlbXMgICA9IChUMl9IaW50c19TdGVtc0Z1bmMpICB0Ml9oaW50c19zdGVtczsKLSAgICBmdW5jcy0+aGludG1hc2s9IChUMl9IaW50c19NYXNrRnVuYykgICBwc19oaW50c190Mm1hc2s7Ci0gICAgZnVuY3MtPmNvdW50ZXIgPSAoVDJfSGludHNfQ291bnRlckZ1bmMpcHNfaGludHNfdDJjb3VudGVyOwotICAgIGZ1bmNzLT5hcHBseSAgID0gKFQyX0hpbnRzX0FwcGx5RnVuYykgIHBzX2hpbnRzX2FwcGx5OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNocmVjLmggYi9zcmMvcHNoaW50ZXIvcHNocmVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjMxOTcuLjAwMDAwMDAKLS0tIGEvc3JjL3BzaGludGVyL3BzaHJlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaHJlYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0c2NyaXB0IChUeXBlMS9UeXBlMikgaGludHMgcmVjb3JkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwMywgMjAwNiwgMjAwOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoZSBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGFyZSBjYWxsZWQgZnJvbSB0aGUgVHlwZSAxLCBDSUQgYW5kIENGRiAgICAqLwotICAvKiAgZm9udCBkcml2ZXJzIHRvIHJlY29yZCB0aGUgaGludHMgb2YgYSBnaXZlbiBjaGFyYWN0ZXIvZ2x5cGguICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoZSBoaW50cyBhcmUgcmVjb3JkZWQgaW4gYSB1bmlmaWVkIGZvcm1hdCwgYW5kIGFyZSBsYXRlciBwcm9jZXNzZWQgICAqLwotICAvKiAgYnkgdGhlIGBvcHRpbWl6ZXInIGFuZCBgZml0dGVyJyB0byBhZGp1c3QgdGhlIG91dGxpbmVzIHRvIHRoZSBwaXhlbCAgICovCi0gIC8qICBncmlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTSFJFQ19IX18KLSNkZWZpbmUgX19QU0hSRUNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLSNpbmNsdWRlICJwc2hnbG9iLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgIEdMWVBIIEhJTlRTIFJFQ09SREVSIElOVEVSTkFMUyAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBoYW5kbGUgdG8gaGludCByZWNvcmQgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNfSGludFJlY18qICBQU19IaW50OwotCi0gIC8qIGhpbnQgdHlwZXMgKi8KLSAgdHlwZWRlZiBlbnVtICBQU19IaW50X1R5cGVfCi0gIHsKLSAgICBQU19ISU5UX1RZUEVfMSA9IDEsCi0gICAgUFNfSElOVF9UWVBFXzIgPSAyCi0KLSAgfSBQU19IaW50X1R5cGU7Ci0KLQotICAvKiBoaW50IGZsYWdzICovCi0gIHR5cGVkZWYgZW51bSAgUFNfSGludF9GbGFnc18KLSAgewotICAgIFBTX0hJTlRfRkxBR19HSE9TVCAgPSAxLAotICAgIFBTX0hJTlRfRkxBR19CT1RUT00gPSAyCi0KLSAgfSBQU19IaW50X0ZsYWdzOwotCi0KLSAgLyogaGludCBkZXNjcmlwdG9yICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19IaW50UmVjXwotICB7Ci0gICAgRlRfSW50ICAgcG9zOwotICAgIEZUX0ludCAgIGxlbjsKLSAgICBGVF9VSW50ICBmbGFnczsKLQotICB9IFBTX0hpbnRSZWM7Ci0KLQotI2RlZmluZSBwc19oaW50X2lzX2FjdGl2ZSggeCApICAoICh4KS0+ZmxhZ3MgJiBQU19ISU5UX0ZMQUdfQUNUSVZFICkKLSNkZWZpbmUgcHNfaGludF9pc19naG9zdCggeCApICAgKCAoeCktPmZsYWdzICYgUFNfSElOVF9GTEFHX0dIT1NUICApCi0jZGVmaW5lIHBzX2hpbnRfaXNfYm90dG9tKCB4ICkgICggKHgpLT5mbGFncyAmIFBTX0hJTlRfRkxBR19CT1RUT00gKQotCi0KLSAgLyogaGludHMgdGFibGUgZGVzY3JpcHRvciAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfSGludF9UYWJsZVJlY18KLSAgewotICAgIEZUX1VJbnQgIG51bV9oaW50czsKLSAgICBGVF9VSW50ICBtYXhfaGludHM7Ci0gICAgUFNfSGludCAgaGludHM7Ci0KLSAgfSBQU19IaW50X1RhYmxlUmVjLCAqUFNfSGludF9UYWJsZTsKLQotCi0gIC8qIGhpbnQgYW5kIGNvdW50ZXIgbWFzayBkZXNjcmlwdG9yICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19NYXNrUmVjXwotICB7Ci0gICAgRlRfVUludCAgIG51bV9iaXRzOwotICAgIEZUX1VJbnQgICBtYXhfYml0czsKLSAgICBGVF9CeXRlKiAgYnl0ZXM7Ci0gICAgRlRfVUludCAgIGVuZF9wb2ludDsKLQotICB9IFBTX01hc2tSZWMsICpQU19NYXNrOwotCi0KLSAgLyogbWFza3MgYW5kIGNvdW50ZXJzIHRhYmxlIGRlc2NyaXB0b3IgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX01hc2tfVGFibGVSZWNfCi0gIHsKLSAgICBGVF9VSW50ICBudW1fbWFza3M7Ci0gICAgRlRfVUludCAgbWF4X21hc2tzOwotICAgIFBTX01hc2sgIG1hc2tzOwotCi0gIH0gUFNfTWFza19UYWJsZVJlYywgKlBTX01hc2tfVGFibGU7Ci0KLQotIC8qIGRpbWVuc2lvbi1zcGVjaWZpYyBoaW50cyBkZXNjcmlwdG9yICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19EaW1lbnNpb25SZWNfCi0gIHsKLSAgICBQU19IaW50X1RhYmxlUmVjICBoaW50czsKLSAgICBQU19NYXNrX1RhYmxlUmVjICBtYXNrczsKLSAgICBQU19NYXNrX1RhYmxlUmVjICBjb3VudGVyczsKLQotICB9IFBTX0RpbWVuc2lvblJlYywgKlBTX0RpbWVuc2lvbjsKLQotCi0gIC8qIGdseXBoIGhpbnRzIGRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGRpbWVuc2lvbiAwID0+IFggY29vcmRpbmF0ZXMgKyB2ZXJ0aWNhbCBoaW50cy9zdGVtcyAgICovCi0gIC8qIGRpbWVuc2lvbiAxID0+IFkgY29vcmRpbmF0ZXMgKyBob3Jpem9udGFsIGhpbnRzL3N0ZW1zICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19IaW50c1JlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfVUludDMyICAgICAgICBtYWdpYzsKLSAgICBQU19IaW50X1R5cGUgICAgIGhpbnRfdHlwZTsKLSAgICBQU19EaW1lbnNpb25SZWMgIGRpbWVuc2lvblsyXTsKLQotICB9IFBTX0hpbnRzUmVjLCAqUFNfSGludHM7Ci0KLSAgLyogKi8KLQotICAvKiBpbml0aWFsaXplIGhpbnRzIHJlY29yZGVyICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBzX2hpbnRzX2luaXQoIFBTX0hpbnRzICAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgLyogZmluYWxpemUgaGludHMgcmVjb3JkZXIgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19oaW50c19kb25lKCBQU19IaW50cyAgaGludHMgKTsKLQotICAvKiBpbml0aWFsaXplIFR5cGUxIGhpbnRzIHJlY29yZGVyIGludGVyZmFjZSAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHQxX2hpbnRzX2Z1bmNzX2luaXQoIFQxX0hpbnRzX0Z1bmNzUmVjKiAgZnVuY3MgKTsKLQotICAvKiBpbml0aWFsaXplIFR5cGUyIGhpbnRzIHJlY29yZGVyIGludGVyZmFjZSAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHQyX2hpbnRzX2Z1bmNzX2luaXQoIFQyX0hpbnRzX0Z1bmNzUmVjKiAgZnVuY3MgKTsKLQotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gIGV4dGVybiBQU19IaW50cyAgcHNfZGVidWdfaGludHM7Ci0gIGV4dGVybiAgaW50ICAgICAgcHNfZGVidWdfbm9faG9yel9oaW50czsKLSAgZXh0ZXJuICBpbnQgICAgICBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzOwotI2VuZGlmCi0KLSAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19QU19ISU5URVJfUkVDT1JEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzbmFtZXMvcHNtb2R1bGUuYyBiL3NyYy9wc25hbWVzL3BzbW9kdWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2ZlNDQuLjAwMDAwMDAKLS0tIGEvc3JjL3BzbmFtZXMvcHNtb2R1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc21vZHVsZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUFNOYW1lcyBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotCi0jaW5jbHVkZSAicHNtb2R1bGUuaCIKLSNpbmNsdWRlICJwc3RhYmxlcy5oIgotCi0jaW5jbHVkZSAicHNuYW1lcnIuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAotCi0KLSNkZWZpbmUgVkFSSUFOVF9CSVQgICAgICAgICAweDgwMDAwMDAwVUwKLSNkZWZpbmUgQkFTRV9HTFlQSCggY29kZSApICAoIChjb2RlKSAmIH5WQVJJQU5UX0JJVCApCi0KLQotICAvKiBSZXR1cm4gdGhlIFVuaWNvZGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGdseXBoLiAgTm90ZSB0aGF0ICovCi0gIC8qIHdlIGRvIGRlYWwgd2l0aCBnbHlwaCB2YXJpYW50cyBieSBkZXRlY3RpbmcgYSBub24taW5pdGlhbCBkb3QgaW4gICAgKi8KLSAgLyogdGhlIG5hbWUsIGFzIGluIGBBLnN3YXNoJyBvciBgZS5maW5hbCc7IGluIHRoaXMgY2FzZSwgdGhlICAgICAgICAgICAqLwotICAvKiBWQVJJQU5UX0JJVCBpcyBzZXQgaW4gdGhlIHJldHVybiB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX1VJbnQzMgotICBwc191bmljb2RlX3ZhbHVlKCBjb25zdCBjaGFyKiAgZ2x5cGhfbmFtZSApCi0gIHsKLSAgICAvKiBJZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCBgdW5pJywgdGhlbiB0aGUgZ2x5cGggbmFtZSBtYXkgYmUgYSAqLwotICAgIC8qIGhhcmQtY29kZWQgdW5pY29kZSBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBnbHlwaF9uYW1lWzBdID09ICd1JyAmJgotICAgICAgICAgZ2x5cGhfbmFtZVsxXSA9PSAnbicgJiYKLSAgICAgICAgIGdseXBoX25hbWVbMl0gPT0gJ2knICkKLSAgICB7Ci0gICAgICAvKiBkZXRlcm1pbmUgd2hldGhlciB0aGUgbmV4dCBmb3VyIGNoYXJhY3RlcnMgZm9sbG93aW5nIGFyZSAqLwotICAgICAgLyogaGV4YWRlY2ltYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgLyogWFhYOiBBZGQgY29kZSB0byBkZWFsIHdpdGggbGlnYXR1cmVzLCBpLmUuIGdseXBoIG5hbWVzIGxpa2UgKi8KLSAgICAgIC8qICAgICAgYHVuaVhYWFhZWVlZWlpaWicuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIEZUX0ludCAgICAgICBjb3VudDsKLSAgICAgIEZUX1VMb25nICAgICB2YWx1ZSA9IDA7Ci0gICAgICBjb25zdCBjaGFyKiAgcCAgICAgPSBnbHlwaF9uYW1lICsgMzsKLQotCi0gICAgICBmb3IgKCBjb3VudCA9IDQ7IGNvdW50ID4gMDsgY291bnQtLSwgcCsrICkKLSAgICAgIHsKLSAgICAgICAgY2hhciAgICAgICAgICBjID0gKnA7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgZDsKLQotCi0gICAgICAgIGQgPSAodW5zaWduZWQgY2hhciljIC0gJzAnOwotICAgICAgICBpZiAoIGQgPj0gMTAgKQotICAgICAgICB7Ci0gICAgICAgICAgZCA9ICh1bnNpZ25lZCBjaGFyKWMgLSAnQSc7Ci0gICAgICAgICAgaWYgKCBkID49IDYgKQotICAgICAgICAgICAgZCA9IDE2OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGQgKz0gMTA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBFeGl0IGlmIGEgbm9uLXVwcGVyY2FzZSBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgd2FzIGZvdW5kICAgKi8KLSAgICAgICAgLyogLS0gdGhpcyBhbHNvIGNhdGNoZXMgY2hhcmFjdGVyIGNvZGVzIGJlbG93IGAwJyBzaW5jZSBzdWNoICovCi0gICAgICAgIC8qIG5lZ2F0aXZlIG51bWJlcnMgY2FzdCB0byBgdW5zaWduZWQgaW50JyBhcmUgZmFyIHRvbyBiaWcuICAqLwotICAgICAgICBpZiAoIGQgPj0gMTYgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHZhbHVlID0gKCB2YWx1ZSA8PCA0ICkgKyBkOwotICAgICAgfQotCi0gICAgICAvKiB0aGVyZSBtdXN0IGJlIGV4YWN0bHkgZm91ciBoZXggZGlnaXRzICovCi0gICAgICBpZiAoIGNvdW50ID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoICpwID09ICdcMCcgKQotICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgaWYgKCAqcCA9PSAnLicgKQotICAgICAgICAgIHJldHVybiB2YWx1ZSB8IFZBUklBTlRfQklUOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIElmIHRoZSBuYW1lIGJlZ2lucyB3aXRoIGB1JywgZm9sbG93ZWQgYnkgZm91ciB0byBzaXggdXBwZXJjYXNlICovCi0gICAgLyogaGV4YWRlY2ltYWwgZGlnaXRzLCBpdCBpcyBhIGhhcmQtY29kZWQgdW5pY29kZSBjaGFyYWN0ZXIgY29kZS4gKi8KLSAgICBpZiAoIGdseXBoX25hbWVbMF0gPT0gJ3UnICkKLSAgICB7Ci0gICAgICBGVF9JbnQgICAgICAgY291bnQ7Ci0gICAgICBGVF9VTG9uZyAgICAgdmFsdWUgPSAwOwotICAgICAgY29uc3QgY2hhciogIHAgICAgID0gZ2x5cGhfbmFtZSArIDE7Ci0KLQotICAgICAgZm9yICggY291bnQgPSA2OyBjb3VudCA+IDA7IGNvdW50LS0sIHArKyApCi0gICAgICB7Ci0gICAgICAgIGNoYXIgICAgICAgICAgYyA9ICpwOwotICAgICAgICB1bnNpZ25lZCBpbnQgIGQ7Ci0KLQotICAgICAgICBkID0gKHVuc2lnbmVkIGNoYXIpYyAtICcwJzsKLSAgICAgICAgaWYgKCBkID49IDEwICkKLSAgICAgICAgewotICAgICAgICAgIGQgPSAodW5zaWduZWQgY2hhciljIC0gJ0EnOwotICAgICAgICAgIGlmICggZCA+PSA2ICkKLSAgICAgICAgICAgIGQgPSAxNjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkICs9IDEwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBkID49IDE2ICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICB2YWx1ZSA9ICggdmFsdWUgPDwgNCApICsgZDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBjb3VudCA8PSAyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAqcCA9PSAnXDAnICkKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIGlmICggKnAgPT0gJy4nICkKLSAgICAgICAgICByZXR1cm4gdmFsdWUgfCBWQVJJQU5UX0JJVDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBMb29rIGZvciBhIG5vbi1pbml0aWFsIGRvdCBpbiB0aGUgZ2x5cGggbmFtZSBpbiBvcmRlciB0byAqLwotICAgIC8qIGZpbmQgdmFyaWFudHMgbGlrZSBgQS5zd2FzaCcsIGBlLmZpbmFsJywgZXRjLiAgICAgICAgICAgICovCi0gICAgewotICAgICAgY29uc3QgY2hhciogIHAgICA9IGdseXBoX25hbWU7Ci0gICAgICBjb25zdCBjaGFyKiAgZG90ID0gTlVMTDsKLQotCi0gICAgICBmb3IgKCA7ICpwOyBwKysgKQotICAgICAgewotICAgICAgICBpZiAoICpwID09ICcuJyAmJiBwID4gZ2x5cGhfbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICBkb3QgPSBwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBsb29rIHVwIHRoZSBnbHlwaCBpbiB0aGUgQWRvYmUgR2x5cGggTGlzdCAqLwotICAgICAgaWYgKCAhZG90ICkKLSAgICAgICAgcmV0dXJuIGZ0X2dldF9hZG9iZV9nbHlwaF9pbmRleCggZ2x5cGhfbmFtZSwgcCApOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZnRfZ2V0X2Fkb2JlX2dseXBoX2luZGV4KCBnbHlwaF9uYW1lLCBkb3QgKSB8IFZBUklBTlRfQklUOwotICAgIH0KLSAgfQotCi0KLSAgLyogZnRfcXNvcnQgY2FsbGJhY2sgdG8gc29ydCB0aGUgdW5pY29kZSBtYXAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQotICBjb21wYXJlX3VuaV9tYXBzKCBjb25zdCB2b2lkKiAgYSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIGIgKQotICB7Ci0gICAgUFNfVW5pTWFwKiAgbWFwMSA9IChQU19VbmlNYXAqKWE7Ci0gICAgUFNfVW5pTWFwKiAgbWFwMiA9IChQU19VbmlNYXAqKWI7Ci0gICAgRlRfVUludDMyICAgdW5pY29kZTEgPSBCQVNFX0dMWVBIKCBtYXAxLT51bmljb2RlICk7Ci0gICAgRlRfVUludDMyICAgdW5pY29kZTIgPSBCQVNFX0dMWVBIKCBtYXAyLT51bmljb2RlICk7Ci0KLQotICAgIC8qIHNvcnQgYmFzZSBnbHlwaHMgYmVmb3JlIGdseXBoIHZhcmlhbnRzICovCi0gICAgaWYgKCB1bmljb2RlMSA9PSB1bmljb2RlMiApCi0gICAgICByZXR1cm4gbWFwMS0+dW5pY29kZSAtIG1hcDItPnVuaWNvZGU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHVuaWNvZGUxIC0gdW5pY29kZTI7Ci0gIH0KLQotCi0gIC8qIHN1cHBvcnQgZm9yIG9sZCBXR0w0IGZvbnRzICovCi0KLSNkZWZpbmUgV0dMX0VYVFJBX0xJU1RfU0laRSAgOAotCi0gIHN0YXRpYyBjb25zdCBGVF9VSW50MzIgIGZ0X3dnbF9leHRyYV91bmljb2Rlc1tXR0xfRVhUUkFfTElTVF9TSVpFXSA9Ci0gIHsKLSAgICAweDAzOTQsCi0gICAgMHgwM0E5LAotICAgIDB4MjIxNSwKLSAgICAweDAwQUQsCi0gICAgMHgwMkM5LAotICAgIDB4MDNCQywKLSAgICAweDIyMTksCi0gICAgMHgwMEEwCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXIgIGZ0X3dnbF9leHRyYV9nbHlwaF9uYW1lc1tdID0KLSAgewotICAgICdEJywnZScsJ2wnLCd0JywnYScsMCwKLSAgICAnTycsJ20nLCdlJywnZycsJ2EnLDAsCi0gICAgJ2YnLCdyJywnYScsJ2MnLCd0JywnaScsJ28nLCduJywwLAotICAgICdoJywneScsJ3AnLCdoJywnZScsJ24nLDAsCi0gICAgJ20nLCdhJywnYycsJ3InLCdvJywnbicsMCwKLSAgICAnbScsJ3UnLDAsCi0gICAgJ3AnLCdlJywncicsJ2knLCdvJywnZCcsJ2MnLCdlJywnbicsJ3QnLCdlJywncicsJ2UnLCdkJywwLAotICAgICdzJywncCcsJ2EnLCdjJywnZScsMAotICB9OwotCi0gIHN0YXRpYyBjb25zdCBGVF9JbnQKLSAgZnRfd2dsX2V4dHJhX2dseXBoX25hbWVfb2Zmc2V0c1tXR0xfRVhUUkFfTElTVF9TSVpFXSA9Ci0gIHsKLSAgICAgMCwKLSAgICAgNiwKLSAgICAxMiwKLSAgICAyMSwKLSAgICAyOCwKLSAgICAzNSwKLSAgICAzOCwKLSAgICA1MwotICB9OwotCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNfY2hlY2tfd2dsX25hbWUoIGNvbnN0IGNoYXIqICBnbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQqICAgICB3Z2xfZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgKnN0YXRlcyApCi0gIHsKLSAgICBGVF9VSW50ICBuOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IFdHTF9FWFRSQV9MSVNUX1NJWkU7IG4rKyApCi0gICAgewotICAgICAgaWYgKCBmdF9zdHJjbXAoIGZ0X3dnbF9leHRyYV9nbHlwaF9uYW1lcyArCi0gICAgICAgICAgICAgICAgICAgICAgICBmdF93Z2xfZXh0cmFfZ2x5cGhfbmFtZV9vZmZzZXRzW25dLCBnbmFtZSApID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoIHN0YXRlc1tuXSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIC8qIG1hcmsgdGhpcyBXR0wgZXh0cmEgZ2x5cGggYXMgYSBjYW5kaWRhdGUgZm9yIHRoZSBjbWFwICovCi0gICAgICAgICAgc3RhdGVzW25dICAgICA9IDE7Ci0gICAgICAgICAgd2dsX2dseXBoc1tuXSA9IGdseXBoOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNfY2hlY2tfd2dsX3VuaWNvZGUoIEZUX1VJbnQzMiAgdW5pX2NoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKnN0YXRlcyApCi0gIHsKLSAgICBGVF9VSW50ICBuOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IFdHTF9FWFRSQV9MSVNUX1NJWkU7IG4rKyApCi0gICAgewotICAgICAgaWYgKCB1bmlfY2hhciA9PSBmdF93Z2xfZXh0cmFfdW5pY29kZXNbbl0gKQotICAgICAgewotICAgICAgICAvKiBkaXNhYmxlIHRoaXMgV0dMIGV4dHJhIGdseXBoIGZyb20gYmVpbmcgYWRkZWQgdG8gdGhlIGNtYXAgKi8KLSAgICAgICAgc3RhdGVzW25dID0gMjsKLQotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBCdWlsZCBhIHRhYmxlIHRoYXQgbWFwcyBVbmljb2RlIHZhbHVlcyB0byBnbHlwaCBpbmRpY2VzLiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfdW5pY29kZXNfaW5pdCggRlRfTWVtb3J5ICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgUFNfVW5pY29kZXMgICAgICAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgUFNfR2V0R2x5cGhOYW1lRnVuYyAgIGdldF9nbHlwaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICBQU19GcmVlR2x5cGhOYW1lRnVuYyAgZnJlZV9nbHlwaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgICAgICAgZ2x5cGhfZGF0YSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICBGVF9VSW50ICB3Z2xfbGlzdF9zdGF0ZXNbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwotICAgIEZUX1VJbnQgIHdnbF9nbHlwaHNbV0dMX0VYVFJBX0xJU1RfU0laRV07Ci0KLQotICAgIC8qIHdlIGZpcnN0IGFsbG9jYXRlIHRoZSB0YWJsZSAqLwotICAgIHRhYmxlLT5udW1fbWFwcyA9IDA7Ci0gICAgdGFibGUtPm1hcHMgICAgID0gMDsKLQotICAgIGlmICggIUZUX05FV19BUlJBWSggdGFibGUtPm1hcHMsIG51bV9nbHlwaHMgKyBXR0xfRVhUUkFfTElTVF9TSVpFICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgIG47Ci0gICAgICBGVF9VSW50ICAgICBjb3VudDsKLSAgICAgIFBTX1VuaU1hcCogIG1hcDsKLSAgICAgIEZUX1VJbnQzMiAgIHVuaV9jaGFyOwotCi0KLSAgICAgIG1hcCA9IHRhYmxlLT5tYXBzOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIqICBnbmFtZSA9IGdldF9nbHlwaF9uYW1lKCBnbHlwaF9kYXRhLCBuICk7Ci0KLQotICAgICAgICBpZiAoIGduYW1lICkKLSAgICAgICAgewotICAgICAgICAgIHBzX2NoZWNrX3dnbF9uYW1lKCBnbmFtZSwgbiwgd2dsX2dseXBocywgd2dsX2xpc3Rfc3RhdGVzICk7Ci0gICAgICAgICAgdW5pX2NoYXIgPSBwc191bmljb2RlX3ZhbHVlKCBnbmFtZSApOwotCi0gICAgICAgICAgaWYgKCBCQVNFX0dMWVBIKCB1bmlfY2hhciApICE9IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBzX2NoZWNrX3dnbF91bmljb2RlKCB1bmlfY2hhciwgd2dsX2xpc3Rfc3RhdGVzICk7Ci0gICAgICAgICAgICBtYXAtPnVuaWNvZGUgICAgID0gdW5pX2NoYXI7Ci0gICAgICAgICAgICBtYXAtPmdseXBoX2luZGV4ID0gbjsKLSAgICAgICAgICAgIG1hcCsrOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggZnJlZV9nbHlwaF9uYW1lICkKLSAgICAgICAgICAgIGZyZWVfZ2x5cGhfbmFtZSggZ2x5cGhfZGF0YSwgZ25hbWUgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IFdHTF9FWFRSQV9MSVNUX1NJWkU7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggd2dsX2xpc3Rfc3RhdGVzW25dID09IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBnbHlwaCBuYW1lIGhhcyBhbiBhZGRpdGlvbmFsIFdHTDQgcmVwcmVzZW50YXRpb24uICovCi0gICAgICAgICAgLyogQWRkIGl0IHRvIHRoZSBjbWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICBtYXAtPnVuaWNvZGUgICAgID0gZnRfd2dsX2V4dHJhX3VuaWNvZGVzW25dOwotICAgICAgICAgIG1hcC0+Z2x5cGhfaW5kZXggPSB3Z2xfZ2x5cGhzW25dOwotICAgICAgICAgIG1hcCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBjb21wcmVzcyB0aGUgdGFibGUgYSBiaXQgKi8KLSAgICAgIGNvdW50ID0gKEZUX1VJbnQpKCBtYXAgLSB0YWJsZS0+bWFwcyApOwotCi0gICAgICBpZiAoIGNvdW50ID09IDAgKQotICAgICAgewotICAgICAgICBGVF9GUkVFKCB0YWJsZS0+bWFwcyApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgZXJyb3IgPSBQU25hbWVzX0Vycl9JbnZhbGlkX0FyZ3VtZW50OyAgLyogTm8gdW5pY29kZSBjaGFycyBoZXJlISAqLwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIC8qIFJlYWxsb2NhdGUgaWYgdGhlIG51bWJlciBvZiB1c2VkIGVudHJpZXMgaXMgbXVjaCBzbWFsbGVyLiAqLwotICAgICAgICBpZiAoIGNvdW50IDwgbnVtX2dseXBocyAvIDIgKQotICAgICAgICB7Ci0gICAgICAgICAgKHZvaWQpRlRfUkVORVdfQVJSQVkoIHRhYmxlLT5tYXBzLCBudW1fZ2x5cGhzLCBjb3VudCApOwotICAgICAgICAgIGVycm9yID0gUFNuYW1lc19FcnJfT2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTb3J0IHRoZSB0YWJsZSBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIHVuaWNvZGUgdmFsdWVzLCAqLwotICAgICAgICAvKiB0YWtpbmcgY2FyZSBvZiBnbHlwaCB2YXJpYW50cy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBmdF9xc29ydCggdGFibGUtPm1hcHMsIGNvdW50LCBzaXplb2YgKCBQU19VbmlNYXAgKSwKLSAgICAgICAgICAgICAgICAgIGNvbXBhcmVfdW5pX21hcHMgKTsKLSAgICAgIH0KLQotICAgICAgdGFibGUtPm51bV9tYXBzID0gY291bnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICBwc191bmljb2Rlc19jaGFyX2luZGV4KCBQU19Vbmljb2RlcyAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICB1bmljb2RlICkKLSAgewotICAgIFBTX1VuaU1hcCAgKm1pbiwgKm1heCwgKm1pZCwgKnJlc3VsdCA9IE5VTEw7Ci0KLQotICAgIC8qIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIG9uIHRoZSB0YWJsZS4gKi8KLQotICAgIG1pbiA9IHRhYmxlLT5tYXBzOwotICAgIG1heCA9IG1pbiArIHRhYmxlLT5udW1fbWFwcyAtIDE7Ci0KLSAgICB3aGlsZSAoIG1pbiA8PSBtYXggKQotICAgIHsKLSAgICAgIEZUX1VJbnQzMiAgYmFzZV9nbHlwaDsKLQotCi0gICAgICBtaWQgPSBtaW4gKyAoICggbWF4IC0gbWluICkgPj4gMSApOwotCi0gICAgICBpZiAoIG1pZC0+dW5pY29kZSA9PSB1bmljb2RlICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbWlkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgYmFzZV9nbHlwaCA9IEJBU0VfR0xZUEgoIG1pZC0+dW5pY29kZSApOwotCi0gICAgICBpZiAoIGJhc2VfZ2x5cGggPT0gdW5pY29kZSApCi0gICAgICAgIHJlc3VsdCA9IG1pZDsgLyogcmVtZW1iZXIgbWF0Y2ggYnV0IGNvbnRpbnVlIHNlYXJjaCBmb3IgYmFzZSBnbHlwaCAqLwotCi0gICAgICBpZiAoIG1pbiA9PSBtYXggKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBiYXNlX2dseXBoIDwgdW5pY29kZSApCi0gICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIG1heCA9IG1pZCAtIDE7Ci0gICAgfQotCi0gICAgaWYgKCByZXN1bHQgKQotICAgICAgcmV0dXJuIHJlc3VsdC0+Z2x5cGhfaW5kZXg7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VTG9uZwotICBwc191bmljb2Rlc19jaGFyX25leHQoIFBTX1VuaWNvZGVzICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAqdW5pY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCAgICA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgPSAqdW5pY29kZSArIDE7Ci0KLQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgIG1pbiA9IDA7Ci0gICAgICBGVF9VSW50ICAgICBtYXggPSB0YWJsZS0+bnVtX21hcHM7Ci0gICAgICBGVF9VSW50ICAgICBtaWQ7Ci0gICAgICBQU19VbmlNYXAqICBtYXA7Ci0gICAgICBGVF9VSW50MzIgICBiYXNlX2dseXBoOwotCi0KLSAgICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICAgIHsKLSAgICAgICAgbWlkID0gbWluICsgKCAoIG1heCAtIG1pbiApID4+IDEgKTsKLSAgICAgICAgbWFwID0gdGFibGUtPm1hcHMgKyBtaWQ7Ci0KLSAgICAgICAgaWYgKCBtYXAtPnVuaWNvZGUgPT0gY2hhcl9jb2RlICkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG1hcC0+Z2x5cGhfaW5kZXg7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgYmFzZV9nbHlwaCA9IEJBU0VfR0xZUEgoIG1hcC0+dW5pY29kZSApOwotCi0gICAgICAgIGlmICggYmFzZV9nbHlwaCA9PSBjaGFyX2NvZGUgKQotICAgICAgICAgIHJlc3VsdCA9IG1hcC0+Z2x5cGhfaW5kZXg7Ci0KLSAgICAgICAgaWYgKCBiYXNlX2dseXBoIDwgY2hhcl9jb2RlICkKLSAgICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbWF4ID0gbWlkOwotICAgICAgfQotCi0gICAgICBpZiAoIHJlc3VsdCApCi0gICAgICAgIGdvdG8gRXhpdDsgICAgICAgICAgICAgICAvKiB3ZSBoYXZlIGEgdmFyaWFudCBnbHlwaCAqLwotCi0gICAgICAvKiB3ZSBkaWRuJ3QgZmluZCBpdDsgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgbWFwIGp1c3QgYWJvdmUgaXQgKi8KLSAgICAgIGNoYXJfY29kZSA9IDA7Ci0KLSAgICAgIGlmICggbWluIDwgdGFibGUtPm51bV9tYXBzICkKLSAgICAgIHsKLSAgICAgICAgbWFwICAgICAgID0gdGFibGUtPm1hcHMgKyBtaW47Ci0gICAgICAgIHJlc3VsdCAgICA9IG1hcC0+Z2x5cGhfaW5kZXg7Ci0gICAgICAgIGNoYXJfY29kZSA9IEJBU0VfR0xZUEgoIG1hcC0+dW5pY29kZSApOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgICp1bmljb2RlID0gY2hhcl9jb2RlOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUICovCi0KLQotICBzdGF0aWMgY29uc3QgY2hhcioKLSAgcHNfZ2V0X21hY2ludG9zaF9uYW1lKCBGVF9VSW50ICBuYW1lX2luZGV4ICkKLSAgewotICAgIGlmICggbmFtZV9pbmRleCA+PSBGVF9OVU1fTUFDX05BTUVTICkKLSAgICAgIG5hbWVfaW5kZXggPSAwOwotCi0gICAgcmV0dXJuIGZ0X3N0YW5kYXJkX2dseXBoX25hbWVzICsgZnRfbWFjX25hbWVzW25hbWVfaW5kZXhdOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgY2hhcioKLSAgcHNfZ2V0X3N0YW5kYXJkX3N0cmluZ3MoIEZUX1VJbnQgIHNpZCApCi0gIHsKLSAgICBpZiAoIHNpZCA+PSBGVF9OVU1fU0lEX05BTUVTICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGZ0X3N0YW5kYXJkX2dseXBoX25hbWVzICsgZnRfc2lkX25hbWVzW3NpZF07Ci0gIH0KLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9TZXJ2aWNlX1BzQ01hcHNSZWMgIHBzY21hcHNfaW50ZXJmYWNlID0KLSAgewotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAotCi0gICAgKFBTX1VuaWNvZGVfVmFsdWVGdW5jKSAgICAgcHNfdW5pY29kZV92YWx1ZSwKLSAgICAoUFNfVW5pY29kZXNfSW5pdEZ1bmMpICAgICBwc191bmljb2Rlc19pbml0LAotICAgIChQU19Vbmljb2Rlc19DaGFySW5kZXhGdW5jKXBzX3VuaWNvZGVzX2NoYXJfaW5kZXgsCi0gICAgKFBTX1VuaWNvZGVzX0NoYXJOZXh0RnVuYykgcHNfdW5pY29kZXNfY2hhcl9uZXh0LAotCi0jZWxzZQotCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVCAqLwotCi0gICAgKFBTX01hY2ludG9zaF9OYW1lRnVuYykgICAgcHNfZ2V0X21hY2ludG9zaF9uYW1lLAotICAgIChQU19BZG9iZV9TdGRfU3RyaW5nc0Z1bmMpIHBzX2dldF9zdGFuZGFyZF9zdHJpbmdzLAotCi0gICAgdDFfc3RhbmRhcmRfZW5jb2RpbmcsCi0gICAgdDFfZXhwZXJ0X2VuY29kaW5nCi0gIH07Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIHBzY21hcHNfc2VydmljZXNbXSA9Ci0gIHsKLSAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9DTUFQUywgJnBzY21hcHNfaW50ZXJmYWNlIH0sCi0gICAgeyBOVUxMLCBOVUxMIH0KLSAgfTsKLQotCi0gIHN0YXRpYyBGVF9Qb2ludGVyCi0gIHBzbmFtZXNfZ2V0X3NlcnZpY2UoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzZXJ2aWNlX2lkICkKLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0KLSAgICByZXR1cm4gZnRfc2VydmljZV9saXN0X2xvb2t1cCggcHNjbWFwc19zZXJ2aWNlcywgc2VydmljZV9pZCApOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgKi8KLQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX01vZHVsZV9DbGFzcyAgcHNuYW1lc19tb2R1bGVfY2xhc3MgPQotICB7Ci0gICAgMCwgIC8qIHRoaXMgaXMgbm90IGEgZm9udCBkcml2ZXIsIG5vciBhIHJlbmRlcmVyICovCi0gICAgc2l6ZW9mICggRlRfTW9kdWxlUmVjICksCi0KLSAgICAicHNuYW1lcyIsICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MTAwMDBMLCAgIC8qIGRyaXZlciB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyMDAwMEwsICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIgb3IgYWJvdmUgKi8KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLSAgICAwLAotICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpMCwKLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIDAsCi0gICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICAwCi0jZWxzZQotICAgICh2b2lkKikmcHNjbWFwc19pbnRlcmZhY2UsICAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpMCwKLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIDAsCi0gICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICBwc25hbWVzX2dldF9zZXJ2aWNlCi0jZW5kaWYKLSAgfTsKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL3BzbW9kdWxlLmggYi9zcmMvcHNuYW1lcy9wc21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzJmZGZiLi4wMDAwMDAwCi0tLSBhL3NyYy9wc25hbWVzL3BzbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc21vZHVsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBQU05hbWVzIG1vZHVsZSBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU01PRFVMRV9IX18KLSNkZWZpbmUgX19QU01PRFVMRV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgKSAgcHNuYW1lc19tb2R1bGVfY2xhc3M7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19QU01PRFVMRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL3BzbmFtZXJyLmggYi9zcmMvcHNuYW1lcy9wc25hbWVyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTE1NDFkLi4wMDAwMDAwCi0tLSBhL3NyYy9wc25hbWVzL3BzbmFtZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc25hbWVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUFMgbmFtZXMgbW9kdWxlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTIG5hbWVzIG1vZHVsZSBlcnJvciBlbnVtZXJhdGlvbiAgICAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1BTTkFNRVJSX0hfXwotI2RlZmluZSBfX1BTTkFNRVJSX0hfXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgUFNuYW1lc19FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfUFNuYW1lcwotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogX19QU05BTUVSUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL3BzbmFtZXMuYyBiL3NyYy9wc25hbWVzL3BzbmFtZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlZDk5OC4uMDAwMDAwMAotLS0gYS9zcmMvcHNuYW1lcy9wc25hbWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc25hbWVzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUFNOYW1lcyBtb2R1bGUgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJwc21vZHVsZS5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaCBiL3NyYy9wc25hbWVzL3BzdGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNDBlZjcuLjAwMDAwMDAKLS0tIGEvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHN0YWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSAtLSBkbyBub3QgZWRpdCEgKi8KLQotCi0gIHN0YXRpYyBjb25zdCBjaGFyICBmdF9zdGFuZGFyZF9nbHlwaF9uYW1lc1szNjk2XSA9Ci0gIHsKLSAgICAnLicsJ24nLCd1JywnbCcsJ2wnLCAwLAotICAgICduJywnbycsJ24nLCdtJywnYScsJ3InLCdrJywnaScsJ24nLCdnJywncicsJ2UnLCd0JywndScsJ3InLCduJywgMCwKLSAgICAnbicsJ28nLCd0JywnZScsJ3EnLCd1JywnYScsJ2wnLCAwLAotICAgICdpJywnbicsJ2YnLCdpJywnbicsJ2knLCd0JywneScsIDAsCi0gICAgJ2wnLCdlJywncycsJ3MnLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ2cnLCdyJywnZScsJ2EnLCd0JywnZScsJ3InLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ3QnLCdpJywnYScsJ2wnLCdkJywnaScsJ2YnLCdmJywgMCwKLSAgICAncycsJ3UnLCdtJywnbScsJ2EnLCd0JywnaScsJ28nLCduJywgMCwKLSAgICAncCcsJ3InLCdvJywnZCcsJ3UnLCdjJywndCcsIDAsCi0gICAgJ3AnLCdpJywgMCwKLSAgICAnaScsJ24nLCd0JywnZScsJ2cnLCdyJywnYScsJ2wnLCAwLAotICAgICdPJywnbScsJ2UnLCdnJywnYScsIDAsCi0gICAgJ3InLCdhJywnZCcsJ2knLCdjJywnYScsJ2wnLCAwLAotICAgICdhJywncCcsJ3AnLCdyJywnbycsJ3gnLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ0QnLCdlJywnbCcsJ3QnLCdhJywgMCwKLSAgICAnbicsJ28nLCduJywnYicsJ3InLCdlJywnYScsJ2snLCdpJywnbicsJ2cnLCdzJywncCcsJ2EnLCdjJywnZScsIDAsCi0gICAgJ2wnLCdvJywneicsJ2UnLCduJywnZycsJ2UnLCAwLAotICAgICdhJywncCcsJ3AnLCdsJywnZScsIDAsCi0gICAgJ2YnLCdyJywnYScsJ24nLCdjJywgMCwKLSAgICAnRycsJ2InLCdyJywnZScsJ3YnLCdlJywgMCwKLSAgICAnZycsJ2InLCdyJywnZScsJ3YnLCdlJywgMCwKLSAgICAnSScsJ2QnLCdvJywndCcsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsIDAsCi0gICAgJ1MnLCdjJywnZScsJ2QnLCdpJywnbCcsJ2wnLCdhJywgMCwKLSAgICAncycsJ2MnLCdlJywnZCcsJ2knLCdsJywnbCcsJ2EnLCAwLAotICAgICdDJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdjJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdDJywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdjJywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdkJywnYycsJ3InLCdvJywnYScsJ3QnLCAwLAotICAgICcuJywnbicsJ28nLCd0JywnZCcsJ2UnLCdmJywgMCwKLSAgICAncycsJ3AnLCdhJywnYycsJ2UnLCAwLAotICAgICdlJywneCcsJ2MnLCdsJywnYScsJ20nLCAwLAotICAgICdxJywndScsJ28nLCd0JywnZScsJ2QnLCdiJywnbCcsIDAsCi0gICAgJ24nLCd1JywnbScsJ2InLCdlJywncicsJ3MnLCdpJywnZycsJ24nLCAwLAotICAgICdkJywnbycsJ2wnLCdsJywnYScsJ3InLCAwLAotICAgICdwJywnZScsJ3InLCdjJywnZScsJ24nLCd0JywgMCwKLSAgICAnYScsJ20nLCdwJywnZScsJ3InLCdzJywnYScsJ24nLCdkJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywnbCcsJ2UnLCdmJywndCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywncicsJ2knLCdnJywnaCcsJ3QnLCAwLAotICAgICdhJywncycsJ3QnLCdlJywncicsJ2knLCdzJywnaycsIDAsCi0gICAgJ3AnLCdsJywndScsJ3MnLCAwLAotICAgICdjJywnbycsJ20nLCdtJywnYScsIDAsCi0gICAgJ2gnLCd5JywncCcsJ2gnLCdlJywnbicsIDAsCi0gICAgJ3AnLCdlJywncicsJ2knLCdvJywnZCcsIDAsCi0gICAgJ3MnLCdsJywnYScsJ3MnLCdoJywgMCwKLSAgICAneicsJ2UnLCdyJywnbycsIDAsCi0gICAgJ28nLCduJywnZScsIDAsCi0gICAgJ3QnLCd3JywnbycsIDAsCi0gICAgJ3QnLCdoJywncicsJ2UnLCdlJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsIDAsCi0gICAgJ2YnLCdpJywndicsJ2UnLCAwLAotICAgICdzJywnaScsJ3gnLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsIDAsCi0gICAgJ2UnLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnbicsJ2knLCduJywnZScsIDAsCi0gICAgJ2MnLCdvJywnbCcsJ28nLCduJywgMCwKLSAgICAncycsJ2UnLCdtJywnaScsJ2MnLCdvJywnbCcsJ28nLCduJywgMCwKLSAgICAnbCcsJ2UnLCdzJywncycsIDAsCi0gICAgJ2UnLCdxJywndScsJ2EnLCdsJywgMCwKLSAgICAnZycsJ3InLCdlJywnYScsJ3QnLCdlJywncicsIDAsCi0gICAgJ3EnLCd1JywnZScsJ3MnLCd0JywnaScsJ28nLCduJywgMCwKLSAgICAnYScsJ3QnLCAwLAotICAgICdBJywgMCwKLSAgICAnQicsIDAsCi0gICAgJ0MnLCAwLAotICAgICdEJywgMCwKLSAgICAnRScsIDAsCi0gICAgJ0YnLCAwLAotICAgICdHJywgMCwKLSAgICAnSCcsIDAsCi0gICAgJ0knLCAwLAotICAgICdKJywgMCwKLSAgICAnSycsIDAsCi0gICAgJ0wnLCAwLAotICAgICdNJywgMCwKLSAgICAnTicsIDAsCi0gICAgJ08nLCAwLAotICAgICdQJywgMCwKLSAgICAnUScsIDAsCi0gICAgJ1InLCAwLAotICAgICdTJywgMCwKLSAgICAnVCcsIDAsCi0gICAgJ1UnLCAwLAotICAgICdWJywgMCwKLSAgICAnVycsIDAsCi0gICAgJ1gnLCAwLAotICAgICdZJywgMCwKLSAgICAnWicsIDAsCi0gICAgJ2InLCdyJywnYScsJ2MnLCdrJywnZScsJ3QnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnYicsJ2EnLCdjJywnaycsJ3MnLCdsJywnYScsJ3MnLCdoJywgMCwKLSAgICAnYicsJ3InLCdhJywnYycsJ2snLCdlJywndCcsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnYScsJ3MnLCdjJywnaScsJ2knLCdjJywnaScsJ3InLCdjJywndScsJ20nLCAwLAotICAgICd1JywnbicsJ2QnLCdlJywncicsJ3MnLCdjJywnbycsJ3InLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnYScsIDAsCi0gICAgJ2InLCAwLAotICAgICdjJywgMCwKLSAgICAnZCcsIDAsCi0gICAgJ2UnLCAwLAotICAgICdmJywgMCwKLSAgICAnZycsIDAsCi0gICAgJ2gnLCAwLAotICAgICdpJywgMCwKLSAgICAnaicsIDAsCi0gICAgJ2snLCAwLAotICAgICdsJywgMCwKLSAgICAnbScsIDAsCi0gICAgJ24nLCAwLAotICAgICdvJywgMCwKLSAgICAncCcsIDAsCi0gICAgJ3EnLCAwLAotICAgICdyJywgMCwKLSAgICAncycsIDAsCi0gICAgJ3QnLCAwLAotICAgICd1JywgMCwKLSAgICAndicsIDAsCi0gICAgJ3cnLCAwLAotICAgICd4JywgMCwKLSAgICAneScsIDAsCi0gICAgJ3onLCAwLAotICAgICdiJywncicsJ2EnLCdjJywnZScsJ2wnLCdlJywnZicsJ3QnLCAwLAotICAgICdiJywnYScsJ3InLCAwLAotICAgICdiJywncicsJ2EnLCdjJywnZScsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnYScsJ3MnLCdjJywnaScsJ2knLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ2UnLCd4JywnYycsJ2wnLCdhJywnbScsJ2QnLCdvJywndycsJ24nLCAwLAotICAgICdjJywnZScsJ24nLCd0JywgMCwKLSAgICAncycsJ3QnLCdlJywncicsJ2wnLCdpJywnbicsJ2cnLCAwLAotICAgICdmJywncicsJ2EnLCdjJywndCcsJ2knLCdvJywnbicsIDAsCi0gICAgJ3knLCdlJywnbicsIDAsCi0gICAgJ2YnLCdsJywnbycsJ3InLCdpJywnbicsIDAsCi0gICAgJ3MnLCdlJywnYycsJ3QnLCdpJywnbycsJ24nLCAwLAotICAgICdjJywndScsJ3InLCdyJywnZScsJ24nLCdjJywneScsIDAsCi0gICAgJ3EnLCd1JywnbycsJ3QnLCdlJywncycsJ2knLCduJywnZycsJ2wnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnZycsJ3UnLCdpJywnbCcsJ2wnLCdlJywnbScsJ28nLCd0JywnbCcsJ2UnLCdmJywndCcsIDAsCi0gICAgJ2cnLCd1JywnaScsJ2wnLCdzJywnaScsJ24nLCdnJywnbCcsJ2wnLCdlJywnZicsJ3QnLCAwLAotICAgICdnJywndScsJ2knLCdsJywncycsJ2knLCduJywnZycsJ2wnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ2YnLCdpJywgMCwKLSAgICAnZicsJ2wnLCAwLAotICAgICdlJywnbicsJ2QnLCdhJywncycsJ2gnLCAwLAotICAgICdkJywnYScsJ2cnLCdnJywnZScsJ3InLCAwLAotICAgICdkJywnYScsJ2cnLCdnJywnZScsJ3InLCdkJywnYicsJ2wnLCAwLAotICAgICdwJywnZScsJ3InLCdpJywnbycsJ2QnLCdjJywnZScsJ24nLCd0JywnZScsJ3InLCdlJywnZCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2EnLCdnJywncicsJ2EnLCdwJywnaCcsIDAsCi0gICAgJ2InLCd1JywnbCcsJ2wnLCdlJywndCcsIDAsCi0gICAgJ3EnLCd1JywnbycsJ3QnLCdlJywncycsJ2knLCduJywnZycsJ2wnLCdiJywnYScsJ3MnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdiJywnYScsJ3MnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ2cnLCd1JywnaScsJ2wnLCdsJywnZScsJ20nLCdvJywndCcsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnZScsJ2wnLCdsJywnaScsJ3AnLCdzJywnaScsJ3MnLCAwLAotICAgICdwJywnZScsJ3InLCd0JywnaCcsJ28nLCd1JywncycsJ2EnLCduJywnZCcsIDAsCi0gICAgJ3EnLCd1JywnZScsJ3MnLCd0JywnaScsJ28nLCduJywnZCcsJ28nLCd3JywnbicsIDAsCi0gICAgJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdtJywnYScsJ2MnLCdyJywnbycsJ24nLCAwLAotICAgICdiJywncicsJ2UnLCd2JywnZScsIDAsCi0gICAgJ2QnLCdvJywndCcsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsIDAsCi0gICAgJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAncicsJ2knLCduJywnZycsIDAsCi0gICAgJ2MnLCdlJywnZCcsJ2knLCdsJywnbCcsJ2EnLCAwLAotICAgICdoJywndScsJ24nLCdnJywnYScsJ3InLCd1JywnbScsJ2wnLCdhJywndScsJ3QnLCAwLAotICAgICdvJywnZycsJ28nLCduJywnZScsJ2snLCAwLAotICAgICdjJywnYScsJ3InLCdvJywnbicsIDAsCi0gICAgJ2UnLCdtJywnZCcsJ2EnLCdzJywnaCcsIDAsCi0gICAgJ0EnLCdFJywgMCwKLSAgICAnbycsJ3InLCdkJywnZicsJ2UnLCdtJywnaScsJ24nLCdpJywnbicsJ2UnLCAwLAotICAgICdMJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdPJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdPJywnRScsIDAsCi0gICAgJ28nLCdyJywnZCcsJ20nLCdhJywncycsJ2MnLCd1JywnbCcsJ2knLCduJywnZScsIDAsCi0gICAgJ2EnLCdlJywgMCwKLSAgICAnZCcsJ28nLCd0JywnbCcsJ2UnLCdzJywncycsJ2knLCAwLAotICAgICdsJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdvJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdvJywnZScsIDAsCi0gICAgJ2cnLCdlJywncicsJ20nLCdhJywnbicsJ2QnLCdiJywnbCcsJ3MnLCAwLAotICAgICdvJywnbicsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2wnLCdvJywnZycsJ2knLCdjJywnYScsJ2wnLCduJywnbycsJ3QnLCAwLAotICAgICdtJywndScsIDAsCi0gICAgJ3QnLCdyJywnYScsJ2QnLCdlJywnbScsJ2EnLCdyJywnaycsIDAsCi0gICAgJ0UnLCd0JywnaCcsIDAsCi0gICAgJ28nLCduJywnZScsJ2gnLCdhJywnbCcsJ2YnLCAwLAotICAgICdwJywnbCcsJ3UnLCdzJywnbScsJ2knLCduJywndScsJ3MnLCAwLAotICAgICdUJywnaCcsJ28nLCdyJywnbicsIDAsCi0gICAgJ28nLCduJywnZScsJ3EnLCd1JywnYScsJ3InLCd0JywnZScsJ3InLCAwLAotICAgICdkJywnaScsJ3YnLCdpJywnZCcsJ2UnLCAwLAotICAgICdiJywncicsJ28nLCdrJywnZScsJ24nLCdiJywnYScsJ3InLCAwLAotICAgICdkJywnZScsJ2cnLCdyJywnZScsJ2UnLCAwLAotICAgICd0JywnaCcsJ28nLCdyJywnbicsIDAsCi0gICAgJ3QnLCdoJywncicsJ2UnLCdlJywncScsJ3UnLCdhJywncicsJ3QnLCdlJywncicsJ3MnLCAwLAotICAgICd0JywndycsJ28nLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3InLCdlJywnZycsJ2knLCdzJywndCcsJ2UnLCdyJywnZScsJ2QnLCAwLAotICAgICdtJywnaScsJ24nLCd1JywncycsIDAsCi0gICAgJ2UnLCd0JywnaCcsIDAsCi0gICAgJ20nLCd1JywnbCcsJ3QnLCdpJywncCcsJ2wnLCd5JywgMCwKLSAgICAndCcsJ2gnLCdyJywnZScsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2MnLCdvJywncCcsJ3knLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ0EnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ0EnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnQScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnQScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnQScsJ3InLCdpJywnbicsJ2cnLCAwLAotICAgICdBJywndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdDJywnYycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsIDAsCi0gICAgJ0UnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ0UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnRScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnRScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnSScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnSScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdJJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdJJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdOJywndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdPJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdPJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsIDAsCi0gICAgJ08nLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsIDAsCi0gICAgJ08nLCdnJywncicsJ2EnLCd2JywnZScsIDAsCi0gICAgJ08nLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ1MnLCdjJywnYScsJ3InLCdvJywnbicsIDAsCi0gICAgJ1UnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ1UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnVScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnVScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnWScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnWScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnWicsJ2MnLCdhJywncicsJ28nLCduJywgMCwKLSAgICAnYScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnYScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdhJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdhJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdhJywncicsJ2knLCduJywnZycsIDAsCi0gICAgJ2EnLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ2MnLCdjJywnZScsJ2QnLCdpJywnbCcsJ2wnLCdhJywgMCwKLSAgICAnZScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnZScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdlJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdlJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdpJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdpJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsIDAsCi0gICAgJ2knLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsIDAsCi0gICAgJ2knLCdnJywncicsJ2EnLCd2JywnZScsIDAsCi0gICAgJ24nLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ28nLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ28nLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnbycsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnbycsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnbycsJ3QnLCdpJywnbCcsJ2QnLCdlJywgMCwKLSAgICAncycsJ2MnLCdhJywncicsJ28nLCduJywgMCwKLSAgICAndScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAndScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICd1JywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICd1JywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICd5JywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICd5JywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICd6JywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdlJywneCcsJ2MnLCdsJywnYScsJ20nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0gnLCd1JywnbicsJ2cnLCdhJywncicsJ3UnLCdtJywnbCcsJ2EnLCd1JywndCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnZCcsJ28nLCdsJywnbCcsJ2EnLCdyJywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICdkJywnbycsJ2wnLCdsJywnYScsJ3InLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2EnLCdtJywncCcsJ2UnLCdyJywncycsJ2EnLCduJywnZCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywnbCcsJ2UnLCdmJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncCcsJ2EnLCdyJywnZScsJ24nLCdyJywnaScsJ2cnLCdoJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3cnLCdvJywnZCcsJ28nLCd0JywnZScsJ24nLCdsJywnZScsJ2EnLCdkJywnZScsJ3InLCAwLAotICAgICdvJywnbicsJ2UnLCdkJywnbycsJ3QnLCdlJywnbicsJ2wnLCdlJywnYScsJ2QnLCdlJywncicsIDAsCi0gICAgJ3onLCdlJywncicsJ28nLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ28nLCduJywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAndCcsJ3cnLCdvJywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAncycsJ2knLCd4JywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ2MnLCdvJywnbScsJ20nLCdhJywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ3EnLCd1JywnYScsJ3InLCd0JywnZScsJ3InLCdzJywnZScsJ20nLCdkJywnYScsJ3MnLCdoJywgMCwKLSAgICAncCcsJ2UnLCdyJywnaScsJ28nLCdkJywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdxJywndScsJ2UnLCdzJywndCcsJ2knLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnYScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnYicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnYycsJ2UnLCduJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnaScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2YnLCAwLAotICAgICdmJywnZicsJ2knLCAwLAotICAgICdmJywnZicsJ2wnLCAwLAotICAgICdwJywnYScsJ3InLCdlJywnbicsJ2wnLCdlJywnZicsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywncicsJ2knLCdnJywnaCcsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ0MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2gnLCd5JywncCcsJ2gnLCdlJywnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnRycsJ3InLCdhJywndicsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0InLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0QnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0YnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0knLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0onLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0snLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0wnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ00nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ04nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1AnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1EnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1InLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1QnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1YnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1onLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2MnLCdvJywnbCcsJ28nLCduJywnbScsJ28nLCduJywnZScsJ3QnLCdhJywncicsJ3knLCAwLAotICAgICdvJywnbicsJ2UnLCdmJywnaScsJ3QnLCd0JywnZScsJ2QnLCAwLAotICAgICdyJywndScsJ3AnLCdpJywnYScsJ2gnLCAwLAotICAgICdUJywnaScsJ2wnLCdkJywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnZScsJ3gnLCdjJywnbCcsJ2EnLCdtJywnZCcsJ28nLCd3JywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnYycsJ2UnLCduJywndCcsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnTCcsJ3MnLCdsJywnYScsJ3MnLCdoJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdTJywnYycsJ2EnLCdyJywnbycsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1onLCdjJywnYScsJ3InLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0InLCdyJywnZScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdDJywnYScsJ3InLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRCcsJ28nLCd0JywnYScsJ2MnLCdjJywnZScsJ24nLCd0JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdNJywnYScsJ2MnLCdyJywnbycsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2YnLCdpJywnZycsJ3UnLCdyJywnZScsJ2QnLCdhJywncycsJ2gnLCAwLAotICAgICdoJywneScsJ3AnLCdoJywnZScsJ24nLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ08nLCdnJywnbycsJ24nLCdlJywnaycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnUicsJ2knLCduJywnZycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAncScsJ3UnLCdlJywncycsJ3QnLCdpJywnbycsJ24nLCdkJywnbycsJ3cnLCduJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdvJywnbicsJ2UnLCdlJywnaScsJ2cnLCdoJywndCcsJ2gnLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ2UnLCdpJywnZycsJ2gnLCd0JywnaCcsJ3MnLCAwLAotICAgICdmJywnaScsJ3YnLCdlJywnZScsJ2knLCdnJywnaCcsJ3QnLCdoJywncycsIDAsCi0gICAgJ3MnLCdlJywndicsJ2UnLCduJywnZScsJ2knLCdnJywnaCcsJ3QnLCdoJywncycsIDAsCi0gICAgJ28nLCduJywnZScsJ3QnLCdoJywnaScsJ3InLCdkJywgMCwKLSAgICAndCcsJ3cnLCdvJywndCcsJ2gnLCdpJywncicsJ2QnLCdzJywgMCwKLSAgICAneicsJ2UnLCdyJywnbycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ2knLCd4JywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3onLCdlJywncicsJ28nLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ28nLCduJywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3cnLCdvJywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ2knLCd4JywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2MnLCdlJywnbicsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2QnLCdvJywnbCcsJ2wnLCdhJywncicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncCcsJ2UnLCdyJywnaScsJ28nLCdkJywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdjJywnbycsJ20nLCdtJywnYScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnQScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdBJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdBJywndCcsJ2knLCdsJywnZCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQScsJ3InLCdpJywnbicsJ2cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdFJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdDJywnYycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0knLCdnJywncicsJ2EnLCd2JywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnSScsJ2EnLCdjJywndScsJ3QnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdJJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnSScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywndCcsJ2gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ04nLCd0JywnaScsJ2wnLCdkJywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnTycsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdPJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdPJywndCcsJ2knLCdsJywnZCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnTycsJ0UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdzJywnbCcsJ2EnLCdzJywnaCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnVScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdVJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdVJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdhJywnYycsJ3UnLCd0JywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnVCcsJ2gnLCdvJywncicsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnMCcsJzAnLCcxJywnLicsJzAnLCcwJywnMCcsIDAsCi0gICAgJzAnLCcwJywnMScsJy4nLCcwJywnMCcsJzEnLCAwLAotICAgICcwJywnMCcsJzEnLCcuJywnMCcsJzAnLCcyJywgMCwKLSAgICAnMCcsJzAnLCcxJywnLicsJzAnLCcwJywnMycsIDAsCi0gICAgJ0InLCdsJywnYScsJ2MnLCdrJywgMCwKLSAgICAnQicsJ28nLCdsJywnZCcsIDAsCi0gICAgJ0InLCdvJywnbycsJ2snLCAwLAotICAgICdMJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ00nLCdlJywnZCcsJ2knLCd1JywnbScsIDAsCi0gICAgJ1InLCdlJywnZycsJ3UnLCdsJywnYScsJ3InLCAwLAotICAgICdSJywnbycsJ20nLCdhJywnbicsIDAsCi0gICAgJ1MnLCdlJywnbScsJ2knLCdiJywnbycsJ2wnLCdkJywgMCwKLSAgfTsKLQotCi0jZGVmaW5lIEZUX05VTV9NQUNfTkFNRVMgIDI1OAotCi0gIC8qIFZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSBgZnRfc3RhbmRhcmRfZ2x5cGhfbmFtZXMnIHRhYmxlICovCi0KLSAgc3RhdGljIGNvbnN0IHNob3J0ICBmdF9tYWNfbmFtZXNbRlRfTlVNX01BQ19OQU1FU10gPQotICB7Ci0gICAgIDI1MywgICAwLCAgIDYsIDI2MSwgMjY3LCAyNzQsIDI4MywgMjk0LCAzMDEsIDMwOSwgNzU4LCAzMzAsIDM0MCwgMzUxLAotICAgICAzNjAsIDM2NSwgMzcxLCAzNzgsIDM4NSwgMzkxLCAzOTYsIDQwMCwgNDA0LCA0MTAsIDQxNSwgNDIwLCA0MjQsIDQzMCwKLSAgICAgNDM2LCA0NDEsIDQ0NywgNDU3LCA0NjIsIDQ2OCwgNDc2LCA0ODUsIDQ4OCwgNDkwLCA0OTIsIDQ5NCwgNDk2LCA0OTgsCi0gICAgIDUwMCwgNTAyLCA1MDQsIDUwNiwgNTA4LCA1MTAsIDUxMiwgNTE0LCA1MTYsIDUxOCwgNTIwLCA1MjIsIDUyNCwgNTI2LAotICAgICA1MjgsIDUzMCwgNTMyLCA1MzQsIDUzNiwgNTM4LCA1NDAsIDU1MiwgNTYyLCA1NzUsIDU4NywgOTc5LCA2MDgsIDYxMCwKLSAgICAgNjEyLCA2MTQsIDYxNiwgNjE4LCA2MjAsIDYyMiwgNjI0LCA2MjYsIDYyOCwgNjMwLCA2MzIsIDYzNCwgNjM2LCA2MzgsCi0gICAgIDY0MCwgNjQyLCA2NDQsIDY0NiwgNjQ4LCA2NTAsIDY1MiwgNjU0LCA2NTYsIDY1OCwgNjYwLCA2NzAsIDY3NCwgNjg1LAotICAgIDEzNzUsMTM5MiwxNDA1LDE0MTQsMTQ4NiwxNTEyLDE1NjIsMTYwMywxNjMyLDE2MTAsMTYyMiwxNjQ1LDE2MzksMTY1MiwKLSAgICAxNjYxLDE2OTAsMTY2OCwxNjgwLDE2OTcsMTcyNiwxNzA0LDE3MTYsMTczMywxNzQwLDE3NjksMTc0NywxNzU5LDE3NzYsCi0gICAgMTc5MCwxODE5LDE3OTcsMTgwOSwgODM5LDEyNjMsIDcwNywgNzEyLCA3NDEsIDg4MSwgODcxLDExNjAsMTMwMiwxMzQ2LAotICAgIDExOTcsIDk4NSwxMDMxLCAgMjMsMTA4NiwxMTA4LCAgMzIsMTIxOSwgIDQxLCAgNTEsIDczMCwxMTk0LCAgNjQsICA3NiwKLSAgICAgIDg2LCAgOTQsICA5NywxMDg5LDExMTgsIDEwNiwxMTMxLDExNTAsIDk2NiwgNjk2LDExODMsIDExMiwgNzM0LCAxMjAsCi0gICAgIDEzMiwgNzgzLCA5MzAsIDk0NSwgMTM4LDEzODUsMTM5OCwxNTI5LDExMTUsMTE1NywgODMyLDEwNzksIDc3MCwgOTE2LAotICAgICA1OTgsIDMxOSwxMjQ2LCAxNTUsMTgzMywxNTg2LCA3MjEsIDc0OSwgNzk3LCA4MTEsIDgyNiwgODI5LCA4NDYsIDg1NiwKLSAgICAgODg4LCA5MDMsIDk1NCwxMzYzLDE0MjEsMTM1NiwxNDMzLDE0NDMsMTQ1MCwxNDU3LDE0NjksMTQ3OSwxNDkzLDE1MDAsCi0gICAgIDE2MywxNTIyLDE1NDMsMTU1MCwxNTcyLDExMzQsIDk5MSwxMDAyLDEwMDgsMTAxNSwxMDIxLDEwNDAsMTA0NSwxMDUzLAotICAgIDEwNjYsMTA3MywxMTAxLDExNDMsMTUzNiwxNzgzLDE1OTYsMTg0MywxMjUzLDEyMDcsMTMxOSwxNTc5LDE4MjYsMTIyOSwKLSAgICAxMjcwLDEzMTMsMTMyMywxMTcxLDEyOTAsMTMzMiwxMjExLDEyMzUsMTI3NiwgMTY5LCAxNzUsIDE4MiwgMTg5LCAyMDAsCi0gICAgIDIwOSwgMjE4LCAyMjUsIDIzMiwgMjM5LCAyNDYKLSAgfTsKLQotCi0jZGVmaW5lIEZUX05VTV9TSURfTkFNRVMgIDM5MQotCi0gIC8qIFZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSBgZnRfc3RhbmRhcmRfZ2x5cGhfbmFtZXMnIHRhYmxlICovCi0KLSAgc3RhdGljIGNvbnN0IHNob3J0ICBmdF9zaWRfbmFtZXNbRlRfTlVNX1NJRF9OQU1FU10gPQotICB7Ci0gICAgIDI1MywgMjYxLCAyNjcsIDI3NCwgMjgzLCAyOTQsIDMwMSwgMzA5LCAzMTksIDMzMCwgMzQwLCAzNTEsIDM2MCwgMzY1LAotICAgICAzNzEsIDM3OCwgMzg1LCAzOTEsIDM5NiwgNDAwLCA0MDQsIDQxMCwgNDE1LCA0MjAsIDQyNCwgNDMwLCA0MzYsIDQ0MSwKLSAgICAgNDQ3LCA0NTcsIDQ2MiwgNDY4LCA0NzYsIDQ4NSwgNDg4LCA0OTAsIDQ5MiwgNDk0LCA0OTYsIDQ5OCwgNTAwLCA1MDIsCi0gICAgIDUwNCwgNTA2LCA1MDgsIDUxMCwgNTEyLCA1MTQsIDUxNiwgNTE4LCA1MjAsIDUyMiwgNTI0LCA1MjYsIDUyOCwgNTMwLAotICAgICA1MzIsIDUzNCwgNTM2LCA1MzgsIDU0MCwgNTUyLCA1NjIsIDU3NSwgNTg3LCA1OTgsIDYwOCwgNjEwLCA2MTIsIDYxNCwKLSAgICAgNjE2LCA2MTgsIDYyMCwgNjIyLCA2MjQsIDYyNiwgNjI4LCA2MzAsIDYzMiwgNjM0LCA2MzYsIDYzOCwgNjQwLCA2NDIsCi0gICAgIDY0NCwgNjQ2LCA2NDgsIDY1MCwgNjUyLCA2NTQsIDY1NiwgNjU4LCA2NjAsIDY3MCwgNjc0LCA2ODUsIDY5NiwgNzA3LAotICAgICA3MTIsIDcyMSwgNzMwLCA3MzQsIDc0MSwgNzQ5LCA3NTgsIDc3MCwgNzgzLCA3OTcsIDgxMSwgODI2LCA4MjksIDgzMiwKLSAgICAgODM5LCA4NDYsIDg1NiwgODcxLCA4ODEsIDg4OCwgOTAzLCA5MTYsIDkzMCwgOTQ1LCA5NTQsIDk2NiwgOTc5LCA5ODUsCi0gICAgIDk5MSwxMDAyLDEwMDgsMTAxNSwxMDIxLDEwMzEsMTA0MCwxMDQ1LDEwNTMsMTA2NiwxMDczLDEwNzksMTA4NiwxMDg5LAotICAgIDExMDEsMTEwOCwxMTE1LDExMTgsMTEzMSwxMTM0LDExNDMsMTE1MCwxMTU3LDExNjAsMTE3MSwxMTgzLDExOTQsMTE5NywKLSAgICAxMjA3LDEyMTEsMTIxOSwxMjI5LDEyMzUsMTI0NiwxMjUzLDEyNjMsMTI3MCwxMjc2LDEyOTAsMTMwMiwxMzEzLDEzMTksCi0gICAgMTMyMywxMzMyLDEzNDYsMTM1NiwxMzYzLDEzNzUsMTM4NSwxMzkyLDEzOTgsMTQwNSwxNDE0LDE0MjEsMTQzMywxNDQzLAotICAgIDE0NTAsMTQ1NywxNDY5LDE0NzksMTQ4NiwxNDkzLDE1MDAsMTUxMiwxNTIyLDE1MjksMTUzNiwxNTQzLDE1NTAsMTU2MiwKLSAgICAxNTcyLDE1NzksMTU4NiwxNTk2LDE2MDMsMTYxMCwxNjIyLDE2MzIsMTYzOSwxNjQ1LDE2NTIsMTY2MSwxNjY4LDE2ODAsCi0gICAgMTY5MCwxNjk3LDE3MDQsMTcxNiwxNzI2LDE3MzMsMTc0MCwxNzQ3LDE3NTksMTc2OSwxNzc2LDE3ODMsMTc5MCwxNzk3LAotICAgIDE4MDksMTgxOSwxODI2LDE4MzMsMTg0MywxODUwLDE4NjIsMTg4MCwxODk1LDE5MTAsMTkyNSwxOTM2LDE5NTQsMTk3MywKLSAgICAxOTg4LDIwMDMsMjAxNiwyMDI4LDIwNDAsMjA1NCwyMDY3LDIwODAsMjA5MiwyMTA2LDIxMjAsMjEzMywyMTQ3LDIxNjcsCi0gICAgMjE4MiwyMTk2LDIyMDYsMjIxNiwyMjI5LDIyMzksMjI0OSwyMjU5LDIyNjksMjI3OSwyMjg5LDIyOTksMjMwOSwyMzE5LAotICAgIDIzMjksMjMzMiwyMzM2LDIzNDAsMjM1OCwyMzc3LDIzOTMsMjQwOCwyNDE5LDI0MjYsMjQzMywyNDQwLDI0NDcsMjQ1NCwKLSAgICAyNDYxLDI0NjgsMjQ3NSwyNDgyLDI0ODksMjQ5NiwyNTAzLDI1MTAsMjUxNywyNTI0LDI1MzEsMjUzOCwyNTQ1LDI1NTIsCi0gICAgMjU1OSwyNTY2LDI1NzMsMjU4MCwyNTg3LDI1OTQsMjYwMSwyNjE1LDI2MjUsMjYzMiwyNjQzLDI2NTksMjY3MiwyNjg0LAotICAgIDI2OTYsMjcwOCwyNzIyLDI3MzMsMjc0NCwyNzU5LDI3NzEsMjc4MiwyNzk3LDI4MDksMjgxOSwyODMyLDI4NTAsMjg2MCwKLSAgICAyODczLDI4ODUsMjg5OCwyOTA3LDI5MTcsMjkzMCwyOTQzLDI5NTYsMjk2OCwyOTgyLDI5OTYsMzAwOSwzMDIyLDMwMzQsCi0gICAgMzA0NiwzMDYwLDMwNzMsMzA4NiwzMDk4LDMxMTIsMzEyNiwzMTM5LDMxNTIsMzE2NywzMTgyLDMxOTYsMzIwOCwzMjIwLAotICAgIDMyMzcsMzI0OSwzMjY0LDMyNzUsMzI4MywzMjk3LDMzMDksMzMyMSwzMzM4LDMzNTMsMzM2NSwzMzc3LDMzOTQsMzQwOSwKLSAgICAzNDE4LDM0MzAsMzQ0MiwzNDU0LDM0NzEsMzQ4MywzNDk4LDM1MDYsMzUxOCwzNTMwLDM1NDIsMzU1OSwzNTc0LDM1ODYsCi0gICAgMzU5NywzNjEyLDM2MjAsMzYyOCwzNjM2LDM2NDQsMzY1MCwzNjU1LDM2NjAsMzY2NiwzNjczLDM2ODEsMzY4NwotICB9OwotCi0KLSAgLyogdGhlIGZvbGxvd2luZyBhcmUgaW5kaWNlcyBpbnRvIHRoZSBTSUQgbmFtZSB0YWJsZSAqLwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgIHQxX3N0YW5kYXJkX2VuY29kaW5nWzI1Nl0gPQotICB7Ci0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCi0gICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAotICAgICAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKLSAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsCi0gICAgIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLAotICAgICA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAgMCwKLSAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwgOTYsIDk3LCA5OCwgOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwKLSAgICAgIDAsMTExLDExMiwxMTMsMTE0LCAgMCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLCAgMCwxMjMsCi0gICAgICAwLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsICAwLDEzMiwxMzMsICAwLDEzNCwxMzUsMTM2LAotICAgIDEzNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDAsMTM4LCAgMCwxMzksICAwLCAgMCwgIDAsICAwLDE0MCwxNDEsMTQyLDE0MywgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLDE0NCwgIDAsICAwLCAgMCwxNDUsICAwLCAgMCwxNDYsMTQ3LDE0OCwxNDksICAwLCAgMCwgIDAsICAwCi0gIH07Ci0KLQotICAvKiB0aGUgZm9sbG93aW5nIGFyZSBpbmRpY2VzIGludG8gdGhlIFNJRCBuYW1lIHRhYmxlICovCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCAgdDFfZXhwZXJ0X2VuY29kaW5nWzI1Nl0gPQotICB7Ci0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDEsMjI5LDIzMCwgIDAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwgMTMsIDE0LCAxNSwgOTksCi0gICAgMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LCAyNywgMjgsMjQ5LDI1MCwyNTEsMjUyLAotICAgICAgMCwyNTMsMjU0LDI1NSwyNTYsMjU3LCAgMCwgIDAsICAwLDI1OCwgIDAsICAwLDI1OSwyNjAsMjYxLDI2MiwKLSAgICAgIDAsICAwLDI2MywyNjQsMjY1LCAgMCwyNjYsMTA5LDExMCwyNjcsMjY4LDI2OSwgIDAsMjcwLDI3MSwyNzIsCi0gICAgMjczLDI3NCwyNzUsMjc2LDI3NywyNzgsMjc5LDI4MCwyODEsMjgyLDI4MywyODQsMjg1LDI4NiwyODcsMjg4LAotICAgIDI4OSwyOTAsMjkxLDI5MiwyOTMsMjk0LDI5NSwyOTYsMjk3LDI5OCwyOTksMzAwLDMwMSwzMDIsMzAzLCAgMCwKLSAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwzMDQsMzA1LDMwNiwgIDAsICAwLDMwNywzMDgsMzA5LDMxMCwzMTEsICAwLDMxMiwgIDAsICAwLDMxMywKLSAgICAgIDAsICAwLDMxNCwzMTUsICAwLCAgMCwzMTYsMzE3LDMxOCwgIDAsICAwLCAgMCwxNTgsMTU1LDE2MywzMTksCi0gICAgMzIwLDMyMSwzMjIsMzIzLDMyNCwzMjUsICAwLCAgMCwzMjYsMTUwLDE2NCwxNjksMzI3LDMyOCwzMjksMzMwLAotICAgIDMzMSwzMzIsMzMzLDMzNCwzMzUsMzM2LDMzNywzMzgsMzM5LDM0MCwzNDEsMzQyLDM0MywzNDQsMzQ1LDM0NiwKLSAgICAzNDcsMzQ4LDM0OSwzNTAsMzUxLDM1MiwzNTMsMzU0LDM1NSwzNTYsMzU3LDM1OCwzNTksMzYwLDM2MSwzNjIsCi0gICAgMzYzLDM2NCwzNjUsMzY2LDM2NywzNjgsMzY5LDM3MCwzNzEsMzcyLDM3MywzNzQsMzc1LDM3NiwzNzcsMzc4Ci0gIH07Ci0KLQotICAvKgotICAgKiAgVGhpcyB0YWJsZSBpcyBhIGNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgQWRvYmUgR2x5cGggTGlzdCAoQUdMKSwKLSAgICogIG9wdGltaXplZCBmb3IgZWZmaWNpZW50IHNlYXJjaGluZy4gIEl0IGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGUKLSAgICogIGBnbG5hbWVzLnB5JyBweXRob24gc2NyaXB0IGxvY2F0ZWQgaW4gdGhlIGBzcmMvdG9vbHMnIGRpcmVjdG9yeS4KLSAgICoKLSAgICogIFRoZSBsb29rdXAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBVbmljb2RlIHZhbHVlIGZvciBhIGdpdmVuIHN0cmluZwotICAgKiAgaXMgZGVmaW5lZCBiZWxvdyB0aGUgdGFibGUuCi0gICAqLwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAgZnRfYWRvYmVfZ2x5cGhfbGlzdFs1NDc5MV0gPQotICB7Ci0gICAgICAwLCA1MiwgIDAsMTA2LCAgMiwxNjcsICAzLCA2MywgIDQsMjIwLCAgNiwxMjUsICA5LDE0MywgMTAsIDIzLAotICAgICAxMSwxMzcsIDEyLDE5OSwgMTQsMjQ2LCAxNSwgODcsIDE2LDIzMywgMTcsMjE5LCAxOCwxMDQsIDE5LCA4OCwKLSAgICAgMjIsMTEwLCAyMywgMzIsIDIzLCA3MSwgMjQsIDc3LCAyNywxNTYsIDI5LCA3MywgMzEsMjQ3LCAzMiwxMDcsCi0gICAgIDMyLDIyMiwgMzMsIDU1LCAzNCwxNTQsIDM1LDIxOCwgNTMsIDg0LCA1OSwxOTYsIDY4LCAgNiwgNzUsMTgzLAotICAgICA4MywxNzgsIDg4LDEzNSwgOTMsMjQyLDEwMSwxNjUsMTA5LDE4NSwxMTEsIDU1LDExNywyNTQsMTIzLCA3MywKLSAgICAxMzAsMjM4LDEzOCwyMDYsMTQ1LCAzMSwxNTMsMTgyLDE1NiwxODksMTYzLDI0OSwxNzgsMjIxLDE5MywgMTcsCi0gICAgMTk3LCA5OSwxOTksMjQwLDIwNCwgMjcsMjA0LDE1NSwyMTAsMTAwLCA2NSwxNDMsICAwLCA2NSwgIDAsMTQwLAotICAgICAgMCwxNzUsICAwLDE5MywgIDEsIDE1LCAgMSwxNDcsICAxLDIzMywgIDEsMjUxLCAgMiwgIDcsICAyLCA0MCwKLSAgICAgIDIsIDU3LCAgMiwgODIsICAyLCA5MSwgIDIsMTI4LCAgMiwxMzYsICAyLDE1NCwgNjksMTMxLCAgMCwxOTgsCi0gICAgICAwLDE1MCwgIDAsMTU4LCAgMCwxNjcsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1MiwyMzcsMjI1LAotICAgIDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIyNiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjMwLDIyNSwKLSAgICAyMjcsMjQ1LDI0NCwxMDEsMTI5LCAgMCwxOTMsICAwLDE4NSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsCi0gICAgMjI1LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTM0LCAgMSwgIDIsICAwLDIxMywgIDAsMjIxLCAgMCwyMzIsICAwLAotICAgIDI0MywgIDAsMjUxLCAgMSwgIDcsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLDE3NCwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjA4LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksCi0gICAgMTI4LCAzMCwxODIsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDE3NiwyMzIsMjM5LDIzOSwyMzUsMjI1LAotICAgIDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDE3OCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTgwLCA5OSwKLSAgICAgIDQsICAxLCAyNSwgIDEsIDMyLCAgMSwxMjEsICAxLDEzNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMDUsCi0gICAgMjMzLDI0MiwgOTksICAyLCAgMSwgNDAsICAxLCA0NSwyMzYsMTAxLDEyOCwgMzYsMTgyLDI0NSwyMzcsMjMwLAotICAgIDIzNiwyMjksMTIwLDEzNCwgIDAsMTk0LCAgMSwgNjYsICAxLCA3NCwgIDEsIDg1LCAgMSwgOTMsICAxLDEwNSwKLSAgICAgIDEsMTEzLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxNjQsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLDE3MiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMTY2LDIzMiwyMzksMjM5LAotICAgIDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTY4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywKLSAgICAyMjYsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE3MCwyNDUsMjQ0LDEwMSwxMjksMjQ2LDIwMSwgIDEsCi0gICAgMTI5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxODAsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsIDE2LDEwMCwgIDMsICAxLDE1NSwgIDEsMTY1LCAgMSwyMDksMjI2LDIzNiwyMzEsMjQyLDIyNSwKLSAgICAyNDYsMTAxLDEyOCwgIDIsICAwLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzEsICAwLDE5NiwgIDEsCi0gICAgMTgxLCAgMSwxOTIsICAxLDIwMSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjEwLAotICAgIDIzNywyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjIyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywKLSAgICAyMjgsMjM5LDExNiwgIDIsICAxLDIxNiwgIDEsMjI0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNjAsCi0gICAgMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjQsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLAotICAgIDE5MiwgIDEsMjQzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMjQsMjMyLDIzOSwyMzksMjM1LDIyNSwKLSAgICAyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwxNjIsMTA1LCAgMiwgIDIsIDEzLCAgMiwgMjUsMjI5LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTIsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LAotICAgIDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgIDIsMjM2LDI0MCwyMzIsIDk3LDEyOSwgIDMsMTQ1LCAgMiwKLSAgICAgNDksMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDEzNCwxMDksICAyLCAgMiwgNjMsICAyLCA3MSwyMjUsCi0gICAgMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsICAwLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgMzMsMjM5LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI4LCAgMSwgIDQsMjQyLDIzMywyMzgsMTAzLDEzMSwKLSAgICAgIDAsMTk3LCAgMiwxMDQsICAyLDExMiwgIDIsMTIwLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwyNTAsCi0gICAgMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAgMCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjI5LAotICAgIDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywgOTcsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjksICAwLDE5NSwKLSAgICAgIDIsMTQ2LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMjcsMjQ5LDIyNiwyMjUsMjQyLDIzNywyMjksCi0gICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDQ5LCA2NiwxMzcsICAwLCA2NiwgIDIsMTg5LCAgMiwxOTgsICAyLAotICAgIDIyMywgIDMsICAzLCAgMywgMTAsICAzLCAyMiwgIDMsIDM0LCAgMywgNDYsICAzLCA1NCwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDEwMSwxMjgsIDM2LDE4MywyMjgsMjM5LDExNiwgIDIsICAyLDIwNiwgIDIsMjE1LDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsICAyLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgIDQsMTAxLAotICAgICAgMywgIDIsMjMxLCAgMiwyNDIsICAyLDI1NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDE3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDUwLDI0NCwgOTcsCi0gICAgMTI4LCAgMywxNDYsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDEsMTI5LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LAotICAgIDIzNiwyMzksMTE5LDEyOCwgMzAsICA2LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsIDM0LDI0MiwyMjksMjQ2LDIyOSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ0LDI0MywyMzcsCi0gICAgMjI1LDIzNiwxMDgsMTI4LDI0NywgOTgsMjQ0LDIzOSwyNDAsMjI2LDIyNSwxMTQsMTI4LCAgMSwxMzAsIDY3LAotICAgIDEzNywgIDAsIDY3LCAgMywgODUsICAzLDEyNywgIDMsMTkzLCAgMywyMTAsICAzLDIyNCwgIDQsMTcxLCAgNCwKLSAgICAxODgsICA0LDIwMCwgIDQsMjEyLCA5NywgIDMsICAzLCA5MywgIDMsMTA0LCAgMywxMTEsMjI1LDI0MiwyMzcsCi0gICAgMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2MiwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgIDYsMjQyLAotICAgIDIzOSwxMTAsMTI5LDI0NiwyMDIsICAzLDExOSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ1LCA5OSwKLSAgICAgIDMsICAzLDEzNSwgIDMsMTQyLCAgMywxNzEsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsIDEyLDIyOSwyMjgsCi0gICAgMjMzLDIzNiwyMzYsIDk3LDEzMCwgIDAsMTk5LCAgMywxNTUsICAzLDE2MywyMjUsMjI3LDI0NSwyNDQsMTAxLAotICAgIDEyOCwgMzAsICA4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzEsMjMzLDI0MiwgOTksICAyLCAgMywKLSAgICAxNzksICAzLDE4NCwyMzYsMTAxLDEyOCwgMzYsMTg0LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsCi0gICAgICA4LDIyOCwyMzksMTE2LDEyOSwgIDEsIDEwLCAgMywyMDEsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAotICAgICAgMSwgMTAsMjI5LDIyOCwyMzMsMjM2LDIzNiwyMjUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDE4NCwKLSAgICAxMDQsICA0LCAgMywyMzQsICAzLDI0NiwgIDQsMTYxLCAgNCwxNjUsMjI1LDIyNSwyNDIsMjM3LDIyOSwyMzgsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzMsMTAxLCAgNiwgIDQsICA0LCAgNCwgMjQsICA0LCAzNSwgIDQsMTAzLAotICAgICAgNCwxMTUsICA0LDEzNiwyMjUsMjI2LDIzNSwyMzIsMjI1LDI0MywyMzMsMjI1LDIzOCwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTg4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgMzksMTAwLCAgMiwgIDQsIDQxLCAgNCwgODUsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LAotICAgIDExNCwgIDIsICA0LCA1NCwgIDQsIDc0LDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDE4MiwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDI0NCwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKLSAgICAxMjgsICA1LCA2NywyMzUsMjMyLDIyNSwyMzUsMjI1LDI0MywyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIwMywyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LAotICAgIDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxODQsMTA1LDEyOCwgIDMsMTY3LDIzOSwyMzksMTA3LDEyOCwgIDEsMTM1LDIzMywyNDIsMjI3LDI0NSwyMzcsCi0gICAgMjMwLDIzNiwyMjksMjQ4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDYsMjM3LDIzOSwyMzgsMjM5LAotICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzUsMjM5LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKLSAgICAxMTAsMTI4LCAgNSwgODEsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LCA5OSwgNjgsMTQyLCAgMCwgNjgsCi0gICAgICA0LDI1MiwgIDUsIDEwLCAgNSwgMzYsICA1LCA5NiwgIDUsMTIxLCAgNSwxNjYsICA1LDE3MywgIDUsMjMxLAotICAgICAgNSwyNDQsICA2LCAgMCwgIDYsIDEyLCAgNiwgMjgsICA2LCA0OCwgIDYsIDU3LCA5MCwxMjksICAxLDI0MSwKLSAgICAgIDUsICAyLDIyNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwxOTYsIDk3LCAgMiwgIDUsIDE2LCAgNSwgMjcsCi0gICAgMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1MiwyMzAsMjQyLDIzMywyMjcsMjI1LAotICAgIDExMCwxMjgsICAxLDEzNywgOTksICA0LCAgNSwgNDYsICA1LCA1MywgIDUsIDYyLCAgNSwgODksMjI1LDI0MiwKLSAgICAyMzksMTEwLDEyOCwgIDEsIDE0LDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDE2LDIzMywyNDIsCi0gICAgIDk5LCAgMiwgIDUsIDcwLCAgNSwgNzUsMjM2LDEwMSwxMjgsIDM2LDE4NSwyNDUsMjM3LDIzMCwyMzYsMjI5LAotICAgIDI0OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDE4LDI0MiwyMzksMjI1LDExNiwxMjgsICAxLCAxNiwKLSAgICAyMjgsMjM5LDExNiwgIDIsICA1LDEwNCwgIDUsMTEzLDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsCi0gICAgIDEwLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMTIsMTAxLCAgMywgIDUsMTI5LCAgNSwxNDAsICA1LAotICAgIDE1MCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDIwLDIzMywyMjcsMjM5LDI0MCwKLSAgICAyNDQsMjMzLCA5OSwxMjgsICAzLDIzOCwyMzYsMjQ0LCA5NywxMjksIDM0LCAgNiwgIDUsMTU4LDIzMSwyNDIsCi0gICAgMjI5LDIyOSwxMDcsMTI4LCAgMywxNDgsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDEsMTM4LDEwNSwgIDIsICA1LAotICAgIDE3OSwgIDUsMjE4LDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEzMSwyNDYsMjAzLCAgNSwxOTQsICA1LDIwMiwKLSAgICAgIDUsMjEwLDE5MywyMjcsMjQ1LDI0NCwxMDEsMTI4LDI0NiwyMDQsMTk5LDI0MiwyMjUsMjQ2LDEwMSwxMjgsCi0gICAgMjQ2LDIwNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTY4LDIzMSwyMjUsMjM3LDIzNywyMjUsMjMxLAotICAgIDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIyMCwyMzQsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwgIDIsMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMTQsCi0gICAgMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzYsMjM5LDI0NCwyMjUsMjI3LAotICAgIDIyNywyMjksMjM4LDI0NCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ3LDExNSwgIDIsICA2LCAzNCwKLSAgICAgIDYsIDQxLDIzNiwyMjUsMjQzLDEwNCwxMjgsICAxLCAxNiwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDAsCi0gICAgMjQ0LDIzOSwyNDAsMjI2LDIyNSwxMTQsMTI4LCAgMSwxMzksMTIyLDEzMSwgIDEsMjQyLCAgNiwgNjcsICA2LAotICAgICA3NSwgIDYsMTEyLDIyNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwxOTcsMTAxLCAgMiwgIDYsIDgxLCAgNiwKLSAgICAxMDEsMjI1LDIyNiwyMzUsMjMyLDIyNSwyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDIyNCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsICA1LAotICAgIDIzMiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxNSwgNjksMTQ2LCAgMCwKLSAgICAgNjksICA2LDE2NSwgIDYsMTgzLCAgNiwxOTEsICA3LCA4OSwgIDcsMTUzLCAgNywxNjUsICA3LDE4MywgIDcsCi0gICAgMjExLCAgOCwgIDcsICA4LCAzNiwgIDgsIDk0LCAgOCwxNjksICA4LDE4OSwgIDgsMjA4LCAgOCwyNDgsICA5LAotICAgICA0NCwgIDksMTA5LCAgOSwxMTUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjksICAwLDIwMSwgIDYsMTc1LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzMsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAxLCAyMCwgOTksCi0gICAgICA1LCAgNiwyMDMsICA2LDIxMCwgIDYsMjI0LCAgNiwyMzYsICA3LCA3OSwyMjUsMjQyLDIzOSwxMTAsMTI4LAotICAgICAgMSwgMjYsMjI5LDIyOCwyMzMsMjM2LDIzNiwyMjUsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsIDMwLCAyOCwKLSAgICAyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1MywyMzMsMjQyLCA5OSwgIDIsCi0gICAgICA2LDI0NCwgIDYsMjQ5LDIzNiwxMDEsMTI4LCAzNiwxODYsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTM1LAotICAgICAgMCwyMDIsICA3LCAxNiwgIDcsIDI0LCAgNywgMzIsICA3LCA0MywgIDcsIDUxLCAgNywgNjMsICA3LCA3MSwKLSAgICAyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMTkwLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMjQsCi0gICAgMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE5OCwyMzEsMjQyLDIyNSwyNDYsMTAxLAotICAgIDEyOCwgMzAsMTkyLDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTk0LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzQsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE5NiwyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgIDQsMTAwLCAgMywgIDcsIDk3LCAgNywxMDcsICA3LAotICAgIDEyNywyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgIDQsMjMzLDIyOSwyNDIsMjI5LDI0MywKLSAgICAyMzMsMTE1LDEyOSwgIDAsMjAzLCAgNywxMTksMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIzNSwyMzksCi0gICAgMTE2LDEzMCwgIDEsIDIyLCAgNywxMzYsICA3LDE0NSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLAotICAgICAyMiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTg0LDIzMCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsIDM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI5LCAgMCwyMDAsICA3LDE3NSwyNDMsCi0gICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjMyLDEwNCwgIDIsICA3LDE4OSwgIDcsMjAwLDIyNSwyNDIsMjM3LAotICAgIDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTUsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwKLSAgICAxMjgsIDMwLDE4NiwxMDUsICAzLCAgNywyMTksICA3LDIzMCwgIDcsMjQ1LDIzMSwyMzIsMjQ0LDI0MiwyMzksCi0gICAgMjM3LDIyNSwxMTAsMTI4LCAzMywxMDMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgIDYsMjM5LDI0NCwyMzMsMjMwLDIzMywyMjksMjI4LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMDAsMTA4LCAgMiwgIDgsIDEzLCAgOCwgMjQsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNywyMjksMjQ2LDIyOSwyMzgsMjQyLDIzOSwyMzcsMjI1LAotICAgIDExMCwxMjgsIDMzLDEwNiwxMDksICAzLCAgOCwgNDQsICA4LCA3MiwgIDgsIDgzLDIyNSwyMjcsMjQyLDIzOSwKLSAgICAxMTAsMTMwLCAgMSwgMTgsICA4LCA1NiwgIDgsIDY0LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgMjIsCi0gICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLCAyMCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsIDI4LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzcsMTEwLCAgNCwKLSAgICAgIDgsMTA0LCAgOCwxMTUsICA4LDEzNSwgIDgsMTU0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgMjksMjI4LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE2MiwxMDMsMTI5LCAgMSwgNzQsICA4LDE0MSwyMzIsMjI5LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNjQsMjMyLDIzOSwyMzksMjM1LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTksMTExLCAgMiwgIDgsMTc1LCAgOCwxODMsMjMxLAotICAgIDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCAyNCwyNDAsMjI5LDExMCwxMjgsICAxLDE0NCwyNDAsMjQzLDIzMywKLSAgICAyMzYsMjM5LDExMCwxMjksICAzLDE0OSwgIDgsMjAwLDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzYsCi0gICAgMTE0LCAgMiwgIDgsMjE0LCAgOCwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICAzMiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI5LCAgMSwxNDIsICA4LDIzNywyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDQ1LDExNSwgIDQsICA5LCAgMiwgIDksIDEzLCAgOSwgMzMsCi0gICAgICA5LCAzNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDMzLDIyOCwyMjksMjQzLAotICAgIDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxNzAsMTA0LDEyOCwgIDEsMTY5LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwMSwxMTYsICAzLCAgOSwgNTIsCi0gICAgICA5LCA3OCwgIDksIDkyLCA5NywxMzAsICAzLDE1MSwgIDksIDYwLCAgOSwgNzAsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDU2LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzcsMTA0LDEyOSwKLSAgICAgIDAsMjA4LCAgOSwgODQsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0MCwyMzMsMjM2LDIyOCwxMDEsCi0gICAgMTI5LCAzMCwxODgsICA5LDEwMSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDI2LDI0NSwyNDIsMTExLAotICAgIDEyOCwgMzIsMTcyLDI1MCwxMDQsMTMwLCAgMSwxODMsICA5LDEyNCwgIDksMTMyLDIyNywyMjUsMjQyLDIzOSwKLSAgICAxMTAsMTI4LCAgMSwyMzgsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsICAxLDE4NCwgNzAsCi0gICAgMTM2LCAgMCwgNzAsICA5LDE2MywgIDksMTcyLCAgOSwxODQsICA5LDIxMiwgIDksMjE5LCAgOSwyNDgsIDEwLAotICAgICAgNCwgMTAsIDE1LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTg3LDIyOCwyMzksMjQ0LDIyNSwKLSAgICAyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDMwLDEwMSwgIDIsICA5LDE5MCwgIDksMjAyLDIzMiwyMjUsCi0gICAgMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDg2LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLAotICAgICA5OSwxMjgsICAzLDIyOCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNDUsMTA1LCAgMiwgIDksMjI1LCAgOSwKLSAgICAyMzgsMjQ0LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTE0LDI0NiwyMjksCi0gICAgMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEwMCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCAzOCwyMzksMjQ1LDI0MiwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsIDk5LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDIsIDcxLDE0MCwgIDAsIDcxLCAxMCwgNTEsIDEwLCA2MSwgMTAsCi0gICAgMTA3LCAxMCwxMTUsIDEwLDE3NiwgMTAsMTkzLCAxMCwyMDUsIDExLCAzOSwgMTEsIDUyLCAxMSwgNjUsIDExLAotICAgICA5MCwgMTEsMTA3LDE5NCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDEzNSwgOTcsICAzLCAxMCwKLSAgICAgNjksIDEwLCA3NiwgMTAsIDk0LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI0NCwyMzcsMjM3LCA5NywxMjksCi0gICAgICAzLDE0NywgMTAsIDg0LDIyNSwyMzAsMjQyLDIzMywyMjcsMjI1LDExMCwxMjgsICAxLDE0OCwyMzgsMjMxLAotICAgIDIzMywyMjUsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzQsMjI2LDI0MiwyMjksMjQ2LDEwMSwKLSAgICAxMjgsICAxLCAzMCwgOTksICA0LCAxMCwxMjUsIDEwLDEzMiwgMTAsMTQxLCAxMCwxNjMsMjI1LDI0MiwyMzksCi0gICAgMTEwLDEyOCwgIDEsMjMwLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDM0LDIzMywyNDIsIDk5LAotICAgICAgMiwgMTAsMTQ5LCAxMCwxNTQsMjM2LDEwMSwxMjgsIDM2LDE4OCwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwKLSAgICAxMjgsICAxLCAyOCwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMzQsCi0gICAgMjI4LDIzOSwxMTYsMTI5LCAgMSwgMzIsIDEwLDE4NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLAotICAgICAzMiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxOSwxMDQsICAzLCAxMCwKLSAgICAyMTMsIDEwLDIyNiwgMTEsIDMzLDIyNSwyMjgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCi0gICAgICA1LCA2NiwxMDEsICAzLCAxMCwyMzQsIDEwLDI1NSwgMTEsIDE2LDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LAotICAgIDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTQ4LDI0MywKLSAgICAyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNDYsCi0gICAgMjQ1LDI0MCwyNDQsMjQ1LDI0MiwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDE0NCwyMzksMjM5LDEwNywxMjgsICAxLDE0NywyMzMsMjM3LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKLSAgICAxMTAsMTI4LCAgNSwgNTEsMjM0LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgICAzLDEwOSwgIDIsIDExLCA3MSwgMTEsIDc5LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAzMCwgMzIsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAzOSwyNDIsMjI1LDI0NiwxMDEsMTI5LDI0NiwKLSAgICAyMDYsIDExLCA5OSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDk2LDExNSwgIDIsIDExLDExMywgMTEsCi0gICAgMTI5LDIzNywyMjUsMjM2LDEwOCwxMjksMjQ3LDEwMywgMTEsMTIyLDIzMiwyMzksMjM5LDEwNywxMjgsICAyLAotICAgIDE1NSwyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMjI4LCA3MiwxNDAsICAwLCA3MiwgMTEsMTY1LCAxMSwKLSAgICAxOTAsIDExLDE5OCwgMTEsMjA4LCAxMiwgMTcsIDEyLCA0MCwgMTIsIDc3LCAxMiwxMTcsIDEyLDEyOSwgMTIsCi0gICAgMTU3LCAxMiwxNjUsIDEyLDE4OSwxNzcsMTg0LCA1MywgIDMsIDExLDE3NSwgMTEsMTgwLCAxMSwxODUsMTc5LAotICAgICA1MSwxMjgsIDM3LDIwNywxODAsIDUxLDEyOCwgMzcsMTcwLDE4MSwgNDksMTI4LCAzNywxNzEsMTc4LDE3OCwKLSAgICAxNzYsMTgzLCA1MSwxMjgsIDM3LDE2MSwyMDgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDMsCi0gICAgIDk3LCAgMywgMTEsMjE2LCAxMSwyMzYsIDEyLCAgMCwyMjUsMjI2LDIzNSwyMzIsMjI1LDI0MywyMzMsMjI1LAotICAgIDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTY4LDIyOCwyMjksMjQzLDIyNywKLSAgICAyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNzgsCi0gICAgMjQyLDIyOCwyNDMsMjMzLDIzMSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICA0MiwgOTgsICAyLCAxMiwgMjMsIDEyLCAyOCwyMjUsMTE0LDEyOCwgIDEsIDM4LDI0MiwyMjksMjQ2LDIyOSwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQyLCA5OSwgIDIsIDEyLCA0NiwgMTIsIDU1LDIyOSwyMjgsCi0gICAgMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDQwLDIzMywyNDIsIDk5LCAgMiwgMTIsIDYzLCAxMiwgNjgsMjM2LAotICAgIDEwMSwxMjgsIDM2LDE4OSwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCAzNiwxMDAsICAyLCAxMiwKLSAgICAgODMsIDEyLCA5MywyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAzMCwgMzgsMjM5LDExNiwgIDIsCi0gICAgIDEyLDEwMCwgMTIsMTA5LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDM0LDIyNiwyMjksMjM2LAotICAgIDIzOSwxMTksMTI4LCAzMCwgMzYsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwKLSAgICAgNDAsMTExLCAgMiwgMTIsMTM1LCAxMiwxNDYsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCi0gICAgICA1LCA2NCwyNDIsMjMzLDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwgIDMsMjMyLDI0MywyMzcsMjI1LAotICAgIDIzNiwxMDgsMTI4LDI0NywxMDQsMjQ1LDIzOCwyMzEsMjI1LDI0MiwyNDUsMjM3LDIzNiwyMjUsMjQ1LDExNiwKLSAgICAxMjksMjQ2LDIwNywgMTIsMTgxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDgsMjUwLDI0MywyNDEsCi0gICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTQ0LCA3MywxNDYsICAwLCA3MywgMTIsMjM5LCAxMiwyNTEsIDEyLAotICAgIDI1NSwgMTMsIDExLCAxMywgMjksIDEzLCAzNywgMTMsIDk0LCAxMywxODEsIDEzLDIxNCwgMTMsMjI0LCAxMywKLSAgICAyNDIsIDEzLDI1NCwgMTQsIDQ4LCAxNCwgODYsIDE0LCA5OSwgMTQsMTY2LCAxNCwxODcsIDE0LDIwNSwxOTMsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0NywgNzQsMTI4LCAgMSwgNTAsMjEzLAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDYsMjI1LDIyNywyNDUsMjQ0LDEwMSwKLSAgICAxMjksICAwLDIwNSwgMTMsIDIxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzcsMjI2LDI0MiwyMjksCi0gICAgMjQ2LDEwMSwxMjgsICAxLCA0NCwgOTksICAzLCAxMywgNDUsIDEzLCA1MiwgMTMsIDg0LDIyNSwyNDIsMjM5LAotICAgIDExMCwxMjgsICAxLDIwNywyMzMsMjQyLCA5OSwgIDIsIDEzLCA2MCwgMTMsIDY1LDIzNiwxMDEsMTI4LCAzNiwKLSAgICAxOTAsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI5LCAgMCwyMDYsIDEzLCA3NiwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNDcsMjM4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAgNiwxMDAsICAzLAotICAgICAxMywxMDIsIDEzLDExMiwgMTMsMTU1LDIyNiwyMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAgOCwKLSAgICAyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTMxLCAgMCwyMDcsIDEzLDEyOCwgMTMsMTM2LCAxMywxNDcsCi0gICAgMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA0NiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMjI4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzksMjM5LDExNiwxMzAsICAxLCA0OCwKLSAgICAgMTMsMTY0LCAxMywxNzMsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgNDgsMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLDIwMiwxMDEsICAyLCAxMywxODcsIDEzLDIwMywyMjYsMjQyLDIyOSwyNDYsMjI5LAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCAyMSwyMzAsMjQyLDIyNSwyMzUsMjQ0LDI0NSwxMTQsMTI4LCAzMywgMTcsCi0gICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLDIwNCwgMTMsMjM0LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAotICAgIDI0NywyMzYsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwyMDAsMTA1LCAgMywKLSAgICAgMTQsICA2LCAxNCwgMTcsIDE0LCAzMiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgIDI0LDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwgIDIsIDEwLAotICAgIDI0MywyMzIsMjM5LDI0MiwyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNSwKLSAgICAxMDksICAyLCAxNCwgNTQsIDE0LCA3NSwyMjUsMjI3LDI0MiwyMzksMTEwLDEyOSwgIDEsIDQyLCAxNCwgNjQsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIyNiwyMzksMjM4LDIzOSwyNDMsMjQwLAotICAgIDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQxLDIzOCwyMzMsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKLSAgICAxMjgsICA1LCA1OSwxMTEsICAzLCAxNCwxMDcsIDE0LDExOCwgMTQsMTI2LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwgIDEsMjMxLDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCA0NiwyNDQsIDk3LAotICAgIDEzMSwgIDMsMTUzLCAxNCwxMzcsIDE0LDE0NywgMTQsMTU4LDIyNSwyMzAsMjQyLDIzMywyMjcsMjI1LDExMCwKLSAgICAxMjgsICAxLDE1MCwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgIDMsMTcwLDI0NCwyMzksCi0gICAgMjM4LDIzOSwxMTUsMTI4LCAgMywxMzgsMTE1LCAgMiwgMTQsMTcyLCAxNCwxNzksMjM3LDIyNSwyMzYsMTA4LAotICAgIDEyOCwyNDcsMTA1LDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxNTEsMjQ0LDIzMywyMzYsMjI4LDEwMSwKLSAgICAxMjksICAxLCA0MCwgMTQsMTk3LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNDQsMjUwLDIzMiwyMzMsCi0gICAgMjQ0LDI0MywgOTcsICAyLCAxNCwyMTYsIDE0LDIyNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMTE2LDIyOCwyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDExOCwgNzQsMTM0LCAgMCwgNzQsIDE1LCAgNiwgMTUsIDE4LCAxNSwgNDEsCi0gICAgIDE1LCA1MywgMTUsIDY3LCAxNSwgNzksMjI1LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LAotICAgICAgNSwgNjUsMjI3LDIzMywyNDIsIDk5LCAgMiwgMTUsIDI3LCAxNSwgMzIsMjM2LDEwMSwxMjgsIDM2LDE5MSwKLSAgICAyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCA1MiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LCAgOCwyMzIsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDUsIDc1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQyLDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDYsIDc1LDE0MCwgIDAsIDc1LCAxNSwxMTUsIDE1LDEyNSwgMTUsCi0gICAgMTM1LCAxNiwgMTgsIDE2LCA2NSwgMTYsIDc2LCAxNiwxMDYsIDE2LDE0MywgMTYsMTU2LCAxNiwxNjgsIDE2LAotICAgIDE4MCwgMTYsMjA4LDE5NCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDEzMywyMDMsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDUsIDk3LCAgNywgMTUsMTUxLCAxNSwxNjksIDE1LDE5MSwgMTUsCi0gICAgMjExLCAxNSwyMjYsIDE1LDIzMiwgMTUsMjQ5LDIyNiwyMjUsMjQzLDIzMiwyMzUsMjMzLDI0MiwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTYwLCA5OSwgIDIsIDE1LDE3NSwgMTUsMTgxLDI0NSwKLSAgICAyNDQsMTAxLDEyOCwgMzAsIDQ4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNiwyMjgsCi0gICAgMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMTU0LDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTk1LDI0MCwyNDAsIDk3LDEyOCwgIDMsMTU0LDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTgsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LAotICAgIDIzNiwyNDMsMjQ0LDI0MiwyMzksMjM1LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTU2LCA5OSwgIDQsIDE2LCAyOCwgMTYsIDM1LCAxNiwgNDQsIDE2LCA1MiwyMjUsMjQyLDIzOSwxMTAsCi0gICAgMTI4LCAgMSwyMzIsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNTQsMjMzLDI0MiwyMjcsMjM2LAotICAgIDEwMSwxMjgsIDM2LDE5MiwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwKLSAgICAgNTQsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA1MCwxMDEsICAyLCAxNiwgODIsCi0gICAgIDE2LCA5NCwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA4NCwyMzgsMjI1LAotICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2MywxMDQsICAzLCAxNiwxMTQsIDE2LDEyNiwKLSAgICAgMTYsMTM3LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDM3LDIyOSwyMzMsCi0gICAgMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzAsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNTIsMjM0LAotICAgIDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDEyLDIzNiwyMzMsMjM4LDIyOSwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDUyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsIDQzLDIzOSwyNDAsMjQwLCA5NywgIDIsIDE2LDE4OSwgMTYsMjAwLDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjgsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIyMiwKLSAgICAxMTUsICAyLCAxNiwyMTQsIDE2LDIyNiwyMzMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LDExMCwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDcsIDc2LDEzOCwgIDAsIDc2LCAxNywgIDEsIDE3LAotICAgICAgNSwgMTcsICA5LCAxNywgMjksIDE3LCA5NSwgMTcsMTMzLCAxNywxNDcsIDE3LDE2NSwgMTcsMTc3LCAxNywKLSAgICAxODksIDc0LDEyOCwgIDEsMTk5LCA3NiwxMjgsMjQ2LDE5MSwgOTcsICAyLCAxNywgMTUsIDE3LCAyMiwyMjcsCi0gICAgMjQ1LDI0NCwxMDEsMTI4LCAgMSwgNTcsMjM3LDIyNiwyMjgsIDk3LDEyOCwgIDMsMTU1LCA5OSwgIDQsIDE3LAotICAgICAzOSwgMTcsIDQ2LCAxNywgNTUsIDE3LCA4MiwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgNjEsMjI5LDIyOCwKLSAgICAyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNTksMjMzLDI0MiwgOTksICAyLCAxNywgNjMsIDE3LCA2OCwyMzYsCi0gICAgMTAxLDEyOCwgMzYsMTkzLDI0NSwyMzcsMjMwLDIzNiwyMjksMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LAotICAgICAzMCwgNjAsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDU5LDIyOCwKLSAgICAyMzksMTE2LDEzMCwgIDEsIDYzLCAxNywxMDUsIDE3LDExNCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCi0gICAgICAxLCA2MywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsIDU0LCAxNywxMjQsMjM3LDIyNSwyMjcsMjQyLAotICAgIDIzOSwxMTAsMTI4LCAzMCwgNTYsMjMzLDI0NywyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKLSAgICAxMjgsICA1LCA2MCwxMDYsMTI5LCAgMSwyMDAsIDE3LDE1MywyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LCAgOSwyMzYsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLAotICAgICA1OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA0NCwxMTUsICAyLCAxNywKLSAgICAxOTUsIDE3LDIxMiwyMzYsMjI1LDI0MywxMDQsMTI5LCAgMSwgNjUsIDE3LDIwNCwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNDYsMjQ5LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwOCwgNzcsMTM3LCAgMCwgNzcsIDE3LAotICAgIDI0MSwgMTcsMjUxLCAxOCwgMjQsIDE4LCAzMywgMTgsIDU4LCAxOCwgNzEsIDE4LCA4MywgMTgsIDkxLCAxOCwKLSAgICAxMDAsMTk0LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM0LDIyNSwgOTksICAyLCAxOCwgIDIsCi0gICAgIDE4LCAxOCwyNDIsMjM5LDExMCwxMjksMjQ2LDIwOCwgMTgsIDEwLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAotICAgIDI0NywxNzUsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgNjIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwKLSAgICAxOTQsMjI4LDIzOSwxMTYsICAyLCAxOCwgNDEsIDE4LCA1MCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCi0gICAgIDMwLCA2NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDY2LDIyOSwyMzgsMjI1LDI0MiwyMzcsMjI5LAotICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwKLSAgICAxMjgsMjU1LCA0NSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTA5LDI0NCwyNDUsMjQyLDIzOCwyMjksCi0gICAgMTAwLDEyOCwgIDEsMTU2LDExNywxMjgsICAzLDE1NiwgNzgsMTQxLCAgMCwgNzgsIDE4LDEzNCwgMTgsMTM4LAotICAgICAxOCwxNDYsIDE4LDIxMiwgMTgsMjM3LCAxOCwyNDgsIDE5LCAgMywgMTksIDIxLCAxOSwgMzMsIDE5LCA0NSwKLSAgICAgMTksIDU4LCAxOSwgNjYsIDE5LCA4NCwgNzQsMTI4LCAgMSwyMDIsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsCi0gICAgICAxLCA2NywgOTksICA0LCAxOCwxNTYsIDE4LDE2MywgMTgsMTcyLCAxOCwxOTksMjI1LDI0MiwyMzksMTEwLAotICAgIDEyOCwgIDEsIDcxLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDY5LDIzMywyNDIsIDk5LCAgMiwKLSAgICAgMTgsMTgwLCAxOCwxODUsMjM2LDEwMSwxMjgsIDM2LDE5NSwyNDUsMjM3LDIzMCwyMzYsMjI5LDI0OCwyMjYsCi0gICAgMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDc0LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LAotICAgIDExNiwxMjgsICAxLCA2OSwyMjgsMjM5LDExNiwgIDIsIDE4LDIyMCwgMTgsMjI5LDIyNSwyMjcsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgMzAsIDY4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNzAsMjMyLDIzOSwyMzksCi0gICAgMjM1LDIzNiwyMjksMjMwLDExNiwxMjgsICAxLDE1NywyMzMsMjM4LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLAotICAgIDEyOCwgMzMsMTA0LDEwNiwxMjksICAxLDIwMywgMTksICA5LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsIDEwLDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsCi0gICAgIDcyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQ2LDIzOSwyNDcsMjI1LAotICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3MCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKLSAgICAyNDcsMTEwLDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI5LCAgMCwyMDksIDE5LCA3NiwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNDcsMjQxLDExNywxMjgsICAzLDE1NywgNzksMTQxLCAgMCwgNzksIDE5LDExOCwgMTksMTMyLAotICAgICAxOSwxNTAsIDE5LDIwMywgMjAsIDc4LCAyMCwxNTIsIDIwLDE4NywgMjEsIDQ4LCAyMSwgNjksIDIxLDIxMywKLSAgICAgMjEsMjIzLCAyMSwyNTQsIDIyLCA1MywgNjksMTI5LCAgMSwgODIsIDE5LDEyNCwyNDMsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNDYsMjUwLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI5LCAgMCwyMTEsIDE5LDE0MiwyNDMsMjM3LAotICAgIDIyNSwyMzYsMTA4LDEyOCwyNDcsMjQzLCA5OCwgIDIsIDE5LDE1NiwgMTksMTk2LDIyNSwyNDIsMjQyLDIyOSwKLSAgICAxMDAsICAyLCAxOSwxNjYsIDE5LDE3NywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMjMyLDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LDIzNCwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMSwgNzgsIDk5LCAgNCwgMTksMjEzLCAxOSwKLSAgICAyMjAsIDE5LDIzNSwgMjAsIDY4LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIwOSwyMjksMjM4LDI0NCwyMjksCi0gICAgMjQyLDIyOSwyMjgsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsICAxLDE1OSwyMzMsMjQyLCA5OSwgIDIsIDE5LAotICAgIDI0MywgMTksMjQ4LDIzNiwxMDEsMTI4LCAzNiwxOTYsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTM0LCAgMCwKLSAgICAyMTIsIDIwLCAxMywgMjAsIDIxLCAyMCwgMzIsIDIwLCA0MCwgMjAsIDUyLCAyMCwgNjAsMjI1LDIyNywyNDUsCi0gICAgMjQ0LDEwMSwxMjgsIDMwLDIwOCwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjE2LAotICAgIDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwyMTAsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwKLSAgICAxMDEsMTI4LCAzMCwyMTIsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0NCwyNDQsMjMzLDIzNiwyMjgsCi0gICAgMTAxLDEyOCwgMzAsMjE0LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAzMCwxMDAsICAzLAotICAgICAyMCwgODYsIDIwLDEwOSwgMjAsMTQyLDIyNiwxMDgsICAyLCAyMCwgOTMsIDIwLDEwMSwyMjUsMjI3LDI0NSwKLSAgICAyNDQsMTAxLDEyOCwgIDEsIDgwLDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgMTIsMjMzLDIyOSwyNDIsCi0gICAgMjI5LDI0MywyMzMsMTE1LDEzMCwgIDAsMjE0LCAyMCwxMjMsIDIwLDEzNCwyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMjMwLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDYsMjM5LDI0NCwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjA0LDEwMywgIDIsIDIwLDE1OCwgMjAsMTcwLDIzOSwyMzgsCi0gICAgMjI5LDIzNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjUxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLAotICAgIDIxMCwgMjAsMTc5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDIsMTA0LCAgNCwgMjAsMTk3LCAyMCwKLSAgICAyMDgsIDIwLDIxMiwgMjEsIDM0LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgODUsCi0gICAgMTA5LDEyOCwgMzMsIDM4LDExMSwgIDIsIDIwLDIxOCwgMjAsMjI4LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LAotICAgIDEwMSwxMjgsIDMwLDIwNiwyNDIsMTEwLDEzMywgIDEsMTYwLCAyMCwyNDMsIDIwLDI1MSwgMjEsICA2LCAyMSwKLSAgICAgMTQsIDIxLCAyNiwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjE4LDIyOCwyMzksMjQ0LDIyNiwyMjksCi0gICAgMjM2LDIzOSwxMTksMTI4LCAzMCwyMjYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIyMCwyMzIsMjM5LAotICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIyMiwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwKLSAgICAgMzAsMjI0LDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwxMTYsMTI4LCAgMSwgODAsCi0gICAgMTA1LDEyOSwgIDEsMTYyLCAyMSwgNTQsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgMTQsMTA5LCAgNCwgMjEsIDc5LCAyMSwxMDcsIDIxLDE4NCwgMjEsMjAyLDIyNSwKLSAgICAyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwgNzYsIDIxLCA5MSwgMjEsIDk5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsCi0gICAgMTI4LCAzMCwgODIsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLCA4MCwyMjksMjMxLCA5NywxMzIsIDMzLAotICAgICAzOCwgMjEsMTIxLCAyMSwxMzIsIDIxLDE0MCwgMjEsMTU2LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwgOTYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDE2OSwyNDIsMjM5LDI0NSwyMzgsCi0gICAgMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjIsMTE2LCAgMiwgMjEsMTYyLAotICAgICAyMSwxNzcsMjMzLDI0NCwyMzYsMjM5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxMjQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTQzLDIzMywyMjcsMjQyLDIzOSwxMTAsMTI5LCAgMywxNTksCi0gICAgIDIxLDE5NCwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTQwLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAotICAgIDIyNywxMDEsMTI4LDI1NSwgNDcsMjM4LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsIDk2LDExMSwKLSAgICAgIDIsIDIxLDIyOSwgMjEsMjQ4LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI5LCAgMSwyMzQsIDIxLDIzOSwyMzcsCi0gICAgMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIzNiwyNDAsMjI5LDExMCwxMjgsICAxLDEzNCwxMTUsICAzLAotICAgICAyMiwgIDYsIDIyLCAzMywgMjIsIDQwLDIzNiwyMjUsMjQzLDEwNCwxMzAsICAwLDIxNiwgMjIsIDE3LCAyMiwKLSAgICAgMjUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1NCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsCi0gICAgMjQ4LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExMSwyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNSwyMjcsMjQ1LAotICAgIDI0NCwxMDEsMTI4LCAgMSwyNTQsMTE2LCAgMiwgMjIsIDU5LCAyMiwgNzAsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDEyNiwyMzMsMjM2LDIyOCwxMDEsMTMxLCAgMCwyMTMsIDIyLCA4MywgMjIsCi0gICAgIDkxLCAyMiwxMDIsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA3NiwyMjgsMjMzLDIyOSwyNDIsMjI5LAotICAgIDI0MywyMzMsMTE1LDEyOCwgMzAsIDc4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDUsIDgwLDEzNiwKLSAgICAgIDAsIDgwLCAyMiwxMzAsIDIyLDEzOCwgMjIsMTQ3LCAyMiwxNTksIDIyLDIxMSwgMjIsMjI3LCAyMiwyNDYsCi0gICAgIDIzLCAgMiwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDg0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLAotICAgIDEyOCwgMzYsMTk3LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDg2LDEwMSwKLSAgICAgIDMsIDIyLDE2NywgMjIsMTc4LCAyMiwxOTAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LCAzMSwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3NCwyMzcsMjMzLAotICAgIDIyOCwyMjgsMjM2LDIyOSwyMzIsMjM5LDIzOSwyMzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LDE2NiwxMDQsICAyLCAyMiwyMTcsIDIyLDIyMSwxMDUsMTI4LCAgMywxNjYsMjM5LDIzOSwxMDcsCi0gICAgMTI4LCAgMSwxNjQsMTA1LDEyOSwgIDMsMTYwLCAyMiwyMzMsMjQ3LDI0MiwyMjUsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDgzLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsIDQ4LDExNSwgIDIsIDIzLCAgOCwgMjMsIDI1LDEwNSwxMjksICAzLDE2OCwgMjMsIDE0LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTIsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTEyLAotICAgICA4MSwxMzEsICAwLCA4MSwgMjMsIDQyLCAyMywgNTEsIDIzLCA2MywyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwKLSAgICAxMjgsIDM2LDE5OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA0OSwyNDMsCi0gICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTEzLCA4MiwxMzgsICAwLCA4MiwgMjMsIDk1LCAyMywxMTksIDIzLAotICAgIDE2NiwgMjMsMjE3LCAyMywyMzAsIDIzLDI0MCwgMjMsMjQ1LCAyNCwgMTksIDI0LCAzMSwgMjQsIDQzLCA5NywKLSAgICAgIDIsIDIzLDEwMSwgMjMsMTEyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzYsCi0gICAgMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsIDg0LCA5OSwgIDQsIDIzLDEyOSwgMjMsMTM2LCAyMywxNDUsIDIzLAotICAgIDE1MywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgODgsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwKLSAgICAgODYsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDE5OSwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsCi0gICAgMjI5LDIzOCwxMTYsMTI4LCAgMSwgODYsMTAwLCAgMiwgMjMsMTcyLCAyMywxODIsMjI2LDIzNiwyMzEsMjQyLAotICAgIDIyNSwyNDYsMTAxLDEyOCwgIDIsIDE2LDIzOSwxMTYsICAyLCAyMywxODksIDIzLDE5OCwyMjUsMjI3LDIyNywKLSAgICAyMjksMjM4LDExNiwxMjgsIDMwLCA4OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsIDkwLCAyMywyMDgsCi0gICAgMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAzMCwgOTIsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDgwLDIzMCwyNDIsMjI1LDIzNSwyNDQsMjQ1LDExNCwxMjgsIDMzLCAyOCwKLSAgICAyMzIsMTExLDEyOCwgIDMsMTYxLDIzMywxMTAsICAyLCAyMywyNTIsIDI0LCAgNSwyMzEsMjQzLDIzNywyMjUsCi0gICAgMjM2LDEwOCwxMjgsMjQ2LDI1MiwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLDIyOSwyNDYsMTAxLAotICAgIDEyOCwgIDIsIDE4LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDk0LDIzNywKLSAgICAyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDUwLDI0MywyMzcsMjI1LDIzNiwxMDgsCi0gICAgMTI5LDI0NywxMTQsIDI0LCA1MywyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMTAwLDEyOSwgIDIsMTI5LAotICAgICAyNCwgNjYsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDE4MiwgODMsMTM5LCAgMCwKLSAgICAgODMsIDI0LDEwMywgMjYsIDE3LCAyNiwgNTUsIDI2LDE4MiwgMjYsMjIxLCAyNiwyNTAsIDI3LCA4NCwgMjcsCi0gICAgMTA1LCAyNywxMTcsIDI3LDEzNSwgMjcsMTQzLCA3MCwgIDYsIDI0LDExNywgMjQsMjA5LCAyNCwyNDEsIDI1LAotICAgICA3NywgMjUsMTE5LCAyNSwyMjEsIDQ4LCAgOSwgMjQsMTM3LCAyNCwxNDUsIDI0LDE1MywgMjQsMTYxLCAyNCwKLSAgICAxNjksIDI0LDE3NywgMjQsMTg1LCAyNCwxOTMsIDI0LDIwMSwxNzcsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDEyLDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgMjAsMTc5LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICAxNiwxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDI0LDE4MSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgNjAsMTgyLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA0NCwxODMsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDUyLDE4NCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgMjgsMTg1LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICAzNiwgNDksICAzLCAyNCwyMTcsIDI0LDIyNSwgMjQsMjMzLDE3NiwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgIDAsMTc3LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCAgMiwxODUsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDk3LCA1MCwgIDksIDI1LCAgNSwgMjUsIDEzLCAyNSwgMjEsIDI1LCAyOSwgMjUsIDM3LCAyNSwgNDUsIDI1LAotICAgICA1MywgMjUsIDYxLCAyNSwgNjksMTc2LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5OCwxNzcsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsIDg2LDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODUsMTc5LDE3NiwxNzYsCi0gICAgMTc2LCA0OCwxMjgsIDM3LCA5OSwxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDgxLDE4MSwxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywgODcsMTgyLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5MywxODMsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsIDkyLDE4NCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgOTEsIDUxLCAgNCwgMjUsCi0gICAgIDg3LCAyNSwgOTUsIDI1LDEwMywgMjUsMTExLDE4MiwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgOTQsMTgzLAotICAgIDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5NSwxODQsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDkwLDE4NSwKLSAgICAxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODQsIDUyLCAxMCwgMjUsMTQxLCAyNSwxNDksIDI1LDE1NywgMjUsCi0gICAgMTY1LCAyNSwxNzMsIDI1LDE4MSwgMjUsMTg5LCAyNSwxOTcsIDI1LDIwNSwgMjUsMjEzLDE3NiwxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywxMDUsMTc3LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwMiwxNzgsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsIDk2LDE3OSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODAsMTgwLDE3NiwxNzYsCi0gICAgMTc2LCA0OCwxMjgsIDM3LDEwOCwxODEsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsMTAzLDE4MiwxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywxMDQsMTgzLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwMCwxODQsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsMTAxLDE4NSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODksIDUzLCAgNSwgMjUsCi0gICAgMjMzLCAyNSwyNDEsIDI1LDI0OSwgMjYsICAxLCAyNiwgIDksMTc2LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICA4OCwxNzcsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDgyLDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgODMsMTc5LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwNywxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgMTA2LCA5NywgIDIsIDI2LCAyMywgMjYsIDQ0LDIyNywyNDUsMjQ0LDEwMSwxMjksICAxLCA5MCwgMjYsIDMyLAotICAgIDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTAwLDIzNywyNDAsMjMzLDIzMSwKLSAgICAyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMjQsIDk5LCAgNSwgMjYsIDY3LCAyNiwgOTgsIDI2LDEwNywgMjYsCi0gICAgMTQ3LCAyNiwxNjksMjI1LDI0MiwyMzksMTEwLDEzMCwgIDEsIDk2LCAyNiwgNzgsIDI2LCA5MCwyMjgsMjM5LAotICAgIDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEwMiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKLSAgICAyNDYsMjUzLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDk0LDIzMiwyNDcsIDk3LDEzMCwgIDEsCi0gICAgMTQzLCAyNiwxMTcsIDI2LDEyOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjE2LAotICAgIDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LDIxOCwyMzMsMjQyLCA5OSwgIDIsIDI2LDE1NSwgMjYsMTYwLDIzNiwxMDEsMTI4LCAzNiwyMDAsCi0gICAgMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwgOTIsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LAotICAgIDIyOSwyMzgsMTE2LDEyOCwgIDIsIDI0LDIyOCwyMzksMTE2LCAgMiwgMjYsMTkwLCAyNiwxOTksMjI1LDIyNywKLSAgICAyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgOTYsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjksIDMwLCA5OCwgMjYsCi0gICAgMjA5LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTA0LDEwMSwgIDIsIDI2LAotICAgIDIyNywgMjYsMjM5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDc3LDI0NiwKLSAgICAyMjksMjM4LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDIsMTA0LCAgNSwgMjcsICA2LCAyNywgMzQsCi0gICAgIDI3LCA0OCwgMjcsIDU5LCAyNywgNzIsIDk3LCAgMiwgMjcsIDEyLCAyNywgMjMsMjI1LDI0MiwyMzcsMjI5LAotICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3MSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDQwLDIyNywyMzIsMjI1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDEsCi0gICAgMjI5LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIyNiwyMzIsMjI1LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODYsMjMzLDIzNywyMjUsMjI3LDIzOSwyNDAsMjQ0LDIzMywKLSAgICAgOTksMTI4LCAgMywyMzYsMTA1LCAgMiwgMjcsIDkwLCAyNywgOTYsMjMxLDIzNywgOTcsMTI4LCAgMywxNjMsCi0gICAgMjQ4LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAotICAgIDIyNywxMDEsMTI4LDI1NSwgNTEsMjM5LDIzMCwyNDQsMjQzLDIzMywyMzEsMjM4LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDQsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExNSwyNDQsCi0gICAgMjMzLDIzMSwyMzcsMjI1LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMTgsIDg0LDE0MSwgIDAsIDg0LAotICAgICAyNywxODYsIDI3LDE5MSwgMjcsMTk3LCAyOCwgIDcsIDI4LCAzMiwgMjgsIDk2LCAyOCwxNDcsIDI4LDE3NywKLSAgICAgMjgsMTg5LCAyOCwyMDEsIDI4LDI0NiwgMjksICA2LCAyOSwgNDYsMjI1LDExNywxMjgsICAzLDE2NCwyMjYsCi0gICAgMjI1LDExNCwxMjgsICAxLDEwMiwgOTksICA0LCAyNywyMDcsIDI3LDIxNCwgMjcsMjIzLCAyNywyNTAsMjI1LAotICAgIDI0MiwyMzksMTEwLDEyOCwgIDEsMTAwLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDk4LDIzMywKLSAgICAyNDIsIDk5LCAgMiwgMjcsMjMxLCAyNywyMzYsMjM2LDEwMSwxMjgsIDM2LDIwMSwyNDUsMjM3LDIzMCwyMzYsCi0gICAgMjI5LDI0OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTEyLDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LAotICAgIDIyNywyMjksMjM4LDExNiwxMjgsICAxLCA5OCwyMjgsMjM5LDExNiwgIDIsIDI4LCAxNSwgMjgsIDI0LDIyNSwKLSAgICAyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTA2LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMDgsCi0gICAgMTAxLCAgNCwgMjgsIDQyLCAyOCwgNTMsIDI4LCA3MywgMjgsIDgyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwgMzQsMjI4LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3MiwyMzgsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsCi0gICAgIDMzLDEwNSwyNDQsMjQzLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTgwLAotICAgIDEwNCwgIDMsIDI4LDEwNCwgMjgsMTEwLCAyOCwxMzYsMjI5LDI0NCwgOTcsMTI4LCAgMywxNTIsMTExLCAgMiwKLSAgICAgMjgsMTE2LCAyOCwxMjEsMjM5LDEwNywxMjgsICAxLDE3MiwyNDIsMTEwLDEyOSwgIDAsMjIyLCAyOCwxMjgsCi0gICAgMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1NCwyNDIsMjI5LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLAotICAgIDEyOCwgMzMsIDk4LDEwNSwgIDIsIDI4LDE1MywgMjgsMTY0LDIzNiwyMjgsMjI5LDI0MywyMzcsMjI1LDIzNiwKLSAgICAxMDgsMTI4LDI0NiwyNTQsMjQ3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCi0gICAgIDc5LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTEwLDIzNywyMzksMjM4LAotICAgIDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDUyLDExMSwgIDIsIDI4LDIwNywgMjgsMjE4LDIyNSwKLSAgICAyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTcsMjM4LDEwMSwgIDMsIDI4LDIyNywgMjgsCi0gICAgMjM0LCAyOCwyNDAsMjMwLDIzMywyNDYsMTAxLDEyOCwgIDEsMTg4LDI0MywyMzMsMTIwLDEyOCwgIDEsMTMyLAotICAgIDI0NCwyNDcsMTExLDEyOCwgIDEsMTY3LDI0MiwyMjksMjQ0LDI0MiwyMzksMjMwLDIzNiwyMjksMjQ4LDIzMiwKLSAgICAyMzksMjM5LDEwNywxMjgsICAxLDE3NCwxMTUsICAzLCAyOSwgMTQsIDI5LCAyNiwgMjksIDM5LDIyOSwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDM4LDIzMiwyMjksMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxMSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMTYsMTE5LCAgMiwKLSAgICAgMjksIDUyLCAyOSwgNjQsMjI5LDIzNiwyNDYsMjI5LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDcsCi0gICAgMjM5LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywgOTcsIDg1LDE0MiwgIDAsIDg1LCAyOSwxMDUsIDI5LAotICAgIDEyMywgMjksMTMxLCAyOSwxOTgsIDMwLCA2OSwgMzAsIDg3LCAzMCwxOTgsIDMwLDIxNCwgMzAsMjI2LCAzMSwKLSAgICAgMjEsIDMxLCAzMCwgMzEsMTQyLCAzMSwxNDksIDMxLDIxOSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDAsCi0gICAgMjE4LCAyOSwxMTUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MCwyMjYsMjQyLDIyOSwyNDYsMTAxLAotICAgIDEyOCwgIDEsMTA4LCA5OSwgIDMsIDI5LDEzOSwgMjksMTQ2LCAyOSwxODgsMjI1LDI0MiwyMzksMTEwLDEyOCwKLSAgICAgIDEsMjExLDIzMywyNDIsIDk5LCAgMiwgMjksMTU0LCAyOSwxNTksMjM2LDEwMSwxMjgsIDM2LDIwMiwyNDUsCi0gICAgMjM3LDIzMCwyMzYsMjI5LDEyMCwxMzAsICAwLDIxOSwgMjksMTcyLCAyOSwxODAsMjI2LDIyOSwyMzYsMjM5LAotICAgIDExOSwxMjgsIDMwLDExOCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjUxLDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCAzNSwxMDAsICAzLCAyOSwyMDYsIDI5LDIyOSwgMzAsIDU5LDIyNiwxMDgsCi0gICAgICAyLCAyOSwyMTMsIDI5LDIyMSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMTEyLDIzMSwyNDIsMjI1LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgMjAsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEzNCwgIDAsMjIwLCAyOSwKLSAgICAyNTEsIDMwLCAgMywgMzAsIDExLCAzMCwgMzQsIDMwLCA0MiwgMzAsIDUxLDIyNSwyMjcsMjQ1LDI0NCwxMDEsCi0gICAgMTI4LCAgMSwyMTUsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExNCwgOTksICAyLCAzMCwgMTcsIDMwLAotICAgICAyNCwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMTcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMjQwLDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMSwyMTksMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsCi0gICAgMTI4LCAgMSwyMTMsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MiwyMzksMjQ0LDIyNiwyMjksMjM2LAotICAgIDIzOSwxMTksMTI4LCAzMCwyMjgsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLDIxNywgMzAsIDc5LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDksMTA0LCAgMiwgMzAsIDkzLCAzMCwxNzEsMTExLCAgMiwgMzAsCi0gICAgIDk5LCAzMCwxMDksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjMwLDI0MiwxMTAsMTMzLAotICAgICAgMSwxNzUsIDMwLDEyNCwgMzAsMTMyLCAzMCwxNDMsIDMwLDE1MSwgMzAsMTYzLDIyNSwyMjcsMjQ1LDI0NCwKLSAgICAxMDEsMTI4LCAzMCwyMzIsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDI0MCwyMzEsCi0gICAgMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMjM0LDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLAotICAgIDEyOCwgMzAsMjM2LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwyMzgsMjQ1LDIzOCwyMzEsMjI1LDI0MiwKLSAgICAyNDUsMjM3LDIzNiwyMjUsMjQ1LDExNiwxMjksICAxLDExMiwgMzAsMTg3LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwyNDIsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLAotICAgIDIyOSwyNDYsMTAxLDEyOCwgIDIsIDIyLDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTIwLDEwOSwgIDIsIDMwLDIzMiwgMzEsIDEwLDIyNSwyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwxMDYsCi0gICAgIDMwLDI0NCwgMzAsMjU1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMzgsMjI4LAotICAgIDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsIDMwLDEyMiwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsIDUzLDIzOSwyMzEsMjM5LDIzOCwyMjksMTA3LDEyOCwgIDEsMTE0LDI0MCwyNDMsCi0gICAgMjMzLDIzNiwyMzksMTEwLDEzMywgIDMsMTY1LCAzMSwgNDksIDMxLCA1MywgMzEsIDkwLCAzMSwxMjEsIDMxLAotICAgIDEzNCwgNDksMTI4LCAgMywyMTAsIDk3LCAgMiwgMzEsIDU5LCAzMSwgODEsMjI3LDI0NSwyNDQsMjI5LDIzMiwKLSAgICAyMzksMjM5LDIzNSwyNDMsMjQ5LDIzNywyMjYsMjM5LDIzNiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsCi0gICAgMjExLDIzMCwyNDIsMjMzLDIyNywyMjUsMTEwLDEyOCwgIDEsMTc3LDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLAotICAgIDIzMywxMTUsMTI5LCAgMywxNzEsIDMxLDEwMywyMzIsMjM5LDIzOSwyMzUsMjQzLDI0OSwyMzcsMjI2LDIzOSwKLSAgICAyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIxMiwyMzIsMjM5LDIzOSwyMzUsMjQzLDI0OSwyMzcsCi0gICAgMjI2LDIzOSwxMDgsMTI4LCAgMywyMTAsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDE0MiwyNDIsMjMzLAotICAgIDIzOCwxMDMsMTI4LCAgMSwxMTAsMTE1LCAgMywgMzEsMTU3LCAzMSwxNzIsIDMxLDE3OSwyMzIsMjM5LDI0MiwKLSAgICAyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxNCwyMzcsMjI1LDIzNiwxMDgsCi0gICAgMTI4LDI0NywxMTcsMjQ0LDI0MiwyMjUsMjMzLDIzMSwyMzIsMTE2LCAgMiwgMzEsMTkxLCAzMSwyMDIsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3NCwyNDMsMjQ0LDI0MiwyMzksMjM1LDIyOSwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTc2LDI0NCwyMzMsMjM2LDIyOCwxMDEsCi0gICAgMTMwLCAgMSwxMDQsIDMxLDIzMSwgMzEsMjM5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxMjAsMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExNiwgODYsMTM2LCAgMCwgODYsIDMyLCAxMSwgMzIsIDIwLCAzMiwKLSAgICAgMzEsIDMyLCA2MCwgMzIsIDY3LCAzMiwgNzksIDMyLCA5MSwgMzIsIDk5LDIyNywyMzMsMjQyLDIyNywyMzYsCi0gICAgMTAxLDEyOCwgMzYsMjAzLDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMjYsMTAxLAotICAgICAgMiwgMzIsIDM3LCAzMiwgNDgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxOCwKLSAgICAyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3OCwyMzIsMjM5LDIzOSwxMDcsCi0gICAgMTI4LCAgMSwxNzgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNTQsMjM5LAotICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzIsMjQzLDIzNywyMjUsMjM2LDEwOCwKLSAgICAxMjgsMjQ3LDExOCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTI0LCA4NywxMzQsICAwLCA4NywgMzIsCi0gICAgMTIzLCAzMiwxMzEsIDMyLDE1NCwgMzIsMTk0LCAzMiwyMDIsIDMyLDIxNCwyMjUsMjI3LDI0NSwyNDQsMTAxLAotICAgIDEyOCwgMzAsMTMwLDIyNywyMzMsMjQyLCA5OSwgIDIsIDMyLDE0MCwgMzIsMTQ1LDIzNiwxMDEsMTI4LCAzNiwKLSAgICAyMDQsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwxMTYsMTAwLCAgMiwgMzIsMTYwLCAzMiwxNzAsCi0gICAgMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsMTMyLDIzOSwxMTYsICAyLCAzMiwxNzcsIDMyLAotICAgIDE4NiwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEzNCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKLSAgICAgMzAsMTM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwxMjgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsCi0gICAgMjI1LDIyNywxMDEsMTI4LDI1NSwgNTUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExOSwgODgsMTM0LAotICAgICAgMCwgODgsIDMyLDIzOCwgMzIsMjQ3LCAzMywgMTgsIDMzLCAzMSwgMzMsIDM1LCAzMywgNDcsMjI3LDIzMywKLSAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMDUsMTAwLCAgMiwgMzIsMjUzLCAzMywgIDcsMjMzLDIyOSwyNDIsCi0gICAgMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsMTQwLDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAotICAgICAzMCwxMzgsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDYxLDEwNSwKLSAgICAxMjgsICAzLDE1OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA1NiwyNDMsCi0gICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTIwLCA4OSwxMzksICAwLCA4OSwgMzMsIDgxLCAzMywxMTYsIDMzLAotICAgIDEzOSwgMzMsMTg5LCAzMywyMjgsIDMzLDIzNiwgMzMsMjUzLCAzNCwgNDAsIDM0LCA1MiwgMzQsIDYwLCAzNCwKLSAgICAgNjgsIDk3LCAgMiwgMzMsIDg3LCAzMywxMDQsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDAsMjIxLCAzMywgOTYsCi0gICAgMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MywyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCA5OCwyMjcsMjMzLDI0MiwgOTksICAyLCAzMywxMjUsIDMzLDEzMCwyMzYsMTAxLDEyOCwKLSAgICAgMzYsMjA2LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsMTE4LDEwMCwgIDIsIDMzLDE0NSwgMzMsCi0gICAgMTY1LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjksICAxLDEyMCwgMzMsMTU3LDI0MywyMzcsMjI1LAotICAgIDIzNiwxMDgsMTI4LDI0NywyNTUsMjM5LDExNiwgIDIsIDMzLDE3MiwgMzMsMTgxLDIyNSwyMjcsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgMzAsMTQyLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyNDQsMjI5LDExNCwgIDIsCi0gICAgIDMzLDE5NiwgMzMsMjA4LDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDQzLAotICAgIDI0NSwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwyNDgsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDI0MiwyMzIsMjM5LDIzOSwxMDcsCi0gICAgMTI5LCAgMSwxNzksIDMzLDI0NSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjQ2LDEwNSwgIDMsIDM0LAotICAgICAgNSwgMzQsIDE2LCAzNCwgMjcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2OSwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsICA3LDI0NywyMzgsMjI1LDI0MiwyMzcsCi0gICAgMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA4MiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCA1NywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTIxLDI0NCwyMzMsMjM2LDIyOCwKLSAgICAxMDEsMTI4LCAzMCwyNDgsMjQ1LDExNSwgIDIsIDM0LCA3NSwgMzQsMTEzLDIyNiwyMzMsMTAzLCAgMiwgMzQsCi0gICAgIDgzLCAzNCwgOTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNiwyMzMsMjM5LAotICAgIDI0NCwyMzMsMjMwLDIzMywyMjksMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxMDgsMjM2LDIzMywyNDQsMjQ0LDIzNiwxMDEsICAyLCAzNCwxMjQsIDM0LDEzNSwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTAyLDIzMywyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNCwgOTAsMTM2LCAgMCwgOTAsIDM0LDE3NCwKLSAgICAgMzQsMTk4LCAzNCwyNDMsIDM1LCAxNCwgMzUsIDgxLCAzNSwxNzMsIDM1LDE4NSwgMzUsMTk3LCA5NywgIDIsCi0gICAgIDM0LDE4MCwgMzQsMTkxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTQsMjI3LAotICAgIDI0NSwyNDQsMTAxLDEyOCwgIDEsMTIxLCA5OSwgIDIsIDM0LDIwNCwgMzQsMjIxLDIyNSwyNDIsMjM5LDExMCwKLSAgICAxMjksICAxLDEyNSwgMzQsMjEzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNTUsMjMzLDI0MiwgOTksCi0gICAgICAyLCAzNCwyMjksIDM0LDIzNCwyMzYsMTAxLDEyOCwgMzYsMjA3LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLAotICAgIDEyOCwgMzAsMTQ0LDIyOCwyMzksMTE2LDEzMCwgIDEsMTIzLCAzNCwyNTMsIDM1LCAgNiwyMjUsMjI3LDIyNywKLSAgICAyMjksMjM4LDExNiwxMjgsICAxLDEyMywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTQ2LDEwMSwgIDMsCi0gICAgIDM1LCAyMiwgMzUsIDMzLCAzNSwgNzYsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICAyMywxMDAsICAyLCAzNSwgMzksIDM1LCA1OCwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTIsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsCi0gICAgMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMjIsMjQ0LCA5NywxMjgsICAzLAotICAgIDE1MCwyMzIsMTAxLCAgNCwgMzUsIDkyLCAzNSwxMDMsIDM1LDExOSwgMzUsMTMwLDIyNSwyNDIsMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTgsMjI2LDI0MiwyMjksMjQ2LDIyOSwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTkzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwgMjIsMTAwLCAgMiwgMzUsMTM2LCAzNSwxNTUsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTUwLDIzMywyMjksMjQyLDIyOSwyNDMsCi0gICAgMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjIwLDIzNiwyMzMsMjM4LAotICAgIDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTQ4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsIDU4LDExNSwgIDIsIDM1LDIwMywgMzUsMjEwLDIzNywyMjUsMjM2LDEwOCwxMjgsCi0gICAgMjQ3LDEyMiwyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMTgxLCA5NywxNDksICAwLCA5NywgMzYsICA4LAotICAgICAzNiwxNDQsIDM3LCAzNSwgMzcsMjExLCAzOCwgNTUsIDM4LCA5MSwgNDUsIDEwLCA0NSwgNDcsIDQ1LCA3NCwKLSAgICAgNDYsIDQzLCA0NiwgODEsIDQ3LDE3MCwgNDcsMjQyLCA0OCwxOTcsIDQ4LDIwNiwgNDksIDc5LCA1MSwgODcsCi0gICAgIDUyLCA3NywgNTIsMTI0LCA1MywgMTksIDUzLCAzMywgOTcsICA3LCAzNiwgMjQsIDM2LCAzNCwgMzYsIDQxLAotICAgICAzNiwgNDgsIDM2LCA3MywgMzYsIDg5LCAzNiwxMDAsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwKLSAgICAgIDksMTM0LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAwLDIyNSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDYsCi0gICAgMjMxLDExNywgIDIsIDM2LCA1NSwgMzYsIDY0LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTM0LAotICAgIDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsICA2LDIzNywyMjUsMjQ0LDI0MiwyMjUsMjMxLDI0NSwKLSAgICAyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA2MiwyNDIsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsICAzLDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMywgMzYsMTE2LAotICAgICAzNiwxMjYsIDM2LDEzMywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxOTAsMjI4LDIyOSwKLSAgICAyNDYsIDk3LDEyOCwgIDksIDYyLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTAsCi0gICAgIDk4LCAgNCwgMzYsMTU0LCAzNiwxOTUsIDM2LDIwNCwgMzYsMjE0LDIyNiwyNDIsMjI5LDI0NiwyMzMsMjI1LAotICAgIDI0NCwyMzMsMjM5LDExMCwgIDIsIDM2LDE2OSwgMzYsMTg0LDIzNywyMjUsMjQyLDIzNSwyMjUsMjQyLDIzNywKLSAgICAyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDk1LDI0MywyMzMsMjMxLDIzOCwyMjgsMjI5LDI0NiwgOTcsCi0gICAgMTI4LCAgOSwxMTIsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxMzMsMjM5LDI0MCwyMzksMjM3LAotICAgIDIzOSwyMzAsMTExLDEyOCwgNDksIDI2LDI0MiwyMjksMjQ2LDEwMSwxMzQsICAxLCAgMywgMzYsMjMzLCAzNiwKLSAgICAyNDEsIDM2LDI1MiwgMzcsICA3LCAzNywgMTUsIDM3LCAyNywyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsCi0gICAgMTc1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMDksMjI4LDIzOSwyNDQsMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE4MywyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMTc3LDIzMiwKLSAgICAyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTc5LDI0NCwyMzMsMjM2LDIyOCwxMDEsCi0gICAgMTI4LCAzMCwxODEsIDk5LCAgNCwgMzcsIDQ1LCAzNywgNTIsIDM3LDEzMSwgMzcsMjAxLDIyNSwyNDIsMjM5LAotICAgIDExMCwxMjgsICAxLDIwNiwyMzMsMjQyLCA5OSwgIDIsIDM3LCA2MCwgMzcsIDY1LDIzNiwxMDEsMTI4LCAzNiwKLSAgICAyMDgsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTMzLCAgMCwyMjYsIDM3LCA4NCwgMzcsIDkyLCAzNywxMDMsCi0gICAgIDM3LDExMSwgMzcsMTIzLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxNjUsMjI4LDIzOSwyNDQsMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE3MywyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMTY3LDIzMiwKLSAgICAyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTY5LDI0NCwyMzMsMjM2LDIyOCwxMDEsCi0gICAgMTI4LCAzMCwxNzEsMjQ1LDI0NCwxMDEsMTMzLCAgMCwxODAsIDM3LDE0NywgMzcsMTU4LCAzNywxNzUsIDM3LAotICAgIDE4MiwgMzcsMTkxLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjMsIDk5LCAgMiwKLSAgICAgMzcsMTY0LCAzNywxNjksMjM3LCA5OCwxMjgsICAzLCAgMSwyMzksMjM3LCA5OCwxMjgsICAzLCAgMSwyMjgsCi0gICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgODQsMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMDcsMjQ0LAotICAgIDIzOSwyMzgsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDY1LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LCA0OCwxMDAsICA1LCAzNywyMjMsIDM3LDIzMywgMzcsMjQ3LCAzNywyNTMsIDM4LCAzMSwyMjYsCi0gICAgMjM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgIDEsMjI4LDIyNSwyMzUsMjMxLDI0NSwyNDIsMjM3LAotICAgIDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExMywyMjksMjQ2LCA5NywxMjgsICA5LCAgNSwyMzMsMjI5LDI0MiwKLSAgICAyMjksMjQzLDIzMywxMTUsMTMwLCAgMCwyMjgsIDM4LCAxMSwgMzgsIDIyLDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwyMTEsMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjMsMjM5LAotICAgIDExNiwgIDIsIDM4LCAzOCwgMzgsIDQ2LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNjEsMjM3LDIyNSwKLSAgICAyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjUsMTAxLDEzMSwgIDAsMjMwLCAzOCwgNjUsIDM4LCA3MywgMzgsCi0gICAgIDgyLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwyNTMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAotICAgICA0OSwgODAsMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjcsMjMwLDIzMywxMDUsICA2LCAzOCwKLSAgICAxMDcsIDM4LDEyNywgNDEsIDY0LCA0MSwgNzAsIDQxLCA4NSwgNDQsMTg1LCA0OCwgIDIsIDM4LDExMywgMzgsCi0gICAgMTIwLDE3NiwxNzgsMTc2LCA1NiwxMjgsIDMyLCAyMSwxODQsMTg1LDE4MCwgNDksMTI4LCAzMiwxNjQsMTc3LAotICAgICA0OCwgIDMsIDM4LDEzNiwgNDAsMTYwLCA0MSwgMzksIDQ4LCAgOSwgMzgsMTU2LCAzOCwxNzYsIDM4LDIzOCwKLSAgICAgMzksIDQ0LCAzOSwxMDYsIDM5LDE2OCwgMzksMjMwLCA0MCwgMzYsIDQwLCA5OCwgNDksICAzLCAzOCwxNjQsCi0gICAgIDM4LDE2OCwgMzgsMTcyLCA1NSwxMjgsICA0LCAxNiwgNTYsMTI4LCAgNCwgMTcsIDU3LDEyOCwgIDQsIDE4LAotICAgICA1MCwgMTAsIDM4LDE5OCwgMzgsMjAyLCAzOCwyMDYsIDM4LDIxMCwgMzgsMjE0LCAzOCwyMTgsIDM4LDIyMiwKLSAgICAgMzgsMjI2LCAzOCwyMzAsIDM4LDIzNCwgNDgsMTI4LCAgNCwgMTksIDQ5LDEyOCwgIDQsIDIwLCA1MCwxMjgsCi0gICAgICA0LCAyMSwgNTEsMTI4LCAgNCwgIDEsIDUyLDEyOCwgIDQsIDIyLCA1MywxMjgsICA0LCAyMywgNTQsMTI4LAotICAgICAgNCwgMjQsIDU1LDEyOCwgIDQsIDI1LCA1NiwxMjgsICA0LCAyNiwgNTcsMTI4LCAgNCwgMjcsIDUxLCAxMCwKLSAgICAgMzksICA0LCAzOSwgIDgsIDM5LCAxMiwgMzksIDE2LCAzOSwgMjAsIDM5LCAyNCwgMzksIDI4LCAzOSwgMzIsCi0gICAgIDM5LCAzNiwgMzksIDQwLCA0OCwxMjgsICA0LCAyOCwgNDksMTI4LCAgNCwgMjksIDUwLDEyOCwgIDQsIDMwLAotICAgICA1MSwxMjgsICA0LCAzMSwgNTIsMTI4LCAgNCwgMzIsIDUzLDEyOCwgIDQsIDMzLCA1NCwxMjgsICA0LCAzNCwKLSAgICAgNTUsMTI4LCAgNCwgMzUsIDU2LDEyOCwgIDQsIDM2LCA1NywxMjgsICA0LCAzNywgNTIsIDEwLCAzOSwgNjYsCi0gICAgIDM5LCA3MCwgMzksIDc0LCAzOSwgNzgsIDM5LCA4MiwgMzksIDg2LCAzOSwgOTAsIDM5LCA5NCwgMzksIDk4LAotICAgICAzOSwxMDIsIDQ4LDEyOCwgIDQsIDM4LCA0OSwxMjgsICA0LCAzOSwgNTAsMTI4LCAgNCwgNDAsIDUxLDEyOCwKLSAgICAgIDQsIDQxLCA1MiwxMjgsICA0LCA0MiwgNTMsMTI4LCAgNCwgNDMsIDU0LDEyOCwgIDQsIDQ0LCA1NSwxMjgsCi0gICAgICA0LCA0NSwgNTYsMTI4LCAgNCwgNDYsIDU3LDEyOCwgIDQsIDQ3LCA1MywgMTAsIDM5LDEyOCwgMzksMTMyLAotICAgICAzOSwxMzYsIDM5LDE0MCwgMzksMTQ0LCAzOSwxNDgsIDM5LDE1MiwgMzksMTU2LCAzOSwxNjAsIDM5LDE2NCwKLSAgICAgNDgsMTI4LCAgNCwxNDQsIDQ5LDEyOCwgIDQsICAyLCA1MCwxMjgsICA0LCAgMywgNTEsMTI4LCAgNCwgIDQsCi0gICAgIDUyLDEyOCwgIDQsICA1LCA1MywxMjgsICA0LCAgNiwgNTQsMTI4LCAgNCwgIDcsIDU1LDEyOCwgIDQsICA4LAotICAgICA1NiwxMjgsICA0LCAgOSwgNTcsMTI4LCAgNCwgMTAsIDU0LCAxMCwgMzksMTkwLCAzOSwxOTQsIDM5LDE5OCwKLSAgICAgMzksMjAyLCAzOSwyMDYsIDM5LDIxMCwgMzksMjE0LCAzOSwyMTgsIDM5LDIyMiwgMzksMjI2LCA0OCwxMjgsCi0gICAgICA0LCAxMSwgNDksMTI4LCAgNCwgMTIsIDUwLDEyOCwgIDQsIDE0LCA1MSwxMjgsMjQ2LDE5NiwgNTIsMTI4LAotICAgIDI0NiwxOTcsIDUzLDEyOCwgIDQsIDQ4LCA1NCwxMjgsICA0LCA0OSwgNTUsMTI4LCAgNCwgNTAsIDU2LDEyOCwKLSAgICAgIDQsIDUxLCA1NywxMjgsICA0LCA1MiwgNTUsIDEwLCAzOSwyNTIsIDQwLCAgMCwgNDAsICA0LCA0MCwgIDgsCi0gICAgIDQwLCAxMiwgNDAsIDE2LCA0MCwgMjAsIDQwLCAyNCwgNDAsIDI4LCA0MCwgMzIsIDQ4LDEyOCwgIDQsIDUzLAotICAgICA0OSwxMjgsICA0LCA4MSwgNTAsMTI4LCAgNCwgNTQsIDUxLDEyOCwgIDQsIDU1LCA1MiwxMjgsICA0LCA1NiwKLSAgICAgNTMsMTI4LCAgNCwgNTcsIDU0LDEyOCwgIDQsIDU4LCA1NSwxMjgsICA0LCA1OSwgNTYsMTI4LCAgNCwgNjAsCi0gICAgIDU3LDEyOCwgIDQsIDYxLCA1NiwgMTAsIDQwLCA1OCwgNDAsIDYyLCA0MCwgNjYsIDQwLCA3MCwgNDAsIDc0LAotICAgICA0MCwgNzgsIDQwLCA4MiwgNDAsIDg2LCA0MCwgOTAsIDQwLCA5NCwgNDgsMTI4LCAgNCwgNjIsIDQ5LDEyOCwKLSAgICAgIDQsIDYzLCA1MCwxMjgsICA0LCA2NCwgNTEsMTI4LCAgNCwgNjUsIDUyLDEyOCwgIDQsIDY2LCA1MywxMjgsCi0gICAgICA0LCA2NywgNTQsMTI4LCAgNCwgNjgsIDU1LDEyOCwgIDQsIDY5LCA1NiwxMjgsICA0LCA3MCwgNTcsMTI4LAotICAgICAgNCwgNzEsIDU3LCAxMCwgNDAsMTIwLCA0MCwxMjQsIDQwLDEyOCwgNDAsMTMyLCA0MCwxMzYsIDQwLDE0MCwKLSAgICAgNDAsMTQ0LCA0MCwxNDgsIDQwLDE1MiwgNDAsMTU2LCA0OCwxMjgsICA0LCA3MiwgNDksMTI4LCAgNCwgNzMsCi0gICAgIDUwLDEyOCwgIDQsIDc0LCA1MSwxMjgsICA0LCA3NSwgNTIsMTI4LCAgNCwgNzYsIDUzLDEyOCwgIDQsIDc3LAotICAgICA1NCwxMjgsICA0LCA3OCwgNTUsMTI4LCAgNCwgNzksIDU2LDEyOCwgIDQsMTQ1LCA1NywxMjgsICA0LCA4MiwKLSAgICAgNDksICA0LCA0MCwxNzAsIDQwLDIzMiwgNDAsMjM3LCA0MSwgIDcsIDQ4LCAxMCwgNDAsMTkyLCA0MCwxOTYsCi0gICAgIDQwLDIwMCwgNDAsMjA0LCA0MCwyMDgsIDQwLDIxMiwgNDAsMjE2LCA0MCwyMjAsIDQwLDIyNCwgNDAsMjI4LAotICAgICA0OCwxMjgsICA0LCA4MywgNDksMTI4LCAgNCwgODQsIDUwLDEyOCwgIDQsIDg1LCA1MSwxMjgsICA0LCA4NiwKLSAgICAgNTIsMTI4LCAgNCwgODcsIDUzLDEyOCwgIDQsIDg4LCA1NCwxMjgsICA0LCA4OSwgNTUsMTI4LCAgNCwgOTAsCi0gICAgIDU2LDEyOCwgIDQsIDkxLCA1NywxMjgsICA0LCA5MiwxNzcsIDQ4LDEyOCwgIDQsIDk0LCA1MiwgIDQsIDQwLAotICAgIDI0NywgNDAsMjUxLCA0MCwyNTUsIDQxLCAgMywgNTMsMTI4LCAgNCwgMTUsIDU0LDEyOCwgIDQsIDk4LCA1NSwKLSAgICAxMjgsICA0LDExNCwgNTYsMTI4LCAgNCwxMTYsIDU3LCAgNSwgNDEsIDE5LCA0MSwgMjMsIDQxLCAyNywgNDEsCi0gICAgIDMxLCA0MSwgMzUsIDUwLDEyOCwyNDYsMTk4LCA1MSwxMjgsICA0LCA5NSwgNTIsMTI4LCAgNCwgOTksIDUzLAotICAgIDEyOCwgIDQsMTE1LCA1NCwxMjgsICA0LDExNywgNTYsICAyLCA0MSwgNDUsIDQxLCA1OSwgNTEsICAyLCA0MSwKLSAgICAgNTEsIDQxLCA1NSwgNDksMTI4LDI0NiwxOTksIDUwLDEyOCwyNDYsMjAwLDE4MCwgNTQsMTI4LCAgNCwyMTcsCi0gICAgMTc4LDE4NSwgNTcsMTI4LCAzMiwgMTQsMTc5LCA0OCwgIDIsIDQxLCA3NywgNDEsIDgxLCA0OCwxMjgsIDMyLAotICAgICAxNSwgNDksMTI4LCAzMiwgMTMsMTgxLCA1NSwgIDcsIDQxLDEwMiwgNDEsMTcyLCA0MiwyMzcsIDQzLCA1OCwKLSAgICAgNDQsIDE1LCA0NCwxMDgsIDQ0LDE3OSwgNTEsICAyLCA0MSwxMDgsIDQxLDEyMiwgNTYsICAyLCA0MSwxMTQsCi0gICAgIDQxLDExOCwgNDksMTI4LCAgNiwxMDYsIDU2LDEyOCwgIDYsIDEyLCA1NywgIDgsIDQxLDE0MCwgNDEsMTQ0LAotICAgICA0MSwxNDgsIDQxLDE1MiwgNDEsMTU2LCA0MSwxNjAsIDQxLDE2NCwgNDEsMTY4LCA1MCwxMjgsICA2LCA5NiwKLSAgICAgNTEsMTI4LCAgNiwgOTcsIDUyLDEyOCwgIDYsIDk4LCA1MywxMjgsICA2LCA5OSwgNTQsMTI4LCAgNiwxMDAsCi0gICAgIDU1LDEyOCwgIDYsMTAxLCA1NiwxMjgsICA2LDEwMiwgNTcsMTI4LCAgNiwxMDMsIDUyLCAgNywgNDEsMTg4LAotICAgICA0MSwyMjAsIDQyLCAyNiwgNDIsIDg4LCA0MiwxMjAsIDQyLDE3NiwgNDIsMjMyLCA0OCwgIDUsIDQxLDIwMCwKLSAgICAgNDEsMjA0LCA0MSwyMDgsIDQxLDIxMiwgNDEsMjE2LCA0OCwxMjgsICA2LDEwNCwgNDksMTI4LCAgNiwxMDUsCi0gICAgIDUxLDEyOCwgIDYsIDI3LCA1NSwxMjgsICA2LCAzMSwgNTcsMTI4LCAgNiwgMzMsIDQ5LCAxMCwgNDEsMjQyLAotICAgICA0MSwyNDYsIDQxLDI1MCwgNDEsMjU0LCA0MiwgIDIsIDQyLCAgNiwgNDIsIDEwLCA0MiwgMTQsIDQyLCAxOCwKLSAgICAgNDIsIDIyLCA0OCwxMjgsICA2LCAzNCwgNDksMTI4LCAgNiwgMzUsIDUwLDEyOCwgIDYsIDM2LCA1MSwxMjgsCi0gICAgICA2LCAzNywgNTIsMTI4LCAgNiwgMzgsIDUzLDEyOCwgIDYsIDM5LCA1NCwxMjgsICA2LCA0MCwgNTUsMTI4LAotICAgICAgNiwgNDEsIDU2LDEyOCwgIDYsIDQyLCA1NywxMjgsICA2LCA0MywgNTAsIDEwLCA0MiwgNDgsIDQyLCA1MiwKLSAgICAgNDIsIDU2LCA0MiwgNjAsIDQyLCA2NCwgNDIsIDY4LCA0MiwgNzIsIDQyLCA3NiwgNDIsIDgwLCA0MiwgODQsCi0gICAgIDQ4LDEyOCwgIDYsIDQ0LCA0OSwxMjgsICA2LCA0NSwgNTAsMTI4LCAgNiwgNDYsIDUxLDEyOCwgIDYsIDQ3LAotICAgICA1MiwxMjgsICA2LCA0OCwgNTMsMTI4LCAgNiwgNDksIDU0LDEyOCwgIDYsIDUwLCA1NSwxMjgsICA2LCA1MSwKLSAgICAgNTYsMTI4LCAgNiwgNTIsIDU3LDEyOCwgIDYsIDUzLCA1MSwgIDUsIDQyLDEwMCwgNDIsMTA0LCA0MiwxMDgsCi0gICAgIDQyLDExMiwgNDIsMTE2LCA0OCwxMjgsICA2LCA1NCwgNDksMTI4LCAgNiwgNTUsIDUwLDEyOCwgIDYsIDU2LAotICAgICA1MSwxMjgsICA2LCA1NywgNTIsMTI4LCAgNiwgNTgsIDUyLCAgOSwgNDIsMTQwLCA0MiwxNDQsIDQyLDE0OCwKLSAgICAgNDIsMTUyLCA0MiwxNTYsIDQyLDE2MCwgNDIsMTY0LCA0MiwxNjgsIDQyLDE3MiwgNDgsMTI4LCAgNiwgNjQsCi0gICAgIDQ5LDEyOCwgIDYsIDY1LCA1MCwxMjgsICA2LCA2NiwgNTEsMTI4LCAgNiwgNjcsIDUyLDEyOCwgIDYsIDY4LAotICAgICA1MywxMjgsICA2LCA2OSwgNTQsMTI4LCAgNiwgNzAsIDU2LDEyOCwgIDYsIDcyLCA1NywxMjgsICA2LCA3MywKLSAgICAgNTMsICA5LCA0MiwxOTYsIDQyLDIwMCwgNDIsMjA0LCA0MiwyMDgsIDQyLDIxMiwgNDIsMjE2LCA0MiwyMjAsCi0gICAgIDQyLDIyNCwgNDIsMjI4LCA0OCwxMjgsICA2LCA3NCwgNDksMTI4LCAgNiwgNzUsIDUwLDEyOCwgIDYsIDc2LAotICAgICA1MSwxMjgsICA2LCA3NywgNTIsMTI4LCAgNiwgNzgsIDUzLDEyOCwgIDYsIDc5LCA1NCwxMjgsICA2LCA4MCwKLSAgICAgNTUsMTI4LCAgNiwgODEsIDU2LDEyOCwgIDYsIDgyLDE4MywgNDgsMTI4LCAgNiwgNzEsIDUzLCAgMywgNDIsCi0gICAgMjQ1LCA0MywgMjEsIDQzLCA1MywgNDgsICA1LCA0MywgIDEsIDQzLCAgNSwgNDMsICA5LCA0MywgMTMsIDQzLAotICAgICAxNywgNTMsMTI4LCAgNiwxNjQsIDU0LDEyOCwgIDYsMTI2LCA1NSwxMjgsICA2LDEzNCwgNTYsMTI4LCAgNiwKLSAgICAxNTIsIDU3LDEyOCwgIDYsMTc1LCA0OSwgIDUsIDQzLCAzMywgNDMsIDM3LCA0MywgNDEsIDQzLCA0NSwgNDMsCi0gICAgIDQ5LCA0OSwxMjgsICA2LDEyMSwgNTAsMTI4LCAgNiwxMzYsIDUxLDEyOCwgIDYsMTQ1LCA1MiwxMjgsICA2LAotICAgIDE4NiwgNTcsMTI4LCAgNiwyMTAsMTc5LCA1MiwxMjgsICA2LDIxMywgNTQsICA3LCA0MywgNzQsIDQzLCA3OSwKLSAgICAgNDMsIDg0LCA0MywgODksIDQzLDEyNywgNDMsMTg5LCA0MywyNTEsMTc5LCA1NCwxMjgsIDMyLDE3MCwxODAsCi0gICAgIDUzLDEyOCwgIDUsMTkwLDE4MSwgNTYsMTI4LCAgNSwxOTUsIDU0LCAgNiwgNDMsMTAzLCA0MywxMDcsIDQzLAotICAgIDExMSwgNDMsMTE1LCA0MywxMTksIDQzLDEyMywgNTIsMTI4LCAgNSwyMDgsIDUzLDEyOCwgIDUsMjA5LCA1NCwKLSAgICAxMjgsICA1LDIxMCwgNTUsMTI4LCAgNSwyMTEsIDU2LDEyOCwgIDUsMjEyLCA1NywxMjgsICA1LDIxMywgNTUsCi0gICAgIDEwLCA0MywxNDksIDQzLDE1MywgNDMsMTU3LCA0MywxNjEsIDQzLDE2NSwgNDMsMTY5LCA0MywxNzMsIDQzLAotICAgIDE3NywgNDMsMTgxLCA0MywxODUsIDQ4LDEyOCwgIDUsMjE0LCA0OSwxMjgsICA1LDIxNSwgNTAsMTI4LCAgNSwKLSAgICAyMTYsIDUxLDEyOCwgIDUsMjE3LCA1MiwxMjgsICA1LDIxOCwgNTMsMTI4LCAgNSwyMTksIDU0LDEyOCwgIDUsCi0gICAgMjIwLCA1NSwxMjgsICA1LDIyMSwgNTYsMTI4LCAgNSwyMjIsIDU3LDEyOCwgIDUsMjIzLCA1NiwgMTAsIDQzLAotICAgIDIxMSwgNDMsMjE1LCA0MywyMTksIDQzLDIyMywgNDMsMjI3LCA0MywyMzEsIDQzLDIzNSwgNDMsMjM5LCA0MywKLSAgICAyNDMsIDQzLDI0NywgNDgsMTI4LCAgNSwyMjQsIDQ5LDEyOCwgIDUsMjI1LCA1MCwxMjgsICA1LDIyNiwgNTEsCi0gICAgMTI4LCAgNSwyMjcsIDUyLDEyOCwgIDUsMjI4LCA1MywxMjgsICA1LDIyOSwgNTQsMTI4LCAgNSwyMzAsIDU1LAotICAgIDEyOCwgIDUsMjMxLCA1NiwxMjgsICA1LDIzMiwgNTcsMTI4LCAgNSwyMzMsIDU3LCAgMywgNDQsICAzLCA0NCwKLSAgICAgIDcsIDQ0LCAxMSwgNDgsMTI4LCAgNSwyMzQsIDUyLDEyOCwyNTEsIDQyLCA1MywxMjgsMjUxLCA0MywgNTUsCi0gICAgICA0LCA0NCwgMjUsIDQ0LCAzOSwgNDQsIDU5LCA0NCwgNjQsIDQ4LCAgMiwgNDQsIDMxLCA0NCwgMzUsIDQ4LAotICAgIDEyOCwyNTEsIDc1LCA1MywxMjgsMjUxLCAzMSwgNDksICAzLCA0NCwgNDcsIDQ0LCA1MSwgNDQsIDU1LCA1NCwKLSAgICAxMjgsICA1LDI0MCwgNTUsMTI4LCAgNSwyNDEsIDU2LDEyOCwgIDUsMjQyLDE3OCwgNTEsMTI4LDI1MSwgNTMsCi0gICAgIDU3LCAgNywgNDQsIDgwLCA0NCwgODQsIDQ0LCA4OCwgNDQsIDkyLCA0NCwgOTYsIDQ0LDEwMCwgNDQsMTA0LAotICAgICA1MSwxMjgsICA1LDE4MCwgNTIsMTI4LCAgNSwxODEsIDUzLDEyOCwgIDUsMTgyLCA1NCwxMjgsICA1LDE4NywKLSAgICAgNTUsMTI4LCAgNSwxODQsIDU2LDEyOCwgIDUsMTgzLCA1NywxMjgsICA1LDE3NiwgNTYsICAzLCA0NCwxMTYsCi0gICAgIDQ0LDE2MCwgNDQsMTY1LCA0OCwgIDcsIDQ0LDEzMiwgNDQsMTM2LCA0NCwxNDAsIDQ0LDE0NCwgNDQsMTQ4LAotICAgICA0NCwxNTIsIDQ0LDE1NiwgNDgsMTI4LCAgNSwxNzgsIDQ5LDEyOCwgIDUsMTc3LCA1MCwxMjgsICA1LDE3OSwKLSAgICAgNTEsMTI4LCAgNSwxOTQsIDUyLDEyOCwgIDUsMTkzLCA1NCwxMjgsICA1LDE4NSwgNTUsMTI4LCAgNSwxODgsCi0gICAgMTc5LCA1NywxMjgsICA1LDE4OSwgNTIsICAyLCA0NCwxNzEsIDQ0LDE3NSwgNDksMTI4LCAgNSwxOTEsIDUwLAotICAgIDEyOCwgIDUsMTkyLDE4NSwxNzgsIDU3LDEyOCwgIDIsMTg4LCA1NCwgIDMsIDQ0LDE5MywgNDQsMjUyLCA0NSwKLSAgICAgIDMsIDQ5LCAgNCwgNDQsMjAzLCA0NCwyMTksIDQ0LDIyNSwgNDQsMjQ2LCA1MCwgIDIsIDQ0LDIwOSwgNDQsCi0gICAgMjE0LDE4MCwgNTYsMTI4LCAzMywgIDUsMTg0LCA1NywxMjgsIDMzLCAxOSwxNzksMTgxLCA1MCwxMjgsIDMzLAotICAgICAyMiwxODEsIDU1LCAgMywgNDQsMjM0LCA0NCwyMzgsIDQ0LDI0MiwgNTEsMTI4LCAzMiwgNDQsIDUyLDEyOCwKLSAgICAgMzIsIDQ1LCA1MywxMjgsIDMyLCA0NiwxODIsMTgyLCA1MiwxMjgsIDMyLCAxMiwxNzksMTc3LDE4MiwgNTUsCi0gICAgMTI4LCAgNiwxMDksMTgwLDE4NSwxNzksIDU1LDEyOCwgIDIsMTg5LDEwMywgIDIsIDQ1LCAxNiwgNDUsIDIzLAotICAgIDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAwLDIyNCwxMTcsICAyLCA0NSwgMjksIDQ1LCAzOCwyMzQsMjI1LDI0MiwKLSAgICAyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzMywyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAgNSwxMDQsCi0gICAgICAyLCA0NSwgNTMsIDQ1LCA2MywyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNjYsMjM5LAotICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDE2MywxMDUsICA3LCA0NSwgOTAsIDQ1LDExNSwKLSAgICAgNDUsMTIyLCA0NSwxMzQsIDQ1LDE1OSwgNDUsMTc1LCA0NSwyNTUsIDk4LCAgMiwgNDUsIDk2LCA0NSwxMDUsCi0gICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNDQsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLAotICAgIDEyOCwgNDksIDMwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxNiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDIxMywyMzEsMTE3LCAgMiwgNDUsMTQxLCA0NSwxNTAsMjM0LDIyNSwyNDIsCi0gICAgMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDQsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMTYsMjM3LAotICAgIDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDcyLDExMCwKLSAgICAgIDUsIDQ1LDE4NywgNDUsMTk2LCA0NSwyMTAsIDQ1LDIyNiwgNDUsMjQxLDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwgIDYsIDU3LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgIDI1NCwyMDIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTQsMjAzLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCi0gICAgMjA0LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgIDMsMjQ2LAotICAgIDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLCA0NiwgMTUsIDQ2LCAyNSwgNDYsIDMyLDIyNiwKLSAgICAyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIwMCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzIsCi0gICAgMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIwMCwxMDcsICAyLCA0NiwgNDksIDQ2LAotICAgICA3MywyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNjIsIDQ2LCA2MSwyMzIsMjI1LDIzNiwKLSAgICAyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExMywyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCi0gICAgIDc5LDEwOCwgIDMsIDQ2LCA4OSwgNDcsMTQ1LCA0NywxNTQsMTAxLCAgMiwgNDYsIDk1LCA0NywxNDAsMTAyLAotICAgIDEzNiwgIDUsMjA4LCA0NiwxMTUsIDQ2LDEyNCwgNDYsMTM5LCA0NiwxNTMsIDQ2LDI0MiwgNDcsICAwLCA0NywKLSAgICAxMTEsIDQ3LDEyNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAzOSwyMjgsMjI1LDIzMSwyMjksCi0gICAgMjQzLDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA0OCwyMzAsMjMzLDIzOCwyMjUsMjM2LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQyLDEwNCwgIDIsIDQ2LDE1OSwgNDYsMjM0LDIyNSwKLSAgICAyMzcsMjUwLCA5NywgIDIsIDQ2LDE2OCwgNDYsMjAxLDIyNSwyMjYsMjM5LDI0NiwxMDEsICAyLCA0NiwxNzgsCi0gICAgIDQ2LDE4NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAzNSwyMzAsMjMzLDIzOCwyMjUsMjM2LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTMyLDIyNiwyMjksMjM2LDIzOSwxMTksICAyLCA0NiwKLSAgICAyMTEsIDQ2LDIyMCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAzNywyMzAsMjMzLDIzOCwyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTM2LDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwyMDgsMjM2LDIyNSwyMzcsMjI5LDIyOCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3OSwKLSAgICAyMzcsIDk3LCAgMiwgNDcsICA3LCA0NywgNDMsMjI4LDIyOCwyMjUsMjI1LDIyNiwyMzksMjQ2LDEwMSwgIDIsCi0gICAgIDQ3LCAyMCwgNDcsIDI5LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDM0LDIzMCwyMzMsMjM4LAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxMzAsMjM1LDI0MywyNDUsMjQyLCA5NywKLSAgICAgIDQsIDQ3LCA1NywgNDcsIDY2LCA0NywgODAsIDQ3LCA5NiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCA3MywyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQwLAotICAgIDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0MywKLSAgICAyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0NCwyNDAsCi0gICAgMjI1LDI0NCwyMjUsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDQ2LDI0MSwyMjUsMjM3LAotICAgIDIyNSwyNDQsMjQzLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDQ3LDI0MCwxMDQsMTI4LCAzMywKLSAgICAgNTMsMjM2LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwgNzYsMjQwLDIzMiwgOTcsMTI5LCAgMywxNzcsCi0gICAgIDQ3LDE2MiwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTcyLDEwOSwgIDQsIDQ3LDE4MCwgNDcsMTg4LAotICAgICA0NywxOTksIDQ3LDIzMywyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsICAxLDIzOSwyMzgsMjM5LDI0MywKLSAgICAyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjUsMjQwLDIyOSwyNDIsMjQzLDIyNSwyMzgsMTAwLDEzMCwgIDAsCi0gICAgIDM4LCA0NywyMTMsIDQ3LDIyNSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LAotICAgICAgNiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDM4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMTk0LDExMCwgIDQsIDQ3LDI1MiwgNDgsICA3LCA0OCwxMjksIDQ4LDEzOSwyMjYsMjM5LDI0MCwyMzksCi0gICAgMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDM0LDEwMywgIDQsIDQ4LCAxNywgNDgsIDI4LCA0OCwgNDIsIDQ4LAotICAgIDEyMSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDM2LDIzNSwyMzIsMjI1LDIzOCwKLSAgICAyMzUsMjMyLDI0NSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgOTAsMjM2LDEwMSwxMzEsIDM0LCAzMiwgNDgsCi0gICAgIDUzLCA0OCwxMDYsIDQ4LDExMywyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwxMTYsICAyLCA0OCwgNjUsIDQ4LAotICAgICA4NSwyMzYsMjI5LDIzMCwxMTYsMTI5LCA0OCwgIDgsIDQ4LCA3NCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywKLSAgICAyMjUsMTA4LDEyOCwyNTQsIDYzLDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI5LCA0OCwgIDksIDQ4LCA5NSwyNDYsCi0gICAgMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDY0LDIzNiwyMjksMjMwLDExNiwxMjgsIDM1LAotICAgICA0MSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzUsIDQyLDI0MywyNDQsMjQyLDIzOSwxMDksMTI4LCAzMywKLSAgICAgNDMsMjM5LDI0NCwyMjksMjM2LDIyOSwyMzMsIDk3LDEyOCwgIDMsMTM1LDExNywgIDIsIDQ4LDE0NSwgNDgsCi0gICAgMTU3LDIyOCwyMjUsMjQ0LDI0NCwyMjUsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDgyLDI0MywyNDYsMjI1LAotICAgIDI0MiwgOTcsICAzLCA0OCwxNjksIDQ4LDE3OSwgNDgsMTg2LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKLSAgICAxMjgsICA5LDEzMCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDIsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsCi0gICAgMjQ0LDEwNSwxMjgsIDEwLDEzMCwyMzksMjMxLDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCAgNSwxMTIsICAzLAotICAgICA0OCwyMTQsIDQ4LDIzOCwgNDksIDEyLCA5NywgIDIsIDQ4LDIyMCwgNDgsMjMyLDIyNSwyNDQsMjM5LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsICAwLDI0MiwyMjksMTEwLDEyOCwgMzYsMTU2LDIzOSwyNDMsCi0gICAgMjQ0LDI0MiwyMzksMjQwLDIzMiwxMDEsICAyLCA0OCwyNTEsIDQ5LCAgNiwyMjUsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDkwLDIzNywyMzksMTAwLDEyOCwgIDIsMTg4LDExMiwgIDIsIDQ5LCAxOCwKLSAgICAgNDksIDIzLDIzNiwxMDEsMTI4LDI0OCwyNTUsMjQyLDExMSwgIDIsIDQ5LCAzMCwgNDksIDM4LDIyNSwyMjcsCi0gICAgMjMyLDIyOSwxMTUsMTI4LCAzNCwgODAsMTIwLCAgMiwgNDksIDQ0LCA0OSwgNjQsMjI5LDI0MSwyNDUsMjI1LAotICAgIDEwOCwxMjksIDM0LCA3MiwgNDksIDU0LDIzOSwyNDIsMjMzLDIzNywyMjUsMjMxLDEwMSwxMjgsIDM0LCA4MiwKLSAgICAyMzMsMjM3LDIyNSwyNDQsMjI5LDIzNiwyNDksMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LCA2OSwxMTQsCi0gICAgICA0LCA0OSwgODksIDQ5LDExNiwgNDksMTIwLCA0OSwxNjUsMjI1LDIyOSwgOTcsICAyLCA0OSwgOTcsIDQ5LAotICAgIDEwNywyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxNDIsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA0OSwxNDEsIDk5LDEyOCwgMzUsIDE4LDEwNSwgIDIsIDQ5LDEyNiwgNDksMTQwLDIzMSwyMzIsCi0gICAgMjQ0LDIzMiwyMjUsMjM2LDIzMCwyNDIsMjMzLDIzOCwxMDMsMTI4LCAzMCwxNTQsMjM4LDEwMywxMzAsICAwLAotICAgIDIyOSwgNDksMTQ5LCA0OSwxNTcsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1MSwyMjYsMjI5LDIzNiwKLSAgICAyMzksMTE5LDEyOCwgMzAsICAxLDI0MiwyMzksMTE5LCAgOCwgNDksMTg1LCA0OSwxOTIsIDUwLCA2NSwgNTAsCi0gICAgMTMxLCA1MCwxODEsIDUwLDIzNiwgNTEsICAzLCA1MSwgNzgsMjI2LDIzOSwyNDQsMTA0LDEyOCwgMzMsMTQ4LAotICAgIDEwMCwgIDMsIDQ5LDIwMCwgNDksMjM5LCA1MCwgMzAsMjI1LDI0MywxMDQsICA0LCA0OSwyMTIsIDQ5LDIxOSwKLSAgICAgNDksMjI2LCA0OSwyMzQsMjI4LDIzOSwyNDcsMTEwLDEyOCwgMzMsMjI3LDIzNiwyMjksMjMwLDExNiwxMjgsCi0gICAgIDMzLDIyNCwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzMsMjI2LDI0NSwxMTIsMTI4LCAzMywyMjUsMjI2LAotICAgIDEwOCwgIDUsIDQ5LDI1MiwgNTAsICAzLCA1MCwgMTAsIDUwLCAxNywgNTAsIDI1LDIyNiwyMzksMjQ0LDEwNCwKLSAgICAxMjgsIDMzLDIxMiwyMjgsMjM5LDI0NywxMTAsMTI4LCAzMywyMTEsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsCi0gICAgMjA4LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMywyMTAsMjQ1LDExMiwxMjgsIDMzLDIwOSwyMzksMjQ3LAotICAgIDExMCwxMzEsIDMzLDE0NywgNTAsIDQyLCA1MCwgNDksIDUwLCA1NywyMzYsMjI5LDIzMCwxMTYsMTI4LCAzMywKLSAgICAxNTMsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDMzLDE1MiwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzMsCi0gICAgMjMzLDEwNCwgIDIsIDUwLCA3MSwgNTAsMTIyLDIyOSwyMjUsMTAwLCAgNCwgNTAsIDgzLCA1MCwgOTMsIDUwLAotICAgIDEwMywgNTAsMTE0LDIyOCwyMzksMjQ3LDIzOCwyMzcsMjM5LDEwMCwxMjgsICAyLDE5NywyMzYsMjI5LDIzMCwKLSAgICAyNDQsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTQsMjQyLDIzMywyMzEsMjMyLDI0NCwyMzcsMjM5LDEwMCwxMjgsCi0gICAgICAyLDE5NSwyNDUsMjQwLDIzNywyMzksMTAwLDEyOCwgIDIsMTk2LDIzOSwyNDIsMjMzLDI1MCwyMjksMTIwLAotICAgIDEyOCwyNDgsMjMxLDIzNiwyMjksMjMwLDExNiwxMzEsIDMzLDE0NCwgNTAsMTQ0LCA1MCwxNjEsIDUwLDE3MywKLSAgICAyMjgsMjI2LDEwOCwxMjksIDMzLDIwOCwgNTAsMTUyLDI0MywyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgMzMsCi0gICAgMjA1LDIzOSwyNDYsMjI5LDI0MiwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzMsMTk4LDI0NywyMzIsMjMzLAotICAgIDI0NCwxMDEsMTI4LCAzMywyMzAsMjQyLDIzMywyMzEsMjMyLDExNiwxMzIsIDMzLDE0NiwgNTAsMTk3LCA1MCwKLSAgICAyMDksIDUwLDIxNywgNTAsMjI4LDIyOCwyMjYsMjM2LDI0MywyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgMzMsCi0gICAgMjA3LDIzMiwyMjksMjI1LDI0NiwxMjEsMTI4LCAzOSwxNTgsMjM5LDI0NiwyMjksMjQyLDIzNiwyMjksMjMwLAotICAgIDExNiwxMjgsIDMzLDE5NiwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzMsMjMyLDI0NCwyMjUsIDk4LCAgMiwKLSAgICAgNTAsMjQ0LCA1MCwyNTEsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsMjI4LDI0MiwyMzMsMjMxLDIzMiwxMTYsCi0gICAgMTI4LCAzMywyMjksMjQ1LDExMiwxMzIsIDMzLDE0NSwgNTEsIDE2LCA1MSwgNDQsIDUxLCA2MiwgNTEsIDcwLAotICAgIDEwMCwgIDIsIDUxLCAyMiwgNTEsIDM0LDExMCwxMjksIDMzLDE0OSwgNTEsIDI4LDIyNiwyNDMsMTAxLDEyOCwKLSAgICAgMzMsMTY4LDIzOSwyNDcsMjM4LDIyNiwyMjUsMjQzLDEwMSwxMjgsIDMzLDE2OCwyMzYsMjI5LDIzMCwxMTYsCi0gICAgMTI5LCAzMywxNTAsIDUxLCA1MywyMzksMjMwLDIyOCwyMzksMjQ3LDExMCwxMjgsIDMzLDE5NywyNDIsMjMzLAotICAgIDIzMSwyMzIsMTE2LDEyOCwgMzMsMTUxLDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzMywyMzEsMjQ2LDIyOSwKLSAgICAyNDIsMjQ0LDIyOSwxMjAsMTI4LDI0OCwyMzAsMTE1LCAgNSwgNTEsIDk5LCA1MSwxNzUsIDUxLDIyMCwgNTIsCi0gICAgIDQ3LCA1MiwgNTcsIDk5LCAgMiwgNTEsMTA1LCA1MSwxNTcsMjMzLDEwNSwgIDIsIDUxLDExMiwgNTEsMTM1LAotICAgIDIyNywyMzMsMjQyLDIyNywyNDUsMTA5LDEyOSwgIDAsIDk0LCA1MSwxMjMsMjM3LDIzOSwyMzgsMjM5LDI0MywKLSAgICAyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjIsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjksICAwLDEyNiwgNTEsCi0gICAgMTQ1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDk0LDI0MiwyMzMsMjQwLAotICAgIDExNiwxMjksICAyLCA4MSwgNTEsMTY2LDI0NCwyNDUsMjQyLDIzOCwyMjksMTAwLDEyOCwgIDIsIDgyLDIzNywKLSAgICAyMjUsMjM2LDEwOCwgIDIsIDUxLDE4NCwgNTEsMTk1LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsCi0gICAgMTI4LCA0OCwgNjUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE2MSwgNTEsMjA4LAotICAgIDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTAzLDI0NCwyMjksMjQyLDIzMywKLSAgICAxMTUsICAyLCA1MSwyMzAsIDUyLCA0MywxMDcsMTMxLCAgMCwgNDIsIDUxLDI0MCwgNTIsIDEyLCA1MiwgMzUsCi0gICAgIDk3LCAgMiwgNTEsMjQ2LCA1MiwgIDQsMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsICA2LDEwOSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTA5LDEwOSwgIDIsIDUyLCAxOCwKLSAgICAgNTIsIDI0LDIyNSwyNDQsMTA0LDEyOCwgMzQsIDIzLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCi0gICAgMTI4LDI1NSwgMTAsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LCA5NywxMDksMTI4LCAzMiwgNjYsMjQ1LAotICAgIDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjMzLDI0OSwyMzcsMjQwLDI0NCwyMzksMjQ0LDIzMywKLSAgICAyMjcsMjI1LDIzNiwyMzYsMjQ5LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwgNjcsMTE2LDEzMiwgIDAsCi0gICAgIDY0LCA1MiwgODksIDUyLCA5NiwgNTIsMTA4LCA1MiwxMTYsMjMzLDIzNiwyMjgsMTAxLDEyOCwgIDAsMjI3LAotICAgIDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDMyLDI0MywyMzcsMjI1LDIzNiwKLSAgICAxMDgsMTI4LDI1NCwxMDcsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLCA4MCwxMTcsICA2LCA1MiwxMzgsCi0gICAgIDUyLDE2MywgNTIsMTcwLCA1MiwxOTUsIDUyLDIxNSwgNTIsMjMxLCA5OCwgIDIsIDUyLDE0NCwgNTIsMTUzLAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTQ4LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwKLSAgICAxMjgsIDQ5LCAzMiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMjAsMjMxLDExNywgIDIsIDUyLDE3NywgNTIsCi0gICAgMTg2LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQ4LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LAotICAgIDEyOCwgMTAsIDIwLDIzNiwyMjksMjM4LDIzMSwyNDQsMjMyLDIzNywyMjUsMjQyLDIzNSwyMjYsMjI5LDIzOCwKLSAgICAyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMTUsMjM3LDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsCi0gICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDc2LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLAotICAgICAgMywgNTIsMjQ3LCA1MywgIDEsIDUzLCAgOCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKLSAgICAyMDQsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDc2LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCi0gICAgMTI4LCAxMCwyMDQsMjQ2LDIyNSwyMzEsMjQyLDIyNSwyMzIsMjI1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAotICAgICA2MSwxMjEsICAyLCA1MywgMzksIDUzLCA1MSwyMjYsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKLSAgICAxMjgsICA1LCA5NywyMzMsMTEwLDEzMCwgIDUsMjI2LCA1MywgNjAsIDUzLCA3NSwyMjUsMjM2LDI0NCwyMzksCi0gICAgMjM4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCAzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsICA1LDIyNiwgOTgsMTQ0LCAgMCwgOTgsIDUzLDEyMCwgNTMsMjU1LCA1NCwgMTAsIDU0LCAxOSwKLSAgICAgNTQsIDQ0LCA1NSwgODUsIDU1LDE0NywgNTUsMjIwLCA1NywxNDYsIDU3LDE1OCwgNTcsMjAxLCA1NywyMDksCi0gICAgIDU3LDIxOSwgNTksIDg5LCA1OSwxMTMsIDU5LDEyMiwgOTcsICA3LCA1MywxMzYsIDUzLDE0NiwgNTMsMTcwLAotICAgICA1MywxNzcsIDUzLDIwMiwgNTMsMjI2LCA1MywyMzcsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwKLSAgICAgIDksMTcyLDIyNywyMzUsMjQzLDIzNiwyMjUsMjQzLDEwNCwxMjksICAwLCA5MiwgNTMsMTU4LDIzNywyMzksCi0gICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDYwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAotICAgICA0NCwyMzEsMTE3LCAgMiwgNTMsMTg0LCA1MywxOTMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwKLSAgICAxNzIsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNDQsMTA0LCAgMiwgNTMsMjA4LCA1MywyMTgsCi0gICAgMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTEyLDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgNjMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIwOCwxMTQsMTI5LCAgMCwKLSAgICAxMjQsIDUzLDI0MywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA5MiwyMjYsCi0gICAgMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksICA1LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLAotICAgIDEyOCwgMzYsMjA5LDIyOCwyMzksMTE2LCAgMiwgNTQsIDI3LCA1NCwgMzYsMjI1LDIyNywyMjcsMjI5LDIzOCwKLSAgICAxMTYsMTI4LCAzMCwgIDMsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAgNSwxMDEsICA2LCA1NCwgNTgsCi0gICAgIDU0LCA3OSwgNTQsMTAyLCA1NCwyNDQsIDU0LDI1NSwgNTUsIDExLDIyNSwyMzcsMjI5LDIyOCwyNDMsMjMzLAotICAgIDI0OCwyNDQsMjI5LDIyOSwyMzgsMjQ0LDIzMiwyMzgsMjM5LDI0NCwyMjksMTE1LDEyOCwgMzgsMTA4LCA5OSwKLSAgICAgIDIsIDU0LCA4NSwgNTQsIDkyLDIyNSwyNDUsMjQzLDEwMSwxMjgsIDM0LCA1MywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwgNDksMTA0LCAgNSwgNTQsMTE0LCA1NCwxMjMsIDU0LDEzNywgNTQsMTY3LAotICAgICA1NCwyMjYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDAsMjMwLDIzMywyMzgsMjI1LDIzNiwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE0NCwxMDUsICAyLCA1NCwxNDMsIDU0LDE1OCwyMzgsCi0gICAgMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE0NSwyNDIsMjI1LAotICAgIDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyMSwyMzcsMTAxLCAgMiwgNTQsMTc0LCA1NCwxODcsMjI4LDIzMywKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQ2LDIyOSwyMzcsMTA1LCAgMiwgNTQsCi0gICAgMTk1LCA1NCwyMTAsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgIDI1MiwxNTksMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTIsICA4LDIzOCwyMzksMjM5LDIzOCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTIsMTA5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMTcsMjM4LAotICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTgsMTE2LDEzMiwgIDUsMjA5LCA1NSwKLSAgICAgMjMsIDU1LCA0MywgNTUsIDYzLCA1NSwgNzIsIDk3LDEyOSwgIDMsMTc4LCA1NSwgMjksMjQzLDI0OSwyMzcsCi0gICAgMjI2LDIzOSwyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIwOCwyMjgsMjI1LDIzMSwyMjksMjQzLAotICAgIDEwNCwxMjksMjUxLCA0OSwgNTUsIDU0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDQ5LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjA5LDI0MiwyMjUsMjMwLDIyOSwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsMjUxLCA3NiwxMDQsICAyLCA1NSwgOTEsIDU1LDE0MSwgOTcsICAzLCA1NSwgOTksIDU1LAotICAgIDEwOSwgNTUsMTE2LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE3MywyMjgsMjI5LDI0NiwKLSAgICAgOTcsMTI4LCAgOSwgNDUsMjMxLDExNywgIDIsIDU1LDEyMywgNTUsMTMyLDIzNCwyMjUsMjQyLDIyNSwyNDQsCi0gICAgMTA1LDEyOCwgMTAsMTczLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDQ1LDIzOSwyMzksMTA3LAotICAgIDEyOCwgIDIsIDgzLDEwNSwgIDUsIDU1LDE1OSwgNTUsMTcwLCA1NSwxODEsIDU1LDE5NSwgNTUsMjA5LDIzMiwKLSAgICAyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsCi0gICAgMjM4LCA5NywxMjgsIDQ4LDIxMSwyMzYsMjI1LDIyNiwyMzMsMjI1LDIzNiwyMjcsMjM2LDIzMywyMjcsMTA3LAotICAgIDEyOCwgIDIsMTUyLDIzOCwyMjgsMjMzLDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKLSAgICAgIDIsMjQyLDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA0OSwxMDgsICAzLCA1NSwyMjgsCi0gICAgIDU3LDEyOSwgNTcsMTQwLCA5NywgIDIsIDU1LDIzNCwgNTcsMTI0LDIyNywxMDcsICA2LCA1NSwyNDksIDU2LAotICAgICAgMiwgNTYsIDM5LCA1NiwxODgsIDU2LDI0MywgNTcsIDM5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwKLSAgICAgMzcsMjA3LDEwMCwgIDIsIDU2LCAgOCwgNTYsIDE3LDIzMywyMjUsMjM3LDIzOSwyMzgsMTAwLDEyOCwgMzcsCi0gICAgMTk4LDIzOSwyNDcsMjM4LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwyMzEsMjQ0LDI0MiwyMzMsMjI1LAotICAgIDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4OCwxMDgsICAyLCA1NiwgNDUsIDU2LDE0OCwxMDEsICAyLCA1NiwKLSAgICAgNTEsIDU2LCA4NywyMzAsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwxMDMsICAyLCA1NiwgNjYsCi0gICAgIDU2LCA3NiwyNDAsMjM5LDIzMywyMzgsMjQ0LDIyOSwxMTQsMTI4LCAzNywxOTYsMjQ0LDI0MiwyMzMsMjI1LAotICAgIDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE5MiwyMzgsMjQ0LDIzMywyMjcsMjQ1LDIzNiwyMjUsMjQyLDIyNiwKLSAgICAyNDIsMjI1LDIyNywyMzUsMjI5LDExNiwgIDIsIDU2LDEwNywgNTYsMTI3LDIzNiwyMjksMjMwLDExNiwxMjksCi0gICAgIDQ4LCAxNiwgNTYsMTE2LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTksMjQyLAotICAgIDIzMywyMzEsMjMyLDExNiwxMjksIDQ4LCAxNywgNTYsMTM3LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwKLSAgICAxMDgsMTI4LDI1NCwgNjAsMjM5LDI0NywyMjksMTE0LCAgMiwgNTYsMTU3LCA1NiwxNzIsMjM2LDIyOSwyMzAsCi0gICAgMjQ0LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywyMjcsMjQyLDIzMywyMzEsMjMyLAotICAgIDI0NCwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMjI2LDExNCwgIDIsIDU2LDE5NCwKLSAgICAgNTYsMjA1LDIyOSwyMjcsMjQ0LDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxNzIsMjMzLDIzMSwyMzIsCi0gICAgMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwxMDMsICAyLCA1NiwyMjIsIDU2LDIzMiwyNDAsMjM5LAotICAgIDIzMywyMzgsMjQ0LDIyOSwxMTQsMTI4LCAzNywxODYsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwKLSAgICAxMjgsIDM3LDE4MiwxMTUsICAzLCA1NiwyNTEsIDU3LCAyNSwgNTcsIDMzLDEwOSwgIDIsIDU3LCAgMSwgNTcsCi0gICAgIDEzLDIyNSwyMzYsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgMzcsMTcwLDIzMywyMzYsMjMzLAotICAgIDIzOCwyMzEsMjMwLDIyNSwyMjcsMTAxLDEyOCwgMzgsIDU5LDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCAzNywKLSAgICAxNjAsMjQ0LDIyNSwxMTQsMTI4LCAzOCwgIDUsMjQ1LDI0MCwxMTIsICAyLCA1NywgNDcsIDU3LCA4NSwyMjksCi0gICAgMTE0LCAgMiwgNTcsIDU0LCA1NywgNjksMjM2LDIyOSwyMzAsMjQ0LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLAotICAgIDIzNiwxMDEsMTI4LCAzNywyMjgsMjQyLDIzMywyMzEsMjMyLDI0NCwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwKLSAgICAyMzYsMTAxLDEyOCwgMzcsMjI5LDIzOSwyMzMsMjM4LDI0NCwyMzMsMjM4LDEwMywgIDIsIDU3LCA5NywgNTcsCi0gICAgMTEzLDI0MywyMzcsMjI1LDIzNiwyMzYsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LAotICAgIDE4MCwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMTc4LDIzOCwxMDcsMTI4LCAzNiwKLSAgICAgMzUsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAgNywyMzksMjI3LDEwNywxMjgsCi0gICAgIDM3LDEzNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA2NiwxMTEsICAzLAotICAgICA1NywxNjYsIDU3LDE3OSwgNTcsMTkwLDIyNiwyMjUsMjMzLDIzNywyMjUsMjMzLDI0NCwyMzIsMjI1LDEwNSwKLSAgICAxMjgsIDE0LCAyNiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTI0LDIzNSwyMjUsCi0gICAgMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMjAsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LAotICAgIDE1NywyNDEsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxOTUsMTE0LCAgNCwgNTcsMjI5LCA1OCwKLSAgICAyMjMsIDU5LCA0MCwgNTksIDc5LDIyNSwgOTksICAyLCA1NywyMzYsIDU4LDEzMCwxMDEsICAzLCA1NywyNDQsCi0gICAgIDU3LDI0OSwgNTgsIDYxLDIyOSwxMjAsMTI4LDI0OCwyNDQsMjM2LDIyOSwyMzAsMTE2LDEzMywgIDAsMTIzLAotICAgICA1OCwgMTAsIDU4LCAxNSwgNTgsIDM3LCA1OCwgNDUsIDU4LCA1MCwyMjYsMTE2LDEyOCwyNDgsMjQzLDEwOSwKLSAgICAgIDIsIDU4LCAyMSwgNTgsIDI2LDIzMywxMDAsMTI4LDI0OCwyNDIsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCA5MSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDkxLDI0NCwxMTIsMTI4LAotICAgIDI0OCwyNDEsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA1NSwyNDIsMjMzLDIzMSwKLSAgICAyMzIsMTE2LDEzMywgIDAsMTI1LCA1OCwgNzksIDU4LCA4NCwgNTgsMTA2LCA1OCwxMTQsIDU4LDExOSwyMjYsCi0gICAgMTE2LDEyOCwyNDgsMjU0LDEwOSwgIDIsIDU4LCA5MCwgNTgsIDk1LDIzMywxMDAsMTI4LDI0OCwyNTMsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA5MywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKLSAgICAyNTQsIDkyLDI0NCwxMTIsMTI4LDI0OCwyNTIsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsCi0gICAgMjU0LCA1NiwyMzUsMjI5LDExNiwgIDIsIDU4LDEzOCwgNTgsMTgwLDIzNiwyMjksMjMwLDExNiwxMzIsICAwLAotICAgICA5MSwgNTgsMTUzLCA1OCwxNTgsIDU4LDE2MywgNTgsMTc1LDIyNiwxMTYsMTI4LDI0OCwyNDAsMjI5LDEyMCwKLSAgICAxMjgsMjQ4LDIzOSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA1OSwyNDQsCi0gICAgMTEyLDEyOCwyNDgsMjM4LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTMyLCAgMCwgOTMsIDU4LDE5NiwgNTgsMjAxLAotICAgICA1OCwyMDYsIDU4LDIxOCwyMjYsMTE2LDEyOCwyNDgsMjUxLDIyOSwxMjAsMTI4LDI0OCwyNTAsMjM3LDIzOSwKLSAgICAyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjEsMjQ0LDExMiwxMjgsMjQ4LDI0OSwyMjksCi0gICAgMjQ2LDEwMSwxMzEsICAyLDIxNiwgNTgsMjM1LCA1OCwyNDYsIDU4LDI1MiwyMjYsMjI5LDIzNiwyMzksMjQ3LAotICAgIDIyNywyMzcsIDk4LDEyOCwgIDMsIDQ2LDIyNywyMzcsIDk4LDEyOCwgIDMsICA2LDIzMywyMzgsMjQ2LDIyOSwKLSAgICAyNDIsMjQ0LDIyOSwxMDAsICAzLCA1OSwgMTEsIDU5LCAyMiwgNTksIDI4LDIyNiwyMjksMjM2LDIzOSwyNDcsCi0gICAgMjI3LDIzNywgOTgsMTI4LCAgMywgNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMTcsMjI4LDIzOSwyNDUsMjI2LAotICAgIDIzNiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgOTcsMjMzLDIyOCwyMzEsMTAxLCAgMiwgNTksIDQ5LCA1OSwKLSAgICAgNjAsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCA0MiwyMzMsMjM4LDI0NiwyMjksCi0gICAgMjQyLDI0NCwyMjksMjI4LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNTgsMjM5LAotICAgIDIzNSwyMjksMjM4LDIyNiwyMjUsMTE0LDEyOCwgIDAsMTY2LDExNSwgIDIsIDU5LCA5NSwgNTksMTAzLDI0NCwKLSAgICAyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxMjgsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsCi0gICAgMjM0LDI0NCwyMzksMjQwLDIyNiwyMjUsMTE0LDEyOCwgIDEsMTMxLDExNywgIDMsIDU5LDEzMCwgNTksMTQxLAotICAgICA1OSwxNTIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExOCwyMzUsMjI1LDI0NCwKLSAgICAyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjE0LDIzNiwxMDgsICAyLCA1OSwxNTksIDU5LDE4OSwyMjksCi0gICAgMTE2LDEzMCwgMzIsIDM0LCA1OSwxNjgsIDU5LDE3OCwyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywxMDEsMTI4LAotICAgICAzNywyMTYsMjM5LDI0MCwyMjksMjQyLDIyNSwyNDQsMjM5LDExNCwxMjgsIDM0LCAyNSwyNDMsMjI5LDI0OSwKLSAgICAxMDEsMTI4LCAzNywyMDYsIDk5LDE0MywgIDAsIDk5LCA1OSwyMzAsIDYwLDE3OSwgNjAsMTkwLCA2MCwyNTQsCi0gICAgIDYxLCAyOSwgNjEsMTIyLCA2MywgMzMsIDY0LCAxNywgNjQsMTE3LCA2NCwxNjYsIDY3LDE1OCwgNjcsMTY2LAotICAgICA2NywxNzYsIDY3LDE4OCwgNjcsMjIxLCA5NywgIDksIDU5LDI1MCwgNjAsICA1LCA2MCwgMTUsIDYwLCAyMiwKLSAgICAgNjAsIDI5LCA2MCwgNTQsIDYwLCA2NCwgNjAsMTE2LCA2MCwxMjUsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsCi0gICAgMjI1LDExMCwxMjgsICA1LDExMCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTQsMjI3LAotICAgIDI0NSwyNDQsMTAxLDEyOCwgIDEsICA3LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyNiwyMzEsMTE3LCAgMiwKLSAgICAgNjAsIDM2LCA2MCwgNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTQsMjQyLDIzNywyNDUsCi0gICAgMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjYsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM2LAotICAgIDIzOCwyMjgsMjQyLDIyNSwyMjYsMjMzLDIzOCwyMjgsMTE3LCAgNCwgNjAsIDgyLCA2MCwgOTIsIDYwLCA5OCwKLSAgICAgNjAsMTA1LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDEyOSwyMjcsMjM3LCA5OCwxMjgsCi0gICAgICAzLCAxNiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDEsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LAotICAgIDEwNSwxMjgsIDEwLDEyOSwyNDAsMjQzLDIzNiwyMzksMjI3LDEwNywxMjgsIDMzLDIzNCwxMTQsICAzLCA2MCwKLSAgICAxMzMsIDYwLDEzOSwgNjAsMTY1LDIyOSwyMzksMTAyLDEyOCwgMzMsICA1LDIzOSwxMTAsMTMwLCAgMiwxOTksCi0gICAgIDYwLDE0OCwgNjAsMTU5LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDQsMjI3LAotICAgIDIzNywgOTgsMTI4LCAgMywgMTIsMjQyLDIzMywyMjUsMjMxLDIyOSwyNDIsMjI5LDI0NCwyNDUsMjQyLDExMCwKLSAgICAxMjgsIDMzLDE4MSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDI0LCA5OSwgIDQsCi0gICAgIDYwLDIwMCwgNjAsMjA3LCA2MCwyMjYsIDYwLDI0OCwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgMTMsMjI5LAotICAgIDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI5LCAgMCwyMzEsIDYwLDIxOCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwKLSAgICAgMzAsICA5LDIzMywyNDIsIDk5LCAgMiwgNjAsMjM0LCA2MCwyMzksMjM2LDEwMSwxMjgsIDM2LDIxMCwyNDUsCi0gICAgMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCAgOSwyNDUsMjQyLDEwOCwxMjgsICAyLCA4NSwxMDAsICAyLAotICAgICA2MSwgIDQsIDYxLCAyMCwyMzksMTE2LDEyOSwgIDEsIDExLCA2MSwgMTEsMjI1LDIyNywyMjcsMjI5LDIzOCwKLSAgICAxMTYsMTI4LCAgMSwgMTEsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxOTcsMTAxLCAgMiwgNjEsCi0gICAgIDM1LCA2MSwgNTEsMjI4LDIzMywyMzYsMjM2LCA5NywxMjksICAwLDE4NCwgNjEsIDQ1LDIyNywyMzcsIDk4LAotICAgIDEyOCwgIDMsIDM5LDIzOCwxMTYsMTMyLCAgMCwxNjIsIDYxLCA2NCwgNjEsIDg4LCA2MSwxMDAsIDYxLDExMSwKLSAgICAxMDUsICAyLCA2MSwgNzAsIDYxLCA3OCwyMzEsMjQyLDIyNSwyMjgsMTAxLDEyOCwgMzMsICAzLDIzOCwyMzAsCi0gICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIyMywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LDIyNCwyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsMTYyLDI0MywKLSAgICAyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMjQsMTA0LCAgNSwgNjEsMTM0LCA2MSwxOTcsCi0gICAgIDYxLDIwOCwgNjIsMTM2LCA2MiwyMjgsIDk3LCAgNCwgNjEsMTQ0LCA2MSwxNTUsIDYxLDE2NSwgNjEsMTcyLAotICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjEsMjI2LDIyOSwyMzgsMjMxLDIyNSwKLSAgICAyMzYsMTA1LDEyOCwgIDksMTU1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyNywyMzEsMTE3LCAgMiwgNjEsCi0gICAgMTc5LCA2MSwxODgsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTUsMjQyLDIzNywyNDUsMjM1LAotICAgIDIzMiwxMDUsMTI4LCAxMCwgMjcsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyMCwKLSAgICAxMDEsICA2LCA2MSwyMjIsIDYxLDI0MiwgNjIsIDEwLCA2MiwgNzgsIDYyLCA5MCwgNjIsMTExLDIyNSwyMjYsCi0gICAgMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwxODksIDk5LCAgMiwgNjEsMjQ4LCA2MiwgIDAsMjM1LDIzNywyMjUsMjQyLDEwNywxMjgsIDM5LCAxOSwKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNzEsMTAwLCAgMiwgNjIsIDE2LCA2MiwgNjAsCi0gICAgMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDExNCwgIDIsIDYyLCAyOSwgNjIsIDQ5LDIyNSwyMjYsMjM1LAotICAgIDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxOTEsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE4MywyMzMsMjI5LDI0MiwyMjksCi0gICAgMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDI0NSwyMzIsMjI1LAotICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExNSwyMzUsMjMyLDIyNSwyMzUsMjI1LDI0MywKLSAgICAyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIwNCwyNDYsCi0gICAgMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODUsMTA1LDEyOSwgIDMsMTk5LCA2MiwxNDIsMjI5LDI0NSwKLSAgICAyMjcsMTA0LCAgNCwgNjIsMTU1LCA2MiwxOTAsIDYyLDIwNSwgNjIsMjE0LCA5NywgIDIsIDYyLDE2MSwgNjIsCi0gICAgMTc2LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTE5LAotICAgIDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjMsMjI3LDIzMywKLSAgICAyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDUsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzQsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDUwLCAgOSwxMTEsICAyLCA2MiwyMzQsIDYzLCAyOCwyMjcsMTA0LCAgMywgNjIsMjQzLCA2MywKLSAgICAgIDksIDYzLCAxOSwyMjUsMTEwLCAgMiwgNjIsMjUwLCA2MywgIDIsMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsCi0gICAgIDE0LCAxMCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDgsMjMzLDIzOCwyMzEsMjQ0LDIzMiwyMjUsMTA1LAotICAgIDEyOCwgMTQsICA5LDIzOSwyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDEyLDIzOSwxMDcsMTI4LCAgMSwKLSAgICAxMzYsMTA1LCAgMiwgNjMsIDM5LCA2MywxNDEsMjI5LDI0NSwgOTksICA1LCA2MywgNTMsIDYzLCA4OCwgNjMsCi0gICAgMTAzLCA2MywxMTIsIDYzLDEyNiwgOTcsICAyLCA2MywgNTksIDYzLCA3NCwyMjcsMjMzLDI0MiwyMjcsMjM2LAotICAgIDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDExOCwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwKLSAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDIyLDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksCi0gICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTA0LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDcyLAotICAgIDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDgsMjQ1LDI0MCwKLSAgICAyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjgsMjQyLCA5OSwgIDIsCi0gICAgIDYzLDE0OCwgNjMsMjQzLDIzNiwxMDEsMTMyLCAzNywyMDMsIDYzLDE2MSwgNjMsMTcyLCA2MywxNzcsIDYzLAotICAgIDIwMSwyMzcsMjQ1LDIzNiwyNDQsMjMzLDI0MCwyMzYsMTIxLDEyOCwgMzQsMTUxLDIzOSwxMTYsMTI4LCAzNCwKLSAgICAxNTMsMTEyLCAgMiwgNjMsMTgzLCA2MywxODksMjM2LDI0NSwxMTUsMTI4LCAzNCwxNDksMjM5LDI0MywyNDQsCi0gICAgMjI1LDIzNiwyMzcsMjI1LDI0MiwxMDcsMTI4LCA0OCwgNTQsMjQ3LDIzMywyNDQsMTA0LCAgMiwgNjMsMjEwLAotICAgICA2MywyMjYsMjM2LDIyOSwyMzAsMjQ0LDIzMiwyMjUsMjM2LDIzMCwyMjYsMjM2LDIyNSwyMjcsMTA3LDEyOCwKLSAgICAgMzcsMjA4LDI0MiwyMzMsMjMxLDIzMiwyNDQsMjMyLDIyNSwyMzYsMjMwLDIyNiwyMzYsMjI1LDIyNywxMDcsCi0gICAgMTI4LCAzNywyMDksMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTMwLCAgMiwxOTgsIDY0LCAgMCwgNjQsIDExLAotICAgIDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDUsMjI3LDIzNywgOTgsMTI4LCAgMywKLSAgICAgIDIsMTA4LCAgMywgNjQsIDI1LCA2NCwgMzEsIDY0LCA4NSwyMjksMjI1LDExNCwxMjgsIDM1LCAzOSwyMzMsCi0gICAgMjI3LDEwNywgIDQsIDY0LCA0MywgNjQsIDU0LCA2NCwgNjMsIDY0LCA3MywyMjUsMjM2LDI0NiwyMjksMjM5LAotICAgIDIzNiwyMjUsMTE0LDEyOCwgIDEsMTk0LDIyOCwyMjksMjM4LDI0NCwyMjUsMTA4LDEyOCwgIDEsMTkyLDIzNiwKLSAgICAyMjUsMjQ0LDIyOSwyNDIsMjI1LDEwOCwxMjgsICAxLDE5MywyNDIsMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsCi0gICAgMjI5LDEyMCwxMjgsICAxLDE5NSwyNDUsIDk4LDEyOSwgMzgsIDk5LCA2NCwgOTIsMjQzLDI0NSwyMzMsMTE2LAotICAgICAgMiwgNjQsMTAxLCA2NCwxMDksMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsIDM4LCA5OSwyNDcsMjMyLDIzMywKLSAgICAyNDQsMTAxLDEyOCwgMzgsMTAzLDEwOSwgIDMsIDY0LDEyNSwgNjQsMTM5LCA2NCwxNTAsMjI3LDI0NSwyMjYsCi0gICAgMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2NCwyMzksMjM4LDIzOSwyNDMsMjQwLAotICAgIDIyNSwyMjcsMTAxLDEyOCwyNTUsIDY3LDI0MywyNDEsMjQ1LDIyNSwyNDIsMjI5LDIyOCwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLDE2MCwxMTEsICA4LCA2NCwxODQsIDY0LDE5NSwgNjUsIDI2LCA2NSwyMjQsCi0gICAgIDY2LDI1MywgNjcsIDI4LCA2NywxMzUsIDY3LDE0NCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDUsMTI5LDIzNiwyMzksMTEwLDEzMSwgIDAsIDU4LCA2NCwyMDcsIDY0LDIzMiwgNjQsMjUxLDIzNywKLSAgICAyMzksMTEwLCAgMiwgNjQsMjE1LCA2NCwyMjMsMjI5LDI0NCwyMjUsMjQyLDEyMSwxMjgsIDMyLDE2MSwyMzksCi0gICAgMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyNiwxMTUsICAyLCA2NCwyMzgsIDY0LDI0NCwyMzMsMjMxLAotICAgIDExMCwxMjgsIDMyLDE2MSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwgODUsMjQ0LDI0MiwyMzMsMjI1LDIzOCwKLSAgICAyMzEsMjQ1LDIzNiwyMjUsMTE0LCAgMiwgNjUsIDEwLCA2NSwgMjAsMjMyLDIyNSwyMzYsMjMwLDIzNywyMzksCi0gICAgMTAwLDEyOCwgIDIsMjA5LDIzNywyMzksMTAwLDEyOCwgIDIsMjA4LDEwOSwgIDIsIDY1LCAzMiwgNjUsMjE3LAotICAgIDIzNywgOTcsMTM0LCAgMCwgNDQsIDY1LCA0OSwgNjUsMTEzLCA2NSwxMjQsIDY1LDEzNiwgNjUsMTY2LCA2NSwKLSAgICAxODksIDk3LCAgMywgNjUsIDU3LCA2NSwgODMsIDY1LCA5MSwyMjYsMjM5LDI0NiwxMDEsICAyLCA2NSwgNjYsCi0gICAgIDY1LCA3MiwyMjcsMjM3LCA5OCwxMjgsICAzLCAxOSwyNDIsMjMzLDIzMSwyMzIsMjQ0LDIyNywyMzcsIDk4LAotICAgIDEyOCwgIDMsIDIxLDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LDI0NiwxOTUsMTE0LCAgMiwgNjUsIDk3LCA2NSwKLSAgICAxMDQsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDEyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCi0gICAgIDkzLDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMjUsMjM3LDIzOSwyMzgsMjM5LAotICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTIsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKLSAgICAgIDIsIDY1LDE0OSwgNjUsMTYwLDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgMjAsCi0gICAgMjM3LDIzOSwxMDAsMTI4LCAgMiwxODksMTE1LCAgMiwgNjUsMTcyLCA2NSwxNzksMjM3LDIyNSwyMzYsMTA4LAotICAgIDEyOCwyNTQsIDgwLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIyNiwyNDQsMjQ1LDI0MiwKLSAgICAyMzgsMjI5LDEwMCwgIDIsIDY1LDIwMCwgNjUsMjExLDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsCi0gICAgMTI4LCAgMywgMTgsMjM3LDIzOSwxMDAsMTI4LCAgMiwxODcsMjQwLDIyNSwyNDMsMTE1LDEyOCwgMzgsIDYwLAotICAgIDExMCwgIDIsIDY1LDIzMCwgNjUsMjM5LDIzMSwyNDIsMjQ1LDIyOSwyMzgsMTE2LDEyOCwgMzQsIDY5LDExNiwKLSAgICAgIDIsIDY1LDI0NSwgNjYsICAzLDIzOSwyNDUsMjQyLDIzMywyMzgsMjQ0LDIyOSwyMzEsMjQyLDIyNSwxMDgsCi0gICAgMTI4LCAzNCwgNDYsMjQyLDIzOSwxMDgsMTQyLCAzNSwgIDMsIDY2LCAzNywgNjYsIDQzLCA2NiwgNTgsIDY2LAotICAgICA3MywgNjYsMTE3LCA2NiwxNjIsIDY2LDE3NiwgNjYsMTgxLCA2NiwxODYsIDY2LDE5MSwgNjYsMTk3LCA2NiwKLSAgICAyMDIsIDY2LDI0MywgNjYsMjQ4LDE5MywxOTUsIDc1LDEyOCwgIDAsICA2LCA2NiwgIDIsIDY2LCA0OSwgNjYsCi0gICAgIDU0LDE5NywgNzYsMTI4LCAgMCwgIDcsIDgzLDEyOCwgIDAsICA4LCA2NywgIDIsIDY2LCA2NCwgNjYsIDY5LAotICAgIDE5MywgNzgsMTI4LCAgMCwgMjQsIDgyLDEyOCwgIDAsIDEzLCA2OCwgIDMsIDY2LCA4MSwgNjYsMTA3LCA2NiwKLSAgICAxMTIsIDY3LCAgNCwgNjYsIDkxLCA2NiwgOTUsIDY2LCA5OSwgNjYsMTAzLCA0OSwxMjgsICAwLCAxNywgNTAsCi0gICAgMTI4LCAgMCwgMTgsIDUxLDEyOCwgIDAsIDE5LCA1MiwxMjgsICAwLCAyMCwxOTcsIDc2LDEyOCwgIDAsMTI3LAotICAgIDIwNCwgNjksMTI4LCAgMCwgMTYsIDY5LCAgNSwgNjYsMTI5LCA2NiwxMzMsIDY2LDEzOCwgNjYsMTQzLCA2NiwKLSAgICAxNDgsIDc3LDEyOCwgIDAsIDI1LDIwNiwgODEsMTI4LCAgMCwgIDUsMjA3LCA4NCwxMjgsICAwLCAgNCwyMTEsCi0gICAgIDY3LDEyOCwgIDAsIDI3LCA4NCwgIDIsIDY2LDE1NCwgNjYsMTU4LCA2NiwxMjgsICAwLCAyMywgODgsMTI4LAotICAgICAgMCwgIDMsIDcwLCAgMiwgNjYsMTY4LCA2NiwxNzIsIDcwLDEyOCwgIDAsIDEyLCA4MywxMjgsICAwLCAyOCwKLSAgICAxOTksIDgzLDEyOCwgIDAsIDI5LDIwMCwgODQsMTI4LCAgMCwgIDksMjA0LCA3MCwxMjgsICAwLCAxMCwyMDYsCi0gICAgMTkzLCA3NSwxMjgsICAwLCAyMSwyMTAsIDgzLDEyOCwgIDAsIDMwLCA4MywgIDUsIDY2LDIxNCwgNjYsMjE4LAotICAgICA2NiwyMjgsIDY2LDIzMywgNjYsMjM4LCA3MywxMjgsICAwLCAxNSwgNzksMTI5LCAgMCwgMTQsIDY2LDIyNCwKLSAgICAgODQsMTI4LCAgMCwgIDIsMjEyLCA4OCwxMjgsICAwLCAgMSwyMTMsIDY2LDEyOCwgIDAsIDI2LDIxNywgNzgsCi0gICAgMTI4LCAgMCwgMjIsMjEzLCA4MywxMjgsICAwLCAzMSwyMTQsIDg0LDEyOCwgIDAsIDExLDI0MCwyNDksMjQyLAotICAgIDIzMywyMzEsMjMyLDExNiwxMjksICAwLDE2OSwgNjcsICA5LDExNSwgIDIsIDY3LCAxNSwgNjcsIDIxLDIyNSwKLSAgICAyMzgsMTE1LDEyOCwyNDgsMjMzLDIyOSwyNDIsMjMzLDEwMiwxMjgsMjQ2LDIxNywxMTQsICAyLCA2NywgMzQsCi0gICAgIDY3LDExOCwyMzgsMjI5LDI0MiwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwxMTYsICAyLCA2NywgNDksIDY3LAotICAgICA4MywyMzYsMjI5LDIzMCwxMTYsMTMwLCA0OCwgMTIsIDY3LCA2MCwgNjcsIDcyLDIzMiwyMjUsMjM2LDIzMCwKLSAgICAyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsIDk4LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsCi0gICAgMTI4LDI1NCwgNjUsMjQyLDIzMywyMzEsMjMyLDExNiwxMzAsIDQ4LCAxMywgNjcsIDk1LCA2NywxMDcsMjMyLAotICAgIDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwgOTksMjQ2LDIyOSwyNDIsMjQ0LDIzMywKLSAgICAyMjcsMjI1LDEwOCwxMjgsMjU0LCA2NiwyNDAsMjM5LDI0MiwyMjUsMjQ0LDIzMywyMzksMjM4LDI0MywyNDEsCi0gICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI3LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTk5LAotICAgIDI0NiwyMjksMjQyLDIzNSwyMzEsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxOTgsMjQwLDIyNSwKLSAgICAyNDIsMjI5LDExMCwxMjgsIDM2LDE1OCwyNDIsMjQ1LDI1MCwyMjksMjMzLDI0MiwxMTEsMTI4LCAzMiwxNjIsCi0gICAgMjQzLDI0NCwyNDIsMjI5LDI0NCwyMjcsMjMyLDIyOSwxMDAsMTI4LCAgMiwxNTEsMjQ1LDExNCwgIDIsIDY3LAotICAgIDE5NSwgNjcsMjEzLDIzNiwxMjEsICAyLCA2NywyMDIsIDY3LDIwOCwyMjUsMjM4LDEwMCwxMjgsIDM0LDIwNywKLSAgICAyMzksMTE0LDEyOCwgMzQsMjA2LDI0MiwyMjksMjM4LDIyNywxMjEsMTI4LCAgMCwxNjQsMjQ5LDExNCwgIDQsCi0gICAgIDY3LDIzMiwgNjcsMjQwLCA2NywyNDcsIDY3LDI1NSwxOTQsMjQyLDIyOSwyNDYsMTAxLDEyOCwyNDYsMjA5LAotICAgIDE5OCwyMzYsMjI5LDEyMCwxMjgsMjQ2LDIxMCwyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwyNDYsMjEyLDIzMCwKLSAgICAyMzYsMjI5LDEyMCwxMjgsMjQ2LDIxMywxMDAsMTQ2LCAgMCwxMDAsIDY4LCA0NiwgNjksMTg0LCA3MCwyMDgsCi0gICAgIDcxLCAxMiwgNzEsMTg4LCA3MiwxNDIsIDcyLDIwNCwgNzMsMTMzLCA3MywxNDYsIDczLDE1NSwgNzMsMTgxLAotICAgICA3MywyMDYsIDczLDIxNSwgNzUsIDI2LCA3NSwgMzQsIDc1LCA0NSwgNzUsIDY1LCA3NSwgOTMsIDk3LCAxMSwKLSAgICAgNjgsIDcwLCA2OCwgODEsIDY4LCA5MSwgNjgsMTYzLCA2OCwyMjYsIDY4LDIzNywgNjgsMjQ4LCA2OSwgNjEsCi0gICAgIDY5LDEyMywgNjksMTI5LCA2OSwxNTksMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LAotICAgIDEwMCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNjYsMTAwLCAgNSwgNjgsMTAzLCA2OCwKLSAgICAxMTIsIDY4LDExOCwgNjgsMTMyLCA2OCwxNDgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNTQsCi0gICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzgsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjU0LDE5MCwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1NCwxOTEsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LDI1NCwxOTIsMTAzLCAgMywgNjgsMTcxLCA2OCwxODgsIDY4LDIwMiwyMjksMjQzLDEwNCwxMjksICA1LAotICAgIDE4OCwgNjgsMTc5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg4LDIzMSwyMjksMTE0LDEyOSwKLSAgICAgMzIsIDMyLCA2OCwxOTYsMjI4LDIyNiwxMDgsMTI4LCAzMiwgMzMsMTE3LCAgMiwgNjgsMjA4LCA2OCwyMTcsCi0gICAgMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNjYsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LAotICAgICAxMCwgMzgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA5NiwyMzUsMjI1LDI0NCwKLSAgICAyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTkyLDEwOCwgIDMsIDY5LCAgMCwgNjksICA5LCA2OSwgNDcsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDcsMjI5LDExNiwxMzAsICA1LDIxMSwgNjksIDE4LAotICAgICA2OSwgMzgsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTEsIDY5LCAyOSwyMzIsMjI5LDIyNiwKLSAgICAyNDIsMjI5LDExOSwxMjgsMjUxLCA1MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxMSwyMzAsCi0gICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTcwLDIzNywyMzcsIDk3LAotICAgICAgMywgNjksIDcxLCA2OSwgODAsIDY5LCA5MiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3OSwKLSAgICAyMzYsMjM5LDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3OSwyNDQsMjI1LDIzOCwgOTcsCi0gICAgICAyLCA2OSwxMDEsIDY5LDExNSwyMzYsMjQ0LDIzOSwyMzgsMjI5LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsIDc2LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzYsMjM4LDIyOCwgOTcsMTI4LCAgOSwKLSAgICAxMDAsMjQyLDIzMSwgOTcsICAyLCA2OSwxMzcsIDY5LDE0NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE2NywyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNjcsMjQzLAotICAgIDIzMywyMjUsMjQwLDIzOCwyMjksMjQ1LDIzNywyMjUsMjQ0LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsMjI3LDIyNywyMzcsIDk4LDEyOCwgIDQsMTMzLCA5OCwgIDMsIDY5LDE5MiwgNzAsMTg5LCA3MCwxOTksCi0gICAgMTA4LCAgOSwgNjksMjEyLCA2OSwyMjAsIDcwLCA3NywgNzAsIDg1LCA3MCwxMDEsIDcwLDExMiwgNzAsMTMwLAotICAgICA3MCwxNDQsIDcwLDE1NSwxOTksMjQyLDIyNSwyNDYsMTAxLDEyOCwyNDYsMjExLCA5NywgIDIsIDY5LDIyNiwKLSAgICAgNzAsIDI3LDIzOCwyMzEsMjM2LDIyOSwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwxMTYsICAyLCA2OSwyNDIsCi0gICAgIDcwLCAgNiwyMzYsMjI5LDIzMCwxMTYsMTI5LCA0OCwgMTAsIDY5LDI1MSwyNDYsMjI5LDI0MiwyNDQsMjMzLAotICAgIDIyNywyMjUsMTA4LDEyOCwyNTQsIDYxLDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI5LCA0OCwgMTEsIDcwLCAxNiwKLSAgICAyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDYyLDExNCwgIDIsIDcwLCAzMywgNzAsCi0gICAgIDU0LDIyNywyMzIsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjI5LDIzNiwyMzksMjQ3LAotICAgIDIyNywyMzcsIDk4LDEyOCwgIDMsIDQzLDI0MiwyMzksMTE5LCAgMiwgNzAsIDYyLCA3MCwgNjksMjM2LDIyOSwKLSAgICAyMzAsMTE2LDEyOCwgMzMsMjEyLDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMywyMTAsMjI4LDIyNSwyMzgsCi0gICAgMjI4LCA5NywxMjgsICA5LDEwMSwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOSwyNDYsMjE0LCA3MCwgOTUsMjI3LAotICAgIDIzNywgOTgsMTI4LCAgMywgMTUsMjMzLDIzOCwyNDQsMjI5LDIzMSwyNDIsMjI1LDEwOCwxMjgsIDM0LCA0NCwKLSAgICAyMzYsMjM5LDI0NywyMzYsMjMzLDIzOCwxMDEsMTI5LCAzMiwgMjMsIDcwLDEyNCwyMjcsMjM3LCA5OCwxMjgsCi0gICAgICAzLCA1MSwyMzksMjQ2LDIyOSwyNDIsMjM2LDIzMywyMzgsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDYzLAotICAgIDI0MCwyNDIsMjMzLDIzNywyMjksMjM3LDIzOSwxMDAsMTI4LCAgMiwxODYsMjQ2LDIyOSwyNDIsMjQ0LDIzMywKLSAgICAyMjcsMjI1LDEwOCwgIDIsIDcwLDE2OCwgNzAsMTc0LDIyNiwyMjUsMTE0LDEyOCwgMzIsIDIyLDIzNiwyMzMsCi0gICAgMjM4LDIyOSwyMjUsMjI2LDIzOSwyNDYsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDE0LDIzOSwyNDAsMjM5LAotICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAgOSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIwMCwKLSAgICAgOTksICA0LCA3MCwyMTgsIDcwLDIyNSwgNzAsMjM0LCA3MSwgIDUsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsCi0gICAgIDE1LDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDE3LDIzMywyNDIsIDk5LCAgMiwgNzAsMjQyLAotICAgICA3MCwyNDcsMjM2LDEwMSwxMjgsIDM2LDIxMSwyNDUsMjM3LDIzMCwyMzYsMjI5LDI0OCwyMjYsMjI5LDIzNiwKLSAgICAyMzksMTE5LDEyOCwgMzAsIDE5LDI0MiwyMzksMjI1LDExNiwxMjgsICAxLCAxNywxMDAsICA0LCA3MSwgMjIsCi0gICAgIDcxLDEwMywgNzEsMTEzLCA3MSwxNjQsIDk3LCAgNCwgNzEsIDMyLCA3MSwgNDIsIDcxLCA0OSwgNzEsIDc0LAotICAgIDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2MSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwKLSAgICAgMzMsMjMxLDExNywgIDIsIDcxLCA1NiwgNzEsIDY1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsCi0gICAgMTYxLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDMzLDEwOCwgIDIsIDcxLCA4MCwgNzEsIDg5LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTM2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMzcsMjI4LDIzMiwyMjUsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksCi0gICAgIDkyLDIzMiwgOTcsICAzLCA3MSwxMjIsIDcxLDEzMiwgNzEsMTM5LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LAotICAgIDEwNSwxMjgsICA5LDE2MiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzQsMjMxLDExNywgIDIsIDcxLDE0NiwKLSAgICAgNzEsMTU1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTYyLDI0MiwyMzcsMjQ1LDIzNSwyMzIsCi0gICAgMTA1LDEyOCwgMTAsIDM0LDIzOSwxMTYsICAyLCA3MSwxNzEsIDcxLDE4MCwyMjUsMjI3LDIyNywyMjksMjM4LAotICAgIDExNiwxMjgsIDMwLCAxMSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDEzLDEwMSwgIDgsIDcxLDIwNiwKLSAgICAgNzIsICAzLCA3MiwgMTAsIDcyLCAzNSwgNzIsIDQ1LCA3MiwgNTYsIDcyLDEwMSwgNzIsMTM3LCA5OSwgIDIsCi0gICAgIDcxLDIxMiwgNzEsMjQ5LDIzMywyMzcsMjI1LDIzNiwyNDMsMjI5LDI0MCwyMjUsMjQyLDIyNSwyNDQsMjM5LAotICAgIDExNCwgIDIsIDcxLDIzMCwgNzEsMjM5LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTA3LDI0MCwKLSAgICAyMjksMjQyLDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDEwNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgNTIsMjMxLDI0MiwyMjksMTAxLDEyOCwgIDAsMTc2LDIzMiwxMDUsICAyLCA3MiwgMTcsIDcyLAotICAgICAyNiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3MywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywKLSAgICAxMjgsIDQ4LDEwMywyMzMsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzksMjM1LDIyNSwyNDQsCi0gICAgMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE5OSwxMDgsICAyLCA3MiwgNjIsIDcyLCA4NSwyMjksMjQ0LAotICAgIDEwMSwgIDIsIDcyLCA3MCwgNzIsIDc3LDIzNiwyMjksMjMwLDExNiwxMjgsIDM1LCA0MywyNDIsMjMzLDIzMSwKLSAgICAyMzIsMTE2LDEyOCwgMzUsIDM4LDI0NCwgOTcsMTI5LCAgMywxODAsIDcyLCA5MiwyNDQsMjQ1LDI0MiwyMzgsCi0gICAgMjI5LDEwMCwxMjgsICAxLDE0MSwyMzgsMjM5LDIzNywyMzMsMjM4LDIyNSwyNDQsMjM5LDI0MiwyMzcsMjMzLAotICAgIDIzOCwyNDUsMjQzLDIzOSwyMzgsMjI5LDIzOCwyNDUsMjM3LDIyOSwyNDIsMjI1LDI0NCwyMzksMjQyLDIyNiwKLSAgICAyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0OCwyNTAsMTA0LDEyOCwgIDIsMTY0LDEwNCwgIDIsCi0gICAgIDcyLDE0OCwgNzIsMTk4LCA5NywgIDMsIDcyLDE1NiwgNzIsMTY2LCA3MiwxNzMsMjI2LDIyOSwyMzgsMjMxLAotICAgIDIyNSwyMzYsMTA1LDEyOCwgIDksMTY3LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAzOSwyMzEsMTE3LCAgMiwKLSAgICAgNzIsMTgwLCA3MiwxODksMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNjcsMjQyLDIzNywyNDUsCi0gICAgMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzksMjM5LDIzOSwxMDcsMTI4LCAgMiwgODcsMTA1LCAgNiwgNzIsMjE4LAotICAgICA3MywgMTEsIDczLCA3MSwgNzMsIDgyLCA3MywgOTMsIDczLDEwMywgOTcsICAyLCA3MiwyMjQsIDcyLDI0NiwKLSAgICAyMzYsMjQ5LDI0NCwyMzMsMjM1LDIyNSwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOSwgIDMsMTMzLCA3MiwyNDAsCi0gICAgMjI3LDIzNywgOTgsMTI4LCAgMywgNjgsMjM3LDIzOSwyMzgsMTAwLDEyOSwgMzgsMTAyLCA3MiwyNTUsMjQzLAotICAgIDI0NSwyMzMsMjQ0LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzOCwgOTgsMjI5LDI0MiwyMjksMjQzLDIzMywKLSAgICAxMTUsMTMzLCAgMCwxNjgsIDczLCAzMCwgNzMsIDM4LCA3MywgNDksIDczLCA1NSwgNzMsIDYzLDIyNSwyMjcsCi0gICAgMjQ1LDI0NCwxMDEsMTI4LDI0NiwyMTUsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLAotICAgICAzNiwyMjcsMjM3LCA5OCwxMjgsICAzLCAgOCwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwyNDYsMjE2LDI0NCwKLSAgICAyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzMsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsCi0gICAgIDQ4LCA5OCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTk0LDI0NCwyNDQsMjM5LAotICAgIDIzNywyMjUsMjQyLDEwNywxMjgsIDQ4LCAgMywyNDYsMTA1LCAgMiwgNzMsMTEwLCA3MywxMjEsMjI4LDEwMSwKLSAgICAxMjksICAwLDI0NywgNzMsMTE3LDExNSwxMjgsIDM0LCAzNSwyNDMsMjMzLDIzOSwyMzgsMjQzLDIzNiwyMjUsCi0gICAgMjQzLDEwNCwxMjgsIDM0LCAyMSwyMzQsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwgODIsMjM1LDI0MywyMzIsMjI1LDIyOCwxMDEsMTI4LCAzNywxNDcsMTA4LCAgMiwgNzMsMTYxLCA3MywKLSAgICAxNzIsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAxNSwyNDMsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDEwMSwxMjgsIDUxLDE1MSwxMDksICAyLCA3MywxODcsIDczLDE5NSwyMjUsMjI3LDI0MiwyMzksMTEwLAotICAgIDEyOCwgIDEsIDE3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjgsMjM4LDIyNiwKLSAgICAyMzYsMjM5LDIyNywxMDcsMTI4LCAzNywxMzIsMTExLCAxMCwgNzMsMjM3LCA3MywyNDksIDc0LCAgMywgNzQsCi0gICAgIDE0LCA3NCwgMjUsIDc0LCA5NywgNzQsMTAyLCA3NCwxMTMsIDc0LDIyOCwgNzQsMjU0LDIyNywyMzIsMjI1LAotICAgIDIyOCwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE0LDIyOCwyMjksMjM1LDI0NCwyMzIsMjI1LDEwNSwKLSAgICAxMjgsIDE0LCAyMCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTA1LDIzNSwyMjUsCi0gICAgMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMDEsMjM2LDIzNiwyMjUsMTE0LDEzMiwgIDAsIDM2LAotICAgICA3NCwgNDAsIDc0LCA1MSwgNzQsIDYzLCA3NCwgNzQsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwKLSAgICAxMjgsMjQ2LDIyNywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgNCwyMzksCi0gICAgMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDM2LDExNSwgIDIsIDc0LCA4MCwgNzQsIDg3LAotICAgIDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LDEwNSwyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwKLSAgICAyMjgsMjM4LDEwMywxMjgsIDMyLDE3MSwyNDIsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsCi0gICAgIDM4LDExNiwgIDYsIDc0LDEyNywgNzQsMTQ0LCA3NCwxNjYsIDc0LDE3NywgNzQsMjA5LCA3NCwyMTYsMjI1LAotICAgIDIyNywyMjcsMjI5LDIzOCwxMTYsMTI5LCAgMiwyMTcsIDc0LDEzOCwyMjcsMjM3LCA5OCwxMjgsICAzLCAgNywKLSAgICAyMjYsMjI5LDIzNiwyMzksMjQ3LCA5OSwgIDIsIDc0LDE1NSwgNzQsMTYwLDIzNywgOTgsMTI4LCAgMywgMzUsCi0gICAgMjM5LDIzNywgOTgsMTI4LCAgMywgMzUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LAotICAgIDI1MSwyMzYsMjI5LDI0MywxMTUsICAyLCA3NCwxODYsIDc0LDE5MCwxMDUsMTI4LCAgMSwgNDksMTA2LDEyOSwKLSAgICAyNDYsMTkwLCA3NCwxOTYsMjQzLDI0NCwyNDIsMjM5LDIzNSwyMjksMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsCi0gICAgMTMyLDIzNywyMjUsMjQ0LDEwNCwxMjgsIDM0LDE5NywyNDQsMjI5LDIyOCwyMjcsMjMzLDI0MiwyMjcsMjM2LAotICAgIDEwMSwxMjgsIDM3LDIwNCwyNDUsMjI2LDIzNiwyMjksMjQ5LDIzOSwyMjgsMjQwLDIyNSwyNDQsMjI1LDEwNCwKLSAgICAxMjksMjUxLCAzMSwgNzQsMjQ1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDMxLDI0NywyMzgsCi0gICAgMjQ0LDIyNSwyMjcsMTA3LCAgMiwgNzUsICA5LCA3NSwgMjAsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LAotICAgICA5OCwxMjgsICAzLCAzMCwyMzcsMjM5LDEwMCwxMjgsICAyLDIxMywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgMzYsMTU5LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMzUsMTE2LCAgMiwgNzUsCi0gICAgIDUxLCA3NSwgNTcsMjI1LDIzMywxMDgsMTI4LCAgMiwgODYsMjM5LDI0MCwyMjYsMjI1LDExNCwxMjgsICAxLAotICAgIDE0MCwxMTcsICAyLCA3NSwgNzEsIDc1LCA4MiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsMTAxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxOTcsMTIyLDEzMiwgIDEsCi0gICAgMjQzLCA3NSwxMDUsIDc1LDExNCwgNzUsMTMzLCA3NSwxNzAsMjI1LDIzNiwyNDQsMjM5LDIzOCwxMDEsMTI4LAotICAgICAgMiwxNjMsIDk5LCAgMiwgNzUsMTIwLCA3NSwxMjcsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsMTk4LDI0NSwKLSAgICAyNDIsMTA4LDEyOCwgIDIsMTY1LDEwMSwgIDIsIDc1LDEzOSwgNzUsMTU5LDIyNSwyMjYsMjM1LDIzMiwyMjUsCi0gICAgMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMjUsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4NSwyMzIsMjI5LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgOTUsMTAxLDE1MSwgIDAsMTAxLCA3NSwyMzMsIDc1LDI1MiwgNzYsCi0gICAgIDMwLCA3NywgIDQsIDc3LCA2NiwgNzcsIDk5LCA3NywxMTEsIDc3LDEzNCwgNzcsMTg3LCA3OSwgNDMsIDc5LAotICAgIDEwMSwgNzksMjAzLCA4MCwgNjMsIDgwLDE5OCwgODEsIDE3LCA4MSwgNDgsIDgxLDExMCwgODEsMTYzLCA4MiwKLSAgICAgOTgsIDgyLDIzMSwgODIsMjUxLCA4MywgMzksIDgzLDEzMCwgOTcsICAyLCA3NSwyMzksIDc1LDI0NiwyMjcsCi0gICAgMjQ1LDI0NCwxMDEsMTI4LCAgMCwyMzMsMjQyLDI0NCwxMDQsMTI4LCAzOCwgNjUsIDk4LCAgMywgNzYsICA0LAotICAgICA3NiwgMTMsIDc2LCAyMywyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE0MywyMzksMjQwLDIzOSwKLSAgICAyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjgsMjQyLDIyOSwyNDYsMTAxLDEyOCwgIDEsIDIxLCA5OSwgIDUsCi0gICAgIDc2LCA0MiwgNzYsMTE1LCA3NiwxMjksIDc2LDE2MSwgNzYsMjUwLCA5NywgIDIsIDc2LCA0OCwgNzYsMTA5LAotICAgIDIzOCwyMjgsMjQyLCA5NywgIDMsIDc2LCA1OSwgNzYsIDY2LCA3NiwgNzcsMjI4LDIyOSwyNDYsIDk3LDEyOCwKLSAgICAgIDksIDEzLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDEsMjQ2LDIzOSwyNDcsCi0gICAgMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAyLCA3NiwgOTEsIDc2LCA5OCwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwgNjksMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE5NywyNDIsMjM5LDExMCwKLSAgICAxMjgsICAxLCAyNywyMjksMjI4LDIzMywyMzYsMjM2LDIyNSwyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwgMzAsCi0gICAgIDI5LDEwNCwgIDIsIDc2LDEzNSwgNzYsMTQ2LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LAotICAgICAgNSwxMDEsMjQ5LDIzMywyNDcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKLSAgICAxMzUsMjMzLDI0MiwgOTksICAyLCA3NiwxNjksIDc2LDE3NCwyMzYsMTAxLDEyOCwgMzYsMjEyLDI0NSwyMzcsCi0gICAgMjMwLDIzNiwyMjksMTIwLDEzNCwgIDAsMjM0LCA3NiwxOTUsIDc2LDIwMywgNzYsMjExLCA3NiwyMjIsIDc2LAotICAgIDIzMCwgNzYsMjQyLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxOTEsMjI2LDIyOSwyMzYsMjM5LDExOSwKLSAgICAxMjgsIDMwLCAyNSwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTk5LDIzMSwyNDIsCi0gICAgMjI1LDI0NiwxMDEsMTI4LCAzMCwxOTMsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LAotICAgICAzMCwxOTUsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE5NywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwgODQsMTAwLCAgNCwgNzcsIDE0LCA3NywgMjQsIDc3LCAzMCwgNzcsIDQwLDIyNiwyMzYsCi0gICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAgNSwyMjksMjQ2LCA5NywxMjgsICA5LCAxNSwyMzMsMjI5LAotICAgIDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAgMCwyMzUsMjM5LDExNiwxMzAsICAxLCAyMywgNzcsIDQ5LCA3NywKLSAgICAgNTgsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMjMsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCi0gICAgIDMwLDE4NSwxMDEsICAyLCA3NywgNzIsIDc3LCA4MywyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LAotICAgIDEyOCwgMTAsIDE1LDIzNywyMjUsMjQ0LDI0MiwyMjUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwKLSAgICAxMjgsIDEwLCA3MSwyMzAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2OCwxMDMsCi0gICAgICAyLCA3NywxMTcsIDc3LDEyNCwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMCwyMzIsMjQ1LDIzNCwyMjUsMjQyLAotICAgIDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQzLDEwNCwgIDQsIDc3LDE0NCwgNzcsMTU1LCA3NywxNjYsIDc3LDE3NiwKLSAgICAyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTAzLDIyNiwyMzksMjQwLDIzOSwyMzcsCi0gICAgMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjksMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDcyLAotICAgIDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwxODcsMTA1LCAgNCwgNzcsMTk3LCA3NywKLSAgICAyMDgsIDc5LCAxMCwgNzksIDI1LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzEsCi0gICAgMjMxLDIzMiwxMTYsMTQyLCAgMCwgNTYsIDc3LDI0MiwgNzcsMjUxLCA3OCwgIDUsIDc4LCAzNSwgNzgsIDQyLAotICAgICA3OCwgODAsIDc4LDEwNSwgNzgsMTUwLCA3OCwxODQsIDc4LDE5NiwgNzgsMjA3LCA3OCwyNDAsIDc4LDI0OCwKLSAgICAgNzksICAzLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTA0LDIyNiwyMjksMjM4LDIzMSwyMjUsCi0gICAgMjM2LDEwNSwxMjgsICA5LDIzOCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjksIDM2LDEwMywgNzgsIDE2LAotICAgIDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQzLDIyOSwyNDMsMjI1LDIzOCwyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwKLSAgICAxMjgsIDM5LDE0NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMTAsMjI5LDIyOSwxMTAsICAyLCA3OCwgNTAsCi0gICAgIDc4LCA1OSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDExMywxMTIsICAyLCA3OCwgNjUsIDc4LAotICAgICA3MiwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMzMsMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE1MywKLSAgICAyMzEsMTE3LCAgMiwgNzgsIDg3LCA3OCwgOTYsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzgsCi0gICAgMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMTAsMTA0LCAgMiwgNzgsMTExLCA3OCwxMzcsIDk3LAotICAgICAgMiwgNzgsMTE3LCA3OCwxMjgsMjI3LDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwNCwKLSAgICAyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LCA0MCwyMzgsMjM5LDI0NCwyMjksMjI2LDIyOSwyMjUsCi0gICAgMjM3LDIyOSwxMDAsMTI4LCAzOCwxMDcsMTA1LCAgMiwgNzgsMTU2LCA3OCwxNzQsMjI4LDIyOSwyMzksMjMxLAotICAgIDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgMzksMjM4LDIzMCwKLSAgICAyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTM2LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsIDI0LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNTYsMTEyLAotICAgICAgMiwgNzgsMjEzLCA3OCwyMjAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTIzLDIyOSwxMTQsICAyLCA3OCwKLSAgICAyMjcsIDc4LDIzMywyMzMsMjM5LDEwMCwxMjgsIDM2LDE0MywyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDgsCi0gICAgMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExOSwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LAotICAgIDEyOCwgMzIsMTIwLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA4OCwyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwKLSAgICAyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLCAgNywyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwMSwxMDcsICAyLCA3OSwgNDksIDc5LAotICAgICA3MywyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNjgsIDc5LCA2MSwyMzIsMjI1LDIzNiwKLSAgICAyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExNiwxMTEsICAyLCA3OSwgNzksIDc5LCA5NCwyMzgsCi0gICAgMjM1LDIyNSwyNDIsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExNiwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwgODQsMTA4LCAgMywgNzksMTA5LCA3OSwxMjAsIDc5LDE4MSwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU5LDEwMSwgIDIsIDc5LDEyNiwgNzksMTMzLDIzNywyMjksCi0gICAgMjM4LDExNiwxMjgsIDM0LCAgOCwyNDYsMjI5LDExMCwgIDMsIDc5LDE0MywgNzksMTUyLCA3OSwxNzMsMjI3LAotICAgIDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMDYsMTEyLCAgMiwgNzksMTU4LCA3OSwxNjUsMjI1LDI0MiwKLSAgICAyMjksMTEwLDEyOCwgMzYsMTI2LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNDYsMjQyLDIzOSwyMzcsCi0gICAgMjI1LDExMCwxMjgsIDMzLDEyMiwyMzYsMjMzLDI0MCwyNDMsMjMzLDExNSwxMjksIDMyLCAzOCwgNzksMTkyLAotICAgIDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LCAzNCwyMzgsMTA5LCAgNSwgNzksMjE1LCA3OSwKLSAgICAyNDMsIDc5LDI1NCwgODAsIDE4LCA4MCwgMjksMjI1LDIyNywyNDIsMjM5LDExMCwxMzAsICAxLCAxOSwgNzksCi0gICAgMjI3LCA3OSwyMzUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCAyMywyMzEsMjQyLDIyNSwyNDYsMTAxLAotICAgIDEyOCwgMzAsIDIxLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNjAsMjI4LDIyNSwKLSAgICAyNDMsMTA0LDEyOSwgMzIsIDIwLCA4MCwgIDcsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsCi0gICAgMjU0LCA0OSwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDY5LDExMiwgIDIsIDgwLAotICAgICAzNSwgODAsIDU1LDIzMiwyMjUsMjQzLDIzMywyNDMsMjM3LDIyNSwyNDIsMjM1LDIyNSwyNDIsMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTEsMjQ0LDI0OSwyNDMsMjI5LDExNiwxMjgsIDM0LCAgNSwxMTAsCi0gICAgICA2LCA4MCwgNzcsIDgwLCA4OCwgODAsIDk5LCA4MCwxNDMsIDgwLDE3NSwgODAsMTkwLDIyNiwyMzksMjQwLAotICAgIDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LCA2MSwxMDAsICAyLCA4MCwxMDUsIDgwLDEyNCwyMjUsMjQzLDEwNCwxMjksIDMyLCAxOSwgODAsCi0gICAgMTEzLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTAsMjI5LDI0MywyMjcsMjI5LAotICAgIDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTYzLDEwMywKLSAgICAxMzAsICAxLCA3NSwgODAsMTUxLCA4MCwxNjIsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsCi0gICAgIDQ5LCAzNywyMzIsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNjUsMjMyLAotICAgIDIzOSwyMzksMjM1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMDAsMjQzLDI0MCwKLSAgICAyMjUsMjI3LDEwMSwxMjgsIDMyLCAgMiwxMTEsICAzLCA4MCwyMDYsIDgwLDIxNCwgODAsMjIzLDIzMSwyMzksCi0gICAgMjM4LDIyOSwxMDcsMTI4LCAgMSwgMjUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODMsMjQwLAotICAgIDIyOSwxMTAsMTMwLCAgMiwgOTEsIDgwLDIzMywgODAsMjQyLDIyNywyMzYsMjM5LDI0MywyMjksMTAwLDEyOCwKLSAgICAgIDIsMTU0LDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTMwLCAgMiwgOTIsIDgxLCAgMSwgODEsCi0gICAgIDEwLDIyNywyMzYsMjM5LDI0MywyMjksMTAwLDEyOCwgIDIsIDk0LDIzMiwyMzksMjM5LDEwNywxMjgsICAyLAotICAgICA5MywxMTIsICAyLCA4MSwgMjMsIDgxLCAzMCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjAsMjQzLDIzMywKLSAgICAyMzYsMjM5LDExMCwxMjksICAzLDE4MSwgODEsIDQwLDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxNzMsCi0gICAgMjQxLDExNywgIDIsIDgxLCA1NSwgODEsIDk5LDIyNSwxMDgsMTMwLCAgMCwgNjEsIDgxLCA2NCwgODEsIDc2LAotICAgIDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDI5LDExNSwgIDIsIDgxLCA4MiwKLSAgICAgODEsIDg5LDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LDEwMiwyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsCi0gICAgMTI4LCAzMiwxMjQsMjMzLDI0NiwyMjUsMjM2LDIyOSwyMzgsMjI3LDEwMSwxMjgsIDM0LCA5NywxMTQsICAzLAotICAgICA4MSwxMTgsIDgxLDEyOSwgODEsMTQwLDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwKLSAgICAgMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2NCwyMjksMjQ2LDIyOSwyNDIsCi0gICAgMjQzLDIyOSwxMDAsMTI5LCAgMiwgODgsIDgxLDE1MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsIDc3LDExNSwgIDYsIDgxLDE3NywgODEsMTg4LCA4MSwyMDgsIDgyLCAzMywgODIsIDc4LCA4MiwKLSAgICAgODgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2NSwyMjgsMjI5LDI0MywyMjcsCi0gICAgMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTcxLAotICAgIDEwNCwxMzIsICAyLDEzMSwgODEsMjIwLCA4MSwyMjcsIDgyLCAgMiwgODIsIDE3LDIyNywyNDUsMjQyLDEwOCwKLSAgICAxMjgsICAyLDEzNCwyMzksMjQyLDExNiwgIDIsIDgxLDIzNSwgODEsMjQyLDIyOCwyMjksMjQ2LCA5NywxMjgsCi0gICAgICA5LCAxNCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDIzOCwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwgNzAsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDIyOCwyMzYsMjM5LDIzOSwxMTIsMTI4LCAgMSwKLSAgICAxNzAsMjQzLDI0MSwyNDUsMjI1LDI0NCwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLDEyOCwgIDIsCi0gICAgMTMzLDIzNywyMjUsMjM2LDEwOCwgIDIsIDgyLCA0MiwgODIsIDUzLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwgNzEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE2NywKLSAgICAgODIsIDY2LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTA2LDI0NCwyMzMsCi0gICAgMjM3LDIyNSwyNDQsMjI5LDEwMCwxMjgsIDMzLCA0NiwyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAotICAgIDI0NiwyMzYsMTE2LCAgNSwgODIsMTEwLCA4MiwxMzYsIDgyLDE0MCwgODIsMTU3LCA4MiwyMjMsIDk3LDEzMCwKLSAgICAgIDMsMTgzLCA4MiwxMTgsIDgyLDEyOCwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDQsCi0gICAgMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDE3NCwxMDQsMTI4LCAgMCwyNDAsMjMzLDIzNiwyMjgsMTAxLAotICAgIDEyOSwgMzAsMTg5LCA4MiwxNDksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAyNywyMzgsMjI1LDIzMiwKLSAgICAyNDQsIDk3LCAgMywgODIsMTY5LCA4MiwyMDEsIDgyLDIxMCwyMzAsMjM5LDI0NSwyMzUsMTA0LCAgMiwgODIsCi0gICAgMTc5LCA4MiwxODgsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDUsMjM2LDIyOSwyMzAsMjQ0LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTQ1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMTQ1LDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE0NSwyNDUsCi0gICAgMjQyLDIzOCwyMjksMTAwLDEyOCwgIDEsMjIxLDExNywgIDIsIDgyLDIzNywgODIsMjQ2LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksIDk3LDI0MiwxMTEsMTI4LCAzMiwxNzIsMjQ2LDIzOSwyNDcsMjI5LDIzNiwKLSAgICAyNDMsMjMzLDIzMSwxMTAsICAzLCA4MywgMTEsIDgzLCAyMSwgODMsIDI4LDIyNiwyMjksMjM4LDIzMSwyMjUsCi0gICAgMjM2LDEwNSwxMjgsICA5LDE5OSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzEsMjMxLDI0NSwyMzQsMjI1LAotICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE5OSwxMjAsICAyLCA4MywgNDUsIDgzLDExOCwyMjcsMjM2LDIyNSwKLSAgICAxMDksMTMyLCAgMCwgMzMsIDgzLCA2MCwgODMsIDcxLCA4MywgOTgsIDgzLDExMCwyMjUsMjQyLDIzNywyMjksCi0gICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDkyLDEwMCwgIDIsIDgzLCA3NywgODMsIDgyLDIyNiwxMDgsMTI4LAotICAgICAzMiwgNjAsMjM5LDI0NywxMTAsMTI5LCAgMCwxNjEsIDgzLCA5MCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKLSAgICAyNDcsMTYxLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsICAxLDI0MywyMzcsCi0gICAgMjI1LDIzNiwxMDgsMTI4LDI0NywgMzMsMjMzLDI0MywyNDQsMjI5LDIzOCwyNDQsMjMzLDIyNSwxMDgsMTI4LAotICAgICAzNCwgIDMsMjUwLDEwNCwxMzEsICAyLDE0NiwgODMsMTQxLCA4MywxNjAsIDgzLDE3MSwgOTksICAyLCA4MywKLSAgICAxNDcsIDgzLDE1NCwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMzksMjQ1LDI0MiwxMDgsMTI4LCAgMiwxNDcsCi0gICAgMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsICAxLDE4NSwyNDQsMjI1LDIzMywxMDgsMTI4LAotICAgICAgMSwxODYsMTAyLDE0MCwgIDAsMTAyLCA4MywyMDYsIDg0LCAzMiwgODQsIDQzLCA4NCwgNTIsIDg0LCA2NCwKLSAgICAgODQsMTY3LCA4NCwxODMsIDg2LDE5MSwgODYsMjA0LCA4NiwyMzAsIDg4LDEwNywgODgsMTE1LCA5NywgIDQsCi0gICAgIDgzLDIxNiwgODMsMjIzLCA4MywyMzQsIDgzLDI0NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTQsMjMxLAotICAgIDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA5NCwyMzIsMjQyLDIyOSwyMzgsMjMyLDIyOSwKLSAgICAyMzMsMTE2LDEyOCwgMzMsICA5LDI0NCwyMzIsIDk3LCAgMywgODMsMjU1LCA4NCwgIDgsIDg0LCAyMCwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3OCwyMzYsMjM5LDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsICA2LCA3OCwyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3NSwKLSAgICAyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksICA4LDIyNywyMzMsMjQyLDIyNywyMzYsCi0gICAgMTAxLDEyOCwgMzYsMjEzLDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDMxLAotICAgIDEwMSwgIDMsIDg0LCA3MiwgODQsMTUwLCA4NCwxNjAsMTA0LCAgNCwgODQsIDgyLCA4NCwxMDUsIDg0LDExOSwKLSAgICAgODQsMTM1LDIyNSwxMTQsICAyLCA4NCwgODksIDg0LCA5NiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNjUsCi0gICAgMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzQsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxMCwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMTEsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LDI1NCwyMTIsMjMzLDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwgIDMsMjI5LAotICAgIDIzNywyMjUsMjM2LDEwMSwxMjgsIDM4LCA2NCwxMDIsMTMwLDI1MSwgIDAsIDg0LDE3NSwgODQsMTc5LDEwNSwKLSAgICAxMjgsMjUxLCAgMywxMDgsMTI4LDI1MSwgIDQsMTA1LDEzNiwyNTEsICAxLCA4NCwyMDMsIDg0LDI0MywgODQsCi0gICAgMjU0LCA4NSwgMjAsIDg1LDE0MiwgODUsMTU5LCA4NSwxNjcsIDg1LDE4MCwyMzAsMjQ0LDIyOSwyMjksMTEwLAotICAgICAgMiwgODQsMjEzLCA4NCwyMjIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMTAsMTEyLCAgMiwKLSAgICAgODQsMjI4LCA4NCwyMzUsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTMwLDIyOSwyNDIsMjMzLDIzOSwxMDAsCi0gICAgMTI4LCAzNiwxNTAsMjMxLDI0NSwyNDIsMjI5LDIyOCwyMjUsMjQzLDEwNCwxMjgsIDMyLCAxOCwyMzYsMjM2LAotICAgIDIyOSwxMDAsICAyLCA4NSwgIDcsIDg1LCAxMywyMjYsMjM5LDEyMCwxMjgsIDM3LDE2MCwyNDIsMjI5LDIyNywKLSAgICAxMTYsMTI4LCAzNywxNzIsMjM4LDIyNSwxMDgsICA1LCA4NSwgMzQsIDg1LCA3MywgODUsIDkwLCA4NSwxMDcsCi0gICAgIDg1LDEyMywyMzUsMjI1LDEwMiwxMzAsICA1LDIxOCwgODUsIDQ0LCA4NSwgNjQsMjI4LDIyNSwyMzEsMjI5LAotICAgIDI0MywxMDQsMTI5LDI1MSwgNTgsIDg1LCA1NSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1OCwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxOCwyMzcsMjI5LDEwOSwxMjksICA1LDIyMSwgODUsCi0gICAgIDgxLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjIxLDIzOCwyNDUsMTEwLDEyOSwgIDUsMjIzLAotICAgICA4NSwgOTgsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMjMsMjQwLDEwMSwxMjksICA1LDIyNywKLSAgICAgODUsMTE0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjI3LDI0NCwyNDMsMjI1LDIyOCwxMDUsCi0gICAgMTI5LCAgNSwyMjksIDg1LDEzMywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyOSwyNDIsMjQzLAotICAgIDI0NCwyNDQsMjM5LDIzOCwyMjksMjI3LDIzMiwyMzMsMjM4LDIyOSwyNDMsMTAxLDEyOCwgIDIsMjAxLDI0MywKLSAgICAyMzIsMjI5LDI0OSwxMDEsMTI4LCAzNywyMDEsMjQ0LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsMTE1LDI0NiwxMDEsMTQyLCAgMCwgNTMsIDg1LDIxMywgODUsMjIyLCA4NSwyMzIsIDg2LAotICAgICAgNiwgODYsIDEzLCA4NiwgMjMsIDg2LCA0OCwgODYsIDc1LCA4NiwxMDksIDg2LDEyMSwgODYsMTMyLCA4NiwKLSAgICAxNjUsIDg2LDE3MywgODYsMTg0LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTAxLDIyNiwyMjksCi0gICAgMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIzNSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjksIDM2LAotICAgIDEwMCwgODUsMjQzLDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQzLDIyOSwyNDMsMjI1LDIzOCwyNDMsMjQzLDIyOSwKLSAgICAyNDIsMjMzLDEwMiwxMjgsIDM5LDE0MiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMDcsMjI5LDIzMywyMzEsCi0gICAgMjMyLDI0NCwyMzIsMTE1LDEyOCwgMzMsIDkzLDIzMSwxMTcsICAyLCA4NiwgMzAsIDg2LCAzOSwyMzQsMjI1LAotICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIzNSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwNywKLSAgICAyMzIsIDk3LCAgMiwgODYsIDU1LCA4NiwgNjYsMjI3LDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LDEwMSwyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LCAzNywxMDUsICAyLCA4NiwgODEsIDg2LAotICAgICA5OSwyMjgsMjI5LDIzOSwyMzEsMjQyLDIyNSwyNDAsMjMyLDIzMywyMjcsMjQwLDIyNSwyNDIsMjI5LDExMCwKLSAgICAxMjgsIDUwLCAzNiwyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMzMsMjM3LDIzOSwyMzgsCi0gICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMjEsMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LAotICAgIDEwMSwxMjgsMjQ3LCA1MywxMTIsICAyLCA4NiwxMzgsIDg2LDE0NSwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwKLSAgICAxMjAsMjI5LDExNCwgIDIsIDg2LDE1MiwgODYsMTU4LDIzMywyMzksMTAwLDEyOCwgMzYsMTQwLDI0MywyMzMsCi0gICAgMjI1LDExMCwxMjgsICA2LDI0NSwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTE2LDI0MywyNDUsMjQwLAotICAgIDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMTcsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDg1LDEwOCwKLSAgICAxMjksMjUxLCAgMiwgODYsMTk3LDIzOSwyNDIsMjMzLDExMCwxMjgsICAxLDE0NiwxMDksICAyLCA4NiwyMTAsCi0gICAgIDg2LDIyMSwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDcwLDI0MywyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMTUzLDExMSwgIDQsIDg2LDI0MCwgODcsICA2LCA4NywgMTgsIDg3LCAyNSwKLSAgICAyMzAsIDk3LCAgMiwgODYsMjQ3LCA4NiwyNTUsMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzMSwyNDQsCi0gICAgMjMyLDIyNSwxMDUsMTI4LCAxNCwgMjksMjM4LDIzMSwyMzcsMjI1LDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgNzksMjQyLDIyNSwyMzYsMTA4LDEyOCwgMzQsICAwLDI0NSwxMTQsMTQyLCAgMCwgNTIsIDg3LCA1OCwKLSAgICAgODcsIDY3LCA4NywgNzcsIDg3LDEwNywgODcsMTE0LCA4NywxMzksIDg3LDE2NiwgODcsMjAwLCA4NywyMTIsCi0gICAgIDg3LDIzMSwgODcsMjQyLCA4OCwgMTksIDg4LCAyNywgODgsIDM4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsMTAwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIzNCwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDEwMSwxMjksIDM2LCA5OSwgODcsIDg4LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQzLDIyOSwyNDMsCi0gICAgMjI1LDIzOCwyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwxMjgsIDM5LDE0MSwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwxMDYsMjMxLDExNywgIDIsIDg3LDEyMSwgODcsMTMwLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwKLSAgICAgMTAsMjM0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTA2LDIzMiwgOTcsICAyLCA4NywxNDYsCi0gICAgIDg3LDE1NywyMjcsMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTAwLDIzOCwyMzEsMjUwLAotICAgIDIzMiwyMzksMTE3LDEyOCwgNDgsIDM2LDEwNSwgIDIsIDg3LDE3MiwgODcsMTkwLDIyOCwyMjksMjM5LDIzMSwKLSAgICAyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDM1LDIzOCwyMzAsCi0gICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEzMiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCAyMCwyMzgsMjQ1LDIzNywyMjksMjQyLDIyNSwyNDQsMjM5LDI0MiwyMjYsMjI5LDIzOCwKLSAgICAyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDcsMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsCi0gICAgMjQ3LCA1MiwxMTIsICAyLCA4NywyNDgsIDg3LDI1NSwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMTksMjI5LAotICAgIDExNCwgIDIsIDg4LCAgNiwgODgsIDEyLDIzMywyMzksMTAwLDEyOCwgMzYsMTM5LDI0MywyMzMsMjI1LDExMCwKLSAgICAxMjgsICA2LDI0NCwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTE1LDI0MywyNDUsMjQwLDIyOSwyNDIsCi0gICAgMjMzLDIzOSwxMTQsMTI4LCAzMiwxMTYsMTE2LCAgMiwgODgsIDQ0LCA4OCwgODIsMjI5LDIyOSwxMTAsICAyLAotICAgICA4OCwgNTIsIDg4LCA2MSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDEwOSwxMTIsICAyLCA4OCwKLSAgICAgNjcsIDg4LCA3NCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjksMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsCi0gICAgIDM2LDE0OSwxMDQsICAyLCA4OCwgODgsIDg4LCA5MywyMjUsMTA1LDEyOCwgMTQsIDg0LDI0NCwyMzksMjM4LAotICAgIDIyOSwyMjcsMjMyLDIzMywyMzgsMjI5LDI0MywxMDEsMTI4LCAgMiwyMDMsMjQwLDIyNSwyNDIsMjI5LDExMCwKLSAgICAxMjgsIDM2LDE2MSwyNDIsIDk3LCAgMiwgODgsMTIyLCA4OCwxMzAsMjI3LDI0NCwyMzMsMjM5LDExMCwxMjgsCi0gICAgIDMyLCA2OCwyMzgsIDk5LDEyOCwgMzIsMTYzLDEwMywxNDQsICAwLDEwMywgODgsMTcxLCA4OSwxMTcsIDg5LAotICAgIDE0MCwgODksMjAxLCA4OSwyMTgsIDkwLDEzOSwgOTEsMTMyLCA5MSwyMTcsIDkxLDIzMCwgOTIsIDg4LCA5MiwKLSAgICAxMTMsIDkyLDE0MSwgOTIsMTYzLCA5MywxMDgsIDkzLDEzMCwgOTMsMjMyLCA5NywgIDksIDg4LDE5MSwgODgsCi0gICAgMjAxLCA4OCwyMDgsIDg4LDIxNSwgODksIDIzLCA4OSwgNDgsIDg5LCA1OSwgODksIDcwLCA4OSwxMDQsMjI2LAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTUxLDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI0NSwKLSAgICAyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMjMsMTAyLCAgNCwgODgsMjI1LCA4OCwyMzQsIDg4LDI0OCwgODksCi0gICAgICA4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTc1LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNDcsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTQ4LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTQ5LDIzMSwxMTcsICAyLCA4OSwgMzAsIDg5LCAzOSwyMzQsMjI1LAotICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1MSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyMywKLSAgICAyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDc2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsCi0gICAgMjI1LDIzOCwgOTcsMTI4LCA0OCwxNzIsMjM3LDIzNywgOTcsMTMwLCAgMywxNzksIDg5LCA4MCwgODksIDkzLAotICAgIDIzNiwyMjUsMjQ0LDIzMywyMzgsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsICAyLCA5OSwyNDMsMjQ1LDI0MCwKLSAgICAyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMjI0LDIzOCwyMzEsMjMzLDIyNSwyMjcsMjM5LDI0MCwyNDQsCi0gICAgMjMzLCA5OSwxMjgsICAzLDIzNSwgOTgsICAyLCA4OSwxMjMsIDg5LDEzMywyMzksMjQwLDIzOSwyMzcsMjM5LAotICAgIDIzMCwxMTEsMTI4LCA0OSwgMTMsMjQyLDIyOSwyNDYsMTAxLDEyOCwgIDEsIDMxLCA5OSwgIDQsIDg5LDE1MCwKLSAgICAgODksMTU3LCA4OSwxNjYsIDg5LDE4OCwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMzEsMjI5LDIyOCwyMzMsCi0gICAgMjM2LDIzNiwgOTcsMTI4LCAgMSwgMzUsMjMzLDI0MiwgOTksICAyLCA4OSwxNzQsIDg5LDE3OSwyMzYsMTAxLAotICAgIDEyOCwgMzYsMjE0LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsIDI5LDIzOSwyMzcsMjM3LDIyNSwKLSAgICAyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCAzNSwyMjgsMjM5LDExNiwxMjksICAxLCAzMywgODksCi0gICAgMjA5LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDMzLDEwMSwgIDYsIDg5LDIzMiwgODksMjQzLAotICAgICA4OSwyNTQsIDkwLCAgOSwgOTAsIDI4LCA5MCwxMzAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LCA1MSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDgyLDIzNSwyMjUsCi0gICAgMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNzgsMjM5LDIzNywyMjksMjQ0LDI0MiwyMzMsMjI3LAotICAgIDIyNSwyMzYsMjM2LDI0OSwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsIDgxLDExNCwgIDMsIDkwLCAzNiwKLSAgICAgOTAsIDg1LCA5MCwgOTUsMjI5LDI0MywxMDQsICAzLCA5MCwgNDYsIDkwLCA2MSwgOTAsIDcwLDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTU2LDIzMiwyMjksMjI2LAotICAgIDI0MiwyMjksMTE5LDEyOCwgIDUsMjQzLDIzNywyNDUsMjQxLDIyOCwyMjUsMjM3LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwgIDUsMTU3LDIzNywyMjUsMjM4LDIyOCwyMjYsMjM2LDExNSwxMjgsICAwLDIyMywyNDMsCi0gICAgMjMyLDIyNSwyNDksMjMzLDEwOSwgIDIsIDkwLDEwNiwgOTAsMTIxLDIyNSwyMjcsMjI3LDIyOSwyMzgsMjQ0LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTU4LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMjQ0LDI0NCwyMjUsMjM3LDIyNSwyNDIsMTA3LDEyOCwgNDgsIDE5LDEwNCwgIDUsIDkwLDE1MSwgOTEsCi0gICAgIDI4LCA5MSwgOTEsIDkxLDExNiwgOTEsMTIyLCA5NywgIDQsIDkwLDE2MSwgOTAsMTcxLCA5MCwxOTQsIDkwLAotICAgIDIxOSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTIsMTAwLCAgMiwgOTAsMTc3LCA5MCwKLSAgICAxODgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExNCwyMjksMjQ2LCA5NywxMjgsCi0gICAgICA5LCAyNCwyMzEsMTE3LCAgMiwgOTAsMjAxLCA5MCwyMTAsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LAotICAgICAxMCwxNTIsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjQsMjMzLDExMCwgIDQsIDkwLDIzMCwKLSAgICAgOTAsMjM5LCA5MCwyNTMsIDkxLCAxMywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA1OCwyMzAsCi0gICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjA2LDIzMywyMzgsMjMzLAotICAgIDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIwNywyMzcsMjI5LDIyOCwKLSAgICAyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIwOCwxMDEsICAzLCA5MSwgMzYsCi0gICAgIDkxLCA1NywgOTEsIDc0LDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTQ5LDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNDcsMjQ1LDI0MCwyNDQsMjQ1LDI0MiwyMzgsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE0NSwyMzIsIDk3LCAgMiwgOTEsIDk4LAotICAgICA5MSwxMDUsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkwLDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwKLSAgICAxMDUsMTI4LCAxMCwgOTAsMjM5LDIzOSwxMDcsMTI4LCAgMiwgOTYsMjUwLDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsMTQ3LDEwNSwgIDMsIDkxLDE0MCwgOTEsMTUxLCA5MSwxNjIsMjMyLDIzMywyNDIsMjI1LAotICAgIDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3OCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsMTc0LDEwOSwgIDIsIDkxLDE2OCwgOTEsMTc5LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsCi0gICAgMTI4LCAgNSwgOTksMjI5LDEwOCwxMzAsICA1LDIxMCwgOTEsMTg4LCA5MSwyMDgsMjI4LDIyNSwyMzEsMjI5LAotICAgIDI0MywxMDQsMTI5LDI1MSwgNTAsIDkxLDE5OSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1MCwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxMCwyMzQsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwgODMsMjM2LDIzOSwyNDQsMjQ0LDIyNSwxMDgsICAyLCA5MSwyNDEsIDkyLAotICAgICAgMiwyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDI0MywyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwKLSAgICAgIDEsMTkwLDI0MywyNDQsMjM5LDExMiwxMzIsICAyLDE0OCwgOTIsIDE3LCA5MiwgMjgsIDkyLCAzNCwgOTIsCi0gICAgIDY2LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwxMDAsMTI4LCAgMiwxNTAsMjM3LDIzOSwxMDAsMTI4LAotICAgICAgMiwxOTIsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMzAsICAyLDE0OSwgOTIsIDQ5LCA5MiwKLSAgICAgNTUsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTMsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsCi0gICAgICAyLDIyOCwyNDMsMjQ0LDI0MiwyMzksMjM1LDEwMSwxMjksICAyLDE2MSwgOTIsIDc3LDI0MiwyMjksMjQ2LAotICAgIDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI4LCAgMiwxNjIsMTA5LCAgMiwgOTIsIDk0LCA5MiwxMDIsMjI1LDIyNywKLSAgICAyNDIsMjM5LDExMCwxMjgsIDMwLCAzMywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsCi0gICAgIDcxLDExMSwgIDIsIDkyLDExOSwgOTIsMTMwLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwgODQsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE4MCwyNDAsIDk3LCAgMiwKLSAgICAgOTIsMTQ4LCA5MiwxNTQsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjIsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCi0gICAgMTI4LCA1MSwxNzIsMTE0LCAgMiwgOTIsMTY5LCA5MywgMTAsIDk3LCAgMiwgOTIsMTc1LCA5MiwxODMsMjI4LAotICAgIDIzMywyMjksMjM4LDExNiwxMjgsIDM0LCAgNywyNDYsMTAxLDEzNCwgIDAsIDk2LCA5MiwyMDAsIDkyLDIxMSwKLSAgICAgOTIsMjI4LCA5MiwyMzUsIDkyLDI0NCwgOTMsICAwLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsCi0gICAgMTI4LCAgMywgMjIsIDk5LCAgMiwgOTIsMjE3LCA5MiwyMjIsMjM3LCA5OCwxMjgsICAzLCAgMCwyMzksMjM3LAotICAgICA5OCwxMjgsICAzLCAgMCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgODMsMjM2LDIzOSwyNDcsMjM3LDIzOSwKLSAgICAxMDAsMTI4LCAgMiwyMDYsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjQsCi0gICAgMjQ0LDIzOSwyMzgsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDY0LDIyOSwyMjUsMjQ0LDIyOSwxMTQsMTMyLAotICAgICAgMCwgNjIsIDkzLCAyNiwgOTMsIDQ1LCA5MywgNTcsIDkzLDEwMCwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOSwKLSAgICAgMzQsMTAxLCA5MywgMzYsMjM5LDI0MiwyMzYsMjI5LDI0MywxMTUsMTI4LCAzNCwyMTksMjM3LDIzOSwyMzgsCi0gICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzAsMTExLCAgMiwgOTMsIDYzLCA5MywgODksMTE0LAotICAgICAgMiwgOTMsIDY5LCA5MywgODIsMjI5LDI0MSwyNDUsMjMzLDI0NiwyMjUsMjM2LDIyOSwyMzgsMTE2LDEyOCwKLSAgICAgMzQsMTE1LDIzNiwyMjksMjQzLDExNSwxMjgsIDM0LDExOSwyNDYsMjI5LDI0MiwyMjksMjQxLDI0NSwyMjUsCi0gICAgMTA4LDEyOCwgMzQsMTAzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwxMDEsMTE1LCAgMiwgOTMsMTE0LAotICAgICA5MywxMjIsMjI3LDI0MiwyMzMsMjQwLDExNiwxMjgsICAyLCA5NywyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwKLSAgICAgIDEsMjI5LDExNywgIDQsIDkzLDE0MCwgOTMsMTUxLCA5MywyMDgsIDkzLDIxOSwyMzIsMjMzLDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDgwLDIzMywxMDgsICAyLCA5MywxNTgsIDkzLDE4MywyMzYsMjI5LAotICAgIDIzNywyMzksMTE2LCAgMiwgOTMsMTY4LCA5MywxNzUsMjM2LDIyOSwyMzAsMTE2LDEyOCwgIDAsMTcxLDI0MiwKLSAgICAyMzMsMjMxLDIzMiwxMTYsMTI4LCAgMCwxODcsMjQzLDIzMywyMzgsMjMxLDEwOCwgIDIsIDkzLDE5MywgOTMsCi0gICAgMjAwLDIzNiwyMjksMjMwLDExNiwxMjgsIDMyLCA1NywyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzIsIDU4LAotICAgIDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNzYsMjQyLDIyNSwyMzcsMjQ1LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDI0LDI0OSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCi0gICAgIDUxLDIwMSwxMDQsMTQ0LCAgMCwxMDQsIDk0LCAyMiwgOTYsMTY0LCA5NiwxOTksIDk2LDIzNiwgOTcsIDIwLAotICAgICA5OCwxNjQsIDk4LDE4NCwgOTksMTQ5LCA5OSwxNjEsIDk5LDE3MywxMDAsMjQxLDEwMCwyNDksMTAxLCAgNCwKLSAgICAxMDEsIDEzLDEwMSwgOTMsMTAxLCA5NywgOTcsIDEzLCA5NCwgNTAsIDk0LCA4OSwgOTQsIDk5LCA5NCwxMjksCi0gICAgIDk0LDE1NCwgOTQsMjMyLCA5NCwyNDQsIDk1LCAxMywgOTUsIDI4LCA5NSwgNTcsIDk1LCA3MCwgOTUsMTI4LAotICAgICA5NSwxMzcsIDk3LCAgMiwgOTQsIDU2LCA5NCwgNzUsMjI2LDIzNSwyMzIsMjI1LDI0MywyMzMsMjI1LDIzOCwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTY5LDIzNiwyNDQsMjM5LDIzOCwyMjksCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxOTMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMTg1LDIyOCwxMDEsICAyLCA5NCwxMDYsIDk0LDEyNCwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwKLSAgICAyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3OSwyNDYsIDk3LDEyOCwgIDksCi0gICAgIDU3LDIzMSwxMTcsICAyLCA5NCwxMzYsIDk0LDE0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAotICAgIDE4NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1NywxMDQsICA0LCA5NCwxNjQsIDk0LDE3MywKLSAgICAgOTQsMTg3LCA5NCwyMTcsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDUsMjMwLDIzMywyMzgsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE2MiwxMDUsICAyLCA5NCwxOTMsIDk0LAotICAgIDIwOCwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE2MywKLSAgICAyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExMSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE2NCwyMzMsMjQ0LDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLAotICAgIDEwMSwxMjgsIDUxLCA0MiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjA3LCA5NSwKLSAgICAgIDEsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMzgsMjM2LDIyNSwyMzgsCi0gICAgMjQ0LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNzcsMjM3LDI1MCwgOTcsICAyLAotICAgICA5NSwgMzYsIDk1LCA0NSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAzMywyMzYsMjM5LDI0NywKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAzMywyMzgsMjMxLDI0NSwyMzYsMjMwLDIzMywyMzYsCi0gICAgMjM2LDIyOSwxMTQsMTI4LCA0OSwxMDAsMTE0LCAgMiwgOTUsIDc2LCA5NSwgOTIsMjI4LDI0MywyMzMsMjMxLAotICAgIDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDc0LDI0MCwyMzksMjM5LDExMCwKLSAgICAgIDIsIDk1LDEwMSwgOTUsMTE0LDIzNiwyMjksMjMwLDI0NCwyMjYsMjI1LDI0MiwyMjYsMjQ1LDExMiwxMjgsCi0gICAgIDMzLDE4OCwyNDIsMjMzLDIzMSwyMzIsMjQ0LDIyNiwyMjUsMjQyLDIyNiwyNDUsMTEyLDEyOCwgMzMsMTkyLAotICAgIDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjAyLDI0NCwyMjUsMTAyLCAgMywgOTUsMTQ3LCA5NSwKLSAgICAyMzksIDk2LCA3NCwyNDAsMjI1LDI0NCwyMjUsMTA0LDEzNCwgIDUsMTc4LCA5NSwxNjcsIDk1LDE3MiwgOTUsCi0gICAgMTg2LCA5NSwxOTUsIDk1LDIxMCwgOTUsMjI2LDE3NywgNTQsMTI4LCAgNSwxNzgsIDUwLCAgMiwgOTUsMTc4LAotICAgICA5NSwxODIsIDUxLDEyOCwgIDUsMTc4LDEwMiwxMjgsICA1LDE3OCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE3OCwyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE3OCwyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxNzgsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc4LDI0MSwKLSAgICAyMjUsMjM3LDIyNSwyNDQsMTE1LDEzNSwgIDUsMTc5LCA5NiwgIDYsIDk2LCAxMSwgOTYsIDE2LCA5NiwgMjEsCi0gICAgIDk2LCAzMCwgOTYsIDQ1LCA5NiwgNjEsMTc3LCA5OCwxMjgsICA1LDE3OSwxNzgsIDU2LDEyOCwgIDUsMTc5LAotICAgIDE3OSwgNTIsMTI4LCAgNSwxNzksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzksMjM4LDIyNSwKLSAgICAyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzksMjQxLDI0NSwyMjUsCi0gICAgMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc5LDI0NywyMzMsMjI4LAotICAgIDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3OSwyNDMsMjI5LDIzMSwyMzksMTA4LDEzNSwKLSAgICAgIDUsMTc3LCA5NiwgOTYsIDk2LDEwMSwgOTYsMTA2LCA5NiwxMTEsIDk2LDEyMCwgOTYsMTM1LCA5NiwxNTEsCi0gICAgMTc3LCA1NSwxMjgsICA1LDE3NywxNzgsIDUyLDEyOCwgIDUsMTc3LDE3OSwgNDgsMTI4LCAgNSwxNzcsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzcsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzcsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksCi0gICAgMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc3LDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsICA1LDE3NywgOTgsICAzLCA5NiwxNzIsIDk2LDE3NywgOTYsMTg3LDIyNSwxMTQsMTI4LCAgMSwKLSAgICAgMzksMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDE1LDI0MiwyMjksMjQ2LDIyOSwyMjYsCi0gICAgMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQzLCA5OSwgIDIsIDk2LDIwNSwgOTYsMjE0LDIyOSwyMjgsMjMzLAotICAgIDIzNiwyMzYsIDk3LDEyOCwgMzAsIDQxLDIzMywyNDIsIDk5LCAgMiwgOTYsMjIyLCA5NiwyMjcsMjM2LDEwMSwKLSAgICAxMjgsIDM2LDIxNSwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCAzNywxMDAsICAyLCA5NiwyNDIsCi0gICAgIDk2LDI1MiwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAzMCwgMzksMjM5LDExNiwgIDIsIDk3LAotICAgICAgMywgOTcsIDEyLDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDM1LDIyNiwyMjksMjM2LDIzOSwKLSAgICAxMTksMTI4LCAzMCwgMzcsMTAxLDEzNiwgIDUsMjEyLCA5NywgNDAsIDk3LCA3MywgOTcsIDkzLCA5OCwgNjYsCi0gICAgIDk4LCA4MiwgOTgsMTI3LCA5OCwxMzYsIDk4LDE0OSwyMjUsMjQyLDExNiwxMjksIDM4LDEwMSwgOTcsIDQ4LAotICAgIDI0MywyNDUsMjMzLDExNiwgIDIsIDk3LCA1NywgOTcsIDY1LDIyNiwyMzYsMjI1LDIyNywxMDcsMTI4LCAzOCwKLSAgICAxMDEsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCA5NywyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksCi0gICAgMjUxLCA1MiwgOTcsIDg0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDUyLDEwNCwgIDYsIDk3LAotICAgIDEwNywgOTcsMTM1LCA5NywxNDMsIDk3LDE5MywgOTcsMjM5LCA5OCwgMzIsIDk3LCAgMiwgOTcsMTEzLCA5NywKLSAgICAxMjcsMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDE5MywyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDcxLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMTIsMjMwLAotICAgIDIzMywyMzgsMjI1LDIzNiwgOTcsICAyLCA5NywxNTQsIDk3LDE4NSwyMzYsMTE2LCAgMiwgOTcsMTYxLCA5NywKLSAgICAxNzMsMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNjcsMjQ0LDI0NywyMzksCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMzQsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAotICAgIDIzNCwyMzIsMjI1LDIzNywyNTAsMjI1LDIyNSwyMjYsMjM5LDI0NiwxMDEsICAyLCA5NywyMDgsIDk3LDIyMiwKLSAgICAyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTY1LDIzMywyNDMsCi0gICAgMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNjQsMTA1LAotICAgICAgMiwgOTcsMjQ1LCA5OCwgMjMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsIDk3LCAgMiwgOTgsICAxLCA5OCwKLSAgICAgMTUsMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDE2OCwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjM1LDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTIwLAotICAgIDIzNywyMjksMjI4LDIzMywyMjUsMjM2LCA5NywgIDIsIDk4LCA0NCwgOTgsIDU4LDIzNiwyNDQsMjM5LDIzOCwKLSAgICAyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNjksMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgMjU0LDIzNiwyMzMsMjQzLDIyOSwyMzMsMjI5LDI0MiwyMjUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LAotICAgICA1MSwxMjMsMTA3LCAgMiwgOTgsIDg4LCA5OCwxMTIsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwKLSAgICAgNDgsMjE2LCA5OCwxMDAsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDEsCi0gICAgMjQ1LDI0NCwyMjUsMjI1LDI0MiwyNDUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNTQsMjM4LAotICAgIDIzMSwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMDMsMjQyLDI0NSwyNDQsMjQ1LDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMTAxLDEyOCwgNTEsIDU3LDExNiwxMjksICA1LDIxNSwgOTgsMTU1LDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwgIDUsMjE1LDIzMiwyMzksMjM5LDEwNywxMjksICAyLDEwMiwgOTgsMTczLDI0MywyNDUsMjQwLAotICAgIDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxNzcsMTA1LCAgNCwgOTgsMTk0LCA5OSwgMjMsIDk5LCAzNCwKLSAgICAgOTksIDU5LDIyOSwyNDUsMTA0LCAgNCwgOTgsMjA2LCA5OCwyNDEsIDk5LCAgMCwgOTksICA5LCA5NywgIDIsCi0gICAgIDk4LDIxMiwgOTgsMjI3LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLAotICAgIDEyOCwgNTAsMTIzLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwKLSAgICAgMjcsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDksCi0gICAgMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzgsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LAotICAgIDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxMywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsMTE0LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMTAsIDk5LCA0NywyMzIsCi0gICAgMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEzOSwyNDIsMjMzLDExMywxMzQsICA1LAotICAgIDE4MCwgOTksIDc3LCA5OSwgODIsIDk5LCA5NiwgOTksMTA1LCA5OSwxMjAsIDk5LDEzNiwxNzcsIDUyLDEyOCwKLSAgICAgIDUsMTgwLCA1MCwgIDIsIDk5LCA4OCwgOTksIDkyLCA0OSwxMjgsICA1LDE4MCwxMDAsMTI4LCAgNSwxODAsCi0gICAgMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODAsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODAsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgwLDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDE4MCwyMzYsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLAotICAgIDE1MCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA3MiwxMTEsICA5LCA5OSwKLSAgICAxOTMsIDk5LDIwNCwgOTksMjI4LCA5OSwyNTMsMTAwLCA4NSwxMDAsIDk4LDEwMCwxODQsMTAwLDIyNCwxMDAsCi0gICAgMjM1LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTIsMjMyLDEwNSwgIDIsIDk5LAotICAgIDIxMSwgOTksMjE5LDI0MCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDMsMjQyLDIyNSwyMzEsMjI1LDIzOCwKLSAgICAgOTcsMTI4LCA0OCwxMjMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIxOSwgOTksCi0gICAgMjQxLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQyLDIzNiwyMjUsMTA5LAotICAgIDEzNSwgIDUsMTg1LDEwMCwgMTcsMTAwLCAyMiwxMDAsIDI3LDEwMCwgMzIsMTAwLCA0MSwxMDAsIDU2LDEwMCwKLSAgICAgNzIsMTc3LCA1NywxMjgsICA1LDE4NSwxNzgsIDU0LDEyOCwgIDUsMTg1LDE3OSwgNTAsMTI4LCAgNSwxODUsCi0gICAgMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODUsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODUsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg1LDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDE4NSwyMzgsMjM5LDIzNSwyMzIsMjQ1LDIzNSwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgNDYsMTExLCAgMiwxMDAsMTA0LDEwMCwxNzQsMTA3LCAgNCwxMDAsMTE0LDEwMCwxMjYsMTAwLDEzMiwKLSAgICAxMDAsMTU0LDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzOSwyMzcsIDk4LDEyOCwgIDMsICA5LDIyNywyMzcsCi0gICAgIDk4LDEyOCwgIDMsICA5LDI0MCwyMjUsMjM2LDIyNSwyNDQsMjI1LDIzNiwyMzMsMjUwLDIyOSwyMjgsMjI2LAotICAgIDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAzMywyNDIsMjI5LDI0NCwyNDIsMjM5LDIzMCwKLSAgICAyMzYsMjI5LDI0OCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDM0LDIzOCwyNDMsCi0gICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA2NiwxMTQsICAyLDEwMCwxOTAsMTAwLDIxNywxMDUsICAyLAotICAgIDEwMCwxOTYsMTAwLDIwNSwyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIzMywyNTAsMjM5LDIzOCwKLSAgICAyNDQsMjI1LDIzNiwyMjYsMjI1LDExNCwxMjgsIDMyLCAyMSwyMzgsMjI3LDIzNywgOTgsMTI4LCAgMywgMjcsCi0gICAgMjQ0LDI0MywyNDAsMjQyLDIzMywyMzgsMjMxLDExNSwxMjgsIDM4LDEwNCwyNDUsMjQzLDEwMSwxMjgsIDM1LAotICAgICAgMiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTYzLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwKLSAgICAxMTQsMTI4LCAgMiwxNzYsMjQ0LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxMDEsMTE3LCAgNCwxMDEsCi0gICAgIDIzLDEwMSwgMzQsMTAxLCA0NywxMDEsIDcyLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwxMTcsMjMzLDIzMywyNDQsMjM5LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDUxLDIzNSwKLSAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMTMsMTAxLCA2MCwyMzIsMjI1LDIzNiwyMzAsCi0gICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0MCwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LAotICAgIDI0NSwxMTYsMTI5LCAgMiwyMjEsMTAxLCA4NywyMjcsMjM3LCA5OCwxMjgsICAzLCAxMSwxMTgsMTI4LCAgMSwKLSAgICAxNDksMjQ5LDI0MCwyMzIsMjI5LDExMCwxMzIsICAwLCA0NSwxMDEsMTEzLDEwMSwxMjQsMTAxLDEzNiwxMDEsCi0gICAgMTU5LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMjksMjM3LDIzOSwyMzgsMjM5LAotICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTMsMTE1LCAgMiwxMDEsMTQyLDEwMSwxNDksMjM3LDIyNSwKLSAgICAyMzYsMTA4LDEyOCwyNTQsIDk5LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzMCwyNDQsCi0gICAgMjQ3LDExMSwxMjgsIDMyLCAxNiwxMDUsMTQ5LCAgMCwxMDUsMTAxLDIxMSwxMDEsMjM0LDEwMiwgMTIsMTAyLAotICAgICA1OSwxMDUsMTk3LDEwNiwgNjEsMTA2LCA5OCwxMDYsMTI1LDEwNywgMzEsMTA3LCAzNSwxMDcsIDczLDEwNywKLSAgICAgOTUsMTA3LDE3OSwxMDgsIDg4LDEwOCwxNjMsMTA4LDE3MSwxMDgsMTg0LDEwOSwgMTUsMTA5LCA3MiwxMDksCi0gICAgMTAwLDEwOSwxNDQsMjI1LCA5OSwgIDIsMTAxLDIxOCwxMDEsMjI0LDI0NSwyNDQsMTAxLDEyOCwgIDAsMjM3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3OSwgOTgsICAzLDEwMSwyNDIsMTAxLDI1MSwKLSAgICAxMDIsICA1LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM1LDIzOSwyNDAsMjM5LDIzNywyMzksCi0gICAgMjMwLDExMSwxMjgsIDQ5LCAzOSwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMSwgNDUsIDk5LCAgMywxMDIsIDIwLAotICAgIDEwMiwgMjcsMTAyLCA0OSwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMDgsMjMzLDI0MiwgOTksICAyLDEwMiwKLSAgICAgMzUsMTAyLCA0MCwyMzYsMTAxLDEyOCwgMzYsMjE2LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDAsCi0gICAgMjM4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4NiwxMDAsICA0LDEwMiwgNjksMTAyLAotICAgICA3OSwxMDUsMTU0LDEwNSwxODcsMjI2LDIzNiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDIsICA5LDEwMSwKLSAgICAgIDIsMTAyLCA4NSwxMDUsMTQ5LDIzOSwyMzEsMjQyLDIyNSwyNDAsMTA0LCAgNywxMDIsMTA2LDEwMiwxMjAsCi0gICAgMTAyLDEzMywxMDUsIDYyLDEwNSwgOTMsMTA1LDEwNiwxMDUsMTE4LDIyOSwyMjUsMjQyLDI0NCwyMzIsMjI3LAotICAgIDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNDMsMjMwLDIzMywyNDIsMjI5LDIyNywyMzMsMjQyLDIyNywKLSAgICAyMzYsMTAxLDEyOCwgNTAsMTM5LDIzMywgOTksIDE0LDEwMiwxNjQsMTAyLDE4MCwxMDMsIDIzLDEwMywgNzcsCi0gICAgMTAzLDE0MywxMDMsMTcyLDEwMywxODgsMTAzLDI0NSwxMDQsIDM4LDEwNCwgNTAsMTA0LCA3NywxMDQsMTQ0LAotICAgIDEwNSwgMjYsMTA1LCA1NSwyMjUsMjM2LDIzNiwyMzMsMjI1LDIzOCwyMjcsMjI5LDI0MCwyMjUsMjQyLDIyOSwKLSAgICAxMTAsMTI4LCA1MCwgNjMsIDk5LCAgNCwxMDIsMTkwLDEwMiwyMDEsMTAyLDIxNSwxMDIsMjIyLDIyNSwyMzYsCi0gICAgMjM2LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTgsMjI5LDIzOCwyNDQsMjQyLDIyOSwyMjcsMjMzLAotICAgIDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE2NSwyMzYsMjM5LDI0MywxMDEsMTI4LCA0OCwgIDYsMTExLCAgMywKLSAgICAxMDIsMjMwLDEwMiwyNDUsMTAzLCAgOSwyMzcsMjM3LCA5NywxMjksIDQ4LCAgMSwxMDIsMjM4LDIzNiwyMjksCi0gICAgMjMwLDExNiwxMjgsMjU1LDEwMCwyMzgsMjMxLDI0MiwyMjUsMjQ0LDI0NSwyMzYsMjI1LDI0NCwyMzMsMjM5LAotICAgIDIzOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDU1LDI0MiwyNDIsMjI5LDIyNywyNDQsMjI3LDIzMywKLSAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjMsMTAxLCAgMywxMDMsIDMxLDEwMywgNDMsMTAzLCA2MCwyMjUsCi0gICAgMjQyLDI0NCwyMzIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA0NywyMzgsMjQ0LDIyOSwyNDIsMjQwLAotICAgIDI0MiwyMzMsMjQzLDIyOSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDYxLDI0OCwyMjcsMjI5LDIzNiwKLSAgICAyMzYsMjI5LDIzOCwyNDQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNTcsMTAyLCAgMiwxMDMsCi0gICAgIDgzLDEwMywgOTgsMjI5LDI0MywyNDQsMjMzLDI0NiwyMjUsMjM2LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LAotICAgICA1MCwgNjQsMTA1LCAgMiwxMDMsMTA0LDEwMywxMzMsMjM4LDIyNSwyMzgsMjI3LDIzMywyMjUsMTA4LCAgMiwKLSAgICAxMDMsMTE2LDEwMywxMjUsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNTAsMjQwLDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDUwLCA1NCwyNDIsMjI5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNDMsMTA0LAotICAgICAgMiwxMDMsMTQ5LDEwMywxNjAsMjI1LDI0NiwyMjksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA1MCwKLSAgICAyMzMsMjMxLDIzMiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE2NCwyMzMsMjQ0LDIyOSwyNDIsCi0gICAgMjI1LDI0NCwyMzMsMjM5LDIzOCwyMzcsMjI1LDI0MiwxMDcsMTI4LCA0OCwgIDUsMTA4LCAgMywxMDMsMTk2LAotICAgIDEwMywyMjIsMTAzLDIzNCwyMjUsMjI2LDIzOSwxMTQsICAyLDEwMywyMDUsMTAzLDIxNCwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDEwMSwxMjgsIDUwLDE1MiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDU2LDIyOSwyMzAsCi0gICAgMjQ0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTY3LDIzOSwyNDcsMjI3LDIzMywyNDIsMjI3LAotICAgIDIzNiwxMDEsMTI4LCA1MCwxNjYsMTA5LCAgMiwxMDMsMjUxLDEwNCwgMjcsMTAxLCAgMiwxMDQsICAxLDEwNCwKLSAgICAgMTYsMjI4LDIzMywyMjcsMjMzLDIzOCwyMjksMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjksCi0gICAgMjQ0LDIyNSwyMzYsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA0NiwyMzksMjM5LDIzOCwyNDAsMjI1LAotICAgIDI0MiwyMjksMTEwLDEyOCwgNTAsIDQyLDIzOCwyMjUsMjM3LDIyOSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgNTAsIDUyLDExMiwgIDIsMTA0LCA1NiwxMDQsIDY0LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCA0OCwgIDIsCi0gICAgMjQyLDIzMywyMzgsMjQ0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTU4LDExNCwgIDIsMTA0LAotICAgICA4MywxMDQsMTMxLDEwMSwgIDMsMTA0LCA5MSwxMDQsMTAyLDEwNCwxMTcsMjI1LDIyNywyMzIsMjQwLDIyNSwKLSAgICAyNDIsMjI5LDExMCwxMjgsIDUwLCA2NywyNDAsMjQyLDIyOSwyNDMsMjI5LDIzOCwyNDQsMjQwLDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDUwLCA1NywyNDMsMjM5LDI0NSwyNDIsMjI3LDIyOSwyNDAsMjI1LDI0MiwyMjksMTEwLAotICAgIDEyOCwgNTAsIDYyLDIzMywyMzEsMjMyLDI0NCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE2OCwKLSAgICAxMTUsICA1LDEwNCwxNTYsMTA0LDE4NSwxMDQsMTk5LDEwNCwyMjQsMTA0LDI1MiwxMDEsICAyLDEwNCwxNjIsCi0gICAgMTA0LDE3NSwyMjcsMjQyLDIyOSwyNDQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNTMsMjM2LAotICAgIDIzMCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDY2LDIzOSwyMjcsMjMzLDIyOSwyNDQsMjQ5LDI0MCwKLSAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTEsMTEyLCAgMiwxMDQsMjA1LDEwNCwyMTEsMjI1LDIyNywxMDEsCi0gICAgMTI4LCA0OCwgIDAsMjI5LDIyNywyMzMsMjI1LDIzNiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDUzLAotICAgIDExNiwgIDIsMTA0LDIzMCwxMDQsMjQxLDIzOSwyMjcsMjM1LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwKLSAgICAgNDksMjQ1LDIyOCwyNDksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA1OSwxMTcsICAyLDEwNSwgIDIsCi0gICAgMTA1LCAxMSwyMzgsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA0OCwyNDAsMjI5LDI0MiwyNDYsMjMzLAotICAgIDI0MywyMjksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA2MCwxMTksICAyLDEwNSwgMzIsMTA1LCA0NCwKLSAgICAyMjUsMjQ0LDIyOSwyNDIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA0NCwyMzksMjM5LDIyOCwyNDAsCi0gICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDQ1LDI1MCwyMjksMjQyLDExMSwxMjgsIDQ4LCAgNywxMDksICAyLAotICAgIDEwNSwgNjgsMTA1LCA4MSwyMjksMjQ0LDIyNSwyMzYsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwKLSAgICAxNDIsMjM5LDIzOSwyMzgsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxMzgsMjM4LDIyNSwyMzcsCi0gICAgMjI5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTQ4LDI0MywyNDUsMjM4LDIyNywyMzMsMjQyLAotICAgIDIyNywyMzYsMTAxLDEyOCwgNTAsMTQ0LDExOSwgIDIsMTA1LDEyNCwxMDUsMTM3LDIyNSwyNDQsMjI5LDI0MiwKLSAgICAyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE0MCwyMzksMjM5LDIyOCwyMjcsMjMzLDI0MiwyMjcsCi0gICAgMjM2LDEwMSwxMjgsIDUwLDE0MSwyNDYsIDk3LDEyOCwgIDksICA3LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLAotICAgIDExNSwxMzAsICAwLDIzOSwxMDUsMTY4LDEwNSwxNzYsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA0NywKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjI5LDIzOSwyNDQsMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLDIwMywxMDEsICAzLDEwNSwyMDUsMTA1LDIyMSwxMDUsMjMyLDIyNiwyNDIsMjI5LAotICAgIDI0NiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIxNSwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDUzLDI0NSwyMzgsMTAzLCAgNCwxMDUsMjQ0LDEwNiwgMjMsCi0gICAgMTA2LCAzOCwxMDYsIDQ3LCA5NywgIDIsMTA1LDI1MCwxMDYsICA5LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LAotICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTE3LDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjEsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzEsMjQwLAotICAgIDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAgNywxMDMsICAyLDEwNiwKLSAgICAgNjcsMTA2LCA3NCwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMCwyMzYsMTE3LCAgMiwxMDYsIDgwLDEwNiwgODksCi0gICAgMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LAotICAgICAxMCwgIDcsMTA0LCAgMiwxMDYsMTA0LDEwNiwxMTQsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsIDY4LDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwyMDEsMTA1LCAgOCwxMDYsCi0gICAgMTQzLDEwNiwxNTMsMTA2LDE2NCwxMDYsMTcxLDEwNiwxOTYsMTA2LDIxMiwxMDYsMjI3LDEwNiwyNDMsMjI2LAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM2LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwgNTYsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksICA4LDIzMSwxMTcsICAyLDEwNiwxNzgsCi0gICAgMTA2LDE4NywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzNiwyNDIsMjM3LDI0NSwyMzUsMjMyLAotICAgIDEwNSwxMjgsIDEwLCAgOCwyMzcsMjI1LDI0NCwyNDIsMjI1LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwKLSAgICAxMDUsMTI4LCAxMCwgNjQsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LDI0NiwxMDEsCi0gICAgMTI4LCAgMiwgMTEsMjQzLDIzMiwyMzksMjQyLDI0NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsIDU3LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMywxMDcsICAzLDEwNywKLSAgICAgMTMsMTA3LCAyMCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxOTIsMjI4LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksIDY0LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTIsMTA2LAotICAgIDEyOCwgIDEsIDUxLDEwNywgIDIsMTA3LCA0MSwxMDcsIDY1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjksIDQ4LDE2NCwxMDcsIDUzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCi0gICAgMTE0LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTksMTA4LCAgMiwxMDcsIDc5LDEwNywgODQsMjI4LAotICAgIDEwMSwxMjgsICAyLDIyMCwyNDUsMjQ5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTcyLDEwOSwKLSAgICAgIDIsMTA3LDEwMSwxMDcsMTY4LCA5NywgIDMsMTA3LDEwOSwxMDcsMTI5LDEwNywxNTQsMjI3LDI0MiwyMzksCi0gICAgMTEwLDEyOSwgIDEsIDQzLDEwNywxMTgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDIyNywyMzEsMjI5LDIzOSwyNDIsMjI1LDI0MCwyNDAsMjQyLDIzOSwyNDgsMjMzLDIzNywyMjUsMjQ0LDIyOSwKLSAgICAyMzYsMjQ5LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwgODMsMjQ0LDI0MiwyMjUsMjMxLDI0NSwyNDIsCi0gICAgMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA2MywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwyNTUsIDczLDExMCwgIDUsMTA3LDE5MSwxMDcsMjAxLDEwNywyMTAsMTA3LDIyMiwxMDgsIDUwLDIyNywKLSAgICAyNDIsMjI5LDIzNywyMjksMjM4LDExNiwxMjgsIDM0LCAgNiwyMzAsMjMzLDIzOCwyMzMsMjQ0LDEyMSwxMjgsCi0gICAgIDM0LCAzMCwyMzMsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEwNywxMTYsICAyLAotICAgIDEwNywyMjgsMTA4LCA0MCwxMDEsICAyLDEwNywyMzQsMTA4LCAyOSwyMzEsMjQyLDIyNSwxMDgsMTMxLCAzNCwKLSAgICAgNDMsMTA3LDI0NywxMDgsICA5LDEwOCwgMTQsIDk4LCAgMiwxMDcsMjUzLDEwOCwgIDUsMjM5LDI0NCwyNDQsCi0gICAgMjM5LDEwOSwxMjgsIDM1LCAzMywxMTYsMTI4LCAzNSwgMzMsMjI5LDEyMCwxMjgsMjQ4LDI0NSwxMTYsICAyLAotICAgIDEwOCwgMjAsMTA4LCAyNSwyMzksMTEyLDEyOCwgMzUsIDMyLDExMiwxMjgsIDM1LCAzMiwyNDIsMjQzLDIyOSwKLSAgICAyMjcsMjQ0LDIzMywyMzksMTEwLDEyOCwgMzQsIDQxLDIzMywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCi0gICAgIDUxLCAgNSwxMTgsICAzLDEwOCwgNTgsMTA4LCA2NywxMDgsIDc2LDIyNiwyNDUsMjM2LDIzNiwyMjksMTE2LAotICAgIDEyOCwgMzcsMjE2LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzcsMjE3LDI0MywyMzcsMjMzLDIzNiwKLSAgICAyMjksMjMwLDIyNSwyMjcsMTAxLDEyOCwgMzgsIDU5LDExMSwgIDMsMTA4LCA5NiwxMDgsMTA3LDEwOCwxMTUsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4MSwyMzEsMjM5LDIzOCwyMjksMTA3LAotICAgIDEyOCwgIDEsIDQ3LDI0NCwgOTcsMTMxLCAgMywxODUsMTA4LDEyNiwxMDgsMTQ3LDEwOCwxNTUsMjI4LDIzMywKLSAgICAyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjksICAzLDIwMiwxMDgsMTM5LDI0NCwyMzksMjM4LDIzOSwxMTUsCi0gICAgMTI4LCAgMywxNDQsMjM2LDIyNSwyNDQsMjMzLDExMCwxMjgsICAyLDEwNSwyNDQsMjM5LDIzOCwyMzksMTE1LAotICAgIDEyOCwgIDMsMTc1LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjQsMjQyLDIzMywyMzEsMjQ1LDI0MiwKLSAgICAyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTE0LDExNSwgIDQsMTA4LDE5NCwxMDgsMjM5LDEwOCwyNTMsCi0gICAgMTA5LCAgNSwyMzcsMjI1LDIzNiwxMDgsICAyLDEwOCwyMDMsMTA4LDIxNCwyMzIsMjMzLDI0MiwyMjUsMjMxLAotICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsIDY3LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKLSAgICAxNjMsMTA4LDIyNywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwNCwyNDMsCi0gICAgMjMyLDIyNSwyNDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjUwLDI0NCwyNDIsMjM5LAotICAgIDIzNSwxMDEsMTI4LCAgMiwxMDQsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjM3LDExNiwKLSAgICAgIDIsMTA5LCAyMSwxMDksIDU1LDIyOSwyNDIsMjI1LDI0NCwyMzMsMjM5LDExMCwgIDIsMTA5LCAzMywxMDksCi0gICAgIDQ0LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNTcsMjM1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI1MywyMzMsMjM2LDIyOCwxMDEsMTI5LCAgMSwgNDEsMTA5LCA2NCwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQ1LDExNywgIDIsMTA5LCA3OCwxMDksIDg5LDIyNiwyMzksCi0gICAgMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgNDEsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCA3OCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDMsMTA5LDExNiwKLSAgICAxMDksMTI2LDEwOSwxMzMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTkxLDIyOCwyMjksCi0gICAgMjQ2LCA5NywxMjgsICA5LCA2MywyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTkxLAotICAgIDI1MCwyMzIsMjMzLDI0NCwyNDMsIDk3LCAgMiwxMDksMTU1LDEwOSwxNjYsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDExNywyMjgsMjI2LDIzNiwyMzEsMjQyLDIyNSwyNDYsMjI5LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTksMTA2LDEzOCwgIDAsMTA2LDEwOSwyMDksMTEwLAotICAgICAxNiwxMTAsIDI3LDExMCwgNzcsMTEwLCA5MywxMTAsMjA2LDExMSwgMTksMTExLCAyNCwxMTEsIDM2LDExMSwKLSAgICAgNDQsIDk3LCAgNCwxMDksMjE5LDEwOSwyMzAsMTA5LDI0MCwxMDksMjQ3LDIyNSwyNDIsMjM3LDIyOSwyMzgsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTU2LAotICAgIDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyOCwyMzEsMTE3LCAgMiwxMDksMjU0LDExMCwgIDcsMjM0LDIyNSwKLSAgICAyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTYsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjgsCi0gICAgMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxNiwgOTksICAzLDExMCwgMzUsMTEwLAotICAgICA0MiwxMTAsIDY0LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDI0MCwyMzMsMjQyLCA5OSwgIDIsMTEwLCA1MCwKLSAgICAxMTAsIDU1LDIzNiwxMDEsMTI4LCAzNiwyMTcsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwgNTMsCi0gICAgMjQyLDIzOSwyNDMsMjQzLDIyOSwyMjgsMjQ0LDIyNSwyMzMsMTA4LDEyOCwgIDIsMTU3LDIyOCwyMzksMjQ0LAotICAgIDIzNiwyMjksMjQzLDI0MywyNDMsMjQ0LDI0MiwyMzksMjM1LDEwMSwxMjgsICAyLCA5NSwxMDEsICAzLDExMCwKLSAgICAxMDEsMTEwLDExMiwxMTAsMTc3LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODgsCi0gICAgMjI5LDEwOSwgIDQsMTEwLDEyMywxMTAsMTMyLDExMCwxNDYsMTEwLDE2MiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsICA2LCA0NCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTQsMTU4LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgMjU0LDE1OSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAotICAgIDE2MCwxMDQsICAyLDExMCwxODMsMTEwLDE5MiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDE1MiwKLSAgICAyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTM5LDEwNCwgIDIsCi0gICAgMTEwLDIxMiwxMTEsICA2LCA5NywgIDMsMTEwLDIyMCwxMTAsMjMwLDExMCwyMzcsMjI2LDIyOSwyMzgsMjMxLAotICAgIDIyNSwyMzYsMTA1LDEyOCwgIDksMTU3LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyOSwyMzEsMTE3LCAgMiwKLSAgICAxMTAsMjQ0LDExMCwyNTMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTcsMjQyLDIzNywyNDUsCi0gICAgMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjksMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDUsMTIzLDIzMywxMTUsMTI4LCA0OCwgIDQsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywKLSAgICAxMDEsMTI4LDI1NSwgNzQsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE2NSwyNDMsMjQ1LDI0MCwyMjksCi0gICAgMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMTc4LDEwNywxNDYsICAwLDEwNywxMTEsIDk1LDExMywxODQsMTEzLAotICAgIDE5NSwxMTQsICAxLDExNCwgMTIsMTE0LDEwMiwxMTQsMTE2LDExNSwyMjQsMTE2LDE2NCwxMTYsMTc3LDExNiwKLSAgICAyMDMsMTE2LDI1MiwxMTcsMTM0LDExNywxNTYsMTE3LDE2OSwxMTcsMTkyLDExNywyMzQsMTE3LDI0NCwgOTcsCi0gICAgIDEyLDExMSwxMjEsMTExLDE1MywxMTEsMTc1LDExMSwyMDUsMTEyLCA2MywxMTIsIDg4LDExMiwxMTgsMTEyLAotICAgIDE0MywxMTIsMjQ5LDExMywgIDcsMTEzLDEzMCwxMTMsMTU5LCA5OCwgIDIsMTExLDEyNywxMTEsMTQ0LDIyNSwKLSAgICAyNDMsMjMyLDIzNSwyMzMsMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNjEsCi0gICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNDksIDk5LCAgMiwxMTEsMTU5LDExMSwxNjUsMjQ1LAotICAgIDI0NCwxMDEsMTI4LCAzMCwgNDksMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU4LDIyOCwKLSAgICAxMDEsICAyLDExMSwxODIsMTExLDIwMCwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1NSwyNDYsIDk3LDEyOCwgIDksIDIxLDEwMiwxMzUsICA1LAotICAgIDIxOSwxMTEsMjIzLDExMSwyMzIsMTExLDI1MiwxMTIsIDEwLDExMiwgMTksMTEyLCAzNSwxMTIsIDUwLDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY3LDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsCi0gICAgIDU5LDExMSwyNDMsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNTksMjMwLDIzMywyMzgsMjI1LAotICAgIDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxOCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDIxOSwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LDI1NCwyMTksMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgIDI1NCwyMjAsMjQyLDIyNSwyMzAsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDc3LDIzMSwKLSAgICAxMTcsICAyLDExMiwgNzAsMTEyLCA3OSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE0OSwyNDIsCi0gICAgMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyMSwxMDQsICAyLDExMiwgOTQsMTEyLDEwNCwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzUsMjM5LDIzOSwyMzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDE5NiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsCi0gICAgMTcxLDExMiwxMzEsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMTgsMTEyLAotICAgICAgMiwxMTIsMTQ5LDExMiwxNzAsMjQwLCA5NywxMjksICAzLDE4NiwxMTIsMTU2LDI0MywyNDksMjM3LDIyNiwKLSAgICAyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyNDAsMjQ5LDIyOSwyMzksMjQ1LDExMCwgIDMsCi0gICAgMTEyLDE4MiwxMTIsMTk2LDExMiwyMzAsMjM3LDIzMywyMjksMjQ1LDIzNywyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LDExMywxMTIsICAyLDExMiwyMDIsMTEyLDIxNywyMzIsMjMzLDIyOSwyNDUsMjQwLDIzMiwKLSAgICAyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzMiwyMzMsMjI5LDI0NSwyNDAsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjAsMjQzLDI0MywyMjUsMjM4LDIzMSwyNDAsMjMzLDIyOSwyNDUsMjQwLAotICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTIxLDI0MiwyMzksMjQyLDIzMywyMzMsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMTMsMTE1LCAgNSwxMTMsIDE5LDExMywgNjMsMTEzLCA3OCwxMTMsCi0gICAgIDg2LDExMywxMTQsMjMyLDIzMywyMjgsMjI1LDIyNSwyNDUsMjQ0LDExMSwgIDIsMTEzLCAzMiwxMTMsIDQxLAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY0LDIzOCwyMzksMjQzLDIzMywyMjgsMjI5LDIyNiwKLSAgICAyMjksMjI1LDI0MiwyMzMsMjM4LDIzMSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA2NCwyMzcsCi0gICAgMjI1LDIzNiwyMzYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0NSwyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMyLDI0MiwgOTcsICAyLDExMywgOTMsMTEzLDEwMiwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA4MCwyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCA3NywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwxNTksMjQ0LDIyNSwyMzIsMjMzLDI0MiwyMjUsMjQwLDI0MiwyMzksMjM2LDIzOSwyMzgsMjMxLDIzNywKLSAgICAyMjUsMjQyLDIzNSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExMiwyNDYsCi0gICAgMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTcsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwKLSAgICAxMjgsIDQ5LCAxNCwgOTksICA0LDExMywyMDUsMTEzLDIyNywxMTMsMjM2LDExMywyNDQsIDk3LCAgMiwxMTMsCi0gICAgMjExLDExMywyMjEsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM3LDI0MiwyMzksMTEwLAotICAgIDEyOCwgIDEsMjMzLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDU1LDIzMywyNDIsMjI3LDIzNiwKLSAgICAxMDEsMTI4LCAzNiwyMTgsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsCi0gICAgIDU1LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNTEsMTAxLCAgNCwxMTQsIDIyLAotICAgIDExNCwgNDksMTE0LCA3NCwxMTQsIDg2LDEwNCwgIDIsMTE0LCAyOCwxMTQsIDM5LDIyNSwyNDIsMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsCi0gICAgIDgxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNzcsMTE0LCA2MiwyMzIsMjI1LAotICAgIDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyMSwyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwKLSAgICAyMzMsMjI1LDExMCwxMjgsICA1LDExMSwyNDMsMjM3LDIyNSwyMzYsMjM2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsCi0gICAgMjI1LDIzOCwgOTcsMTI4LCA0OCwyNDYsMjMxLDI0MiwyMjksMjI5LDIzOCwyMzYsMjI1LDIzOCwyMjgsMjMzLAotICAgICA5OSwxMjgsICAxLCA1NiwxMDQsICA2LDExNCwxMzAsMTE1LCAgMywxMTUsIDE0LDExNSwgMzksMTE1LDEyNiwKLSAgICAxMTUsMjE0LCA5NywgIDUsMTE0LDE0MiwxMTQsMTUyLDExNCwxNjMsMTE0LDE3MCwxMTQsMTk1LDIyNiwyMjksCi0gICAgMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE1MCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsIDY5LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyMiwyMzEsMTE3LCAgMiwxMTQsMTc3LDExNCwKLSAgICAxODYsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTAsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsCi0gICAgMTI4LCAxMCwgMjIsMTA0LCAgNCwxMTQsMjA1LDExNCwyMTQsMTE0LDIyOCwxMTQsMjQ0LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQ2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1NCwxNjYsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMTY3LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwyNTQsMTY4LDIyOSwyMzMsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzEsMjMyLCA5NywKLSAgICAgIDIsMTE1LCAyMSwxMTUsIDI4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA4OSwyMzEsMjQ1LDI0MiwyMzcsCi0gICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDg5LDIzMywyMjksMjQ1LDIzNSwxMDQsICA0LDExNSwgNTMsMTE1LAotICAgICA4OCwxMTUsMTAzLDExNSwxMTIsIDk3LCAgMiwxMTUsIDU5LDExNSwgNzQsMjI3LDIzMywyNDIsMjI3LDIzNiwKLSAgICAyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMjAsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAyNCwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LAotICAgIDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEwNiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3NSwKLSAgICAyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDEwLDExMSwgIDQsCi0gICAgMTE1LDEzNiwxMTUsMTg1LDExNSwxOTUsMTE1LDIwMCwyMzUsMTA0LCAgNCwxMTUsMTQ3LDExNSwxNTYsMTE1LAotICAgIDE2NSwxMTUsMTc1LDIyNSwyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsICAyLDIzOSwyMzgsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwgMTQsICA1LDI0NSwyMjUsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAgMywyNDcsCi0gICAgMjI1LDIzMywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDQsMjM3LDI0NSwyNDQsMjQ0LDIzMiwyMjUsMTA1LAotICAgIDEyOCwgMTQsIDkxLDIzOSwxMDcsMTI4LCAgMSwxNTMsMjQyLDIyNSwyMzUsMjMyLDIyNSwyMzgsMjMxLDI0NCwKLSAgICAyMzIsMjI1LDEwNSwxMjgsIDE0LCAgNiwyNTAsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDUsCi0gICAgMTA1LCAgNCwxMTUsMjM0LDExNSwyNDUsMTE2LCAxNCwxMTYsIDYzLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwgNzcsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE3MywKLSAgICAxMTYsICAyLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTE5LDI0MiwxMTEsCi0gICAgICAzLDExNiwgMjMsMTE2LCAzOCwxMTYsIDU0LDIzMSwyNDUsMjQyLDIyNSwyMzcsMjQ1LDI0MywyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsIDIxLDIzNywyMjksMjI5LDI0NCwyMzksMjQyLDI0NSwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLCAyMiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAyMCwyNDksCi0gICAgMjI5LDIzOSwxMDcsICA1LDExNiwgNzgsMTE2LDExMywxMTYsMTI4LDExNiwxMzcsMTE2LDE1MSwgOTcsICAyLAotICAgIDExNiwgODQsMTE2LCA5OSwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDUwLDExMCwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsCi0gICAgIDE0LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDk2LAotICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDQ5LDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDAsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNDksIDUxLDIzNCwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICA5MiwxMDgsICAyLDExNiwxODMsMTE2LDE5NCwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKLSAgICAgMzAsIDUzLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTUyLDEwOSwgIDMsMTE2LDIxMSwxMTYsCi0gICAgMjI1LDExNiwyMzYsMjI3LDI0NSwyMjYsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLAotICAgIDE2NiwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDc1LDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2MiwxMTEsICA1LDExNywgIDgsCi0gICAgMTE3LCAzNCwxMTcsIDcyLDExNywgODQsMTE3LCA5OCwxMDQsICAyLDExNywgMTQsMTE3LCAyNCwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODMsMjM3LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMTkyLDIzNSwgOTcsICAyLDExNywgNDEsMTE3LCA0OSwyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsCi0gICAgICAxLDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTc5LDExNywgNjAsMjMyLDIyNSwyMzYsMjMwLAotICAgIDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjIsMjM5LDI0MCwyMzksMjQzLDI0MSwyNDUsMjI1LDI0MiwKLSAgICAxMDEsMTI4LCA1MSwgMzAsMjQwLDI0MCwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LDEyOSwxMTQsICAyLDExNywxMDQsMTE3LDEyNCwyMjksMjI1LDIzOCwyNDMsMjQ0LDIyNSwyMzgsMjI4LAotICAgIDIyNSwyNDIsMjI4LDI0MywyNDksMjM3LDIyNiwyMzksMTA4LDEyOCwgNTAsMTI3LDIzOSwyMzgsMjMzLDI0MywKLSAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCA2NywyNDAsIDk3LCAgMiwxMTcsMTQxLDExNywxNDcsMjQyLDIyOSwxMTAsCi0gICAgMTI4LCAzNiwxNjYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNzAsMjQzLDIzMywyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTExLDExNiwgIDIsMTE3LDE3NSwxMTcsMTg0LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjA3LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxNTgsCi0gICAgMTE3LCAgMiwxMTcsMTk4LDExNywyMDksMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LAotICAgICA3OSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTc1LDExNywyMjIsMjMyLDIyNSwKLSAgICAyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjAsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsMTg0LDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE5MCwxMDgsMTQ2LAotICAgICAgMCwxMDgsMTE4LCAzOCwxMjAsIDY1LDEyMCwgOTQsMTIwLDE2MCwxMjAsMTk4LDEyMSwgOTQsMTIxLDEwMywKLSAgICAxMjEsMTE5LDEyMSwxNDMsMTIxLDE2MSwxMjIsIDIzLDEyMiwgNjQsMTIyLDE5OSwxMjIsMjA3LDEyMiwyNDAsCi0gICAgMTIyLDI0OSwxMjMsICAxLDEyMywgNjMsIDk3LCAgNywxMTgsIDU0LDExOCwgNjQsMTE4LCA3MSwxMTgsIDc4LAotICAgIDExOCwxMDMsMTE4LDExOSwxMjAsIDUzLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE3OCwKLSAgICAyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgNTgsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDUwLDIzMSwxMTcsCi0gICAgICAyLDExOCwgODUsMTE4LCA5NCwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE3OCwyNDIsMjM3LAotICAgIDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1MCwyMzUsMjM1LDIzMiwyMjUsMjM4LDIzMSwyNDksMjI1LDIzOSwKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNjksMTA5LCAxMCwxMTgsMTQxLDExOSwgODAsMTE5LCA5NywxMTksCi0gICAgMTM1LDExOSwxNDksMTE5LDE2OCwxMTksMTg0LDExOSwyMDQsMTE5LDIyNCwxMTksMjQ3LCA5NywgIDIsMTE4LAotICAgIDE0NywxMTksIDcyLDIzNiwyMjksMTAyLCAgNCwxMTgsMTU5LDExOCwxNzMsMTE5LCAgOSwxMTksIDI2LDIzMCwKLSAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNTIsMjMyLDIyNSwyMzcsCi0gICAgMjUwLCA5NywgIDIsMTE4LDE4MywxMTgsMjI0LDIyNSwyMjYsMjM5LDI0NiwxMDEsICAyLDExOCwxOTMsMTE4LAotICAgIDIwNywyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQ4LDIzMywKLSAgICAyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNDcsCi0gICAgMjI2LDIyOSwyMzYsMjM5LDExOSwgIDIsMTE4LDIzNCwxMTgsMjQ4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNTAsMjMzLDI0MywyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0OSwyMzMsMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksCi0gICAgMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjUxLDIzNywyMjUsMjI4LDIyOCwyMjUsMjI1LAotICAgIDIyNiwyMzksMjQ2LDEwMSwgIDIsMTE5LCA0MSwxMTksIDU1LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNDYsMjMzLDI0MywyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0NSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY4LAotICAgIDIyNiwyMjgsIDk3LDEyOSwgIDMsMTg3LDExOSwgODgsMjQzLDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwKLSAgICAxNTUsMjI5LDEwMCwxMzAsICA1LDIyMCwxMTksMTA2LDExOSwxMjYsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsCi0gICAgMTI5LDI1MSwgNjAsMTE5LDExNywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2MCwyMzIsMjI5LAotICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyMCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTQsMjIyLDIzMiwyMjUsMjMyLDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIwMiwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMjMsMjM0LDIyOSwyMjksMjM3LDIzMywyMzgsMjMzLDI0NCwKLSAgICAyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIwMSwyMzUsMjMyLDIyNSwyMzIsCi0gICAgMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMjAzLAotICAgIDIzNiwyMjUsMjM3LDIzMiwyMjksMjMyLDIzMywyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1MywyNDIsMjM3LDEwMSwgIDIsMTE5LDI1NCwxMjAsIDExLDIyOCwyMzMsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIyNCwyMjksMTA5LCAgMiwxMjAsIDE4LAotICAgIDEyMCwgMzcsMjMyLDIyNSwyMzIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTMsMTM2LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjUyLDIwNCwyNDIsMjMxLDIyOSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM3LAotICAgIDIzOSwgOTgsICAzLDEyMCwgNzMsMTIwLCA3OCwxMjAsIDg0LDIyNSwxMTQsMTI4LCAgMSwxNTQsMjI5LDIzNiwKLSAgICAxMTYsMTI4LCAgMiwxMDgsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDEyLCA5OSwgIDQsCi0gICAgMTIwLDEwNCwxMjAsMTExLDEyMCwxMjAsMTIwLDE0NywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgNjIsMjI5LAotICAgIDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNjAsMjMzLDI0MiwgOTksICAyLDEyMCwxMjgsMTIwLDEzMywKLSAgICAyMzYsMTAxLDEyOCwgMzYsMjE5LDI0NSwyMzcsMjMwLDIzNiwyMjksMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksCi0gICAgMTI4LCAzMCwgNjEsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDYwLAotICAgIDIyOCwyMzksMTE2LDEzMCwgIDEsIDY0LDEyMCwxNzAsMTIwLDE3OSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwKLSAgICAxMjgsICAxLCA2NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsIDU1LDEyMCwxODksMjM3LDIyNSwyMjcsCi0gICAgMjQyLDIzOSwxMTAsMTI4LCAzMCwgNTcsMTAxLCAgMywxMjAsMjA2LDEyMCwyNDQsMTIxLCA4OSwyMzAsMTE2LAotICAgICAgMiwxMjAsMjEzLDEyMCwyMjksMjI1LDIzOCwyMzEsMjM2LDIyOSwyMjUsMjI2LDIzOSwyNDYsMjI5LDIyNywKLSAgICAyMzcsIDk4LDEyOCwgIDMsIDI2LDI0NCwyMjUsMjI3LDIzNSwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsCi0gICAgIDk4LDEyOCwgIDMsIDI0LDI0MywxMTUsMTMyLCAgMCwgNjAsMTIxLCAgMSwxMjEsIDIzLDEyMSwgMzUsMTIxLAotICAgICA4MSwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOSwgMzQsMTAwLDEyMSwgMTEsMjM5LDI0MiwyMzEsMjQyLDIyOSwKLSAgICAyMjUsMjQ0LDIyOSwxMTQsMTI4LCAzNCwyMTgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCi0gICAgMTI4LDI1NSwgMjgsMTExLCAgMiwxMjEsIDQxLDEyMSwgNzAsMTE0LCAgMiwxMjEsIDQ3LDEyMSwgNjAsMjI5LAotICAgIDI0MSwyNDUsMjMzLDI0NiwyMjUsMjM2LDIyOSwyMzgsMTE2LDEyOCwgMzQsMTE0LDIzMSwyNDIsMjI5LDIyNSwKLSAgICAyNDQsMjI5LDExNCwxMjgsIDM0LDExOCwyNDYsMjI5LDI0MiwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsCi0gICAgMTAyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwxMDAsMjUwLDEwNCwxMjgsICAyLDExMCwyMzAsMjI2LAotICAgIDIzNiwyMzksMjI3LDEwNywxMjgsIDM3LDE0MCwyMzIsMjM5LDIzOSwyMzUsMjQyLDIyOSwyNDQsMjQyLDIzOSwKLSAgICAyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMiwxMDksMTA1LCAgMiwxMjEsMTI1LDEyMSwxMzAsMjQyLCA5NywxMjgsCi0gICAgIDMyLDE2NCwyNDcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDgsMTA2LAotICAgIDEyOSwgIDEsMjAxLDEyMSwxNDksMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAgODksMTA4LDEzMiwyNDYsMTkyLDEyMSwxNzMsMTIxLDE5NywxMjEsMjA4LDEyMSwyMTcsIDk3LCAgMiwxMjEsCi0gICAgMTc5LDEyMSwxODYsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDUxLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LAotICAgIDI0NCwxMDUsMTI4LCAxMCwxNzksMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA1OSwKLSAgICAyMzYsMjI1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA1MiwyNDYsMjM5LDIyNywyMjUsMjM2LDIzMywgOTksCi0gICAgICAzLDEyMSwyMzEsMTIxLDI0MSwxMjEsMjQ4LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAotICAgIDIyNSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTcsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwKLSAgICAxMTAsICAyLDEyMiwgIDYsMTIyLCAxNiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjcsCi0gICAgMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDk5LDEwOSwgIDMsMTIyLCAzMSwxMjIsIDQ0LDEyMiwgNTUsMjMzLAotICAgIDIyOCwyMjgsMjM2LDIyOSwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgIDIsMTA3LDIzOSwyMzgsMjM5LDI0MywKLSAgICAyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDgsCi0gICAgMTExLCAgNiwxMjIsIDc4LDEyMiwgOTAsMTIyLDEzMiwxMjIsMTQzLDEyMiwxNDksMTIyLDE5MSwyMjcsMjMyLAotICAgIDI0NSwyMzYsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA0NCwyMzEsMjMzLDIyNywyMjUsMTA4LCAgMywKLSAgICAxMjIsMTAyLDEyMiwxMDgsMTIyLDEyNywyMjUsMjM4LDEwMCwxMjgsIDM0LCAzOSwyMzgsMjM5LDExNiwxMjksCi0gICAgICAwLDE3MiwxMjIsMTE2LDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI4LCAzNSwgMTYsMjM5LAotICAgIDExNCwxMjgsIDM0LCA0MCwyMzYsMjMzLDIzOCwyMzEsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDM3LDIzOCwKLSAgICAyMzEsMTE1LDEyOCwgIDEsMTI3LDI0NywyMzYsMjMzLDIzOCwxMDEsICAyLDEyMiwxNTksMTIyLDE4MiwgOTksCi0gICAgICAyLDEyMiwxNjUsMTIyLDE3NywyMjksMjM4LDI0NCwyMjksMjQyLDIzNiwyMzMsMjM4LDEwMSwxMjgsMjU0LAotICAgICA3OCwyMzcsIDk4LDEyOCwgIDMsIDUwLDIyOCwyMjUsMjQzLDIzMiwyMjksMTAwLDEyOCwyNTQsIDc3LDI1MCwKLSAgICAyMjksMjM4LDIzMSwxMDEsMTI4LCAzNywyMDIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE2NywxMTUsCi0gICAgICAzLDEyMiwyMTUsMTIyLDIyMiwxMjIsMjMwLDIzNiwyMjUsMjQzLDEwNCwxMjgsICAxLCA2NiwyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgMzMsIDE5LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzOCwKLSAgICAyNDQsMjQzLDIzMiwyMjUsMjI4LDEwMSwxMjgsIDM3LDE0NSwyNDUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsCi0gICAgIDM4LDI0NiwyMzksMjI3LDIyNSwyMzYsMjMzLCA5OSwgIDMsMTIzLCAxNSwxMjMsIDI1LDEyMywgMzIsMjI2LAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTQwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxMiwKLSAgICAyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDIsMTIzLCA0NiwxMjMsIDU2LDIyNiwyMjksCi0gICAgMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyNiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTgsMjQ4LAotICAgIDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjExLDEwOSwxNDQsICAwLDEwOSwxMjMsMTA5LDEyNSwKLSAgICAyMTgsMTI1LDI0MywxMjYsIDE0LDEyNiwgMzksMTI3LCA5MiwxMjcsMTE0LDEyOCwxNjksMTI4LDE5OSwxMjgsCi0gICAgMjQ4LDEyOSwgOTksMTI5LDEyMSwxMjksMTQ2LDEyOSwxNTUsMTMwLDE4MiwxMzAsMjEwLCA5NywgMTIsMTIzLAotICAgIDEzNSwxMjMsMTQ1LDEyMywyMDksMTIzLDIxNiwxMjMsMjQxLDEyNCwgMzMsMTI1LDEyNSwxMjUsMTUwLDEyNSwKLSAgICAxNTUsMTI1LDE2OSwxMjUsMTgxLDEyNSwxODYsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCi0gICAgMTc0LCA5OSwgIDIsMTIzLDE1MSwxMjMsMjAzLDI0MiwyMzksMTEwLDEzMiwgIDAsMTc1LDEyMywxNjUsMTIzLAotICAgIDE3NiwxMjMsMTgyLDEyMywxOTEsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCA0OSwKLSAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCAgNCwyMzYsMjM5LDI0NywyMzcsMjM5LDEwMCwxMjgsICAyLDIwNSwyMzcsCi0gICAgMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLAotICAgICA2MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDYsMjMxLDExNywgIDIsMTIzLDIyMywxMjMsMjMyLDIzNCwKLSAgICAyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTc0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCi0gICAgIDQ2LDEwNCwgIDIsMTIzLDI0NywxMjQsIDIzLDIyNSwyNDAsMjI1LDIzNSwxMDQsICAyLDEyNCwgIDEsMTI0LAotICAgICAxMCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2NCwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNjQsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsCi0gICAgMTI2LDEwNSwgIDUsMTI0LCA0NSwxMjQsMTE0LDEyNCwxNzcsMTI0LDIwNywxMjUsMTEzLDIyNywyMzIsMjI1LAotICAgIDI0NCwyNDQsMjI1LDI0NywgOTcsICAzLDEyNCwgNjAsMTI0LCA5MSwxMjQsIDk4LDIzNiwyMzksMTE5LCAgMiwKLSAgICAxMjQsIDY4LDEyNCwgNzksMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0OSwyNDIsCi0gICAgMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0OCwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgNzUsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAyNDgsMTQ3LDIyOSwxMDcsICAzLDEyNCwxMjMsMTI0LDE1NCwxMjQsMTYxLDIzNiwyMzksMTE5LCAgMiwxMjQsCi0gICAgMTMxLDEyNCwxNDIsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0MCwyNDIsMjMzLAotICAgIDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDEzOSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwKLSAgICAgNzIsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsCi0gICAgMTM4LDIzMiwyMjUsMjM4LDIyNSwyMzUsMjI1LDExNiwgIDIsMTI0LDE4OSwxMjQsMjAwLDIzNiwyMjksMjMwLAotICAgIDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxMzIsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQ5LDExNiwKLSAgICAgIDMsMTI0LDIxNSwxMjQsMjQzLDEyNSwgNTAsMjI1LDIzMywyMzUsMjMyLDExNywgIDIsMTI0LDIyNSwxMjQsCi0gICAgMjM2LDIzNiwyMjksMjMwLDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxMzcsMjQ0LDIzMiwyMjUsMTA1LAotICAgIDEyOCwgMTQsIDcxLDIzMiwxMTEsICAzLDEyNCwyNTIsMTI1LCAyNywxMjUsIDM0LDIzNiwyMzksMTE5LCAgMiwKLSAgICAxMjUsICA0LDEyNSwgMTUsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0MywyNDIsCi0gICAgMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0MiwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgNzMsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAyNDgsMTQxLDI0MiwxMDUsICAzLDEyNSwgNTksMTI1LCA5MCwxMjUsIDk3LDIzNiwyMzksMTE5LCAgMiwxMjUsCi0gICAgIDY3LDEyNSwgNzgsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0NiwyNDIsMjMzLAotICAgIDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0NSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwKLSAgICAgNzQsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsCi0gICAgMTQ0LDI0OSwyMjUsMjM3LDIzOSwyMzUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDcwLDIzNSwyMjUsMjQ0LAotICAgIDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjIsMTI1LDEzOCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywKLSAgICAyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0MywyMzYsMTAxLDEyOCwgMzgsIDY2LDIzOCwyNDMsMjQ5LDIzOSwyMzgsCi0gICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzEsMjQxLDIyNSwyMzAsMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwxOTAsMjQyLDExNSwxMjgsIDM4LCA2NiwxMTUsICAyLDEyNSwxOTIsMTI1LDIxMCwKLSAgICAyMzksMjQyLDIyNSwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE3NSwyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMxLCA5OCwgIDIsMTI1LDIyNCwxMjUsMjM0LAotICAgIDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAgNywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwKLSAgICAxMjgsIDUxLDIxMiwgOTksICAyLDEyNSwyNDksMTI2LCAgMSwyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsCi0gICAgMjIwLDI0NSwyMjYsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2NSwyMjgsMjM5LAotICAgIDExNiwgIDIsMTI2LCAyMiwxMjYsIDMxLDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDY1LDIyNiwKLSAgICAyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNjcsMTAxLCAgNywxMjYsIDU1LDEyNiwxODIsMTI2LDE5MywxMjYsCi0gICAgMjA4LDEyNiwyMzMsMTI3LCAxNCwxMjcsIDI2LDEwMSwgIDIsMTI2LCA2MSwxMjYsMTY5LDEwOSwgIDQsMTI2LAotICAgICA3MSwxMjYsIDgwLDEyNiwgOTQsMTI2LDExMCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA2OSwKLSAgICAyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjI2LDIzMywyMzgsCi0gICAgMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIyNywyMzcsMTAxLAotICAgICAgMiwxMjYsMTE3LDEyNiwxMzAsMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTQsMjI4LDIyOSwyMzcsMTA1LCAgMiwxMjYsMTM4LDEyNiwxNTMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwyMDksMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDcyLDI0NCwyMzksMjQyLDI0NSwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLCA3NywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsCi0gICAgMTI5LDIzMywyNTAsMjMzLDIyOSwyNDIsMjI1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI2LAotICAgIDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjUsMTI2LDIyMSwyMzIsMjI1LDIzNiwKLSAgICAyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0NiwxMDksMTMwLCAgNSwyMjIsMTI2LDI0MSwxMjcsCi0gICAgICA1LDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDYyLDEyNiwyNTIsMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LDI1MSwgNjIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMjIsMjM4LDIyNSwKLSAgICAyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTYsMjQyLDIzNSwyMzIsIDk3LCAgMywxMjcsCi0gICAgIDM3LDEyNywgNDYsMTI3LCA3OSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2NSwyMzUsMjI5LAotICAgIDIzMCwyNDUsMjM2LCA5NywgIDIsMTI3LCA1NywxMjcsIDY2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMTY2LDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2NiwyMzYsCi0gICAgMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNjUsMTA0LCAgMiwxMjcsIDk4LAotICAgIDEyNywxMDQsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMTMsMjUwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMTQ2LDEwNSwgIDYsMTI3LDEyOCwxMjcsMTY1LDEyOCwgNDYsMTI4LCA1NywxMjgsIDgyLDEyOCwxMzksCi0gICAgMjI4LDEwMCwgIDIsMTI3LDEzNSwxMjcsMTYwLDIzNiwyMjksMjI4LDIzOSwyNDQsMjM1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LDIyNSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwMSwKLSAgICAyMzksMTE2LDEyOCwgIDAsMTgzLDIyOSwyNDUsMTA5LCAgNSwxMjcsMTc5LDEyNywyMTQsMTI3LDIyOSwxMjcsCi0gICAgMjM4LDEyOCwgMzMsIDk3LCAgMiwxMjcsMTg1LDEyNywyMDAsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTQsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDUwLCAxOCwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDUwLDEwMCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2NSwxMTIsICAyLAotICAgIDEyNywyNDQsMTI4LCAyMCwgOTcsICAyLDEyNywyNTAsMTI4LCAgOCwyMzgsMjQzLDIzMywyMzksMjQzLDIzNSwKLSAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTEyLDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNTAsICA0LDIzMywyMjksMjQ1LDI0MCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LAotICAgIDExMCwyNDMsMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTEsMjMyLDIzMywKLSAgICAyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyNywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsCi0gICAgIDk3LDEyOSwgNDgsMjIzLDEyOCwgNzAsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LAotICAgIDI1NSwxNDQsMjM4LDExNywgIDIsMTI4LCA4OSwxMjgsMTM0LDExNSwxMzIsIDM0LCAxOCwxMjgsMTAxLDEyOCwKLSAgICAxMTIsMTI4LDEyMSwxMjgsMTI3LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMzIsCi0gICAgMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNCwxNTAsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMTUsMjQwLAotICAgIDIzNiwyNDUsMTE1LDEyOCwgMzQsIDE5LDI0NCwxMDEsMTI4LCAzMiwgNTAsMjQyLDEwNSwgIDIsMTI4LDE0NiwKLSAgICAxMjgsMTYwLDIyNiwyMjUsMjI1LDI0MiwyNDUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzQsCi0gICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzMsMTA4LCAgMiwxMjgsMTc1LDEyOCwxOTAsMjM5LAotICAgIDIzOCwyMzEsMjM2LDIyOSwyMzEsMjQ0LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxMTIsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNTAsMTA5LCAgMywxMjgsMjA3LDEyOCwyMjEsMTI4LDIzMiwyMjcsCi0gICAgMjQ1LDIyNiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTYzLDIzOSwyMzgsMjM5LAotICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzcsMjQzLDI0MSwyNDUsMjI1LDI0MiwyMjksMjI4LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTU5LDExMSwgIDUsMTI5LCAgNCwxMjksIDMwLDEyOSwgNTUsCi0gICAgMTI5LCA2NSwxMjksIDc0LDEwNCwgIDIsMTI5LCAxMCwxMjksIDIwLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LAotICAgICA5NywxMjgsIDQ4LDEzMCwyMzcsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxOTMsMjM1LDIyNSwKLSAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyNiwxMjksIDQzLDIzMiwyMjUsMjM2LDIzMCwyNDcsCi0gICAgMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQ3LDIzNiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLAotICAgIDIxNCwyMzcsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzMywyNDYsMjI5LDI0MiwyNDMsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI5LCA1MSwxNjcsMTI5LCA4OSwyMjgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCi0gICAgMTI4LCA1MSwxNjgsMjQwLCA5NywgIDIsMTI5LDEwNiwxMjksMTEyLDI0MiwyMjksMTEwLDEyOCwgMzYsMTY4LAotICAgIDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTcxLDExNSwgIDIsMTI5LDEyNywxMjksMTM2LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTc5LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsCi0gICAgMjQ2LDIzOSwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLDExMSwxMTcsMTQxLCAgMCwxODEsMTI5LAotICAgIDE4NSwxMjksMTg5LDEyOSwxOTksMTI5LDIyMywxMjksMjMzLDEyOSwyNTUsMTMwLCAxMCwxMzAsIDM1LDEzMCwKLSAgICAgNTgsMTMwLCA2OCwxMzAsIDk4LDEzMCwxNjIsMTMwLDE3MiwgNDksMTI4LCAgMCwxODEsMjI1LDI0MywyNDEsCi0gICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMwLDIyNywxMDQsICAyLDEyOSwyMDYsMTI5LDIxNiwyMzEsMjQyLAotICAgIDIyOSwyMjUsMjQ0LDIyOSwxMTQsMTI4LCAzNCwxMDcsMjM2LDIyOSwyNDMsMTE1LDEyOCwgMzQsMTA2LDIzMCwKLSAgICAyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE0MCwxMDMsICAyLDEyOSwyMzksMTI5LDI0NiwyNDIsCi0gICAgMjI5LDIyOSwxMDcsMTI4LCAgMywxODgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDEsMjMyLAotICAgIDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyOCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwKLSAgICAyMzgsIDk3LDEyOSwgNDgsMjI0LDEzMCwgMjMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsCi0gICAgMTI4LDI1NSwxNDUsMTA4LCAgMiwxMzAsIDQxLDEzMCwgNTAsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LAotICAgICA1MSwxNDksMjQ0LDIzMywyNDAsMjM2LDEyMSwxMjgsICAwLDIxNSwyMzcsMjQzLDI0MSwyNDUsMjI1LDI0MiwKLSAgICAxMDEsMTI4LCA1MSwxNTUsMjM4LDIyNSwxMDQsICAyLDEzMCwgNzYsMTMwLCA4NSwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDE2MywyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxNjMsMTE1LCAgMiwxMzAsMTA0LDEzMCwxNTMsMjMzLCA5OSwgIDMsMTMwLDExMywxMzAsMTMwLDEzMCwKLSAgICAxNDEsMjI1LDIzNiwyMzgsMjM5LDI0NCwxMDEsMTI5LCAzOCwxMDYsMTMwLDEyNCwyMjgsMjI2LDEwOCwxMjgsCi0gICAgIDM4LDEwNywyMzAsMjM2LDIyNSwyNDQsMjQzLDIzMywyMzEsMTEwLDEyOCwgMzgsMTA5LDI0MywyMzIsMjI1LAotICAgIDI0MiwyNDAsMjQzLDIzMywyMzEsMTEwLDEyOCwgMzgsMTExLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMTc4LDI0NiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE4MiwyNDcsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwxODgsMTE4LCAgMiwxMzAsMTg4LDEzMCwyMDEsMjM3LDIyOSwyMzEsMjI1LAotICAgIDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTg1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMTgzLDExOSwgIDIsMTMwLDIxNiwxMzAsMjI5LDIzNywyMjksMjMxLDIyNSwyNDMsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDEwMSwxMjgsIDUxLDE5MSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE4OSwxMTAsMTUwLAotICAgICAgMCwxMTAsMTMxLCAzMCwxMzEsMTY0LDEzMSwxODgsMTMxLDI1NCwxMzIsIDIzLDEzMiwgODEsMTMyLCA5MSwKLSAgICAxMzIsMTU4LDEzMiwyMDEsMTM0LDIzNSwxMzQsMjUzLDEzNSwgMjIsMTM1LCA1MywxMzUsIDc5LDEzNSwxNDQsCi0gICAgMTM3LDEyNiwxMzcsMTM0LDEzNywxNTksMTM3LDE2NywxMzgsMTM1LDEzOCwxNDUsMTM4LDE1NSwgOTcsICA4LAotICAgIDEzMSwgNDgsMTMxLCA2OCwxMzEsIDc1LDEzMSwgODIsMTMxLDEwNywxMzEsMTE4LDEzMSwxNDMsMTMxLDE1NSwKLSAgICAgOTgsICAyLDEzMSwgNTQsMTMxLCA2MywyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2OCwyMzYsCi0gICAgIDk3LDEyOCwgMzQsICA3LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLCA2OCwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwgNDAsMjMxLDExNywgIDIsMTMxLCA4OSwxMzEsIDk4LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwKLSAgICAgMTAsMTY4LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDQwLDIzMiwyMzMsMjQyLDIyNSwyMzEsCi0gICAgMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LAotICAgIDIwMiwxMzEsMTMxLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTMzLDI0MCwKLSAgICAyMzksMjQzLDI0NCwyNDIsMjM5LDI0MCwyMzIsMTAxLDEyOCwgIDEsIDczLDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsMTI5LCA5OCwgIDIsMTMxLDE3MCwxMzEsMTgwLDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLAotICAgIDExMSwxMjgsIDQ5LCAxMSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwgIDAsMTYwLCA5OSwgIDQsMTMxLDE5OCwKLSAgICAxMzEsMjA1LDEzMSwyMTQsMTMxLDI0MSwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgNzIsMjI5LDIyOCwyMzMsCi0gICAgMjM2LDIzNiwgOTcsMTI4LCAgMSwgNzAsMjMzLDI0MiwgOTksICAyLDEzMSwyMjIsMTMxLDIyNywyMzYsMTAxLAotICAgIDEyOCwgMzYsMjIxLDI0NSwyMzcsMjMwLDIzNiwyMjksMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwKLSAgICAgNzUsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDcwLDIyOCwyMzksCi0gICAgMTE2LCAgMiwxMzIsICA2LDEzMiwgMTUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgNjksMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA3MSwxMDEsICAzLDEzMiwgMzEsMTMyLCA0MiwxMzIsIDY3LDIzMiwKLSAgICAyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDksMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsCi0gICAgMjM4LCA5NywxMjksIDQ4LDIwNSwxMzIsIDU1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LAotICAgIDEyOCwyNTUsMTM2LDI0NywyNDMsMjMyLDIyOSwyNDEsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsMTI4LCAzMiwKLSAgICAxNzAsMjMwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM5LDEwMywgIDIsMTMyLCA5NywxMzIsCi0gICAgMTQ3LCA5NywgIDMsMTMyLDEwNSwxMzIsMTE1LDEzMiwxMjIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMTUzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyNSwyMzEsMTE3LCAgMiwxMzIsMTI5LDEzMiwKLSAgICAxMzgsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTMsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsCi0gICAgMTI4LCAxMCwgMjUsMjM5LDIzOCwyMzEsMjQ1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAgNywxMDQsICAyLAotICAgIDEzMiwxNjQsMTMyLDE3NCwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNDcsMjM5LDIzOSwKLSAgICAxMDcsICAyLDEzMiwxODIsMTMyLDE4OSwyMzYsMjI5LDIzMCwxMTYsMTI4LCAgMiwxMTQsMjQyLDIyOSwyNDQsCi0gICAgMjQyLDIzOSwyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMiwxMTUsMTA1LCAgNCwxMzIsMjExLDEzMywxMjQsMTMzLAotICAgIDEzNSwxMzMsMTkzLDIyOSwyNDUsMTEwLCAgNywxMzIsMjI5LDEzMywgIDgsMTMzLCA0MCwxMzMsIDU0LDEzMywKLSAgICAgNjMsMTMzLCA5NiwxMzMsMTA5LCA5NywgIDIsMTMyLDIzNSwxMzIsMjUwLDIyNywyMzMsMjQyLDIyNywyMzYsCi0gICAgMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTExLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMTUsMjI3LDEwNSwgIDIsMTMzLCAxNSwxMzMsIDI3LDIyOSwKLSAgICAyNDUsMjI3LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDUzLDI0MiwyMjcsMjM2LDIyOSwyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCA5NywyMzIsMjMzLDIyOSwyNDUsMjMyLDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksIDU0LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDUyLDI0MCwKLSAgICAgOTcsICAyLDEzMywgNzAsMTMzLCA4NCwyMzgsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNDksMTA0LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICAxLAotICAgIDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEwMywyNDQsMjMzLDIzNSwKLSAgICAyMjksMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEwMiwyMzIsMjMzLDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTA3LDEwNywgIDIsMTMzLDE0MSwxMzMsMTY1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwMywxMzMsMTUzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKLSAgICAyNDQsMTA0LDEyOCwyNTUsMTM0LDIzMiwyMjUsMjMyLDIzMywxMTYsICAyLDEzMywxNzUsMTMzLDE4NiwyMzYsCi0gICAgMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTUzLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LAotICAgICA3NywyMzgsMTAxLDE0MSwgIDAsIDU3LDEzMywyMjQsMTMzLDIzMywxMzMsMjQzLDEzNCwgMTcsMTM0LCAyNCwKLSAgICAxMzQsIDQ5LDEzNCwgNzYsMTM0LDExMCwxMzQsMTIyLDEzNCwxMzMsMTM0LDE2NiwxMzQsMTc0LDEzNCwxODUsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDUsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMjM5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzYsMTA0LDEzMywyNTQsMjMzLDIzOCwKLSAgICAyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksCi0gICAgMTQ2LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDExMSwyMzEsMTE3LCAgMiwxMzQsIDMxLDEzNCwgNDAsMjM0LAotICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzksMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKLSAgICAxMTEsMjMyLCA5NywgIDIsMTM0LCA1NiwxMzQsIDY3LDIyNywyMzUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LCAgNiwxMDUsMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LCA0OCwgNDEsMTA1LCAgMiwxMzQsIDgyLAotICAgIDEzNCwxMDAsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwKLSAgICAxMTAsMTI4LCA1MCwgNDAsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTM3LDIzNywyMzksCi0gICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDI1LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LAotICAgIDIzNiwxMDEsMTI4LDI0NywgNTcsMTEyLCAgMiwxMzQsMTM5LDEzNCwxNDYsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgMzYsMTI0LDIyOSwxMTQsICAyLDEzNCwxNTMsMTM0LDE1OSwyMzMsMjM5LDEwMCwxMjgsIDM2LDE0NCwyNDMsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDksMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEyMCwyNDMsMjQ1LAotICAgIDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTIxLDExNiwgIDIsMTM0LDE5MSwxMzQsMjI5LDIyOSwKLSAgICAyMjksMTEwLCAgMiwxMzQsMTk5LDEzNCwyMDgsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMTQsCi0gICAgMTEyLCAgMiwxMzQsMjE0LDEzNCwyMjEsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTM0LDIyOSwyNDIsMjMzLAotICAgIDIzOSwxMDAsMTI4LCAzNiwxNTQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgODksMTA2LDEyOSwgIDEsMjA0LDEzNCwKLSAgICAyNDEsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgOTAsMjM1LDIyNSwyNDQsCi0gICAgMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDI0MywxMzUsIDEwLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLAotICAgIDIyOCwyNDQsMTA0LDEyOCwyNTUsMTU3LDEwOCwgIDIsMTM1LCAyOCwxMzUsIDQyLDIyOSwyMzEsMjQyLDIzMywKLSAgICAyMzEsMjMyLDI0NCwyMzYsMjM5LDIzOCwxMDMsMTI4LCAgMSwxNTgsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLCA3MywxMDksICAyLDEzNSwgNTksMTM1LCA3MCwyMzksMjM4LDIzOSwyNDMsMjQwLAotICAgIDIyNSwyMjcsMTAxLDEyOCwyNTUsIDc4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTU0LDExMCwKLSAgICAgIDIsMTM1LCA4NSwxMzUsMTM1LCA5NywgIDMsMTM1LCA5MywxMzUsMTAzLDEzNSwxMTAsMjI2LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTYzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAzNSwyMzEsMTE3LAotICAgICAgMiwxMzUsMTE3LDEzNSwxMjYsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNjMsMjQyLDIzNywKLSAgICAyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzUsMjM4LDIyNSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDEsCi0gICAgMTExLCAgNiwxMzUsMTU4LDEzNSwxNjksMTM1LDE5NCwxMzUsMjM1LDEzNiwxODcsMTM3LDExNCwyMzIsMjMzLAotICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTEwLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwKLSAgICAgOTcsMTI5LCA0OCwyMDYsMTM1LDE4MiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsCi0gICAgMjU1LDEzNywxMTAsICAzLDEzNSwyMDIsMTM1LDIxOCwxMzUsMjI3LDIyNiwyNDIsMjI5LDIyNSwyMzUsMjMzLAotICAgIDIzOCwyMzEsMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsICAwLDE2MCwyMjksMjM4LDI0NCwyMzIsMjI1LDEwNSwKLSAgICAxMjgsIDE0LCAxOSwyNDUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDI1LDIzOSwxMTAsICA3LDEzNSwyNTIsCi0gICAgMTM2LCAgNSwxMzYsIDE5LDEzNiwgNTMsMTM2LCA2OSwxMzYsMTEwLDEzNiwxNjksMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LCAgNiwgNzAsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsMjU0LDIzMCwyMzEsMjMyLDI0NSwyMzgsMjM4LCA5NywgIDIsMTM2LCAzMCwxMzYsIDM5LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTg2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1MSwxNTksMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTQsMjMxLDIzNCwyMjksMjI5LDIzNywxMDUsICAyLDEzNiwgNzksMTM2LCA5NCwyMzgsCi0gICAgMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIxMCwyNDMsMjM5LAotICAgIDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwgNzUsMjM3LDEwMSwKLSAgICAgIDIsMTM2LDExNywxMzYsMTMwLDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgMjU0LDIzMiwyMjksMjM3LDEwNSwgIDIsMTM2LDEzOCwxMzYsMTUzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMjEzLDI0MywyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA3OCwyMzgsMjM5LDIzOSwyMzgsMjMwLDIzMywyMzgsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDE0MSwxMTYsICA3LDEzNiwyMDMsMTM2LAotICAgIDIxNCwxMzYsMjQzLDEzNywgMjIsMTM3LCAzNCwxMzcsIDU0LDEzNywgODAsMjI3LDIzOSwyMzgsMjQ0LDIyNSwKLSAgICAyMzMsMjM4LDExNSwxMjgsIDM0LCAxMiwxMDEsICAyLDEzNiwyMjAsMTM2LDIzNiwyMzYsMjI5LDIzNywyMjksCi0gICAgMjM4LDExNiwxMjksIDM0LCAgOSwxMzYsMjMxLDIzOSwxMDIsMTI4LCAzNCwgIDksMjQxLDI0NSwyMjUsMTA4LAotICAgIDEyOCwgMzQsIDk2LDIzMSwyNDIsMjI5LDIyNSwyNDQsMjI5LDExNCwxMjksIDM0LDExMSwxMzYsMjU1LDIzOCwKLSAgICAyMzksMTE0LCAgMiwxMzcsICA3LDEzNywgMTUsMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LDExMywyMzYsCi0gICAgMjI5LDI0MywxMTUsMTI4LCAzNCwxMjEsMjMzLDIyOCwyMjksMjM4LDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LAotICAgICAzNCwgOTgsMjM2LDIyOSwyNDMsMTE1LDEyOSwgMzQsMTEwLDEzNywgNDMsMjM4LDIzOSwyNDIsMjI5LDI0MSwKLSAgICAyNDUsMjI1LDEwOCwxMjgsIDM0LDExMiwxMTIsICAyLDEzNywgNjAsMTM3LCA3MCwyMjUsMjQyLDIyNSwyMzYsCi0gICAgMjM2LDIyOSwxMDgsMTI4LCAzNCwgMzgsMjQyLDIyOSwyMjcsMjI5LDIyOCwyMjksMTE1LDEyOCwgMzQsMTI4LAotICAgIDI0MywxMTcsICAzLDEzNywgODksMTM3LCA5NiwxMzcsMTA1LDIyNiwyNDMsMjI5LDExNiwxMjgsIDM0LDEzMiwKLSAgICAyMjcsMjI3LDIyOSwyMjksMjI4LDExNSwxMjgsIDM0LDEyOSwyNDAsMjI5LDI0MiwyNDMsMjI5LDExNiwxMjgsCi0gICAgIDM0LDEzMywyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExOCwyNDAsMjI1LAotICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTY5LDExNSwgIDIsMTM3LDE0MCwxMzcsMTQ5LDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMTAxLDEyOCwgNTEsMTc3LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEyNywyNDQsCi0gICAgMjMzLDIzNiwyMjgsMTAxLDEyOCwgIDAsMjQxLDExNywxMzIsICAzLDE4OSwxMzcsMTc5LDEzNywxOTAsMTM4LAotICAgICAxNSwxMzgsIDk4LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDgsMTA3LCAgMiwKLSAgICAxMzcsMTk2LDEzNywyMjAsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjA0LDEzNywyMDgsCi0gICAgMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMzUsMjQ0LCA5NywgIDMsMTM3LAotICAgIDIyOSwxMzcsMjM5LDEzNywyNDYsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTg4LDIyOCwKLSAgICAyMjksMjQ2LCA5NywxMjgsICA5LCA2MCwyMzEsMTE3LCAgMiwxMzcsMjUzLDEzOCwgIDYsMjM0LDIyNSwyNDIsCi0gICAgMjI1LDI0NCwxMDUsMTI4LCAxMCwxODgsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNjAsMTA5LAotICAgICAgMiwxMzgsIDIxLDEzOCwgNTUsMjI2LDIyOSwyNDIsMjQzLDIzMywyMzEsMTEwLDEzMCwgIDAsIDM1LDEzOCwKLSAgICAgMzUsMTM4LCA0NywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgMywyNDMsCi0gICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDk1LDIyOSwxMTQsICAyLDEzOCwgNjIsMTM4LCA5NCwyMjUsMjM2LAotICAgIDI0MywyMzMsMjMxLDExMCwgIDIsMTM4LCA3MywxMzgsIDgxLDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywKLSAgICAxMTYsMjM2LDIzOSwyNDcsMjI5LDI0MiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMTE3LDExMSwxMjgsCi0gICAgIDMzLCAyMiwxMTAsMTMwLCAgNSwyMjQsMTM4LDEwNiwxMzgsMTI2LDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LAotICAgIDEyOSwyNTEsIDY0LDEzOCwxMTcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNjQsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMjQsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsCi0gICAgMTgxLDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE4NywyNDksIDk3LCAgMywxMzgsMTY0LAotICAgIDEzOCwxNzQsMTM4LDE4MSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTgsMjI4LDIyOSwKLSAgICAyNDYsIDk3LDEyOCwgIDksIDMwLDIzMSwxMTcsICAyLDEzOCwxODgsMTM4LDE5NywyMzQsMjI1LDI0MiwyMjUsCi0gICAgMjQ0LDEwNSwxMjgsIDEwLDE1OCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzMCwxMTEsMTQ3LAotICAgICAgMCwxMTEsMTM4LDI0OCwxMzksIDE0LDEzOSwgOTIsMTQwLCAgNiwxNDAsIDc4LDE0MCwgOTMsMTQwLDEzMywKLSAgICAxNDEsICAwLDE0MSwgMjEsMTQxLCA1OSwxNDEsIDcwLDE0MSwyNDgsMTQzLCA4MiwxNDMsMTQ2LDE0MywxNzksCi0gICAgMTQzLDIyNSwxNDQsIDk4LDE0NCwxNDUsMTQ0LDE1NywgOTcsICAyLDEzOCwyNTQsMTM5LCAgNSwyMjcsMjQ1LAotICAgIDI0NCwxMDEsMTI4LCAgMCwyNDMsMjM4LDIzMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDUsIDk4LCAgNCwKLSAgICAxMzksIDI0LDEzOSwgNjYsMTM5LCA3NSwxMzksIDg1LDIyNSwyNDIsMjQyLDIyOSwxMDAsMTMwLCAgMiwxMTcsCi0gICAgMTM5LCAzNiwxMzksIDQ3LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMzMsMjI4LAotICAgIDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMjM1LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTQ3LDIzOSwyNDAsMjM5LDIzNywyMzksCi0gICAgMjMwLDExMSwxMjgsIDQ5LCAyNywyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMSwgNzksIDk5LCAgMywxMzksMTAwLAotICAgIDEzOSwxNzMsMTM5LDI1MiwgOTcsICAyLDEzOSwxMDYsMTM5LDE2NywyMzgsMjI4LDI0MiwgOTcsICAzLDEzOSwKLSAgICAxMTcsMTM5LDEyNCwxMzksMTM1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxNywyMzEsMjQ1LDIzNCwyMjUsCi0gICAgMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQ1LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLAotICAgICAgMiwxMzksMTQ5LDEzOSwxNTYsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDczLDIzMSwyNDUsMjM0LDIyNSwKLSAgICAyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMDEsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMTAsMjMzLDI0MiwgOTksCi0gICAgICAyLDEzOSwxODEsMTM5LDE4NiwyMzYsMTAxLDEyOCwgMzYsMjIyLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLAotICAgIDEzMywgIDAsMjQ0LDEzOSwyMDUsMTM5LDIxMywxMzksMjI0LDEzOSwyMzIsMTM5LDI0NCwyMjUsMjI3LDI0NSwKLSAgICAyNDQsMTAxLDEyOCwgMzAsMjA5LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyMTcsCi0gICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIxMSwyMzIsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LAotICAgIDEwMSwxMjgsIDMwLDIxMywyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMjE1LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCA2MiwxMDAsICA0LDE0MCwgMTYsMTQwLCAzOSwxNDAsIDQ1LDE0MCwgNjgsCi0gICAgMjI2LDEwOCwgIDIsMTQwLCAyMywxNDAsIDMxLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgODEsMjMxLAotICAgIDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAxMywyMjksMjQ2LCA5NywxMjgsICA5LCAxOSwyMzMsMjI5LDI0MiwKLSAgICAyMjksMjQzLDIzMywxMTUsMTI5LCAgMCwyNDYsMTQwLCA1NywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsMjMxLDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDIwNSwxMDEsMTI5LAotICAgICAgMSwgODMsMTQwLCA4NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5MCwxMDMsICAzLDE0MCwKLSAgICAxMDEsMTQwLDExNiwxNDAsMTIzLDIzOSwyMzgsMjI5LDEwNywxMjksICAyLDIxOSwxNDAsMTEwLDIyNywyMzcsCi0gICAgIDk4LDEyOCwgIDMsIDQwLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAwLDI0MiwyNDUsMjM0LDIyNSwyNDIsMjI1LAotICAgIDI0NCwxMDUsMTI4LCAxMCwxNDcsMTA0LCAgNCwxNDAsMTQzLDE0MCwxNTQsMTQwLDE2NCwxNDAsMjQyLDIyNSwKLSAgICAyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzMsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCi0gICAgIDk3LDEyOCwgNDgsIDc0LDExMSwgIDIsMTQwLDE3MCwxNDAsMTgwLDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LAotICAgIDEwMSwxMjgsIDMwLDIwNywyNDIsMTEwLDEzMywgIDEsMTYxLDE0MCwxOTUsMTQwLDIwMywxNDAsMjE0LDE0MCwKLSAgICAyMjIsMTQwLDIzNCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjE5LDIyOCwyMzksMjQ0LDIyNiwyMjksCi0gICAgMjM2LDIzOSwxMTksMTI4LCAzMCwyMjcsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIyMSwyMzIsMjM5LAotICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIyMywyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwKLSAgICAgMzAsMjI1LDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwxMTYsMTI4LCAgMSwgODEsCi0gICAgMTA1LDEyOSwgIDEsMTYzLDE0MSwgIDYsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgMTUsMTA3LCAgMiwxNDEsIDI3LDE0MSwgNTEsMjI1LDI0NCwyMjUsMjM1LDIyNSwKLSAgICAyMzgsIDk3LDEyOSwgNDgsMTcwLDE0MSwgMzksMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsCi0gICAgMTI4LDI1NSwxMTcsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA4NywyMzYsMjI5LDIzMiwyMjksMjI2LAotICAgIDI0MiwyMjksMTE5LDEyOCwgIDUsMTcxLDEwOSwgIDYsMTQxLCA4NCwxNDEsMTEyLDE0MSwxMTksMTQxLDIwOCwKLSAgICAxNDEsMjE5LDE0MSwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMzAsICAxLCA3NywxNDEsIDk2LDE0MSwxMDQsCi0gICAgMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA4MywyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsIDgxLAotICAgIDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA4MCwyMjksMjMxLCA5NywxMzMsICAzLDIwMSwxNDEsMTM1LDE0MSwKLSAgICAxMzksMTQxLDE1MCwxNDEsMTY0LDE0MSwxODAsIDQ5LDEyOCwgIDMsMjE0LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwgOTcsMjM2LDIyNSwyNDQsMjMzLDIzOCwyMjcsMjM2LDIzOSwyNDMsMjI5LAotICAgIDEwMCwxMjgsICAyLDExOSwyNDIsMjM5LDI0NSwyMzgsMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwxMjMsMTE2LCAgMiwxNDEsMTg2LDE0MSwyMDEsMjMzLDI0NCwyMzYsMjM5LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjUsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMjA2LAotICAgIDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMDgsMjMzLDIyNywyNDIsMjM5LDExMCwKLSAgICAxMjksICAzLDE5MSwxNDEsMjI5LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywyMDQsMjM5LDIzOCwyMzksCi0gICAgMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA3OSwyMzgsMTAxLDE0NSwgIDAsIDQ5LDE0MiwgMzEsMTQyLAotICAgICA0MCwxNDIsIDUwLDE0MiwgODAsMTQyLDEwNSwxNDIsMTE0LDE0MiwxMjMsMTQyLDE0OCwxNDIsMTgyLDE0MiwKLSAgICAyMTYsMTQyLDIyOCwxNDIsMjQ3LDE0MywgIDIsMTQzLCAzNSwxNDMsIDQ1LDE0MywgNTMsMTQzLCA2NCwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5NywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LAotICAgICAgOSwyMzEsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI5LCAzNiwgOTYsMTQyLCA2MSwyMzMsMjM4LDI0NiwKLSAgICAyMjksMjQyLDI0MywyMjksMjQzLDIyNSwyMzgsMjQzLDI0MywyMjksMjQyLDIzMywxMDIsMTI4LCAzOSwxMzgsCi0gICAgMTAwLCAgMiwxNDIsIDg2LDE0MiwgOTIsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMDMsMjM5LDI0NCwyMjksMjM4LAotICAgIDIzNiwyMjksMjI1LDIyOCwyMjksMTE0LDEyOCwgMzIsIDM2LDIyOSwyMzMsMjMxLDIzMiwyNDQsMTA0LDEyOCwKLSAgICAgMzMsIDkxLDIzMCwyMzMsMjQ0LDI0NCwyMjksMTAwLDEyOCwyNDYsMjIwLDIzMSwxMTcsICAyLDE0MiwxMzAsCi0gICAgMTQyLDEzOSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIzMSwyNDIsMjM3LDI0NSwyMzUsMjMyLAotICAgIDEwNSwxMjgsIDEwLDEwMywyMzIsIDk3LCAgMywxNDIsMTU3LDE0MiwxNjgsMTQyLDE3MywyMjcsMjM1LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk3LDIzNiwxMDIsMTI4LCAgMCwxODksMjM4LDIzMSwyNTAsCi0gICAgMjMyLDIzOSwxMTcsMTI4LCA0OCwgMzMsMTA1LCAgMiwxNDIsMTg4LDE0MiwyMDYsMjI4LDIyOSwyMzksMjMxLAotICAgIDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgMzIsMjM4LDIzMCwKLSAgICAyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTI5LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsIDE3LDIzOCwyNDUsMjM3LDIyOSwyNDIsMjI1LDI0NCwyMzksMjQyLDIyNiwyMjksMjM4LAotICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0NCwyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwKLSAgICAyNDcsIDQ5LDExMiwgIDIsMTQzLCAgOCwxNDMsIDE1LDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDExNiwyMjksCi0gICAgMTE0LCAgMiwxNDMsIDIyLDE0MywgMjgsMjMzLDIzOSwxMDAsMTI4LCAzNiwxMzYsMjQzLDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDYsMjQxLDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDExNCwxMjgsICAwLDE4OCwyNDIsMjM5LDIzNywKLSAgICAyMjUsMTEwLDEyOCwgMzMsMTEyLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMCwxODUsCi0gICAgMjQ0LDEwNCwgIDIsMTQzLCA3MSwxNDMsIDc2LDIyNSwxMDUsMTI4LCAxNCwgODEsMjMzLDI0MiwxMDAsMTI4LAotICAgICAzMywgODMsMTExLCAgMywxNDMsIDkwLDE0MywxMjQsMTQzLDE0MCwxMDMsICAyLDE0MywgOTYsMTQzLDExNCwKLSAgICAyMzksMjM4LDIyOSwxMDcsMTI5LCAgMSwyMzUsMTQzLDEwNSwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsCi0gICAgICAxLDIzNywyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMTksMjM3LDIyNSwyNDQsMjQyLAotICAgIDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDc1LDI0MCwyMjksMTEwLDEyOCwKLSAgICAgIDIsIDg0LDExMiwgIDMsMTQzLDE1NCwxNDMsMTYxLDE0MywxNzIsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsCi0gICAgMTcwLDIyOSwyMzgsMjI2LDI0NSwyMzYsMjM2LDIyOSwxMTYsMTI4LCAzNywyMzAsMjQ0LDIzMywyMzksMTEwLAotICAgIDEyOCwgMzUsIDM3LDExNCwgIDIsMTQzLDE4NSwxNDMsMjE0LDEwMCwgIDIsMTQzLDE5MSwxNDMsMjAyLDIzMCwKLSAgICAyMjksMjM3LDIzMywyMzgsMjMzLDIzOCwxMDEsMTI4LCAgMCwxNzAsMjM3LDIyNSwyNDMsMjI3LDI0NSwyMzYsCi0gICAgMjMzLDIzOCwxMDEsMTI4LCAgMCwxODYsMjQ0LDIzMiwyMzksMjMxLDIzOSwyMzgsMjI1LDEwOCwxMjgsIDM0LAotICAgICAzMSwxMTUsICA1LDE0MywyMzcsMTQ0LCAxMywxNDQsIDMwLDE0NCwgNzUsMTQ0LCA4OCwyMzIsMjM5LDI0MiwKLSAgICAxMTYsICAyLDE0MywyNDYsMTQzLDI1MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMTgsMjQ2LDIzOSwyNDcsCi0gICAgMjI5LDIzNiwyNDMsMjMzLDIzMSwyMzgsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDc0LDIzNiwyMjUsMjQzLAotICAgIDEwNCwxMjksICAwLDI0OCwxNDQsIDIyLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwyNTUsMjM3LDIyNSwKLSAgICAyMzYsMTA4LCAgMiwxNDQsIDM5LDE0NCwgNTAsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsCi0gICAgIDQ4LCA3MywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTY5LDE0NCwgNjMsMjMyLAotICAgIDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMDcsMjQ0LDI0MiwyMzksMjM1LDIyOSwKLSAgICAyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMjU1LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsCi0gICAgMjQ2LDI0MCwxMTYsICAyLDE0NCwxMDQsMTQ0LDExNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMTI3LDIzMywyMzYsMjI4LDEwMSwxMzAsICAwLDI0NSwxNDQsMTI2LDE0NCwxMzQsMjI1LDIyNywKLSAgICAyNDUsMjQ0LDEwMSwxMjgsIDMwLCA3NywyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsCi0gICAgIDc5LDI0NSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDMzLDExOCwgIDIsMTQ0LAotICAgIDE2MywxNDQsMjQ0LDIyOSwxMTQsICAyLDE0NCwxNzAsMTQ0LDIzNiwyMzYsMjMzLDIzOCwxMDEsMTMxLCAzMiwKLSAgICAgNjIsMTQ0LDE4MywxNDQsMjA2LDE0NCwyMjksIDk5LCAgMiwxNDQsMTg5LDE0NCwyMDEsMjI5LDIzOCwyNDQsCi0gICAgMjI5LDI0MiwyMzYsMjMzLDIzOCwxMDEsMTI4LDI1NCwgNzQsMjM3LCA5OCwxMjgsICAzLCAgNSwxMDAsICAyLAotICAgIDE0NCwyMTIsMTQ0LDIyMCwyMjUsMjQzLDIzMiwyMjksMTAwLDEyOCwyNTQsIDczLDIyNiwyMzYsMjQ3LDIyNSwKLSAgICAyNDYsMTIxLDEyOCwyNTQsIDc2LDI0NywyMjUsMjQ2LDEyMSwxMjgsMjU0LCA3NSwyNDMsMjI3LDIzOSwyNDIsCi0gICAgMTAxLDEyOCwgIDAsMTc1LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLDE0NSwgIDMsMTQ1LAotICAgICAxMywxNDUsIDIwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIwMywyMjgsMjI5LDI0NiwKLSAgICAgOTcsMTI4LCAgOSwgNzUsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIwMywxMTIsCi0gICAgMTQ1LCAgMCwxMTIsMTQ1LCA2OSwxNDcsMTk3LDE0NywyMDgsMTQ3LDIxNywxNDcsMjI5LDE0OSwxNTQsMTQ5LAotICAgIDE2NCwxNTAsMTU2LDE1MSwxNzUsMTUyLCAgOSwxNTIsIDM1LDE1MiwxNjYsMTUyLDE3NCwxNTMsIDc2LDE1MywKLSAgICAxMzQsMTUzLDE2MiwxNTMsMTcyLCA5NywgMTQsMTQ1LCA5OSwxNDUsMTMxLDE0NSwxNDEsMTQ1LDE0OCwxNDUsCi0gICAgMTU1LDE0NSwyMDMsMTQ1LDIxNCwxNDUsMjI4LDE0NSwyMzksMTQ2LCAzMCwxNDYsIDQ0LDE0NywgNTYsMTQ3LAotICAgICA5NSwxNDcsMTg1LCA5NywgIDIsMTQ1LDEwNSwxNDUsMTE3LDIzNywyNDAsMjQzLDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMTAxLDEyOCwgNTEsMTI4LDI0MywyMjksMjM4LDI0NCwyMzksMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCi0gICAgMTI4LCA1MSwgNDMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTcwLDIyNywyNDUsMjQ0LAotICAgIDEwMSwxMjgsIDMwLCA4NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDIsMTAzLCAgMiwxNDUsMTYxLDE0NSwKLSAgICAxNzksMTAxLCAgMiwxNDUsMTY3LDE0NSwxNzQsMjI4LDIzOSwyNDcsMTEwLDEyOCwgMzMsMjIzLDI0NSwxMTIsCi0gICAgMTI4LCAzMywyMjIsMTE3LCAgMiwxNDUsMTg1LDE0NSwxOTQsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LAotICAgICAxMCwxNzAsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNDIsMjMyLDIzMywyNDIsMjI1LDIzMSwKLSAgICAyMjUsMjM4LCA5NywxMjgsIDQ4LDExMywyMzMsMjQ5LDIyNSwyMzgsMjM4LDIzOSwyMzMsMjQ0LDIzMiwyMjUsCi0gICAgMTA1LDEyOCwgMTQsIDQ3LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMDksMTA4LAotICAgICAgMiwxNDUsMjQ1LDE0NiwgMTQsMjI1LDI0NCwyMjUsMjM2LDIzMywyNTAsMjI1LDI0NCwyMzMsMjM5LDIzOCwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsMjI3LDIyNywyMzcsIDk4LDEyOCwgIDQsMTMyLDIzOSwyMjcsCi0gICAgMjMyLDIzNSwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE5MiwyMzgsMjQzLAotICAgIDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTI3LDExNCwgIDMsMTQ2LCA1MiwKLSAgICAxNDYsIDczLDE0NywgNDUsIDk3LCAgMiwxNDYsIDU4LDE0NiwgNjYsMjMxLDI0MiwyMjUsMjQwLDEwNCwxMjgsCi0gICAgICAwLDE4MiwyMzYsMjM2LDIyOSwxMDgsMTI4LCAzNCwgMzcsMjI5LDExMCwgIDIsMTQ2LCA4MCwxNDYsMTkwLAotICAgIDIzNiwyMjksMjMwLDExNiwxMzYsICAwLCA0MCwxNDYsMTAzLDE0NiwxMTgsMTQ2LDEyMywxNDYsMTI4LDE0NiwKLSAgICAxMzksMTQ2LDE1MSwxNDYsMTc0LDE0NiwxNzksMjI1LDIzNiwyNDQsMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LDI1MywgNjIsMjI2LDExNiwxMjgsMjQ4LDIzNywyMjksMTIwLDEyOCwyNDgsMjM2LAotICAgIDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxNDEsMjM3LDIzOSwyMzgsMjM5LDI0MywKLSAgICAyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgIDgsMTE1LCAgMiwxNDYsMTU3LDE0NiwxNjQsMjM3LDIyNSwyMzYsCi0gICAgMTA4LDEyOCwyNTQsIDg5LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEyNSwyNDQsMTEyLAotICAgIDEyOCwyNDgsMjM1LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTMsMjQyLDIzMywKLSAgICAyMzEsMjMyLDExNiwxMzYsICAwLCA0MSwxNDYsMjE0LDE0NiwyMjksMTQ2LDIzNCwxNDYsMjM5LDE0NiwyNTAsCi0gICAgMTQ3LCAgNiwxNDcsIDI5LDE0NywgMzQsMjI1LDIzNiwyNDQsMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1MywgNjMsMjI2LDExNiwxMjgsMjQ4LDI0OCwyMjksMTIwLDEyOCwyNDgsMjQ3LDIzMywKLSAgICAyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxNDIsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsCi0gICAgMjI1LDIyNywxMDEsMTI4LDI1NSwgIDksMTE1LCAgMiwxNDcsIDEyLDE0NywgMTksMjM3LDIyNSwyMzYsMTA4LAotICAgIDEyOCwyNTQsIDkwLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEyNiwyNDQsMTEyLDEyOCwKLSAgICAyNDgsMjQ2LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTQsMjQ0LDIzMywyMjUsCi0gICAgMjM2LDIyOCwyMzMsMjMwLDEwMiwxMjgsIDM0LCAgMiwxMTUsICAzLDE0NywgNjQsMTQ3LCA3NSwxNDcsIDg3LAotICAgIDIyOSwyNDEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTIsMjMyLDI0NCwyMjUsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2OSwyNDQsCi0gICAgMjI1LDEwNCwxMzQsICA1LDE4MywxNDcsMTEzLDE0NywxMjcsMTQ3LDEzMiwxNDcsMTQxLDE0NywxNTYsMTQ3LAotICAgIDE3MiwgNDksICAyLDE0NywxMTksMTQ3LDEyMywgNDksMTI4LCAgNSwxODMsMTAwLDEyOCwgIDUsMTgzLDE3OCwKLSAgICAgOTcsMTI4LCAgNSwxODMsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODMsMjM4LDIyNSwyNDIsCi0gICAgMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODMsMjQxLDI0NSwyMjUsMjQyLAotICAgIDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgzLDI0NywyMzMsMjI4LDIyOSwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MywyNTAsMjI5LDI0MiwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDE2MSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksICA2LAotICAgIDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjIzLDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgMzAsIDg3LDEwMSwxMzcsICA1LDIyOCwxNDcsMjUxLDE0OCwgIDYsMTQ4LCAyNiwxNDgsCi0gICAgIDM4LDE0OCwgNTgsMTQ4LDE2MCwxNDgsMTcxLDE0OCwxOTIsMTQ5LDE0NywyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsIDYzLDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDY4LDE0OCwKLSAgICAgMTcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNjgsMjI5LDI1MCwyMzMsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwgNTksMjMwLDIzMywyMzgsMjI1LDIzNiwyMjgsMjI1LDIzMSwyMjksMjQzLAotICAgIDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2NywxMDQsICA1LDE0OCwgNzAsMTQ4LCA5MywKLSAgICAxNDgsMTAxLDE0OCwxMTUsMTQ4LDE0NSwyMjUsMTE0LCAgMiwxNDgsIDc3LDE0OCwgODQsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwgIDYsMTI2LDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTIyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwyMjgsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsMjUxLCA4NywxMDUsICAyLDE0OCwxMjEsMTQ4LDEzNiwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLCA4OCwyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LAotICAgIDEyMiwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLCA4OSwKLSAgICAyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjE4LDIzNywyMzMsMjI4LDIyOCwyMzYsCi0gICAgMjI5LDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTY3LAotICAgIDExNCwgIDUsMTQ4LDIwNCwxNDgsMjE2LDE0OSwgIDIsMTQ5LDEyMywxNDksMTM2LDIyNSwyMzAsMjI5LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDc4LDIyNywyMjksMjM4LDExNiwxMzEsICAwLCAzNywxNDgsCi0gICAgMjI5LDE0OCwyMzgsMTQ4LDI1MCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwNiwyMzcsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKLSAgICAyNTQsMTA2LDEwNSwgIDIsMTQ5LCAgOCwxNDksMTA1LDIzOSwxMDAsMTM0LCAgMCwgNDYsMTQ5LCAyNSwxNDksCi0gICAgIDM2LDE0OSwgNDcsMTQ5LCA1OSwxNDksIDcwLDE0OSwgODIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LAotICAgIDExMCwxMjgsICA1LDEzNywyMjcsMjI5LDIzOCwyNDQsMjI5LDI0MiwyMjksMTAwLDEyOCwgIDAsMTgzLDIzMiwKLSAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsIDk3LDIzMywyMzgsMjMwLDIyOSwyNDIsCi0gICAgMjMzLDIzOSwxMTQsMTI4LDI0NiwyMzEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgMTQsMTE1LCAgMiwxNDksIDg4LDE0OSwgOTUsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDgyLDI0NSwKLSAgICAyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzMiwyNDMsMjQwLDIzOSwyMzcsMjI5LDIzOCwyMzMsCi0gICAgMjMxLDI0MiwyMjksMjI5LDIzNSwyMjcsMjM3LCA5OCwxMjgsICAzLCA2NiwyNDAsMjI5LDIzOCwyMjgsMjMzLAotICAgIDIyNywyNDUsMjM2LDIyNSwxMTQsMTI4LCAzNCwxNjUsMjQ0LDIzMiwyMzksMjQ1LDI0MywyMjUsMjM4LDEwMCwKLSAgICAxMjgsIDMyLCA0OCwyNDMsMjI5LDI0NCwgOTcsMTI4LCAzMiwxNjcsMjMwLDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsMTM4LDEwNCwgIDMsMTQ5LDE3MiwxNDksMjIyLDE1MCwxMDMsIDk3LCAgMywxNDksMTgwLAotICAgIDE0OSwxOTAsMTQ5LDE5NywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNzEsMjI4LDIyOSwKLSAgICAyNDYsIDk3LDEyOCwgIDksIDQzLDIzMSwxMTcsICAyLDE0OSwyMDQsMTQ5LDIxMywyMzQsMjI1LDI0MiwyMjUsCi0gICAgMjQ0LDEwNSwxMjgsIDEwLDE3MSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA0MywxMDUsMTMzLAotICAgICAgMywxOTgsMTQ5LDIzNiwxNDksMjQwLDE1MCwgNzAsMTUwLCA3OCwxNTAsIDg5LCA0OSwxMjgsICAzLDIxMywKLSAgICAyMjksMjQ1LDI0MCwxMDQsICA0LDE0OSwyNTMsMTUwLCAzMiwxNTAsIDQ3LDE1MCwgNTYsIDk3LCAgMiwxNTAsCi0gICAgICAzLDE1MCwgMTgsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAotICAgICA1MCwxMjIsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAyNiwKLSAgICAyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEwOCwyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3NywyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNTAsIDEyLDIzNiwyMjUsMjQ0LDIzMywxMTAsMTI4LCAgMiwxMjAsMjM4LDI0NCwKLSAgICAyMzIsMjQ1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1OCwyNDMsMjQ5LDIzNywyMjYsMjM5LDIzNiwyMzEsCi0gICAgMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjEzLDExMSwgIDMsMTUwLDExMSwxNTAsMTE2LDE1MCwxNDIsMjM5LAotICAgIDEwNywxMjgsICAxLDE2NSwyNDAsMTA0LCAgMiwxNTAsMTIzLDE1MCwxMzIsMjI1LDIzOCwyNDQsMjMyLDIyNSwKLSAgICAxMDUsMTI4LCAxNCwgMzAsMjQ1LDIzOCwyMzEsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDI4LDI0MywyMjUsCi0gICAgMjM3LDI0MCwyMzIsMjI1LDIzOSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMzIsMTA1LDEzMywgIDMsMTkyLAotICAgIDE1MCwxNzAsMTUxLDEyNiwxNTEsMTM3LDE1MSwxNDgsMTUxLDE2MiwyMjksMjQ1LDExMiwgIDYsMTUwLDE4NiwKLSAgICAxNTAsMjIxLDE1MCwyNTMsMTUxLCAyNSwxNTEsIDM5LDE1MSwgOTEsIDk3LCAgMiwxNTAsMTkyLDE1MCwyMDcsCi0gICAgMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTUsMjQwLAotICAgIDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxOSwyMjcsMTA1LCAgMiwKLSAgICAxNTAsMjI4LDE1MCwyNDAsMjI5LDI0NSwyMjcsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTgsCi0gICAgMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTAxLDEwNywgIDIsMTUxLAotICAgICAgMywxNTEsIDE3LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwKLSAgICAxMTQsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2NiwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksCi0gICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICA1LDI0MywyMzMsMjM5LDExNSwgIDIsMTUxLCA0OCwxNTEsIDc2LAotICAgIDEwNywgIDIsMTUxLCA1NCwxNTEsIDY4LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA0OSwxMTYsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2OCwyNDQsMjMzLDIzNSwyMjksCi0gICAgMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDExNywxMTYsICAyLDE1MSwgOTcsMTUxLAotICAgIDExMiwyMzIsMjMzLDIyOSwyNDUsMjQ0LDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDExOSwKLSAgICAyMzMsMjM1LDIyOSwyNDUsMjQ0LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTE1LDIzMiwyMzMsCi0gICAgMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAotICAgICA5NywxMjgsIDQ4LDIxMiwyNDMsMjQ5LDIzNywyMjYsMjM5LDIzNiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwKLSAgICAgIDMsMjE0LDI0NywyNDIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzMSwyMzYsCi0gICAgMjQ1LDExNSwxMzIsICAwLCA0MywxNTEsMTg5LDE1MSwyMDAsMTUxLDIwOSwxNTEsMjQyLDIyNiwyMjksMjM2LAotICAgIDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMzEsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNCwKLSAgICAxNDksMTA5LCAgMiwxNTEsMjE1LDE1MSwyMjIsMjMzLDIzOCwyNDUsMTE1LDEyOCwgIDAsMTc3LDExMSwgIDIsCi0gICAgMTUxLDIyOCwxNTEsMjMyLDEwMCwxMjgsICAyLDIxNCwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgMTEsMTE1LCAgMiwxNTEsMjQ4LDE1MSwyNTUsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDk4LDI0NSwKLSAgICAyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEyMiwxMDksICAyLDE1MiwgMTUsMTUyLCAyNiwyMzksCi0gICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDgwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLAotICAgIDEyOCwgNTEsMjE2LDExMSwgIDUsMTUyLCA0NywxNTIsIDU4LDE1MiwxMjUsMTUyLDEzNiwxNTIsMTQ2LDIzMiwKLSAgICAyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMjUsMjMzLDIzOCwyNDQsMjMzLDIzOCwyMzEsCi0gICAgMjMzLDIzOCwyMjgsMjI5LDEyMCwgIDQsMTUyLCA3OCwxNTIsIDkwLDE1MiwxMDIsMTUyLDExNSwyMjgsMjM5LAotICAgIDI0NywyMzgsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCAzMSwyMzYsMjI5LDIzMCwyNDQsMjQ3LDIzMiwKLSAgICAyMzMsMjQ0LDEwMSwxMjgsIDM4LCAyOCwyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NywyMzIsMjMzLDI0NCwxMDEsCi0gICAgMTI4LCAzOCwgMzAsMjQ1LDI0MCwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzgsIDI5LDIzNSwyMjUsMjQ0LAotICAgIDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMjEsMjQwLDIzNiwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDI3LDI0MywyNDQsMjI1LDIzNiwyMzcsMjI1LDI0MiwxMDcsMTI5LCA0OCwgMTgsMTUyLDE1OSwyMzAsCi0gICAgMjI1LDIyNywxMDEsMTI4LCA0OCwgMzIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE3MSwxMTQsICAzLAotICAgIDE1MiwxODIsMTUyLDIwOCwxNTIsMjMzLDEwMSwgIDIsMTUyLDE4OCwxNTIsMTk2LDIyNywyMjksMjI4LDIyOSwKLSAgICAxMTUsMTI4LCAzNCwxMjIsMjQzLDIyNywyNDIsMjMzLDI0MCwyNDQsMjMzLDIzOSwxMTAsMTI4LCAzMywgMzAsCi0gICAgMjMzLDIzNywxMDEsICAyLDE1MiwyMTYsMTUyLDIyMiwyMzcsMjM5LDEwMCwxMjgsICAyLDE4NSwyNDIsMjI5LAotICAgIDI0NiwyMjksMjQyLDI0MywyMjksMTAwLDEyOCwgMzIsIDUzLDExMSwgIDQsMTUyLDI0MywxNTIsMjUwLDE1MywKLSAgICAgIDQsMTUzLCAxNywyMjgsMjQ1LDIyNywxMTYsMTI4LCAzNCwgMTUsMjM0LDIyOSwyMjcsMjQ0LDIzMywyNDYsCi0gICAgMTAxLDEyOCwgMzUsICA1LDIzNiwyMzksMjM4LDIzMSwyMjksMjI4LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LAotICAgIDI1MiwxMTIsICAyLDE1MywgMjMsMTUzLCA2MCwxMDEsICAyLDE1MywgMjksMTUzLCAzNiwyMzYsMjM2LDIzOSwKLSAgICAxMTQsMTI4LCAzNSwgMjQsMjQyLDI0MywxMTcsICAyLDE1MywgNDQsMTUzLCA1MSwyMjYsMjQzLDIyOSwxMTYsCi0gICAgMTI4LCAzNCwxMzAsMjQwLDIyOSwyNDIsMjQzLDIyOSwxMTYsMTI4LCAzNCwxMzEsMjM5LDI0MiwyNDQsMjMzLAotICAgIDIzOSwxMTAsMTI5LCAzNCwgNTUsMTUzLCA3MSwyMjUsMTA4LDEyOCwgMzQsIDI5LDExNSwgIDIsMTUzLCA4MiwKLSAgICAxNTMsMTI1LDEwNSwxMzAsICAzLDIwMCwxNTMsIDkwLDE1MywxMDEsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDExMywyMzYsMjMzLDI0MCwyMzgsMjI5LDI0NSwyMzcsMjI1LDI0NCwyMjUsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLDIyNywyMjcsMjM3LCA5OCwxMjgsICA0LDEzNCwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLDE3NiwxMTcsICAyLDE1MywxNDAsMTUzLDE1MSwyMzIsMjMzLDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTE5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwyMTUsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTgwLDI0NywyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLDE4NiwxMTMsMTM2LCAgMCwxMTMsMTUzLDIwMiwxNTQsMjUxLDE1NSwgIDYsCi0gICAgMTU1LCAxNSwxNTUsIDIyLDE1NSwgMzQsMTU1LCA3MiwxNTUsIDgwLCA5NywgIDQsMTUzLDIxMiwxNTMsMjM1LAotICAgIDE1NCwgNDMsMTU0LDIzNCwxMDAsICAyLDE1MywyMTgsMTUzLDIyNCwyMjksMjQ2LCA5NywxMjgsICA5LCA4OCwKLSAgICAyMzcsMjI1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTY4LDEwMiwgIDQsMTUzLDI0NSwxNTMsCi0gICAgMjU0LDE1NCwgMTIsMTU0LCAyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA2NiwyMzAsMjMzLAotICAgIDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjE0LDIzMywyMzgsMjMzLDI0NCwKLSAgICAyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxNSwyMzcsMjI5LDIyOCwyMzMsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxNiwyMzcsMjI1LDI0NCwxMTUsMTM2LAotICAgICAgNSwxODQsMTU0LCA2NiwxNTQsIDg2LDE1NCwxMDAsMTU0LDEwNSwxNTQsMTEwLDE1NCwxMTksMTU0LDEzNCwKLSAgICAxNTQsMjIxLCA0OSwgIDMsMTU0LCA3NCwxNTQsIDc4LDE1NCwgODIsIDQ4LDEyOCwgIDUsMTg0LCA5NywxMjgsCi0gICAgICA1LDE4NCwgOTksMTI4LCAgNSwxODQsIDUwLCAgMiwxNTQsIDkyLDE1NCwgOTYsIDU1LDEyOCwgIDUsMTg0LAotICAgICA1NywxMjgsICA1LDE4NCwxNzksIDUxLDEyOCwgIDUsMTg0LDIyOCwxMDEsMTI4LCAgNSwxODQsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsCi0gICAgMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMTEzLCAgMiwxNTQsMTQwLDE1NCwyMDYsMjI1LDI0NCwyMjUsMTEwLAotICAgICAgNCwxNTQsMTUzLDE1NCwxNjIsMTU0LDE3NywxNTQsMTkzLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMTg0LDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsCi0gICAgMTg0LDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LAotICAgIDE4NCwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMjQ1LDIyNSwKLSAgICAyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMjQ3LDIzMywyMjgsCi0gICAgMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg0LDI0MiwyMzgsMjI5LDI0OSwyNDAsMjI1LAotICAgIDI0MiwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTksMjI2LDIzOSwyNDAsMjM5LDIzNywKLSAgICAyMzksMjMwLDExMSwxMjgsIDQ5LCAxNywyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDIyNCwyMzIsCi0gICAgMjM5LDIzOSwxMDcsMTI4LCAgMiwxNjAsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgODEsMjM5LDEwMiwxMzAsICA1LDIzMSwxNTUsIDQzLDE1NSwgNjMsMjI4LDIyNSwyMzEsMjI5LDI0MywKLSAgICAxMDQsMTI5LDI1MSwgNzEsMTU1LCA1NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3MSwyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIzMSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTcyLAotICAgIDExNywgIDQsMTU1LCA5MCwxNTUsMTAyLDE1NSwxOTEsMTU2LCAyMiwyMjUsMjQyLDI0NCwyMjksMjQyLDIzOCwKLSAgICAyMzksMjQ0LDEwMSwxMjgsIDM4LDEwNSwyMjYsMjQ1LDI0NCwxMTUsMTM1LCAgNSwxODcsMTU1LDEyMywxNTUsCi0gICAgMTI4LDE1NSwxMzMsMTU1LDEzOCwxNTUsMTQ3LDE1NSwxNjIsMTU1LDE3OCwxNzcsIDU2LDEyOCwgIDUsMTg3LAotICAgIDE3OCwgNTMsMTI4LCAgNSwxODcsMTc5LCA0OSwxMjgsICA1LDE4NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE4NywyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE4NywyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxODcsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg3LDIyOSwKLSAgICAyNDMsMjQ0LDIzMywyMzksMTEwLDEzMywgIDAsIDYzLDE1NSwyMTAsMTU1LDIzMywxNTUsMjUwLDE1NiwgIDIsCi0gICAgMTU2LCAxNCwyMjUsMTE0LCAgMiwxNTUsMjE3LDE1NSwyMjQsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDMxLAotICAgIDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDk0LDIyOCwyMzksMjQ3LDExMCwxMjksICAwLDE5MSwKLSAgICAxNTUsMjQyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxOTEsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsCi0gICAgICAzLDEyNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAzMSwyNDMsMjM3LAotICAgIDIyNSwyMzYsMTA4LDEyOCwyNDcsIDYzLDIzOSwyNDQsMTAxLCAgNCwxNTYsIDM0LDE1NiwxMDUsMTU2LDEyNSwKLSAgICAxNTYsMTU0LDIyOCwyMjYsMTA4LDEzMywgIDAsIDM0LDE1NiwgNTAsMTU2LCA1NywxNTYsIDY0LDE1NiwgNzYsCi0gICAgMTU2LCA5NywyMjYsMjI1LDI0MywxMDEsMTI4LCAzMiwgMzAsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzIsIDI4LAotICAgIDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsICAyLDI0MCwyNDIsMjMzLDIzNywKLSAgICAxMDEsMTI5LCA0OCwgMzAsMTU2LCA4NiwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLDEyOCwgNDgsCi0gICAgIDI5LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMiwgMjksMjM2LDIyOSwyMzAsMTE2LDEyOSwgMzIsIDI0LAotICAgIDE1NiwxMTQsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsIDMyLCAyNywxMTQsICAyLDE1NiwKLSAgICAxMzEsMTU2LDE0MSwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI4LCAzMiwgMjcsMjMzLDIzMSwyMzIsCi0gICAgMTE2LDEyOSwgMzIsIDI1LDE1NiwxNTAsMTEwLDEyOCwgIDEsIDczLDI0MywyMzMsMjM4LDIzMSwxMDgsICAyLAotICAgIDE1NiwxNjQsMTU2LDE3MSwyMjYsMjI1LDI0MywxMDEsMTI4LCAzMiwgMjYsMTAxLDEyOSwgIDAsIDM5LDE1NiwKLSAgICAxNzcsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgIDcsMTE0LDE0NSwgIDAsCi0gICAgMTE0LDE1NiwyMjcsMTU3LDIzMSwxNTcsMjQyLDE1OCwgMzMsMTU4LCA4NCwxNTksMTAxLDE1OSwxMjUsMTU5LAotICAgIDIyMCwxNjEsMjU0LDE2MiwgMzUsMTYyLCA0NywxNjIsMTAxLDE2MiwxMDksMTYzLCAxNSwxNjMsIDI2LDE2MywKLSAgICAgNjEsMTYzLDE2MSwgOTcsIDExLDE1NiwyNTEsMTU3LCAgNiwxNTcsIDE2LDE1NywgMjMsMTU3LCA4OCwxNTcsCi0gICAgMTA0LDE1NywxMjksMTU3LDE0MCwxNTcsMTY1LDE1NywxODgsMTU3LDIyNSwyMjUsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsMTI0LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE3NiwKLSAgICAyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgODUsMTAwLCAgNCwxNTcsIDMzLDE1NywgMzksMTU3LCA1MywxNTcsCi0gICAgIDc5LDIyOSwyNDYsIDk3LDEyOCwgIDksIDQ4LDIzMywyMjcsMjI1LDEwOCwxMjksIDM0LCAyNiwxNTcsIDQ4LAotICAgIDIyOSwxMjAsMTI4LDI0OCwyMjksMjM5LDI0NiwyMjksMjQyLDI0MywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwKLSAgICAxMjksIDUxLDE3NCwxNTcsIDY5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE3NSwyNDMsCi0gICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE3MywyMzAsMTAxLDEyOSwgIDUsMTkxLDE1NywgOTUsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTEsMjMxLDExNywgIDIsMTU3LDExMSwxNTcsMTIwLDIzNCwKLSAgICAyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTc2LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCi0gICAgIDQ4LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMzcsMjM1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzMywxNTcsMTUzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKLSAgICAyNDQsMTA0LDEyOCwyNTUsMTUxLDIzNiwyMzksMjQ3LDIyOSwyNDIsMjI4LDIzMywyMjUsMjMxLDIzOSwyMzgsCi0gICAgMjI1LDIzNiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDEsMTA5LCAgMiwxNTcsMTk0LAotICAgIDE1NywyMTcsMjMzLDIyOCwyMjgsMjM2LDIyOSwyMjgsMjMzLDIyNSwyMzEsMjM5LDIzOCwyMjUsMjM2LDIyNiwKLSAgICAyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0MCwyNDMsMjMyLDIzOSwyNDIsMTEwLDEyOCwgIDIsCi0gICAgMTAwLDI0NCwyMzMsMTExLDEyOCwgMzQsIDU0LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LAotICAgICA0OSwgMjIsIDk5LCAgNCwxNTcsMjUyLDE1OCwgIDMsMTU4LCAxMiwxNTgsIDIwLDIyNSwyNDIsMjM5LDExMCwKLSAgICAxMjgsICAxLCA4OSwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA4NywyMzMsMjQyLDIyNywyMzYsCi0gICAgMTAxLDEyOCwgMzYsMjI1LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLAotICAgICA4NywxMDAsICAyLDE1OCwgMzksMTU4LCA0OSwyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwKLSAgICAgMTcsMjM5LDExNiwgIDIsMTU4LCA1NiwxNTgsIDY1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsCi0gICAgIDg5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwgOTEsMTU4LCA3NSwyMzcsMjI1LDIyNywyNDIsMjM5LAotICAgIDExMCwxMjgsIDMwLCA5MywxMDEsICA2LDE1OCwgOTgsMTU4LDE0MywxNTgsMTc4LDE1OCwyMzMsMTU5LCAgMiwKLSAgICAxNTksIDM1LDEwMiwgIDIsMTU4LDEwNCwxNTgsMTE3LDIyOSwyNDIsMjI5LDIzOCwyMjcsMjI5LDIzNywyMjUsCi0gICAgMjQyLDEwNywxMjgsIDMyLCA1OSwyMzYsMjI5LDI0OCwyNDMsMTE3LCAgMiwxNTgsMTI3LDE1OCwxMzQsMjI2LAotICAgIDI0MywyMjksMTE2LDEyOCwgMzQsMTM0LDI0MCwyMjksMjQyLDI0MywyMjksMTE2LDEyOCwgMzQsMTM1LDIzMSwKLSAgICAyMzMsMjQzLDI0NCwyMjksMTE0LCAgMiwxNTgsMTU0LDE1OCwxNTksMjI5LDEwMCwxMjgsICAwLDE3NCwxMTUsCi0gICAgICAyLDE1OCwxNjUsMTU4LDE3MSwyMjUsMjM4LDExNSwxMjgsMjQ4LDIzMiwyMjksMjQyLDIzMywxMDIsMTI4LAotICAgIDI0NiwyMTgsMTA0LCAgMywxNTgsMTg2LDE1OCwyMDksMTU4LDIyMywyMjUsMTE0LCAgMiwxNTgsMTkzLDE1OCwKLSAgICAyMDAsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQ5LDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCi0gICAgMTI4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNzQsMjMzLAotICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTQwLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwKLSAgICAgOTcsMTI5LCA0OCwyMzYsMTU4LDI0NiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsCi0gICAgMjU1LDE1NCwyNDMsMTA0LDEzMCwgIDUsMjMyLDE1OSwgMTEsMTU5LCAyNiwyMjgsMjI1LDIzMSwyMjksMjQzLAotICAgIDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDIzMiwxMTgsICAzLDE1OSwgNDMsMTU5LCA1NiwxNTksIDg4LDIyOSwyNDIsMjQzLDIyOSwyMjgsCi0gICAgMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDM0LCA2MSwyMzMsIDk3LCAgMiwxNTksIDYzLDE1OSwgNzIsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTEsMjM3LDI0NSwyMzEsMjQyLDIyNSwyNDMsMjMyLDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTUxLDIzNiwyMzksMjMxLDIzMywyMjcsMjI1LDIzNiwyMzgsCi0gICAgMjM5LDExNiwxMjgsIDM1LCAxNiwyMzAsMjMzLDI0MywyMzIsMjMyLDIzOSwyMzksMTA3LDEyOSwgIDIsMTI2LAotICAgIDE1OSwxMTQsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsICAyLDEyNywxMDQsICAyLDE1OSwKLSAgICAxMzEsMTU5LDE1NCwgOTcsICAyLDE1OSwxMzcsMTU5LDE0NywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCi0gICAgMTI4LCAgOSwyMjEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkzLDExMSwxMzEsICAzLDE5MywxNTksMTY0LAotICAgIDE1OSwxOTMsMTU5LDIwNywyMzksMTA3LDEyOSwgIDIsMTI1LDE1OSwxNzEsMjQ0LDI0NSwyNDIsMjM4LDIyOSwKLSAgICAxMDAsMTI5LCAgMiwxMjMsMTU5LDE4MiwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsCi0gICAgMTgxLDI0MywyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyNDEsMjQ0LAotICAgIDIzMywyMjcsMjMyLDIzOSwyMzksMjM1LDIzNywyMzksMTAwLDEyOCwgIDIsMjIyLDEwNSwgIDYsMTU5LDIzNCwKLSAgICAxNjEsIDIyLDE2MSwgNjgsMTYxLCA3OSwxNjEsMTA0LDE2MSwyNDAsMjI5LDI0NSwxMDgsICA5LDE2MCwgIDAsCi0gICAgMTYwLCAzNSwxNjAsIDUwLDE2MCwgNjQsMTYwLDExMCwxNjAsMTI0LDE2MCwyMTAsMTYwLDIyMywxNjEsICAyLAotICAgICA5NywgIDIsMTYwLCAgNiwxNjAsIDIxLDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwKLSAgICAyMjUsMTEwLDEyOCwgNTAsMTEzLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCi0gICAgMTI4LCA1MCwgMTcsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAotICAgICA1MCwgOTksMjMyLDIzMywyMjksMjQ1LDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2NCwKLSAgICAxMDcsICAyLDE2MCwgNzAsMTYwLDEwMiwyMzMsMjQ5LDIyOSwyMzksMTA3LCAgMiwxNjAsIDgwLDE2MCwgODksCi0gICAgMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNTgsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksMTA1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNTcsMjM3LDIzMywKLSAgICAyMjksMjQ1LDIzNywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA1OSwxMTIsICAzLDE2MCwxMzIsCi0gICAgMTYwLDE2NCwxNjAsMTc5LCA5NywgIDIsMTYwLDEzOCwxNjAsMTUyLDIzOCwyNDMsMjMzLDIzOSwyNDMsMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDgsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA1MCwgIDMsMjMyLDIzMywyMjksMjQ1LDI0MCwyMzIsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCi0gICAgMTI4LCA0OSwgNjMsMjMzLDIyOSwyNDUsMTEyLCAgMiwxNjAsMTg4LDE2MCwxOTcsMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwgNjAsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNDksMTA3LDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2MSwxMTYsCi0gICAgICAyLDE2MCwyMjksMTYwLDI0NCwyMzIsMjMzLDIyOSwyNDUsMjQ0LDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LCA2MiwyMzMsMjM1LDIyOSwyNDUsMjQ0LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNDksMTA2LDI0OSwyMjksMjM5LDI0MiwyMzMsMjM4LDIzMiwyMzMsMjI5LDI0NSwyMzIsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDksMjMxLDIzMiwxMTYsICAyLDE2MSwgMzAsMTYxLCAzOCwyMjUsMjM4LAotICAgIDIzMSwyMzYsMTAxLDEyOCwgMzQsIDMxLDExNiwgIDIsMTYxLCA0NCwxNjEsIDU4LDIyNSwyMjcsMjM1LDIyNiwKLSAgICAyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjUsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsCi0gICAgMTAxLDEyOCwgMzQsMTkxLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMzgsMjM1LAotICAgIDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzNCwxNjEsIDkyLDIzMiwyMjUsMjM2LDIzMCwKLSAgICAyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTUyLDExMCwgIDIsMTYxLDExMCwxNjEsMjI2LDEwMywxMzEsCi0gICAgICAyLDIxOCwxNjEsMTIwLDE2MSwxMzEsMTYxLDEzNywyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LAotICAgIDEyOCwgIDMsIDM3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDEwLDIzMiwyMjUsMjM2LDEwMiwgIDIsMTYxLDE0NiwKLSAgICAxNjEsMTkyLDIzNiwyMjksMjMwLDExNiwxMzEsICAyLDE5MSwxNjEsMTU5LDE2MSwxNzAsMTYxLDE4MSwyMjUsCi0gICAgMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDg5LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LAotICAgIDIzNywgOTgsMTI4LCAgMywgMjgsMjI3LDIyOSwyMzgsMjQ0LDIyOSwyNDIsMjI5LDEwMCwxMjgsICAyLDIxMSwKLSAgICAyNDIsMjMzLDIzMSwyMzIsMTE2LDEzMCwgIDIsMTkwLDE2MSwyMDQsMTYxLDIxNSwyMjYsMjI5LDIzNiwyMzksCi0gICAgMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU3LDIyNywyMjksMjM4LDI0NCwyMjksMjQyLDIyOSwxMDAsMTI4LAotICAgICAgMiwyMTAsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLCAxOSwKLSAgICAyNDQsMjQ0LDIzOSwyNDIsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDgxLDEwOCwgIDIsCi0gICAgMTYyLCAgNCwxNjIsIDE1LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgOTUsMjM5LAotICAgIDIzOCwyMzEsMjM2LDIyOSwxMDMsMTI5LCAgMiwxMjQsMTYyLCAyNiwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwKLSAgICAxMjgsICAyLDEyMiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA4MiwxMTEsCi0gICAgICAzLDE2MiwgNTUsMTYyLCA2NiwxNjIsIDkxLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwxNDEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzNywxNjIsIDc5LDIzMiwKLSAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTU1LDI0MiwyNDUsMjI1LDI0NCwyMzIsCi0gICAgMjI1LDEwNSwxMjgsIDE0LCAzNSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTczLDExNCwgIDMsMTYyLAotICAgIDExNywxNjIsMTUzLDE2MiwxODMsIDk3LCAgMywxNjIsMTI1LDE2MiwxMzUsMTYyLDE0MiwyMjYsMjI5LDIzOCwKLSAgICAyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjAsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDQ5LDIzMSwyNDUsCi0gICAgMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgOTIsMjI5LDEwNCwgIDIsMTYyLDE2MCwxNjIsMTY5LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTQ1LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNDEsMjQ2LDIzOSwyMjcsMjI1LDIzNiwyMzMsIDk5LCAgNCwxNjIsCi0gICAgMTk5LDE2MiwyMDksMTYyLDIxNiwxNjIsMjI3LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAotICAgIDIyNCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTYsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDIyNCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDMsMTYyLDI0MywxNjIsCi0gICAgMjUzLDE2MywgIDQsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTk2LDIyOCwyMjksMjQ2LAotICAgICA5NywxMjgsICA5LCA2OCwyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTk2LDI0MywKLSAgICAyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyNDEsMTE2LCAgMiwxNjMsIDMyLDE2MywgNDAsCi0gICAgMjI2LDIzNiwyMzksMjI3LDEwNywxMjgsIDM3LDE0NCwyNDUsMjQyLDIzOCwyMjksMTAwLDEyOSwgIDIsMTIxLAotICAgIDE2MywgNTAsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDE4MCwxMTcsICA0LDE2MywKLSAgICAgNzEsMTYzLCA4MiwxNjMsMTA3LDE2MywxNTQsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsCi0gICAgIDQ4LDEzOSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjM1LDE2MywgOTUsMjMyLAotICAgIDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNTMsMTEyLCAgMiwxNjMsMTEzLDE2MywKLSAgICAxNDgsMjI5LDEwMSwgIDIsMTYzLDEyMCwxNjMsMTM0LDIzNywyMjUsMjQyLDIzNSwyMjYsMjI5LDIzOCwyMzEsCi0gICAgMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDIsMjQzLDIzMywyMzEsMjM4LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LAotICAgIDEwNSwxMjgsICA5LDI0MywyMzMsMjI1LDEwNCwxMjgsMjQ2LDIyMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwKLSAgICAgMzYsMjQ2LDIzOSwyMjcsMjI1LDIzNiwyMzMsIDk5LCAgNCwxNjMsMTc3LDE2MywxODcsMTYzLDE5NCwxNjMsCi0gICAgMjA1LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDEzOSwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwgMTEsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzOSwyNDYsMjM5LDI0NywKLSAgICAyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDMsMTYzLDIyMSwxNjMsMjMxLDE2MywyMzgsMjI2LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTk1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2NywyMzEsMjQ1LAotICAgIDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTk1LDExNSwxNDcsICAwLDExNSwxNjQsIDM1LDE2NiwKLSAgICAgIDUsMTY2LCAxNiwxNjYsMTQyLDE2NiwxODEsMTY5LDEyMywxNjksMTM0LDE3MiwgMjEsMTc0LDE1OSwxNzQsCi0gICAgMjA1LDE3NCwyMzIsMTc1LDE2NywxNzUsMjM0LDE3NywgMTEsMTc3LCAyMSwxNzcsMjA3LDE3OCwgMjQsMTc4LAotICAgIDE5NCwxNzgsMjA0LCA5NywgIDksMTY0LCA1NSwxNjQsIDY1LDE2NCwgODYsMTY0LDE1OCwxNjQsMTgzLDE2NCwKLSAgICAxOTQsMTY0LDIxOSwxNjQsMjUxLDE2NSwgMzUsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCi0gICAgMTg0LDIyNywyNDUsMjQ0LDEwMSwxMjksICAxLCA5MSwxNjQsIDc0LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LAotICAgIDIyOSwyMzgsMTE2LDEyOCwgMzAsMTAxLDEwMCwgIDUsMTY0LCA5OCwxNjQsMTA3LDE2NCwxMTMsMTY0LDEyNywKLSAgICAxNjQsMTQzLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDUzLDIyOSwyNDYsIDk3LDEyOCwgIDksCi0gICAgIDU2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxODYsMjMzLAotICAgIDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTg3LDIzNywKLSAgICAyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTg4LDIzMSwxMTcsCi0gICAgICAyLDE2NCwxNjUsMTY0LDE3NCwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE4NCwyNDIsMjM3LAotICAgIDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1NiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsIDg1LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxODEsMTY0LDIwNywyMzIsCi0gICAgMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyMywyMzYsMjM2LDIyNSwyMzYsMjM2LAotICAgIDIyNSwyMzIsMjM5LDI0NSwyMjUsMjM2LDIyNSwyNDksMjMyLDIyOSwyNDcsMjI1LDI0MywyMjUsMjM2LDIzNiwKLSAgICAyMjUsMjM3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTMsMjUwLDIzNywyMjksMjM1LDEwNCwxMzAsCi0gICAgICA1LDIyNSwxNjUsICA2LDE2NSwgMjYsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNjUsMTY1LAotICAgICAxNywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2NSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDIyNSwyNDIsIDk3LCAgNSwxNjUsIDQ4LDE2NSwxMjIsMTY1LDEzMCwxNjUsMTgwLDE2NSwxODgsCi0gICAgIDk3LCAgNSwxNjUsIDYwLDE2NSwgNjgsMTY1LCA3NiwxNjUsMTA3LDE2NSwxMTUsMjI1LDI0NCwyMzIsMjI1LAotICAgIDEwNSwxMjgsIDE0LCA1MCwyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDY1LDIzMywyMzcsMjI1LDIzMywKLSAgICAxMDksICAyLDE2NSwgODYsMTY1LCA5NywyMjUsMjM2LDIyNSwyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsCi0gICAgIDY4LDI0NSwyMjUsMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA2NywyMzcsMjQ0LDIzMiwyMjUsMTA1LAotICAgIDEyOCwgMTQsIDUxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA0OCwyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDY0LDEwNSwgIDMsMTY1LDEzOCwxNjUsMTYyLDE2NSwxNzMsMTA1LCAgMiwxNjUsMTQ0LDE2NSwxNTUsCi0gICAgMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDEzNCwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgNTMsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDEzMywyNDQsMjMyLDIyNSwKLSAgICAxMDUsMTI4LCAxNCwgNTIsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA2NiwxMTcsICAzLDE2NSwxOTYsCi0gICAgMTY1LDI0NiwxNjUsMjUzLDEwMSwgIDMsMTY1LDIwNCwxNjUsMjI4LDE2NSwyMzksMTAxLCAgMiwxNjUsMjEwLAotICAgIDE2NSwyMjEsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDEzNiwyNDQsMjMyLDIyNSwKLSAgICAxMDUsMTI4LCAxNCwgNTUsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDEzNSwyNDQsCi0gICAgMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDU2LDI0NSwyNDQsMjMyLAotICAgIDIyNSwxMDUsMTI4LCAxNCwgNTcsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyNSwKLSAgICAgOTksICA1LDE2NiwgMjgsMTY2LCA0OSwxNjYsIDU4LDE2NiwxMDcsMTY2LDEyOSwyMjUsMjQyLDIzOSwxMTAsCi0gICAgMTI5LCAgMSwgOTcsMTY2LCAzNywyMjgsMjM5LDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLAotICAgIDEwMywyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA5NSwyMzIsMjQ3LCA5NywxMzEsICAyLCA4OSwKLSAgICAxNjYsIDcwLDE2NiwgODEsMTY2LDEwMCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMjE3LDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LDIxOSwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwgOTAsMjMzLDI0MiwgOTksICAyLDE2NiwKLSAgICAxMTUsMTY2LDEyMCwyMzYsMTAxLDEyOCwgMzYsMjI2LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsCi0gICAgIDkzLDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAyLCAyNSwyMjgsMjM5LAotICAgIDExNiwgIDIsMTY2LDE1MCwxNjYsMTU5LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDk3LDIyNiwKLSAgICAyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwgOTksMTY2LDE2OSwyMjgsMjM5LDI0NCwyMjUsMjI3LDIyNywyMjksCi0gICAgMjM4LDExNiwxMjgsIDMwLDEwNSwxMDEsICA5LDE2NiwyMDEsMTY2LDIxNywxNjYsMjUyLDE2NywgNjEsMTY3LAotICAgIDE2NCwxNjcsMTkxLDE2NywyMTYsMTY4LCA0MSwxNjgsIDY4LDIyNSwyMzEsMjQ1LDIzNiwyMzYsMjI2LDIyOSwKLSAgICAyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCA2MCwgOTksICAyLDE2NiwyMjMsMTY2LDI0NSwyMzksCi0gICAgMjM4LDEwMCwxMjksIDMyLCA1MSwxNjYsMjMxLDI0NCwyMzksMjM4LDIyOSwyMjcsMjMyLDIzMywyMzgsMjI5LAotICAgIDI0MywxMDEsMTI4LCAgMiwyMDIsMjQ0LDIzMywyMzksMTEwLDEyOCwgIDAsMTY3LDIyOSwxMTAsICA0LDE2NywKLSAgICAgIDcsMTY3LCAxNiwxNjcsIDMwLDE2NywgNDYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNTEsCi0gICAgMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE3OCwyMzMsMjM4LAotICAgIDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNzksMjM3LDIyOSwKLSAgICAyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxODAsMjMxLDIzOSwxMDgsCi0gICAgMTM1LCAgNSwxODIsMTY3LCA4MSwxNjcsIDk1LDE2NywxMDAsMTY3LDEwOSwxNjcsMTI0LDE2NywxNDAsMTY3LAotICAgIDE1MSwgNDksICAyLDE2NywgODcsMTY3LCA5MSwgNTEsMTI4LCAgNSwxODIsMTAyLDEyOCwgIDUsMTgyLDE3OCwKLSAgICAgOTksMTI4LCAgNSwxODIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODIsMjM4LDIyNSwyNDIsCi0gICAgMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODIsMjQxLDI0NSwyMjUsMjQyLAotICAgIDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgyLDI0NCwyMjUsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDYsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwgIDUsMTgyLDEwNCwgIDIsMTY3LDE3MCwxNjcsMTgxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLAotICAgIDIyNSwxMTAsMTI4LCAgNSwxMjUsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDkxLDIzNSwKLSAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxODcsMTY3LDIwNCwyMzIsMjI1LDIzNiwyMzAsCi0gICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyNiwyMzcsMTA1LCAgMiwxNjcsMjIzLDE2OCwgMTAsMjI3LAotICAgIDIzOSwyMzYsMjM5LDExMCwxMzEsICAwLCA1OSwxNjcsMjM3LDE2NywyNDYsMTY4LCAgMiwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCAyNywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsCi0gICAgMjU1LCAyNywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDg0LDI0NiwyMzksMjMzLDIyNywyMjksMjI4LAotICAgIDIzNywyMjUsMjQyLDIzNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNTYsMTY4LCAyOSwyMzIsMjI1LDIzNiwKLSAgICAyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE1OSwyMzgsMTE2LCAgMiwxNjgsIDQ4LDE2OCwgNTgsCi0gICAgMjMzLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM0LDIzOSwyNDMsMjQxLDI0NSwyMjUsMjQyLAotICAgIDEwMSwxMjgsIDUxLCAzNSwyNDYsMjI5LDExMCwxNDIsICAwLCA1NSwxNjgsMTAyLDE2OCwxMTEsMTY4LDEyMSwKLSAgICAxNjgsMTUxLDE2OCwxNTgsMTY4LDE2OCwxNjgsMTkzLDE2OCwyMjAsMTY4LDI1NCwxNjksIDEwLDE2OSwgMjEsCi0gICAgMTY5LCA1NCwxNjksIDYyLDE2OSwgNzMsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDMsMjI2LAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM3LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwKLSAgICAgMzYsMTAyLDE2OCwxMzIsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsCi0gICAgMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQ0LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDEwOSwyMjksMjMzLAotICAgIDIzMSwyMzIsMjQ0LDIzMiwxMTUsMTI4LCAzMywgOTQsMjMxLDExNywgIDIsMTY4LDE3NSwxNjgsMTg0LDIzNCwKLSAgICAyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjM3LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCi0gICAgMTA5LDIzMiwgOTcsICAyLDE2OCwyMDAsMTY4LDIxMSwyMjcsMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsMTAzLDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsIDM5LDEwNSwgIDIsMTY4LDIyNiwKLSAgICAxNjgsMjQ0LDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksCi0gICAgMTEwLDEyOCwgNTAsIDM4LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEzNSwyMzcsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyMywyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwKLSAgICAyMzYsMTAxLDEyOCwyNDcsIDU1LDExMiwgIDIsMTY5LCAyNywxNjksIDM0LDIyNSwyNDIsMjI5LDExMCwxMjgsCi0gICAgIDM2LDEyMiwyMjksMTE0LCAgMiwxNjksIDQxLDE2OSwgNDcsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNDIsMjQzLAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDYsMjQ3LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMTgsMjQzLDI0NSwKLSAgICAyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDExOSwxMTYsICAyLDE2OSwgNzksMTY5LDExNywyMjksCi0gICAgMjI5LDExMCwgIDIsMTY5LCA4NywxNjksIDk2LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTEyLAotICAgIDExMiwgIDIsMTY5LDEwMiwxNjksMTA5LDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEzMiwyMjksMjQyLDIzMywKLSAgICAyMzksMTAwLDEyOCwgMzYsMTUyLDIzMiwyMjUsMTA1LDEyOCwgMTQsIDg3LDIzMCwyNDQsMjMyLDI0OSwyNDAsCi0gICAgMjMyLDIyOSwxMTAsMTI4LCAgMCwxNzMsMTA0LCAgNywxNjksMTUwLDE3MCwxMjQsMTcwLDEzNSwxNzAsMTQ5LAotICAgIDE3MSwgOTQsMTcxLDEwNywxNzIsIDE1LCA5NywgIDYsMTY5LDE2NCwxNjksMTc1LDE2OSwxODUsMTY5LDE5NiwKLSAgICAxNzAsIDgzLDE3MCwxMDgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExOSwyMjYsCi0gICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxODIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCA3MiwxMDAsICAyLDE2OSwyMDIsMTcwLCA0MiwyMjgsIDk3LCAgNCwxNjksMjEzLDE2OSwKLSAgICAyMjIsMTY5LDI1MywxNzAsIDExLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDgxLDIyOCwyMjUsCi0gICAgMjM3LDIzNywgOTcsICAyLDE2OSwyMzIsMTY5LDI0MSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLAotICAgICA5NywyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA5NCwyMzAsMjI1LDI0NCwKLSAgICAyMzIsMjI1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDk2LDIzNSwyMjUsMjQzLDI0MiwgOTcsCi0gICAgICAyLDE3MCwgMjEsMTcwLCAzMCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA5OCwyNDQsMjI1LAotICAgIDIzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA5NSwxMDEsMTMyLCAzNywxNDYsMTcwLCA1NCwKLSAgICAxNzAsIDYxLDE3MCwgNjksMTcwLCA3OCwyMjgsMjI1LDI0MiwxMDcsMTI4LCAzNywxNDcsMjM2LDIzMywyMzEsCi0gICAgMjMyLDExNiwxMjgsIDM3LDE0NSwyMzcsMjI5LDIyOCwyMzMsMjQ1LDEwOSwxMjgsIDM3LDE0NiwyNDYsIDk3LAotICAgIDEyOCwgIDksIDU0LDIzMSwxMTcsICAyLDE3MCwgOTAsMTcwLCA5OSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDE4MiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1NCwyMzYsMjQzLDIzMiwyMjksCi0gICAgMjM2LDIyOSwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDcsMjI2LDIzOSwyNDAsMjM5LAotICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyMSwyMjcsMjMyLDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsIDczLDEwMSwgIDQsMTcwLDE1OSwxNzAsMjI0LDE3MCwyMzQsMTcwLDI1MSwyMjksCi0gICAgMTEwLCAgNCwxNzAsMTcwLDE3MCwxNzksMTcwLDE5MywxNzAsMjA5LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsIDUyLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwKLSAgICAxODIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCi0gICAgMTgzLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTg0LAotICAgIDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIyNywyNDEsMjI5LDEwOCwxMjksIDMyLDE3MCwKLSAgICAxNzAsMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgMzIsMTcwLDI0NiwgOTcsMTM0LCAgNSwxNzYsCi0gICAgMTcxLCAxMiwxNzEsIDI3LDE3MSwgNDEsMTcxLCA1MCwxNzEsIDY1LDE3MSwgODEsIDQ5LCAgMiwxNzEsIDE4LAotICAgIDE3MSwgMjMsMTc3LCA1MywxMjgsICA1LDE3NiwgNTMsMTI4LCAgNSwxNzYsIDUwLCAgMiwxNzEsIDMzLDE3MSwKLSAgICAgMzcsIDUwLDEyOCwgIDUsMTc2LDEwMSwxMjgsICA1LDE3NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE3NiwyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LAotICAgIDE3NiwyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKLSAgICAxNzYsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc2LDIzMiwyMjUsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE4NywxMDUsICAyLDE3MSwxMTMsMTcxLAotICAgIDEyNCwyMzcsMjI1LDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwgIDMsMjM3LDExMCwxMzEsICA1LDIzMywKLSAgICAxNzEsMTM0LDE3MSwyMTcsMTcxLDIyNiwxMDAsICAyLDE3MSwxNDAsMTcxLDIwNiwyMjUsMjMxLDIyOSwyNDMsCi0gICAgMTA0LDEzMCwyNTEsIDczLDE3MSwxNTIsMTcxLDE2MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLAotICAgICA3MywxMTUsICAyLDE3MSwxNjcsMTcxLDE4NywyMzIsMjMzLDIzOCwyMjgsMjM5LDExNiwxMjksMjUxLCA0NCwKLSAgICAxNzEsMTc4LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDQ0LDIzMywyMzgsMjI4LDIzOSwxMTYsCi0gICAgMTI5LDI1MSwgNDUsMTcxLDE5NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA0NSwyMzksMjQ0LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTkzLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMjMzLDExNSwgIDIsMTcxLDIzMiwxNzEsMjUyLDIzMiwyMzMsMjM4LDIyOCwyMzksMTE2LDEyOSwyNTEsCi0gICAgIDQyLDE3MSwyNDMsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNDIsMjMzLDIzOCwyMjgsMjM5LAotICAgIDExNiwxMjksMjUxLCA0MywxNzIsICA2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDQzLDIzOSwKLSAgICAyMzksMTA3LDEyOCwgIDIsMTMwLDEwNSwgIDgsMTcyLCAzOSwxNzIsIDgzLDE3MiwgOTQsMTcyLDExOSwxNzIsCi0gICAgMTQ5LDE3MiwxNTcsMTcyLDE3MCwxNzMsIDg1LDIzMSwyMzcsIDk3LDEzMSwgIDMsMTk1LDE3MiwgNTEsMTcyLAotICAgICA1NSwxNzIsIDYzLCA0OSwxMjgsICAzLDE5NCwyMzAsMjMzLDIzOCwyMjUsMTA4LDEyOCwgIDMsMTk0LDIzNiwKLSAgICAyNDUsMjM4LDIyNSwyNDQsMjI5LDI0MywyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsCi0gICAgMTI4LCAgMywyNDIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA4NywyMzUsMjI1LAotICAgIDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTgzLDE3MiwxMDcsMjMyLDIyNSwyMzYsMjMwLDI0NywKLSAgICAyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjQsMjM2LDI0NSwxMTMsICAyLDE3MiwxMjcsMTcyLDEzNiwyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4OSwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwxODksMjM3LDIzMywyMzYsMjI1LDExNCwxMjgsIDM0LCA2MCwyMzgsMjI4LDIzOSwKLSAgICAyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTQsMjM5LDExNSwgIDYsMTcyLDE4NSwxNzIsCi0gICAgMjIwLDE3MiwyNTIsMTczLCAyNCwxNzMsIDM4LDE3MywgNzAsIDk3LCAgMiwxNzIsMTkxLDE3MiwyMDYsMjI3LAotICAgIDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTYsMjQwLDIyNSwKLSAgICAyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAyMCwyMjcsMTA1LCAgMiwxNzIsCi0gICAgMjI3LDE3MiwyMzksMjI5LDI0NSwyMjcsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjYsMjQyLAotICAgIDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTAyLDEwNywgIDIsMTczLCAgMiwKLSAgICAxNzMsIDE2LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjIsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2OSwyMzgsMjMzLDIyOSwyNDUsMjM4LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksMTIzLDExMiwgIDIsMTczLCA0NCwxNzMsIDU3LDIyNSwyNDIsMjI5LDIzOCwKLSAgICAyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAgNiwyMzMsMjI5LDI0NSwyNDAsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjUsMjQ0LDIzMywyMzUsMjI5LDI0NSwyNDQsMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwxMjQsMTIwLDE0MSwgIDAsIDU0LDE3MywxMTUsMTczLDEyNCwxNzMsMTM0LDE3MywKLSAgICAxNjQsMTczLDE3MSwxNzMsMTk2LDE3MywyMjMsMTc0LCAgMSwxNzQsIDEzLDE3NCwgMjQsMTc0LCA1NywxNzQsCi0gICAgIDY1LDE3NCwgNzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDIsMjI2LDIyOSwyMzgsMjMxLAotICAgIDIyNSwyMzYsMTA1LDEyOCwgIDksMjM2LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzYsMTAxLDE3MywKLSAgICAxNDUsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsCi0gICAgMTAyLDEyOCwgMzksMTQzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDEwOCwyMzEsMTE3LCAgMiwxNzMsMTc4LAotICAgIDE3MywxODcsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzYsMjQyLDIzNywyNDUsMjM1LDIzMiwKLSAgICAxMDUsMTI4LCAxMCwxMDgsMjMyLCA5NywgIDIsMTczLDIwMywxNzMsMjE0LDIyNywyMzUsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LCAgNiwxMDIsMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LCA0OCwgMzgsMTA1LAotICAgICAgMiwxNzMsMjI5LDE3MywyNDcsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwKLSAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgMzcsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsCi0gICAgMTM0LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDIyLDIzOSwyMzYsMjI4LAotICAgIDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNTQsMTEyLCAgMiwxNzQsIDMwLDE3NCwgMzcsMjI1LDI0MiwKLSAgICAyMjksMTEwLDEyOCwgMzYsMTIxLDIyOSwxMTQsICAyLDE3NCwgNDQsMTc0LCA1MCwyMzMsMjM5LDEwMCwxMjgsCi0gICAgIDM2LDE0MSwyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDYsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLAotICAgIDExNywyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTE4LDExNiwgIDIsMTc0LCA4MiwKLSAgICAxNzQsMTUzLDIyOSwyMjksMTEwLCAgMiwxNzQsIDkwLDE3NCwxMzIsIDk5LCAgMiwxNzQsIDk2LDE3NCwxMDQsCi0gICAgMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDExMSwyNDUsMjQyLDI0MiwyMjksMjM4LDIyNywyNDksMjI4LAotICAgIDIyOSwyMzgsMjM5LDIzNywyMzMsMjM4LDIyNSwyNDQsMjM5LDI0MiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwKLSAgICAxMDUsMTI4LCAgOSwyNDksMTEyLCAgMiwxNzQsMTM4LDE3NCwxNDUsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsCi0gICAgMTMxLDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTEsMjMyLDIyNSwxMDUsMTI4LCAxNCwgODYsMTA4LAotICAgICAgMiwxNzQsMTY1LDE3NCwxODUsMjI1LDI0MywxMDQsMTI5LCAgMCwgNDcsMTc0LDE3MywyMzcsMjM5LDIzOCwKLSAgICAyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxNSwyMzksMjM4LDEwMywxMjksICAxLDEyNywxNzQsCi0gICAgMTkzLDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTU1LDEwOSwgIDIsMTc0LAotICAgIDIxMSwxNzQsMjIxLDIzMywyMzYsMjI5LDIzMCwyMjUsMjI3LDEwMSwxMjgsIDM4LCA1OCwyMzksMjM4LDIzOSwKLSAgICAyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDgzLDExMSwgIDYsMTc0LDI0NiwxNzUsIDQwLDE3NSwgNTEsCi0gICAgMTc1LCA3NiwxNzUsMTIxLDE3NSwxMzIsMTAyLCAgMiwxNzQsMjUyLDE3NSwgMTAsMjQwLDIyNSwyNDMsMjQ1LAotICAgIDI0MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE5NSwxMTYsICAyLDE3NSwgMTYsMTc1LCAyNSwKLSAgICAyMzIsMjQ5LDI0MCwyMzIsMjI5LDExMCwxMjgsICAwLDE3MywyNDMsMjMzLDIzMSwyMzgsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3NiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsIDkzLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxODksMTc1LCA2NCwKLSAgICAyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyNywyMzYsMjMzLDIyOCwyNDUsCi0gICAgMTE1LCAgMiwxNzUsIDg2LDE3NSwxMDMsMjM2LDIzOSwyMzgsMjMxLDIzOSwyNDYsMjI5LDI0MiwyMzYsMjI1LAotICAgIDI0OSwyMjcsMjM3LCA5OCwxMjgsICAzLCA1NiwyNDMsMjMyLDIzOSwyNDIsMjQ0LDIzOSwyNDYsMjI5LDI0MiwKLSAgICAyMzYsMjI1LDI0OSwyMjcsMjM3LCA5OCwxMjgsICAzLCA1NSwyNDIsMjQ1LDI0MywyMzMsMjQ0LDIzMiwyMjUsCi0gICAgMTA1LDEyOCwgMTQsIDQxLDExNSwgIDMsMTc1LDE0MCwxNzUsMTUwLDE3NSwxNTgsMjI1LDIzNiwyMjUsMjQ0LAotICAgIDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQwLDIzOSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMTEsMjQ1LDIyNSwKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDIsMjQwLCA5NywgIDMsMTc1LDE3NiwxNzUsMTk2LDE3NSwyMjgsCi0gICAgMjI3LDEwMSwxMjksICAwLCAzMiwxNzUsMTgzLDIzMiwyMjUsMjI3LDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsICAwLCAzMiwyMjgsMTAxLDEyOSwgMzgsIDk2LDE3NSwyMDMsMjQzLDI0NSwyMzMsMTE2LCAgMiwKLSAgICAxNzUsMjEyLDE3NSwyMjAsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsIDM4LCA5NiwyNDcsMjMyLDIzMywyNDQsCi0gICAgMTAxLDEyOCwgMzgsMTAwLDI0MiwyMjksMTEwLDEyOCwgMzYsMTc0LDI0MSwyNDUsMjI1LDI0MiwxMDEsIDExLAotICAgIDE3NiwgIDYsMTc2LCAxNywxNzYsIDMxLDE3NiwgNTYsMTc2LCA3MywxNzYsIDk5LDE3NiwxMTQsMTc2LDE0NywKLSAgICAxNzYsMTc0LDE3NiwyMzAsMTc2LDI0NSwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsCi0gICAgIDU5LCA5OSwgIDIsMTc2LCAyMywxNzYsIDI3LCA5OSwxMjgsIDUxLDE5NiwxMDksMTI4LCA1MSwxNTcsMjI4LAotICAgIDIzMywyMjUsMjMxLDIzOSwyMzgsMjI1LDIzNiwyMjcsMjQyLDIzOSwyNDMsMjQzLDIzMiwyMjUsMjQ0LDIyNywKLSAgICAyMzIsMjMwLDIzMywyMzYsMTA4LDEyOCwgMzcsMTY5LDIzMiwyMzksMjQyLDIzMywyNTAsMjM5LDIzOCwyNDQsCi0gICAgMjI1LDIzNiwyMzAsMjMzLDIzNiwxMDgsMTI4LCAzNywxNjQsMTA3LCAgMiwxNzYsIDc5LDE3NiwgODMsMTAzLAotICAgIDEyOCwgNTEsMTQzLDEwOSwxMjksIDUxLDE1OCwxNzYsIDg5LDIyNywyMjUsMjQwLDIzMywyNDQsMjI1LDEwOCwKLSAgICAxMjgsIDUxLDIwNiwxMDgsICAyLDE3NiwxMDUsMTc2LDEwOSwxMTAsMTI4LCA1MSwyMDksMjM5LDEwMywxMjgsCi0gICAgIDUxLDIxMCwxMDksICA0LDE3NiwxMjQsMTc2LDEyOCwxNzYsMTMzLDE3NiwxMzcsMTAzLDEyOCwgNTEsMTQyLAotICAgIDIzMywxMDgsMTI4LCA1MSwyMTMsMTA5LDEyOCwgNTEsMTU2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMjI5LDEwMCwKLSAgICAxMjgsIDUxLDE2MSwyMzksMjQyLDI0NCwyMzIsMjM5LDIzMSwyMzksMjM4LDIyNSwyMzYsMjI3LDI0MiwyMzksCi0gICAgMjQzLDI0MywyMzIsMjI1LDI0NCwyMjcsMjMyLDIzMCwyMzMsMjM2LDEwOCwxMjgsIDM3LDE2NiwyNDUsMjQwLAotICAgIDI0MCwyMjksMTE0LCAgMiwxNzYsMTg0LDE3NiwyMDcsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzksMjM2LDIzOSwKLSAgICAyNDcsMjI5LDI0MiwyNDIsMjMzLDIzMSwyMzIsMjQ0LDIzMCwyMzMsMjM2LDEwOCwxMjgsIDM3LDE2NywyNDIsCi0gICAgMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzksMjM2LDIzOSwyNDcsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsMjMwLAotICAgIDIzMywyMzYsMTA4LDEyOCwgMzcsMTY4LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwyMzYsMjMwLDIzMywKLSAgICAyMzYsMTA4LDEyOCwgMzcsMTY1LDI0NywyMzIsMjMzLDI0NCwyMjksMjQ3LDIzMywyNDQsMjMyLDI0MywyMzcsCi0gICAgMjI1LDIzNiwyMzYsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsIDM3LDE2MywyNDIsMjQzLDI0MSwyNDUsMjI1LAotICAgIDI0MiwxMDEsMTI4LCA1MSwyMTksMTE1LCAgMiwxNzcsIDI3LDE3NywxOTcsIDk3LCAgNCwxNzcsIDM3LDE3NywKLSAgICAgNDcsMTc3LCA1NCwxNzcsIDY1LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE4MywyMjgsCi0gICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgNTUsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAotICAgIDE4MywyMzgsMTAzLCAgOCwxNzcsIDg0LDE3NywgOTgsMTc3LDExMiwxNzcsMTI2LDE3NywxNDEsMTc3LDE1NSwKLSAgICAxNzcsMTY5LDE3NywxODIsMjI3LDIzMywyMjksMjQ1LDIyNywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCi0gICAgIDQ5LCA3MywyMzIsMjMzLDIyOSwyNDUsMjMyLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTMzLAotICAgIDIzMywyMjksMjQ1LDIzOCwyMzEsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjgsMjM1LDIzMywKLSAgICAyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNTAsMjM4LDIzMywyMjksCi0gICAgMjQ1LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEwMSwyNDAsMjMzLDIyOSwyNDUsMjQwLAotICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDY3LDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LCA3MCwyNDQsMjMzLDIzNSwyMjksMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDQ5LCA1NiwyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyNDIsMTE2LAotICAgICAgMiwxNzcsMjEzLDE3NywyMzYsMjI5LDI0MiwyMzYsMjMzLDIzOCwxMDMsMTI5LCAgMCwxNjMsMTc3LDIyNCwKLSAgICAyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LDIyNSwyNDIsMjM5LDIzNSwxMDEsCi0gICAgICAyLDE3NywyNDUsMTc4LCAgNiwyMzYsMjM5LDIzOCwyMzEsMjM5LDI0NiwyMjksMjQyLDIzNiwyMjUsMjQ5LAotICAgIDIyNywyMzcsIDk4LDEyOCwgIDMsIDU0LDI0MywyMzIsMjM5LDI0MiwyNDQsMjM5LDI0NiwyMjksMjQyLDIzNiwKLSAgICAyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDUzLDExNywgIDcsMTc4LCA0MCwxNzgsIDcyLDE3OCwgOTQsCi0gICAgMTc4LDEwNSwxNzgsMTQ2LDE3OCwxNTYsMTc4LDE2MCwyMjYsMjQzLDIyOSwxMTYsMTMwLCAzNCwxMzAsMTc4LAotICAgICA1MSwxNzgsIDYyLDIzOCwyMzksMjQ0LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwxMzgsMjM5LDI0MiwKLSAgICAyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTM0LCA5OSwgIDIsMTc4LCA3OCwxNzgsIDg2LDIyNywyMjksCi0gICAgMjI5LDIyOCwxMTUsMTI4LCAzNCwxMjMsMjMyLDI0NCwyMzIsMjI1LDExNiwxMjgsIDM0LCAxMSwyMzIsMjMzLAotICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDg5LDEwNywgIDIsMTc4LDExMSwxNzgsMTM1LDIyNSwKLSAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE4NSwxNzgsMTIzLDIzMiwyMjUsMjM2LDIzMCwyNDcsCi0gICAgMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTI1LDI0NSwyMzgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgICAgNiwgODIsMjM3LDIzNywyMjUsMjQ0LDIzMywyMzksMTEwLDEyOCwgMzQsIDE3LDExMCwxMjgsIDM4LCA2MCwKLSAgICAyNDAsMjI5LDI0MiwyNDMsMjI5LDExNiwxMzAsIDM0LDEzMSwxNzgsMTczLDE3OCwxODQsMjM4LDIzOSwyNDQsCi0gICAgMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LDEzOSwyMzksMjQyLDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LAotICAgICAzNCwxMzUsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjIwLDI0OSwyMzksMjQ1LDI0NywKLSAgICAyMjUsMjI5LDI0MiwyMjUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjQsMTE2LDE0NCwgIDAsCi0gICAgMTE2LDE3OSwgIDEsMTgwLCAxMCwxODAsIDMxLDE4MCwxNzQsMTgwLDIxNCwxODMsICA2LDE4NiwxNDQsMTg3LAotICAgIDIxOSwxODcsMjMxLDE4NywyNDMsMTg5LCAyMCwxODksIDQ1LDE4OSwxMzEsMTkwLCA1NSwxOTAsMjM5LDE5MSwKLSAgICAgNzMsIDk3LCAxMCwxNzksIDIzLDE3OSwgMzMsMTc5LCA1NCwxNzksIDYxLDE3OSwgODYsMTc5LDE2NCwxNzksCi0gICAgMTgxLDE3OSwyMDYsMTc5LDIyMCwxNzksMjI0LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAotICAgIDE2NCwyMjcsMTA3LCAgMiwxNzksIDQwLDE3OSwgNDcsMjI4LDIzOSwyNDcsMTEwLDEyOCwgMzQsMTY0LDIzNiwKLSAgICAyMjksMjMwLDExNiwxMjgsIDM0LDE2MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzYsMjMxLDExNywgIDIsCi0gICAgMTc5LCA2OCwxNzksIDc3LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTY0LDI0MiwyMzcsMjQ1LAotICAgIDIzNSwyMzIsMTA1LDEyOCwgMTAsIDM2LDEwNCwgIDQsMTc5LCA5NiwxNzksMTA1LDE3OSwxMTksMTc5LDE0OSwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA1NSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk0LDEwNSwgIDIsMTc5LDEyNSwxNzksMTQwLDIzOCwyMzMsMjQ0LAotICAgIDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk1LDI0MiwyMjUsMjMxLDIyNSwKLSAgICAyMzgsIDk3LDEyOCwgNDgsIDk1LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMTk2LDIzMywyNDMsMjQ5LDIzOSwyNDUsMjI5LDI0MiwyMjUsMjQzLDI0MSwyNDUsMjI1LAotICAgIDI0MiwxMDEsMTI4LCA1MSwxMjUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE5MSwKLSAgICAxNzksMTk0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTI4LDI0NCwyNDcsCi0gICAgMjI5LDIyOSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNjQsMTE3LDEyOCwgIDMsMTk2LAotICAgIDExOCwxMzAsICA1LDIzNCwxNzksMjMyLDE4MCwgIDEsMjI4LDIyNSwyMzEsMjI5LDExNSwxMjksMjUxLCA3NCwKLSAgICAxNzksMjQyLDEwNCwxMjksMjUxLCA3NCwxNzksMjQ4LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsCi0gICAgIDc0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjM0LCA5OCwgIDIsMTgwLCAxNiwxODAsIDIxLAotICAgIDIyNSwxMTQsMTI4LCAgMSwxMDMsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDEwLCA5OSwKLSAgICAgIDYsMTgwLCA0NSwxODAsIDUyLDE4MCwgNTksMTgwLCA2OCwxODAsMTM0LDE4MCwxNjEsMjI1LDI0MiwyMzksCi0gICAgMTEwLDEyOCwgIDEsMTAxLDIyNywyNDUsMjQyLDEwOCwxMjgsICAyLDE2OCwyMjksMjI4LDIzMywyMzYsMjM2LAotICAgICA5NywxMjgsICAxLCA5OSwyMzIsMjI5LDEwNCwgIDQsMTgwLCA4MCwxODAsIDg5LDE4MCwxMDMsMTgwLDExOSwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEzNCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTIzLDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDEyNCwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsMjUxLDEyNSwyMzMsMjQyLCA5OSwgIDIsMTgwLDE0MiwxODAsMTQ3LDIzNiwxMDEsCi0gICAgMTI4LCAzNiwyMjcsMjQ1LDIzNywyMzAsMjM2LDIyOSwyNDgsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLAotICAgIDExMywyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgOTksMTAwLCAgMiwKLSAgICAxODAsMTgwLDE4MCwxOTAsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsMTUxLDIzOSwxMTYsCi0gICAgICAyLDE4MCwxOTcsMTgwLDIwNiwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEwNywyMjYsMjI5LAotICAgIDIzNiwyMzksMTE5LDEyOCwgMzAsMTA5LDEwMSwgIDksMTgwLDIzNCwxODAsMjQ1LDE4MSwgIDksMTgyLCAxOSwKLSAgICAxODIsIDQ0LDE4MiwxMDgsMTgyLDE3NSwxODIsMTgwLDE4MiwyMzIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LCA2NiwyMjgsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTczLDEwNCwgIDcsMTgxLCAyNSwxODEsIDM0LDE4MSwKLSAgICAgNDgsMTgxLCA4OCwxODEsMTE4LDE4MSwxNTksMTgyLCAgMSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCA0MiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTUwLAotICAgIDIzMiwyMjUsMjMyLDEwNSwgIDIsMTgxLCA1NywxODEsIDcyLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMTYyLDI0MywyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCAxMiwxMDUsICAyLDE4MSwgOTQsMTgxLDEwOSwyMzgsMjMzLAotICAgIDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE1MSwyNDIsMjI1LDIzMSwKLSAgICAyMjUsMjM4LCA5NywxMjgsIDQ4LDEwMiwyMzQsMjI5LDIyOSwyMzcsMTA1LCAgMiwxODEsMTI4LDE4MSwxNDMsCi0gICAgMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwxNjEsMjQzLAotICAgIDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDExLDEwOSwKLSAgICAgIDIsMTgxLDE2NSwxODEsMTk5LDIyNSwyNDIsMjI2LDI0NSwyNDQsIDk3LCAgMiwxODEsMTc2LDE4MSwxODUsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDEsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE0OCwxMDEsICAyLDE4MSwyMDUsMTgxLDIxOCwyMjgsMjMzLDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNTIsMjI5LDIzNywxMDUsICAyLDE4MSwyMjYsCi0gICAgMTgxLDI0MSwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLAotICAgIDE2NCwyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwKLSAgICAgMTQsMjM4LDIzOSwyMzksMjM4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LDI1MiwxMTUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE5OCwxODIsIDMyLAotICAgIDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTMxLDEwOCwgIDIsMTgyLCA1MCwKLSAgICAxODIsIDY5LDIyOSwyNDAsMjMyLDIzOSwyMzgsMTAxLDEyOSwgMzMsIDMzLDE4MiwgNjEsMjI2LDIzNiwyMjUsCi0gICAgMjI3LDEwNywxMjgsIDM4LCAxNCwyMzMsMjQzLDIzMiwgOTcsICAyLDE4MiwgNzgsMTgyLCA5MywyMzEsMjI5LAotICAgIDIyOCwyMzksMjM2LDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2MCwyNDEsMjI5LDI0NCwKLSAgICAyMjUsMjM4LDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2OSwxMTAsICA0LDE4MiwxMTgsCi0gICAgMTgyLDEyNywxODIsMTQ2LDE4MiwxNjcsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMDUsMjMzLAotICAgIDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgNTAsIDQxLDExMiwgIDIsMTgyLDE1MiwxODIsMTU5LDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEyNSwyMjksCi0gICAgMjQyLDIzMywyMzksMTAwLDEyOCwgMzYsMTQ1LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMjEsMjQzLAotICAgIDEwNCwxMjgsICAyLDE2NywxMTYsMTMxLCAgNSwyMTYsMTgyLDE5MCwxODIsMjEwLDE4MiwyMTksMjI4LDIyNSwKLSAgICAyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTYsMTgyLDIwMSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgMjUxLCA1NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxNiwyNDMsMjI5LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODEsMjQ2LDIzMywxMTQsICAyLDE4MiwyNDAsMTgyLDI0OSwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1NSwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsCi0gICAgMjQyLDIyOSwxMTksMTI4LCAgNSwxNTUsMTA0LCAgNiwxODMsIDIwLDE4MywxNzIsMTg0LCAzOCwxODQsMTcwLAotICAgIDE4NSwgNzcsMTg2LDEzNCwgOTcsICA1LDE4MywgMzIsMTgzLCA0MiwxODMsIDQ5LDE4MywgNzQsMTgzLDEwMywKLSAgICAyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNjUsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksCi0gICAgIDM3LDIzMSwxMTcsICAyLDE4MywgNTYsMTgzLCA2NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAotICAgIDE2NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzNywxMDgsICAyLDE4MywgODAsMTgzLCA4OSwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0OCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTcyLDIzOCwyNDQsMjMyLDIyNSwyMzUsMjMyLDIyNSwxMTYsICAzLAotICAgIDE4MywxMTgsMTgzLDE0OSwxODMsMTU2LDIzNiwyMzksMTE5LCAgMiwxODMsMTI2LDE4MywxMzcsMjM2LDIyOSwKLSAgICAyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE1MiwyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsCi0gICAgMjI1LDEwNSwxMjgsMjQ4LDE1MSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzYsMjQ1LDI0MCwyNDAsMjI5LAotICAgIDI0MiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTUwLDEwMSwgIDMsMTgzLDE4MCwKLSAgICAxODMsMjQ0LDE4NCwgMTEsMTA0LCAgNCwxODMsMTkwLDE4MywxOTksMTgzLDIxMywxODMsMjI5LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQzLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1NCwxNTQsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTQsMTU1LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMTU2LDI0MiwxMDEsICAyLDE4MywyNTEsMTg0LCAgNCwyMjksMjQ4LDIzMywyNDMsMjQ0LAotICAgIDExNSwxMjgsIDM0LCAgMywyMzAsMjM5LDI0MiwxMDEsMTI4LCAzNCwgNTIsMjQ0LCA5NywxMzAsICAzLDE4NCwKLSAgICAxODQsIDIwLDE4NCwgMjQsIDQ5LDEyOCwgIDMsMjA5LDI0MywyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsCi0gICAgMjI5LDIyOSwxMDcsMTI4LCAgMywyMDksMTA1LCAgMiwxODQsIDQ0LDE4NCwxMzAsMjI5LDI0NSwyNDQsMTA0LAotICAgICAgNCwxODQsIDU3LDE4NCwgOTIsMTg0LDEwNywxODQsMTE2LCA5NywgIDIsMTg0LCA2MywxODQsIDc4LDIyNywKLSAgICAyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTIxLDI0MCwyMjUsCi0gICAgMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjUsMjI3LDIzMywyNDIsMjI3LAotICAgIDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDcsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA0OSwgNzYsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCi0gICAgIDUwLCAxMSwyNDIsMjQ0LDIyOSwyMjksMTEwLCAgMiwxODQsMTQwLDE4NCwxNDksMjI3LDIzMywyNDIsMjI3LAotICAgIDIzNiwxMDEsMTI4LCAzNiwxMDgsMTEyLCAgMiwxODQsMTU1LDE4NCwxNjIsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgMzYsMTI4LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNDgsMTExLCAgNiwxODQsMTg0LDE4NCwyMDEsCi0gICAgMTg0LDIwNiwxODQsMjIwLDE4NCwyMjUsMTg1LCAyMiwyMzgsMjI1LDIzOCwyMzEsMjM3LDIzOSwyMzgsMjQ0LAotICAgIDIzMiwyMzksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE3LDIzOSwxMDcsMTI4LCAgMSwxNzMsMjQwLDIzMiwKLSAgICAyNDUsMjQ0LDIzMiwyMjUsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAxOCwyNDIsMTEwLDEyOCwgIDAsCi0gICAgMjU0LDI0NCwxMDQsICAzLDE4NCwyMzQsMTg1LCAgMiwxODUsIDEyLCA5NywgIDIsMTg0LDI0MCwxODQsMjUwLAotICAgIDIzMiwyMjUsMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyMywyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDE2LDIzOSwyMzgsMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyNCwyNDUsMjM4LDIzMSwyNDQsCi0gICAgMjMyLDIyNSwxMDUsMTI4LCAxNCwgMjIsMjQ1LDI0MywyMjUsMjM4LDEwMCwgIDIsMTg1LCAzMiwxODUsIDQzLAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMzAsMjQzLDI0MywyMjksMjQwLDIyNSwKLSAgICAyNDIsMjI1LDI0NCwyMzksMTE0LCAgMiwxODUsIDU4LDE4NSwgNjcsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LCAgNiwxMDgsMjQwLDIyOSwyNDIsMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMTA4LDI0MiwyMjksMTAxLAotICAgIDE0NCwgIDAsIDUxLDE4NSwxMTUsMTg1LDEyNCwxODUsMTM0LDE4NSwxNjQsMTg1LDE3MSwxODUsMTgxLDE4NSwKLSAgICAyMDYsMTg1LDIzMywxODYsIDExLDE4NiwgMjMsMTg2LCA0MiwxODYsIDUzLDE4NiwgODYsMTg2LDEwOCwxODYsCi0gICAgMTE2LDE4NiwxMjcsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgOTksMjI2LDIyOSwyMzgsMjMxLAotICAgIDIyNSwyMzYsMTA1LDEyOCwgIDksMjMzLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzYsIDk4LDE4NSwKLSAgICAxNDUsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsCi0gICAgMTAyLDEyOCwgMzksMTQwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDEwNSwyMjksMjMzLDIzMSwyMzIsMjQ0LAotICAgIDIzMiwxMTUsMTI4LCAzMywgOTIsMjMxLDExNywgIDIsMTg1LDE4OCwxODUsMTk3LDIzNCwyMjUsMjQyLDIyNSwKLSAgICAyNDQsMTA1LDEyOCwgMTAsMjMzLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTA1LDIzMiwgOTcsCi0gICAgICAyLDE4NSwyMTMsMTg1LDIyNCwyMjcsMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk5LAotICAgIDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsIDM1LDEwNSwgIDIsMTg1LDIzOSwxODYsICAxLDIyOCwKLSAgICAyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsCi0gICAgIDM0LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEzMSwyMzcsMjM5LDIzOCwyMzksMjQzLAotICAgIDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxOSwyMzgsMjQ1LDIzNywyMjksMjQyLDIyNSwyNDQsMjM5LDI0MiwKLSAgICAyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDYsMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksCi0gICAgMjM2LDEwMSwxMjgsMjQ3LCA1MSwxMTIsICAyLDE4NiwgNTksMTg2LCA2NiwyMjUsMjQyLDIyOSwxMTAsMTI4LAotICAgICAzNiwxMTgsMjI5LDExNCwgIDIsMTg2LCA3MywxODYsIDc5LDIzMywyMzksMTAwLDEyOCwgMzYsMTM4LDI0MywKLSAgICAyMzMsMjI1LDExMCwxMjgsICA2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMTE1LDEyOSwgIDAsCi0gICAgMTkwLDE4NiwgOTksMjI5LDIzNywyMjgsMjI1LDI0MywxMDQsMTI4LDI0NiwyMjIsMjQyLDIzOSwyMzcsMjI1LAotICAgIDExMCwxMjgsIDMzLDExNCwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDAsMTc5LDI0NCwKLSAgICAyMzIsMjI1LDEwNSwxMjgsIDE0LCA4MywyNTAsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDgsCi0gICAgMTA1LCAgNywxODYsMTYwLDE4NiwxNzEsMTg3LCAzMCwxODcsMTI4LDE4NywxNDAsMTg3LDE4OSwxODcsMjA2LAotICAgIDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgOTcsMTA3LCAgMiwxODYsMTc3LDE4NiwKLSAgICAyMDEsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTkzLDE4NiwxODksMjMyLDIyNSwyMzYsCi0gICAgMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjksMjI5LDI0NSwxMTYsICA0LDE4NiwyMTMsMTg2LAotICAgIDI0OCwxODcsICA3LDE4NywgMTYsIDk3LCAgMiwxODYsMjE5LDE4NiwyMzQsMjI3LDIzMywyNDIsMjI3LDIzNiwKLSAgICAyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTIsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxNiwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LAotICAgIDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCA5OCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA1NSwKLSAgICAyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICAyLDIzNiwyMjgsCi0gICAgMTAxLDEzMywgIDIsMjIwLDE4NywgNDYsMTg3LCA1NywxODcsIDc0LDE4NywgODYsMTg3LDExNCwyMjYsMjI5LAotICAgIDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQ4LCA5OSwgIDIsMTg3LCA2MywxODcsIDY4LDIzNywKLSAgICAgOTgsMTI4LCAgMywgIDMsMjM5LDIzNywgOTgsMTI4LCAgMywgIDMsMjI4LDIzOSwyNDUsMjI2LDIzNiwyMjksCi0gICAgMjI3LDIzNywgOTgsMTI4LCAgMywgOTYsMTExLCAgMiwxODcsIDkyLDE4NywxMDIsMjQwLDIyOSwyNDIsMjI1LAotICAgIDI0NCwyMzksMTE0LDEyOCwgMzQsIDYwLDI0NiwyMjksMjQyLDIzNiwyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwKLSAgICAgIDMsIDUyLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwyMzYsMjI3LDIzNywgOTgsMTI4LCAgMywgNjIsCi0gICAgMjM3LDIyOSwyNDMsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNCwxNTEsMTEyLCAgMiwxODcsMTQ2LAotICAgIDE4NywxNzYsMjI5LDIzMiwgOTcsICAyLDE4NywxNTQsMTg3LDE2MywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE1MCwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTAsCi0gICAgMjQwLDIzMywyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTEyLDI0NCwyMzYsMjM5LAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywyMjcsMjI3LDIzNywgOTgsMTI4LCAgNCwxMzEsMjQ3LDIzOCwKLSAgICAyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTI3LDIzNiwyMzMsMjM4LDIyOSwyMjYsCi0gICAgMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTExLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwyNTUsIDg0LDExMSwgIDcsMTg4LCAgMywxODgsIDE0LDE4OCwgMjUsMTg4LCA1MCwxODgsMTcwLDE4OCwKLSAgICAxODIsMTg5LCAxMCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTA1LDIzMiwyMzMsCi0gICAgMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDQsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAotICAgICA5NywxMjksIDQ4LDIwMCwxODgsIDM4LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwKLSAgICAyNTUsMTMyLDExMCwgIDMsMTg4LCA1OCwxODgsMTU2LDE4OCwxNjEsMTAxLCAgNCwxODgsIDY4LDE4OCwxMzcsCi0gICAgMTg4LDE0NCwxODgsMTUwLDIyNiwyMjUsMTE0LCAgNCwxODgsIDgwLDE4OCwxMDksMTg4LDExOSwxODgsMTI4LAotICAgIDIyOSwyNDgsMjQ0LDI0MiwgOTcsICAyLDE4OCwgOTAsMTg4LDEwMCwyMzIsMjMzLDIzMSwyMzIsMjM3LDIzOSwKLSAgICAxMDAsMTI4LCAgMiwyMjksMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMzMsMjMyLDIzMywyMzEsCi0gICAgMjMyLDIzNywyMzksMTAwLDEyOCwgIDIsMjMwLDIzNiwyMzksMjQ3LDIzNywyMzksMTAwLDEyOCwgIDIsMjMyLAotICAgIDIzNywyMzMsMjI4LDIzNywyMzksMTAwLDEyOCwgIDIsMjMxLDIzMCwyMzMsMjQ2LDEwMSwxMjgsICAxLDE4OSwKLSAgICAyNDMsMjMzLDEyMCwxMjgsICAxLDEzMywyNDQsMjQ3LDExMSwxMjgsICAxLDE2OCwyMzksMTE1LDEyOCwgIDMsCi0gICAgMTMyLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM5LDI0MCwyMjUsMjQ0LDIyNSwyMzUsMjQ0LAotICAgIDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE1LDI0MiwyNDQsMjM5LDIzMywyNDMsMjI5LDI0MywyMzIsMjI5LDIzNiwKLSAgICAyMzYsMjI2LDI0MiwyMjUsMjI3LDIzNSwyMjksMTE2LCAgMiwxODgsMjA1LDE4OCwyMzUsMjM2LDIyOSwyMzAsCi0gICAgMTE2LDEzMCwgNDgsIDIwLDE4OCwyMTYsMTg4LDIyNCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDkzLAotICAgIDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTcsMjQyLDIzMywyMzEsMjMyLDExNiwKLSAgICAxMzAsIDQ4LCAyMSwxODgsMjQ3LDE4OCwyNTUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LCA5NCwyNDYsCi0gICAgMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDU4LDI0NCwyMjUsMjM5LDI0NCwyMzIsMjI1LAotICAgIDEwNSwxMjgsIDE0LCAyMSwyNDAsIDk3LCAgMiwxODksIDI3LDE4OSwgMzksMjM2LDIyNSwyNDQsMjI1LDIzNiwKLSAgICAyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNzEsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzUsMTE0LCAgMywxODksCi0gICAgIDUzLDE4OSwgODQsMTg5LCA5OSwyMjUsMjI4LDIyOSwyMzcsMjI1LDI0MiwxMDcsMTI5LCAzMywgMzQsMTg5LAotICAgICA2NSwxMTUsICAyLDE4OSwgNzEsMTg5LCA3NywyMjUsMjM4LDExNSwxMjgsMjQ4LDIzNCwyMjksMjQyLDIzMywKLSAgICAxMDIsMTI4LDI0NiwyMTksMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsMjI5LDI0OCwyMzIsMjM5LDIzOSwxMDcsCi0gICAgMTI4LCAgMiwxMzYsMjMzLDIyNSwxMDMsICA0LDE4OSwxMTEsMTg5LDExNiwxODksMTIxLDE4OSwxMjYsMjI4LAotICAgIDExMCwxMjgsIDM3LDE4OCwyMzYsMTAyLDEyOCwgMzcsMTk2LDI0MiwxMTYsMTI4LCAzNywxODYsMjQ1LDExMiwKLSAgICAxMjgsIDM3LDE3OCwxMTUsMTMyLCAgMiwxNjYsMTg5LDE0MywxODksMTgyLDE5MCwgMzIsMTkwLCA0NSwyMjUsCi0gICAgMjI4LDEwNSwxMzAsICA1LDIzMCwxODksMTUzLDE4OSwxNzMsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LAotICAgIDI1MSwgNzAsMTg5LDE2NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3MCwyMzIsMjI5LDIyNiwKLSAgICAyNDIsMjI5LDExOSwxMjgsICA1LDIzMCwxMDEsICAyLDE4OSwxODgsMTg5LDE5OSwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDcwLDI0MiwxMDEsMTM0LCAgNSwxODEsMTg5LDIxNiwxODksMjMwLAotICAgIDE4OSwyMzUsMTg5LDI0NCwxOTAsICAzLDE5MCwgMTksIDQ5LCAgMiwxODksMjIyLDE4OSwyMjYsIDUwLDEyOCwKLSAgICAgIDUsMTgxLDEwMSwxMjgsICA1LDE4MSwxNzgsIDk4LDEyOCwgIDUsMTgxLDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwgIDUsMTgxLDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAotICAgIDEyOCwgIDUsMTgxLDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE4MSwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODEsCi0gICAgMjMyLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDkxLDI0NSwyNDAsMjI5LAotICAgIDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDI0MywxMTYsICA0LDE5MCwgNjUsMTkwLDExNSwxOTAsMTgwLDE5MCwKLSAgICAyMzEsIDk3LCAgMywxOTAsIDczLDE5MCwgODMsMTkwLCA5MCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCi0gICAgMTI4LCAgOSwxNTksMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDMxLDIzMSwxMTcsICAyLDE5MCwgOTcsMTkwLAotICAgIDEwNiwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1OSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwKLSAgICAxMjgsIDEwLCAzMSwyMjksMTA0LCAgNCwxOTAsMTI2LDE5MCwxMzUsMTkwLDE0OSwxOTAsMTY1LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTIxLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1MSwxMDMsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTEsMTA0LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTEsMTA1LDIzMiwgOTcsICAzLDE5MCwxODksMTkwLDE5OSwxOTAsMjA2LDIyNiwyMjksMjM4LAotICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2MCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzIsMjMxLDExNywKLSAgICAgIDIsMTkwLDIxMywxOTAsMjIyLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTYwLDI0MiwyMzcsCi0gICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDMyLDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxMzUsMTE3LAotICAgICAgMywxOTAsMjQ3LDE5MSwgIDIsMTkxLCAyNywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsMTAwLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxOTYsMTkxLCAxNSwyMzIsCi0gICAgMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEzMCwyNDMsMjM3LDIyNSwyMzYsMTA4LAotICAgICAgMiwxOTEsIDM3LDE5MSwgNDgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA5OSwKLSAgICAyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTk1LDE5MSwgNjEsMjMyLDIyNSwyMzYsCi0gICAgMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMTEsMTE5LCAgMiwxOTEsIDc5LDE5MSwxODQsMTAxLAotICAgICAgMiwxOTEsIDg1LDE5MSwxMzMsMjM2LDI0NiwxMDEsICAzLDE5MSwgOTUsMTkxLDEwNCwxOTEsMTI1LDIyNywKLSAgICAyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTA3LDExMiwgIDIsMTkxLDExMCwxOTEsMTE3LDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDM2LDEyNywyMjksMjQyLDIzMywyMzksMTAwLDEyOCwgMzYsMTQ3LDI0MiwyMzksMjM3LAotICAgIDIyNSwxMTAsMTI4LCAzMywxMjMsMjM4LDI0NCwxMjEsICAzLDE5MSwxNDMsMTkxLDE1MiwxOTEsMTYzLDIyNywKLSAgICAyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTE1LDIzMiwyMjUsMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsCi0gICAgMTI4LCA4MywgNjgsMTEyLCAgMiwxOTEsMTY5LDE5MSwxNzYsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTM1LAotICAgIDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTUsMTExLDE0MiwgIDAsIDUwLDE5MSwyMTYsMTkxLDIyNSwKLSAgICAxOTEsMjM1LDE5MiwgIDksMTkyLCA2MSwxOTIsIDg2LDE5MiwxMTMsMTkyLDE0NywxOTIsMTU5LDE5MiwxNzgsCi0gICAgMTkyLDE4OSwxOTIsMjIyLDE5MiwyMzAsMTkyLDI1NCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LAotICAgICA5OCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwKLSAgICAxMDEsMTI5LCAzNiwgOTcsMTkxLDI0NiwyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywyMjksMjQzLDIyNSwyMzgsCi0gICAgMjQzLDI0MywyMjksMjQyLDIzMywxMDIsMTI4LCAzOSwxMzksMTAwLCAgMiwxOTIsIDE1LDE5MiwgMjEsMjI5LAotICAgIDI0NiwgOTcsMTI4LCAgOSwxMDQsMjM5LDExNiwgIDIsMTkyLCAyOCwxOTIsIDM5LDIyOSwyMzgsMjM2LDIyOSwKLSAgICAyMjUsMjI4LDIyOSwxMTQsMTI4LCAzMiwgMzcsMjM2LDIyOSwyMjUsMjI4LDIyOSwxMTQsMTI5LCAzMiwgMzcsCi0gICAgMTkyLCA1MCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDQ4LDIzMSwxMTcsICAyLAotICAgIDE5MiwgNjgsMTkyLCA3NywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIzMiwyNDIsMjM3LDI0NSwKLSAgICAyMzUsMjMyLDEwNSwxMjgsIDEwLDEwNCwyMzIsIDk3LCAgMiwxOTIsIDkzLDE5MiwxMDQsMjI3LDIzNSwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5OCwyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LAotICAgICAzNCwxMDUsICAyLDE5MiwxMTksMTkyLDEzNywyMjgsMjI5LDIzOSwyMzEsMjQyLDIyNSwyNDAsMjMyLDIzMywKLSAgICAyMjcsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCAzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsCi0gICAgMTI4LCAzMiwxMzAsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTgsMjM4LAotICAgIDI0NSwyMzcsMjI5LDI0MiwyMjUsMjQ0LDIzOSwyNDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwKLSAgICAgIDksMjQ1LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNTAsMTEyLCAgMiwxOTIsCi0gICAgMTk1LDE5MiwyMDIsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTE3LDIyOSwxMTQsICAyLDE5MiwyMDksMTkyLAotICAgIDIxNSwyMzMsMjM5LDEwMCwxMjgsIDM2LDEzNywyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDIsMjQyLDIzOSwKLSAgICAyMzcsMjI1LDExMCwxMjgsIDMzLDExMywxMTUsICAyLDE5MiwyMzYsMTkyLDI0NCwyNDQsMjQyLDIzOSwyMzUsCi0gICAgMTAxLDEyOCwgIDEsMTg3LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAwLDE3OCwyNDQsMTA0LAotICAgICAgMiwxOTMsICA1LDE5MywgMTAsMjI1LDEwNSwxMjgsIDE0LCA4MiwyMzMsMjQyLDIyOCwxMTUsMTI4LCAzMywKLSAgICAgODQsMTE3LDE0NSwgIDAsMTE3LDE5MywgNTUsMTkzLCA2MywxOTMsMTA0LDE5MywxNjEsMTk0LCA0MywxOTQsCi0gICAgIDgwLDE5NCwyMDMsMTk0LDIxOSwxOTUsIDE0LDE5NSwgODQsMTk1LDE2NSwxOTUsMTc0LDE5NiwgMzcsMTk2LAotICAgICA2MSwxOTYsMTY5LDE5NiwxOTcsMTk3LCA1NSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDAsMjUwLCA5OCwKLSAgICAgIDQsMTkzLCA3MywxOTMsIDc4LDE5MywgODcsMTkzLCA5NywyMjUsMTE0LDEyOCwgIDIsMTM3LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM3LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LAotICAgICA0MCwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMSwxMDksIDk5LCAgMywxOTMsMTEyLDE5MywxMTksMTkzLDE1MSwKLSAgICAyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMTIsMjMzLDI0MiwgOTksICAyLDE5MywxMjcsMTkzLDEzMiwyMzYsCi0gICAgMTAxLDEyOCwgMzYsMjI4LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOSwgIDAsMjUxLDE5MywxNDMsMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExOSwyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAgNjcsMTAwLCAgNSwxOTMsMTczLDE5MywxODQsMTkzLDIwNywxOTMsMjEzLDE5NCwgMzMsMjI1LDI0NCwyNDQsCi0gICAgMjI1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA4MSwyMjYsMTA4LCAgMiwxOTMsMTkxLDE5MywxOTksMjI1LAotICAgIDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDExMywyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDIsIDIxLDIyOSwKLSAgICAyNDYsIDk3LDEyOCwgIDksICA5LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzMsICAwLDI1MiwxOTMsCi0gICAgMjMzLDE5MywyNDEsMTkzLDI0OSwxOTQsIDE2LDE5NCwgMjQsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLAotICAgIDIxNiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTE1LCA5OSwgIDIsMTkzLDI1NSwxOTQsICA2LDIyNSwKLSAgICAyNDIsMjM5LDExMCwxMjgsICAxLDIxOCwyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyNDEsCi0gICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAxLDIyMCwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLAotICAgIDIxNCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyMjksMTAzLCAgMiwxOTQsIDQ5LDE5NCwKLSAgICAgNTYsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDAsMjQ5LDExNywgIDIsMTk0LCA2MiwxOTQsIDcxLDIzNCwyMjUsCi0gICAgMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTM3LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsICA5LAotICAgIDEwNCwgIDMsMTk0LCA4OCwxOTQsIDk4LDE5NCwxNzYsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKLSAgICAgNDgsIDcwLDExMSwgIDIsMTk0LDEwNCwxOTQsMTE0LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsCi0gICAgIDMwLDIzMSwyNDIsMTEwLDEzMywgIDEsMTc2LDE5NCwxMjksMTk0LDEzNywxOTQsMTQ4LDE5NCwxNTYsMTk0LAotICAgIDE2OCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjMzLDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwKLSAgICAxMTksMTI4LCAzMCwyNDEsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIzNSwyMzIsMjM5LDIzOSwyMzUsCi0gICAgMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIzNywyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMjM5LAotICAgIDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwxMTYsMTI5LCAgMSwxMTMsMTk0LDE5MiwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjQzLDIzMywyMzgsMjQ2LDIyOSwyNDIsCi0gICAgMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLCAyMywxMDcsICAzLDE5NCwyMjcsMTk0LAotICAgIDI1MSwxOTUsICA2LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE2NiwxOTQsMjM5LDIzMiwKLSAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTE1LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwxMjEsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5MiwxMDksICAyLAotICAgIDE5NSwgMjAsMTk1LCA3MywgOTcsICAyLDE5NSwgMjYsMTk1LCA1OSwyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwKLSAgICAxMDcsMTk1LCAzNywxOTUsIDQ4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMzksCi0gICAgMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsIDMwLDEyMywyNDQsMjQyLDIyNSwyMzEsMjQ1LAotICAgIDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDY1LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywKLSAgICAxMDEsMTI4LDI1NSwgODUsMTEwLCAgMiwxOTUsIDkwLDE5NSwxNDUsMjI4LDIyOSwyNDIsMjQzLDIyNywyMzksCi0gICAgMjQyLDEwMSwxMzIsICAwLCA5NSwxOTUsMTA5LDE5NSwxMTUsMTk1LDEyNywxOTUsMTM4LDIyOCwyMjYsMTA4LAotICAgIDEyOCwgMzIsIDIzLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDYzLDI0NiwKLSAgICAyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTEsMjQ3LDIyNSwyNDYsMTIxLDEyOCwyNTQsCi0gICAgIDc5LDEwNSwgIDIsMTk1LDE1MSwxOTUsMTU2LDIzOSwxMTAsMTI4LCAzNCwgNDIsMjQ2LDIyOSwyNDIsMjQzLAotICAgIDIyNSwxMDgsMTI4LCAzNCwgIDAsMjM5LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI4LCAgMSwxMTUsMTEyLCAgNSwKLSAgICAxOTUsMTg2LDE5NSwxOTMsMTk1LDIwMSwxOTUsMjE2LDE5NiwgMTEsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsCi0gICAgMTc2LDIyNiwyMzYsMjM5LDIyNywxMDcsMTI4LCAzNywxMjgsMjQwLDIyOSwyNDIsMjI4LDIzOSwyNDQsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTYsMjQzLDIzMywyMzYsMjM5LDExMCwxMzEsICAzLDE5NywKLSAgICAxOTUsMjMwLDE5NSwyNTEsMTk2LCAgMywyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOSwgIDMsCi0gICAgMjAzLDE5NSwyNDMsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDE3NiwyMzYsMjI1LDI0NCwyMzMsMTEwLAotICAgIDEyOCwgIDIsMTM4LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywyMDUsMjQ0LDIyNSwyMjcsMTA3LCAgMiwKLSAgICAxOTYsIDIwLDE5NiwgMzEsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAyOSwyMzcsCi0gICAgMjM5LDEwMCwxMjgsICAyLDIxMiwxMTQsICAyLDE5NiwgNDMsMTk2LCA1NSwyMjUsMjMxLDI0NSwyNDIsMjM3LAotICAgIDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExNSwyMzMsMjM4LDEwMywxMjgsICAxLDExMSwxMTUsICAzLDE5NiwKLSAgICAgNjksMTk2LCA4NCwxOTYsMTI5LDIzMiwyMzksMjQyLDI0NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsIDk0LDIzNywyMjUsMjM2LDEwOCwgIDIsMTk2LCA5MywxOTYsMTA0LDIzMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNjksMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjksIDQ4LDE2NSwxOTYsMTE3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCi0gICAgMTA1LDI0NCwyNDIsMjI1LDIzMywyMzEsMjMyLDExNiwgIDIsMTk2LDE0MSwxOTYsMTUyLDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNzUsMjQzLDI0NCwyNDIsMjM5LDIzNSwyMjksMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3NywyNDQsMjMzLDIzNiwyMjgsMTAxLDEzMCwgIDEsCi0gICAgMTA1LDE5NiwxODEsMTk2LDE4OSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMTIxLDIyNiwyMjksMjM2LAotICAgIDIzOSwxMTksMTI4LCAzMCwxMTcsMTE3LCAgNSwxOTYsMjA5LDE5NiwyMTksMTk2LDIyNiwxOTYsMjUxLDE5NywKLSAgICAgMTEsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM4LDIyOCwyMjksMjQ2LCA5NywxMjgsCi0gICAgICA5LCAxMCwyMzEsMTE3LCAgMiwxOTYsMjMzLDE5NiwyNDIsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LAotICAgICAxMCwxMzgsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMTAsMjM3LDIyNSwyNDQsMjQyLDIyNSwKLSAgICAyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDY2LDI0NiwyMzksMjQ3LDIyOSwyMzYsCi0gICAgMjQzLDIzMywyMzEsMTEwLCAgMywxOTcsIDI3LDE5NywgMzcsMTk3LCA0NCwyMjYsMjI5LDIzOCwyMzEsMjI1LAotICAgIDIzNiwxMDUsMTI4LCAgOSwxOTQsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDY2LDIzMSwyNDUsMjM0LDIyNSwKLSAgICAyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTQsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsCi0gICAgICAzLDE5NywgNzEsMTk3LCA4MSwxOTcsIDg4LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAotICAgIDE5MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNjUsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDE5MywxMTgsMTM5LCAgMCwxMTgsMTk3LDEyNSwxOTgsIDE3LDE5OCwgMjYsMTk4LCAzNywxOTgsCi0gICAgMjIyLDE5OCwyMjksMTk5LCA3MSwxOTksIDgzLDE5OSwxODMsMTk5LDE5MSwxOTksMjEyLCA5NywgIDQsMTk3LAotICAgIDEzNSwxOTcsMTQyLDE5NywxNjcsMTk3LDE3OCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNTMsMjMxLDExNywKLSAgICAgIDIsMTk3LDE0OSwxOTcsMTU4LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTgxLDI0MiwyMzcsCi0gICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDUzLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwyNDcsMTE4LDEzMiwgIDUsMjEzLDE5NywxOTAsMTk3LDIxNywxOTcsMjQ5LDE5OCwgIDUsMjI4LDIyNSwKLSAgICAyMzEsMjI5LDI0MywxMDQsMTMwLDI1MSwgNTMsMTk3LDIwMywxOTcsMjA4LDE4MiwgNTMsMTI4LDI1MSwgNTMsCi0gICAgMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNTMsMTA0LCAgMiwxOTcsMjIzLDE5NywyMzEsMjI5LAotICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxMywyMzksMjM2LDIyNSwxMDksMTI5LDI1MSwgNzUsMTk3LDI0MCwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3NSwyNDYsMjI1LDI0NiwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDI0MCwyNDksMjM5LDIyOCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LAotICAgIDI0MSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDIyOSwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwKLSAgICAyMzksMTE5LDEyOCwgMzAsMTI3LDEwMSwgIDYsMTk4LCA1MSwxOTgsIDYyLDE5OCwxMjYsMTk4LDEzNywxOTgsCi0gICAgMTQzLDE5OCwyMTAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA1MCwxMDQsICA0LAotICAgIDE5OCwgNzIsMTk4LCA4MSwxOTgsIDk1LDE5OCwxMTEsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKLSAgICAxNjQsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDEwNywyMzMsCi0gICAgMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMDgsMjM3LAotICAgIDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMDksMjM1LDIyNSwKLSAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0OSwyMzgsMjQ1LDExNSwxMjgsIDM4LCA2NCwyNDIsCi0gICAgMjQ0LDIzMywyMjcsMjI1LDEwOCwgIDIsMTk4LDE1NCwxOTgsMTYwLDIyNiwyMjUsMTE0LDEyOCwgIDAsMTI0LAotICAgIDIzNiwyMzMsMjM4LDEwMSwgIDQsMTk4LDE3MywxOTgsMTg0LDE5OCwxOTUsMTk4LDIwNCwyMjUsMjI2LDIzOSwKLSAgICAyNDYsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDEzLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsCi0gICAgMTI4LCAgMywgNDEsMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMDQsMjM3LDIzOSwxMDAsMTI4LAotICAgICAgMiwyMDAsMjQ3LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjYsMjMyLDIzOSwKLSAgICAyMzksMTA3LDEyOCwgIDIsMTM5LDEwNSwgIDMsMTk4LDIzNywxOTgsMjQ4LDE5OSwgMzEsMjM1LDIyNSwyNDQsCi0gICAgMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0OCwyNDIsMjI1LDIzNywgOTcsICAzLDE5OSwgIDMsMTk5LAotICAgICAxMywxOTksIDIwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIwNSwyMjgsMjI5LDI0NiwKLSAgICAgOTcsMTI4LCAgOSwgNzcsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIwNSwyNDMsCi0gICAgMjI1LDI0MiwyMzEsIDk3LCAgMywxOTksIDQzLDE5OSwgNTMsMTk5LCA2MCwyMjYsMjI5LDIzOCwyMzEsMjI1LAotICAgIDIzNiwxMDUsMTI4LCAgOSwxMzEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksICAzLDIzMSwyNDUsMjM0LDIyNSwKLSAgICAyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCi0gICAgMTI4LDI1NSwgODYsMTExLCAgMywxOTksIDkxLDE5OSwxMDIsMTk5LDE3MiwyMjUsMjQyLDIzNywyMjksMjM4LAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsMTIwLDIzMywyMjcsMjI5LDEwMCwgIDIsMTk5LDExMSwxOTksMTQ3LDIzMywKLSAgICAyNDQsMjI5LDI0MiwyMjUsMjQ0LDIzMywyMzksMTEwLCAgMiwxOTksMTI1LDE5OSwxMzYsMjMyLDIzMywyNDIsCi0gICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE1OCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsMjU0LDIzNywyMjUsMjQyLDIzNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNTUsMTk5LDE2MCwKLSAgICAyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE1OCwyMzUsMjI1LDI0NCwyMjUsCi0gICAgMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjUwLDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzcsMTE2LAotICAgICAgMiwxOTksMTk3LDE5OSwyMDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTI1LDI0NSwyNDIsMjM4LDIyOSwKLSAgICAxMDAsMTI4LCAgMiwxNDAsMTE3LCAgMiwxOTksMjE4LDE5OSwyMjksMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsCi0gICAgMjM4LCA5NywxMjgsIDQ4LDE0OCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjQ0LAotICAgIDExOSwxNDMsICAwLDExOSwyMDAsIDE4LDIwMCwyNTEsMjAxLCAgNSwyMDEsIDI4LDIwMSwgNjgsMjAxLDEzNSwKLSAgICAyMDEsMTQzLDIwMywxMTQsMjAzLDE1NSwyMDMsMTY3LDIwMywyNDIsMjAzLDI1MCwyMDQsICAxLDIwNCwgMTIsCi0gICAgMjA0LCAyMSwgOTcsICA4LDIwMCwgMzYsMjAwLCA0MywyMDAsIDUzLDIwMCwgNjQsMjAwLDEwMiwyMDAsMTM0LAotICAgIDIwMCwxNDYsMjAwLDE4MiwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxMzEsMjI5LDIzNSwyMzksMjQyLDIyOSwKLSAgICAyMjUsMTEwLDEyOCwgNDksIDg5LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNDMsCi0gICAgMTA3LCAgMiwyMDAsIDcwLDIwMCwgOTQsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjM5LAotICAgIDIwMCwgODIsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNTYsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LCA4OCwyNDMsMjM3LDIyNSwyMzYsMTA4LCAgMiwyMDAsMTEyLDIwMCwxMjMsCi0gICAgMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE0MiwyMzUsMjI1LDI0NCwyMjUsMjM1LAotICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsMjM4LDI0NCwyNDQsMjM5LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsIDg3LDExOCwgIDIsMjAwLDE1MiwyMDAsMTYwLDIyOSwyMjgsMjI1LDI0MywxMDQsMTI4LCA0OCwgMjgsCi0gICAgMjQ5LDI0NSwyMzgsMjI4LDIyOSwyNDIsMjQzLDIyNywyMzksMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDQsMjMzLAotICAgIDIyNywyMjUsMTA4LDEyOCwyNTQsIDUyLDExOSwgIDMsMjAwLDE5MCwyMDAsMTk5LDIwMCwyMTMsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzIsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjU0LDIzOCwyMzIsMjI1LDIzNywyNTAsMjI1LDIyNSwyMjYsMjM5LDI0NiwxMDEsICAyLAotICAgIDIwMCwyMjgsMjAwLDIzNywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAzNiwyMzAsMjMzLDIzOCwKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTM0LDIyNiwyNDMsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDEwMSwxMjgsIDUxLDIyMSwyMjcsMjMzLDI0MiwgOTksICAyLDIwMSwgMTQsMjAxLCAxOSwyMzYsMTAxLAotICAgIDEyOCwgMzYsMjMwLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsMTE3LDEwMCwgIDIsMjAxLCAzNCwKLSAgICAyMDEsIDQ0LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsIDMwLDEzMywyMzksMTE2LCAgMiwyMDEsCi0gICAgIDUxLDIwMSwgNjAsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwxMzUsMjI2LDIyOSwyMzYsMjM5LAotICAgIDExOSwxMjgsIDMwLDEzNywxMDEsICA0LDIwMSwgNzgsMjAxLCA4OSwyMDEsMTAxLDIwMSwxMjUsMjMyLDIzMywKLSAgICAyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE0NSwyMzMsMjI5LDI0MiwyNDMsMjQ0LDI0MiwyMjUsCi0gICAgMjQzLDExNSwxMjgsIDMzLCAyNCwxMDcsICAyLDIwMSwxMDcsMjAxLDExNywyMjUsMjQ0LDIyNSwyMzUsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwyNDEsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5NCwyMzksMjM1LDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTMsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDEyOSwyMzIsCi0gICAgMjMzLDI0NCwxMDEsICA4LDIwMSwxNjQsMjAxLDE3MywyMDIsICAxLDIwMiwgOTEsMjAyLDE3NSwyMDIsMjIwLAotICAgIDIwMywgMTYsMjAzLCA3MiwyMjYsMjQ1LDIzNiwyMzYsMjI5LDExNiwxMjgsIDM3LDIzMCwgOTksICAyLDIwMSwKLSAgICAxNzksMjAxLDE5OSwyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzcsMjAzLDIwMSwxODksMjMzLDIzOCwyNDYsCi0gICAgMjI5LDI0MiwyNDMsMTAxLDEyOCwgMzcsMjE3LDIzOSwyNDIsMjM4LDIyOSwyNDIsMjI2LDI0MiwyMjUsMjI3LAotICAgIDIzNSwyMjksMTE2LCAgMiwyMDEsMjE2LDIwMSwyMzYsMjM2LDIyOSwyMzAsMTE2LDEyOSwgNDgsIDE0LDIwMSwKLSAgICAyMjUsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA2NywyNDIsMjMzLDIzMSwyMzIsCi0gICAgMTE2LDEyOSwgNDgsIDE1LDIwMSwyNDYsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LAotICAgICA2OCwxMDAsICAyLDIwMiwgIDcsMjAyLCA0OCwyMzMsMjI1LDIzNywyMzksMjM4LDEwMCwxMjksIDM3LDE5OSwKLSAgICAyMDIsIDE4LDIyNywyMzksMjM4LDI0NCwyMjUsMjMzLDIzOCwyMzMsMjM4LDIzMSwyMjYsMjM2LDIyNSwyMjcsCi0gICAgMjM1LDI0MywyMzcsMjI1LDIzNiwyMzYsMjI4LDIzMywyMjUsMjM3LDIzOSwyMzgsMTAwLDEyOCwgMzcsMjAwLAotICAgIDIzOSwyNDcsMjM4LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwxMDMsICAyLDIwMiwgNjQsMjAyLCA4MCwKLSAgICAyNDMsMjM3LDIyNSwyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxOTEsCi0gICAgMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4OSwyMzYsMTAxLCAgMiwyMDIsIDk4LAotICAgIDIwMiwxNDAsMjMwLDI0NCwyNDAsMjM5LDIzMywyMzgsMjQ0LDIzMywyMzgsMTAzLCAgMiwyMDIsMTEzLDIwMiwKLSAgICAxMjksMjQzLDIzNywyMjUsMjM2LDIzNiwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsCi0gICAgMTk1LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxOTMsMjM4LDI0NCwyMzMsMjI3LAotICAgIDI0NSwyMzYsMjI1LDI0MiwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwxMTYsICAyLDIwMiwxNjAsMjAyLDE2NywKLSAgICAyMzYsMjI5LDIzMCwxMTYsMTI4LCA0OCwgMjIsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDQ4LCAyMywyNDIsCi0gICAgMjMzLDIzMSwyMzIsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwxMDMsICAyLDIwMiwxOTMsMjAyLAotICAgIDIwOSwyNDMsMjM3LDIyNSwyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywKLSAgICAxODUsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4MywxMTUsICAzLDIwMiwyMjgsCi0gICAgMjAzLCAgMiwyMDMsIDEwLDEwOSwgIDIsMjAyLDIzNCwyMDIsMjQ2LDIyNSwyMzYsMjM2LDI0MywyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgMzcsMTcxLDIzMywyMzYsMjMzLDIzOCwyMzEsMjMwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAgMzgsIDU4LDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCAzNywxNjEsMjQ0LDIyNSwxMTQsMTI4LCAzOCwgIDYsCi0gICAgMTE2LCAgMiwyMDMsIDIyLDIwMywgMzMsMjI5LDIzNiwyMjksMjQwLDIzMiwyMzksMjM4LDEwMSwxMjgsIDM4LAotICAgICAxNSwyMzksMjQyLDI0NCwyMzksMjMzLDI0MywyMjksMjQzLDIzMiwyMjksMjM2LDIzNiwyMjYsMjQyLDIyNSwKLSAgICAyMjcsMjM1LDIyOSwxMTYsICAyLDIwMywgNTcsMjAzLCA2NCwyMzYsMjI5LDIzMCwxMTYsMTI4LCA0OCwgMjQsCi0gICAgMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDQ4LCAyNSwyNDUsMjQwLDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLAotICAgIDIzOCwxMDMsICAyLDIwMywgODcsMjAzLDEwMywyNDMsMjM3LDIyNSwyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwKLSAgICAyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxODEsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsCi0gICAgIDM3LDE3OSwxMDUsICAyLDIwMywxMjAsMjAzLDEzMSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsMTQ0LDEwNywgIDIsMjAzLDEzNywyMDMsMTQ3LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjgsIDQ4LDI0MCwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDk1LDIzNywyMzksMjM4LDIzOSwyNDMsCi0gICAgMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg3LDExMSwgIDQsMjAzLDE3NywyMDMsMTg4LDIwMywyMTMsMjAzLAotICAgIDIzMSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTQ2LDIzNSwyMjUsMjQ0LDIyNSwKLSAgICAyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyNDIsMjAzLDIwMSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsCi0gICAgMjQ0LDEwNCwxMjgsMjU1LDEwMiwxMTAsMTI5LCAzMiwxNjksMjAzLDIxOSwyMzcsMjM5LDIzOCwyMzksMjQzLAotICAgIDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LDIzMCwyNDcsMjI1LDIyOSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDM5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzgsMjQyLDIzMywyMzgsMTAzLDEyOCwgMzAsCi0gICAgMTUyLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxODMsMjQ0LDI0NSwyNDIsMjM4LAotICAgIDIyOSwxMDAsMTI4LCAgMiwxNDEsMjQ5LDIzOCwxMTAsMTI4LCAgMSwxOTEsMTIwLDEzNywgIDAsMTIwLDIwNCwKLSAgICAgNDksMjA0LCA2MCwyMDQsIDcxLDIwNCwgODAsMjA0LDEwNywyMDQsMTIwLDIwNCwxMjQsMjA0LDEzNiwyMDQsCi0gICAgMTQ0LDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgNjEsMjI2LDIzOSwyNDAsMjM5LAotICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxOCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDIzMSwKLSAgICAxMDAsICAyLDIwNCwgODYsMjA0LCA5NiwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAzMCwxNDEsCi0gICAgMjM5LDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEzOSwyMjksMjMyLDIyNSwyNDIsMjM3LAotICAgIDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDksMTA1LDEyOCwgIDMsMTkwLDIzNywyMzksMjM4LDIzOSwKLSAgICAyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg4LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzksCi0gICAgMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDIyNywxMjEsMTQzLCAgMCwxMjEsMjA0LAotICAgIDE4OSwyMDUsMTQ4LDIwNSwxNzEsMjA1LDIxMSwyMDcsMTc3LDIwNywxODUsMjA3LDIwMiwyMDgsIDEwLDIwOCwKLSAgICAgMjIsMjA5LCAxOSwyMDksIDU5LDIwOSwgNzEsMjA5LCA4MiwyMDksMTAzLDIxMCwgNzYsIDk3LCAxMSwyMDQsCi0gICAgMjEzLDIwNCwyMjUsMjA0LDIzNSwyMDQsMjQyLDIwNCwyNDksMjA1LCAgMywyMDUsIDI4LDIwNSwgMzksMjA1LAotICAgICA3NywyMDUsIDkwLDIwNSwxMzYsMjI1LDIyOCwyMzksMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwKLSAgICAgNzgsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTc1LDIyNywyNDUsMjQ0LDEwMSwxMjgsCi0gICAgICAwLDI1MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDcsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLAotICAgIDEyOCwgNDksIDgyLDIzMSwxMTcsICAyLDIwNSwgMTAsMjA1LCAxOSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDE3NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA0NywyMzIsMjMzLDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTMyLDEwNywgIDIsMjA1LCA0NSwyMDUsIDY5LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyOCwyMDUsIDU3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKLSAgICAyNDQsMTA0LDEyOCwyNTUsMTQ4LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODEsMjM3LDIyNSwyMzUsCi0gICAgMjM1LDIyNSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDc4LDI0MywyMzcsMjI1LDIzNiwxMDgsICAyLAotICAgIDIwNSwxMDAsMjA1LDExMSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTMxLDIzNSwKLSAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjcsMjA1LDEyNCwyMzIsMjI1LDIzNiwyMzAsCi0gICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwOCwyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCA5OSwyMjcsMjMzLDI0MiwgOTksICAyLDIwNSwxNTcsMjA1LDE2MiwyMzYsMTAxLDEyOCwKLSAgICAgMzYsMjMyLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsMTE5LDEwMCwgIDIsMjA1LDE3NywyMDUsCi0gICAgMTg3LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsICAwLDI1NSwyMzksMTE2LCAgMiwyMDUsMTk0LAotICAgIDIwNSwyMDMsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwxNDMsMjI2LDIyOSwyMzYsMjM5LDExOSwKLSAgICAxMjgsIDMwLDI0NSwxMDEsICA3LDIwNSwyMjcsMjA2LDIzNSwyMDYsMjQ0LDIwNywgIDYsMjA3LCAzOCwyMDcsCi0gICAgMTE0LDIwNywxNjUsMTA0LCAgOCwyMDUsMjQ1LDIwNSwyNTQsMjA2LCAzMiwyMDYsIDQ2LDIwNiwxMTksMjA2LAotICAgIDEzNSwyMDYsMTk0LDIwNiwyMTIsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzQsMjI2LDIyNSwKLSAgICAyNDIsMjQyLDIyOSwxMDEsICAyLDIwNiwgIDksMjA2LCAxOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LDIxMCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTc1LAotICAgIDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNDIsMjMyLDIyNSwKLSAgICAyMzcsMjUwLDIyNSwyMjUsMjI2LDIzOSwyNDYsMTAxLCAgNCwyMDYsIDY1LDIwNiwgNzQsMjA2LCA4OCwyMDYsCi0gICAgMTA0LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDM4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxMzgsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTM5LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQwLDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0MywyMzcsMTAxLCAgMiwyMDYsMTQyLDIwNiwxNTUsMjI4LDIzMywKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQ0LDIyOSwyMzcsMTA1LCAgMiwyMDYsCi0gICAgMTYzLDIwNiwxNzgsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgIDI1MiwyMjEsMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTIsIDg4LDIzOCwyMzksMjM5LDIzOCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTIsMTQ4LDI0NCwyMzIsMjQyLDIyOSwyMjksMjI4LDIzOSwyNDQsMjQzLDIyNiwyMjksMjM2LAotICAgIDIzOSwyNDcsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwyMDksMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA0OSwgODYsMTEwLDEyOSwgIDAsMTY1LDIwNiwyNTAsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsCi0gICAgMjI1LDIyNywxMDEsMTI4LDI1NSwyMjksMTExLCAgMiwyMDcsIDEyLDIwNywgMjEsMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwgODUsMjQyLDIzMywyMzgsMjMyLDIzMywyMjksMjQ1LDIzMiwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LDEzNCwxMTQsICAzLDIwNywgNDYsMjA3LCA4MiwyMDcsIDk0LDIyNSwyMzIsCi0gICAgMjI2LDIyOSwyMzgsMjQ5LDIzOSwyMzcsMTExLCAgMiwyMDcsIDYwLDIwNywgNjksMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwxNzAsMjM2LDIyOSwyMzAsMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMTcwLDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDc1LDI0NSwyMjgsCi0gICAgMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwyNDksMjQzLDIzMywyMjksMjQ1LDIzOCwxMDMsICAzLDIwNywxMjcsMjA3LDEzNiwyMDcsMTUyLDIzNSwKLSAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTI5LDI0MCwyMjUsMjM4LDI0MywyMzMsMjM5LDI0MywyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzMSwyNDMsMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwxMzAsMjQ0LDIzMywyNDYsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKLSAgICAxNTQsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDI0MywyMzIsMjM5LDIzOSwxMDcsMTI5LCAgMSwxODAsCi0gICAgMjA3LDE5NCwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjQ3LDEwNSwgIDUsMjA3LDIxNCwyMDcsMjI1LAotICAgIDIwNywyMzYsMjA3LDI0NSwyMDcsMjUzLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKLSAgICAxMTcsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4NywyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDQ5LCA5OCwyMzgsMjQ5LDIyNSwyMzgsMTAzLDEyOCwgMzgsIDQ3LDI0NywyMzgsMjI1LAotICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzMCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwKLSAgICAyMjUsMjI3LDEwMSwxMjgsMjU1LCA4OSwxMTEsICA3LDIwOCwgMzgsMjA4LDEwOCwyMDgsMTE5LDIwOCwxMjksCi0gICAgMjA4LDE2NywyMDgsMjEzLDIwOCwyMjIsMTAwLDEzMSwgIDUsMjE3LDIwOCwgNDgsMjA4LCA2OCwyMDgsIDc3LAotICAgIDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDU3LDIwOCwgNTksMjMyLDIyOSwyMjYsMjQyLDIyOSwKLSAgICAxMTksMTI4LDI1MSwgNTcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMTcsMjQ5LDIzOSwxMDAsCi0gICAgICAyLDIwOCwgODUsMjA4LCA5NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDI0MiwyNDAsMjI1LAotICAgIDI0NCwyMjUsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDMxLDIzMiwyMzMsMjQyLDIyNSwKLSAgICAyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMzYsMjMzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCi0gICAgMTM3LDEwNywgIDIsMjA4LDEzNSwyMDgsMTU5LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LAotICAgIDIzMiwyMDgsMTQ3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTUwLDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTEsMjQzLDIzNywyMjUsMjM2LDEwOCwgIDIsMjA4LDE3NywyMDgsCi0gICAgMTg4LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMzUsMjM1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzMSwyMDgsMjAxLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKLSAgICAyNDQsMTA0LDEyOCwyNTUsMTEwLDI0NCwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjQzLDEyMSwgIDIsCi0gICAgMjA4LDIyOCwyMDksICA5LCA5NywgIDIsMjA4LDIzNCwyMDgsMjQ0LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LDEzNiwxMDcsICAyLDIwOCwyNTAsMjA5LCAgMiwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNDksMTM1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzNCwyMzMsMjM4LDIzMSwyNDQsMjMyLDIyNSwxMDUsCi0gICAgMTI4LCAxNCwgMTMsMTEyLCAgMiwyMDksIDI1LDIwOSwgMzIsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTgwLAotICAgIDIzOSwyMzEsMjI5LDIzMSwyNDIsMjI1LDIzNywyMzcsMjI5LDIzOCwxMDUsMTI5LCAgMywxMjIsMjA5LCA0OCwKLSAgICAyMzEsMjQyLDIyOSwyMjksMjM1LDIyNywyMzcsIDk4LDEyOCwgIDMsIDY5LDExNCwxMjksICAxLDE2NiwyMDksCi0gICAgIDY1LDIzMywyMzgsMTAzLDEyOCwgMzAsMTUzLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAotICAgICAgMiwxODQsMTE2LCAgMiwyMDksIDg4LDIwOSwgOTUsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMjQ5LDI0NSwKLSAgICAyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxNDIsMTE3LCAgNSwyMDksMTE1LDIwOSwxMjYsMjA5LDEzNiwyMDksCi0gICAgMTc0LDIxMCwgNTAsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEzNCwyMzMsMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxNDAsMTA3LCAgMiwyMDksMTQyLDIwOSwxNjYsMjI1LDI0NCwKLSAgICAyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjMwLDIwOSwxNTQsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsCi0gICAgMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDksMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5NiwxMTUsICAzLAotICAgIDIwOSwxODIsMjA5LDIyMCwyMTAsICA1LDIyNiwyMzMsMTAzLCAgMiwyMDksMTkwLDIwOSwyMDEsMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNywyMzMsMjM5LDI0NCwyMzMsMjMwLDIzMywyMjksCi0gICAgMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMDksMjM2LDIzMywyNDQsMjQ0LAotICAgIDIzNiwxMDEsICAyLDIwOSwyMzEsMjA5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTAzLDIzMywyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDEwNSwyMzcsMjI1LDIzNiwxMDgsICAyLDIxMCwgMTQsMjEwLCAyNSwyMzIsMjMzLAotICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTMzLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwKLSAgICAgOTcsMTI5LCA0OCwyMjksMjEwLCAzOCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsCi0gICAgMjU1LDEwOSwyNDksMTAxLCAgMiwyMTAsIDU3LDIxMCwgNjYsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAotICAgICA0OSwxMzksMjM5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTM4LDI0OSwgOTcsICAyLDIxMCwKLSAgICAgODMsMjEwLCA5MywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjMsMjI4LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksIDk1LDEyMiwxNDIsICAwLDEyMiwyMTAsMTMyLDIxMSwxNDAsMjExLDE1MSwyMTEsMTk0LAotICAgIDIxMSwyMjEsMjEzLCAgMCwyMTMsMTA4LDIxMywxNTAsMjEzLDE2MiwyMTMsMTc0LDIxMywyMDIsMjEzLDIxMCwKLSAgICAyMTMsMjI2LDIxMywyMzUsIDk3LCAxMCwyMTAsMTU0LDIxMCwxNjUsMjEwLDE3MiwyMTAsMTc5LDIxMCwxOTAsCi0gICAgMjExLCAxMiwyMTEsIDQyLDIxMSwgNTMsMjExLCA4OSwyMTEsMTAxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLAotICAgIDIyNSwxMTAsMTI4LCAgNSwxMDIsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMTIyLDIyOCwyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LCA5MSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDkxLDEwNCwgIDQsCi0gICAgMjEwLDIwMCwyMTAsMjA5LDIxMCwyMjMsMjEwLDI1MywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LAotICAgICA1NiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk4LDEwNSwKLSAgICAgIDIsMjEwLDIyOSwyMTAsMjQ0LDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMTk5LDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDg2LDIzNywyMjksMjI4LAotICAgIDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjAwLDIzMywxMTAsICAyLDIxMSwKLSAgICAgMTksMjExLCAyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA1MCwyMzAsMjMzLDIzOCwyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTc2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwxODIsMjQxLDIyOSwxMDIsICAyLDIxMSwgNjEsMjExLCA3NSwyMzEsMjI1LDIyOCwKLSAgICAyMzksMjM2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTQ5LDI0MSwyMjUsMjQ0LDIyNSwyMzgsCi0gICAgMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDgsMjQyLDI0MSwyMjUsMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwxNTIsMjQ5LDIzMywxMTAsMTMwLCAgNSwyMTQsMjExLDExMSwyMTEsMTMxLDIyOCwKLSAgICAyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDU0LDIxMSwxMjIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LDI1MSwgNTQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMTQsMjI2LDIzOSwyNDAsMjM5LAotICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyMywgOTksICAzLDIxMSwxNTksMjExLDE2NiwyMTEsMTg4LDIyNSwKLSAgICAyNDIsMjM5LDExMCwxMjgsICAxLDEyNiwyMzMsMjQyLCA5OSwgIDIsMjExLDE3NCwyMTEsMTc5LDIzNiwxMDEsCi0gICAgMTI4LCAzNiwyMzMsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAzMCwxNDUsMjQ1LDI0MiwxMDgsMTI4LAotICAgICAgMiwxNDUsMjI4LDIzOSwxMTYsMTMwLCAgMSwxMjQsMjExLDIwNCwyMTEsMjEzLDIyNSwyMjcsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEyOCwgIDEsMTI0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNDcsMTAxLCAgNiwyMTEsCi0gICAgMjM1LDIxMSwyNDYsMjEyLCAzMywyMTIsIDQ0LDIxMiwgNTUsMjEyLDI1MSwyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU1LDEwMCwgIDIsMjExLDI1MiwyMTIsIDE1LDIyOSwyNDMsMjI3LDIyOSwKLSAgICAyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1MywyMzMsCi0gICAgMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDIyMywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDkyLDIzNSwyMjUsMjQ0LDIyNSwKLSAgICAyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxODgsMjQyLDExMSwxNDAsICAwLCA0OCwyMTIsIDg0LDIxMiwgOTMsCi0gICAgMjEyLDEwMywyMTIsMTEwLDIxMiwxMzUsMjEyLDE0OCwyMTIsMTU5LDIxMiwxNzEsMjEyLDE4MiwyMTIsMTkyLAotICAgIDIxMiwyMDMsMjEyLDIxMCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5NiwyMjYsMjI5LDIzOCwKLSAgICAyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzAsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksMTAyLDIzMSwxMTcsCi0gICAgICAyLDIxMiwxMTcsMjEyLDEyNiwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIzMCwyNDIsMjM3LAotICAgIDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwMiwyMzIsMjI1LDIyNywyMzUsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LCAgNiwgOTYsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEyOCwyMzcsCi0gICAgMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxNiwyMzksMjM2LDIyOCwyNDMsMjQ0LAotICAgIDI0OSwyMzYsMTAxLDEyOCwyNDcsIDQ4LDI0MCwyMjksMjQyLDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0MCwKLSAgICAyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTEyLDI0NCwyMzIsMjI1LDEwNSwxMjgsCi0gICAgIDE0LCA4MCwyNDcsMjMzLDIyOCwyNDQsMTA0LCAgMywyMTIsMjIyLDIxMiwyMzEsMjEyLDI0MywyMzQsMjM5LAotICAgIDIzMywyMzgsMjI5LDExNCwxMjgsMjU0LDI1NSwyMzgsMjM5LDIzOCwyMzQsMjM5LDIzMywyMzgsMjI5LDExNCwKLSAgICAxMjgsIDMyLCAxMiwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwgMzIsIDExLDI0NCwgOTcsMTI4LCAgMywxODIsCi0gICAgMTA0LCAgMiwyMTMsICA2LDIxMywgMTcsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LAotICAgICAxOSwxMDEsICA0LDIxMywgMjcsMjEzLCAzOCwyMTMsIDU0LDIxMywgNjUsMjI1LDI0MiwyMzcsMjI5LDIzOCwKLSAgICAyMzMsMjI1LDExMCwxMjgsICA1LDEwNiwyMjYsMjQyLDIyOSwyNDYsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwxOTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgICA1NCwxMDAsICAyLDIxMywgNzEsMjEzLCA5MCwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTEsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsCi0gICAgMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMjEsMTA1LCAgMywyMTMsMTE2LAotICAgIDIxMywxMjcsMjEzLDEzOCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDg4LDIzNSwKLSAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxODQsMjM4LDIzOSwyNDIsMjMyLDIyOSwyMjYsCi0gICAgMjQyLDIyOSwxMTksMTI4LCAgNSwxNzQsMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LAotICAgICAzMCwxNDksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgOTAsMTExLCAgMiwKLSAgICAyMTMsMTgwLDIxMywxOTEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA5NCwyMzUsCi0gICAgMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTkwLDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LAotICAgICAzNiwxODEsMjQyLDIyOSwyNDQsMjQyLDIzOSwyMzAsMjM2LDIyOSwyNDgsMjMyLDIzOSwyMzksMTA3LDEyOCwKLSAgICAgIDIsMTQ0LDI0MywyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMTgyLDExNywgIDIsMjEzLDI0MSwyMTMsCi0gICAgMjUyLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgOTAsMjM1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE4NgotICB9OwotCi0KLSAgLyoKLSAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIGNvbXByZXNzZWQgdGFibGUgZWZmaWNpZW50bHkuCi0gICAqLwotICBzdGF0aWMgdW5zaWduZWQgbG9uZwotICBmdF9nZXRfYWRvYmVfZ2x5cGhfaW5kZXgoIGNvbnN0IGNoYXIqICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBsaW1pdCApCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgYyA9IDA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIGNvdW50LCBtaW4sIG1heDsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgcCA9IGZ0X2Fkb2JlX2dseXBoX2xpc3Q7Ci0KLQotICAgIGlmICggbmFtZSA9PSAwIHx8IG5hbWUgPj0gbGltaXQgKQotICAgICAgZ290byBOb3RGb3VuZDsKLQotICAgIGMgICAgID0gKm5hbWUrKzsKLSAgICBjb3VudCA9IHBbMV07Ci0gICAgcCAgICArPSAyOwotCi0gICAgbWluID0gMDsKLSAgICBtYXggPSBjb3VudDsKLQotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgbWlkID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogIHEgICA9IHAgKyBtaWQgKiAyOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGMyOwotCi0KLSAgICAgIHEgPSBmdF9hZG9iZV9nbHlwaF9saXN0ICsgKCAoIChpbnQpcVswXSA8PCA4ICkgfCBxWzFdICk7Ci0KLSAgICAgIGMyID0gcVswXSAmIDEyNzsKLSAgICAgIGlmICggYzIgPT0gYyApCi0gICAgICB7Ci0gICAgICAgIHAgPSBxOwotICAgICAgICBnb3RvIEZvdW5kOwotICAgICAgfQotICAgICAgaWYgKCBjMiA8IGMgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgfQotICAgIGdvdG8gTm90Rm91bmQ7Ci0KLSAgRm91bmQ6Ci0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICAvKiBhc3NlcnQgKCpwICYgMTI3KSA9PSBjICovCi0KLSAgICAgIGlmICggbmFtZSA+PSBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIGlmICggKHBbMF0gJiAxMjgpID09IDAgJiYKLSAgICAgICAgICAgICAocFsxXSAmIDEyOCkgIT0gMCApCi0gICAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSggKCAoaW50KXBbMl0gPDwgOCApIHwgcFszXSApOwotCi0gICAgICAgIGdvdG8gTm90Rm91bmQ7Ci0gICAgICB9Ci0gICAgICBjID0gKm5hbWUrKzsKLSAgICAgIGlmICggcFswXSAmIDEyOCApCi0gICAgICB7Ci0gICAgICAgIHArKzsKLSAgICAgICAgaWYgKCBjICE9IChwWzBdICYgMTI3KSApCi0gICAgICAgICAgZ290byBOb3RGb3VuZDsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgcCsrOwotICAgICAgY291bnQgPSBwWzBdICYgMTI3OwotICAgICAgaWYgKCBwWzBdICYgMTI4ICkKLSAgICAgICAgcCArPSAyOwotCi0gICAgICBwKys7Ci0KLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwICs9IDIgKQotICAgICAgewotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKCAoaW50KXBbMF0gPDwgOCApIHwgcFsxXTsKLSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogIHEgICAgICA9IGZ0X2Fkb2JlX2dseXBoX2xpc3QgKyBvZmZzZXQ7Ci0KLSAgICAgICAgaWYgKCBjID09ICggcVswXSAmIDEyNyApICkKLSAgICAgICAgewotICAgICAgICAgIHAgPSBxOwotICAgICAgICAgIGdvdG8gTmV4dEl0ZXI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGdvdG8gTm90Rm91bmQ7Ci0KLSAgICBOZXh0SXRlcjoKLSAgICAgIDsKLSAgICB9Ci0KLSAgTm90Rm91bmQ6Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9yYXN0ZXIvZnRtaXNjLmggYi9zcmMvcmFzdGVyL2Z0bWlzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWRiZDUwLi4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvZnRtaXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1pc2MuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTWlzY2VsbGFuZW91cyBtYWNyb3MgZm9yIHN0YW5kLWFsb25lIHJhc3Rlcml6ZXIgKHNwZWNpZmljYXRpb24gICAgICAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyAqbm90KiBwb3J0YWJsZSEgIFlvdSBoYXZlIHRvIGFkYXB0ICovCi0gIC8qIGl0cyBkZWZpbml0aW9ucyB0byB5b3VyIHBsYXRmb3JtLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19GVE1JU0NfSF9fCi0jZGVmaW5lIF9fRlRNSVNDX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+IC8qIG1lbXNldCAqLwotCi0jZGVmaW5lIEZUX0JFR0lOX0hFQURFUgotI2RlZmluZSBGVF9FTkRfSEVBREVSCi0KLSNkZWZpbmUgRlRfTE9DQUxfREVGKCB4ICkgICBzdGF0aWMgeAotCi0gIC8qIGZyb20gaW5jbHVkZS9mcmVldHlwZTIvZnR0eXBlcy5oICovCi0KLSAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBGVF9CeXRlOwotICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgIEZUX0ludDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICBGVF9VSW50OwotICB0eXBlZGVmIHNpZ25lZCBsb25nICAgIEZUX0xvbmc7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUxvbmc7Ci0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgICAgRlRfRjI2RG90NjsKLSAgdHlwZWRlZiBpbnQgICAgICAgICAgICBGVF9FcnJvcjsKLQotI2RlZmluZSBGVF9NQUtFX1RBRyggX3gxLCBfeDIsIF94MywgX3g0ICkgXAotICAgICAgICAgICggKCAoRlRfVUxvbmcpX3gxIDw8IDI0ICkgfCAgICAgXAotICAgICAgICAgICAgKCAoRlRfVUxvbmcpX3gyIDw8IDE2ICkgfCAgICAgXAotICAgICAgICAgICAgKCAoRlRfVUxvbmcpX3gzIDw8ICA4ICkgfCAgICAgXAotICAgICAgICAgICAgICAoRlRfVUxvbmcpX3g0ICAgICAgICAgKQotCi0KLSAgLyogZnJvbSBzcmMvZnRjYWxjLmMgKi8KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSAgdHlwZWRlZiBpbnQ2NF90ICBGVF9JbnQ2NDsKLQotICBzdGF0aWMgRlRfTG9uZwotICBGVF9NdWxEaXYoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiwKLSAgICAgICAgICAgICBGVF9Mb25nICBjICkKLSAgewotICAgIEZUX0ludCAgIHM7Ci0gICAgRlRfTG9uZyAgZDsKLQotCi0gICAgcyA9IDE7Ci0gICAgaWYgKCBhIDwgMCApIHsgYSA9IC1hOyBzID0gLTE7IH0KLSAgICBpZiAoIGIgPCAwICkgeyBiID0gLWI7IHMgPSAtczsgfQotICAgIGlmICggYyA8IDAgKSB7IGMgPSAtYzsgcyA9IC1zOyB9Ci0KLSAgICBkID0gKEZUX0xvbmcpKCBjID4gMCA/ICggKEZUX0ludDY0KWEgKiBiICsgKCBjID4+IDEgKSApIC8gYwotICAgICAgICAgICAgICAgICAgICAgICAgIDogMHg3RkZGRkZGRkwgKTsKLQotICAgIHJldHVybiAoIHMgPiAwICkgPyBkIDogLWQ7Ci0gIH0KLQotI2VuZGlmIC8qIF9fRlRNSVNDX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIGIvc3JjL3Jhc3Rlci9mdHJhc3Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ3N2Q0Li4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvZnRyYXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDMzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyYXN0ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDcsIDIwMDggYnkgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCB0aGUgcmVzdCBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLCBieSAqLwotICAvKiBkZWZpbmluZyB0aGUgX1NUQU5EQUxPTkVfIG1hY3JvIHdoZW4gY29tcGlsaW5nIGl0LiAgWW91IGFsc28gbmVlZCB0byAgKi8KLSAgLyogcHV0IHRoZSBmaWxlcyBgZnRpbWFnZS5oJyBhbmQgYGZ0bWlzYy5oJyBpbnRvIHRoZSAkKGluY2RpcikgICAgICAgICAgICovCi0gIC8qIGRpcmVjdG9yeS4gIFR5cGljYWxseSwgeW91IHNob3VsZCBkbyBzb21ldGhpbmcgbGlrZSAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb3B5IGBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMnICh0aGlzIGZpbGUpIHRvIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNvcHkgYGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oJyBhbmQgYHNyYy9yYXN0ZXIvZnRtaXNjLmgnICAgICAgICAgKi8KLSAgLyogICB0byB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNvbXBpbGUgYGZ0cmFzdGVyJyB3aXRoIHRoZSBfU1RBTkRBTE9ORV8gbWFjcm8gZGVmaW5lZCwgYXMgaW4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjYyAtYyAtRF9TVEFOREFMT05FXyBmdHJhc3Rlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHJlbmRlcmVyIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIGEgY2FsbCB0byAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBmdF9zdGFuZGFyZF9yYXN0ZXIucmFzdGVyX25ldyc7IGEgYml0bWFwIGNhbiBiZSBnZW5lcmF0ZWQgICAgICAgICAgICAqLwotICAvKiB3aXRoIGEgY2FsbCB0byBgZnRfc3RhbmRhcmRfcmFzdGVyLnJhc3Rlcl9yZW5kZXInLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlZSB0aGUgY29tbWVudHMgYW5kIGRvY3VtZW50YXRpb24gaW4gdGhlIGZpbGUgYGZ0aW1hZ2UuaCcgZm9yIG1vcmUgICAqLwotICAvKiBkZXRhaWxzIG9uIGhvdyB0aGUgcmFzdGVyIHdvcmtzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIGEgcmV3cml0ZSBvZiB0aGUgRnJlZVR5cGUgMS54IHNjYW4tbGluZSBjb252ZXJ0ZXIgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX1NUQU5EQUxPTkVfCi0KLSNpbmNsdWRlICJmdG1pc2MuaCIKLSNpbmNsdWRlICJmdGltYWdlLmgiCi0KLSNlbHNlIC8qICFfU1RBTkRBTE9ORV8gKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiZnRyYXN0ZXIuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSCAgIC8qIGZvciBGVF9NdWxEaXYgb25seSAqLwotCi0jZW5kaWYgLyogIV9TVEFOREFMT05FXyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHNpbXBsZSB0ZWNobmljYWwgbm90ZSBvbiBob3cgdGhlIHJhc3RlciB3b3JrcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIENvbnZlcnRpbmcgYW4gb3V0bGluZSBpbnRvIGEgYml0bWFwIGlzIGFjaGlldmVkIGluIHNldmVyYWwgc3RlcHM6ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgMSAtIERlY29tcG9zaW5nIHRoZSBvdXRsaW5lIGludG8gc3VjY2Vzc2l2ZSBgcHJvZmlsZXMnLiAgRWFjaCAgICAgICAqLwotICAvKiAgICAgICBwcm9maWxlIGlzIHNpbXBseSBhbiBhcnJheSBvZiBzY2FubGluZSBpbnRlcnNlY3Rpb25zIG9uIGEgZ2l2ZW4gKi8KLSAgLyogICAgICAgZGltZW5zaW9uLiAgQSBwcm9maWxlJ3MgbWFpbiBhdHRyaWJ1dGVzIGFyZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBvIGl0cyBzY2FubGluZSBwb3NpdGlvbiBib3VuZGFyaWVzLCBpLmUuIGBZbWluJyBhbmQgYFltYXgnLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIG8gYW4gYXJyYXkgb2YgaW50ZXJzZWN0aW9uIGNvb3JkaW5hdGVzIGZvciBlYWNoIHNjYW5saW5lICAgICAgICAqLwotICAvKiAgICAgICAgIGJldHdlZW4gYFltaW4nIGFuZCBgWW1heCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIG8gYSBkaXJlY3Rpb24sIGluZGljYXRpbmcgd2hldGhlciBpdCB3YXMgYnVpbHQgZ29pbmcgYHVwJyBvciAgICAqLwotICAvKiAgICAgICAgIGBkb3duJywgYXMgdGhpcyBpcyB2ZXJ5IGltcG9ydGFudCBmb3IgZmlsbGluZyBydWxlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgMiAtIFN3ZWVwaW5nIHRoZSB0YXJnZXQgbWFwJ3Mgc2NhbmxpbmVzIGluIG9yZGVyIHRvIGNvbXB1dGUgc2VnbWVudCAqLwotICAvKiAgICAgICBgc3BhbnMnIHdoaWNoIGFyZSB0aGVuIGZpbGxlZC4gIEFkZGl0aW9uYWxseSwgdGhpcyBwYXNzICAgICAgICAgKi8KLSAgLyogICAgICAgcGVyZm9ybXMgZHJvcC1vdXQgY29udHJvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBvdXRsaW5lIGRhdGEgaXMgcGFyc2VkIGR1cmluZyBzdGVwIDEgb25seS4gIFRoZSBwcm9maWxlcyBhcmUgICAgKi8KLSAgLyogICBidWlsdCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHJlbmRlciBwb29sLCB1c2VkIGFzIGEgc3RhY2suICBUaGUgICAgICovCi0gIC8qICAgZm9sbG93aW5nIGdyYXBoaWNzIHNob3dzIHRoZSBwcm9maWxlIGxpc3QgdW5kZXIgY29uc3RydWN0aW9uOiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBfIF8gICovCi0gIC8qICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAqLwotICAvKiAgICB8IHByb2ZpbGUgfCBjb29yZGluYXRlcyBmb3IgICB8IHByb2ZpbGUgfCBjb29yZGluYXRlcyBmb3IgfC0tPiAgICAgKi8KLSAgLyogICAgfCAgICAxICAgIHwgIHByb2ZpbGUgMSAgICAgICAgfCAgICAyICAgIHwgIHByb2ZpbGUgMiAgICAgIHwtLT4gICAgICovCi0gIC8qICAgIHxfX19fX19fX198X19fX19fX19fX19fX19fX19fX3xfX19fX19fX198X19fX19fX19fX19fX19fX198X18gXyBfICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICovCi0gIC8qICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLwotICAvKiAgc3RhcnQgb2YgcmVuZGVyIHBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIHRvcCBvZiB0aGUgcHJvZmlsZSBzdGFjayBpcyBrZXB0IGluIHRoZSBgdG9wJyB2YXJpYWJsZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBcyB5b3UgY2FuIHNlZSwgYSBwcm9maWxlIHJlY29yZCBpcyBwdXNoZWQgb24gdG9wIG9mIHRoZSByZW5kZXIgICAgICovCi0gIC8qICAgcG9vbCwgd2hpY2ggaXMgdGhlbiBmb2xsb3dlZCBieSBpdHMgY29vcmRpbmF0ZXMvaW50ZXJzZWN0aW9ucy4gIElmICAqLwotICAvKiAgIGEgY2hhbmdlIG9mIGRpcmVjdGlvbiBpcyBkZXRlY3RlZCBpbiB0aGUgb3V0bGluZSwgYSBuZXcgcHJvZmlsZSBpcyAgKi8KLSAgLyogICBnZW5lcmF0ZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vdGUgdGhhdCB3aGVuIGFsbCBwcm9maWxlcyBoYXZlIGJlZW4gZ2VuZXJhdGVkLCB0aGUgZnVuY3Rpb24gICAgICAgKi8KLSAgLyogICBGaW5hbGl6ZV9Qcm9maWxlX1RhYmxlKCkgaXMgdXNlZCB0byByZWNvcmQsIGZvciBlYWNoIHByb2ZpbGUsIGl0cyAgICovCi0gIC8qICAgYm90dG9tLW1vc3Qgc2NhbmxpbmUgYXMgd2VsbCBhcyB0aGUgc2NhbmxpbmUgYWJvdmUgaXRzIHVwbW9zdCAgICAgICAqLwotICAvKiAgIGJvdW5kYXJ5LiAgVGhlc2UgcG9zaXRpb25zIGFyZSBjYWxsZWQgYHktdHVybnMnIGJlY2F1c2UgdGhleSAoc29ydCAgKi8KLSAgLyogICBvZikgY29ycmVzcG9uZCB0byBsb2NhbCBleHRyZW1hLiAgVGhleSBhcmUgc3RvcmVkIGluIGEgc29ydGVkIGxpc3QgICovCi0gIC8qICAgYnVpbHQgZnJvbSB0aGUgdG9wIG9mIHRoZSByZW5kZXIgcG9vbCBhcyBhIGRvd253YXJkcyBzdGFjazogICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBfIF8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICA8LS18IHNvcnRlZCBsaXN0IG9mICAgICB8ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgPC0tfCAgZXh0cmVtYSBzY2FubGluZXMgfCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgXyBfIF9fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX19fX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZmICAgICAgICAgICBzaXplQnVmZiA9IGVuZCBvZiBwb29sICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBsaXN0IGlzIGxhdGVyIHVzZWQgZHVyaW5nIHRoZSBzd2VlcCBwaGFzZSBpbiBvcmRlciB0byAgICAgICAgICAqLwotICAvKiAgIG9wdGltaXplIHBlcmZvcm1hbmNlIChzZWUgdGVjaG5pY2FsIG5vdGUgb24gdGhlIHN3ZWVwIGJlbG93KS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgT2YgY291cnNlLCB0aGUgcmFzdGVyIGRldGVjdHMgd2hldGhlciB0aGUgdHdvIHN0YWNrcyBjb2xsaWRlIGFuZCAgICAqLwotICAvKiAgIGhhbmRsZXMgdGhlIHNpdHVhdGlvbiBwcm9wZXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogZGVmaW5lIERFQlVHX1JBU1RFUiBpZiB5b3Ugd2FudCB0byBjb21waWxlIGEgZGVidWdnaW5nIHZlcnNpb24gKi8KLSNkZWZpbmUgeHh4REVCVUdfUkFTVEVSCi0KLSAgLyogdW5kZWZpbmUgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzdXBwb3J0ICovCi0gIC8qIDUtbGV2ZWxzIGFudGktYWxpYXNpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSB0d28tbGluZXMgaW50ZXJtZWRpYXRlIGJpdG1hcCB1c2VkICovCi0gIC8qIGZvciBhbnRpLWFsaWFzaW5nLCBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFJBU1RFUl9HUkFZX0xJTkVTICAyMDQ4Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKiogIE9USEVSIE1BQ1JPUyAoZG8gbm90IGNoYW5nZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYXN0ZXIKLQotCi0jaWZkZWYgX1NUQU5EQUxPTkVfCi0KLQotICAvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB1bnVzZWQuICovCi0gIC8qIEl0cyBwdXJwb3NlIGlzIHNpbXBseSB0byByZWR1Y2UgY29tcGlsZXIgd2FybmluZ3MuICBOb3RlIGFsc28gdGhhdCAgKi8KLSAgLyogc2ltcGx5IGRlZmluaW5nIGl0IGFzIGAodm9pZCl4JyBkb2Vzbid0IGF2b2lkIHdhcm5pbmdzIHdpdGggY2VydGFpbiAqLwotICAvKiBBTlNJIGNvbXBpbGVycyAoZS5nLiBMQ0MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VOVVNFRCggeCApICAoeCkgPSAoeCkKLQotICAvKiBEaXNhYmxlIHRoZSB0cmFjaW5nIG1lY2hhbmlzbSBmb3Igc2ltcGxpY2l0eSAtLSBkZXZlbG9wZXJzIGNhbiAgICAgICovCi0gIC8qIGFjdGl2YXRlIGl0IGVhc2lseSBieSByZWRlZmluaW5nIHRoZXNlIHR3byBtYWNyb3MuICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfRVJST1IKLSNkZWZpbmUgRlRfRVJST1IoIHggKSAgZG8gOyB3aGlsZSAoIDAgKSAgICAgLyogbm90aGluZyAqLwotI2VuZGlmCi0KLSNpZm5kZWYgRlRfVFJBQ0UKLSNkZWZpbmUgRlRfVFJBQ0UoIHggKSAgIGRvIDsgd2hpbGUgKCAwICkgICAgLyogbm90aGluZyAqLwotI2RlZmluZSBGVF9UUkFDRTEoIHggKSAgZG8gOyB3aGlsZSAoIDAgKSAgICAvKiBub3RoaW5nICovCi0jZGVmaW5lIEZUX1RSQUNFNiggeCApICBkbyA7IHdoaWxlICggMCApICAgIC8qIG5vdGhpbmcgKi8KLSNlbmRpZgotCi0jZGVmaW5lIFJhc3Rlcl9FcnJfTm9uZSAgICAgICAgICAwCi0jZGVmaW5lIFJhc3Rlcl9FcnJfTm90X0luaSAgICAgIC0xCi0jZGVmaW5lIFJhc3Rlcl9FcnJfT3ZlcmZsb3cgICAgIC0yCi0jZGVmaW5lIFJhc3Rlcl9FcnJfTmVnX0hlaWdodCAgIC0zCi0jZGVmaW5lIFJhc3Rlcl9FcnJfSW52YWxpZCAgICAgIC00Ci0jZGVmaW5lIFJhc3Rlcl9FcnJfVW5zdXBwb3J0ZWQgIC01Ci0KLSNkZWZpbmUgZnRfbWVtc2V0ICAgbWVtc2V0Ci0KLSNlbHNlIC8qIF9TVEFOREFMT05FXyAqLwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSCAgICAgICAgLyogZm9yIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgKi8KLQotI2luY2x1ZGUgInJhc3RlcnJzLmgiCi0KLSNkZWZpbmUgUmFzdGVyX0Vycl9Ob25lICAgICAgICAgUmFzdGVyX0Vycl9PawotI2RlZmluZSBSYXN0ZXJfRXJyX05vdF9JbmkgICAgICBSYXN0ZXJfRXJyX1Jhc3Rlcl9VbmluaXRpYWxpemVkCi0jZGVmaW5lIFJhc3Rlcl9FcnJfT3ZlcmZsb3cgICAgIFJhc3Rlcl9FcnJfUmFzdGVyX092ZXJmbG93Ci0jZGVmaW5lIFJhc3Rlcl9FcnJfTmVnX0hlaWdodCAgIFJhc3Rlcl9FcnJfUmFzdGVyX05lZ2F0aXZlX0hlaWdodAotI2RlZmluZSBSYXN0ZXJfRXJyX0ludmFsaWQgICAgICBSYXN0ZXJfRXJyX0ludmFsaWRfT3V0bGluZQotI2RlZmluZSBSYXN0ZXJfRXJyX1Vuc3VwcG9ydGVkICBSYXN0ZXJfRXJyX0Nhbm5vdF9SZW5kZXJfR2x5cGgKLQotCi0jZW5kaWYgLyogX1NUQU5EQUxPTkVfICovCi0KLQotI2lmbmRlZiBGVF9NRU1fU0VUCi0jZGVmaW5lIEZUX01FTV9TRVQoIGQsIHMsIGMgKSAgZnRfbWVtc2V0KCBkLCBzLCBjICkKLSNlbmRpZgotCi0jaWZuZGVmIEZUX01FTV9aRVJPCi0jZGVmaW5lIEZUX01FTV9aRVJPKCBkZXN0LCBjb3VudCApICBGVF9NRU1fU0VUKCBkZXN0LCAwLCBjb3VudCApCi0jZW5kaWYKLQotICAvKiBGTXVsRGl2IG1lYW5zIGBGYXN0IE11bERpdic7IGl0IGlzIHVzZWQgaW4gY2FzZSB3aGVyZSBgYicgaXMgICAgICAgKi8KLSAgLyogdHlwaWNhbGx5IGEgc21hbGwgdmFsdWUgYW5kIHRoZSByZXN1bHQgb2YgYSpiIGlzIGtub3duIHRvIGZpdCBpbnRvICovCi0gIC8qIDMyIGJpdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGTXVsRGl2KCBhLCBiLCBjICkgICggKGEpICogKGIpIC8gKGMpICkKLQotICAvKiBPbiB0aGUgb3RoZXIgaGFuZCwgU011bERpdiBtZWFucyBgU2xvdyBNdWxEaXYnLCBhbmQgaXMgdXNlZCB0eXBpY2FsbHkgKi8KLSAgLyogZm9yIGNsaXBwaW5nIGNvbXB1dGF0aW9ucy4gIEl0IHNpbXBseSB1c2VzIHRoZSBGVF9NdWxEaXYoKSBmdW5jdGlvbiAgICovCi0gIC8qIGRlZmluZWQgaW4gYGZ0Y2FsYy5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTTXVsRGl2ICBGVF9NdWxEaXYKLQotICAvKiBUaGUgcmFzdGVyaXplciBpcyBhIHZlcnkgZ2VuZXJhbCBwdXJwb3NlIGNvbXBvbmVudDsgcGxlYXNlIGxlYXZlICovCi0gIC8qIHRoZSBmb2xsb3dpbmcgcmVkZWZpbml0aW9ucyB0aGVyZSAoeW91IG5ldmVyIGtub3cgeW91ciB0YXJnZXQgICAgKi8KLSAgLyogZW52aXJvbm1lbnQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgIDEKLSNlbmRpZgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICAwCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgICh2b2lkKikwCi0jZW5kaWYKLQotI2lmbmRlZiBTVUNDRVNTCi0jZGVmaW5lIFNVQ0NFU1MgIDAKLSNlbmRpZgotCi0jaWZuZGVmIEZBSUxVUkUKLSNkZWZpbmUgRkFJTFVSRSAgMQotI2VuZGlmCi0KLQotI2RlZmluZSBNYXhCZXppZXIgIDMyICAgLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrZWQgQmV6aWVyIGN1cnZlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldHRpbmcgdGhpcyBjb25zdGFudCB0byBtb3JlIHRoYW4gMzIgaXMgYSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwdXJlIHdhc3RlIG9mIHNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFBpeGVsX0JpdHMgIDYgICAvKiBmcmFjdGlvbmFsIGJpdHMgb2YgKmlucHV0KiBjb29yZGluYXRlcyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICBTSU1QTEUgVFlQRSBERUNMQVJBVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgSW50OwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICBVSW50OwotICB0eXBlZGVmIHNob3J0ICAgICAgICAgICBTaG9ydDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgVVNob3J0LCAqUFVTaG9ydDsKLSAgdHlwZWRlZiBsb25nICAgICAgICAgICAgTG9uZywgKlBMb25nOwotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBVTG9uZzsKLQotICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBCeXRlLCAqUEJ5dGU7Ci0gIHR5cGVkZWYgY2hhciAgICAgICAgICAgIEJvb2w7Ci0KLQotICB0eXBlZGVmIHVuaW9uICBBbGlnbm1lbnRfCi0gIHsKLSAgICBsb25nICAgIGw7Ci0gICAgdm9pZCogICBwOwotICAgIHZvaWQgICgqZikodm9pZCk7Ci0KLSAgfSBBbGlnbm1lbnQsICpQQWxpZ25tZW50OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRQb2ludF8KLSAgewotICAgIExvbmcgIHg7Ci0gICAgTG9uZyAgeTsKLQotICB9IFRQb2ludDsKLQotCi0gIHR5cGVkZWYgZW51bSAgVEZsb3dfCi0gIHsKLSAgICBGbG93X05vbmUgPSAwLAotICAgIEZsb3dfVXAgICA9IDEsCi0gICAgRmxvd19Eb3duID0gLTEKLQotICB9IFRGbG93OwotCi0KLSAgLyogU3RhdGVzIG9mIGVhY2ggbGluZSwgYXJjLCBhbmQgcHJvZmlsZSAqLwotICB0eXBlZGVmIGVudW0gIFRTdGF0ZXNfCi0gIHsKLSAgICBVbmtub3duX1N0YXRlLAotICAgIEFzY2VuZGluZ19TdGF0ZSwKLSAgICBEZXNjZW5kaW5nX1N0YXRlLAotICAgIEZsYXRfU3RhdGUKLQotICB9IFRTdGF0ZXM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBUUHJvZmlsZV8gIFRQcm9maWxlOwotICB0eXBlZGVmIFRQcm9maWxlKiAgICAgICAgIFBQcm9maWxlOwotCi0gIHN0cnVjdCAgVFByb2ZpbGVfCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICBYOyAgICAgICAgICAgLyogY3VycmVudCBjb29yZGluYXRlIGR1cmluZyBzd2VlcCAgICAgICAgKi8KLSAgICBQUHJvZmlsZSAgICBsaW5rOyAgICAgICAgLyogbGluayB0byBuZXh0IHByb2ZpbGUgLSB2YXJpb3VzIHB1cnBvc2UgKi8KLSAgICBQTG9uZyAgICAgICBvZmZzZXQ7ICAgICAgLyogc3RhcnQgb2YgcHJvZmlsZSdzIGRhdGEgaW4gcmVuZGVyIHBvb2wgKi8KLSAgICBpbnQgICAgICAgICBmbG93OyAgICAgICAgLyogUHJvZmlsZSBvcmllbnRhdGlvbjogQXNjL0Rlc2NlbmRpbmcgICAgKi8KLSAgICBsb25nICAgICAgICBoZWlnaHQ7ICAgICAgLyogcHJvZmlsZSdzIGhlaWdodCBpbiBzY2FubGluZXMgICAgICAgICAgKi8KLSAgICBsb25nICAgICAgICBzdGFydDsgICAgICAgLyogcHJvZmlsZSdzIHN0YXJ0aW5nIHNjYW5saW5lICAgICAgICAgICAgKi8KLQotICAgIHVuc2lnbmVkICAgIGNvdW50TDsgICAgICAvKiBudW1iZXIgb2YgbGluZXMgdG8gc3RlcCBiZWZvcmUgdGhpcyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9maWxlIGJlY29tZXMgZHJhd2FibGUgICAgICAgICAgICAgICAqLwotCi0gICAgUFByb2ZpbGUgICAgbmV4dDsgICAgICAgIC8qIG5leHQgcHJvZmlsZSBpbiBzYW1lIGNvbnRvdXIsIHVzZWQgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR1cmluZyBkcm9wLW91dCBjb250cm9sICAgICAgICAgICAgICAgICovCi0gIH07Ci0KLSAgdHlwZWRlZiBQUHJvZmlsZSAgIFRQcm9maWxlTGlzdDsKLSAgdHlwZWRlZiBQUHJvZmlsZSogIFBQcm9maWxlTGlzdDsKLQotCi0gIC8qIFNpbXBsZSByZWNvcmQgdXNlZCB0byBpbXBsZW1lbnQgYSBzdGFjayBvZiBiYW5kcywgcmVxdWlyZWQgKi8KLSAgLyogYnkgdGhlIHN1Yi1iYW5kaW5nIG1lY2hhbmlzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVEJhbmRfCi0gIHsKLSAgICBTaG9ydCAgeV9taW47ICAgLyogYmFuZCdzIG1pbmltdW0gKi8KLSAgICBTaG9ydCAgeV9tYXg7ICAgLyogYmFuZCdzIG1heGltdW0gKi8KLQotICB9IFRCYW5kOwotCi0KLSNkZWZpbmUgQWxpZ25Qcm9maWxlU2l6ZSBcCi0gICggKCBzaXplb2YgKCBUUHJvZmlsZSApICsgc2l6ZW9mICggQWxpZ25tZW50ICkgLSAxICkgLyBzaXplb2YgKCBsb25nICkgKQotCi0KLSNpZmRlZiBGVF9TVEFUSUNfUkFTVEVSCi0KLQotI2RlZmluZSBSQVNfQVJHUyAgICAgICAvKiB2b2lkICovCi0jZGVmaW5lIFJBU19BUkcgICAgICAgIC8qIHZvaWQgKi8KLQotI2RlZmluZSBSQVNfVkFSUyAgICAgICAvKiB2b2lkICovCi0jZGVmaW5lIFJBU19WQVIgICAgICAgIC8qIHZvaWQgKi8KLQotI2RlZmluZSBGVF9VTlVTRURfUkFTVEVSICBkbyA7IHdoaWxlICggMCApCi0KLQotI2Vsc2UgLyogRlRfU1RBVElDX1JBU1RFUiAqLwotCi0KLSNkZWZpbmUgUkFTX0FSR1MgICAgICAgUFdvcmtlciAgICB3b3JrZXIsCi0jZGVmaW5lIFJBU19BUkcgICAgICAgIFBXb3JrZXIgICAgd29ya2VyCi0KLSNkZWZpbmUgUkFTX1ZBUlMgICAgICAgd29ya2VyLAotI2RlZmluZSBSQVNfVkFSICAgICAgICB3b3JrZXIKLQotI2RlZmluZSBGVF9VTlVTRURfUkFTVEVSICBGVF9VTlVTRUQoIHdvcmtlciApCi0KLQotI2VuZGlmIC8qIEZUX1NUQVRJQ19SQVNURVIgKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0IFRXb3JrZXJfICAgVFdvcmtlciwgKlBXb3JrZXI7Ci0KLQotICAvKiBwcm90b3R5cGVzIHVzZWQgZm9yIHN3ZWVwIGZ1bmN0aW9uIGRpc3BhdGNoICovCi0gIHR5cGVkZWYgdm9pZAotICBGdW5jdGlvbl9Td2VlcF9Jbml0KCBSQVNfQVJHUyBTaG9ydCogIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvcnQqICBtYXggKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgRnVuY3Rpb25fU3dlZXBfU3BhbiggUkFTX0FSR1MgU2hvcnQgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICByaWdodCApOwotCi0gIHR5cGVkZWYgdm9pZAotICBGdW5jdGlvbl9Td2VlcF9TdGVwKCBSQVNfQVJHICk7Ci0KLQotICAvKiBOT1RFOiBUaGVzZSBvcGVyYXRpb25zIGFyZSBvbmx5IHZhbGlkIG9uIDIncyBjb21wbGVtZW50IHByb2Nlc3NvcnMgKi8KLQotI2RlZmluZSBGTE9PUiggeCApICAgICggKHgpICYgLXJhcy5wcmVjaXNpb24gKQotI2RlZmluZSBDRUlMSU5HKCB4ICkgICggKCAoeCkgKyByYXMucHJlY2lzaW9uIC0gMSApICYgLXJhcy5wcmVjaXNpb24gKQotI2RlZmluZSBUUlVOQyggeCApICAgICggKHNpZ25lZCBsb25nKSh4KSA+PiByYXMucHJlY2lzaW9uX2JpdHMgKQotI2RlZmluZSBGUkFDKCB4ICkgICAgICggKHgpICYgKCByYXMucHJlY2lzaW9uIC0gMSApICkKLSNkZWZpbmUgU0NBTEVEKCB4ICkgICAoICggKHgpIDw8IHJhcy5zY2FsZV9zaGlmdCApIC0gcmFzLnByZWNpc2lvbl9oYWxmICkKLQotICAvKiBOb3RlIHRoYXQgSSBoYXZlIG1vdmVkIHRoZSBsb2NhdGlvbiBvZiBzb21lIGZpZWxkcyBpbiB0aGUgKi8KLSAgLyogc3RydWN0dXJlIHRvIGVuc3VyZSB0aGF0IHRoZSBtb3N0IHVzZWQgdmFyaWFibGVzIGFyZSB1c2VkICovCi0gIC8qIGF0IHRoZSB0b3AuICBUaHVzLCB0aGVpciBvZmZzZXQgY2FuIGJlIGNvZGVkIHdpdGggbGVzcyAgICAqLwotICAvKiBvcGNvZGVzLCBhbmQgaXQgcmVzdWx0cyBpbiBhIHNtYWxsZXIgZXhlY3V0YWJsZS4gICAgICAgICAgKi8KLQotICBzdHJ1Y3QgIFRXb3JrZXJfCi0gIHsKLSAgICBJbnQgICAgICAgcHJlY2lzaW9uX2JpdHM7ICAgICAgIC8qIHByZWNpc2lvbiByZWxhdGVkIHZhcmlhYmxlcyAgICAgICAgICovCi0gICAgSW50ICAgICAgIHByZWNpc2lvbjsKLSAgICBJbnQgICAgICAgcHJlY2lzaW9uX2hhbGY7Ci0gICAgTG9uZyAgICAgIHByZWNpc2lvbl9tYXNrOwotICAgIEludCAgICAgICBwcmVjaXNpb25fc2hpZnQ7Ci0gICAgSW50ICAgICAgIHByZWNpc2lvbl9zdGVwOwotICAgIEludCAgICAgICBwcmVjaXNpb25faml0dGVyOwotCi0gICAgSW50ICAgICAgIHNjYWxlX3NoaWZ0OyAgICAgICAgICAvKiA9PSBwcmVjaXNpb25fc2hpZnQgICBmb3IgYml0bWFwcyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPT0gcHJlY2lzaW9uX3NoaWZ0KzEgZm9yIHBpeG1hcHMgICAgKi8KLQotICAgIFBMb25nICAgICBidWZmOyAgICAgICAgICAgICAgICAgLyogVGhlIHByb2ZpbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgKi8KLSAgICBQTG9uZyAgICAgc2l6ZUJ1ZmY7ICAgICAgICAgICAgIC8qIFJlbmRlciBwb29sIHNpemUgICAgICAgICAgICAgICAgICAgICovCi0gICAgUExvbmcgICAgIG1heEJ1ZmY7ICAgICAgICAgICAgICAvKiBQcm9maWxlcyBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgICAqLwotICAgIFBMb25nICAgICB0b3A7ICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjdXJzb3IgaW4gYnVmZmVyICAgICAgICAgICAgKi8KLQotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIEludCAgICAgICBudW1UdXJuczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFktdHVybnMgaW4gb3V0bGluZSAgICAgICAgKi8KLQotICAgIFRQb2ludCogICBhcmM7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBCZXppZXIgYXJjIHBvaW50ZXIgICAgICAgICAgKi8KLQotICAgIFVTaG9ydCAgICBiV2lkdGg7ICAgICAgICAgICAgICAgLyogdGFyZ2V0IGJpdG1hcCB3aWR0aCAgICAgICAgICAgICAgICAgKi8KLSAgICBQQnl0ZSAgICAgYlRhcmdldDsgICAgICAgICAgICAgIC8qIHRhcmdldCBiaXRtYXAgYnVmZmVyICAgICAgICAgICAgICAgICovCi0gICAgUEJ5dGUgICAgIGdUYXJnZXQ7ICAgICAgICAgICAgICAvKiB0YXJnZXQgcGl4bWFwIGJ1ZmZlciAgICAgICAgICAgICAgICAqLwotCi0gICAgTG9uZyAgICAgIGxhc3RYLCBsYXN0WSwgbWluWSwgbWF4WTsKLQotICAgIFVTaG9ydCAgICBudW1fUHJvZnM7ICAgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgcHJvZmlsZXMgICAgICAgICAgKi8KLQotICAgIEJvb2wgICAgICBmcmVzaDsgICAgICAgICAgICAgICAgLyogc2lnbmFscyBhIGZyZXNoIG5ldyBwcm9maWxlIHdoaWNoICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICdzdGFydCcgZmllbGQgbXVzdCBiZSBjb21wbGV0ZWQgICAgICovCi0gICAgQm9vbCAgICAgIGpvaW50OyAgICAgICAgICAgICAgICAvKiBzaWduYWxzIHRoYXQgdGhlIGxhc3QgYXJjIGVuZGVkICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhhY3RseSBvbiBhIHNjYW5saW5lLiAgQWxsb3dzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92YWwgb2YgZG91YmxldHMgICAgICAgICAgICAgICAgICovCi0gICAgUFByb2ZpbGUgIGNQcm9maWxlOyAgICAgICAgICAgICAvKiBjdXJyZW50IHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFBQcm9maWxlICBmUHJvZmlsZTsgICAgICAgICAgICAgLyogaGVhZCBvZiBsaW5rZWQgbGlzdCBvZiBwcm9maWxlcyAgICAgKi8KLSAgICBQUHJvZmlsZSAgZ1Byb2ZpbGU7ICAgICAgICAgICAgIC8qIGNvbnRvdXIncyBmaXJzdCBwcm9maWxlIGluIGNhc2UgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZiBpbXBhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVFN0YXRlcyAgIHN0YXRlOyAgICAgICAgICAgICAgICAvKiByZW5kZXJpbmcgc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfQml0bWFwICAgdGFyZ2V0OyAgICAgICAgICAgICAvKiBkZXNjcmlwdGlvbiBvZiB0YXJnZXQgYml0L3BpeG1hcCAgICAqLwotICAgIEZUX091dGxpbmUgIG91dGxpbmU7Ci0KLSAgICBMb25nICAgICAgdHJhY2VPZnM7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgb2Zmc2V0IGluIHRhcmdldCBiaXRtYXAgICAgICovCi0gICAgTG9uZyAgICAgIHRyYWNlRzsgICAgICAgICAgICAgICAvKiBjdXJyZW50IG9mZnNldCBpbiB0YXJnZXQgcGl4bWFwICAgICAqLwotCi0gICAgU2hvcnQgICAgIHRyYWNlSW5jcjsgICAgICAgICAgICAvKiBzd2VlcCdzIGluY3JlbWVudCBpbiB0YXJnZXQgYml0bWFwICAqLwotCi0gICAgU2hvcnQgICAgIGdyYXlfbWluX3g7ICAgICAgICAgICAvKiBjdXJyZW50IG1pbiB4IGR1cmluZyBncmF5IHJlbmRlcmluZyAqLwotICAgIFNob3J0ICAgICBncmF5X21heF94OyAgICAgICAgICAgLyogY3VycmVudCBtYXggeCBkdXJpbmcgZ3JheSByZW5kZXJpbmcgKi8KLQotICAgIC8qIGRpc3BhdGNoIHZhcmlhYmxlcyAqLwotCi0gICAgRnVuY3Rpb25fU3dlZXBfSW5pdCogIFByb2NfU3dlZXBfSW5pdDsKLSAgICBGdW5jdGlvbl9Td2VlcF9TcGFuKiAgUHJvY19Td2VlcF9TcGFuOwotICAgIEZ1bmN0aW9uX1N3ZWVwX1NwYW4qICBQcm9jX1N3ZWVwX0Ryb3A7Ci0gICAgRnVuY3Rpb25fU3dlZXBfU3RlcCogIFByb2NfU3dlZXBfU3RlcDsKLQotICAgIEJ5dGUgICAgICBkcm9wT3V0Q29udHJvbDsgICAgICAgLyogY3VycmVudCBkcm9wX291dCBjb250cm9sIG1ldGhvZCAgICAgKi8KLQotICAgIEJvb2wgICAgICBzZWNvbmRfcGFzczsgICAgICAgICAgLyogaW5kaWNhdGVzIHdoZXRoZXIgYSBob3Jpem9udGFsIHBhc3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3VsZCBiZSBwZXJmb3JtZWQgdG8gY29udHJvbCAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkcm9wLW91dCBhY2N1cmF0ZWx5IHdoZW4gY2FsbGluZyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVuZGVyX0dseXBoLiAgTm90ZSB0aGF0IHRoZXJlIGlzICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGhvcml6b250YWwgcGFzcyBkdXJpbmcgZ3JheSAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW5kZXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVFBvaW50ICAgIGFyY3NbMyAqIE1heEJlemllciArIDFdOyAvKiBUaGUgQmV6aWVyIHN0YWNrICAgICAgICAgICAgICAgICAqLwotCi0gICAgVEJhbmQgICAgIGJhbmRfc3RhY2tbMTZdOyAgICAgICAvKiBiYW5kIHN0YWNrIHVzZWQgZm9yIHN1Yi1iYW5kaW5nICAgICAqLwotICAgIEludCAgICAgICBiYW5kX3RvcDsgICAgICAgICAgICAgLyogYmFuZCBzdGFjayB0b3AgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORwotCi0gICAgQnl0ZSogICAgIGdyYXlzOwotCi0gICAgQnl0ZSAgICAgIGdyYXlfbGluZXNbUkFTVEVSX0dSQVlfTElORVNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm1lZGlhdGUgdGFibGUgdXNlZCB0byByZW5kZXIgdGhlICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheWxldmVscyBwaXhtYXBzLiAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXlfbGluZXMgaXMgYSBidWZmZXIgaG9sZGluZyB0d28gICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb25vY2hyb21lIHNjYW5saW5lcyAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIFNob3J0ICAgICBncmF5X3dpZHRoOyAgICAgICAvKiB3aWR0aCBpbiBieXRlcyBvZiBvbmUgbW9ub2Nocm9tZSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJtZWRpYXRlIHNjYW5saW5lIG9mIGdyYXlfbGluZXMuICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVhY2ggZ3JheSBwaXhlbCB0YWtlcyAyIGJpdHMgbG9uZyB0aGVyZSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBncmF5X2xpbmVzIG11c3QgaG9sZCAyIGxpbmVzLCB0aHVzIHdpdGggc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiBieXRlcyBvZiBhdCBsZWFzdCBgZ3JheV93aWR0aCoyJy4gICAgICAgICAgICAgKi8KLQotI2VuZGlmIC8qIEZUX1JBU1RFUl9BTlRJX0FMSUFTSU5HICovCi0KLSAgfTsKLQotCi0gIHR5cGVkZWYgc3RydWN0IFRSYXN0ZXJfCi0gIHsKLSAgICBjaGFyKiAgICAgYnVmZmVyOwotICAgIGxvbmcgICAgICBidWZmZXJfc2l6ZTsKLSAgICB2b2lkKiAgICAgbWVtb3J5OwotICAgIFBXb3JrZXIgICB3b3JrZXI7Ci0gICAgQnl0ZSAgICAgIGdyYXlzWzVdOwotICAgIFNob3J0ICAgICBncmF5X3dpZHRoOwotCi0gIH0gVFJhc3RlciwgKlBSYXN0ZXI7Ci0KLSNpZmRlZiBGVF9TVEFUSUNfUkFTVEVSCi0KLSAgc3RhdGljIFRXb3JrZXIgICBjdXJfcmFzOwotI2RlZmluZSByYXMgIGN1cl9yYXMKLQotI2Vsc2UKLQotI2RlZmluZSByYXMgICgqd29ya2VyKQotCi0jZW5kaWYgLyogRlRfU1RBVElDX1JBU1RFUiAqLwotCi0KLSNpZmRlZiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVNJTkcKLQotc3RhdGljIGNvbnN0IGNoYXIgIGNvdW50X3RhYmxlWzI1Nl0gPQotewotICAwICwgMSAsIDEgLCAyICwgMSAsIDIgLCAyICwgMyAsIDEgLCAyICwgMiAsIDMgLCAyICwgMyAsIDMgLCA0LAotICAxICwgMiAsIDIgLCAzICwgMiAsIDMgLCAzICwgNCAsIDIgLCAzICwgMyAsIDQgLCAzICwgNCAsIDQgLCA1LAotICAxICwgMiAsIDIgLCAzICwgMiAsIDMgLCAzICwgNCAsIDIgLCAzICwgMyAsIDQgLCAzICwgNCAsIDQgLCA1LAotICAyICwgMyAsIDMgLCA0ICwgMyAsIDQgLCA0ICwgNSAsIDMgLCA0ICwgNCAsIDUgLCA0ICwgNSAsIDUgLCA2LAotICAxICwgMiAsIDIgLCAzICwgMiAsIDMgLCAzICwgNCAsIDIgLCAzICwgMyAsIDQgLCAzICwgNCAsIDQgLCA1LAotICAyICwgMyAsIDMgLCA0ICwgMyAsIDQgLCA0ICwgNSAsIDMgLCA0ICwgNCAsIDUgLCA0ICwgNSAsIDUgLCA2LAotICAyICwgMyAsIDMgLCA0ICwgMyAsIDQgLCA0ICwgNSAsIDMgLCA0ICwgNCAsIDUgLCA0ICwgNSAsIDUgLCA2LAotICAzICwgNCAsIDQgLCA1ICwgNCAsIDUgLCA1ICwgNiAsIDQgLCA1ICwgNSAsIDYgLCA1ICwgNiAsIDYgLCA3LAotICAxICwgMiAsIDIgLCAzICwgMiAsIDMgLCAzICwgNCAsIDIgLCAzICwgMyAsIDQgLCAzICwgNCAsIDQgLCA1LAotICAyICwgMyAsIDMgLCA0ICwgMyAsIDQgLCA0ICwgNSAsIDMgLCA0ICwgNCAsIDUgLCA0ICwgNSAsIDUgLCA2LAotICAyICwgMyAsIDMgLCA0ICwgMyAsIDQgLCA0ICwgNSAsIDMgLCA0ICwgNCAsIDUgLCA0ICwgNSAsIDUgLCA2LAotICAzICwgNCAsIDQgLCA1ICwgNCAsIDUgLCA1ICwgNiAsIDQgLCA1ICwgNSAsIDYgLCA1ICwgNiAsIDYgLCA3LAotICAyICwgMyAsIDMgLCA0ICwgMyAsIDQgLCA0ICwgNSAsIDMgLCA0ICwgNCAsIDUgLCA0ICwgNSAsIDUgLCA2LAotICAzICwgNCAsIDQgLCA1ICwgNCAsIDUgLCA1ICwgNiAsIDQgLCA1ICwgNSAsIDYgLCA1ICwgNiAsIDYgLCA3LAotICAzICwgNCAsIDQgLCA1ICwgNCAsIDUgLCA1ICwgNiAsIDQgLCA1ICwgNSAsIDYgLCA1ICwgNiAsIDYgLCA3LAotICA0ICwgNSAsIDUgLCA2ICwgNSAsIDYgLCA2ICwgNyAsIDUgLCA2ICwgNiAsIDcgLCA2ICwgNyAsIDcgLCA4IH07Ci0KLSNlbmRpZiAvKiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVNJTkcgKi8KLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICBQUk9GSUxFUyBDT01QVVRBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRfSGlnaF9QcmVjaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRzIHByZWNpc2lvbiB2YXJpYWJsZXMgYWNjb3JkaW5nIHRvIHBhcmFtIGZsYWcuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIaWdoIDo6IFNldCB0byBUcnVlIGZvciBoaWdoIHByZWNpc2lvbiAodHlwaWNhbGx5IGZvciBwcGVtIDwgMTgpLCAgKi8KLSAgLyogICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBTZXRfSGlnaF9QcmVjaXNpb24oIFJBU19BUkdTIEludCAgSGlnaCApCi0gIHsKLSAgICBpZiAoIEhpZ2ggKQotICAgIHsKLSAgICAgIHJhcy5wcmVjaXNpb25fYml0cyAgID0gMTA7Ci0gICAgICByYXMucHJlY2lzaW9uX3N0ZXAgICA9IDEyODsKLSAgICAgIHJhcy5wcmVjaXNpb25faml0dGVyID0gMjQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByYXMucHJlY2lzaW9uX2JpdHMgICA9IDY7Ci0gICAgICByYXMucHJlY2lzaW9uX3N0ZXAgICA9IDMyOwotICAgICAgcmFzLnByZWNpc2lvbl9qaXR0ZXIgPSAyOwotICAgIH0KLQotICAgIEZUX1RSQUNFNigoICJTZXRfSGlnaF9QcmVjaXNpb24oJXMpXG4iLCBIaWdoID8gInRydWUiIDogImZhbHNlIiApKTsKLQotICAgIHJhcy5wcmVjaXNpb24gICAgICAgPSAxIDw8IHJhcy5wcmVjaXNpb25fYml0czsKLSAgICByYXMucHJlY2lzaW9uX2hhbGYgID0gcmFzLnByZWNpc2lvbiAvIDI7Ci0gICAgcmFzLnByZWNpc2lvbl9zaGlmdCA9IHJhcy5wcmVjaXNpb25fYml0cyAtIFBpeGVsX0JpdHM7Ci0gICAgcmFzLnByZWNpc2lvbl9tYXNrICA9IC1yYXMucHJlY2lzaW9uOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOZXdfUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGVzIGEgbmV3IHByb2ZpbGUgaW4gdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhU3RhdGUgOjogVGhlIHN0YXRlL29yaWVudGF0aW9uIG9mIHRoZSBuZXcgcHJvZmlsZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdyBvciBvZiBpbmNvaGVyZW50ICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBOZXdfUHJvZmlsZSggUkFTX0FSR1MgVFN0YXRlcyAgYVN0YXRlICkKLSAgewotICAgIGlmICggIXJhcy5mUHJvZmlsZSApCi0gICAgewotICAgICAgcmFzLmNQcm9maWxlICA9IChQUHJvZmlsZSlyYXMudG9wOwotICAgICAgcmFzLmZQcm9maWxlICA9IHJhcy5jUHJvZmlsZTsKLSAgICAgIHJhcy50b3AgICAgICArPSBBbGlnblByb2ZpbGVTaXplOwotICAgIH0KLQotICAgIGlmICggcmFzLnRvcCA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgcmFzLmVycm9yID0gUmFzdGVyX0Vycl9PdmVyZmxvdzsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIHN3aXRjaCAoIGFTdGF0ZSApCi0gICAgewotICAgIGNhc2UgQXNjZW5kaW5nX1N0YXRlOgotICAgICAgcmFzLmNQcm9maWxlLT5mbG93ID0gRmxvd19VcDsKLSAgICAgIEZUX1RSQUNFNigoICJOZXcgYXNjZW5kaW5nIHByb2ZpbGUgPSAlbHhcbiIsIChsb25nKXJhcy5jUHJvZmlsZSApKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEZXNjZW5kaW5nX1N0YXRlOgotICAgICAgcmFzLmNQcm9maWxlLT5mbG93ID0gRmxvd19Eb3duOwotICAgICAgRlRfVFJBQ0U2KCggIk5ldyBkZXNjZW5kaW5nIHByb2ZpbGUgPSAlbHhcbiIsIChsb25nKXJhcy5jUHJvZmlsZSApKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZUX0VSUk9SKCggIk5ld19Qcm9maWxlOiBpbnZhbGlkIHByb2ZpbGUgZGlyZWN0aW9uIVxuIiApKTsKLSAgICAgIHJhcy5lcnJvciA9IFJhc3Rlcl9FcnJfSW52YWxpZDsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgID0gMDsKLSAgICByYXMuY1Byb2ZpbGUtPmhlaWdodCA9IDA7Ci0gICAgcmFzLmNQcm9maWxlLT5vZmZzZXQgPSByYXMudG9wOwotICAgIHJhcy5jUHJvZmlsZS0+bGluayAgID0gKFBQcm9maWxlKTA7Ci0gICAgcmFzLmNQcm9maWxlLT5uZXh0ICAgPSAoUFByb2ZpbGUpMDsKLQotICAgIGlmICggIXJhcy5nUHJvZmlsZSApCi0gICAgICByYXMuZ1Byb2ZpbGUgPSByYXMuY1Byb2ZpbGU7Ci0KLSAgICByYXMuc3RhdGUgPSBhU3RhdGU7Ci0gICAgcmFzLmZyZXNoID0gVFJVRTsKLSAgICByYXMuam9pbnQgPSBGQUxTRTsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbmRfUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZXMgdGhlIGN1cnJlbnQgcHJvZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MuICBGQUlMVVJFIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgb3IgaW5jb2hlcmVuY3kuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBCb29sCi0gIEVuZF9Qcm9maWxlKCBSQVNfQVJHICkKLSAgewotICAgIExvbmcgICAgICBoOwotICAgIFBQcm9maWxlICBvbGRQcm9maWxlOwotCi0KLSAgICBoID0gKExvbmcpKCByYXMudG9wIC0gcmFzLmNQcm9maWxlLT5vZmZzZXQgKTsKLQotICAgIGlmICggaCA8IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkVuZF9Qcm9maWxlOiBuZWdhdGl2ZSBoZWlnaHQgZW5jb3VudGVyZWQhXG4iICkpOwotICAgICAgcmFzLmVycm9yID0gUmFzdGVyX0Vycl9OZWdfSGVpZ2h0OwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgaWYgKCBoID4gMCApCi0gICAgewotICAgICAgRlRfVFJBQ0U2KCggIkVuZGluZyBwcm9maWxlICVseCwgc3RhcnQgPSAlbGQsIGhlaWdodCA9ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgIChsb25nKXJhcy5jUHJvZmlsZSwgcmFzLmNQcm9maWxlLT5zdGFydCwgaCApKTsKLQotICAgICAgb2xkUHJvZmlsZSAgICAgICAgICAgPSByYXMuY1Byb2ZpbGU7Ci0gICAgICByYXMuY1Byb2ZpbGUtPmhlaWdodCA9IGg7Ci0gICAgICByYXMuY1Byb2ZpbGUgICAgICAgICA9IChQUHJvZmlsZSlyYXMudG9wOwotCi0gICAgICByYXMudG9wICAgICAgICAgICAgICs9IEFsaWduUHJvZmlsZVNpemU7Ci0KLSAgICAgIHJhcy5jUHJvZmlsZS0+aGVpZ2h0ID0gMDsKLSAgICAgIHJhcy5jUHJvZmlsZS0+b2Zmc2V0ID0gcmFzLnRvcDsKLSAgICAgIG9sZFByb2ZpbGUtPm5leHQgICAgID0gcmFzLmNQcm9maWxlOwotICAgICAgcmFzLm51bV9Qcm9mcysrOwotICAgIH0KLQotICAgIGlmICggcmFzLnRvcCA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgRlRfVFJBQ0UxKCggIm92ZXJmbG93IGluIEVuZF9Qcm9maWxlXG4iICkpOwotICAgICAgcmFzLmVycm9yID0gUmFzdGVyX0Vycl9PdmVyZmxvdzsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIHJhcy5qb2ludCA9IEZBTFNFOwotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluc2VydF9ZX1R1cm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluc2VydHMgYSBzYWxpZW50IGludG8gdGhlIHNvcnRlZCBsaXN0IHBsYWNlZCBvbiB0b3Agb2YgdGhlIHJlbmRlciAqLwotICAvKiAgICBwb29sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOZXcgeSBzY2FubGluZSBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MuICBGQUlMVVJFIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBCb29sCi0gIEluc2VydF9ZX1R1cm4oIFJBU19BUkdTIEludCAgeSApCi0gIHsKLSAgICBQTG9uZyAgeV90dXJuczsKLSAgICBJbnQgICAgeTIsIG47Ci0KLQotICAgIG4gICAgICAgPSByYXMubnVtVHVybnMgLSAxOwotICAgIHlfdHVybnMgPSByYXMuc2l6ZUJ1ZmYgLSByYXMubnVtVHVybnM7Ci0KLSAgICAvKiBsb29rIGZvciBmaXJzdCB5IHZhbHVlIHRoYXQgaXMgPD0gKi8KLSAgICB3aGlsZSAoIG4gPj0gMCAmJiB5IDwgeV90dXJuc1tuXSApCi0gICAgICBuLS07Ci0KLSAgICAvKiBpZiBpdCBpcyA8LCBzaW1wbHkgaW5zZXJ0IGl0LCBpZ25vcmUgaWYgPT0gKi8KLSAgICBpZiAoIG4gPj0gMCAmJiB5ID4geV90dXJuc1tuXSApCi0gICAgICB3aGlsZSAoIG4gPj0gMCApCi0gICAgICB7Ci0gICAgICAgIHkyID0gKEludCl5X3R1cm5zW25dOwotICAgICAgICB5X3R1cm5zW25dID0geTsKLSAgICAgICAgeSA9IHkyOwotICAgICAgICBuLS07Ci0gICAgICB9Ci0KLSAgICBpZiAoIG4gPCAwICkKLSAgICB7Ci0gICAgICByYXMubWF4QnVmZi0tOwotICAgICAgaWYgKCByYXMubWF4QnVmZiA8PSByYXMudG9wICkKLSAgICAgIHsKLSAgICAgICAgcmFzLmVycm9yID0gUmFzdGVyX0Vycl9PdmVyZmxvdzsKLSAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICB9Ci0gICAgICByYXMubnVtVHVybnMrKzsKLSAgICAgIHJhcy5zaXplQnVmZlstcmFzLm51bVR1cm5zXSA9IHk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplX1Byb2ZpbGVfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkanVzdHMgYWxsIGxpbmtzIGluIHRoZSBwcm9maWxlcyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgRmluYWxpemVfUHJvZmlsZV9UYWJsZSggUkFTX0FSRyApCi0gIHsKLSAgICBJbnQgICAgICAgYm90dG9tLCB0b3A7Ci0gICAgVVNob3J0ICAgIG47Ci0gICAgUFByb2ZpbGUgIHA7Ci0KLQotICAgIG4gPSByYXMubnVtX1Byb2ZzOwotCi0gICAgaWYgKCBuID4gMSApCi0gICAgewotICAgICAgcCA9IHJhcy5mUHJvZmlsZTsKLSAgICAgIHdoaWxlICggbiA+IDAgKQotICAgICAgewotICAgICAgICBpZiAoIG4gPiAxICkKLSAgICAgICAgICBwLT5saW5rID0gKFBQcm9maWxlKSggcC0+b2Zmc2V0ICsgcC0+aGVpZ2h0ICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwLT5saW5rID0gTlVMTDsKLQotICAgICAgICBzd2l0Y2ggKCBwLT5mbG93ICkKLSAgICAgICAgewotICAgICAgICBjYXNlIEZsb3dfRG93bjoKLSAgICAgICAgICBib3R0b20gICAgID0gKEludCkoIHAtPnN0YXJ0IC0gcC0+aGVpZ2h0ICsgMSApOwotICAgICAgICAgIHRvcCAgICAgICAgPSAoSW50KXAtPnN0YXJ0OwotICAgICAgICAgIHAtPnN0YXJ0ICAgPSBib3R0b207Ci0gICAgICAgICAgcC0+b2Zmc2V0ICs9IHAtPmhlaWdodCAtIDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGbG93X1VwOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJvdHRvbSA9IChJbnQpcC0+c3RhcnQ7Ci0gICAgICAgICAgdG9wICAgID0gKEludCkoIHAtPnN0YXJ0ICsgcC0+aGVpZ2h0IC0gMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBJbnNlcnRfWV9UdXJuKCBSQVNfVkFSUyBib3R0b20gKSAgIHx8Ci0gICAgICAgICAgICAgSW5zZXJ0X1lfVHVybiggUkFTX1ZBUlMgdG9wICsgMSApICApCi0gICAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0KLSAgICAgICAgcCA9IHAtPmxpbms7Ci0gICAgICAgIG4tLTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmFzLmZQcm9maWxlID0gTlVMTDsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTcGxpdF9Db25pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdWJkaXZpZGVzIG9uZSBjb25pYyBCZXppZXIgaW50byB0d28gam9pbnQgc3ViLWFyY3MgaW4gdGhlIEJlemllciAgKi8KLSAgLyogICAgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm9uZSAoc3ViZGl2aWRlZCBCZXppZXIgaXMgdGFrZW4gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjaykuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyByb3V0aW5lIGlzIHRoZSBgYmVlZicgb2YgdGhpcyBjb21wb25lbnQuICBJdCBpcyAgX3RoZV8gaW5uZXIgICovCi0gIC8qICAgIGxvb3AgdGhhdCBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGhlbGwgdG8gZ2V0IHRoZSBiZXN0IHBlcmZvcm1hbmNlLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgU3BsaXRfQ29uaWMoIFRQb2ludCogIGJhc2UgKQotICB7Ci0gICAgTG9uZyAgYSwgYjsKLQotCi0gICAgYmFzZVs0XS54ID0gYmFzZVsyXS54OwotICAgIGIgPSBiYXNlWzFdLng7Ci0gICAgYSA9IGJhc2VbM10ueCA9ICggYmFzZVsyXS54ICsgYiApIC8gMjsKLSAgICBiID0gYmFzZVsxXS54ID0gKCBiYXNlWzBdLnggKyBiICkgLyAyOwotICAgIGJhc2VbMl0ueCA9ICggYSArIGIgKSAvIDI7Ci0KLSAgICBiYXNlWzRdLnkgPSBiYXNlWzJdLnk7Ci0gICAgYiA9IGJhc2VbMV0ueTsKLSAgICBhID0gYmFzZVszXS55ID0gKCBiYXNlWzJdLnkgKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnkgPSAoIGJhc2VbMF0ueSArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gKCBhICsgYiApIC8gMjsKLQotICAgIC8qIGhhbmQgb3B0aW1pemVkLiAgZ2NjIGRvZXNuJ3Qgc2VlbSB0byBiZSB0b28gZ29vZCBhdCBjb21tb24gICAgICAqLwotICAgIC8qIGV4cHJlc3Npb24gc3Vic3RpdHV0aW9uIGFuZCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nIDstKSAgICAgICAgICAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTcGxpdF9DdWJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdWJkaXZpZGVzIGEgdGhpcmQtb3JkZXIgQmV6aWVyIGFyYyBpbnRvIHR3byBqb2ludCBzdWItYXJjcyBpbiB0aGUgKi8KLSAgLyogICAgQmV6aWVyIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyByb3V0aW5lIGlzIHRoZSBgYmVlZicgb2YgdGhlIGNvbXBvbmVudC4gIEl0IGlzIG9uZSBvZiBfdGhlXyAgICovCi0gIC8qICAgIGlubmVyIGxvb3BzIHRoYXQgc2hvdWxkIGJlIG9wdGltaXplZCBsaWtlIGhlbGwgdG8gZ2V0IHRoZSBiZXN0ICAgICAqLwotICAvKiAgICBwZXJmb3JtYW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIFNwbGl0X0N1YmljKCBUUG9pbnQqICBiYXNlICkKLSAgewotICAgIExvbmcgIGEsIGIsIGMsIGQ7Ci0KLQotICAgIGJhc2VbNl0ueCA9IGJhc2VbM10ueDsKLSAgICBjID0gYmFzZVsxXS54OwotICAgIGQgPSBiYXNlWzJdLng7Ci0gICAgYmFzZVsxXS54ID0gYSA9ICggYmFzZVswXS54ICsgYyArIDEgKSA+PiAxOwotICAgIGJhc2VbNV0ueCA9IGIgPSAoIGJhc2VbM10ueCArIGQgKyAxICkgPj4gMTsKLSAgICBjID0gKCBjICsgZCArIDEgKSA+PiAxOwotICAgIGJhc2VbMl0ueCA9IGEgPSAoIGEgKyBjICsgMSApID4+IDE7Ci0gICAgYmFzZVs0XS54ID0gYiA9ICggYiArIGMgKyAxICkgPj4gMTsKLSAgICBiYXNlWzNdLnggPSAoIGEgKyBiICsgMSApID4+IDE7Ci0KLSAgICBiYXNlWzZdLnkgPSBiYXNlWzNdLnk7Ci0gICAgYyA9IGJhc2VbMV0ueTsKLSAgICBkID0gYmFzZVsyXS55OwotICAgIGJhc2VbMV0ueSA9IGEgPSAoIGJhc2VbMF0ueSArIGMgKyAxICkgPj4gMTsKLSAgICBiYXNlWzVdLnkgPSBiID0gKCBiYXNlWzNdLnkgKyBkICsgMSApID4+IDE7Ci0gICAgYyA9ICggYyArIGQgKyAxICkgPj4gMTsKLSAgICBiYXNlWzJdLnkgPSBhID0gKCBhICsgYyArIDEgKSA+PiAxOwotICAgIGJhc2VbNF0ueSA9IGIgPSAoIGIgKyBjICsgMSApID4+IDE7Ci0gICAgYmFzZVszXS55ID0gKCBhICsgYiArIDEgKSA+PiAxOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaW5lX1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgeC1jb29yZGluYXRlcyBvZiBhbiBhc2NlbmRpbmcgbGluZSBzZWdtZW50IGFuZCBzdG9yZXMgKi8KLSAgLyogICAgdGhlbSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeDEgICA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3Mgc3RhcnQgcG9pbnQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MSAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBzdGFydCBwb2ludC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHgyICAgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTIgICA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW55IDo6IEEgbG93ZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heHkgOjogQW4gdXBwZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgTGluZV9VcCggUkFTX0FSR1MgTG9uZyAgeDEsCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIHkxLAotICAgICAgICAgICAgICAgICAgICBMb25nICB4MiwKLSAgICAgICAgICAgICAgICAgICAgTG9uZyAgeTIsCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIG1pbnksCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIG1heHkgKQotICB7Ci0gICAgTG9uZyAgIER4LCBEeTsKLSAgICBJbnQgICAgZTEsIGUyLCBmMSwgZjIsIHNpemU7ICAgICAvKiBYWFg6IGlzIGBTaG9ydCcgc3VmZmljaWVudD8gKi8KLSAgICBMb25nICAgSXgsIFJ4LCBBeDsKLQotICAgIFBMb25nICB0b3A7Ci0KLQotICAgIER4ID0geDIgLSB4MTsKLSAgICBEeSA9IHkyIC0geTE7Ci0KLSAgICBpZiAoIER5IDw9IDAgfHwgeTIgPCBtaW55IHx8IHkxID4gbWF4eSApCi0gICAgICByZXR1cm4gU1VDQ0VTUzsKLQotICAgIGlmICggeTEgPCBtaW55ICkKLSAgICB7Ci0gICAgICAvKiBUYWtlIGNhcmU6IG1pbnkteTEgY2FuIGJlIGEgdmVyeSBsYXJnZSB2YWx1ZTsgd2UgdXNlICAgICAqLwotICAgICAgLyogICAgICAgICAgICBhIHNsb3cgTXVsRGl2IGZ1bmN0aW9uIHRvIGF2b2lkIGNsaXBwaW5nIGJ1Z3MgKi8KLSAgICAgIHgxICs9IFNNdWxEaXYoIER4LCBtaW55IC0geTEsIER5ICk7Ci0gICAgICBlMSAgPSAoSW50KVRSVU5DKCBtaW55ICk7Ci0gICAgICBmMSAgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZTEgPSAoSW50KVRSVU5DKCB5MSApOwotICAgICAgZjEgPSAoSW50KUZSQUMoIHkxICk7Ci0gICAgfQotCi0gICAgaWYgKCB5MiA+IG1heHkgKQotICAgIHsKLSAgICAgIC8qIHgyICs9IEZNdWxEaXYoIER4LCBtYXh5IC0geTIsIER5ICk7ICBVTk5FQ0VTU0FSWSAqLwotICAgICAgZTIgID0gKEludClUUlVOQyggbWF4eSApOwotICAgICAgZjIgID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGUyID0gKEludClUUlVOQyggeTIgKTsKLSAgICAgIGYyID0gKEludClGUkFDKCB5MiApOwotICAgIH0KLQotICAgIGlmICggZjEgPiAwICkKLSAgICB7Ci0gICAgICBpZiAoIGUxID09IGUyICkKLSAgICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHgxICs9IEZNdWxEaXYoIER4LCByYXMucHJlY2lzaW9uIC0gZjEsIER5ICk7Ci0gICAgICAgIGUxICs9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGlmICggcmFzLmpvaW50ICkKLSAgICAgIHsKLSAgICAgICAgcmFzLnRvcC0tOwotICAgICAgICByYXMuam9pbnQgPSBGQUxTRTsKLSAgICAgIH0KLQotICAgIHJhcy5qb2ludCA9IChjaGFyKSggZjIgPT0gMCApOwotCi0gICAgaWYgKCByYXMuZnJlc2ggKQotICAgIHsKLSAgICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgPSBlMTsKLSAgICAgIHJhcy5mcmVzaCAgICAgICAgICAgPSBGQUxTRTsKLSAgICB9Ci0KLSAgICBzaXplID0gZTIgLSBlMSArIDE7Ci0gICAgaWYgKCByYXMudG9wICsgc2l6ZSA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgcmFzLmVycm9yID0gUmFzdGVyX0Vycl9PdmVyZmxvdzsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIGlmICggRHggPiAwICkKLSAgICB7Ci0gICAgICBJeCA9ICggcmFzLnByZWNpc2lvbiAqIER4ICkgLyBEeTsKLSAgICAgIFJ4ID0gKCByYXMucHJlY2lzaW9uICogRHggKSAlIER5OwotICAgICAgRHggPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSXggPSAtKCAoIHJhcy5wcmVjaXNpb24gKiAtRHggKSAvIER5ICk7Ci0gICAgICBSeCA9ICAgICggcmFzLnByZWNpc2lvbiAqIC1EeCApICUgRHk7Ci0gICAgICBEeCA9IC0xOwotICAgIH0KLQotICAgIEF4ICA9IC1EeTsKLSAgICB0b3AgPSByYXMudG9wOwotCi0gICAgd2hpbGUgKCBzaXplID4gMCApCi0gICAgewotICAgICAgKnRvcCsrID0geDE7Ci0KLSAgICAgIHgxICs9IEl4OwotICAgICAgQXggKz0gUng7Ci0gICAgICBpZiAoIEF4ID49IDAgKQotICAgICAgewotICAgICAgICBBeCAtPSBEeTsKLSAgICAgICAgeDEgKz0gRHg7Ci0gICAgICB9Ci0gICAgICBzaXplLS07Ci0gICAgfQotCi0gICAgcmFzLnRvcCA9IHRvcDsKLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGluZV9Eb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gZGVzY2VuZGluZyBsaW5lIHNlZ21lbnQgYW5kICAgICAgICovCi0gIC8qICAgIHN0b3JlcyB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHgxICAgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIHN0YXJ0IHBvaW50LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTEgICA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3Mgc3RhcnQgcG9pbnQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4MiAgIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBlbmQgcG9pbnQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkyICAgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWlueSA6OiBBIGxvd2VyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXh5IDo6IEFuIHVwcGVyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gcmVuZGVyIHBvb2wgb3ZlcmZsb3cuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBCb29sCi0gIExpbmVfRG93biggUkFTX0FSR1MgTG9uZyAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgTG9uZyAgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgTG9uZyAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgTG9uZyAgeTIsCi0gICAgICAgICAgICAgICAgICAgICAgTG9uZyAgbWlueSwKLSAgICAgICAgICAgICAgICAgICAgICBMb25nICBtYXh5ICkKLSAgewotICAgIEJvb2wgIHJlc3VsdCwgZnJlc2g7Ci0KLQotICAgIGZyZXNoICA9IHJhcy5mcmVzaDsKLQotICAgIHJlc3VsdCA9IExpbmVfVXAoIFJBU19WQVJTIHgxLCAteTEsIHgyLCAteTIsIC1tYXh5LCAtbWlueSApOwotCi0gICAgaWYgKCBmcmVzaCAmJiAhcmFzLmZyZXNoICkKLSAgICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgPSAtcmFzLmNQcm9maWxlLT5zdGFydDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIEEgZnVuY3Rpb24gdHlwZSBkZXNjcmliaW5nIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBzcGxpdCBCZXppZXIgYXJjcyAqLwotICB0eXBlZGVmIHZvaWQgICgqVFNwbGl0dGVyKSggVFBvaW50KiAgYmFzZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmV6aWVyX1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gYXNjZW5kaW5nIEJlemllciBhcmMgYW5kIHN0b3JlcyAgICovCi0gIC8qICAgIHRoZW0gaW4gdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlZ3JlZSAgIDo6IFRoZSBkZWdyZWUgb2YgdGhlIEJlemllciBhcmMgKGVpdGhlciAyIG9yIDMpLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BsaXR0ZXIgOjogVGhlIGZ1bmN0aW9uIHRvIHNwbGl0IEJlemllciBhcmNzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW55ICAgICA6OiBBIGxvd2VyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heHkgICAgIDo6IEFuIHVwcGVyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgQmV6aWVyX1VwKCBSQVNfQVJHUyBJbnQgICAgICAgIGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICBUU3BsaXR0ZXIgIHNwbGl0dGVyLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgICAgICAgbWlueSwKLSAgICAgICAgICAgICAgICAgICAgICBMb25nICAgICAgIG1heHkgKQotICB7Ci0gICAgTG9uZyAgIHkxLCB5MiwgZSwgZTIsIGUwOwotICAgIFNob3J0ICBmMTsKLQotICAgIFRQb2ludCogIGFyYzsKLSAgICBUUG9pbnQqICBzdGFydF9hcmM7Ci0KLSAgICBQTG9uZyB0b3A7Ci0KLQotICAgIGFyYyA9IHJhcy5hcmM7Ci0gICAgeTEgID0gYXJjW2RlZ3JlZV0ueTsKLSAgICB5MiAgPSBhcmNbMF0ueTsKLSAgICB0b3AgPSByYXMudG9wOwotCi0gICAgaWYgKCB5MiA8IG1pbnkgfHwgeTEgPiBtYXh5ICkKLSAgICAgIGdvdG8gRmluOwotCi0gICAgZTIgPSBGTE9PUiggeTIgKTsKLQotICAgIGlmICggZTIgPiBtYXh5ICkKLSAgICAgIGUyID0gbWF4eTsKLQotICAgIGUwID0gbWlueTsKLQotICAgIGlmICggeTEgPCBtaW55ICkKLSAgICAgIGUgPSBtaW55OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlICA9IENFSUxJTkcoIHkxICk7Ci0gICAgICBmMSA9IChTaG9ydCkoIEZSQUMoIHkxICkgKTsKLSAgICAgIGUwID0gZTsKLQotICAgICAgaWYgKCBmMSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCByYXMuam9pbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgdG9wLS07Ci0gICAgICAgICAgcmFzLmpvaW50ID0gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAqdG9wKysgPSBhcmNbZGVncmVlXS54OwotCi0gICAgICAgIGUgKz0gcmFzLnByZWNpc2lvbjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHJhcy5mcmVzaCApCi0gICAgewotICAgICAgcmFzLmNQcm9maWxlLT5zdGFydCA9IFRSVU5DKCBlMCApOwotICAgICAgcmFzLmZyZXNoID0gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKCBlMiA8IGUgKQotICAgICAgZ290byBGaW47Ci0KLSAgICBpZiAoICggdG9wICsgVFJVTkMoIGUyIC0gZSApICsgMSApID49IHJhcy5tYXhCdWZmICkKLSAgICB7Ci0gICAgICByYXMudG9wICAgPSB0b3A7Ci0gICAgICByYXMuZXJyb3IgPSBSYXN0ZXJfRXJyX092ZXJmbG93OwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgc3RhcnRfYXJjID0gYXJjOwotCi0gICAgd2hpbGUgKCBhcmMgPj0gc3RhcnRfYXJjICYmIGUgPD0gZTIgKQotICAgIHsKLSAgICAgIHJhcy5qb2ludCA9IEZBTFNFOwotCi0gICAgICB5MiA9IGFyY1swXS55OwotCi0gICAgICBpZiAoIHkyID4gZSApCi0gICAgICB7Ci0gICAgICAgIHkxID0gYXJjW2RlZ3JlZV0ueTsKLSAgICAgICAgaWYgKCB5MiAtIHkxID49IHJhcy5wcmVjaXNpb25fc3RlcCApCi0gICAgICAgIHsKLSAgICAgICAgICBzcGxpdHRlciggYXJjICk7Ci0gICAgICAgICAgYXJjICs9IGRlZ3JlZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqdG9wKysgPSBhcmNbZGVncmVlXS54ICsgRk11bERpdiggYXJjWzBdLngtYXJjW2RlZ3JlZV0ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAtIHkxLCB5MiAtIHkxICk7Ci0gICAgICAgICAgYXJjIC09IGRlZ3JlZTsKLSAgICAgICAgICBlICAgKz0gcmFzLnByZWNpc2lvbjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIHkyID09IGUgKQotICAgICAgICB7Ci0gICAgICAgICAgcmFzLmpvaW50ICA9IFRSVUU7Ci0gICAgICAgICAgKnRvcCsrICAgICA9IGFyY1swXS54OwotCi0gICAgICAgICAgZSArPSByYXMucHJlY2lzaW9uOwotICAgICAgICB9Ci0gICAgICAgIGFyYyAtPSBkZWdyZWU7Ci0gICAgICB9Ci0gICAgfQotCi0gIEZpbjoKLSAgICByYXMudG9wICA9IHRvcDsKLSAgICByYXMuYXJjIC09IGRlZ3JlZTsKLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmV6aWVyX0Rvd24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gZGVzY2VuZGluZyBCZXppZXIgYXJjIGFuZCBzdG9yZXMgICovCi0gIC8qICAgIHRoZW0gaW4gdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlZ3JlZSAgIDo6IFRoZSBkZWdyZWUgb2YgdGhlIEJlemllciBhcmMgKGVpdGhlciAyIG9yIDMpLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BsaXR0ZXIgOjogVGhlIGZ1bmN0aW9uIHRvIHNwbGl0IEJlemllciBhcmNzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW55ICAgICA6OiBBIGxvd2VyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heHkgICAgIDo6IEFuIHVwcGVyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgQmV6aWVyX0Rvd24oIFJBU19BUkdTIEludCAgICAgICAgZGVncmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFNwbGl0dGVyICBzcGxpdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIExvbmcgICAgICAgbWlueSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExvbmcgICAgICAgbWF4eSApCi0gIHsKLSAgICBUUG9pbnQqICBhcmMgPSByYXMuYXJjOwotICAgIEJvb2wgICAgIHJlc3VsdCwgZnJlc2g7Ci0KLQotICAgIGFyY1swXS55ID0gLWFyY1swXS55OwotICAgIGFyY1sxXS55ID0gLWFyY1sxXS55OwotICAgIGFyY1syXS55ID0gLWFyY1syXS55OwotICAgIGlmICggZGVncmVlID4gMiApCi0gICAgICBhcmNbM10ueSA9IC1hcmNbM10ueTsKLQotICAgIGZyZXNoID0gcmFzLmZyZXNoOwotCi0gICAgcmVzdWx0ID0gQmV6aWVyX1VwKCBSQVNfVkFSUyBkZWdyZWUsIHNwbGl0dGVyLCAtbWF4eSwgLW1pbnkgKTsKLQotICAgIGlmICggZnJlc2ggJiYgIXJhcy5mcmVzaCApCi0gICAgICByYXMuY1Byb2ZpbGUtPnN0YXJ0ID0gLXJhcy5jUHJvZmlsZS0+c3RhcnQ7Ci0KLSAgICBhcmNbMF0ueSA9IC1hcmNbMF0ueTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaW5lX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmplY3RzIGEgbmV3IGxpbmUgc2VnbWVudCBhbmQgYWRqdXN0cyBQcm9maWxlcyBsaXN0LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHggOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50ICAgKi8KLSAgLyogICAgICAgIGlzIHN0b3JlZCBpbiBgbGFzdFgnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHkgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50ICAgKi8KLSAgLyogICAgICAgIGlzIHN0b3JlZCBpbiBgbGFzdFknKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gcmVuZGVyIHBvb2wgb3ZlcmZsb3cgb3IgaW5jb3JyZWN0ICAgICovCi0gIC8qICAgcHJvZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgTGluZV9UbyggUkFTX0FSR1MgTG9uZyAgeCwKLSAgICAgICAgICAgICAgICAgICAgTG9uZyAgeSApCi0gIHsKLSAgICAvKiBGaXJzdCwgZGV0ZWN0IGEgY2hhbmdlIG9mIGRpcmVjdGlvbiAqLwotCi0gICAgc3dpdGNoICggcmFzLnN0YXRlICkKLSAgICB7Ci0gICAgY2FzZSBVbmtub3duX1N0YXRlOgotICAgICAgaWYgKCB5ID4gcmFzLmxhc3RZICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBOZXdfUHJvZmlsZSggUkFTX1ZBUlMgQXNjZW5kaW5nX1N0YXRlICkgKQotICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIHkgPCByYXMubGFzdFkgKQotICAgICAgICAgIGlmICggTmV3X1Byb2ZpbGUoIFJBU19WQVJTIERlc2NlbmRpbmdfU3RhdGUgKSApCi0gICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIHkgPCByYXMubGFzdFkgKQotICAgICAgewotICAgICAgICBpZiAoIEVuZF9Qcm9maWxlKCBSQVNfVkFSICkgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICBOZXdfUHJvZmlsZSggUkFTX1ZBUlMgRGVzY2VuZGluZ19TdGF0ZSApICkKLSAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEZXNjZW5kaW5nX1N0YXRlOgotICAgICAgaWYgKCB5ID4gcmFzLmxhc3RZICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBFbmRfUHJvZmlsZSggUkFTX1ZBUiApICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICBOZXdfUHJvZmlsZSggUkFTX1ZBUlMgQXNjZW5kaW5nX1N0YXRlICkgKQotICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgOwotICAgIH0KLQotICAgIC8qIFRoZW4gY29tcHV0ZSB0aGUgbGluZXMgKi8KLQotICAgIHN3aXRjaCAoIHJhcy5zdGF0ZSApCi0gICAgewotICAgIGNhc2UgQXNjZW5kaW5nX1N0YXRlOgotICAgICAgaWYgKCBMaW5lX1VwKCBSQVNfVkFSUyByYXMubGFzdFgsIHJhcy5sYXN0WSwKLSAgICAgICAgICAgICAgICAgICAgeCwgeSwgcmFzLm1pblksIHJhcy5tYXhZICkgKQotICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEZXNjZW5kaW5nX1N0YXRlOgotICAgICAgaWYgKCBMaW5lX0Rvd24oIFJBU19WQVJTIHJhcy5sYXN0WCwgcmFzLmxhc3RZLAotICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHJhcy5taW5ZLCByYXMubWF4WSApICkKLSAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gICAgfQotCi0gICAgcmFzLmxhc3RYID0geDsKLSAgICByYXMubGFzdFkgPSB5OwotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbmljX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluamVjdHMgYSBuZXcgY29uaWMgYXJjIGFuZCBhZGp1c3RzIHRoZSBwcm9maWxlIGxpc3QuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY3ggOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3MgbmV3IGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjeSA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBuZXcgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHggIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzICAgKi8KLSAgLyogICAgICAgICBzdG9yZWQgaW4gYGxhc3RYJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHkgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzICAgKi8KLSAgLyogICAgICAgICBzdG9yZWQgaW4gYGxhc3RZJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gcmVuZGVyIHBvb2wgb3ZlcmZsb3cgb3IgaW5jb3JyZWN0ICAgICovCi0gIC8qICAgcHJvZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgQ29uaWNfVG8oIFJBU19BUkdTIExvbmcgIGN4LAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3ksCi0gICAgICAgICAgICAgICAgICAgICBMb25nICB4LAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgeSApCi0gIHsKLSAgICBMb25nICAgICB5MSwgeTIsIHkzLCB4MywgeW1pbiwgeW1heDsKLSAgICBUU3RhdGVzICBzdGF0ZV9iZXo7Ci0KLQotICAgIHJhcy5hcmMgICAgICA9IHJhcy5hcmNzOwotICAgIHJhcy5hcmNbMl0ueCA9IHJhcy5sYXN0WDsKLSAgICByYXMuYXJjWzJdLnkgPSByYXMubGFzdFk7Ci0gICAgcmFzLmFyY1sxXS54ID0gY3g7IHJhcy5hcmNbMV0ueSA9IGN5OwotICAgIHJhcy5hcmNbMF0ueCA9IHg7ICByYXMuYXJjWzBdLnkgPSB5OwotCi0gICAgZG8KLSAgICB7Ci0gICAgICB5MSA9IHJhcy5hcmNbMl0ueTsKLSAgICAgIHkyID0gcmFzLmFyY1sxXS55OwotICAgICAgeTMgPSByYXMuYXJjWzBdLnk7Ci0gICAgICB4MyA9IHJhcy5hcmNbMF0ueDsKLQotICAgICAgLyogZmlyc3QsIGNhdGVnb3JpemUgdGhlIEJlemllciBhcmMgKi8KLQotICAgICAgaWYgKCB5MSA8PSB5MyApCi0gICAgICB7Ci0gICAgICAgIHltaW4gPSB5MTsKLSAgICAgICAgeW1heCA9IHkzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB5bWluID0geTM7Ci0gICAgICAgIHltYXggPSB5MTsKLSAgICAgIH0KLQotICAgICAgaWYgKCB5MiA8IHltaW4gfHwgeTIgPiB5bWF4ICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcyBhcmMgaGFzIG5vIGdpdmVuIGRpcmVjdGlvbiwgc3BsaXQgaXQhICovCi0gICAgICAgIFNwbGl0X0NvbmljKCByYXMuYXJjICk7Ci0gICAgICAgIHJhcy5hcmMgKz0gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCB5MSA9PSB5MyApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgYXJjIGlzIGZsYXQsIGlnbm9yZSBpdCBhbmQgcG9wIGl0IGZyb20gdGhlIEJlemllciBzdGFjayAqLwotICAgICAgICByYXMuYXJjIC09IDI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHRoZSBhcmMgaXMgeS1tb25vdG9ub3VzLCBlaXRoZXIgYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcgKi8KLSAgICAgICAgLyogZGV0ZWN0IGEgY2hhbmdlIG9mIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBzdGF0ZV9iZXogPSB5MSA8IHkzID8gQXNjZW5kaW5nX1N0YXRlIDogRGVzY2VuZGluZ19TdGF0ZTsKLSAgICAgICAgaWYgKCByYXMuc3RhdGUgIT0gc3RhdGVfYmV6ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGZpbmFsaXplIGN1cnJlbnQgcHJvZmlsZSBpZiBhbnkgKi8KLSAgICAgICAgICBpZiAoIHJhcy5zdGF0ZSAhPSBVbmtub3duX1N0YXRlICAgJiYKLSAgICAgICAgICAgICAgIEVuZF9Qcm9maWxlKCBSQVNfVkFSICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgLyogY3JlYXRlIGEgbmV3IHByb2ZpbGUgKi8KLSAgICAgICAgICBpZiAoIE5ld19Qcm9maWxlKCBSQVNfVkFSUyBzdGF0ZV9iZXogKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgY2FsbCB0aGUgYXBwcm9wcmlhdGUgcm91dGluZSAqLwotICAgICAgICBpZiAoIHN0YXRlX2JleiA9PSBBc2NlbmRpbmdfU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBCZXppZXJfVXAoIFJBU19WQVJTIDIsIFNwbGl0X0NvbmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmICggQmV6aWVyX0Rvd24oIFJBU19WQVJTIDIsIFNwbGl0X0NvbmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICB9IHdoaWxlICggcmFzLmFyYyA+PSByYXMuYXJjcyApOwotCi0gICAgcmFzLmxhc3RYID0geDM7Ci0gICAgcmFzLmxhc3RZID0geTM7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBGYWlsOgotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdWJpY19UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmplY3RzIGEgbmV3IGN1YmljIGFyYyBhbmQgYWRqdXN0cyB0aGUgcHJvZmlsZSBsaXN0LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN4MSA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBmaXJzdCBuZXcgY29udHJvbCBwb2ludC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY3kxIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGZpcnN0IG5ldyBjb250cm9sIHBvaW50LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjeDIgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3Mgc2Vjb25kIG5ldyBjb250cm9sIHBvaW50LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN5MiA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBzZWNvbmQgbmV3IGNvbnRyb2wgcG9pbnQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeCAgIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzICAqLwotICAvKiAgICAgICAgICBzdG9yZWQgaW4gYGxhc3RYJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeSAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzICAqLwotICAvKiAgICAgICAgICBzdG9yZWQgaW4gYGxhc3RZJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QgICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBDdWJpY19UbyggUkFTX0FSR1MgTG9uZyAgY3gxLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3kxLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3gyLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3kyLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgeCwKLSAgICAgICAgICAgICAgICAgICAgIExvbmcgIHkgKQotICB7Ci0gICAgTG9uZyAgICAgeTEsIHkyLCB5MywgeTQsIHg0LCB5bWluMSwgeW1heDEsIHltaW4yLCB5bWF4MjsKLSAgICBUU3RhdGVzICBzdGF0ZV9iZXo7Ci0KLQotICAgIHJhcy5hcmMgICAgICA9IHJhcy5hcmNzOwotICAgIHJhcy5hcmNbM10ueCA9IHJhcy5sYXN0WDsKLSAgICByYXMuYXJjWzNdLnkgPSByYXMubGFzdFk7Ci0gICAgcmFzLmFyY1syXS54ID0gY3gxOyByYXMuYXJjWzJdLnkgPSBjeTE7Ci0gICAgcmFzLmFyY1sxXS54ID0gY3gyOyByYXMuYXJjWzFdLnkgPSBjeTI7Ci0gICAgcmFzLmFyY1swXS54ID0geDsgICByYXMuYXJjWzBdLnkgPSB5OwotCi0gICAgZG8KLSAgICB7Ci0gICAgICB5MSA9IHJhcy5hcmNbM10ueTsKLSAgICAgIHkyID0gcmFzLmFyY1syXS55OwotICAgICAgeTMgPSByYXMuYXJjWzFdLnk7Ci0gICAgICB5NCA9IHJhcy5hcmNbMF0ueTsKLSAgICAgIHg0ID0gcmFzLmFyY1swXS54OwotCi0gICAgICAvKiBmaXJzdCwgY2F0ZWdvcml6ZSB0aGUgQmV6aWVyIGFyYyAqLwotCi0gICAgICBpZiAoIHkxIDw9IHk0ICkKLSAgICAgIHsKLSAgICAgICAgeW1pbjEgPSB5MTsKLSAgICAgICAgeW1heDEgPSB5NDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeW1pbjEgPSB5NDsKLSAgICAgICAgeW1heDEgPSB5MTsKLSAgICAgIH0KLQotICAgICAgaWYgKCB5MiA8PSB5MyApCi0gICAgICB7Ci0gICAgICAgIHltaW4yID0geTI7Ci0gICAgICAgIHltYXgyID0geTM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHltaW4yID0geTM7Ci0gICAgICAgIHltYXgyID0geTI7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggeW1pbjIgPCB5bWluMSB8fCB5bWF4MiA+IHltYXgxICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcyBhcmMgaGFzIG5vIGdpdmVuIGRpcmVjdGlvbiwgc3BsaXQgaXQhICovCi0gICAgICAgIFNwbGl0X0N1YmljKCByYXMuYXJjICk7Ci0gICAgICAgIHJhcy5hcmMgKz0gMzsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCB5MSA9PSB5NCApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgYXJjIGlzIGZsYXQsIGlnbm9yZSBpdCBhbmQgcG9wIGl0IGZyb20gdGhlIEJlemllciBzdGFjayAqLwotICAgICAgICByYXMuYXJjIC09IDM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN0YXRlX2JleiA9ICggeTEgPD0geTQgKSA/IEFzY2VuZGluZ19TdGF0ZSA6IERlc2NlbmRpbmdfU3RhdGU7Ci0KLSAgICAgICAgLyogZGV0ZWN0IGEgY2hhbmdlIG9mIGRpcmVjdGlvbiAqLwotICAgICAgICBpZiAoIHJhcy5zdGF0ZSAhPSBzdGF0ZV9iZXogKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCByYXMuc3RhdGUgIT0gVW5rbm93bl9TdGF0ZSAgICYmCi0gICAgICAgICAgICAgICBFbmRfUHJvZmlsZSggUkFTX1ZBUiApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIGlmICggTmV3X1Byb2ZpbGUoIFJBU19WQVJTIHN0YXRlX2JleiApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbXB1dGUgaW50ZXJzZWN0aW9ucyAqLwotICAgICAgICBpZiAoIHN0YXRlX2JleiA9PSBBc2NlbmRpbmdfU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBCZXppZXJfVXAoIFJBU19WQVJTIDMsIFNwbGl0X0N1YmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmICggQmV6aWVyX0Rvd24oIFJBU19WQVJTIDMsIFNwbGl0X0N1YmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICB9IHdoaWxlICggcmFzLmFyYyA+PSByYXMuYXJjcyApOwotCi0gICAgcmFzLmxhc3RYID0geDQ7Ci0gICAgcmFzLmxhc3RZID0geTQ7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBGYWlsOgotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotI3VuZGVmICBTV0FQXwotI2RlZmluZSBTV0FQXyggeCwgeSApICBkbyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb25nICBzd2FwID0geDsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geTsgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBzd2FwOyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlY29tcG9zZV9DdXJ2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNjYW5zIHRoZSBvdXRsaW5lIGFycmF5cyBpbiBvcmRlciB0byBlbWl0IGluZGl2aWR1YWwgc2VnbWVudHMgYW5kICAqLwotICAvKiAgICBCZXppZXJzIGJ5IGNhbGxpbmcgTGluZV9UbygpIGFuZCBCZXppZXJfVG8oKS4gIEl0IGhhbmRsZXMgYWxsICAgICAgKi8KLSAgLyogICAgd2VpcmQgY2FzZXMsIGxpa2Ugd2hlbiB0aGUgZmlyc3QgcG9pbnQgaXMgb2ZmIHRoZSBjdXJ2ZSwgb3Igd2hlbiAgICovCi0gIC8qICAgIHRoZXJlIGFyZSBzaW1wbHkgbm8gYG9uJyBwb2ludHMgaW4gdGhlIGNvbnRvdXIhICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpcnN0ICAgOjogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwb2ludCBpbiB0aGUgY29udG91ci4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFzdCAgICA6OiBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGNvbnRvdXIuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGlwcGVkIDo6IElmIHNldCwgZmxpcCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBjdXJ2ZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBCb29sCi0gIERlY29tcG9zZV9DdXJ2ZSggUkFTX0FSR1MgVVNob3J0ICBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU2hvcnQgIGxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICBmbGlwcGVkICkKLSAgewotICAgIEZUX1ZlY3RvciAgIHZfbGFzdDsKLSAgICBGVF9WZWN0b3IgICB2X2NvbnRyb2w7Ci0gICAgRlRfVmVjdG9yICAgdl9zdGFydDsKLQotICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICBGVF9WZWN0b3IqICBwb2ludDsKLSAgICBGVF9WZWN0b3IqICBsaW1pdDsKLSAgICBjaGFyKiAgICAgICB0YWdzOwotCi0gICAgdW5zaWduZWQgICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCi0KLQotICAgIHBvaW50cyA9IHJhcy5vdXRsaW5lLnBvaW50czsKLSAgICBsaW1pdCAgPSBwb2ludHMgKyBsYXN0OwotCi0gICAgdl9zdGFydC54ID0gU0NBTEVEKCBwb2ludHNbZmlyc3RdLnggKTsKLSAgICB2X3N0YXJ0LnkgPSBTQ0FMRUQoIHBvaW50c1tmaXJzdF0ueSApOwotICAgIHZfbGFzdC54ICA9IFNDQUxFRCggcG9pbnRzW2xhc3RdLnggKTsKLSAgICB2X2xhc3QueSAgPSBTQ0FMRUQoIHBvaW50c1tsYXN0XS55ICk7Ci0KLSAgICBpZiAoIGZsaXBwZWQgKQotICAgIHsKLSAgICAgIFNXQVBfKCB2X3N0YXJ0LngsIHZfc3RhcnQueSApOwotICAgICAgU1dBUF8oIHZfbGFzdC54LCB2X2xhc3QueSApOwotICAgIH0KLQotICAgIHZfY29udHJvbCA9IHZfc3RhcnQ7Ci0KLSAgICBwb2ludCA9IHBvaW50cyArIGZpcnN0OwotICAgIHRhZ3MgID0gcmFzLm91dGxpbmUudGFncyAgKyBmaXJzdDsKLSAgICB0YWcgICA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgLyogQSBjb250b3VyIGNhbm5vdCBzdGFydCB3aXRoIGEgY3ViaWMgY29udHJvbCBwb2ludCEgKi8KLSAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAvKiBjaGVjayBmaXJzdCBwb2ludCB0byBkZXRlcm1pbmUgb3JpZ2luICovCi0gICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICB7Ci0gICAgICAvKiBmaXJzdCBwb2ludCBpcyBjb25pYyBjb250cm9sLiAgWWVzLCB0aGlzIGhhcHBlbnMuICovCi0gICAgICBpZiAoIEZUX0NVUlZFX1RBRyggcmFzLm91dGxpbmUudGFnc1tsYXN0XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICB7Ci0gICAgICAgIC8qIHN0YXJ0IGF0IGxhc3QgcG9pbnQgaWYgaXQgaXMgb24gdGhlIGN1cnZlICovCi0gICAgICAgIHZfc3RhcnQgPSB2X2xhc3Q7Ci0gICAgICAgIGxpbWl0LS07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIGJvdGggZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBjb25pYywgICAgICAgICAqLwotICAgICAgICAvKiBzdGFydCBhdCB0aGVpciBtaWRkbGUgYW5kIHJlY29yZCBpdHMgcG9zaXRpb24gICAgKi8KLSAgICAgICAgLyogZm9yIGNsb3N1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7Ci0gICAgICAgIHZfc3RhcnQueSA9ICggdl9zdGFydC55ICsgdl9sYXN0LnkgKSAvIDI7Ci0KLSAgICAgICAgdl9sYXN0ID0gdl9zdGFydDsKLSAgICAgIH0KLSAgICAgIHBvaW50LS07Ci0gICAgICB0YWdzLS07Ci0gICAgfQotCi0gICAgcmFzLmxhc3RYID0gdl9zdGFydC54OwotICAgIHJhcy5sYXN0WSA9IHZfc3RhcnQueTsKLQotICAgIHdoaWxlICggcG9pbnQgPCBsaW1pdCApCi0gICAgewotICAgICAgcG9pbnQrKzsKLSAgICAgIHRhZ3MrKzsKLQotICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0KLSAgICAgIHN3aXRjaCAoIHRhZyApCi0gICAgICB7Ci0gICAgICBjYXNlIEZUX0NVUlZFX1RBR19PTjogIC8qIGVtaXQgYSBzaW5nbGUgbGluZV90byAqLwotICAgICAgICB7Ci0gICAgICAgICAgTG9uZyAgeCwgeTsKLQotCi0gICAgICAgICAgeCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICB5ID0gU0NBTEVEKCBwb2ludC0+eSApOwotICAgICAgICAgIGlmICggZmxpcHBlZCApCi0gICAgICAgICAgICBTV0FQXyggeCwgeSApOwotCi0gICAgICAgICAgaWYgKCBMaW5lX1RvKCBSQVNfVkFSUyB4LCB5ICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX0NPTklDOiAgLyogY29uc3VtZSBjb25pYyBhcmNzICovCi0gICAgICAgIHZfY29udHJvbC54ID0gU0NBTEVEKCBwb2ludFswXS54ICk7Ci0gICAgICAgIHZfY29udHJvbC55ID0gU0NBTEVEKCBwb2ludFswXS55ICk7Ci0KLSAgICAgICAgaWYgKCBmbGlwcGVkICkKLSAgICAgICAgICBTV0FQXyggdl9jb250cm9sLngsIHZfY29udHJvbC55ICk7Ci0KLSAgICAgIERvX0NvbmljOgotICAgICAgICBpZiAoIHBvaW50IDwgbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yICB2X21pZGRsZTsKLSAgICAgICAgICBMb25nICAgICAgIHgsIHk7Ci0KLQotICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgICAgdGFncysrOwotICAgICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgICAgICAgeCA9IFNDQUxFRCggcG9pbnRbMF0ueCApOwotICAgICAgICAgIHkgPSBTQ0FMRUQoIHBvaW50WzBdLnkgKTsKLQotICAgICAgICAgIGlmICggZmxpcHBlZCApCi0gICAgICAgICAgICBTV0FQXyggeCwgeSApOwotCi0gICAgICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIENvbmljX1RvKCBSQVNfVkFSUyB2X2NvbnRyb2wueCwgdl9jb250cm9sLnksIHgsIHkgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggdGFnICE9IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgIHZfbWlkZGxlLnggPSAoIHZfY29udHJvbC54ICsgeCApIC8gMjsKLSAgICAgICAgICB2X21pZGRsZS55ID0gKCB2X2NvbnRyb2wueSArIHkgKSAvIDI7Ci0KLSAgICAgICAgICBpZiAoIENvbmljX1RvKCBSQVNfVkFSUyB2X2NvbnRyb2wueCwgdl9jb250cm9sLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9taWRkbGUueCwgIHZfbWlkZGxlLnkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB2X2NvbnRyb2wueCA9IHg7Ci0gICAgICAgICAgdl9jb250cm9sLnkgPSB5OwotCi0gICAgICAgICAgZ290byBEb19Db25pYzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggQ29uaWNfVG8oIFJBU19WQVJTIHZfY29udHJvbC54LCB2X2NvbnRyb2wueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9zdGFydC54LCAgIHZfc3RhcnQueSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZ290byBDbG9zZTsKLQotICAgICAgZGVmYXVsdDogIC8qIEZUX0NVUlZFX1RBR19DVUJJQyAqLwotICAgICAgICB7Ci0gICAgICAgICAgTG9uZyAgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MzsKLQotCi0gICAgICAgICAgaWYgKCBwb2ludCArIDEgPiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIEZUX0NVUlZFX1RBRyggdGFnc1sxXSApICE9IEZUX0NVUlZFX1RBR19DVUJJQyApCi0gICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgIHBvaW50ICs9IDI7Ci0gICAgICAgICAgdGFncyAgKz0gMjsKLQotICAgICAgICAgIHgxID0gU0NBTEVEKCBwb2ludFstMl0ueCApOwotICAgICAgICAgIHkxID0gU0NBTEVEKCBwb2ludFstMl0ueSApOwotICAgICAgICAgIHgyID0gU0NBTEVEKCBwb2ludFstMV0ueCApOwotICAgICAgICAgIHkyID0gU0NBTEVEKCBwb2ludFstMV0ueSApOwotICAgICAgICAgIHgzID0gU0NBTEVEKCBwb2ludFsgMF0ueCApOwotICAgICAgICAgIHkzID0gU0NBTEVEKCBwb2ludFsgMF0ueSApOwotCi0gICAgICAgICAgaWYgKCBmbGlwcGVkICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTV0FQXyggeDEsIHkxICk7Ci0gICAgICAgICAgICBTV0FQXyggeDIsIHkyICk7Ci0gICAgICAgICAgICBTV0FQXyggeDMsIHkzICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBDdWJpY19UbyggUkFTX1ZBUlMgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MyApICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBDdWJpY19UbyggUkFTX1ZBUlMgeDEsIHkxLCB4MiwgeTIsIHZfc3RhcnQueCwgdl9zdGFydC55ICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjbG9zZSB0aGUgY29udG91ciB3aXRoIGEgbGluZSBzZWdtZW50ICovCi0gICAgaWYgKCBMaW5lX1RvKCBSQVNfVkFSUyB2X3N0YXJ0LngsIHZfc3RhcnQueSApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICBDbG9zZToKLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBJbnZhbGlkX091dGxpbmU6Ci0gICAgcmFzLmVycm9yID0gUmFzdGVyX0Vycl9JbnZhbGlkOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIEZBSUxVUkU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbnZlcnRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbnZlcnRzIGEgZ2x5cGggaW50byBhIHNlcmllcyBvZiBzZWdtZW50cyBhbmQgYXJjcyBhbmQgbWFrZXMgYSAgICAqLwotICAvKiAgICBwcm9maWxlcyBsaXN0IHdpdGggdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGlwcGVkIDo6IElmIHNldCwgZmxpcCB0aGUgZGlyZWN0aW9uIG9mIGN1cnZlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgaWYgYW55IGVycm9yIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcgICAgKi8KLSAgLyogICAgcmVuZGVyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBDb252ZXJ0X0dseXBoKCBSQVNfQVJHUyBpbnQgIGZsaXBwZWQgKQotICB7Ci0gICAgaW50ICAgICAgIGk7Ci0gICAgdW5zaWduZWQgIHN0YXJ0OwotCi0gICAgUFByb2ZpbGUgIGxhc3RQcm9maWxlOwotCi0KLSAgICByYXMuZlByb2ZpbGUgPSBOVUxMOwotICAgIHJhcy5qb2ludCAgICA9IEZBTFNFOwotICAgIHJhcy5mcmVzaCAgICA9IEZBTFNFOwotCi0gICAgcmFzLm1heEJ1ZmYgID0gcmFzLnNpemVCdWZmIC0gQWxpZ25Qcm9maWxlU2l6ZTsKLQotICAgIHJhcy5udW1UdXJucyA9IDA7Ci0KLSAgICByYXMuY1Byb2ZpbGUgICAgICAgICA9IChQUHJvZmlsZSlyYXMudG9wOwotICAgIHJhcy5jUHJvZmlsZS0+b2Zmc2V0ID0gcmFzLnRvcDsKLSAgICByYXMubnVtX1Byb2ZzICAgICAgICA9IDA7Ci0KLSAgICBzdGFydCA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHJhcy5vdXRsaW5lLm5fY29udG91cnM7IGkrKyApCi0gICAgewotICAgICAgcmFzLnN0YXRlICAgID0gVW5rbm93bl9TdGF0ZTsKLSAgICAgIHJhcy5nUHJvZmlsZSA9IE5VTEw7Ci0KLSAgICAgIGlmICggRGVjb21wb3NlX0N1cnZlKCBSQVNfVkFSUyAodW5zaWduZWQgc2hvcnQpc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzLm91dGxpbmUuY29udG91cnNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlZCApICkKLSAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0KLSAgICAgIHN0YXJ0ID0gcmFzLm91dGxpbmUuY29udG91cnNbaV0gKyAxOwotCi0gICAgICAvKiBXZSBtdXN0IG5vdyBzZWUgd2hldGhlciB0aGUgZXh0cmVtZSBhcmNzIGpvaW4gb3Igbm90ICovCi0gICAgICBpZiAoIEZSQUMoIHJhcy5sYXN0WSApID09IDAgJiYKLSAgICAgICAgICAgcmFzLmxhc3RZID49IHJhcy5taW5ZICAmJgotICAgICAgICAgICByYXMubGFzdFkgPD0gcmFzLm1heFkgICkKLSAgICAgICAgaWYgKCByYXMuZ1Byb2ZpbGUgJiYgcmFzLmdQcm9maWxlLT5mbG93ID09IHJhcy5jUHJvZmlsZS0+ZmxvdyApCi0gICAgICAgICAgcmFzLnRvcC0tOwotICAgICAgICAvKiBOb3RlIHRoYXQgcmFzLmdQcm9maWxlIGNhbiBiZSBuaWwgaWYgdGhlIGNvbnRvdXIgd2FzIHRvbyBzbWFsbCAqLwotICAgICAgICAvKiB0byBiZSBkcmF3bi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBsYXN0UHJvZmlsZSA9IHJhcy5jUHJvZmlsZTsKLSAgICAgIGlmICggRW5kX1Byb2ZpbGUoIFJBU19WQVIgKSApCi0gICAgICAgIHJldHVybiBGQUlMVVJFOwotCi0gICAgICAvKiBjbG9zZSB0aGUgYG5leHQgcHJvZmlsZSBpbiBjb250b3VyJyBsaW5rZWQgbGlzdCAqLwotICAgICAgaWYgKCByYXMuZ1Byb2ZpbGUgKQotICAgICAgICBsYXN0UHJvZmlsZS0+bmV4dCA9IHJhcy5nUHJvZmlsZTsKLSAgICB9Ci0KLSAgICBpZiAoIEZpbmFsaXplX1Byb2ZpbGVfVGFibGUoIFJBU19WQVIgKSApCi0gICAgICByZXR1cm4gRkFJTFVSRTsKLQotICAgIHJldHVybiAoQm9vbCkoIHJhcy50b3AgPCByYXMubWF4QnVmZiA/IFNVQ0NFU1MgOiBGQUlMVVJFICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgU0NBTi1MSU5FIFNXRUVQUyBBTkQgRFJBV0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgSW5pdF9MaW5rZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGFuIGVtcHR5IGxpbmtlZCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5pdF9MaW5rZWQoIFRQcm9maWxlTGlzdCogIGwgKQotICB7Ci0gICAgKmwgPSBOVUxMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBJbnNOZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zZXJ0cyBhIG5ldyBwcm9maWxlIGluIGEgbGlua2VkIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNOZXcoIFBQcm9maWxlTGlzdCAgbGlzdCwKLSAgICAgICAgICBQUHJvZmlsZSAgICAgIHByb2ZpbGUgKQotICB7Ci0gICAgUFByb2ZpbGUgICpvbGQsIGN1cnJlbnQ7Ci0gICAgTG9uZyAgICAgICB4OwotCi0KLSAgICBvbGQgICAgID0gbGlzdDsKLSAgICBjdXJyZW50ID0gKm9sZDsKLSAgICB4ICAgICAgID0gcHJvZmlsZS0+WDsKLQotICAgIHdoaWxlICggY3VycmVudCApCi0gICAgewotICAgICAgaWYgKCB4IDwgY3VycmVudC0+WCApCi0gICAgICAgIGJyZWFrOwotICAgICAgb2xkICAgICA9ICZjdXJyZW50LT5saW5rOwotICAgICAgY3VycmVudCA9ICpvbGQ7Ci0gICAgfQotCi0gICAgcHJvZmlsZS0+bGluayA9IGN1cnJlbnQ7Ci0gICAgKm9sZCAgICAgICAgICA9IHByb2ZpbGU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIERlbE9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW1vdmVzIGFuIG9sZCBwcm9maWxlIGZyb20gYSBsaW5rZWQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIERlbE9sZCggUFByb2ZpbGVMaXN0ICBsaXN0LAotICAgICAgICAgIFBQcm9maWxlICAgICAgcHJvZmlsZSApCi0gIHsKLSAgICBQUHJvZmlsZSAgKm9sZCwgY3VycmVudDsKLQotCi0gICAgb2xkICAgICA9IGxpc3Q7Ci0gICAgY3VycmVudCA9ICpvbGQ7Ci0KLSAgICB3aGlsZSAoIGN1cnJlbnQgKQotICAgIHsKLSAgICAgIGlmICggY3VycmVudCA9PSBwcm9maWxlICkKLSAgICAgIHsKLSAgICAgICAgKm9sZCA9IGN1cnJlbnQtPmxpbms7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgb2xkICAgICA9ICZjdXJyZW50LT5saW5rOwotICAgICAgY3VycmVudCA9ICpvbGQ7Ci0gICAgfQotCi0gICAgLyogd2Ugc2hvdWxkIG5ldmVyIGdldCB0aGVyZSwgdW5sZXNzIHRoZSBwcm9maWxlIHdhcyBub3QgcGFydCBvZiAqLwotICAgIC8qIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgU29ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNvcnRzIGEgdHJhY2UgbGlzdC4gIEluIDk1JSwgdGhlIGxpc3QgaXMgYWxyZWFkeSBzb3J0ZWQuICBXZSBuZWVkICAqLwotICAvKiAgICBhbiBhbGdvcml0aG0gd2hpY2ggaXMgZmFzdCBpbiB0aGlzIGNhc2UuICBCdWJibGUgc29ydCBpcyBlbm91Z2ggICAgKi8KLSAgLyogICAgYW5kIHNpbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBTb3J0KCBQUHJvZmlsZUxpc3QgIGxpc3QgKQotICB7Ci0gICAgUFByb2ZpbGUgICpvbGQsIGN1cnJlbnQsIG5leHQ7Ci0KLQotICAgIC8qIEZpcnN0LCBzZXQgdGhlIG5ldyBYIGNvb3JkaW5hdGUgb2YgZWFjaCBwcm9maWxlICovCi0gICAgY3VycmVudCA9ICpsaXN0OwotICAgIHdoaWxlICggY3VycmVudCApCi0gICAgewotICAgICAgY3VycmVudC0+WCAgICAgICA9ICpjdXJyZW50LT5vZmZzZXQ7Ci0gICAgICBjdXJyZW50LT5vZmZzZXQgKz0gY3VycmVudC0+ZmxvdzsKLSAgICAgIGN1cnJlbnQtPmhlaWdodC0tOwotICAgICAgY3VycmVudCA9IGN1cnJlbnQtPmxpbms7Ci0gICAgfQotCi0gICAgLyogVGhlbiBzb3J0IHRoZW0gKi8KLSAgICBvbGQgICAgID0gbGlzdDsKLSAgICBjdXJyZW50ID0gKm9sZDsKLQotICAgIGlmICggIWN1cnJlbnQgKQotICAgICAgcmV0dXJuOwotCi0gICAgbmV4dCA9IGN1cnJlbnQtPmxpbms7Ci0KLSAgICB3aGlsZSAoIG5leHQgKQotICAgIHsKLSAgICAgIGlmICggY3VycmVudC0+WCA8PSBuZXh0LT5YICkKLSAgICAgIHsKLSAgICAgICAgb2xkICAgICA9ICZjdXJyZW50LT5saW5rOwotICAgICAgICBjdXJyZW50ID0gKm9sZDsKLQotICAgICAgICBpZiAoICFjdXJyZW50ICkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICpvbGQgICAgICAgICAgPSBuZXh0OwotICAgICAgICBjdXJyZW50LT5saW5rID0gbmV4dC0+bGluazsKLSAgICAgICAgbmV4dC0+bGluayAgICA9IGN1cnJlbnQ7Ci0KLSAgICAgICAgb2xkICAgICA9IGxpc3Q7Ci0gICAgICAgIGN1cnJlbnQgPSAqb2xkOwotICAgICAgfQotCi0gICAgICBuZXh0ID0gY3VycmVudC0+bGluazsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFZlcnRpY2FsIFN3ZWVwIFByb2NlZHVyZSBTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgZm91ciByb3V0aW5lcyBhcmUgdXNlZCBkdXJpbmcgdGhlIHZlcnRpY2FsIGJsYWNrL3doaXRlIHN3ZWVwICAgKi8KLSAgLyogIHBoYXNlIGJ5IHRoZSBnZW5lcmljIERyYXdfU3dlZXAoKSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBWZXJ0aWNhbF9Td2VlcF9Jbml0KCBSQVNfQVJHUyBTaG9ydCogIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvcnQqICBtYXggKQotICB7Ci0gICAgTG9uZyAgcGl0Y2ggPSByYXMudGFyZ2V0LnBpdGNoOwotCi0gICAgRlRfVU5VU0VEKCBtYXggKTsKLQotCi0gICAgcmFzLnRyYWNlSW5jciA9IChTaG9ydCktcGl0Y2g7Ci0gICAgcmFzLnRyYWNlT2ZzICA9IC0qbWluICogcGl0Y2g7Ci0gICAgaWYgKCBwaXRjaCA+IDAgKQotICAgICAgcmFzLnRyYWNlT2ZzICs9ICggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcGl0Y2g7Ci0KLSAgICByYXMuZ3JheV9taW5feCA9IDA7Ci0gICAgcmFzLmdyYXlfbWF4X3ggPSAwOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBWZXJ0aWNhbF9Td2VlcF9TcGFuKCBSQVNfQVJHUyBTaG9ydCAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIHJpZ2h0ICkKLSAgewotICAgIExvbmcgICBlMSwgZTI7Ci0gICAgaW50ICAgIGMxLCBjMjsKLSAgICBCeXRlICAgZjEsIGYyOwotICAgIEJ5dGUqICB0YXJnZXQ7Ci0KLSAgICBGVF9VTlVTRUQoIHkgKTsKLSAgICBGVF9VTlVTRUQoIGxlZnQgKTsKLSAgICBGVF9VTlVTRUQoIHJpZ2h0ICk7Ci0KLQotICAgIC8qIERyb3Atb3V0IGNvbnRyb2wgKi8KLQotICAgIGUxID0gVFJVTkMoIENFSUxJTkcoIHgxICkgKTsKLQotICAgIGlmICggeDIgLSB4MSAtIHJhcy5wcmVjaXNpb24gPD0gcmFzLnByZWNpc2lvbl9qaXR0ZXIgKQotICAgICAgZTIgPSBlMTsKLSAgICBlbHNlCi0gICAgICBlMiA9IFRSVU5DKCBGTE9PUiggeDIgKSApOwotCi0gICAgaWYgKCBlMiA+PSAwICYmIGUxIDwgcmFzLmJXaWR0aCApCi0gICAgewotICAgICAgaWYgKCBlMSA8IDAgKQotICAgICAgICBlMSA9IDA7Ci0gICAgICBpZiAoIGUyID49IHJhcy5iV2lkdGggKQotICAgICAgICBlMiA9IHJhcy5iV2lkdGggLSAxOwotCi0gICAgICBjMSA9IChTaG9ydCkoIGUxID4+IDMgKTsKLSAgICAgIGMyID0gKFNob3J0KSggZTIgPj4gMyApOwotCi0gICAgICBmMSA9IChCeXRlKSAgKCAweEZGID4+ICggZTEgJiA3ICkgKTsKLSAgICAgIGYyID0gKEJ5dGUpIH4oIDB4N0YgPj4gKCBlMiAmIDcgKSApOwotCi0gICAgICBpZiAoIHJhcy5ncmF5X21pbl94ID4gYzEgKSByYXMuZ3JheV9taW5feCA9IChzaG9ydCljMTsKLSAgICAgIGlmICggcmFzLmdyYXlfbWF4X3ggPCBjMiApIHJhcy5ncmF5X21heF94ID0gKHNob3J0KWMyOwotCi0gICAgICB0YXJnZXQgPSByYXMuYlRhcmdldCArIHJhcy50cmFjZU9mcyArIGMxOwotICAgICAgYzIgLT0gYzE7Ci0KLSAgICAgIGlmICggYzIgPiAwICkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0WzBdIHw9IGYxOwotCi0gICAgICAgIC8qIG1lbXNldCgpIGlzIHNsb3dlciB0aGFuIHRoZSBmb2xsb3dpbmcgY29kZSBvbiBtYW55IHBsYXRmb3Jtcy4gKi8KLSAgICAgICAgLyogVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCwgaW4gdGhlIHZhc3QgbWFqb3JpdHkgb2YgY2FzZXMsICAqLwotICAgICAgICAvKiB0aGUgc3BhbiBsZW5ndGggaW4gYnl0ZXMgaXMgcmVsYXRpdmVseSBzbWFsbC4gICAgICAgICAgICAgICAgICovCi0gICAgICAgIGMyLS07Ci0gICAgICAgIHdoaWxlICggYzIgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICooKyt0YXJnZXQpID0gMHhGRjsKLSAgICAgICAgICBjMi0tOwotICAgICAgICB9Ci0gICAgICAgIHRhcmdldFsxXSB8PSBmMjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgKnRhcmdldCB8PSAoIGYxICYgZjIgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIFZlcnRpY2FsX1N3ZWVwX0Ryb3AoIFJBU19BUkdTIFNob3J0ICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgcmlnaHQgKQotICB7Ci0gICAgTG9uZyAgIGUxLCBlMjsKLSAgICBTaG9ydCAgYzEsIGYxOwotCi0KLSAgICAvKiBEcm9wLW91dCBjb250cm9sICovCi0KLSAgICBlMSA9IENFSUxJTkcoIHgxICk7Ci0gICAgZTIgPSBGTE9PUiAgKCB4MiApOwotCi0gICAgaWYgKCBlMSA+IGUyICkKLSAgICB7Ci0gICAgICBpZiAoIGUxID09IGUyICsgcmFzLnByZWNpc2lvbiApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIHJhcy5kcm9wT3V0Q29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIGUxID0gZTI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIGUxID0gQ0VJTElORyggKHgxICsgeDIgKyAxKSAvIDIgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAvKiBEcm9wLW91dCBDb250cm9sIFJ1bGUgIzQgKi8KLQotICAgICAgICAgIC8qIFRoZSBzcGVjIGlzIG5vdCB2ZXJ5IGNsZWFyIHJlZ2FyZGluZyBydWxlICM0LiAgSXQgICAgICAqLwotICAgICAgICAgIC8qIHByZXNlbnRzIGEgbWV0aG9kIHRoYXQgaXMgd2F5IHRvbyBjb3N0bHkgdG8gaW1wbGVtZW50ICAqLwotICAgICAgICAgIC8qIHdoaWxlIHRoZSBnZW5lcmFsIGlkZWEgc2VlbXMgdG8gZ2V0IHJpZCBvZiBgc3R1YnMnLiAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIEhlcmUsIHdlIG9ubHkgZ2V0IHJpZCBvZiBzdHVicyByZWNvZ25pemVkIGlmOiAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICB1cHBlciBzdHViOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgLSBQX0xlZnQgYW5kIFBfUmlnaHQgYXJlIGluIHRoZSBzYW1lIGNvbnRvdXIgICAgICAgICAqLwotICAgICAgICAgIC8qICAgLSBQX1JpZ2h0IGlzIHRoZSBzdWNjZXNzb3Igb2YgUF9MZWZ0IGluIHRoYXQgY29udG91ciAqLwotICAgICAgICAgIC8qICAgLSB5IGlzIHRoZSB0b3Agb2YgUF9MZWZ0IGFuZCBQX1JpZ2h0ICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICBsb3dlciBzdHViOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgLSBQX0xlZnQgYW5kIFBfUmlnaHQgYXJlIGluIHRoZSBzYW1lIGNvbnRvdXIgICAgICAgICAqLwotICAgICAgICAgIC8qICAgLSBQX0xlZnQgaXMgdGhlIHN1Y2Nlc3NvciBvZiBQX1JpZ2h0IGluIHRoYXQgY29udG91ciAqLwotICAgICAgICAgIC8qICAgLSB5IGlzIHRoZSBib3R0b20gb2YgUF9MZWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgLyogRklYWFhNRTogdW5jb21tZW50aW5nIHRoaXMgbGluZSBzb2x2ZXMgdGhlIGRpc2FwcGVhcmluZyAqLwotICAgICAgICAgIC8qICAgICAgICAgIGJpdCBwcm9ibGVtIGluIHRoZSBgNycgb2YgdmVyZGFuYSAxMHB0cywgYnV0ICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICBtYWtlcyBhIG5ldyBvbmUgaW4gdGhlIGBDJyBvZiBhcmlhbCAxNHB0cyAgICAgICovCi0KLSNpZiAwCi0gICAgICAgICAgaWYgKCB4MiAtIHgxIDwgcmFzLnByZWNpc2lvbl9oYWxmICkKLSNlbmRpZgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHVwcGVyIHN0dWIgdGVzdCAqLwotICAgICAgICAgICAgaWYgKCBsZWZ0LT5uZXh0ID09IHJpZ2h0ICYmIGxlZnQtPmhlaWdodCA8PSAwICkKLSAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAvKiBsb3dlciBzdHViIHRlc3QgKi8KLSAgICAgICAgICAgIGlmICggcmlnaHQtPm5leHQgPT0gbGVmdCAmJiBsZWZ0LT5zdGFydCA9PSB5ICkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIHJpZ2h0bW9zdCBwaXhlbCBpc24ndCBzZXQgKi8KLQotICAgICAgICAgIGUxID0gVFJVTkMoIGUxICk7Ci0KLSAgICAgICAgICBjMSA9IChTaG9ydCkoIGUxID4+IDMgKTsKLSAgICAgICAgICBmMSA9IChTaG9ydCkoIGUxICYgIDcgKTsKLQotICAgICAgICAgIGlmICggZTEgPj0gMCAmJiBlMSA8IHJhcy5iV2lkdGggICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIHJhcy5iVGFyZ2V0W3Jhcy50cmFjZU9mcyArIGMxXSAmICggMHg4MCA+PiBmMSApICkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgIGlmICggcmFzLmRyb3BPdXRDb250cm9sID09IDIgKQotICAgICAgICAgICAgZTEgPSBlMjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBlMSA9IENFSUxJTkcoICggeDEgKyB4MiArIDEgKSAvIDIgKTsKLQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuOyAgLyogdW5zdXBwb3J0ZWQgbW9kZSAqLwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBlMSA9IFRSVU5DKCBlMSApOwotCi0gICAgaWYgKCBlMSA+PSAwICYmIGUxIDwgcmFzLmJXaWR0aCApCi0gICAgewotICAgICAgYzEgPSAoU2hvcnQpKCBlMSA+PiAzICk7Ci0gICAgICBmMSA9IChTaG9ydCkoIGUxICYgNyApOwotCi0gICAgICBpZiAoIHJhcy5ncmF5X21pbl94ID4gYzEgKSByYXMuZ3JheV9taW5feCA9IGMxOwotICAgICAgaWYgKCByYXMuZ3JheV9tYXhfeCA8IGMxICkgcmFzLmdyYXlfbWF4X3ggPSBjMTsKLQotICAgICAgcmFzLmJUYXJnZXRbcmFzLnRyYWNlT2ZzICsgYzFdIHw9IChjaGFyKSggMHg4MCA+PiBmMSApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgVmVydGljYWxfU3dlZXBfU3RlcCggUkFTX0FSRyApCi0gIHsKLSAgICByYXMudHJhY2VPZnMgKz0gcmFzLnRyYWNlSW5jcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBIb3Jpem9udGFsIFN3ZWVwIFByb2NlZHVyZSBTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgZm91ciByb3V0aW5lcyBhcmUgdXNlZCBkdXJpbmcgdGhlIGhvcml6b250YWwgYmxhY2svd2hpdGUgICAgICovCi0gIC8qICBzd2VlcCBwaGFzZSBieSB0aGUgZ2VuZXJpYyBEcmF3X1N3ZWVwKCkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgSG9yaXpvbnRhbF9Td2VlcF9Jbml0KCBSQVNfQVJHUyBTaG9ydCogIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydCogIG1heCApCi0gIHsKLSAgICAvKiBub3RoaW5nLCByZWFsbHkgKi8KLSAgICBGVF9VTlVTRURfUkFTVEVSOwotICAgIEZUX1VOVVNFRCggbWluICk7Ci0gICAgRlRfVU5VU0VEKCBtYXggKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgSG9yaXpvbnRhbF9Td2VlcF9TcGFuKCBSQVNfQVJHUyBTaG9ydCAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgcmlnaHQgKQotICB7Ci0gICAgTG9uZyAgIGUxLCBlMjsKLSAgICBQQnl0ZSAgYml0czsKLSAgICBCeXRlICAgZjE7Ci0KLSAgICBGVF9VTlVTRUQoIGxlZnQgKTsKLSAgICBGVF9VTlVTRUQoIHJpZ2h0ICk7Ci0KLQotICAgIGlmICggeDIgLSB4MSA8IHJhcy5wcmVjaXNpb24gKQotICAgIHsKLSAgICAgIGUxID0gQ0VJTElORyggeDEgKTsKLSAgICAgIGUyID0gRkxPT1IgICggeDIgKTsKLQotICAgICAgaWYgKCBlMSA9PSBlMiApCi0gICAgICB7Ci0gICAgICAgIGJpdHMgPSByYXMuYlRhcmdldCArICggeSA+PiAzICk7Ci0gICAgICAgIGYxICAgPSAoQnl0ZSkoIDB4ODAgPj4gKCB5ICYgNyApICk7Ci0KLSAgICAgICAgZTEgPSBUUlVOQyggZTEgKTsKLQotICAgICAgICBpZiAoIGUxID49IDAgJiYgZTEgPCByYXMudGFyZ2V0LnJvd3MgKQotICAgICAgICB7Ci0gICAgICAgICAgUEJ5dGUgIHA7Ci0KLQotICAgICAgICAgIHAgPSBiaXRzIC0gZTEqcmFzLnRhcmdldC5waXRjaDsKLSAgICAgICAgICBpZiAoIHJhcy50YXJnZXQucGl0Y2ggPiAwICkKLSAgICAgICAgICAgIHAgKz0gKCByYXMudGFyZ2V0LnJvd3MgLSAxICkgKiByYXMudGFyZ2V0LnBpdGNoOwotCi0gICAgICAgICAgcFswXSB8PSBmMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgSG9yaXpvbnRhbF9Td2VlcF9Ecm9wKCBSQVNfQVJHUyBTaG9ydCAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgcmlnaHQgKQotICB7Ci0gICAgTG9uZyAgIGUxLCBlMjsKLSAgICBQQnl0ZSAgYml0czsKLSAgICBCeXRlICAgZjE7Ci0KLQotICAgIC8qIER1cmluZyB0aGUgaG9yaXpvbnRhbCBzd2VlcCwgd2Ugb25seSB0YWtlIGNhcmUgb2YgZHJvcC1vdXRzICovCi0KLSAgICBlMSA9IENFSUxJTkcoIHgxICk7Ci0gICAgZTIgPSBGTE9PUiAgKCB4MiApOwotCi0gICAgaWYgKCBlMSA+IGUyICkKLSAgICB7Ci0gICAgICBpZiAoIGUxID09IGUyICsgcmFzLnByZWNpc2lvbiApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIHJhcy5kcm9wT3V0Q29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIGUxID0gZTI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIGUxID0gQ0VJTElORyggKCB4MSArIHgyICsgMSApIC8gMiApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgY2FzZSA1OgotCi0gICAgICAgICAgLyogRHJvcC1vdXQgQ29udHJvbCBSdWxlICM0ICovCi0KLSAgICAgICAgICAvKiBUaGUgc3BlYyBpcyBub3QgdmVyeSBjbGVhciByZWdhcmRpbmcgcnVsZSAjNC4gIEl0ICAgICAgKi8KLSAgICAgICAgICAvKiBwcmVzZW50cyBhIG1ldGhvZCB0aGF0IGlzIHdheSB0b28gY29zdGx5IHRvIGltcGxlbWVudCAgKi8KLSAgICAgICAgICAvKiB3aGlsZSB0aGUgZ2VuZXJhbCBpZGVhIHNlZW1zIHRvIGdldCByaWQgb2YgYHN0dWJzJy4gICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIC8qIHJpZ2h0bW9zdCBzdHViIHRlc3QgKi8KLSAgICAgICAgICBpZiAoIGxlZnQtPm5leHQgPT0gcmlnaHQgJiYgbGVmdC0+aGVpZ2h0IDw9IDAgKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgLyogbGVmdG1vc3Qgc3R1YiB0ZXN0ICovCi0gICAgICAgICAgaWYgKCByaWdodC0+bmV4dCA9PSBsZWZ0ICYmIGxlZnQtPnN0YXJ0ID09IHkgKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgcmlnaHRtb3N0IHBpeGVsIGlzbid0IHNldCAqLwotCi0gICAgICAgICAgZTEgPSBUUlVOQyggZTEgKTsKLQotICAgICAgICAgIGJpdHMgPSByYXMuYlRhcmdldCArICggeSA+PiAzICk7Ci0gICAgICAgICAgZjEgICA9IChCeXRlKSggMHg4MCA+PiAoIHkgJiA3ICkgKTsKLQotICAgICAgICAgIGJpdHMgLT0gZTEgKiByYXMudGFyZ2V0LnBpdGNoOwotICAgICAgICAgIGlmICggcmFzLnRhcmdldC5waXRjaCA+IDAgKQotICAgICAgICAgICAgYml0cyArPSAoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICAgICAgICBpZiAoIGUxID49IDAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBlMSA8IHJhcy50YXJnZXQucm93cyAmJgotICAgICAgICAgICAgICAgKmJpdHMgJiBmMSApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICBpZiAoIHJhcy5kcm9wT3V0Q29udHJvbCA9PSAyICkKLSAgICAgICAgICAgIGUxID0gZTI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZTEgPSBDRUlMSU5HKCAoIHgxICsgeDIgKyAxICkgLyAyICk7Ci0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybjsgIC8qIHVuc3VwcG9ydGVkIG1vZGUgKi8KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYml0cyA9IHJhcy5iVGFyZ2V0ICsgKCB5ID4+IDMgKTsKLSAgICBmMSAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOwotCi0gICAgZTEgPSBUUlVOQyggZTEgKTsKLQotICAgIGlmICggZTEgPj0gMCAmJiBlMSA8IHJhcy50YXJnZXQucm93cyApCi0gICAgewotICAgICAgYml0cyAtPSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0gICAgICBpZiAoIHJhcy50YXJnZXQucGl0Y2ggPiAwICkKLSAgICAgICAgYml0cyArPSAoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICAgIGJpdHNbMF0gfD0gZjE7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBIb3Jpem9udGFsX1N3ZWVwX1N0ZXAoIFJBU19BUkcgKQotICB7Ci0gICAgLyogTm90aGluZywgcmVhbGx5ICovCi0gICAgRlRfVU5VU0VEX1JBU1RFUjsKLSAgfQotCi0KLSNpZmRlZiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVNJTkcKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFZlcnRpY2FsIEdyYXkgU3dlZXAgUHJvY2VkdXJlIFNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgdHdvIHJvdXRpbmVzIGFyZSB1c2VkIGR1cmluZyB0aGUgdmVydGljYWwgZ3JheS1sZXZlbHMgc3dlZXAgICAgKi8KLSAgLyogIHBoYXNlIGJ5IHRoZSBnZW5lcmljIERyYXdfU3dlZXAoKSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFRoZSB0YXJnZXQgcGl4bWFwJ3Mgd2lkdGggKm11c3QqIGJlIGEgbXVsdGlwbGUgb2YgNC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gWW91IGhhdmUgdG8gdXNlIHRoZSBmdW5jdGlvbiBWZXJ0aWNhbF9Td2VlcF9TcGFuKCkgZm9yIHRoZSBncmF5ICAgICovCi0gIC8qICAgIHNwYW4gY2FsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgVmVydGljYWxfR3JheV9Td2VlcF9Jbml0KCBSQVNfQVJHUyBTaG9ydCogIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydCogIG1heCApCi0gIHsKLSAgICBMb25nICBwaXRjaCwgYnl0ZV9sZW47Ci0KLQotICAgICptaW4gPSAqbWluICYgLTI7Ci0gICAgKm1heCA9ICggKm1heCArIDMgKSAmIC0yOwotCi0gICAgcmFzLnRyYWNlT2ZzICA9IDA7Ci0gICAgcGl0Y2ggICAgICAgICA9IHJhcy50YXJnZXQucGl0Y2g7Ci0gICAgYnl0ZV9sZW4gICAgICA9IC1waXRjaDsKLSAgICByYXMudHJhY2VJbmNyID0gKFNob3J0KWJ5dGVfbGVuOwotICAgIHJhcy50cmFjZUcgICAgPSAoICptaW4gLyAyICkgKiBieXRlX2xlbjsKLQotICAgIGlmICggcGl0Y2ggPiAwICkKLSAgICB7Ci0gICAgICByYXMudHJhY2VHICs9ICggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcGl0Y2g7Ci0gICAgICBieXRlX2xlbiAgICA9IC1ieXRlX2xlbjsKLSAgICB9Ci0KLSAgICByYXMuZ3JheV9taW5feCA9ICAoU2hvcnQpYnl0ZV9sZW47Ci0gICAgcmFzLmdyYXlfbWF4X3ggPSAtKFNob3J0KWJ5dGVfbGVuOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBWZXJ0aWNhbF9HcmF5X1N3ZWVwX1N0ZXAoIFJBU19BUkcgKQotICB7Ci0gICAgSW50ICAgIGMxLCBjMjsKLSAgICBQQnl0ZSAgcGl4LCBiaXQsIGJpdDI7Ci0gICAgY2hhciogIGNvdW50ID0gKGNoYXIqKWNvdW50X3RhYmxlOwotICAgIEJ5dGUqICBncmF5czsKLQotCi0gICAgcmFzLnRyYWNlT2ZzICs9IHJhcy5ncmF5X3dpZHRoOwotCi0gICAgaWYgKCByYXMudHJhY2VPZnMgPiByYXMuZ3JheV93aWR0aCApCi0gICAgewotICAgICAgcGl4ICAgPSByYXMuZ1RhcmdldCArIHJhcy50cmFjZUcgKyByYXMuZ3JheV9taW5feCAqIDQ7Ci0gICAgICBncmF5cyA9IHJhcy5ncmF5czsKLQotICAgICAgaWYgKCByYXMuZ3JheV9tYXhfeCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgTG9uZyAgIGxhc3RfcGl4ZWwgPSByYXMudGFyZ2V0LndpZHRoIC0gMTsKLSAgICAgICAgSW50ICAgIGxhc3RfY2VsbCAgPSBsYXN0X3BpeGVsID4+IDI7Ci0gICAgICAgIEludCAgICBsYXN0X2JpdCAgID0gbGFzdF9waXhlbCAmIDM7Ci0gICAgICAgIEJvb2wgICBvdmVyICAgICAgID0gMDsKLQotCi0gICAgICAgIGlmICggcmFzLmdyYXlfbWF4X3ggPj0gbGFzdF9jZWxsICYmIGxhc3RfYml0ICE9IDMgKQotICAgICAgICB7Ci0gICAgICAgICAgcmFzLmdyYXlfbWF4X3ggPSBsYXN0X2NlbGwgLSAxOwotICAgICAgICAgIG92ZXIgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCByYXMuZ3JheV9taW5feCA8IDAgKQotICAgICAgICAgIHJhcy5ncmF5X21pbl94ID0gMDsKLQotICAgICAgICBiaXQgICA9IHJhcy5iVGFyZ2V0ICsgcmFzLmdyYXlfbWluX3g7Ci0gICAgICAgIGJpdDIgID0gYml0ICsgcmFzLmdyYXlfd2lkdGg7Ci0KLSAgICAgICAgYzEgPSByYXMuZ3JheV9tYXhfeCAtIHJhcy5ncmF5X21pbl94OwotCi0gICAgICAgIHdoaWxlICggYzEgPj0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBjMiA9IGNvdW50WypiaXRdICsgY291bnRbKmJpdDJdOwotCi0gICAgICAgICAgaWYgKCBjMiApCi0gICAgICAgICAgewotICAgICAgICAgICAgcGl4WzBdID0gZ3JheXNbKGMyID4+IDEyKSAmIDB4MDAwRl07Ci0gICAgICAgICAgICBwaXhbMV0gPSBncmF5c1soYzIgPj4gOCApICYgMHgwMDBGXTsKLSAgICAgICAgICAgIHBpeFsyXSA9IGdyYXlzWyhjMiA+PiA0ICkgJiAweDAwMEZdOwotICAgICAgICAgICAgcGl4WzNdID0gZ3JheXNbIGMyICAgICAgICAmIDB4MDAwRl07Ci0KLSAgICAgICAgICAgICpiaXQgID0gMDsKLSAgICAgICAgICAgICpiaXQyID0gMDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBiaXQrKzsKLSAgICAgICAgICBiaXQyKys7Ci0gICAgICAgICAgcGl4ICs9IDQ7Ci0gICAgICAgICAgYzEtLTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggb3ZlciApCi0gICAgICAgIHsKLSAgICAgICAgICBjMiA9IGNvdW50WypiaXRdICsgY291bnRbKmJpdDJdOwotICAgICAgICAgIGlmICggYzIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoIGxhc3RfYml0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgcGl4WzJdID0gZ3JheXNbKGMyID4+IDQgKSAmIDB4MDAwRl07Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHBpeFsxXSA9IGdyYXlzWyhjMiA+PiA4ICkgJiAweDAwMEZdOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgcGl4WzBdID0gZ3JheXNbKGMyID4+IDEyKSAmIDB4MDAwRl07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpiaXQgID0gMDsKLSAgICAgICAgICAgICpiaXQyID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmFzLnRyYWNlT2ZzID0gMDsKLSAgICAgIHJhcy50cmFjZUcgICs9IHJhcy50cmFjZUluY3I7Ci0KLSAgICAgIHJhcy5ncmF5X21pbl94ID0gIDMyMDAwOwotICAgICAgcmFzLmdyYXlfbWF4X3ggPSAtMzIwMDA7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBIb3Jpem9udGFsX0dyYXlfU3dlZXBfU3BhbiggUkFTX0FSR1MgU2hvcnQgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgcmlnaHQgKQotICB7Ci0gICAgLyogbm90aGluZywgcmVhbGx5ICovCi0gICAgRlRfVU5VU0VEX1JBU1RFUjsKLSAgICBGVF9VTlVTRUQoIHkgKTsKLSAgICBGVF9VTlVTRUQoIHgxICk7Ci0gICAgRlRfVU5VU0VEKCB4MiApOwotICAgIEZUX1VOVVNFRCggbGVmdCApOwotICAgIEZUX1VOVVNFRCggcmlnaHQgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX0Ryb3AoIFJBU19BUkdTIFNob3J0ICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIHJpZ2h0ICkKLSAgewotICAgIExvbmcgICBlMSwgZTI7Ci0gICAgUEJ5dGUgIHBpeGVsOwotICAgIEJ5dGUgICBjb2xvcjsKLQotCi0gICAgLyogRHVyaW5nIHRoZSBob3Jpem9udGFsIHN3ZWVwLCB3ZSBvbmx5IHRha2UgY2FyZSBvZiBkcm9wLW91dHMgKi8KLSAgICBlMSA9IENFSUxJTkcoIHgxICk7Ci0gICAgZTIgPSBGTE9PUiAgKCB4MiApOwotCi0gICAgaWYgKCBlMSA+IGUyICkKLSAgICB7Ci0gICAgICBpZiAoIGUxID09IGUyICsgcmFzLnByZWNpc2lvbiApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIHJhcy5kcm9wT3V0Q29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIGUxID0gZTI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIGUxID0gQ0VJTElORyggKCB4MSArIHgyICsgMSApIC8gMiApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgY2FzZSA1OgotCi0gICAgICAgICAgLyogRHJvcC1vdXQgQ29udHJvbCBSdWxlICM0ICovCi0KLSAgICAgICAgICAvKiBUaGUgc3BlYyBpcyBub3QgdmVyeSBjbGVhciByZWdhcmRpbmcgcnVsZSAjNC4gIEl0ICAgICAgKi8KLSAgICAgICAgICAvKiBwcmVzZW50cyBhIG1ldGhvZCB0aGF0IGlzIHdheSB0b28gY29zdGx5IHRvIGltcGxlbWVudCAgKi8KLSAgICAgICAgICAvKiB3aGlsZSB0aGUgZ2VuZXJhbCBpZGVhIHNlZW1zIHRvIGdldCByaWQgb2YgYHN0dWJzJy4gICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIC8qIHJpZ2h0bW9zdCBzdHViIHRlc3QgKi8KLSAgICAgICAgICBpZiAoIGxlZnQtPm5leHQgPT0gcmlnaHQgJiYgbGVmdC0+aGVpZ2h0IDw9IDAgKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgLyogbGVmdG1vc3Qgc3R1YiB0ZXN0ICovCi0gICAgICAgICAgaWYgKCByaWdodC0+bmV4dCA9PSBsZWZ0ICYmIGxlZnQtPnN0YXJ0ID09IHkgKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgaWYgKCByYXMuZHJvcE91dENvbnRyb2wgPT0gMiApCi0gICAgICAgICAgICBlMSA9IGUyOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGUxID0gQ0VJTElORyggKCB4MSArIHgyICsgMSApIC8gMiApOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm47ICAvKiB1bnN1cHBvcnRlZCBtb2RlICovCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggZTEgPj0gMCApCi0gICAgewotICAgICAgaWYgKCB4MiAtIHgxID49IHJhcy5wcmVjaXNpb25faGFsZiApCi0gICAgICAgIGNvbG9yID0gcmFzLmdyYXlzWzJdOwotICAgICAgZWxzZQotICAgICAgICBjb2xvciA9IHJhcy5ncmF5c1sxXTsKLQotICAgICAgZTEgPSBUUlVOQyggZTEgKSAvIDI7Ci0gICAgICBpZiAoIGUxIDwgcmFzLnRhcmdldC5yb3dzICkKLSAgICAgIHsKLSAgICAgICAgcGl4ZWwgPSByYXMuZ1RhcmdldCAtIGUxICogcmFzLnRhcmdldC5waXRjaCArIHkgLyAyOwotICAgICAgICBpZiAoIHJhcy50YXJnZXQucGl0Y2ggPiAwICkKLSAgICAgICAgICBwaXhlbCArPSAoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICAgICAgaWYgKCBwaXhlbFswXSA9PSByYXMuZ3JheXNbMF0gKQotICAgICAgICAgIHBpeGVsWzBdID0gY29sb3I7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotI2VuZGlmIC8qIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgR2VuZXJpYyBTd2VlcCBEcmF3aW5nIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyBCb29sCi0gIERyYXdfU3dlZXAoIFJBU19BUkcgKQotICB7Ci0gICAgU2hvcnQgICAgICAgICB5LCB5X2NoYW5nZSwgeV9oZWlnaHQ7Ci0KLSAgICBQUHJvZmlsZSAgICAgIFAsIFEsIFBfTGVmdCwgUF9SaWdodDsKLQotICAgIFNob3J0ICAgICAgICAgbWluX1ksIG1heF9ZLCB0b3AsIGJvdHRvbSwgZHJvcG91dHM7Ci0KLSAgICBMb25nICAgICAgICAgIHgxLCB4MiwgeHMsIGUxLCBlMjsKLQotICAgIFRQcm9maWxlTGlzdCAgd2FpdGluZzsKLSAgICBUUHJvZmlsZUxpc3QgIGRyYXdfbGVmdCwgZHJhd19yaWdodDsKLQotCi0gICAgLyogSW5pdCBlbXB0eSBsaW5rZWQgbGlzdHMgKi8KLQotICAgIEluaXRfTGlua2VkKCAmd2FpdGluZyApOwotCi0gICAgSW5pdF9MaW5rZWQoICZkcmF3X2xlZnQgICk7Ci0gICAgSW5pdF9MaW5rZWQoICZkcmF3X3JpZ2h0ICk7Ci0KLSAgICAvKiBmaXJzdCwgY29tcHV0ZSBtaW4gYW5kIG1heCBZICovCi0KLSAgICBQICAgICA9IHJhcy5mUHJvZmlsZTsKLSAgICBtYXhfWSA9IChTaG9ydClUUlVOQyggcmFzLm1pblkgKTsKLSAgICBtaW5fWSA9IChTaG9ydClUUlVOQyggcmFzLm1heFkgKTsKLQotICAgIHdoaWxlICggUCApCi0gICAgewotICAgICAgUSA9IFAtPmxpbms7Ci0KLSAgICAgIGJvdHRvbSA9IChTaG9ydClQLT5zdGFydDsKLSAgICAgIHRvcCAgICA9IChTaG9ydCkoIFAtPnN0YXJ0ICsgUC0+aGVpZ2h0IC0gMSApOwotCi0gICAgICBpZiAoIG1pbl9ZID4gYm90dG9tICkgbWluX1kgPSBib3R0b207Ci0gICAgICBpZiAoIG1heF9ZIDwgdG9wICAgICkgbWF4X1kgPSB0b3A7Ci0KLSAgICAgIFAtPlggPSAwOwotICAgICAgSW5zTmV3KCAmd2FpdGluZywgUCApOwotCi0gICAgICBQID0gUTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0aGUgWS10dXJucyAqLwotICAgIGlmICggcmFzLm51bVR1cm5zID09IDAgKQotICAgIHsKLSAgICAgIHJhcy5lcnJvciA9IFJhc3Rlcl9FcnJfSW52YWxpZDsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIC8qIE5vdyBpbml0cyB0aGUgc3dlZXAgKi8KLQotICAgIHJhcy5Qcm9jX1N3ZWVwX0luaXQoIFJBU19WQVJTICZtaW5fWSwgJm1heF9ZICk7Ci0KLSAgICAvKiBUaGVuIGNvbXB1dGUgdGhlIGRpc3RhbmNlIG9mIGVhY2ggcHJvZmlsZSBmcm9tIG1pbl9ZICovCi0KLSAgICBQID0gd2FpdGluZzsKLQotICAgIHdoaWxlICggUCApCi0gICAgewotICAgICAgUC0+Y291bnRMID0gKFVTaG9ydCkoIFAtPnN0YXJ0IC0gbWluX1kgKTsKLSAgICAgIFAgPSBQLT5saW5rOwotICAgIH0KLQotICAgIC8qIExldCdzIGdvICovCi0KLSAgICB5ICAgICAgICA9IG1pbl9ZOwotICAgIHlfaGVpZ2h0ID0gMDsKLQotICAgIGlmICggcmFzLm51bVR1cm5zID4gMCAmJgotICAgICAgICAgcmFzLnNpemVCdWZmWy1yYXMubnVtVHVybnNdID09IG1pbl9ZICkKLSAgICAgIHJhcy5udW1UdXJucy0tOwotCi0gICAgd2hpbGUgKCByYXMubnVtVHVybnMgPiAwICkKLSAgICB7Ci0gICAgICAvKiBsb29rIGluIHRoZSB3YWl0aW5nIGxpc3QgZm9yIG5ldyBhY3RpdmF0aW9ucyAqLwotCi0gICAgICBQID0gd2FpdGluZzsKLQotICAgICAgd2hpbGUgKCBQICkKLSAgICAgIHsKLSAgICAgICAgUSA9IFAtPmxpbms7Ci0gICAgICAgIFAtPmNvdW50TCAtPSB5X2hlaWdodDsKLSAgICAgICAgaWYgKCBQLT5jb3VudEwgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBEZWxPbGQoICZ3YWl0aW5nLCBQICk7Ci0KLSAgICAgICAgICBzd2l0Y2ggKCBQLT5mbG93ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBGbG93X1VwOgotICAgICAgICAgICAgSW5zTmV3KCAmZHJhd19sZWZ0LCAgUCApOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEZsb3dfRG93bjoKLSAgICAgICAgICAgIEluc05ldyggJmRyYXdfcmlnaHQsIFAgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFAgPSBROwotICAgICAgfQotCi0gICAgICAvKiBTb3J0IHRoZSBkcmF3aW5nIGxpc3RzICovCi0KLSAgICAgIFNvcnQoICZkcmF3X2xlZnQgKTsKLSAgICAgIFNvcnQoICZkcmF3X3JpZ2h0ICk7Ci0KLSAgICAgIHlfY2hhbmdlID0gKFNob3J0KXJhcy5zaXplQnVmZlstcmFzLm51bVR1cm5zLS1dOwotICAgICAgeV9oZWlnaHQgPSAoU2hvcnQpKCB5X2NoYW5nZSAtIHkgKTsKLQotICAgICAgd2hpbGUgKCB5IDwgeV9jaGFuZ2UgKQotICAgICAgewotICAgICAgICAvKiBMZXQncyB0cmFjZSAqLwotCi0gICAgICAgIGRyb3BvdXRzID0gMDsKLQotICAgICAgICBQX0xlZnQgID0gZHJhd19sZWZ0OwotICAgICAgICBQX1JpZ2h0ID0gZHJhd19yaWdodDsKLQotICAgICAgICB3aGlsZSAoIFBfTGVmdCApCi0gICAgICAgIHsKLSAgICAgICAgICB4MSA9IFBfTGVmdCAtPlg7Ci0gICAgICAgICAgeDIgPSBQX1JpZ2h0LT5YOwotCi0gICAgICAgICAgaWYgKCB4MSA+IHgyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4cyA9IHgxOwotICAgICAgICAgICAgeDEgPSB4MjsKLSAgICAgICAgICAgIHgyID0geHM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCB4MiAtIHgxIDw9IHJhcy5wcmVjaXNpb24gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGUxID0gRkxPT1IoIHgxICk7Ci0gICAgICAgICAgICBlMiA9IENFSUxJTkcoIHgyICk7Ci0KLSAgICAgICAgICAgIGlmICggcmFzLmRyb3BPdXRDb250cm9sICE9IDAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICggZTEgPiBlMiB8fCBlMiA9PSBlMSArIHJhcy5wcmVjaXNpb24gKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIGEgZHJvcCBvdXQgd2FzIGRldGVjdGVkICovCi0KLSAgICAgICAgICAgICAgUF9MZWZ0IC0+WCA9IHgxOwotICAgICAgICAgICAgICBQX1JpZ2h0LT5YID0geDI7Ci0KLSAgICAgICAgICAgICAgLyogbWFyayBwcm9maWxlIGZvciBkcm9wLW91dCBwcm9jZXNzaW5nICovCi0gICAgICAgICAgICAgIFBfTGVmdC0+Y291bnRMID0gMTsKLSAgICAgICAgICAgICAgZHJvcG91dHMrKzsKLQotICAgICAgICAgICAgICBnb3RvIFNraXBfVG9fTmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByYXMuUHJvY19Td2VlcF9TcGFuKCBSQVNfVkFSUyB5LCB4MSwgeDIsIFBfTGVmdCwgUF9SaWdodCApOwotCi0gICAgICAgIFNraXBfVG9fTmV4dDoKLQotICAgICAgICAgIFBfTGVmdCAgPSBQX0xlZnQtPmxpbms7Ci0gICAgICAgICAgUF9SaWdodCA9IFBfUmlnaHQtPmxpbms7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgcGVyZm9ybSB0aGUgZHJvcG91dHMgX2FmdGVyXyB0aGUgc3BhbiBkcmF3aW5nIC0tICovCi0gICAgICAgIC8qIGRyb3Atb3V0cyBwcm9jZXNzaW5nIGhhcyBiZWVuIG1vdmVkIG91dCBvZiB0aGUgbG9vcCAgKi8KLSAgICAgICAgLyogZm9yIHBlcmZvcm1hbmNlIHR1bmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGRyb3BvdXRzID4gMCApCi0gICAgICAgICAgZ290byBTY2FuX0Ryb3BPdXRzOwotCi0gICAgICBOZXh0X0xpbmU6Ci0KLSAgICAgICAgcmFzLlByb2NfU3dlZXBfU3RlcCggUkFTX1ZBUiApOwotCi0gICAgICAgIHkrKzsKLQotICAgICAgICBpZiAoIHkgPCB5X2NoYW5nZSApCi0gICAgICAgIHsKLSAgICAgICAgICBTb3J0KCAmZHJhd19sZWZ0ICApOwotICAgICAgICAgIFNvcnQoICZkcmF3X3JpZ2h0ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogTm93IGZpbmFsaXplIHRoZSBwcm9maWxlcyB0aGF0IG5lZWRzIGl0ICovCi0KLSAgICAgIFAgPSBkcmF3X2xlZnQ7Ci0gICAgICB3aGlsZSAoIFAgKQotICAgICAgewotICAgICAgICBRID0gUC0+bGluazsKLSAgICAgICAgaWYgKCBQLT5oZWlnaHQgPT0gMCApCi0gICAgICAgICAgRGVsT2xkKCAmZHJhd19sZWZ0LCBQICk7Ci0gICAgICAgIFAgPSBROwotICAgICAgfQotCi0gICAgICBQID0gZHJhd19yaWdodDsKLSAgICAgIHdoaWxlICggUCApCi0gICAgICB7Ci0gICAgICAgIFEgPSBQLT5saW5rOwotICAgICAgICBpZiAoIFAtPmhlaWdodCA9PSAwICkKLSAgICAgICAgICBEZWxPbGQoICZkcmF3X3JpZ2h0LCBQICk7Ci0gICAgICAgIFAgPSBROwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGZvciBncmF5LXNjYWxpbmcsIGZsdXNoZXMgdGhlIGJpdG1hcCBzY2FubGluZSBjYWNoZSAqLwotICAgIHdoaWxlICggeSA8PSBtYXhfWSApCi0gICAgewotICAgICAgcmFzLlByb2NfU3dlZXBfU3RlcCggUkFTX1ZBUiApOwotICAgICAgeSsrOwotICAgIH0KLQotICAgIHJldHVybiBTVUNDRVNTOwotCi0gIFNjYW5fRHJvcE91dHM6Ci0KLSAgICBQX0xlZnQgID0gZHJhd19sZWZ0OwotICAgIFBfUmlnaHQgPSBkcmF3X3JpZ2h0OwotCi0gICAgd2hpbGUgKCBQX0xlZnQgKQotICAgIHsKLSAgICAgIGlmICggUF9MZWZ0LT5jb3VudEwgKQotICAgICAgewotICAgICAgICBQX0xlZnQtPmNvdW50TCA9IDA7Ci0jaWYgMAotICAgICAgICBkcm9wb3V0cy0tOyAgLyogLS0gdGhpcyBpcyB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgb25seSAqLwotI2VuZGlmCi0gICAgICAgIHJhcy5Qcm9jX1N3ZWVwX0Ryb3AoIFJBU19WQVJTIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBfTGVmdC0+WCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9SaWdodC0+WCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQX1JpZ2h0ICk7Ci0gICAgICB9Ci0KLSAgICAgIFBfTGVmdCAgPSBQX0xlZnQtPmxpbms7Ci0gICAgICBQX1JpZ2h0ID0gUF9SaWdodC0+bGluazsKLSAgICB9Ci0KLSAgICBnb3RvIE5leHRfTGluZTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyX1NpbmdsZV9QYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGVyZm9ybXMgb25lIHN3ZWVwIHdpdGggc3ViLWJhbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxpcHBlZCA6OiBJZiBzZXQsIGZsaXAgdGhlIGRpcmVjdGlvbiBvZiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyZXIgZXJyb3IgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgaW50Ci0gIFJlbmRlcl9TaW5nbGVfUGFzcyggUkFTX0FSR1MgQm9vbCAgZmxpcHBlZCApCi0gIHsKLSAgICBTaG9ydCAgaSwgaiwgazsKLQotCi0gICAgd2hpbGUgKCByYXMuYmFuZF90b3AgPj0gMCApCi0gICAgewotICAgICAgcmFzLm1heFkgPSAoTG9uZylyYXMuYmFuZF9zdGFja1tyYXMuYmFuZF90b3BdLnlfbWF4ICogcmFzLnByZWNpc2lvbjsKLSAgICAgIHJhcy5taW5ZID0gKExvbmcpcmFzLmJhbmRfc3RhY2tbcmFzLmJhbmRfdG9wXS55X21pbiAqIHJhcy5wcmVjaXNpb247Ci0KLSAgICAgIHJhcy50b3AgPSByYXMuYnVmZjsKLQotICAgICAgcmFzLmVycm9yID0gUmFzdGVyX0Vycl9Ob25lOwotCi0gICAgICBpZiAoIENvbnZlcnRfR2x5cGgoIFJBU19WQVJTIGZsaXBwZWQgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggcmFzLmVycm9yICE9IFJhc3Rlcl9FcnJfT3ZlcmZsb3cgKQotICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotCi0gICAgICAgIHJhcy5lcnJvciA9IFJhc3Rlcl9FcnJfTm9uZTsKLQotICAgICAgICAvKiBzdWItYmFuZGluZyAqLwotCi0jaWZkZWYgREVCVUdfUkFTVEVSCi0gICAgICAgIENsZWFyQmFuZCggUkFTX1ZBUlMgVFJVTkMoIHJhcy5taW5ZICksIFRSVU5DKCByYXMubWF4WSApICk7Ci0jZW5kaWYKLQotICAgICAgICBpID0gcmFzLmJhbmRfc3RhY2tbcmFzLmJhbmRfdG9wXS55X21pbjsKLSAgICAgICAgaiA9IHJhcy5iYW5kX3N0YWNrW3Jhcy5iYW5kX3RvcF0ueV9tYXg7Ci0KLSAgICAgICAgayA9IChTaG9ydCkoICggaSArIGogKSAvIDIgKTsKLQotICAgICAgICBpZiAoIHJhcy5iYW5kX3RvcCA+PSA3IHx8IGsgPCBpICkKLSAgICAgICAgewotICAgICAgICAgIHJhcy5iYW5kX3RvcCA9IDA7Ci0gICAgICAgICAgcmFzLmVycm9yICAgID0gUmFzdGVyX0Vycl9JbnZhbGlkOwotCi0gICAgICAgICAgcmV0dXJuIHJhcy5lcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHJhcy5iYW5kX3N0YWNrW3Jhcy5iYW5kX3RvcCArIDFdLnlfbWluID0gazsKLSAgICAgICAgcmFzLmJhbmRfc3RhY2tbcmFzLmJhbmRfdG9wICsgMV0ueV9tYXggPSBqOwotCi0gICAgICAgIHJhcy5iYW5kX3N0YWNrW3Jhcy5iYW5kX3RvcF0ueV9tYXggPSAoU2hvcnQpKCBrIC0gMSApOwotCi0gICAgICAgIHJhcy5iYW5kX3RvcCsrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIHJhcy5mUHJvZmlsZSApCi0gICAgICAgICAgaWYgKCBEcmF3X1N3ZWVwKCBSQVNfVkFSICkgKQotICAgICAgICAgICAgIHJldHVybiByYXMuZXJyb3I7Ci0gICAgICAgIHJhcy5iYW5kX3RvcC0tOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXJfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXJzIGEgZ2x5cGggaW4gYSBiaXRtYXAuICBTdWItYmFuZGluZyBpZiBuZWVkZWQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBSZW5kZXJfR2x5cGgoIFJBU19BUkcgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBTZXRfSGlnaF9QcmVjaXNpb24oIFJBU19WQVJTIHJhcy5vdXRsaW5lLmZsYWdzICYKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gKTsKLSAgICByYXMuc2NhbGVfc2hpZnQgICAgPSByYXMucHJlY2lzaW9uX3NoaWZ0OwotICAgIC8qIERyb3Atb3V0IG1vZGUgMiBpcyBoYXJkLWNvZGVkIHNpbmNlIHRoaXMgaXMgdGhlIG9ubHkgbW9kZSB1c2VkICovCi0gICAgLyogb24gV2luZG93cyBwbGF0Zm9ybXMuICBVc2luZyBvdGhlciBtb2RlcywgYXMgc3BlY2lmaWVkIGJ5IHRoZSAgKi8KLSAgICAvKiBmb250LCByZXN1bHRzIGluIG1pc3BsYWNlZCBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHJhcy5kcm9wT3V0Q29udHJvbCA9IDI7Ci0gICAgcmFzLnNlY29uZF9wYXNzICAgID0gKEZUX0J5dGUpKCAhKCByYXMub3V0bGluZS5mbGFncyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTICkgKTsKLQotICAgIC8qIFZlcnRpY2FsIFN3ZWVwICovCi0gICAgcmFzLlByb2NfU3dlZXBfSW5pdCA9IFZlcnRpY2FsX1N3ZWVwX0luaXQ7Ci0gICAgcmFzLlByb2NfU3dlZXBfU3BhbiA9IFZlcnRpY2FsX1N3ZWVwX1NwYW47Ci0gICAgcmFzLlByb2NfU3dlZXBfRHJvcCA9IFZlcnRpY2FsX1N3ZWVwX0Ryb3A7Ci0gICAgcmFzLlByb2NfU3dlZXBfU3RlcCA9IFZlcnRpY2FsX1N3ZWVwX1N0ZXA7Ci0KLSAgICByYXMuYmFuZF90b3AgICAgICAgICAgICA9IDA7Ci0gICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9taW4gPSAwOwotICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWF4ID0gKHNob3J0KSggcmFzLnRhcmdldC5yb3dzIC0gMSApOwotCi0gICAgcmFzLmJXaWR0aCAgPSAodW5zaWduZWQgc2hvcnQpcmFzLnRhcmdldC53aWR0aDsKLSAgICByYXMuYlRhcmdldCA9IChCeXRlKilyYXMudGFyZ2V0LmJ1ZmZlcjsKLQotICAgIGlmICggKCBlcnJvciA9IFJlbmRlcl9TaW5nbGVfUGFzcyggUkFTX1ZBUlMgMCApICkgIT0gMCApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBIb3Jpem9udGFsIFN3ZWVwICovCi0gICAgaWYgKCByYXMuc2Vjb25kX3Bhc3MgJiYgcmFzLmRyb3BPdXRDb250cm9sICE9IDAgKQotICAgIHsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX0luaXQgPSBIb3Jpem9udGFsX1N3ZWVwX0luaXQ7Ci0gICAgICByYXMuUHJvY19Td2VlcF9TcGFuID0gSG9yaXpvbnRhbF9Td2VlcF9TcGFuOwotICAgICAgcmFzLlByb2NfU3dlZXBfRHJvcCA9IEhvcml6b250YWxfU3dlZXBfRHJvcDsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX1N0ZXAgPSBIb3Jpem9udGFsX1N3ZWVwX1N0ZXA7Ci0KLSAgICAgIHJhcy5iYW5kX3RvcCAgICAgICAgICAgID0gMDsKLSAgICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWluID0gMDsKLSAgICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWF4ID0gKHNob3J0KSggcmFzLnRhcmdldC53aWR0aCAtIDEgKTsKLQotICAgICAgaWYgKCAoIGVycm9yID0gUmVuZGVyX1NpbmdsZV9QYXNzKCBSQVNfVkFSUyAxICkgKSAhPSAwICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIHJldHVybiBSYXN0ZXJfRXJyX05vbmU7Ci0gIH0KLQotCi0jaWZkZWYgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXJfR3JheV9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXJzIGEgZ2x5cGggd2l0aCBncmF5c2NhbGluZy4gIFN1Yi1iYW5kaW5nIGlmIG5lZWRlZC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBSZW5kZXJfR3JheV9HbHlwaCggUkFTX0FSRyApCi0gIHsKLSAgICBMb25nICAgICAgcGl4ZWxfd2lkdGg7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBTZXRfSGlnaF9QcmVjaXNpb24oIFJBU19WQVJTIHJhcy5vdXRsaW5lLmZsYWdzICYKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gKTsKLSAgICByYXMuc2NhbGVfc2hpZnQgICAgPSByYXMucHJlY2lzaW9uX3NoaWZ0ICsgMTsKLSAgICAvKiBEcm9wLW91dCBtb2RlIDIgaXMgaGFyZC1jb2RlZCBzaW5jZSB0aGlzIGlzIHRoZSBvbmx5IG1vZGUgdXNlZCAqLwotICAgIC8qIG9uIFdpbmRvd3MgcGxhdGZvcm1zLiAgVXNpbmcgb3RoZXIgbW9kZXMsIGFzIHNwZWNpZmllZCBieSB0aGUgICovCi0gICAgLyogZm9udCwgcmVzdWx0cyBpbiBtaXNwbGFjZWQgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICByYXMuZHJvcE91dENvbnRyb2wgPSAyOwotICAgIHJhcy5zZWNvbmRfcGFzcyAgICA9ICEoIHJhcy5vdXRsaW5lLmZsYWdzICYgRlRfT1VUTElORV9TSU5HTEVfUEFTUyApOwotCi0gICAgLyogVmVydGljYWwgU3dlZXAgKi8KLQotICAgIHJhcy5iYW5kX3RvcCAgICAgICAgICAgID0gMDsKLSAgICByYXMuYmFuZF9zdGFja1swXS55X21pbiA9IDA7Ci0gICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9tYXggPSAyICogcmFzLnRhcmdldC5yb3dzIC0gMTsKLQotICAgIHJhcy5iV2lkdGggID0gcmFzLmdyYXlfd2lkdGg7Ci0gICAgcGl4ZWxfd2lkdGggPSAyICogKCAoIHJhcy50YXJnZXQud2lkdGggKyAzICkgPj4gMiApOwotCi0gICAgaWYgKCByYXMuYldpZHRoID4gcGl4ZWxfd2lkdGggKQotICAgICAgcmFzLmJXaWR0aCA9IHBpeGVsX3dpZHRoOwotCi0gICAgcmFzLmJXaWR0aCAgPSByYXMuYldpZHRoICogODsKLSAgICByYXMuYlRhcmdldCA9IChCeXRlKilyYXMuZ3JheV9saW5lczsKLSAgICByYXMuZ1RhcmdldCA9IChCeXRlKilyYXMudGFyZ2V0LmJ1ZmZlcjsKLQotICAgIHJhcy5Qcm9jX1N3ZWVwX0luaXQgPSBWZXJ0aWNhbF9HcmF5X1N3ZWVwX0luaXQ7Ci0gICAgcmFzLlByb2NfU3dlZXBfU3BhbiA9IFZlcnRpY2FsX1N3ZWVwX1NwYW47Ci0gICAgcmFzLlByb2NfU3dlZXBfRHJvcCA9IFZlcnRpY2FsX1N3ZWVwX0Ryb3A7Ci0gICAgcmFzLlByb2NfU3dlZXBfU3RlcCA9IFZlcnRpY2FsX0dyYXlfU3dlZXBfU3RlcDsKLQotICAgIGVycm9yID0gUmVuZGVyX1NpbmdsZV9QYXNzKCBSQVNfVkFSUyAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBIb3Jpem9udGFsIFN3ZWVwICovCi0gICAgaWYgKCByYXMuc2Vjb25kX3Bhc3MgJiYgcmFzLmRyb3BPdXRDb250cm9sICE9IDAgKQotICAgIHsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX0luaXQgPSBIb3Jpem9udGFsX1N3ZWVwX0luaXQ7Ci0gICAgICByYXMuUHJvY19Td2VlcF9TcGFuID0gSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX1NwYW47Ci0gICAgICByYXMuUHJvY19Td2VlcF9Ecm9wID0gSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX0Ryb3A7Ci0gICAgICByYXMuUHJvY19Td2VlcF9TdGVwID0gSG9yaXpvbnRhbF9Td2VlcF9TdGVwOwotCi0gICAgICByYXMuYmFuZF90b3AgICAgICAgICAgICA9IDA7Ci0gICAgICByYXMuYmFuZF9zdGFja1swXS55X21pbiA9IDA7Ci0gICAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IHJhcy50YXJnZXQud2lkdGggKiAyIC0gMTsKLQotICAgICAgZXJyb3IgPSBSZW5kZXJfU2luZ2xlX1Bhc3MoIFJBU19WQVJTIDEgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgcmV0dXJuIFJhc3Rlcl9FcnJfTm9uZTsKLSAgfQotCi0jZWxzZSAvKiAhRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFJlbmRlcl9HcmF5X0dseXBoKCBSQVNfQVJHICkKLSAgewotICAgIEZUX1VOVVNFRF9SQVNURVI7Ci0KLSAgICByZXR1cm4gUmFzdGVyX0Vycl9VbnN1cHBvcnRlZDsKLSAgfQotCi0jZW5kaWYgLyogIUZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORyAqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfYmxhY2tfaW5pdCggUFJhc3RlciAgcmFzdGVyICkKLSAgewotI2lmZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORwotICAgIEZUX1VJbnQgIG47Ci0KLQotICAgIC8qIHNldCBkZWZhdWx0IDUtbGV2ZWxzIGdyYXkgcGFsZXR0ZSAqLwotICAgIGZvciAoIG4gPSAwOyBuIDwgNTsgbisrICkKLSAgICAgIHJhc3Rlci0+Z3JheXNbbl0gPSBuICogMjU1IC8gNDsKLQotICAgIHJhc3Rlci0+Z3JheV93aWR0aCA9IFJBU1RFUl9HUkFZX0xJTkVTIC8gMjsKLQotI2Vsc2UKLSAgICBGVF9VTlVTRUQoIHJhc3RlciApOwotI2VuZGlmCi0gIH0KLQotCi0gIC8qKioqIFJBU1RFUiBPQkpFQ1QgQ1JFQVRJT046IEluIHN0YW5kYWxvbmUgbW9kZSwgd2Ugc2ltcGx5IHVzZSAqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgYSBzdGF0aWMgb2JqZWN0LiAgICAgICAgICAgICAgICAgICoqKioqLwotCi0KLSNpZmRlZiBfU1RBTkRBTE9ORV8KLQotCi0gIHN0YXRpYyBpbnQKLSAgZnRfYmxhY2tfbmV3KCB2b2lkKiAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICBGVF9SYXN0ZXIgICphcmFzdGVyICkKLSAgewotICAgICBzdGF0aWMgVFJhc3RlciAgdGhlX3Jhc3RlcjsKLQotCi0gICAgICphcmFzdGVyID0gKEZUX1Jhc3RlcikmdGhlX3Jhc3RlcjsKLSAgICAgRlRfTUVNX1pFUk8oICZ0aGVfcmFzdGVyLCBzaXplb2YgKCB0aGVfcmFzdGVyICkgKTsKLSAgICAgZnRfYmxhY2tfaW5pdCggJnRoZV9yYXN0ZXIgKTsKLQotICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfYmxhY2tfZG9uZSggRlRfUmFzdGVyICByYXN0ZXIgKQotICB7Ci0gICAgLyogbm90aGluZyAqLwotICAgIEZUX1VOVVNFRCggcmFzdGVyICk7Ci0gIH0KLQotCi0jZWxzZSAvKiBfU1RBTkRBTE9ORV8gKi8KLQotCi0gIHN0YXRpYyBpbnQKLSAgZnRfYmxhY2tfbmV3KCBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgUFJhc3RlciAgICAqYXJhc3RlciApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgUFJhc3RlciAgIHJhc3RlcjsKLQotCi0gICAgKmFyYXN0ZXIgPSAwOwotICAgIGlmICggIUZUX05FVyggcmFzdGVyICkgKQotICAgIHsKLSAgICAgIHJhc3Rlci0+bWVtb3J5ID0gbWVtb3J5OwotICAgICAgZnRfYmxhY2tfaW5pdCggcmFzdGVyICk7Ci0KLSAgICAgICphcmFzdGVyID0gcmFzdGVyOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfYmxhY2tfZG9uZSggUFJhc3RlciAgcmFzdGVyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gKEZUX01lbW9yeSlyYXN0ZXItPm1lbW9yeTsKLSAgICBGVF9GUkVFKCByYXN0ZXIgKTsKLSAgfQotCi0KLSNlbmRpZiAvKiBfU1RBTkRBTE9ORV8gKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2JsYWNrX3Jlc2V0KCBQUmFzdGVyICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgY2hhciogICAgIHBvb2xfYmFzZSwKLSAgICAgICAgICAgICAgICAgIGxvbmcgICAgICBwb29sX3NpemUgKQotICB7Ci0gICAgaWYgKCByYXN0ZXIgKQotICAgIHsKLSAgICAgIGlmICggcG9vbF9iYXNlICYmIHBvb2xfc2l6ZSA+PSAobG9uZylzaXplb2YoVFdvcmtlcikgKyAyMDQ4ICkKLSAgICAgIHsKLSAgICAgICAgUFdvcmtlciAgd29ya2VyID0gKFBXb3JrZXIpcG9vbF9iYXNlOwotCi0KLSAgICAgICAgcmFzdGVyLT5idWZmZXIgICAgICA9IHBvb2xfYmFzZSArICggKHNpemVvZiAoICp3b3JrZXIgKSArIDcgKSAmIH43ICk7Ci0gICAgICAgIHJhc3Rlci0+YnVmZmVyX3NpemUgPSAoICggcG9vbF9iYXNlICsgcG9vbF9zaXplICkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcmFzdGVyLT5idWZmZXIgKSAvIHNpemVvZiAoIExvbmcgKTsKLSAgICAgICAgcmFzdGVyLT53b3JrZXIgICAgICA9IHdvcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmFzdGVyLT5idWZmZXIgICAgICA9IE5VTEw7Ci0gICAgICAgIHJhc3Rlci0+YnVmZmVyX3NpemUgPSAwOwotICAgICAgICByYXN0ZXItPndvcmtlciAgICAgID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2JsYWNrX3NldF9tb2RlKCBQUmFzdGVyICAgICAgICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICAgcGFsZXR0ZSApCi0gIHsKLSNpZmRlZiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVNJTkcKLQotICAgIGlmICggbW9kZSA9PSBGVF9NQUtFX1RBRyggJ3AnLCAnYScsICdsJywgJzUnICkgKQotICAgIHsKLSAgICAgIC8qIHNldCA1LWxldmVscyBncmF5IHBhbGV0dGUgKi8KLSAgICAgIHJhc3Rlci0+Z3JheXNbMF0gPSBwYWxldHRlWzBdOwotICAgICAgcmFzdGVyLT5ncmF5c1sxXSA9IHBhbGV0dGVbMV07Ci0gICAgICByYXN0ZXItPmdyYXlzWzJdID0gcGFsZXR0ZVsyXTsKLSAgICAgIHJhc3Rlci0+Z3JheXNbM10gPSBwYWxldHRlWzNdOwotICAgICAgcmFzdGVyLT5ncmF5c1s0XSA9IHBhbGV0dGVbNF07Ci0gICAgfQotCi0jZWxzZQotCi0gICAgRlRfVU5VU0VEKCByYXN0ZXIgKTsKLSAgICBGVF9VTlVTRUQoIG1vZGUgKTsKLSAgICBGVF9VTlVTRUQoIHBhbGV0dGUgKTsKLQotI2VuZGlmCi0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZnRfYmxhY2tfcmVuZGVyKCBQUmFzdGVyICAgICAgICAgICAgICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKQotICB7Ci0gICAgY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUgICAgPSAoY29uc3QgRlRfT3V0bGluZSopcGFyYW1zLT5zb3VyY2U7Ci0gICAgY29uc3QgRlRfQml0bWFwKiAgIHRhcmdldF9tYXAgPSBwYXJhbXMtPnRhcmdldDsKLSAgICBQV29ya2VyICAgICAgICAgICAgd29ya2VyOwotCi0KLSAgICBpZiAoICFyYXN0ZXIgfHwgIXJhc3Rlci0+YnVmZmVyIHx8ICFyYXN0ZXItPmJ1ZmZlcl9zaXplICkKLSAgICAgIHJldHVybiBSYXN0ZXJfRXJyX05vdF9Jbmk7Ci0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybiBSYXN0ZXJfRXJyX0ludmFsaWQ7Ci0KLSAgICAvKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlIG91dGxpbmUgaXMgZW1wdHkgKi8KLSAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzID09IDAgfHwgb3V0bGluZS0+bl9jb250b3VycyA8PSAwICkKLSAgICAgIHJldHVybiBSYXN0ZXJfRXJyX05vbmU7Ci0KLSAgICBpZiAoICFvdXRsaW5lLT5jb250b3VycyB8fCAhb3V0bGluZS0+cG9pbnRzICkKLSAgICAgIHJldHVybiBSYXN0ZXJfRXJyX0ludmFsaWQ7Ci0KLSAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzICE9Ci0gICAgICAgICAgIG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAxXSArIDEgKQotICAgICAgcmV0dXJuIFJhc3Rlcl9FcnJfSW52YWxpZDsKLQotICAgIHdvcmtlciA9IHJhc3Rlci0+d29ya2VyOwotCi0gICAgLyogdGhpcyB2ZXJzaW9uIG9mIHRoZSByYXN0ZXIgZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3QgcmVuZGVyaW5nLCBzb3JyeSAqLwotICAgIGlmICggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCApCi0gICAgICByZXR1cm4gUmFzdGVyX0Vycl9VbnN1cHBvcnRlZDsKLQotICAgIGlmICggIXRhcmdldF9tYXAgKQotICAgICAgcmV0dXJuIFJhc3Rlcl9FcnJfSW52YWxpZDsKLQotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICBpZiAoICF0YXJnZXRfbWFwLT53aWR0aCB8fCAhdGFyZ2V0X21hcC0+cm93cyApCi0gICAgICByZXR1cm4gUmFzdGVyX0Vycl9Ob25lOwotCi0gICAgaWYgKCAhdGFyZ2V0X21hcC0+YnVmZmVyICkKLSAgICAgIHJldHVybiBSYXN0ZXJfRXJyX0ludmFsaWQ7Ci0KLSAgICByYXMub3V0bGluZSAgPSAqb3V0bGluZTsKLSAgICByYXMudGFyZ2V0ICAgPSAqdGFyZ2V0X21hcDsKLQotICAgIHdvcmtlci0+YnVmZiAgICAgICAgPSAoUExvbmcpIHJhc3Rlci0+YnVmZmVyOwotICAgIHdvcmtlci0+c2l6ZUJ1ZmYgICAgPSB3b3JrZXItPmJ1ZmYgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci0+YnVmZmVyX3NpemUgLyBzaXplb2YgKCBMb25nICk7Ci0jaWZkZWYgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HCi0gICAgd29ya2VyLT5ncmF5cyAgICAgICA9IHJhc3Rlci0+Z3JheXM7Ci0gICAgd29ya2VyLT5ncmF5X3dpZHRoICA9IHJhc3Rlci0+Z3JheV93aWR0aDsKLSNlbmRpZgotCi0gICAgcmV0dXJuICggKCBwYXJhbXMtPmZsYWdzICYgRlRfUkFTVEVSX0ZMQUdfQUEgKQotICAgICAgICAgICAgICAgPyBSZW5kZXJfR3JheV9HbHlwaCggUkFTX1ZBUiApCi0gICAgICAgICAgICAgICA6IFJlbmRlcl9HbHlwaCggUkFTX1ZBUiApICk7Ci0gIH0KLQotCi0gIGNvbnN0IEZUX1Jhc3Rlcl9GdW5jcyAgZnRfc3RhbmRhcmRfcmFzdGVyID0KLSAgewotICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLAotICAgIChGVF9SYXN0ZXJfTmV3X0Z1bmMpICAgICBmdF9ibGFja19uZXcsCi0gICAgKEZUX1Jhc3Rlcl9SZXNldF9GdW5jKSAgIGZ0X2JsYWNrX3Jlc2V0LAotICAgIChGVF9SYXN0ZXJfU2V0X01vZGVfRnVuYylmdF9ibGFja19zZXRfbW9kZSwKLSAgICAoRlRfUmFzdGVyX1JlbmRlcl9GdW5jKSAgZnRfYmxhY2tfcmVuZGVyLAotICAgIChGVF9SYXN0ZXJfRG9uZV9GdW5jKSAgICBmdF9ibGFja19kb25lCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmggYi9zcmMvcmFzdGVyL2Z0cmFzdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZmU0NmQuLjAwMDAwMDAKLS0tIGEvc3JjL3Jhc3Rlci9mdHJhc3Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyYXN0ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRSQVNURVJfSF9fCi0jZGVmaW5lIF9fRlRSQVNURVJfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSBpZiB5b3UgYXJlIHVzaW5nIGZ0cmFzdGVyLmMgYXMgYSAgICAgICAgICovCi0gIC8qIHN0YW5kYWxvbmUgbW9kdWxlLCBmdWxseSBpbmRlcGVuZGVudCBvZiBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX1NUQU5EQUxPTkVfICovCi0KLSAgRlRfRVhQT1JUX1ZBUiggY29uc3QgRlRfUmFzdGVyX0Z1bmNzICkgIGZ0X3N0YW5kYXJkX3Jhc3RlcjsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUUkFTVEVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9mdHJlbmQxLmMgYi9zcmMvcmFzdGVyL2Z0cmVuZDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjOGQwNy4uMDAwMDAwMAotLS0gYS9zcmMvcmFzdGVyL2Z0cmVuZDEuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHJlbmQxLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIHJhc3Rlcml6ZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlICJmdHJlbmQxLmgiCi0jaW5jbHVkZSAiZnRyYXN0ZXIuaCIKLQotI2luY2x1ZGUgInJhc3RlcnJzLmgiCi0KLQotICAvKiBpbml0aWFsaXplIHJlbmRlcmVyIC0tIGluaXQgaXRzIHJhc3RlciAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfcmFzdGVyMV9pbml0KCBGVF9SZW5kZXJlciAgcmVuZGVyICkKLSAgewotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBGVF9NT0RVTEVfTElCUkFSWSggcmVuZGVyICk7Ci0KLQotICAgIHJlbmRlci0+Y2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX3Jlc2V0KCByZW5kZXItPnJhc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeS0+cmFzdGVyX3Bvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnktPnJhc3Rlcl9wb29sX3NpemUgKTsKLQotICAgIHJldHVybiBSYXN0ZXJfRXJyX09rOwotICB9Ci0KLQotICAvKiBzZXQgcmVuZGVyLXNwZWNpZmljIG1vZGUgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Jhc3RlcjFfc2V0X21vZGUoIEZUX1JlbmRlcmVyICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBtb2RlX3RhZywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGRhdGEgKQotICB7Ci0gICAgLyogd2Ugc2ltcGx5IHBhc3MgaXQgdG8gdGhlIHJhc3RlciAqLwotICAgIHJldHVybiByZW5kZXItPmNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9zZXRfbW9kZSggcmVuZGVyLT5yYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX3RhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKTsKLSAgfQotCi0KLSAgLyogdHJhbnNmb3JtIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Jhc3RlcjFfdHJhbnNmb3JtKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgZGVsdGEgKQotICB7Ci0gICAgRlRfRXJyb3IgZXJyb3IgPSBSYXN0ZXJfRXJyX09rOwotCi0KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSByZW5kZXItPmdseXBoX2Zvcm1hdCApCi0gICAgewotICAgICAgZXJyb3IgPSBSYXN0ZXJfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBtYXRyaXggKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oICZzbG90LT5vdXRsaW5lLCBtYXRyaXggKTsKLQotICAgIGlmICggZGVsdGEgKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZzbG90LT5vdXRsaW5lLCBkZWx0YS0+eCwgZGVsdGEtPnkgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcmV0dXJuIHRoZSBnbHlwaCdzIGNvbnRyb2wgYm94ICovCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3Jhc3RlcjFfZ2V0X2Nib3goIEZUX1JlbmRlcmVyICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3gqICAgICAgY2JveCApCi0gIHsKLSAgICBGVF9NRU1fWkVSTyggY2JveCwgc2l6ZW9mICggKmNib3ggKSApOwotCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgPT0gcmVuZGVyLT5nbHlwaF9mb3JtYXQgKQotICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJnNsb3QtPm91dGxpbmUsIGNib3ggKTsKLSAgfQotCi0KLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX3JlbmRlciggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX091dGxpbmUqICBvdXRsaW5lOwotICAgIEZUX0JCb3ggICAgICBjYm94OwotICAgIEZUX1VJbnQgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXRjaDsKLSAgICBGVF9CaXRtYXAqICAgYml0bWFwOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnk7Ci0KLSAgICBGVF9SYXN0ZXJfUGFyYW1zICBwYXJhbXM7Ci0KLQotICAgIC8qIGNoZWNrIGdseXBoIGltYWdlIGZvcm1hdCAqLwotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IHJlbmRlci0+Z2x5cGhfZm9ybWF0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFJhc3Rlcl9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayByZW5kZXJpbmcgbW9kZSAqLwotICAgIGlmICggbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9NT05PICkKLSAgICB7Ci0gICAgICAvKiByYXN0ZXIxIGlzIG9ubHkgY2FwYWJsZSBvZiBwcm9kdWNpbmcgbW9ub2Nocm9tZSBiaXRtYXBzICovCi0gICAgICBpZiAoIHJlbmRlci0+Y2xhenogPT0gJmZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3MgKQotICAgICAgICByZXR1cm4gUmFzdGVyX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogcmFzdGVyNSBpcyBvbmx5IGNhcGFibGUgb2YgcHJvZHVjaW5nIDUtZ3JheS1sZXZlbHMgYml0bWFwcyAqLwotICAgICAgaWYgKCByZW5kZXItPmNsYXp6ID09ICZmdF9yYXN0ZXI1X3JlbmRlcmVyX2NsYXNzICkKLSAgICAgICAgcmV0dXJuIFJhc3Rlcl9FcnJfQ2Fubm90X1JlbmRlcl9HbHlwaDsKLSAgICB9Ci0KLSAgICBvdXRsaW5lID0gJnNsb3QtPm91dGxpbmU7Ci0KLSAgICAvKiB0cmFuc2xhdGUgdGhlIG91dGxpbmUgdG8gdGhlIG5ldyBvcmlnaW4gaWYgbmVlZGVkICovCi0gICAgaWYgKCBvcmlnaW4gKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsIG9yaWdpbi0+eCwgb3JpZ2luLT55ICk7Ci0KLSAgICAvKiBjb21wdXRlIHRoZSBjb250cm9sIGJveCwgYW5kIGdyaWQgZml0IGl0ICovCi0gICAgRlRfT3V0bGluZV9HZXRfQ0JveCggb3V0bGluZSwgJmNib3ggKTsKLQotICAgIGNib3gueE1pbiA9IEZUX1BJWF9GTE9PUiggY2JveC54TWluICk7Ci0gICAgY2JveC55TWluID0gRlRfUElYX0ZMT09SKCBjYm94LnlNaW4gKTsKLSAgICBjYm94LnhNYXggPSBGVF9QSVhfQ0VJTCggY2JveC54TWF4ICk7Ci0gICAgY2JveC55TWF4ID0gRlRfUElYX0NFSUwoIGNib3gueU1heCApOwotCi0gICAgd2lkdGggID0gKEZUX1VJbnQpKCAoIGNib3gueE1heCAtIGNib3gueE1pbiApID4+IDYgKTsKLSAgICBoZWlnaHQgPSAoRlRfVUludCkoICggY2JveC55TWF4IC0gY2JveC55TWluICkgPj4gNiApOwotICAgIGJpdG1hcCA9ICZzbG90LT5iaXRtYXA7Ci0gICAgbWVtb3J5ID0gcmVuZGVyLT5yb290Lm1lbW9yeTsKLQotICAgIC8qIHJlbGVhc2Ugb2xkIGJpdG1hcCBidWZmZXIgKi8KLSAgICBpZiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGJpdG1hcC0+YnVmZmVyICk7Ci0gICAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJj0gfkZUX0dMWVBIX09XTl9CSVRNQVA7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgbmV3IG9uZSwgZGVwZW5kcyBvbiBwaXhlbCBmb3JtYXQgKi8KLSAgICBpZiAoICEoIG1vZGUgJiBGVF9SRU5ERVJfTU9ERV9NT05PICkgKQotICAgIHsKLSAgICAgIC8qIHdlIHBhZCB0byAzMiBiaXRzLCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIEZUIDEueCAqLwotICAgICAgcGl0Y2ggICAgICAgICAgICAgID0gRlRfUEFEX0NFSUwoIHdpZHRoLCA0ICk7Ci0gICAgICBiaXRtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVk7Ci0gICAgICBiaXRtYXAtPm51bV9ncmF5cyAgPSAyNTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwaXRjaCAgICAgICAgICAgICAgPSAoICggd2lkdGggKyAxNSApID4+IDQgKSA8PCAxOwotICAgICAgYml0bWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9NT05POwotICAgIH0KLQotICAgIGJpdG1hcC0+d2lkdGggPSB3aWR0aDsKLSAgICBiaXRtYXAtPnJvd3MgID0gaGVpZ2h0OwotICAgIGJpdG1hcC0+cGl0Y2ggPSBwaXRjaDsKLQotICAgIGlmICggRlRfQUxMT0NfTVVMVCggYml0bWFwLT5idWZmZXIsIHBpdGNoLCBoZWlnaHQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgfD0gRlRfR0xZUEhfT1dOX0JJVE1BUDsKLQotICAgIC8qIHRyYW5zbGF0ZSBvdXRsaW5lIHRvIHJlbmRlciBpdCBpbnRvIHRoZSBiaXRtYXAgKi8KLSAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgLWNib3gueE1pbiwgLWNib3gueU1pbiApOwotCi0gICAgLyogc2V0IHVwIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMudGFyZ2V0ID0gYml0bWFwOwotICAgIHBhcmFtcy5zb3VyY2UgPSBvdXRsaW5lOwotICAgIHBhcmFtcy5mbGFncyAgPSAwOwotCi0gICAgaWYgKCBiaXRtYXAtPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9HUkFZICkKLSAgICAgIHBhcmFtcy5mbGFncyB8PSBGVF9SQVNURVJfRkxBR19BQTsKLQotICAgIC8qIHJlbmRlciBvdXRsaW5lIGludG8gdGhlIGJpdG1hcCAqLwotICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOwotCi0gICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsIGNib3gueE1pbiwgY2JveC55TWluICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHNsb3QtPmZvcm1hdCAgICAgID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKLSAgICBzbG90LT5iaXRtYXBfbGVmdCA9IChGVF9JbnQpKCBjYm94LnhNaW4gPj4gNiApOwotICAgIHNsb3QtPmJpdG1hcF90b3AgID0gKEZUX0ludCkoIGNib3gueU1heCA+PiA2ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyAgZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzcyA9Ci0gIHsKLSAgICB7Ci0gICAgICBGVF9NT0RVTEVfUkVOREVSRVIsCi0gICAgICBzaXplb2YoIEZUX1JlbmRlcmVyUmVjICksCi0KLSAgICAgICJyYXN0ZXIxIiwKLSAgICAgIDB4MTAwMDBMLAotICAgICAgMHgyMDAwMEwsCi0KLSAgICAgIDAsICAgIC8qIG1vZHVsZSBzcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilmdF9yYXN0ZXIxX2luaXQsCi0gICAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIDAsCi0gICAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIDAKLSAgICB9LAotCi0gICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCi0KLSAgICAoRlRfUmVuZGVyZXJfUmVuZGVyRnVuYykgICBmdF9yYXN0ZXIxX3JlbmRlciwKLSAgICAoRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYylmdF9yYXN0ZXIxX3RyYW5zZm9ybSwKLSAgICAoRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMpICBmdF9yYXN0ZXIxX2dldF9jYm94LAotICAgIChGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYykgIGZ0X3Jhc3RlcjFfc2V0X21vZGUsCi0KLSAgICAoRlRfUmFzdGVyX0Z1bmNzKikgICAgJmZ0X3N0YW5kYXJkX3Jhc3RlcgotICB9OwotCi0KLSAgLyogVGhpcyByZW5kZXJlciBpcyBfTk9UXyBwYXJ0IG9mIHRoZSBkZWZhdWx0IG1vZHVsZXM7IHlvdSB3aWxsIG5lZWQgKi8KLSAgLyogdG8gcmVnaXN0ZXIgaXQgYnkgaGFuZCBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgSXQgc2hvdWxkIG9ubHkgYmUgICAgKi8KLSAgLyogdXNlZCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBGVCAxLnggYW55d2F5LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICBmdF9yYXN0ZXI1X3JlbmRlcmVyX2NsYXNzID0KLSAgewotICAgIHsKLSAgICAgIEZUX01PRFVMRV9SRU5ERVJFUiwKLSAgICAgIHNpemVvZiggRlRfUmVuZGVyZXJSZWMgKSwKLQotICAgICAgInJhc3RlcjUiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgMCwgICAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKWZ0X3Jhc3RlcjFfaW5pdCwKLSAgICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgMCwKLSAgICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgMAotICAgIH0sCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSAgIGZ0X3Jhc3RlcjFfcmVuZGVyLAotICAgIChGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jKWZ0X3Jhc3RlcjFfdHJhbnNmb3JtLAotICAgIChGVF9SZW5kZXJlcl9HZXRDQm94RnVuYykgIGZ0X3Jhc3RlcjFfZ2V0X2Nib3gsCi0gICAgKEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSAgZnRfcmFzdGVyMV9zZXRfbW9kZSwKLQotICAgIChGVF9SYXN0ZXJfRnVuY3MqKSAgICAmZnRfc3RhbmRhcmRfcmFzdGVyCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0cmVuZDEuaCBiL3NyYy9yYXN0ZXIvZnRyZW5kMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU5YTVmLi4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvZnRyZW5kMS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyZW5kMS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRSRU5EMV9IX18KLSNkZWZpbmUgX19GVFJFTkQxX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfUkVOREVSX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICkgIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3M7Ci0KLSAgLyogdGhpcyByZW5kZXJlciBpcyBfTk9UXyBwYXJ0IG9mIHRoZSBkZWZhdWx0IG1vZHVsZXMsIHlvdSdsbCBuZWVkICovCi0gIC8qIHRvIHJlZ2lzdGVyIGl0IGJ5IGhhbmQgaW4geW91ciBhcHBsaWNhdGlvbi4gIEl0IHNob3VsZCBvbmx5IGJlICAqLwotICAvKiB1c2VkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIEZUIDEueCBhbnl3YXkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICkgIGZ0X3Jhc3RlcjVfcmVuZGVyZXJfY2xhc3M7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFJFTkQxX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9yYXN0ZXIuYyBiL3NyYy9yYXN0ZXIvcmFzdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxM2E2N2EuLjAwMDAwMDAKLS0tIGEvc3JjL3Jhc3Rlci9yYXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJhc3Rlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb25vY2hyb21lIHJhc3RlcmVyIG1vZHVsZSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImZ0cmFzdGVyLmMiCi0jaW5jbHVkZSAiZnRyZW5kMS5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9yYXN0ZXJycy5oIGIvc3JjL3Jhc3Rlci9yYXN0ZXJycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGY5YTdhLi4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvcmFzdGVycnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJhc3RlcnJzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBtb25vY2hyb21lIHJlbmRlcmVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgbW9ub2Nocm9tZSByZW5kZXJlciBlcnJvciBlbnVtZXJhdGlvbiAqLwotICAvKiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fUkFTVEVSUlNfSF9fCi0jZGVmaW5lIF9fUkFTVEVSUlNfSF9fCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgX19GVEVSUk9SU19IX18KLQotI2RlZmluZSBGVF9FUlJfUFJFRklYICBSYXN0ZXJfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1Jhc3RlcgotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogX19SQVNURVJSU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3NmZHJpdmVyLmMgYi9zcmMvc2ZudC9zZmRyaXZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEyMmE2Li4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3NmZHJpdmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2Zkcml2ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgU0ZOVCBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLSNpbmNsdWRlICJzZmRyaXZlci5oIgotI2luY2x1ZGUgInR0bG9hZC5oIgotI2luY2x1ZGUgInNmb2Jqcy5oIgotCi0jaW5jbHVkZSAic2ZlcnJvcnMuaCIKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotI2luY2x1ZGUgInR0c2JpdC5oIgotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLSNpbmNsdWRlICJ0dHBvc3QuaCIKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSNpbmNsdWRlICJ0dGJkZi5oIgotI2luY2x1ZGUgRlRfU0VSVklDRV9CREZfSAotI2VuZGlmCi0KLSNpbmNsdWRlICJ0dGNtYXAuaCIKLSNpbmNsdWRlICJ0dGtlcm4uaCIKLSNpbmNsdWRlICJ0dG10eC5oIgotCi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9TRk5UX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICi0KLQotIC8qCi0gICogIFNGTlQgVEFCTEUgU0VSVklDRQotICAqCi0gICovCi0KLSAgc3RhdGljIHZvaWQqCi0gIGdldF9zZm50X3RhYmxlKCBUVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX1NmbnRfVGFnICB0YWcgKQotICB7Ci0gICAgdm9pZCogIHRhYmxlOwotCi0KLSAgICBzd2l0Y2ggKCB0YWcgKQotICAgIHsKLSAgICBjYXNlIGZ0X3NmbnRfaGVhZDoKLSAgICAgIHRhYmxlID0gJmZhY2UtPmhlYWRlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBmdF9zZm50X2hoZWE6Ci0gICAgICB0YWJsZSA9ICZmYWNlLT5ob3Jpem9udGFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGZ0X3NmbnRfdmhlYToKLSAgICAgIHRhYmxlID0gZmFjZS0+dmVydGljYWxfaW5mbyA/ICZmYWNlLT52ZXJ0aWNhbCA6IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZnRfc2ZudF9vczI6Ci0gICAgICB0YWJsZSA9IGZhY2UtPm9zMi52ZXJzaW9uID09IDB4RkZGRlUgPyAwIDogJmZhY2UtPm9zMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBmdF9zZm50X3Bvc3Q6Ci0gICAgICB0YWJsZSA9ICZmYWNlLT5wb3N0c2NyaXB0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGZ0X3NmbnRfbWF4cDoKLSAgICAgIHRhYmxlID0gJmZhY2UtPm1heF9wcm9maWxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGZ0X3NmbnRfcGNsdDoKLSAgICAgIHRhYmxlID0gZmFjZS0+cGNsdC5WZXJzaW9uID8gJmZhY2UtPnBjbHQgOiAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgdGFibGUgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB0YWJsZTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHNmbnRfdGFibGVfaW5mbyggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgaWR4LAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqdGFnLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICkKLSAgewotICAgIGlmICggIXRhZyB8fCAhbGVuZ3RoICkKLSAgICAgIHJldHVybiBTRk5UX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgaWYgKCBpZHggPj0gZmFjZS0+bnVtX3RhYmxlcyApCi0gICAgICByZXR1cm4gU0ZOVF9FcnJfVGFibGVfTWlzc2luZzsKLQotICAgICp0YWcgICAgPSBmYWNlLT5kaXJfdGFibGVzW2lkeF0uVGFnOwotICAgICpsZW5ndGggPSBmYWNlLT5kaXJfdGFibGVzW2lkeF0uTGVuZ3RoOwotCi0gICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9TRk5UX1RhYmxlUmVjICBzZm50X3NlcnZpY2Vfc2ZudF90YWJsZSA9Ci0gIHsKLSAgICAoRlRfU0ZOVF9UYWJsZUxvYWRGdW5jKXR0X2ZhY2VfbG9hZF9hbnksCi0gICAgKEZUX1NGTlRfVGFibGVHZXRGdW5jKSBnZXRfc2ZudF90YWJsZSwKLSAgICAoRlRfU0ZOVF9UYWJsZUluZm9GdW5jKXNmbnRfdGFibGVfaW5mbwotICB9OwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLQotIC8qCi0gICogIEdMWVBIIERJQ1QgU0VSVklDRQotICAqCi0gICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHNmbnRfZ2V0X2dseXBoX25hbWUoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKQotICB7Ci0gICAgRlRfU3RyaW5nKiAgZ25hbWU7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gdHRfZmFjZV9nZXRfcHNfbmFtZSggZmFjZSwgZ2x5cGhfaW5kZXgsICZnbmFtZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgIEZUX1NUUkNQWU4oIGJ1ZmZlciwgZ25hbWUsIGJ1ZmZlcl9tYXggKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjICBzZm50X3NlcnZpY2VfZ2x5cGhfZGljdCA9Ci0gIHsKLSAgICAoRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jKSAgc2ZudF9nZXRfZ2x5cGhfbmFtZSwKLSAgICAoRlRfR2x5cGhEaWN0X05hbWVJbmRleEZ1bmMpTlVMTAotICB9OwotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTICovCi0KLQotIC8qCi0gICogIFBPU1RTQ1JJUFQgTkFNRSBTRVJWSUNFCi0gICoKLSAgKi8KLQotICBzdGF0aWMgY29uc3QgY2hhcioKLSAgc2ZudF9nZXRfcHNfbmFtZSggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9JbnQgICAgICAgbiwgZm91bmRfd2luLCBmb3VuZF9hcHBsZTsKLSAgICBjb25zdCBjaGFyKiAgcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgLyogc2hvdWxkbid0IGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZSB0byBhdm9pZCBtZW1vcnkgbGVha3MgKi8KLSAgICBpZiAoIGZhY2UtPnBvc3RzY3JpcHRfbmFtZSApCi0gICAgICByZXR1cm4gZmFjZS0+cG9zdHNjcmlwdF9uYW1lOwotCi0gICAgLyogc2NhbiB0aGUgbmFtZSB0YWJsZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIGEgUG9zdHNjcmlwdCBuYW1lIGhlcmUsICovCi0gICAgLyogZWl0aGVyIGluIE1hY2ludG9zaCBvciBXaW5kb3dzIHBsYXRmb3JtIGVuY29kaW5ncyAgICAgICAgICAgICAgICAgICovCi0gICAgZm91bmRfd2luICAgPSAtMTsKLSAgICBmb3VuZF9hcHBsZSA9IC0xOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT5udW1fbmFtZXM7IG4rKyApCi0gICAgewotICAgICAgVFRfTmFtZUVudHJ5UmVjKiAgbmFtZSA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBuOwotCi0KLSAgICAgIGlmICggbmFtZS0+bmFtZUlEID09IDYgJiYgbmFtZS0+c3RyaW5nTGVuZ3RoID4gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggbmFtZS0+cGxhdGZvcm1JRCA9PSAzICAgICAmJgotICAgICAgICAgICAgIG5hbWUtPmVuY29kaW5nSUQgPT0gMSAgICAgJiYKLSAgICAgICAgICAgICBuYW1lLT5sYW5ndWFnZUlEID09IDB4NDA5ICkKLSAgICAgICAgICBmb3VuZF93aW4gPSBuOwotCi0gICAgICAgIGlmICggbmFtZS0+cGxhdGZvcm1JRCA9PSAxICYmCi0gICAgICAgICAgICAgbmFtZS0+ZW5jb2RpbmdJRCA9PSAwICYmCi0gICAgICAgICAgICAgbmFtZS0+bGFuZ3VhZ2VJRCA9PSAwICkKLSAgICAgICAgICBmb3VuZF9hcHBsZSA9IG47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBmb3VuZF93aW4gIT0gLTEgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgICAgVFRfTmFtZUVudHJ5UmVjKiAgbmFtZSAgID0gZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIGZvdW5kX3dpbjsKLSAgICAgIEZUX1VJbnQgICAgICAgICAgIGxlbiAgICA9IG5hbWUtPnN0cmluZ0xlbmd0aCAvIDI7Ci0gICAgICBGVF9FcnJvciAgICAgICAgICBlcnJvciAgPSBTRk5UX0Vycl9PazsKLQotICAgICAgRlRfVU5VU0VEKCBlcnJvciApOwotCi0KLSAgICAgIGlmICggIUZUX0FMTE9DKCByZXN1bHQsIG5hbWUtPnN0cmluZ0xlbmd0aCArIDEgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSA9IGZhY2UtPm5hbWVfdGFibGUuc3RyZWFtOwotICAgICAgICBGVF9TdHJpbmcqICByICAgICAgPSAoRlRfU3RyaW5nKilyZXN1bHQ7Ci0gICAgICAgIEZUX0J5dGUqICAgIHAgICAgICA9IChGVF9CeXRlKiluYW1lLT5zdHJpbmc7Ci0KLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBuYW1lLT5zdHJpbmdPZmZzZXQgKSB8fAotICAgICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBuYW1lLT5zdHJpbmdMZW5ndGggKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9GUkVFKCByZXN1bHQgKTsKLSAgICAgICAgICBuYW1lLT5zdHJpbmdMZW5ndGggPSAwOwotICAgICAgICAgIG5hbWUtPnN0cmluZ09mZnNldCA9IDA7Ci0gICAgICAgICAgRlRfRlJFRSggbmFtZS0+c3RyaW5nICk7Ci0KLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gKEZUX0J5dGUqKXN0cmVhbS0+Y3Vyc29yOwotCi0gICAgICAgIGZvciAoIDsgbGVuID4gMDsgbGVuLS0sIHAgKz0gMiApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHBbMF0gPT0gMCAmJiBwWzFdID49IDMyICYmIHBbMV0gPCAxMjggKQotICAgICAgICAgICAgKnIrKyA9IHBbMV07Ci0gICAgICAgIH0KLSAgICAgICAgKnIgPSAnXDAnOwotCi0gICAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICAgIH0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGZvdW5kX2FwcGxlICE9IC0xICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICAgIFRUX05hbWVFbnRyeVJlYyogIG5hbWUgICA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBmb3VuZF9hcHBsZTsKLSAgICAgIEZUX1VJbnQgICAgICAgICAgIGxlbiAgICA9IG5hbWUtPnN0cmluZ0xlbmd0aDsKLSAgICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yICA9IFNGTlRfRXJyX09rOwotCi0gICAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0KLQotICAgICAgaWYgKCAhRlRfQUxMT0MoIHJlc3VsdCwgbGVuICsgMSApICkKLSAgICAgIHsKLSAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5uYW1lX3RhYmxlLnN0cmVhbTsKLQotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG5hbWUtPnN0cmluZ09mZnNldCApIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIHJlc3VsdCwgbGVuICkgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIG5hbWUtPnN0cmluZ09mZnNldCA9IDA7Ci0gICAgICAgICAgbmFtZS0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgICAgICBGVF9GUkVFKCBuYW1lLT5zdHJpbmcgKTsKLSAgICAgICAgICBGVF9GUkVFKCByZXN1bHQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgKChjaGFyKilyZXN1bHQpW2xlbl0gPSAnXDAnOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIGZhY2UtPnBvc3RzY3JpcHRfbmFtZSA9IHJlc3VsdDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyAgc2ZudF9zZXJ2aWNlX3BzX25hbWUgPQotICB7Ci0gICAgKEZUX1BzTmFtZV9HZXRGdW5jKXNmbnRfZ2V0X3BzX25hbWUKLSAgfTsKLQotCi0gIC8qCi0gICAqICBUVCBDTUFQIElORk8KLSAgICovCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMgIHR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyA9Ci0gIHsKLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfZ2V0X2NtYXBfaW5mbwotICB9OwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBzZm50X2dldF9jaGFyc2V0X2lkKCBUVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfcmVnaXN0cnkgKQotICB7Ci0gICAgQkRGX1Byb3BlcnR5UmVjICBlbmNvZGluZywgcmVnaXN0cnk7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLQotCi0gICAgLyogWFhYOiBJIGRvbid0IGtub3cgd2hldGhlciB0aGlzIGlzIGNvcnJlY3QsIHNpbmNlCi0gICAgICogICAgICB0dF9mYWNlX2ZpbmRfYmRmX3Byb3Agb25seSByZXR1cm5zIHNvbWV0aGluZyBjb3JyZWN0IGlmIHdlIGhhdmUKLSAgICAgKiAgICAgIHByZXZpb3VzbHkgc2VsZWN0ZWQgYSBzaXplIHRoYXQgaXMgbGlzdGVkIGluIHRoZSBCREYgdGFibGUuCi0gICAgICogICAgICBTaG91bGQgd2UgY2hhbmdlIHRoZSBCREYgdGFibGUgZm9ybWF0IHRvIGluY2x1ZGUgc2luZ2xlIG9mZnNldHMKLSAgICAgKiAgICAgIGZvciBgQ0hBUlNFVF9SRUdJU1RSWScgYW5kIGBDSEFSU0VUX0VOQ09ESU5HJz8KLSAgICAgKi8KLSAgICBlcnJvciA9IHR0X2ZhY2VfZmluZF9iZGZfcHJvcCggZmFjZSwgIkNIQVJTRVRfUkVHSVNUUlkiLCAmcmVnaXN0cnkgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSB0dF9mYWNlX2ZpbmRfYmRmX3Byb3AoIGZhY2UsICJDSEFSU0VUX0VOQ09ESU5HIiwgJmVuY29kaW5nICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGlmICggcmVnaXN0cnkudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9BVE9NICYmCi0gICAgICAgICAgICAgZW5jb2RpbmcudHlwZSA9PSBCREZfUFJPUEVSVFlfVFlQRV9BVE9NICkKLSAgICAgICAgewotICAgICAgICAgICphY2hhcnNldF9lbmNvZGluZyA9IGVuY29kaW5nLnUuYXRvbTsKLSAgICAgICAgICAqYWNoYXJzZXRfcmVnaXN0cnkgPSByZWdpc3RyeS51LmF0b207Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9CREZSZWMgIHNmbnRfc2VydmljZV9iZGYgPQotICB7Ci0gICAgKEZUX0JERl9HZXRDaGFyc2V0SWRGdW5jKSBzZm50X2dldF9jaGFyc2V0X2lkLAotICAgIChGVF9CREZfR2V0UHJvcGVydHlGdW5jKSAgdHRfZmFjZV9maW5kX2JkZl9wcm9wLAotICB9OwotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9CREYgKi8KLQotCi0gIC8qCi0gICAqICBTRVJWSUNFIExJU1QKLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBzZm50X3NlcnZpY2VzW10gPQotICB7Ci0gICAgeyBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUsICAgICAgICAgICAmc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZzZm50X3NlcnZpY2VfcHNfbmFtZSB9LAotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICAgIHsgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJnNmbnRfc2VydmljZV9nbHlwaF9kaWN0IH0sCi0jZW5kaWYKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotICAgIHsgRlRfU0VSVklDRV9JRF9CREYsICAgICAgICAgICAgICAgICAgJnNmbnRfc2VydmljZV9iZGYgfSwKLSNlbmRpZgotICAgIHsgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJnR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyB9LAotCi0gICAgeyBOVUxMLCBOVUxMIH0KLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfTW9kdWxlX0ludGVyZmFjZSApCi0gIHNmbnRfZ2V0X2ludGVyZmFjZSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX2ludGVyZmFjZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1vZHVsZSApOwotCi0gICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIHNmbnRfc2VydmljZXMsIG1vZHVsZV9pbnRlcmZhY2UgKTsKLSAgfQotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3NmbnRfaGVhZGVyX3N0dWIoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZOVF9IZWFkZXIgIGhlYWRlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotICAgIEZUX1VOVVNFRCggZmFjZV9pbmRleCApOwotICAgIEZUX1VOVVNFRCggaGVhZGVyICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9kaXJlY3Rvcnlfc3R1YiggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRk5UX0hlYWRlciAgaGVhZGVyICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0gICAgRlRfVU5VU0VEKCBoZWFkZXIgKTsKLQotICAgIHJldHVybiBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hkbXhfc3R1YiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9oZG14X3N0dWIoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBmYWNlICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX3NldF9zYml0X3N0cmlrZV9zdHViKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgeF9wcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHlfcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBhc3RyaWtlX2luZGV4ICkKLSAgewotICAgIC8qCi0gICAgICogV2Ugc2ltcGx5IGZvcmdlIGEgRlRfU2l6ZV9SZXF1ZXN0IGFuZCBjYWxsIHRoZSByZWFsIGZ1bmN0aW9uCi0gICAgICogdGhhdCBkb2VzIGFsbCB0aGUgd29yay4KLSAgICAgKgotICAgICAqIFRoaXMgc3R1YiBtaWdodCBiZSBjYWxsZWQgYnkgbGliWGZvbnQgaW4gdGhlIFguT3JnIFhzZXJ2ZXIsCi0gICAgICogY29tcGlsZWQgYWdhaW5zdCB2ZXJzaW9uIDIuMS44IG9yIG5ld2VyLgotICAgICAqLwotCi0gICAgRlRfU2l6ZV9SZXF1ZXN0UmVjICByZXE7Ci0KLQotICAgIHJlcS50eXBlICAgICAgICAgICA9IEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUw7Ci0gICAgcmVxLndpZHRoICAgICAgICAgID0gKEZUX0YyNkRvdDYpeF9wcGVtOwotICAgIHJlcS5oZWlnaHQgICAgICAgICA9IChGVF9GMjZEb3Q2KXlfcHBlbTsKLSAgICByZXEuaG9yaVJlc29sdXRpb24gPSAwOwotICAgIHJlcS52ZXJ0UmVzb2x1dGlvbiA9IDA7Ci0KLSAgICAqYXN0cmlrZV9pbmRleCA9IDB4N0ZGRkZGRkZVTDsKLQotICAgIHJldHVybiB0dF9mYWNlX3NldF9zYml0X3N0cmlrZSggZmFjZSwgJnJlcSwgYXN0cmlrZV9pbmRleCApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3NiaXRfc3R1YiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0gICAgLyoKLSAgICAgKiAgVGhpcyBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCB0byBsb2FkIHRoZSBzYml0IHRhYmxlLgotICAgICAqICBIb3dldmVyLCBpdCBoYXMgYmVlbiByZXBsYWNlZCBieSBgdHRfZmFjZV9sb2FkX2VibGMnLCBhbmQgdGhpcyBzdHViCi0gICAgICogIGlzIG9ubHkgdGhlcmUgZm9yIHNvbWUgcm9ndWUgY2xpZW50cyB3aGljaCB3b3VsZCB3YW50IHRvIGNhbGwgaXQKLSAgICAgKiAgZGlyZWN0bHkgKHdoaWNoIGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlKS4KLSAgICAgKi8KLSAgICByZXR1cm4gRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX3NiaXRfc3R1YiggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICAvKiBub3RoaW5nIHRvIGRvIGluIHRoaXMgc3R1YiAqLwotICAgIEZUX1VOVVNFRCggZmFjZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2NoYXJtYXBfc3R1YiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgaW5wdXQgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBmYWNlICk7Ci0gICAgRlRfVU5VU0VEKCBjbWFwICk7Ci0gICAgRlRfVU5VU0VEKCBpbnB1dCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2ZyZWVfY2hhcm1hcF9zdHViKCBUVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICBjbWFwICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotICAgIEZUX1VOVVNFRCggY21hcCApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyAqLwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IFNGTlRfSW50ZXJmYWNlICBzZm50X2ludGVyZmFjZSA9Ci0gIHsKLSAgICB0dF9mYWNlX2dvdG9fdGFibGUsCi0KLSAgICBzZm50X2luaXRfZmFjZSwKLSAgICBzZm50X2xvYWRfZmFjZSwKLSAgICBzZm50X2RvbmVfZmFjZSwKLSAgICBzZm50X2dldF9pbnRlcmZhY2UsCi0KLSAgICB0dF9mYWNlX2xvYWRfYW55LAotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0gICAgdHRfZmFjZV9sb2FkX3NmbnRfaGVhZGVyX3N0dWIsCi0gICAgdHRfZmFjZV9sb2FkX2RpcmVjdG9yeV9zdHViLAotI2VuZGlmCi0KLSAgICB0dF9mYWNlX2xvYWRfaGVhZCwKLSAgICB0dF9mYWNlX2xvYWRfaGhlYSwKLSAgICB0dF9mYWNlX2xvYWRfY21hcCwKLSAgICB0dF9mYWNlX2xvYWRfbWF4cCwKLSAgICB0dF9mYWNlX2xvYWRfb3MyLAotICAgIHR0X2ZhY2VfbG9hZF9wb3N0LAotCi0gICAgdHRfZmFjZV9sb2FkX25hbWUsCi0gICAgdHRfZmFjZV9mcmVlX25hbWUsCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLSAgICB0dF9mYWNlX2xvYWRfaGRteF9zdHViLAotICAgIHR0X2ZhY2VfZnJlZV9oZG14X3N0dWIsCi0jZW5kaWYKLQotICAgIHR0X2ZhY2VfbG9hZF9rZXJuLAotICAgIHR0X2ZhY2VfbG9hZF9nYXNwLAotICAgIHR0X2ZhY2VfbG9hZF9wY2x0LAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0gICAgLyogc2VlIGB0dGxvYWQuaCcgKi8KLSAgICB0dF9mYWNlX2xvYWRfYmhlZCwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0gICAgdHRfZmFjZV9zZXRfc2JpdF9zdHJpa2Vfc3R1YiwKLSAgICB0dF9mYWNlX2xvYWRfc2JpdF9zdHViLAotCi0gICAgdHRfZmluZF9zYml0X2ltYWdlLAotICAgIHR0X2xvYWRfc2JpdF9tZXRyaWNzLAotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLSAgICB0dF9mYWNlX2xvYWRfc2JpdF9pbWFnZSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0gICAgdHRfZmFjZV9mcmVlX3NiaXRfc3R1YiwKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0gICAgLyogc2VlIGB0dHBvc3QuaCcgKi8KLSAgICB0dF9mYWNlX2dldF9wc19uYW1lLAotICAgIHR0X2ZhY2VfZnJlZV9wc19uYW1lcywKLSNlbHNlCi0gICAgMCwKLSAgICAwLAotI2VuZGlmCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLSAgICB0dF9mYWNlX2xvYWRfY2hhcm1hcF9zdHViLAotICAgIHR0X2ZhY2VfZnJlZV9jaGFybWFwX3N0dWIsCi0jZW5kaWYKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xLjggKi8KLQotICAgIHR0X2ZhY2VfZ2V0X2tlcm5pbmcsCi0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMiAqLwotCi0gICAgdHRfZmFjZV9sb2FkX2ZvbnRfZGlyLAotICAgIHR0X2ZhY2VfbG9hZF9obXR4LAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0gICAgLyogc2VlIGB0dHNiaXQuaCcgYW5kIGBzZm50LmgnICovCi0gICAgdHRfZmFjZV9sb2FkX2VibGMsCi0gICAgdHRfZmFjZV9mcmVlX2VibGMsCi0KLSAgICB0dF9mYWNlX3NldF9zYml0X3N0cmlrZSwKLSAgICB0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MsCi0jZWxzZQotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0jZW5kaWYKLQotICAgIHR0X2ZhY2VfZ2V0X21ldHJpY3MKLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgIHNmbnRfbW9kdWxlX2NsYXNzID0KLSAgewotICAgIDAsICAvKiBub3QgYSBmb250IGRyaXZlciBvciByZW5kZXJlciAqLwotICAgIHNpemVvZiggRlRfTW9kdWxlUmVjICksCi0KLSAgICAic2ZudCIsICAgICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MTAwMDBMLCAgIC8qIGRyaXZlciB2ZXJzaW9uIDEuMCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyMDAwMEwsICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBoaWdoZXIgKi8KLQotICAgIChjb25zdCB2b2lkKikmc2ZudF9pbnRlcmZhY2UsICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKTAsCi0gICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSAwLAotICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgc2ZudF9nZXRfaW50ZXJmYWNlCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZmRyaXZlci5oIGIvc3JjL3NmbnQvc2Zkcml2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkYjc5Ni4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC9zZmRyaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2Zkcml2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgU0ZOVCBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU0ZEUklWRVJfSF9fCi0jZGVmaW5lIF9fU0ZEUklWRVJfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfRVhQT1JUX1ZBUiggY29uc3QgRlRfTW9kdWxlX0NsYXNzICkgIHNmbnRfbW9kdWxlX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fU0ZEUklWRVJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZmVycm9ycy5oIGIvc3JjL3NmbnQvc2ZlcnJvcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmOTBkZS4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC9zZmVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNGTlQgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDA0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBTRk5UIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1NGRVJST1JTX0hfXwotI2RlZmluZSBfX1NGRVJST1JTX0hfXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgU0ZOVF9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfU0ZOVAotCi0jZGVmaW5lIEZUX0tFRVBfRVJSX1BSRUZJWAotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogX19TRkVSUk9SU19IX18gKi8KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZm50LmMgYi9zcmMvc2ZudC9zZm50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YTgyMGIuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvc2ZudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZudC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNpbmdsZSBvYmplY3QgbGlicmFyeSBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRsb2FkLmMiCi0jaW5jbHVkZSAidHRtdHguYyIKLSNpbmNsdWRlICJ0dGNtYXAuYyIKLSNpbmNsdWRlICJ0dGtlcm4uYyIKLSNpbmNsdWRlICJzZm9ianMuYyIKLSNpbmNsdWRlICJzZmRyaXZlci5jIgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0jaW5jbHVkZSAidHRzYml0LmMiCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotI2luY2x1ZGUgInR0cG9zdC5jIgotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotI2luY2x1ZGUgInR0YmRmLmMiCi0jZW5kaWYKLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZm9ianMuYyBiL3NyYy9zZm50L3Nmb2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjViODdkLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3Nmb2Jqcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZm9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU0ZOVCBvYmplY3QgbWFuYWdlbWVudCAoYmFzZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInNmb2Jqcy5oIgotI2luY2x1ZGUgInR0bG9hZC5oIgotI2luY2x1ZGUgInR0Y21hcC5oIgotI2luY2x1ZGUgInR0a2Vybi5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotI2luY2x1ZGUgInR0YmRmLmgiCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3Nmb2JqcwotCi0KLQotICAvKiBjb252ZXJ0IGEgVVRGLTE2IG5hbWUgZW50cnkgdG8gQVNDSUkgKi8KLSAgc3RhdGljIEZUX1N0cmluZyoKLSAgdHRfbmFtZV9lbnRyeV9hc2NpaV9mcm9tX3V0ZjE2KCBUVF9OYW1lRW50cnkgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX1N0cmluZyogIHN0cmluZzsKLSAgICBGVF9VSW50ICAgICBsZW4sIGNvZGUsIG47Ci0gICAgRlRfQnl0ZSogICAgcmVhZCA9IChGVF9CeXRlKillbnRyeS0+c3RyaW5nOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0KLSAgICBsZW4gPSAoRlRfVUludCllbnRyeS0+c3RyaW5nTGVuZ3RoIC8gMjsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBzdHJpbmcsIGxlbiArIDEgKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgbGVuOyBuKysgKQotICAgIHsKLSAgICAgIGNvZGUgPSBGVF9ORVhUX1VTSE9SVCggcmVhZCApOwotICAgICAgaWYgKCBjb2RlIDwgMzIgfHwgY29kZSA+IDEyNyApCi0gICAgICAgIGNvZGUgPSAnPyc7Ci0KLSAgICAgIHN0cmluZ1tuXSA9IChjaGFyKWNvZGU7Ci0gICAgfQotCi0gICAgc3RyaW5nW2xlbl0gPSAwOwotCi0gICAgcmV0dXJuIHN0cmluZzsKLSAgfQotCi0KLSAgLyogY29udmVydCBhbiBBcHBsZSBSb21hbiBvciBzeW1ib2wgbmFtZSBlbnRyeSB0byBBU0NJSSAqLwotICBzdGF0aWMgRlRfU3RyaW5nKgotICB0dF9uYW1lX2VudHJ5X2FzY2lpX2Zyb21fb3RoZXIoIFRUX05hbWVFbnRyeSAgZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfU3RyaW5nKiAgc3RyaW5nOwotICAgIEZUX1VJbnQgICAgIGxlbiwgY29kZSwgbjsKLSAgICBGVF9CeXRlKiAgICByZWFkID0gKEZUX0J5dGUqKWVudHJ5LT5zdHJpbmc7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0KLQotICAgIGxlbiA9IChGVF9VSW50KWVudHJ5LT5zdHJpbmdMZW5ndGg7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggc3RyaW5nLCBsZW4gKyAxICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGxlbjsgbisrICkKLSAgICB7Ci0gICAgICBjb2RlID0gKnJlYWQrKzsKLSAgICAgIGlmICggY29kZSA8IDMyIHx8IGNvZGUgPiAxMjcgKQotICAgICAgICBjb2RlID0gJz8nOwotCi0gICAgICBzdHJpbmdbbl0gPSAoY2hhciljb2RlOwotICAgIH0KLQotICAgIHN0cmluZ1tsZW5dID0gMDsKLQotICAgIHJldHVybiBzdHJpbmc7Ci0gIH0KLQotCi0gIHR5cGVkZWYgRlRfU3RyaW5nKiAgKCpUVF9OYW1lRW50cnlfQ29udmVydEZ1bmMpKCBUVF9OYW1lRW50cnkgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZ2V0X25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybnMgYSBnaXZlbiBFTkdMSVNIIG5hbWUgcmVjb3JkIGluIEFTQ0lJLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZWlkIDo6IFRoZSBuYW1lIGlkIG9mIHRoZSBuYW1lIHJlY29yZCB0byByZXR1cm4uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2hhcmFjdGVyIHN0cmluZy4gIE5VTEwgaWYgbm8gbmFtZSBpcyBwcmVzZW50LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfU3RyaW5nKgotICB0dF9mYWNlX2dldF9uYW1lKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgbmFtZWlkICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgIEZUX1N0cmluZyogICAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgbjsKLSAgICBUVF9OYW1lRW50cnlSZWMqICByZWM7Ci0gICAgRlRfSW50ICAgICAgICAgICAgZm91bmRfYXBwbGUgICAgICAgICA9IC0xOwotICAgIEZUX0ludCAgICAgICAgICAgIGZvdW5kX2FwcGxlX3JvbWFuICAgPSAtMTsKLSAgICBGVF9JbnQgICAgICAgICAgICBmb3VuZF9hcHBsZV9lbmdsaXNoID0gLTE7Ci0gICAgRlRfSW50ICAgICAgICAgICAgZm91bmRfd2luICAgICAgICAgICA9IC0xOwotICAgIEZUX0ludCAgICAgICAgICAgIGZvdW5kX3VuaWNvZGUgICAgICAgPSAtMTsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgIGlzX2VuZ2xpc2ggPSAwOwotCi0gICAgVFRfTmFtZUVudHJ5X0NvbnZlcnRGdW5jICBjb252ZXJ0OwotCi0KLSAgICByZWMgPSBmYWNlLT5uYW1lX3RhYmxlLm5hbWVzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgZmFjZS0+bnVtX25hbWVzOyBuKyssIHJlYysrICkKLSAgICB7Ci0gICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIE9wZW5UeXBlIDEuMyBzcGVjaWZpY2F0aW9uLCBvbmx5IE1pY3Jvc29mdCBvciAgKi8KLSAgICAgIC8qIEFwcGxlIHBsYXRmb3JtIElEcyBtaWdodCBiZSB1c2VkIGluIHRoZSBgbmFtZScgdGFibGUuICBUaGUgICAgICAqLwotICAgICAgLyogYFVuaWNvZGUnIHBsYXRmb3JtIGlzIHJlc2VydmVkIGZvciB0aGUgYGNtYXAnIHRhYmxlLCBhbmQgdGhlICAgICovCi0gICAgICAvKiBgSXNvJyBvbmUgaXMgZGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogSG93ZXZlciwgdGhlIEFwcGxlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gZG9lc24ndCBzYXkgdGhlIHNhbWUgICovCi0gICAgICAvKiB0aGluZyBhbmQgZ29lcyB0byBzdWdnZXN0IHRoYXQgYWxsIFVuaWNvZGUgYG5hbWUnIHRhYmxlIGVudHJpZXMgKi8KLSAgICAgIC8qIHNob3VsZCBiZSBjb2RlZCBpbiBVVEYtMTYgKGluIGJpZy1lbmRpYW4gZm9ybWF0IEkgc3VwcG9zZSkuICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHJlYy0+bmFtZUlEID09IG5hbWVpZCAmJiByZWMtPnN0cmluZ0xlbmd0aCA+IDAgKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKCByZWMtPnBsYXRmb3JtSUQgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERToKLSAgICAgICAgY2FzZSBUVF9QTEFURk9STV9JU086Ci0gICAgICAgICAgLyogdGhlcmUgaXMgYGxhbmd1YWdlSUQnIHRvIGNoZWNrIHRoZXJlLiAgV2Ugc2hvdWxkIHVzZSB0aGlzICovCi0gICAgICAgICAgLyogZmllbGQgb25seSBhcyBhIGxhc3Qgc29sdXRpb24gd2hlbiBub3RoaW5nIGVsc2UgaXMgICAgICAgICovCi0gICAgICAgICAgLyogYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgZm91bmRfdW5pY29kZSA9IG47Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUVF9QTEFURk9STV9NQUNJTlRPU0g6Ci0gICAgICAgICAgLyogVGhpcyBpcyBhIGJpdCBzcGVjaWFsIGJlY2F1c2Ugc29tZSBmb250cyB3aWxsIHVzZSBlaXRoZXIgICAgKi8KLSAgICAgICAgICAvKiBhbiBFbmdsaXNoIGxhbmd1YWdlIGlkLCBvciBhIFJvbWFuIGVuY29kaW5nIGlkLCB0byBpbmRpY2F0ZSAqLwotICAgICAgICAgIC8qIHRoZSBFbmdsaXNoIHZlcnNpb24gb2YgaXRzIGZvbnQgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIHJlYy0+bGFuZ3VhZ2VJRCA9PSBUVF9NQUNfTEFOR0lEX0VOR0xJU0ggKQotICAgICAgICAgICAgZm91bmRfYXBwbGVfZW5nbGlzaCA9IG47Ci0gICAgICAgICAgZWxzZSBpZiAoIHJlYy0+ZW5jb2RpbmdJRCA9PSBUVF9NQUNfSURfUk9NQU4gKQotICAgICAgICAgICAgZm91bmRfYXBwbGVfcm9tYW4gPSBuOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVFRfUExBVEZPUk1fTUlDUk9TT0ZUOgotICAgICAgICAgIC8qIHdlIG9ubHkgdGFrZSBhIG5vbi1FbmdsaXNoIG5hbWUgd2hlbiB0aGVyZSBpcyBub3RoaW5nICovCi0gICAgICAgICAgLyogZWxzZSBhdmFpbGFibGUgaW4gdGhlIGZvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggZm91bmRfd2luID09IC0xIHx8ICggcmVjLT5sYW5ndWFnZUlEICYgMHgzRkYgKSA9PSAweDAwOSApCi0gICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICggcmVjLT5lbmNvZGluZ0lEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgVFRfTVNfSURfU1lNQk9MX0NTOgotICAgICAgICAgICAgY2FzZSBUVF9NU19JRF9VTklDT0RFX0NTOgotICAgICAgICAgICAgY2FzZSBUVF9NU19JRF9VQ1NfNDoKLSAgICAgICAgICAgICAgaXNfZW5nbGlzaCA9IEZUX0JPT0woICggcmVjLT5sYW5ndWFnZUlEICYgMHgzRkYgKSA9PSAweDAwOSApOwotICAgICAgICAgICAgICBmb3VuZF93aW4gID0gbjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3VuZF9hcHBsZSA9IGZvdW5kX2FwcGxlX3JvbWFuOwotICAgIGlmICggZm91bmRfYXBwbGVfZW5nbGlzaCA+PSAwICkKLSAgICAgIGZvdW5kX2FwcGxlID0gZm91bmRfYXBwbGVfZW5nbGlzaDsKLQotICAgIC8qIHNvbWUgZm9udHMgY29udGFpbiBpbnZhbGlkIFVuaWNvZGUgb3IgTWFjaW50b3NoIGZvcm1hdHRlZCBlbnRyaWVzOyAqLwotICAgIC8qIHdlIHdpbGwgdGh1cyBmYXZvciBuYW1lcyBlbmNvZGVkIGluIFdpbmRvd3MgZm9ybWF0cyBpZiBhdmFpbGFibGUgICAqLwotICAgIC8qIChwcm92aWRlZCBpdCBpcyBhbiBFbmdsaXNoIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGNvbnZlcnQgPSBOVUxMOwotICAgIGlmICggZm91bmRfd2luID49IDAgJiYgISggZm91bmRfYXBwbGUgPj0gMCAmJiAhaXNfZW5nbGlzaCApICkKLSAgICB7Ci0gICAgICByZWMgPSBmYWNlLT5uYW1lX3RhYmxlLm5hbWVzICsgZm91bmRfd2luOwotICAgICAgc3dpdGNoICggcmVjLT5lbmNvZGluZ0lEICkKLSAgICAgIHsKLSAgICAgICAgLyogYWxsIFVuaWNvZGUgc3RyaW5ncyBhcmUgZW5jb2RlZCB1c2luZyBVVEYtMTZCRSAqLwotICAgICAgY2FzZSBUVF9NU19JRF9VTklDT0RFX0NTOgotICAgICAgY2FzZSBUVF9NU19JRF9TWU1CT0xfQ1M6Ci0gICAgICAgIGNvbnZlcnQgPSB0dF9uYW1lX2VudHJ5X2FzY2lpX2Zyb21fdXRmMTY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRUX01TX0lEX1VDU180OgotICAgICAgICAvKiBBcHBhcmVudGx5LCBpZiB0aGlzIHZhbHVlIGlzIGZvdW5kIGluIGEgbmFtZSB0YWJsZSBlbnRyeSwgaXQgaXMgKi8KLSAgICAgICAgLyogZG9jdW1lbnRlZCBhcyBgZnVsbCBVbmljb2RlIHJlcGVydG9pcmUnLiAgRXhwZXJpZW5jZSB3aXRoIHRoZSAgICovCi0gICAgICAgIC8qIE1zR290aGljIGZvbnQgc2hpcHBlZCB3aXRoIFdpbmRvd3MgVmlzdGEgc2hvd3MgdGhhdCB0aGlzIHJlYWxseSAqLwotICAgICAgICAvKiBtZWFucyBVVEYtMTYgZW5jb2RlZCBuYW1lcyAoVUNTLTQgdmFsdWVzIGFyZSBvbmx5IHVzZWQgd2l0aGluICAgKi8KLSAgICAgICAgLyogY2hhcm1hcHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGNvbnZlcnQgPSB0dF9uYW1lX2VudHJ5X2FzY2lpX2Zyb21fdXRmMTY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCBmb3VuZF9hcHBsZSA+PSAwICkKLSAgICB7Ci0gICAgICByZWMgICAgID0gZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIGZvdW5kX2FwcGxlOwotICAgICAgY29udmVydCA9IHR0X25hbWVfZW50cnlfYXNjaWlfZnJvbV9vdGhlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGZvdW5kX3VuaWNvZGUgPj0gMCApCi0gICAgewotICAgICAgcmVjICAgICA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBmb3VuZF91bmljb2RlOwotICAgICAgY29udmVydCA9IHR0X25hbWVfZW50cnlfYXNjaWlfZnJvbV91dGYxNjsKLSAgICB9Ci0KLSAgICBpZiAoIHJlYyAmJiBjb252ZXJ0ICkKLSAgICB7Ci0gICAgICBpZiAoIHJlYy0+c3RyaW5nID09IE5VTEwgKQotICAgICAgewotICAgICAgICBGVF9FcnJvciAgIGVycm9yICA9IFNGTlRfRXJyX09rOwotICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPm5hbWVfdGFibGUuc3RyZWFtOwotCi0gICAgICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgICAgIGlmICggRlRfUU5FV19BUlJBWSAoIHJlYy0+c3RyaW5nLCByZWMtPnN0cmluZ0xlbmd0aCApIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1NFRUsoIHJlYy0+c3RyaW5nT2Zmc2V0ICkgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIHJlYy0+c3RyaW5nLCByZWMtPnN0cmluZ0xlbmd0aCApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0ZSRUUoIHJlYy0+c3RyaW5nICk7Ci0gICAgICAgICAgcmVjLT5zdHJpbmdMZW5ndGggPSAwOwotICAgICAgICAgIHJlc3VsdCAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gY29udmVydCggcmVjLCBtZW1vcnkgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgRlRfRW5jb2RpbmcKLSAgc2ZudF9maW5kX2VuY29kaW5nKCBpbnQgIHBsYXRmb3JtX2lkLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgZW5jb2RpbmdfaWQgKQotICB7Ci0gICAgdHlwZWRlZiBzdHJ1Y3QgIFRFbmNvZGluZ18KLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgcGxhdGZvcm1faWQ7Ci0gICAgICBpbnQgICAgICAgICAgZW5jb2RpbmdfaWQ7Ci0gICAgICBGVF9FbmNvZGluZyAgZW5jb2Rpbmc7Ci0KLSAgICB9IFRFbmNvZGluZzsKLQotICAgIHN0YXRpYwotICAgIGNvbnN0IFRFbmNvZGluZyAgdHRfZW5jb2RpbmdzW10gPQotICAgIHsKLSAgICAgIHsgVFRfUExBVEZPUk1fSVNPLCAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAgRlRfRU5DT0RJTkdfVU5JQ09ERSB9LAotCi0gICAgICB7IFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUsIC0xLCAgICAgICAgICAgICAgICAgIEZUX0VOQ09ESU5HX1VOSUNPREUgfSwKLQotICAgICAgeyBUVF9QTEFURk9STV9NQUNJTlRPU0gsICAgICBUVF9NQUNfSURfUk9NQU4sICAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTiB9LAotCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX1NZTUJPTF9DUywgIEZUX0VOQ09ESU5HX01TX1NZTUJPTCB9LAotICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICAgICBUVF9NU19JRF9VQ1NfNCwgICAgICBGVF9FTkNPRElOR19VTklDT0RFIH0sCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX1VOSUNPREVfQ1MsIEZUX0VOQ09ESU5HX1VOSUNPREUgfSwKLSAgICAgIHsgVFRfUExBVEZPUk1fTUlDUk9TT0ZULCAgICAgVFRfTVNfSURfU0pJUywgICAgICAgRlRfRU5DT0RJTkdfU0pJUyB9LAotICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICAgICBUVF9NU19JRF9HQjIzMTIsICAgICBGVF9FTkNPRElOR19HQjIzMTIgfSwKLSAgICAgIHsgVFRfUExBVEZPUk1fTUlDUk9TT0ZULCAgICAgVFRfTVNfSURfQklHXzUsICAgICAgRlRfRU5DT0RJTkdfQklHNSB9LAotICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICAgICBUVF9NU19JRF9XQU5TVU5HLCAgICBGVF9FTkNPRElOR19XQU5TVU5HIH0sCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX0pPSEFCLCAgICAgIEZUX0VOQ09ESU5HX0pPSEFCIH0KLSAgICB9OwotCi0gICAgY29uc3QgVEVuY29kaW5nICAqY3VyLCAqbGltaXQ7Ci0KLQotICAgIGN1ciAgID0gdHRfZW5jb2RpbmdzOwotICAgIGxpbWl0ID0gY3VyICsgc2l6ZW9mICggdHRfZW5jb2RpbmdzICkgLyBzaXplb2YgKCB0dF9lbmNvZGluZ3NbMF0gKTsKLQotICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICB7Ci0gICAgICBpZiAoIGN1ci0+cGxhdGZvcm1faWQgPT0gcGxhdGZvcm1faWQgKQotICAgICAgewotICAgICAgICBpZiAoIGN1ci0+ZW5jb2RpbmdfaWQgPT0gZW5jb2RpbmdfaWQgfHwKLSAgICAgICAgICAgICBjdXItPmVuY29kaW5nX2lkID09IC0xICAgICAgICAgICkKLSAgICAgICAgICByZXR1cm4gY3VyLT5lbmNvZGluZzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRU5DT0RJTkdfTk9ORTsKLSAgfQotCi0KLSAgLyogRmlsbCBpbiBmYWNlLT50dGNfaGVhZGVyLiAgSWYgdGhlIGZvbnQgaXMgbm90IGEgVFRDLCBpdCBpcyAqLwotICAvKiBzeW50aGVzaXplZCBpbnRvIGEgVFRDIHdpdGggb25lIG9mZnNldCB0YWJsZS4gICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBzZm50X29wZW5fZm9udCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBUVF9GYWNlICAgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1VMb25nICAgdGFnLCBvZmZzZXQ7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHR0Y19oZWFkZXJfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgVFRDX0hlYWRlclJlYwotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggOCApLAotICAgICAgICBGVF9GUkFNRV9MT05HKCB2ZXJzaW9uICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcoIGNvdW50ICAgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIGZhY2UtPnR0Y19oZWFkZXIudGFnICAgICA9IDA7Ci0gICAgZmFjZS0+dHRjX2hlYWRlci52ZXJzaW9uID0gMDsKLSAgICBmYWNlLT50dGNfaGVhZGVyLmNvdW50ICAgPSAwOwotCi0gICAgb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HKCB0YWcgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBpZiAoIHRhZyAhPSAweDAwMDEwMDAwVUwgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhZyAhPSBUVEFHX3R0Y2YgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhZyAhPSBGVF9NQUtFX1RBRyggJ08nLCAnVCcsICdUJywgJ08nICkgJiYKLSAgICAgICAgIHRhZyAhPSBUVEFHX3RydWUgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhZyAhPSAweDAwMDIwMDAwVUwgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgcmV0dXJuIFNGTlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQ7Ci0KLSAgICBmYWNlLT50dGNfaGVhZGVyLnRhZyA9IFRUQUdfdHRjZjsKLQotICAgIGlmICggdGFnID09IFRUQUdfdHRjZiApCi0gICAgewotICAgICAgRlRfSW50ICBuOwotCi0KLSAgICAgIEZUX1RSQUNFMygoICJzZm50X29wZW5fZm9udDogZmlsZSBpcyBhIGNvbGxlY3Rpb25cbiIgKSk7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCB0dGNfaGVhZGVyX2ZpZWxkcywgJmZhY2UtPnR0Y19oZWFkZXIgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgLyogbm93IHJlYWQgdGhlIG9mZnNldHMgb2YgZWFjaCBmb250IGluIHRoZSBmaWxlICovCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggZmFjZS0+dHRjX2hlYWRlci5vZmZzZXRzLCBmYWNlLT50dGNfaGVhZGVyLmNvdW50ICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGZhY2UtPnR0Y19oZWFkZXIuY291bnQgKiA0TCApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGZhY2UtPnR0Y19oZWFkZXIuY291bnQ7IG4rKyApCi0gICAgICAgIGZhY2UtPnR0Y19oZWFkZXIub2Zmc2V0c1tuXSA9IEZUX0dFVF9VTE9ORygpOwotCi0gICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9UUkFDRTMoKCAic2ZudF9vcGVuX2ZvbnQ6IHN5bnRoZXNpemUgVFRDXG4iICkpOwotCi0gICAgICBmYWNlLT50dGNfaGVhZGVyLnZlcnNpb24gPSAxIDw8IDE2OwotICAgICAgZmFjZS0+dHRjX2hlYWRlci5jb3VudCAgID0gMTsKLQotICAgICAgaWYgKCBGVF9ORVcoIGZhY2UtPnR0Y19oZWFkZXIub2Zmc2V0cykgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGZhY2UtPnR0Y19oZWFkZXIub2Zmc2V0c1swXSA9IG9mZnNldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBzZm50X2luaXRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKLSAgICBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSA9IGZhY2UtPnJvb3QuZHJpdmVyLT5yb290LmxpYnJhcnk7Ci0gICAgU0ZOVF9TZXJ2aWNlICAgIHNmbnQ7Ci0KLQotICAgIC8qIGZvciBub3csIHBhcmFtZXRlcnMgYXJlIHVudXNlZCAqLwotICAgIEZUX1VOVVNFRCggbnVtX3BhcmFtcyApOwotICAgIEZUX1VOVVNFRCggcGFyYW1zICk7Ci0KLQotICAgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0gICAgaWYgKCAhc2ZudCApCi0gICAgewotICAgICAgc2ZudCA9IChTRk5UX1NlcnZpY2UpRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoIGxpYnJhcnksICJzZm50IiApOwotICAgICAgaWYgKCAhc2ZudCApCi0gICAgICAgIHJldHVybiBTRk5UX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotCi0gICAgICBmYWNlLT5zZm50ICAgICAgID0gc2ZudDsKLSAgICAgIGZhY2UtPmdvdG9fdGFibGUgPSBzZm50LT5nb3RvX3RhYmxlOwotICAgIH0KLQotICAgIEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSggZmFjZSwgZmFjZS0+cHNuYW1lcywgUE9TVFNDUklQVF9DTUFQUyApOwotCi0gICAgZXJyb3IgPSBzZm50X29wZW5fZm9udCggc3RyZWFtLCBmYWNlICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBGVF9UUkFDRTIoKCAic2ZudF9pbml0X2ZhY2U6ICUwOHAsICVsZFxuIiwgZmFjZSwgZmFjZV9pbmRleCApKTsKLQotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgZmFjZV9pbmRleCA9IDA7Ci0KLSAgICBpZiAoIGZhY2VfaW5kZXggPj0gZmFjZS0+dHRjX2hlYWRlci5jb3VudCApCi0gICAgICAgIHJldHVybiBTRk5UX0Vycl9CYWRfQXJndW1lbnQ7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBmYWNlLT50dGNfaGVhZGVyLm9mZnNldHNbZmFjZV9pbmRleF0gKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYSB2YWxpZCBUcnVlVHlwZSBmaWxlICovCi0gICAgZXJyb3IgPSBzZm50LT5sb2FkX2ZvbnRfZGlyKCBmYWNlLCBzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGZhY2UtPnJvb3QubnVtX2ZhY2VzID0gZmFjZS0+dHRjX2hlYWRlci5jb3VudDsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNkZWZpbmUgTE9BRF8oIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVFJBQ0UyKCggImAiICN4ICInICIgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9UUkFDRTMoKCAiLS0+XG4iICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBzZm50LT5sb2FkXyMjeCggZmFjZSwgc3RyZWFtICk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMigoICIlc1xuIiwgKCAhZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICA/ICJsb2FkZWQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIDogKCBlcnJvciA9PSBTRk5UX0Vycl9UYWJsZV9NaXNzaW5nICkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJtaXNzaW5nIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogImZhaWxlZCB0byBsb2FkIiApKTsgICAgICAgICAgICAgIFwKLSAgICBGVF9UUkFDRTMoKCAiXG4iICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICggMCApCi0KLSNkZWZpbmUgTE9BRE1fKCB4LCB2ZXJ0aWNhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVFJBQ0UyKCggImAlcyIgI3ggIicgIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICB2ZXJ0aWNhbCA/ICJ2ZXJ0aWNhbCAiIDogIiIgKSk7ICAgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMygoICItLT5cbiIgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlcnJvciA9IHNmbnQtPmxvYWRfIyN4KCBmYWNlLCBzdHJlYW0sIHZlcnRpY2FsICk7ICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVFJBQ0UyKCggIiVzXG4iLCAoICFlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gImxvYWRlZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgOiAoIGVycm9yID09IFNGTlRfRXJyX1RhYmxlX01pc3NpbmcgKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gIm1pc3NpbmciICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiZmFpbGVkIHRvIGxvYWQiICkpOyAgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMygoICJcbiIgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKCAwICkKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBzZm50X2xvYWRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3IsIHBzbmFtZXNfZXJyb3I7Ci0gICAgRlRfQm9vbCAgICAgICBoYXNfb3V0bGluZTsKLSAgICBGVF9Cb29sICAgICAgIGlzX2FwcGxlX3NiaXQ7Ci0KLSAgICBTRk5UX1NlcnZpY2UgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0KLSAgICBGVF9VTlVTRUQoIGZhY2VfaW5kZXggKTsKLSAgICBGVF9VTlVTRUQoIG51bV9wYXJhbXMgKTsKLSAgICBGVF9VTlVTRUQoIHBhcmFtcyApOwotCi0KLSAgICAvKiBMb2FkIHRhYmxlcyAqLwotCi0gICAgLyogV2Ugbm93IHN1cHBvcnQgdHdvIFNGTlQtYmFzZWQgYml0bWFwcGVkIGZvbnQgZm9ybWF0cy4gIFRoZXkgKi8KLSAgICAvKiBhcmUgcmVjb2duaXplZCBlYXNpbHkgYXMgdGhleSBkbyBub3QgaW5jbHVkZSBhIGBnbHlmJyAgICAgICAqLwotICAgIC8qIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGUgZmlyc3QgZm9ybWF0IGNvbWVzIGZyb20gQXBwbGUsIGFuZCB1c2VzIGEgdGFibGUgbmFtZWQgICAqLwotICAgIC8qIGBiaGVkJyBpbnN0ZWFkIG9mIGBoZWFkJyB0byBzdG9yZSB0aGUgZm9udCBoZWFkZXIgKHVzaW5nICAgICovCi0gICAgLyogdGhlIHNhbWUgZm9ybWF0KS4gIEl0IGFsc28gZG9lc24ndCBpbmNsdWRlIGhvcml6b250YWwgYW5kICAgKi8KLSAgICAvKiB2ZXJ0aWNhbCBtZXRyaWNzIHRhYmxlcyAoaS5lLiBgaGhlYScgYW5kIGB2aGVhJyB0YWJsZXMgYXJlICAqLwotICAgIC8qIG1pc3NpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGUgb3RoZXIgZm9ybWF0IGNvbWVzIGZyb20gTWljcm9zb2Z0LCBhbmQgaXMgdXNlZCB3aXRoICAgICAqLwotICAgIC8qIFdpbkNFL1BvY2tldFBDLiAgSXQgbG9va3MgbGlrZSBhIHN0YW5kYXJkIFRURiwgZXhjZXB0IHRoYXQgICovCi0gICAgLyogaXQgZG9lc24ndCBjb250YWluIG91dGxpbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfVFJBQ0UyKCggInNmbnRfbG9hZF9mYWNlOiAlMDhwXG5cbiIsIGZhY2UgKSk7Ci0KLSAgICAvKiBkbyB3ZSBoYXZlIG91dGxpbmVzIGluIHRoZXJlPyAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBoYXNfb3V0bGluZSAgID0gRlRfQk9PTCggZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfZ2x5ZiApICAgICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfQ0ZGICkgICAgICE9IDAgKTsKLSNlbHNlCi0gICAgaGFzX291dGxpbmUgICA9IEZUX0JPT0woIHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCBUVEFHX2dseWYgKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCBUVEFHX0NGRiApICAhPSAwICk7Ci0jZW5kaWYKLQotICAgIGlzX2FwcGxlX3NiaXQgPSAwOwotCi0gICAgLyogaWYgdGhpcyBmb250IGRvZXNuJ3QgY29udGFpbiBvdXRsaW5lcywgd2UgdHJ5IHRvIGxvYWQgKi8KLSAgICAvKiBhIGBiaGVkJyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWhhc19vdXRsaW5lICYmIHNmbnQtPmxvYWRfYmhlZCApCi0gICAgewotICAgICAgTE9BRF8oIGJoZWQgKTsKLSAgICAgIGlzX2FwcGxlX3NiaXQgPSBGVF9CT09MKCAhZXJyb3IgKTsKLSAgICB9Ci0KLSAgICAvKiBsb2FkIHRoZSBmb250IGhlYWRlciAoYGhlYWQnIHRhYmxlKSBpZiB0aGlzIGlzbid0IGFuIEFwcGxlICovCi0gICAgLyogc2JpdCBmb250IGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWlzX2FwcGxlX3NiaXQgKQotICAgIHsKLSAgICAgIExPQURfKCBoZWFkICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTSA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFNGTlRfRXJyX0ludmFsaWRfVGFibGU7Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiB0aGUgZm9sbG93aW5nIHRhYmxlcyBhcmUgb2Z0ZW4gbm90IHByZXNlbnQgaW4gZW1iZWRkZWQgVHJ1ZVR5cGUgKi8KLSAgICAvKiBmb250cyB3aXRoaW4gUERGIGRvY3VtZW50cywgc28gZG9uJ3QgY2hlY2sgZm9yIHRoZW0uICAgICAgICAgICAgKi8KLSAgICBMT0FEXyggbWF4cCApOwotICAgIExPQURfKCBjbWFwICk7Ci0KLSAgICAvKiB0aGUgZm9sbG93aW5nIHRhYmxlcyBhcmUgb3B0aW9uYWwgaW4gUENMIGZvbnRzIC0tICovCi0gICAgLyogZG9uJ3QgY2hlY2sgZm9yIGVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExPQURfKCBuYW1lICk7Ci0gICAgTE9BRF8oIHBvc3QgKTsKLSAgICBwc25hbWVzX2Vycm9yID0gZXJyb3I7Ci0KLSAgICAvKiBkbyBub3QgbG9hZCB0aGUgbWV0cmljcyBoZWFkZXJzIGFuZCB0YWJsZXMgaWYgdGhpcyBpcyBhbiBBcHBsZSAqLwotICAgIC8qIHNiaXQgZm9udCBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAhaXNfYXBwbGVfc2JpdCApCi0gICAgewotICAgICAgLyogbG9hZCB0aGUgYGhoZWEnIGFuZCBgaG10eCcgdGFibGVzICovCi0gICAgICBMT0FETV8oIGhoZWEsIDAgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgTE9BRE1fKCBobXR4LCAwICk7Ci0gICAgICAgIGlmICggZXJyb3IgPT0gU0ZOVF9FcnJfVGFibGVfTWlzc2luZyApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IFNGTlRfRXJyX0htdHhfVGFibGVfTWlzc2luZzsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAgICAgICAvKiBJZiB0aGlzIGlzIGFuIGluY3JlbWVudGFsbHkgbG9hZGVkIGZvbnQgYW5kIHRoZXJlIGFyZSAqLwotICAgICAgICAgIC8qIG92ZXJyaWRpbmcgbWV0cmljcywgdG9sZXJhdGUgYSBtaXNzaW5nIGBobXR4JyB0YWJsZS4gICovCi0gICAgICAgICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPgotICAgICAgICAgICAgICAgICBnZXRfZ2x5cGhfbWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLm51bWJlcl9PZl9ITWV0cmljcyA9IDA7Ci0gICAgICAgICAgICBlcnJvciA9IFNGTlRfRXJyX09rOwotICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZXJyb3IgPT0gU0ZOVF9FcnJfVGFibGVfTWlzc2luZyApCi0gICAgICB7Ci0gICAgICAgIC8qIE5vIGBoaGVhJyB0YWJsZSBuZWNlc3NhcnkgZm9yIFNGTlQgTWFjIGZvbnRzLiAqLwotICAgICAgICBpZiAoIGZhY2UtPmZvcm1hdF90YWcgPT0gVFRBR190cnVlICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJUaGlzIGlzIGFuIFNGTlQgTWFjIGZvbnQuXG4iICkpOwotICAgICAgICAgIGhhc19vdXRsaW5lID0gMDsKLSAgICAgICAgICBlcnJvciA9IFNGTlRfRXJyX09rOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gU0ZOVF9FcnJfSG9yaXpfSGVhZGVyX01pc3Npbmc7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgICAgICAgLyogSWYgdGhpcyBpcyBhbiBpbmNyZW1lbnRhbGx5IGxvYWRlZCBmb250IGFuZCB0aGVyZSBhcmUgKi8KLSAgICAgICAgICAvKiBvdmVycmlkaW5nIG1ldHJpY3MsIHRvbGVyYXRlIGEgbWlzc2luZyBgaGhlYScgdGFibGUuICAqLwotICAgICAgICAgIGlmICggZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT4KLSAgICAgICAgICAgICAgICAgZ2V0X2dseXBoX21ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5udW1iZXJfT2ZfSE1ldHJpY3MgPSAwOwotICAgICAgICAgICAgZXJyb3IgPSBTRk5UX0Vycl9PazsKLSAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIHRyeSB0byBsb2FkIHRoZSBgdmhlYScgYW5kIGB2bXR4JyB0YWJsZXMgKi8KLSAgICAgIExPQURNXyggaGhlYSwgMSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBMT0FETV8oIGhtdHgsIDEgKTsKLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgIGZhY2UtPnZlcnRpY2FsX2luZm8gPSAxOwotICAgICAgfQotCi0gICAgICBpZiAoIGVycm9yICYmIGVycm9yICE9IFNGTlRfRXJyX1RhYmxlX01pc3NpbmcgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIExPQURfKCBvczIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBpZiAoIGVycm9yICE9IFNGTlRfRXJyX1RhYmxlX01pc3NpbmcgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmYWNlLT5vczIudmVyc2lvbiA9IDB4RkZGRlU7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiB0aGUgb3B0aW9uYWwgdGFibGVzICovCi0KLSAgICAvKiBlbWJlZGRlZCBiaXRtYXAgc3VwcG9ydC4gKi8KLSAgICBpZiAoIHNmbnQtPmxvYWRfZWJsYyApCi0gICAgewotICAgICAgTE9BRF8oIGVibGMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICAvKiByZXR1cm4gYW4gZXJyb3IgaWYgdGhpcyBmb250IGZpbGUgaGFzIG5vIG91dGxpbmVzICovCi0gICAgICAgIGlmICggZXJyb3IgPT0gU0ZOVF9FcnJfVGFibGVfTWlzc2luZyAmJiBoYXNfb3V0bGluZSApCi0gICAgICAgICAgZXJyb3IgPSBTRk5UX0Vycl9PazsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBMT0FEXyggcGNsdCApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggZXJyb3IgIT0gU0ZOVF9FcnJfVGFibGVfTWlzc2luZyApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZmFjZS0+cGNsdC5WZXJzaW9uID0gMDsKLSAgICB9Ci0KLSAgICAvKiBjb25zaWRlciB0aGUga2VybmluZyBhbmQgZ2FzcCB0YWJsZXMgYXMgb3B0aW9uYWwgKi8KLSAgICBMT0FEXyggZ2FzcCApOwotICAgIExPQURfKCBrZXJuICk7Ci0KLSAgICBlcnJvciA9IFNGTlRfRXJyX09rOwotCi0gICAgZmFjZS0+cm9vdC5udW1fZ2x5cGhzID0gZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzOwotCi0jaWYgMAotICAgIC8qIEJpdCA4IG9mIHRoZSBgZnNTZWxlY3Rpb24nIGZpZWxkIGluIHRoZSBgT1MvMicgdGFibGUgZGVub3RlcyAgKi8KLSAgICAvKiBhIFdXUy1vbmx5IGZvbnQgZmFjZS4gIGBXV1MnIHN0YW5kcyBmb3IgYHdlaWdodCcsIHdpZHRoJywgYW5kICovCi0gICAgLyogYHNsb3BlJywgYSB0ZXJtIHVzZWQgYnkgTWljcm9zb2Z0J3MgV2luZG93cyBQcmVzZW50YXRpb24gICAgICAqLwotICAgIC8qIEZvdW5kYXRpb24gKFdQRikuICBUaGlzIGZsYWcgd2lsbCBiZSBpbnRyb2R1Y2VkIGluIHZlcnNpb24gICAgKi8KLSAgICAvKiAxLjUgb2YgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gKGJ1dCBpcyBhbHJlYWR5IGluIHVzZSkuICAgICovCi0KLSAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgJiYgZmFjZS0+b3MyLmZzU2VsZWN0aW9uICYgMjU2ICkKLSNlbmRpZgotICAgIHsKLSAgICAgIGZhY2UtPnJvb3QuZmFtaWx5X25hbWUgPQotICAgICAgICB0dF9mYWNlX2dldF9uYW1lKCBmYWNlLCBUVF9OQU1FX0lEX1BSRUZFUlJFRF9GQU1JTFkgKTsKLSAgICAgIGlmICggIWZhY2UtPnJvb3QuZmFtaWx5X25hbWUgKQotICAgICAgICBmYWNlLT5yb290LmZhbWlseV9uYW1lID0KLSAgICAgICAgICB0dF9mYWNlX2dldF9uYW1lKCBmYWNlLCBUVF9OQU1FX0lEX0ZPTlRfRkFNSUxZICk7Ci0KLSAgICAgIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSA9Ci0gICAgICAgIHR0X2ZhY2VfZ2V0X25hbWUoIGZhY2UsIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWSApOwotICAgICAgaWYgKCAhZmFjZS0+cm9vdC5zdHlsZV9uYW1lICkKLSAgICAgICAgZmFjZS0+cm9vdC5zdHlsZV9uYW1lID0KLSAgICAgICAgICB0dF9mYWNlX2dldF9uYW1lKCBmYWNlLCBUVF9OQU1FX0lEX0ZPTlRfU1VCRkFNSUxZICk7Ci0gICAgfQotI2lmIDAKLSAgICBlbHNlCi0gICAgewotICAgICAgLyogU3VwcG9ydCBmb3IgYG5hbWUnIHRhYmxlIElEIDIxIChXV1MgZmFtaWx5KSBhbmQgMjIgKFdXUyAgKi8KLSAgICAgIC8qIHN1YmZhbWlseSkgaXMgc3RpbGwgdW5kZXIgY29uc2lkZXJhdGlvbiBieSBNaWNyb3NvZnQgYW5kICovCi0gICAgICAvKiBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBXUEYuICAgICAgICAgICAqLwotCi0gICAgICBmYWNlLT5yb290LmZhbWlseV9uYW1lID0KLSAgICAgICAgdHRfZmFjZV9nZXRfbmFtZSggZmFjZSwgVFRfTkFNRV9JRF9XV1NfRkFNSUxZICk7Ci0gICAgICBpZiAoICFmYWNlLT5yb290LmZhbWlseV9uYW1lICkKLSAgICAgICAgZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSA9Ci0gICAgICAgICAgdHRfZmFjZV9nZXRfbmFtZSggZmFjZSwgVFRfTkFNRV9JRF9QUkVGRVJSRURfRkFNSUxZICk7Ci0gICAgICBpZiAoICFmYWNlLT5yb290LmZhbWlseV9uYW1lICkKLSAgICAgICAgZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSA9Ci0gICAgICAgICAgdHRfZmFjZV9nZXRfbmFtZSggZmFjZSwgVFRfTkFNRV9JRF9GT05UX0ZBTUlMWSApOwotCi0gICAgICBmYWNlLT5yb290LnN0eWxlX25hbWUgPQotICAgICAgICB0dF9mYWNlX2dldF9uYW1lKCBmYWNlLCBUVF9OQU1FX0lEX1dXU19TVUJGQU1JTFkgKTsKLSAgICAgIGlmICggIWZhY2UtPnJvb3Quc3R5bGVfbmFtZSApCi0gICAgICAgIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSA9Ci0gICAgICAgICAgdHRfZmFjZV9nZXRfbmFtZSggZmFjZSwgVFRfTkFNRV9JRF9QUkVGRVJSRURfU1VCRkFNSUxZICk7Ci0gICAgICBpZiAoICFmYWNlLT5yb290LnN0eWxlX25hbWUgKQotICAgICAgICBmYWNlLT5yb290LnN0eWxlX25hbWUgPQotICAgICAgICAgIHR0X2ZhY2VfZ2V0X25hbWUoIGZhY2UsIFRUX05BTUVfSURfRk9OVF9TVUJGQU1JTFkgKTsKLSAgICB9Ci0jZW5kaWYKLQotCi0gICAgLyogbm93IHNldCB1cCByb290IGZpZWxkcyAqLwotICAgIHsKLSAgICAgIEZUX0ZhY2UgICByb290ICA9ICZmYWNlLT5yb290OwotICAgICAgRlRfSW50MzIgIGZsYWdzID0gcm9vdC0+ZmFjZV9mbGFnczsKLQotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIENvbXB1dGUgZmFjZSBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBoYXNfb3V0bGluZSA9PSBUUlVFICkKLSAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1NDQUxBQkxFOyAgIC8qIHNjYWxhYmxlIG91dGxpbmVzICovCi0KLSAgICAgIC8qIFRoZSBzZm50IGRyaXZlciBvbmx5IHN1cHBvcnRzIGJpdG1hcCBmb250cyBuYXRpdmVseSwgdGh1cyB3ZSAqLwotICAgICAgLyogZG9uJ3Qgc2V0IEZUX0ZBQ0VfRkxBR19ISU5URVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfU0ZOVCAgICAgICB8ICAvKiBTRk5UIGZpbGUgZm9ybWF0ICAqLwotICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUw7ICAgLyogaG9yaXpvbnRhbCBkYXRhICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICAgICAgaWYgKCBwc25hbWVzX2Vycm9yID09IFNGTlRfRXJyX09rICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlICE9IDB4MDAwMzAwMDBMICkKLSAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTOwotI2VuZGlmCi0KLSAgICAgIC8qIGZpeGVkIHdpZHRoIGZvbnQ/ICovCi0gICAgICBpZiAoIGZhY2UtPnBvc3RzY3JpcHQuaXNGaXhlZFBpdGNoICkKLSAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIOwotCi0gICAgICAvKiB2ZXJ0aWNhbCBpbmZvcm1hdGlvbj8gKi8KLSAgICAgIGlmICggZmFjZS0+dmVydGljYWxfaW5mbyApCi0gICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19WRVJUSUNBTDsKLQotICAgICAgLyoga2VybmluZyBhdmFpbGFibGUgPyAqLwotICAgICAgaWYgKCBUVF9GQUNFX0hBU19LRVJOSU5HKCBmYWNlICkgKQotICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfS0VSTklORzsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICAgIC8qIERvbid0IGJvdGhlciB0byBsb2FkIHRoZSB0YWJsZXMgdW5sZXNzIHNvbWVib2R5IGFza3MgZm9yIHRoZW0uICovCi0gICAgICAvKiBObyBuZWVkIHRvIGRvIHdvcmsgd2hpY2ggd2lsbCAocHJvYmFibHkpIG5vdCBiZSB1c2VkLiAgICAgICAgICAqLwotICAgICAgaWYgKCB0dF9mYWNlX2xvb2t1cF90YWJsZSggZmFjZSwgVFRBR19nbHlmICkgIT0gMCAmJgotICAgICAgICAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSggZmFjZSwgVFRBR19mdmFyICkgIT0gMCAmJgotICAgICAgICAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSggZmFjZSwgVFRBR19ndmFyICkgIT0gMCApCi0gICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTOwotI2VuZGlmCi0KLSAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgPSBmbGFnczsKLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBDb21wdXRlIHN0eWxlIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKCBoYXNfb3V0bGluZSA9PSBUUlVFICYmIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgKQotICAgICAgewotICAgICAgICAvKiBXZSBoYXZlIGFuIE9TLzIgdGFibGU7IHVzZSB0aGUgYGZzU2VsZWN0aW9uJyBmaWVsZC4gIEJpdCA5ICAgKi8KLSAgICAgICAgLyogaW5kaWNhdGVzIGFuIG9ibGlxdWUgZm9udCBmYWNlLiAgVGhpcyBmbGFnIHdpbGwgYmUgICAgICAgICAgICovCi0gICAgICAgIC8qIGludHJvZHVjZWQgaW4gdmVyc2lvbiAxLjUgb2YgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gKGJ1dCAqLwotICAgICAgICAvKiBpcyBhbHJlYWR5IGluIHVzZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBpZiAoIGZhY2UtPm9zMi5mc1NlbGVjdGlvbiAmIDUxMiApICAgICAgIC8qIGJpdCA5ICovCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0gICAgICAgIGVsc2UgaWYgKCBmYWNlLT5vczIuZnNTZWxlY3Rpb24gJiAxICkgICAgLyogYml0IDAgKi8KLSAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0lUQUxJQzsKLQotICAgICAgICBpZiAoIGZhY2UtPm9zMi5mc1NlbGVjdGlvbiAmIDMyICkgICAgICAgIC8qIGJpdCA1ICovCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiB0aGlzIGlzIGFuIG9sZCBNYWMgZm9udCwgdXNlIHRoZSBoZWFkZXIgZmllbGQgKi8KLSAgICAgICAgaWYgKCBmYWNlLT5oZWFkZXIuTWFjX1N0eWxlICYgMSApCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotCi0gICAgICAgIGlmICggZmFjZS0+aGVhZGVyLk1hY19TdHlsZSAmIDIgKQotICAgICAgICAgIGZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfSVRBTElDOwotICAgICAgfQotCi0gICAgICByb290LT5zdHlsZV9mbGFncyA9IGZsYWdzOwotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFBvbGlzaCB0aGUgY2hhcm1hcHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICBUcnkgdG8gc2V0IHRoZSBjaGFybWFwIGVuY29kaW5nIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0gJiAgICAgKi8KLSAgICAgIC8qICAgZW5jb2RpbmcgSUQgb2YgZWFjaCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICB0dF9mYWNlX2J1aWxkX2NtYXBzKCBmYWNlICk7ICAvKiBpZ25vcmUgZXJyb3JzICovCi0KLQotICAgICAgLyogc2V0IHRoZSBlbmNvZGluZyBmaWVsZHMgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICBtOwotCi0KLSAgICAgICAgZm9yICggbSA9IDA7IG0gPCByb290LT5udW1fY2hhcm1hcHM7IG0rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9DaGFyTWFwICBjaGFybWFwID0gcm9vdC0+Y2hhcm1hcHNbbV07Ci0KLQotICAgICAgICAgIGNoYXJtYXAtPmVuY29kaW5nID0gc2ZudF9maW5kX2VuY29kaW5nKCBjaGFybWFwLT5wbGF0Zm9ybV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcm1hcC0+ZW5jb2RpbmdfaWQgKTsKLQotI2lmIDAKLSAgICAgICAgICBpZiAoIHJvb3QtPmNoYXJtYXAgICAgID09IE5VTEwgJiYKLSAgICAgICAgICAgICAgIGNoYXJtYXAtPmVuY29kaW5nID09IEZUX0VOQ09ESU5HX1VOSUNPREUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHNldCAncm9vdC0+Y2hhcm1hcCcgdG8gdGhlIGZpcnN0IFVuaWNvZGUgZW5jb2Rpbmcgd2UgZmluZCAqLwotICAgICAgICAgICAgcm9vdC0+Y2hhcm1hcCA9IGNoYXJtYXA7Ci0gICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICBTZXQgdXAgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBoYXNfb3V0bGluZSA9PSBUUlVFICkKLSAgICAgIHsKLSAgICAgICAgLyogWFhYIFdoYXQgYWJvdXQgaWYgb3V0bGluZSBoZWFkZXIgaXMgbWlzc2luZyAqLwotICAgICAgICAvKiAgICAgKGUuZy4gc2ZudCB3cmFwcGVkIGJpdG1hcCk/ICAgICAgICAgICAgICovCi0gICAgICAgIHJvb3QtPmJib3gueE1pbiAgICA9IGZhY2UtPmhlYWRlci54TWluOwotICAgICAgICByb290LT5iYm94LnlNaW4gICAgPSBmYWNlLT5oZWFkZXIueU1pbjsKLSAgICAgICAgcm9vdC0+YmJveC54TWF4ICAgID0gZmFjZS0+aGVhZGVyLnhNYXg7Ci0gICAgICAgIHJvb3QtPmJib3gueU1heCAgICA9IGZhY2UtPmhlYWRlci55TWF4OwotICAgICAgICByb290LT51bml0c19wZXJfRU0gPSBmYWNlLT5oZWFkZXIuVW5pdHNfUGVyX0VNOwotCi0KLSAgICAgICAgLyogWFhYOiBDb21wdXRpbmcgdGhlIGFzY2VuZGVyL2Rlc2NlbmRlci9oZWlnaHQgaXMgdmVyeSBkaWZmZXJlbnQgKi8KLSAgICAgICAgLyogICAgICBmcm9tIHdoYXQgdGhlIHNwZWNpZmljYXRpb24gdGVsbHMgeW91LiAgQXBwYXJlbnRseSwgd2UgICAgKi8KLSAgICAgICAgLyogICAgICBtdXN0IGJlIGNhcmVmdWwgYmVjYXVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAtIG5vdCBhbGwgZm9udHMgaGF2ZSBhbiBPUy8yIHRhYmxlOyBpbiB0aGlzIGNhc2UsIHdlIHRha2UgKi8KLSAgICAgICAgLyogICAgICAgIHRoZSB2YWx1ZXMgaW4gdGhlIGhvcml6b250YWwgaGVhZGVyLiAgSG93ZXZlciwgdGhlc2UgICAgKi8KLSAgICAgICAgLyogICAgICAgIHZhbHVlcyB2ZXJ5IG9mdGVuIGFyZSBub3QgcmVsaWFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAtIG90aGVyd2lzZSwgdGhlIGNvcnJlY3QgdHlwb2dyYXBoaWMgdmFsdWVzIGFyZSBpbiB0aGUgICAgKi8KLSAgICAgICAgLyogICAgICAgIHNUeXBvQXNjZW5kZXIsIHNUeXBvRGVzY2VuZGVyICYgc1R5cG9MaW5lR2FwIGZpZWxkcy4gICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgIEhvd2V2ZXIsIGNlcnRhaW4gZm9udHMgaGF2ZSB0aGVzZSBmaWVsZHMgc2V0IHRvIDAuICAgICAgKi8KLSAgICAgICAgLyogICAgICAgIFJhdGhlciwgdGhleSBoYXZlIHVzV2luQXNjZW50ICYgdXNXaW5EZXNjZW50IGNvcnJlY3RseSAgKi8KLSAgICAgICAgLyogICAgICAgIHNldCAoYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlcykuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICBBcyBhbiBleGFtcGxlLCBBcmlhbCBOYXJyb3cgaXMgaW1wbGVtZW50ZWQgdGhyb3VnaCBmb3VyICAgKi8KLSAgICAgICAgLyogICAgICBmaWxlcyBBUklBTE4uVFRGLCBBUklBTE5JLlRURiwgQVJJQUxOQi5UVEYgJiBBUklBTE5CSS5UVEYgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICBTdHJhbmdlbHksIGFsbCBmb250cyBoYXZlIHRoZSBzYW1lIHZhbHVlcyBpbiB0aGVpciAgICAgICAgKi8KLSAgICAgICAgLyogICAgICBzVHlwb1hYWCBmaWVsZHMsIGV4Y2VwdCBBUklBTE5CIHdoaWNoIHNldHMgdGhlbSB0byAwLiAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgdGhleSBhbGwgaGF2ZSBkaWZmZXJlbnQgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICB1c1dpbkFzY2VudC9EZXNjZW50IHZhbHVlcyAtLSBhcyBhIGNvbmNsdXNpb24sIHRoZSBPUy8yICAgKi8KLSAgICAgICAgLyogICAgICB0YWJsZSBjYW5ub3QgYmUgdXNlZCB0byBjb21wdXRlIHRoZSB0ZXh0IGhlaWdodCByZWxpYWJseSEgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAvKiBUaGUgYXNjZW5kZXIvZGVzY2VuZGVyL2hlaWdodCBhcmUgY29tcHV0ZWQgZnJvbSB0aGUgT1MvMiB0YWJsZSAqLwotICAgICAgICAvKiB3aGVuIGZvdW5kLiAgT3RoZXJ3aXNlLCB0aGV5J3JlIHRha2VuIGZyb20gdGhlIGhvcml6b250YWwgICAgICAqLwotICAgICAgICAvKiBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIHJvb3QtPmFzY2VuZGVyICA9IGZhY2UtPmhvcml6b250YWwuQXNjZW5kZXI7Ci0gICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyOwotCi0gICAgICAgIHJvb3QtPmhlaWdodCAgICA9IChGVF9TaG9ydCkoIHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5MaW5lX0dhcCApOwotCi0jaWYgMAotICAgICAgICAvKiBpZiB0aGUgbGluZV9nYXAgaXMgMCwgd2UgYWRkIGFuIGV4dHJhIDE1JSB0byB0aGUgdGV4dCBoZWlnaHQgLS0gICovCi0gICAgICAgIC8qIHRoaXMgY29tcHV0YXRpb24gaXMgYmFzZWQgb24gdmFyaW91cyB2ZXJzaW9ucyBvZiBUaW1lcyBOZXcgUm9tYW4gKi8KLSAgICAgICAgaWYgKCBmYWNlLT5ob3Jpem9udGFsLkxpbmVfR2FwID09IDAgKQotICAgICAgICAgIHJvb3QtPmhlaWdodCA9IChGVF9TaG9ydCkoICggcm9vdC0+aGVpZ2h0ICogMTE1ICsgNTAgKSAvIDEwMCApOwotI2VuZGlmCi0KLSNpZiAwCi0KLSAgICAgICAgLyogc29tZSBmb250cyBoYXZlIHRoZSBPUy8yICJzVHlwb0FzY2VuZGVyIiwgInNUeXBvRGVzY2VuZGVyIiAmICovCi0gICAgICAgIC8qICJzVHlwb0xpbmVHYXAiIGZpZWxkcyBzZXQgdG8gMCwgbGlrZSBBUklBTE5CLlRURiAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgJiYgcm9vdC0+YXNjZW5kZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBoZWlnaHQ7Ci0KLQotICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9ICBmYWNlLT5vczIuc1R5cG9Bc2NlbmRlcjsKLSAgICAgICAgICByb290LT5kZXNjZW5kZXIgPSAtZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyOwotCi0gICAgICAgICAgaGVpZ2h0ID0gcm9vdC0+YXNjZW5kZXIgKyByb290LT5kZXNjZW5kZXIgKyBmYWNlLT5vczIuc1R5cG9MaW5lR2FwOwotICAgICAgICAgIGlmICggaGVpZ2h0ID4gcm9vdC0+aGVpZ2h0ICkKLSAgICAgICAgICAgIHJvb3QtPmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgfQotCi0jZW5kaWYgLyogMCAqLwotCi0gICAgICAgIHJvb3QtPm1heF9hZHZhbmNlX3dpZHRoICAgPSBmYWNlLT5ob3Jpem9udGFsLmFkdmFuY2VfV2lkdGhfTWF4OwotCi0gICAgICAgIHJvb3QtPm1heF9hZHZhbmNlX2hlaWdodCAgPSAoRlRfU2hvcnQpKCBmYWNlLT52ZXJ0aWNhbF9pbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZS0+dmVydGljYWwuYWR2YW5jZV9IZWlnaHRfTWF4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcm9vdC0+aGVpZ2h0ICk7Ci0KLSAgICAgICAgcm9vdC0+dW5kZXJsaW5lX3Bvc2l0aW9uICA9IGZhY2UtPnBvc3RzY3JpcHQudW5kZXJsaW5lUG9zaXRpb247Ci0gICAgICAgIHJvb3QtPnVuZGVybGluZV90aGlja25lc3MgPSBmYWNlLT5wb3N0c2NyaXB0LnVuZGVybGluZVRoaWNrbmVzczsKLSAgICAgIH0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0gICAgICAvKgotICAgICAgICogIE5vdyBhbGxvY2F0ZSB0aGUgcm9vdCBhcnJheSBvZiBGVF9CaXRtYXBfU2l6ZSByZWNvcmRzIGFuZAotICAgICAgICogIHBvcHVsYXRlIHRoZW0uICBVbmZvcnR1bmF0ZWx5LCBpdCBpc24ndCBwb3NzaWJsZSB0byBpbmRpY2F0ZSBiaXQKLSAgICAgICAqICBkZXB0aHMgaW4gdGhlIEZUX0JpdG1hcF9TaXplIHJlY29yZC4gIFRoaXMgaXMgYSBkZXNpZ24gZXJyb3IuCi0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgaSwgY291bnQ7Ci0KLQotI2lmICFkZWZpbmVkIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotICAgICAgICBjb3VudCA9IGZhY2UtPnNiaXRfbnVtX3N0cmlrZXM7Ci0jZWxzZQotICAgICAgICBjb3VudCA9IChGVF9VSW50KWZhY2UtPm51bV9zYml0X3N0cmlrZXM7Ci0jZW5kaWYKLQotICAgICAgICBpZiAoIGNvdW50ID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSAgID0gZmFjZS0+cm9vdC5zdHJlYW0tPm1lbW9yeTsKLSAgICAgICAgICBGVF9VU2hvcnQgICAgICAgIGVtX3NpemUgID0gZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTTsKLSAgICAgICAgICBGVF9TaG9ydCAgICAgICAgIGF2Z3dpZHRoID0gZmFjZS0+b3MyLnhBdmdDaGFyV2lkdGg7Ci0gICAgICAgICAgRlRfU2l6ZV9NZXRyaWNzICBtZXRyaWNzOwotCi0KLSAgICAgICAgICBpZiAoIGVtX3NpemUgPT0gMCB8fCBmYWNlLT5vczIudmVyc2lvbiA9PSAweEZGRkZVICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdmd3aWR0aCA9IDA7Ci0gICAgICAgICAgICBlbV9zaXplID0gMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggcm9vdC0+YXZhaWxhYmxlX3NpemVzLCBjb3VudCApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfQml0bWFwX1NpemUqICBic2l6ZSA9IHJvb3QtPmF2YWlsYWJsZV9zaXplcyArIGk7Ci0KLQotICAgICAgICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX3N0cmlrZV9tZXRyaWNzKCBmYWNlLCBpLCAmbWV0cmljcyApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgICAgYnNpemUtPmhlaWdodCA9IChGVF9TaG9ydCkoIG1ldHJpY3MuaGVpZ2h0ID4+IDYgKTsKLSAgICAgICAgICAgIGJzaXplLT53aWR0aCA9IChGVF9TaG9ydCkoCi0gICAgICAgICAgICAgICAgKCBhdmd3aWR0aCAqIG1ldHJpY3MueF9wcGVtICsgZW1fc2l6ZSAvIDIgKSAvIGVtX3NpemUgKTsKLQotICAgICAgICAgICAgYnNpemUtPnhfcHBlbSA9IG1ldHJpY3MueF9wcGVtIDw8IDY7Ci0gICAgICAgICAgICBic2l6ZS0+eV9wcGVtID0gbWV0cmljcy55X3BwZW0gPDwgNjsKLQotICAgICAgICAgICAgLyogYXNzdW1lIDcyZHBpICovCi0gICAgICAgICAgICBic2l6ZS0+c2l6ZSAgID0gbWV0cmljcy55X3BwZW0gPDwgNjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByb290LT5mYWNlX2ZsYWdzICAgICB8PSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVM7Ci0gICAgICAgICAgcm9vdC0+bnVtX2ZpeGVkX3NpemVzID0gKEZUX0ludCljb3VudDsKLSAgICAgICAgfQotICAgICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBGVF9UUkFDRTIoKCAic2ZudF9sb2FkX2ZhY2U6IGRvbmVcbiIgKSk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jdW5kZWYgTE9BRF8KLSN1bmRlZiBMT0FETV8KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHNmbnRfZG9uZV9mYWNlKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgU0ZOVF9TZXJ2aWNlICBzZm50ICAgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0KLQotICAgIGlmICggc2ZudCApCi0gICAgewotICAgICAgLyogZGVzdHJveSB0aGUgcG9zdHNjcmlwdCBuYW1lcyB0YWJsZSBpZiBpdCBpcyBsb2FkZWQgKi8KLSAgICAgIGlmICggc2ZudC0+ZnJlZV9wc25hbWVzICkKLSAgICAgICAgc2ZudC0+ZnJlZV9wc25hbWVzKCBmYWNlICk7Ci0KLSAgICAgIC8qIGRlc3Ryb3kgdGhlIGVtYmVkZGVkIGJpdG1hcHMgdGFibGUgaWYgaXQgaXMgbG9hZGVkICovCi0gICAgICBpZiAoIHNmbnQtPmZyZWVfZWJsYyApCi0gICAgICAgIHNmbnQtPmZyZWVfZWJsYyggZmFjZSApOwotICAgIH0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0gICAgLyogZnJlZWluZyB0aGUgZW1iZWRkZWQgQkRGIHByb3BlcnRpZXMgKi8KLSAgICB0dF9mYWNlX2ZyZWVfYmRmX3Byb3BzKCBmYWNlICk7Ci0jZW5kaWYKLQotICAgIC8qIGZyZWVpbmcgdGhlIGtlcm5pbmcgdGFibGUgKi8KLSAgICB0dF9mYWNlX2RvbmVfa2VybiggZmFjZSApOwotCi0gICAgLyogZnJlZWluZyB0aGUgY29sbGVjdGlvbiB0YWJsZSAqLwotICAgIEZUX0ZSRUUoIGZhY2UtPnR0Y19oZWFkZXIub2Zmc2V0cyApOwotICAgIGZhY2UtPnR0Y19oZWFkZXIuY291bnQgPSAwOwotCi0gICAgLyogZnJlZWluZyB0YWJsZSBkaXJlY3RvcnkgKi8KLSAgICBGVF9GUkVFKCBmYWNlLT5kaXJfdGFibGVzICk7Ci0gICAgZmFjZS0+bnVtX3RhYmxlcyA9IDA7Ci0KLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IEZUX0ZBQ0VfU1RSRUFNKCBmYWNlICk7Ci0KLQotICAgICAgLyogc2ltcGx5IHJlbGVhc2UgdGhlICdjbWFwJyB0YWJsZSBmcmFtZSAqLwotICAgICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+Y21hcF90YWJsZSApOwotICAgICAgZmFjZS0+Y21hcF9zaXplID0gMDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSBob3Jpem9udGFsIG1ldHJpY3MgKi8KLSNpZiAhZGVmaW5lZCBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IEZUX0ZBQ0VfU1RSRUFNKCBmYWNlICk7Ci0KLQotICAgICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+aG9yel9tZXRyaWNzICk7Ci0gICAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT52ZXJ0X21ldHJpY3MgKTsKLSAgICAgIGZhY2UtPmhvcnpfbWV0cmljc19zaXplID0gMDsKLSAgICAgIGZhY2UtPnZlcnRfbWV0cmljc19zaXplID0gMDsKLSAgICB9Ci0jZWxzZQotICAgIEZUX0ZSRUUoIGZhY2UtPmhvcml6b250YWwubG9uZ19tZXRyaWNzICk7Ci0gICAgRlRfRlJFRSggZmFjZS0+aG9yaXpvbnRhbC5zaG9ydF9tZXRyaWNzICk7Ci0jZW5kaWYKLQotICAgIC8qIGZyZWVpbmcgdGhlIHZlcnRpY2FsIG9uZXMsIGlmIGFueSAqLwotICAgIGlmICggZmFjZS0+dmVydGljYWxfaW5mbyApCi0gICAgewotICAgICAgRlRfRlJFRSggZmFjZS0+dmVydGljYWwubG9uZ19tZXRyaWNzICApOwotICAgICAgRlRfRlJFRSggZmFjZS0+dmVydGljYWwuc2hvcnRfbWV0cmljcyApOwotICAgICAgZmFjZS0+dmVydGljYWxfaW5mbyA9IDA7Ci0gICAgfQotCi0gICAgLyogZnJlZWluZyB0aGUgZ2FzcCB0YWJsZSAqLwotICAgIEZUX0ZSRUUoIGZhY2UtPmdhc3AuZ2FzcFJhbmdlcyApOwotICAgIGZhY2UtPmdhc3AubnVtUmFuZ2VzID0gMDsKLQotICAgIC8qIGZyZWVpbmcgdGhlIG5hbWUgdGFibGUgKi8KLSAgICBpZiAoIHNmbnQgKQotICAgICAgc2ZudC0+ZnJlZV9uYW1lKCBmYWNlICk7Ci0KLSAgICAvKiBmcmVlaW5nIGZhbWlseSBhbmQgc3R5bGUgbmFtZSAqLwotICAgIEZUX0ZSRUUoIGZhY2UtPnJvb3QuZmFtaWx5X25hbWUgKTsKLSAgICBGVF9GUkVFKCBmYWNlLT5yb290LnN0eWxlX25hbWUgKTsKLQotICAgIC8qIGZyZWVpbmcgc2JpdCBzaXplIHRhYmxlICovCi0gICAgRlRfRlJFRSggZmFjZS0+cm9vdC5hdmFpbGFibGVfc2l6ZXMgKTsKLSAgICBmYWNlLT5yb290Lm51bV9maXhlZF9zaXplcyA9IDA7Ci0KLSAgICBGVF9GUkVFKCBmYWNlLT5wb3N0c2NyaXB0X25hbWUgKTsKLQotICAgIGZhY2UtPnNmbnQgPSAwOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZm9ianMuaCBiL3NyYy9zZm50L3Nmb2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQxYzkzLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3Nmb2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZvYmpzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNGTlQgb2JqZWN0IG1hbmFnZW1lbnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU0ZPQkpTX0hfXwotI2RlZmluZSBfX1NGT0JKU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBzZm50X2luaXRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgc2ZudF9sb2FkX2ZhY2UoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgc2ZudF9kb25lX2ZhY2UoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1NGRFJJVkVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRiZGYuYyBiL3NyYy9zZm50L3R0YmRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOTUzODcuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRiZGYuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGJkZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIEJERiBwcm9wZXJ0aWVzIChib2R5KS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgInR0YmRmLmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0YmRmCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfYmRmX3Byb3BzKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIFRUX0JERiAgYmRmID0gJmZhY2UtPmJkZjsKLQotCi0gICAgaWYgKCBiZGYtPmxvYWRlZCApCi0gICAgewotICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBGVF9GQUNFKGZhY2UpLT5zdHJlYW07Ci0KLQotICAgICAgaWYgKCBiZGYtPnRhYmxlICE9IE5VTEwgKQotICAgICAgICBGVF9GUkFNRV9SRUxFQVNFKCBiZGYtPnRhYmxlICk7Ci0KLSAgICAgIGJkZi0+dGFibGVfZW5kICAgID0gTlVMTDsKLSAgICAgIGJkZi0+c3RyaW5ncyAgICAgID0gTlVMTDsKLSAgICAgIGJkZi0+c3RyaW5nc19zaXplID0gMDsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9mYWNlX2xvYWRfYmRmX3Byb3BzKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIFRUX0JERiAgICBiZGYgPSAmZmFjZS0+YmRmOwotICAgIEZUX1VMb25nICBsZW5ndGg7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBGVF9aRVJPKCBiZGYgKTsKLQotICAgIGVycm9yID0gdHRfZmFjZV9nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX0JERiwgc3RyZWFtLCAmbGVuZ3RoICk7Ci0gICAgaWYgKCBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgbGVuZ3RoIDwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VYVFJBQ1QoIGxlbmd0aCwgYmRmLT50YWJsZSApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9JbnZhbGlkX1RhYmxlOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGJkZi0+dGFibGVfZW5kID0gYmRmLT50YWJsZSArIGxlbmd0aDsKLQotICAgIHsKLSAgICAgIEZUX0J5dGUqICAgcCAgICAgICAgICAgPSBiZGYtPnRhYmxlOwotICAgICAgRlRfVUludCAgICB2ZXJzaW9uICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBGVF9VSW50ICAgIG51bV9zdHJpa2VzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQzMiAgc3RyaW5ncyAgICAgPSBGVF9ORVhUX1VMT05HICggcCApOwotICAgICAgRlRfVUludCAgICBjb3VudDsKLSAgICAgIEZUX0J5dGUqICAgc3RyaWtlOwotCi0KLSAgICAgIGlmICggdmVyc2lvbiAhPSAweDAwMDEgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHN0cmluZ3MgPCA4ICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAoIHN0cmluZ3MgLSA4ICkgLyA0IDwgbnVtX3N0cmlrZXMgfHwKLSAgICAgICAgICAgc3RyaW5ncyArIDEgPiBsZW5ndGggICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgZ290byBCYWRUYWJsZTsKLSAgICAgIH0KLQotICAgICAgYmRmLT5udW1fc3RyaWtlcyAgPSBudW1fc3RyaWtlczsKLSAgICAgIGJkZi0+c3RyaW5ncyAgICAgID0gYmRmLT50YWJsZSArIHN0cmluZ3M7Ci0gICAgICBiZGYtPnN0cmluZ3Nfc2l6ZSA9IGxlbmd0aCAtIHN0cmluZ3M7Ci0KLSAgICAgIGNvdW50ICA9IGJkZi0+bnVtX3N0cmlrZXM7Ci0gICAgICBwICAgICAgPSBiZGYtPnRhYmxlICsgODsKLSAgICAgIHN0cmlrZSA9IHAgKyBjb3VudCAqIDQ7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBudW1faXRlbXMgPSBGVF9QRUVLX1VTSE9SVCggcCArIDIgKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWUgc2V0cyB0aGVtc2VsdmVzLCBzaW5jZSB0aGlzCi0gICAgICAgICAqICBpcyBkb25lIGxhdGVyLgotICAgICAgICAgKi8KLSAgICAgICAgc3RyaWtlICs9IDEwICogbnVtX2l0ZW1zOwotCi0gICAgICAgIHAgKz0gNDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBzdHJpa2UgPiBiZGYtPnN0cmluZ3MgKQotICAgICAgICBnb3RvIEJhZFRhYmxlOwotICAgIH0KLQotICAgIGJkZi0+bG9hZGVkID0gMTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBCYWRUYWJsZToKLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBiZGYtPnRhYmxlICk7Ci0gICAgRlRfWkVSTyggYmRmICk7Ci0gICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9UYWJsZTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2ZpbmRfYmRmX3Byb3AoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgICAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBCREZfUHJvcGVydHlSZWMgICphcHJvcCApCi0gIHsKLSAgICBUVF9CREYgICAgYmRmICAgPSAmZmFjZS0+YmRmOwotICAgIEZUX1NpemUgICBzaXplICA9IEZUX0ZBQ0UoZmFjZSktPnNpemU7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gMDsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VSW50ICAgY291bnQ7Ci0gICAgRlRfQnl0ZSogIHN0cmlrZTsKLSAgICBGVF9VSW50ICAgcHJvcGVydHlfbGVuOwotCi0KLSAgICBhcHJvcC0+dHlwZSA9IEJERl9QUk9QRVJUWV9UWVBFX05PTkU7Ci0KLSAgICBpZiAoIGJkZi0+bG9hZGVkID09IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gdHRfZmFjZV9sb2FkX2JkZl9wcm9wcyggZmFjZSwgRlRfRkFDRSggZmFjZSApLT5zdHJlYW0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgY291bnQgID0gYmRmLT5udW1fc3RyaWtlczsKLSAgICBwICAgICAgPSBiZGYtPnRhYmxlICsgODsKLSAgICBzdHJpa2UgPSBwICsgNCAqIGNvdW50OwotCi0gICAgZXJyb3IgPSBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIGlmICggc2l6ZSA9PSBOVUxMIHx8IHByb3BlcnR5X25hbWUgPT0gTlVMTCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBwcm9wZXJ0eV9sZW4gPSBmdF9zdHJsZW4oIHByb3BlcnR5X25hbWUgKTsKLSAgICBpZiAoIHByb3BlcnR5X2xlbiA9PSAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBfcHBlbSAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgRlRfVUludCAgX2NvdW50ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBfcHBlbSA9PSBzaXplLT5tZXRyaWNzLnlfcHBlbSApCi0gICAgICB7Ci0gICAgICAgIGNvdW50ID0gX2NvdW50OwotICAgICAgICBnb3RvIEZvdW5kU3RyaWtlOwotICAgICAgfQotCi0gICAgICBzdHJpa2UgKz0gMTAgKiBfY291bnQ7Ci0gICAgfQotICAgIGdvdG8gRXhpdDsKLQotICBGb3VuZFN0cmlrZToKLSAgICBwID0gc3RyaWtlOwotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICB0eXBlID0gRlRfUEVFS19VU0hPUlQoIHAgKyA0ICk7Ci0KLSAgICAgIGlmICggKCB0eXBlICYgMHgxMCApICE9IDAgKQotICAgICAgewotICAgICAgICBGVF9VSW50MzIgIG5hbWVfb2Zmc2V0ID0gRlRfUEVFS19VTE9ORyggcCAgICAgKTsKLSAgICAgICAgRlRfVUludDMyICB2YWx1ZSAgICAgICA9IEZUX1BFRUtfVUxPTkcoIHAgKyA2ICk7Ci0KLSAgICAgICAgLyogYmUgYSBiaXQgcGFyYW5vaWQgZm9yIGludmFsaWQgZW50cmllcyBoZXJlICovCi0gICAgICAgIGlmICggbmFtZV9vZmZzZXQgPCBiZGYtPnN0cmluZ3Nfc2l6ZSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBwcm9wZXJ0eV9sZW4gPCBiZGYtPnN0cmluZ3Nfc2l6ZSAtIG5hbWVfb2Zmc2V0ICAgICAmJgotICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWJkZi0+c3RyaW5ncyArIG5hbWVfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJkZi0+c3RyaW5nc19zaXplIC0gbmFtZV9vZmZzZXQgKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCAoIHR5cGUgJiAweDBGICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSAweDAwOiAgLyogc3RyaW5nICovCi0gICAgICAgICAgY2FzZSAweDAxOiAgLyogYXRvbXMgKi8KLSAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGNvbnRlbnQgaXMgcmVhbGx5IDAtdGVybWluYXRlZCAqLwotICAgICAgICAgICAgaWYgKCB2YWx1ZSA8IGJkZi0+c3RyaW5nc19zaXplICYmCi0gICAgICAgICAgICAgICAgIGZ0X21lbWNociggYmRmLT5zdHJpbmdzICsgdmFsdWUsIDAsIGJkZi0+c3RyaW5nc19zaXplICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhcHJvcC0+dHlwZSAgID0gQkRGX1BST1BFUlRZX1RZUEVfQVRPTTsKLSAgICAgICAgICAgICAgYXByb3AtPnUuYXRvbSA9IChjb25zdCBjaGFyKiliZGYtPnN0cmluZ3MgKyB2YWx1ZTsKLSAgICAgICAgICAgICAgZXJyb3IgICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAweDAyOgotICAgICAgICAgICAgYXByb3AtPnR5cGUgICAgICA9IEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVI7Ci0gICAgICAgICAgICBhcHJvcC0+dS5pbnRlZ2VyID0gKEZUX0ludDMyKXZhbHVlOwotICAgICAgICAgICAgZXJyb3IgICAgICAgICAgICA9IDA7Ci0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBjYXNlIDB4MDM6Ci0gICAgICAgICAgICBhcHJvcC0+dHlwZSAgICAgICA9IEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMOwotICAgICAgICAgICAgYXByb3AtPnUuY2FyZGluYWwgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVycm9yICAgICAgICAgICAgID0gMDsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwICs9IDEwOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9CREYgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0YmRmLmggYi9zcmMvc2ZudC90dGJkZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGExMGQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3R0YmRmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIEJERiBwcm9wZXJ0aWVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVEJERl9IX18KLSNkZWZpbmUgX19UVEJERl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJ0dGxvYWQuaCIKLSNpbmNsdWRlIEZUX0JERl9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9iZGZfcHJvcHMoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZmluZF9iZGZfcHJvcCggVFRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJERl9Qcm9wZXJ0eVJlYyAgKmFwcm9wICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVEJERl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0Y21hcC5jIGIvc3JjL3NmbnQvdHRjbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MGI2NGMuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRjbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Y21hcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSAoY21hcCkgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIiAgICAgICAgICAgLyogbXVzdCBjb21lIGJlZm9yZSBGVF9JTlRFUk5BTF9WQUxJREFURV9IICovCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSAidHRsb2FkLmgiCi0jaW5jbHVkZSAidHRjbWFwLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dGNtYXAKLQotCi0jZGVmaW5lIFRUX1BFRUtfU0hPUlQgICBGVF9QRUVLX1NIT1JUCi0jZGVmaW5lIFRUX1BFRUtfVVNIT1JUICBGVF9QRUVLX1VTSE9SVAotI2RlZmluZSBUVF9QRUVLX1VJTlQyNCAgRlRfUEVFS19VT0ZGMwotI2RlZmluZSBUVF9QRUVLX0xPTkcgICAgRlRfUEVFS19MT05HCi0jZGVmaW5lIFRUX1BFRUtfVUxPTkcgICBGVF9QRUVLX1VMT05HCi0KLSNkZWZpbmUgVFRfTkVYVF9TSE9SVCAgIEZUX05FWFRfU0hPUlQKLSNkZWZpbmUgVFRfTkVYVF9VU0hPUlQgIEZUX05FWFRfVVNIT1JUCi0jZGVmaW5lIFRUX05FWFRfVUlOVDI0ICBGVF9ORVhUX1VPRkYzCi0jZGVmaW5lIFRUX05FWFRfTE9ORyAgICBGVF9ORVhUX0xPTkcKLSNkZWZpbmUgVFRfTkVYVF9VTE9ORyAgIEZUX05FWFRfVUxPTkcKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwX2luaXQoIFRUX0NNYXAgICBjbWFwLAotICAgICAgICAgICAgICAgIEZUX0J5dGUqICB0YWJsZSApCi0gIHsKLSAgICBjbWFwLT5kYXRhID0gdGFibGU7Ci0gICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgICAgVFlQRSAgICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAwICAgICAgICAgICAgICBVU0hPUlQgICAgICAgIG11c3QgYmUgMCAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgMiAgICAgICAgICAgICAgVVNIT1JUICAgICAgICB0YWJsZSBsZW5ndGggaW4gYnl0ZXMgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDQgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgICAgICAgKi8KLSAgLyogICBnbHlwaF9pZHMgICA2ICAgICAgICAgICAgICBCWVRFWzI1Nl0gICAgIGFycmF5IG9mIGdseXBoIGluZGljZXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgMjYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8wCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAwX3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCAgICAgID0gdGFibGUgKyAyOwotICAgIEZUX1VJbnQgICBsZW5ndGggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICBpZiAoIHRhYmxlICsgbGVuZ3RoID4gdmFsaWQtPmxpbWl0IHx8IGxlbmd0aCA8IDI2MiApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIGNoZWNrIGdseXBoIGluZGljZXMgd2hlbmV2ZXIgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIG4sIGlkeDsKLQotCi0gICAgICBwID0gdGFibGUgKyA2OwotICAgICAgZm9yICggbiA9IDA7IG4gPCAyNTY7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIGlkeCA9ICpwKys7Ci0gICAgICAgIGlmICggaWR4ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDBfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgdGFibGUgPSBjbWFwLT5kYXRhOwotCi0KLSAgICByZXR1cm4gY2hhcl9jb2RlIDwgMjU2ID8gdGFibGVbNiArIGNoYXJfY29kZV0gOiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwMF9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgID0gY21hcC0+ZGF0YTsKLSAgICBGVF9VSW50MzIgIGNoYXJjb2RlID0gKnBjaGFyX2NvZGU7Ci0gICAgRlRfVUludDMyICByZXN1bHQgICA9IDA7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICA9IDA7Ci0KLQotICAgIHRhYmxlICs9IDY7ICAvKiBnbyB0byBnbHlwaCBpZHMgKi8KLSAgICB3aGlsZSAoICsrY2hhcmNvZGUgPCAyNTYgKQotICAgIHsKLSAgICAgIGdpbmRleCA9IHRhYmxlW2NoYXJjb2RlXTsKLSAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjaGFyY29kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgKnBjaGFyX2NvZGUgPSByZXN1bHQ7Ci0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAwX2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA0OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCA9IDA7Ci0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IChGVF9VTG9uZylUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgVFRfQ01hcF9DbGFzc1JlYyAgdHRfY21hcDBfY2xhc3NfcmVjID0KLSAgewotICAgIHsKLSAgICAgIHNpemVvZiAoIFRUX0NNYXBSZWMgKSwKLQotICAgICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwX2luaXQsCi0gICAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsCi0gICAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXR0X2NtYXAwX2NoYXJfaW5kZXgsCi0gICAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXAwX2NoYXJfbmV4dCwKLQotICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICAgIH0sCi0gICAgMCwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpICAgdHRfY21hcDBfdmFsaWRhdGUsCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKSAgIHR0X2NtYXAwX2dldF9pbmZvCi0gIH07Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogVGhpcyBpcyB1c2VkIGZvciBjZXJ0YWluIENKSyBlbmNvZGluZ3MgdGhhdCBlbmNvZGUgdGV4dCBpbiBhICAqKioqKi8KLSAgLyoqKioqIG1peGVkIDgvMTYgYml0cyBlbmNvZGluZyBhbG9uZyB0aGUgZm9sbG93aW5nIGxpbmVzOiAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogKiBDZXJ0YWluIGJ5dGUgdmFsdWVzIGNvcnJlc3BvbmQgdG8gYW4gOC1iaXQgY2hhcmFjdGVyIGNvZGUgICAqKioqKi8KLSAgLyoqKioqICAgKHR5cGljYWxseSBpbiB0aGUgcmFuZ2UgMC4uMTI3IGZvciBBU0NJSSBjb21wYXRpYmlsaXR5KS4gICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogKiBDZXJ0YWluIGJ5dGUgdmFsdWVzIHNpZ25hbCB0aGUgZmlyc3QgYnl0ZSBvZiBhIDItYnl0ZSAgICAgICAqKioqKi8KLSAgLyoqKioqICAgY2hhcmFjdGVyIGNvZGUgKGJ1dCB0aGVzZSB2YWx1ZXMgYXJlIGFsc28gdmFsaWQgYXMgdGhlICAgICAgKioqKiovCi0gIC8qKioqKiAgIHNlY29uZCBieXRlIG9mIGEgMi1ieXRlIGNoYXJhY3RlcikuICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqIFRoZSBmb2xsb3dpbmcgY2hhcm1hcCBsb29rdXAgYW5kIGl0ZXJhdGlvbiBmdW5jdGlvbnMgYWxsICAgICAgKioqKiovCi0gIC8qKioqKiBhc3N1bWUgdGhhdCB0aGUgdmFsdWUgImNoYXJjb2RlIiBjb3JyZXNwb25kIHRvIGZvbGxvd2luZzogICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgLSBGb3Igb25lIGJ5dGUgY2hhcmFjdGVycywgImNoYXJjb2RlIiBpcyBzaW1wbHkgdGhlICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgLSBGb3IgdHdvIGJ5dGUgY2hhcmFjdGVycywgImNoYXJjb2RlIiBpcyB0aGUgMi1ieXRlICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgY2hhcmFjdGVyIGNvZGUgaW4gYmlnIGVuZGlhbiBmb3JtYXQuICBNb3JlIGV4YWN0bHk6ICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgIChjaGFyY29kZSA+PiA4KSAgICBpcyB0aGUgZmlyc3QgYnl0ZSB2YWx1ZSAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAoY2hhcmNvZGUgJiAweEZGKSAgaXMgdGhlIHNlY29uZCBieXRlIHZhbHVlICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqIE5vdGUgdGhhdCBub3QgYWxsIHZhbHVlcyBvZiAiY2hhcmNvZGUiIGFyZSB2YWxpZCBhY2NvcmRpbmcgICAgKioqKiovCi0gIC8qKioqKiB0byB0aGVzZSBydWxlcywgYW5kIHRoZSBmdW5jdGlvbiBtb2RlcmF0ZWx5IGNoZWNrIHRoZSAgICAgICAgICoqKioqLwotICAvKioqKiogYXJndW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgICAgVFlQRSAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAwICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgbXVzdCBiZSAyICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgMiAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgIHRhYmxlIGxlbmd0aCBpbiBieXRlcyAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDQgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBNYWMgbGFuZ3VhZ2UgY29kZSAgICAgICAgKi8KLSAgLyogICBrZXlzICAgICAgICA2ICAgICAgICAgICAgICBVU0hPUlRbMjU2XSAgICAgc3ViLWhlYWRlciBrZXlzICAgICAgICAgICovCi0gIC8qICAgc3VicyAgICAgICAgNTE4ICAgICAgICAgICAgU1VCSEVBRFtOU1VCU10gIHN1Yi1oZWFkZXJzIGFycmF5ICAgICAgICAqLwotICAvKiAgIGdseXBoX2lkcyAgIDUxOCtOU1VCKjggICAgIFVTSE9SVFtdICAgICAgICBnbHlwaCBpZCBhcnJheSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBga2V5cycgdGFibGUgaXMgdXNlZCB0byBtYXAgY2hhcmNvZGUgaGlnaC1ieXRlcyB0byBzdWItaGVhZGVycy4gICAqLwotICAvKiBUaGUgdmFsdWUgb2YgYE5TVUJTJyBpcyB0aGUgbnVtYmVyIG9mIHN1Yi1oZWFkZXJzIGRlZmluZWQgaW4gdGhlICAgICAgKi8KLSAgLyogdGFibGUgYW5kIGlzIGNvbXB1dGVkIGJ5IGZpbmRpbmcgdGhlIG1heGltdW0gb2YgdGhlIGBrZXlzJyB0YWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgZm9yIGFueSBuLCBga2V5c1tuXScgaXMgYSBieXRlIG9mZnNldCB3aXRoaW4gdGhlIGBzdWJzJyAgICAgKi8KLSAgLyogdGFibGUsIGkuZS4sIGl0IGlzIHRoZSBjb3JyZXNwb25kaW5nIHN1Yi1oZWFkZXIgaW5kZXggbXVsdGlwbGllZCAgICAgICovCi0gIC8qIGJ5IDguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRWFjaCBzdWItaGVhZGVyIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgIFRZUEUgICAgICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZmlyc3QgICAgICAgMCAgICAgICAgICAgVVNIT1JUICAgICAgICAgIGZpcnN0IHZhbGlkIGxvdy1ieXRlICAgICAgICAqLwotICAvKiAgIGNvdW50ICAgICAgIDIgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBudW1iZXIgb2YgdmFsaWQgbG93LWJ5dGVzICAgKi8KLSAgLyogICBkZWx0YSAgICAgICA0ICAgICAgICAgICBTSE9SVCAgICAgICAgICAgc2VlIGJlbG93ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgb2Zmc2V0ICAgICAgNiAgICAgICAgICAgVVNIT1JUICAgICAgICAgIHNlZSBiZWxvdyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBzdWItaGVhZGVyIGRlZmluZXMsIGZvciBlYWNoIGhpZ2gtYnl0ZSwgdGhlIHJhbmdlIG9mIHZhbGlkICAgICAgICAgICovCi0gIC8qIGxvdy1ieXRlcyB3aXRoaW4gdGhlIGNoYXJtYXAuICBOb3RlIHRoYXQgdGhlIHJhbmdlIGRlZmluZWQgYnkgYGZpcnN0JyAqLwotICAvKiBhbmQgYGNvdW50JyBtdXN0IGJlIGNvbXBsZXRlbHkgaW5jbHVkZWQgaW4gdGhlIGludGVydmFsIFswLi4yNTVdICAgICAgKi8KLSAgLyogYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBhIGNoYXJhY3RlciBjb2RlIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBnaXZlbiBzdWItaGVhZGVyLCB0aGVuICAgICAgKi8KLSAgLyogbWFwcGluZyBpdCB0byBhIGdseXBoIGluZGV4IGlzIGRvbmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAqIFRoZSB2YWx1ZSBvZiBgb2Zmc2V0JyBpcyByZWFkLiAgVGhpcyBpcyBhIF9ieXRlXyBkaXN0YW5jZSBmcm9tIHRoZSAgKi8KLSAgLyogICBsb2NhdGlvbiBvZiB0aGUgYG9mZnNldCcgZmllbGQgaXRzZWxmIGludG8gYSBzbGljZSBvZiB0aGUgICAgICAgICAgICovCi0gIC8qICAgYGdseXBoX2lkcycgdGFibGUuICBMZXQncyBjYWxsIGl0IGBzbGljZScgKGl0J3MgYSBVU0hPUlRbXSB0b28pLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKiBUaGUgdmFsdWUgYHNsaWNlW2NoYXIubG8gLSBmaXJzdF0nIGlzIHJlYWQuICBJZiBpdCBpcyAwLCB0aGVyZSBpcyAgICovCi0gIC8qICAgbm8gZ2x5cGggZm9yIHRoZSBjaGFyY29kZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIGBkZWx0YScgaXMgICAgICAqLwotICAvKiAgIGFkZGVkIHRvIGl0IChtb2R1bG8gNjU1MzYpIHRvIGZvcm0gYSBuZXcgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIHVwIHRvIHRoZSB2YWxpZGF0aW9uIHJvdXRpbmUgdG8gY2hlY2sgdGhhdCBhbGwgb2Zmc2V0cyBmYWxsICAgICAqLwotICAvKiB3aXRoaW4gdGhlIGdseXBoIGlkcyB0YWJsZSAoYW5kIG5vdCB3aXRoaW4gdGhlIGBzdWJzJyB0YWJsZSBpdHNlbGYgb3IgKi8KLSAgLyogb3V0c2lkZSBvZiB0aGUgQ01hcCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzIKLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDJfdmFsaWRhdGUoIEZUX0J5dGUqICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIEZUX0J5dGUqICBwICAgICAgPSB0YWJsZSArIDI7ICAgICAgICAgICAvKiBza2lwIGZvcm1hdCAqLwotICAgIEZUX1VJbnQgICBsZW5ndGggPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgIEZUX1VJbnQgICBuLCBtYXhfc3ViczsKLSAgICBGVF9CeXRlKiAga2V5czsgICAgICAgICAgICAgICAgICAgICAgICAgLyoga2V5cyB0YWJsZSAqLwotICAgIEZUX0J5dGUqICBzdWJzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWItaGVhZGVycyAqLwotICAgIEZUX0J5dGUqICBnbHlwaF9pZHM7ICAgICAgICAgICAgICAgICAgICAvKiBnbHlwaCBpZCBhcnJheSAqLwotCi0KLSAgICBpZiAoIHRhYmxlICsgbGVuZ3RoID4gdmFsaWQtPmxpbWl0IHx8IGxlbmd0aCA8IDYgKyA1MTIgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBrZXlzID0gdGFibGUgKyA2OwotCi0gICAgLyogcGFyc2Uga2V5cyB0byBjb21wdXRlIHN1Yi1oZWFkZXJzIGNvdW50ICovCi0gICAgcCAgICAgICAgPSBrZXlzOwotICAgIG1heF9zdWJzID0gMDsKLSAgICBmb3IgKCBuID0gMDsgbiA8IDI1NjsgbisrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBpZHggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgIC8qIHZhbHVlIG11c3QgYmUgbXVsdGlwbGUgb2YgOCAqLwotICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfUEFSQU5PSUQgJiYgKCBpZHggJiA3ICkgIT0gMCApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgaWR4ID4+PSAzOwotCi0gICAgICBpZiAoIGlkeCA+IG1heF9zdWJzICkKLSAgICAgICAgbWF4X3N1YnMgPSBpZHg7Ci0gICAgfQotCi0gICAgRlRfQVNTRVJUKCBwID09IHRhYmxlICsgNTE4ICk7Ci0KLSAgICBzdWJzICAgICAgPSBwOwotICAgIGdseXBoX2lkcyA9IHN1YnMgKyAobWF4X3N1YnMgKyAxKSAqIDg7Ci0gICAgaWYgKCBnbHlwaF9pZHMgPiB2YWxpZC0+bGltaXQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBwYXJzZSBzdWItaGVhZGVycyAqLwotICAgIGZvciAoIG4gPSAwOyBuIDw9IG1heF9zdWJzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICBmaXJzdF9jb2RlLCBjb2RlX2NvdW50LCBvZmZzZXQ7Ci0gICAgICBGVF9JbnQgICAgZGVsdGE7Ci0gICAgICBGVF9CeXRlKiAgaWRzOwotCi0KLSAgICAgIGZpcnN0X2NvZGUgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgY29kZV9jb3VudCA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBkZWx0YSAgICAgID0gVFRfTkVYVF9TSE9SVCggcCApOwotICAgICAgb2Zmc2V0ICAgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIC8qIGNoZWNrIHJhbmdlIHdpdGhpbiAwLi4yNTUgKi8KLSAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBmaXJzdF9jb2RlID49IDI1NiB8fCBmaXJzdF9jb2RlICsgY29kZV9jb3VudCA+IDI1NiApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgfQotCi0gICAgICAvKiBjaGVjayBvZmZzZXQgKi8KLSAgICAgIGlmICggb2Zmc2V0ICE9IDAgKQotICAgICAgewotICAgICAgICBpZHMgPSBwIC0gMiArIG9mZnNldDsKLSAgICAgICAgaWYgKCBpZHMgPCBnbHlwaF9pZHMgfHwgaWRzICsgY29kZV9jb3VudCoyID4gdGFibGUgKyBsZW5ndGggKQotICAgICAgICAgIEZUX0lOVkFMSURfT0ZGU0VUOwotCi0gICAgICAgIC8qIGNoZWNrIGdseXBoIGlkcyAqLwotICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgbGltaXQgPSBwICsgY29kZV9jb3VudCAqIDI7Ci0gICAgICAgICAgRlRfVUludCAgIGlkeDsKLQotCi0gICAgICAgICAgZm9yICggOyBwIDwgbGltaXQ7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZHggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICAgICAgaWYgKCBpZHggIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlkeCA9ICggaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0gICAgICAgICAgICAgIGlmICggaWR4ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgLyogcmV0dXJuIHN1YiBoZWFkZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGNoYXJhY3RlciBjb2RlICovCi0gIC8qIE5VTEwgb24gaW52YWxpZCBjaGFyY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfQnl0ZSoKLSAgdHRfY21hcDJfZ2V0X3N1YmhlYWRlciggRlRfQnl0ZSogICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogIHJlc3VsdCA9IE5VTEw7Ci0KLQotICAgIGlmICggY2hhcl9jb2RlIDwgMHgxMDAwMFVMICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgY2hhcl9sbyA9IChGVF9VSW50KSggY2hhcl9jb2RlICYgMHhGRiApOwotICAgICAgRlRfVUludCAgIGNoYXJfaGkgPSAoRlRfVUludCkoIGNoYXJfY29kZSA+PiA4ICk7Ci0gICAgICBGVF9CeXRlKiAgcCAgICAgICA9IHRhYmxlICsgNjsgICAgLyoga2V5cyB0YWJsZSAqLwotICAgICAgRlRfQnl0ZSogIHN1YnMgICAgPSB0YWJsZSArIDUxODsgIC8qIHN1YmhlYWRlcnMgdGFibGUgKi8KLSAgICAgIEZUX0J5dGUqICBzdWI7Ci0KLQotICAgICAgaWYgKCBjaGFyX2hpID09IDAgKQotICAgICAgewotICAgICAgICAvKiBhbiA4LWJpdCBjaGFyYWN0ZXIgY29kZSAtLSB3ZSB1c2Ugc3ViSGVhZGVyIDAgaW4gdGhpcyBjYXNlICovCi0gICAgICAgIC8qIHRvIHRlc3Qgd2hldGhlciB0aGUgY2hhcmFjdGVyIGNvZGUgaXMgaW4gdGhlIGNoYXJtYXAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBzdWIgPSBzdWJzOyAgLyoganVtcCB0byBmaXJzdCBzdWItaGVhZGVyICovCi0KLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgc3ViLWhlYWRlciBmb3IgdGhpcyBieXRlIGlzIDAsIHdoaWNoICovCi0gICAgICAgIC8qIGluZGljYXRlcyB0aGF0IGl0J3MgcmVhbGx5IGEgdmFsaWQgb25lLWJ5dGUgdmFsdWUgICAqLwotICAgICAgICAvKiBPdGhlcndpc2UsIHJldHVybiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHAgKz0gY2hhcl9sbyAqIDI7Ci0gICAgICAgIGlmICggVFRfUEVFS19VU0hPUlQoIHAgKSAhPSAwICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGEgMTYtYml0IGNoYXJhY3RlciBjb2RlICovCi0KLSAgICAgICAgLyoganVtcCB0byBrZXkgZW50cnkgICovCi0gICAgICAgIHAgICs9IGNoYXJfaGkgKiAyOwotICAgICAgICAvKiBqdW1wIHRvIHN1Yi1oZWFkZXIgKi8KLSAgICAgICAgc3ViID0gc3VicyArICggRlRfUEFEX0ZMT09SKCBUVF9QRUVLX1VTSE9SVCggcCApLCA4ICkgKTsKLQotICAgICAgICAvKiBjaGVjayB0aGF0IHRoZSBoaWdoIGJ5dGUgaXNuJ3QgYSB2YWxpZCBvbmUtYnl0ZSB2YWx1ZSAqLwotICAgICAgICBpZiAoIHN1YiA9PSBzdWJzICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSBzdWI7Ci0gICAgfQotICBFeGl0OgotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHR0X2NtYXAyX2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogIHRhYmxlICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQgICByZXN1bHQgID0gMDsKLSAgICBGVF9CeXRlKiAgc3ViaGVhZGVyOwotCi0KLSAgICBzdWJoZWFkZXIgPSB0dF9jbWFwMl9nZXRfc3ViaGVhZGVyKCB0YWJsZSwgY2hhcl9jb2RlICk7Ci0gICAgaWYgKCBzdWJoZWFkZXIgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBwICAgPSBzdWJoZWFkZXI7Ci0gICAgICBGVF9VSW50ICAgaWR4ID0gKEZUX1VJbnQpKGNoYXJfY29kZSAmIDB4RkYpOwotICAgICAgRlRfVUludCAgIHN0YXJ0LCBjb3VudDsKLSAgICAgIEZUX0ludCAgICBkZWx0YTsKLSAgICAgIEZUX1VJbnQgICBvZmZzZXQ7Ci0KLQotICAgICAgc3RhcnQgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGNvdW50ICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBkZWx0YSAgPSBUVF9ORVhUX1NIT1JUICggcCApOwotICAgICAgb2Zmc2V0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgaWR4IC09IHN0YXJ0OwotICAgICAgaWYgKCBpZHggPCBjb3VudCAmJiBvZmZzZXQgIT0gMCApCi0gICAgICB7Ci0gICAgICAgIHAgICs9IG9mZnNldCArIDIgKiBpZHg7Ci0gICAgICAgIGlkeCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgaWYgKCBpZHggIT0gMCApCi0gICAgICAgICAgcmVzdWx0ID0gKEZUX1VJbnQpKCBpZHggKyBkZWx0YSApICYgMHhGRkZGVTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDJfY2hhcl9uZXh0KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgID0gY21hcC0+ZGF0YTsKLSAgICBGVF9VSW50ICAgIGdpbmRleCAgID0gMDsKLSAgICBGVF9VSW50MzIgIHJlc3VsdCAgID0gMDsKLSAgICBGVF9VSW50MzIgIGNoYXJjb2RlID0gKnBjaGFyY29kZSArIDE7Ci0gICAgRlRfQnl0ZSogICBzdWJoZWFkZXI7Ci0KLQotICAgIHdoaWxlICggY2hhcmNvZGUgPCAweDEwMDAwVUwgKQotICAgIHsKLSAgICAgIHN1YmhlYWRlciA9IHR0X2NtYXAyX2dldF9zdWJoZWFkZXIoIHRhYmxlLCBjaGFyY29kZSApOwotICAgICAgaWYgKCBzdWJoZWFkZXIgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgcCAgICAgICA9IHN1YmhlYWRlcjsKLSAgICAgICAgRlRfVUludCAgIHN0YXJ0ICAgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBGVF9VSW50ICAgY291bnQgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIEZUX0ludCAgICBkZWx0YSAgID0gVFRfTkVYVF9TSE9SVCAoIHAgKTsKLSAgICAgICAgRlRfVUludCAgIG9mZnNldCAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICBGVF9VSW50ICAgY2hhcl9sbyA9IChGVF9VSW50KSggY2hhcmNvZGUgJiAweEZGICk7Ci0gICAgICAgIEZUX1VJbnQgICBwb3MsIGlkeDsKLQotCi0gICAgICAgIGlmICggb2Zmc2V0ID09IDAgKQotICAgICAgICAgIGdvdG8gTmV4dF9TdWJIZWFkZXI7Ci0KLSAgICAgICAgaWYgKCBjaGFyX2xvIDwgc3RhcnQgKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhcl9sbyA9IHN0YXJ0OwotICAgICAgICAgIHBvcyAgICAgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwb3MgPSAoRlRfVUludCkoIGNoYXJfbG8gLSBzdGFydCApOwotCi0gICAgICAgIHAgICAgICAgKz0gb2Zmc2V0ICsgcG9zICogMjsKLSAgICAgICAgY2hhcmNvZGUgPSBGVF9QQURfRkxPT1IoIGNoYXJjb2RlLCAyNTYgKSArIGNoYXJfbG87Ci0KLSAgICAgICAgZm9yICggOyBwb3MgPCBjb3VudDsgcG9zKyssIGNoYXJjb2RlKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWR4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICAgIGlmICggaWR4ICE9IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdpbmRleCA9ICggaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0gICAgICAgICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gY2hhcmNvZGU7Ci0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyoganVtcCB0byBuZXh0IHN1Yi1oZWFkZXIsIGkuZS4gaGlnaGVyIGJ5dGUgdmFsdWUgKi8KLSAgICBOZXh0X1N1YkhlYWRlcjoKLSAgICAgIGNoYXJjb2RlID0gRlRfUEFEX0ZMT09SKCBjaGFyY29kZSwgMjU2ICkgKyAyNTY7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKnBjaGFyY29kZSA9IHJlc3VsdDsKLQotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMl9nZXRfaW5mbyggVFRfQ01hcCAgICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSBjbWFwLT5kYXRhICsgNDsKLQotCi0gICAgY21hcF9pbmZvLT5mb3JtYXQgPSAyOwotICAgIGNtYXBfaW5mby0+bGFuZ3VhZ2UgPSAoRlRfVUxvbmcpVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IFRUX0NNYXBfQ2xhc3NSZWMgIHR0X2NtYXAyX2NsYXNzX3JlYyA9Ci0gIHsKLSAgICB7Ci0gICAgICBzaXplb2YgKCBUVF9DTWFwUmVjICksCi0KLSAgICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcF9pbml0LAotICAgICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBOVUxMLAotICAgICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwMl9jaGFyX2luZGV4LAotICAgICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0dF9jbWFwMl9jaGFyX25leHQsCi0KLSAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKLSAgICB9LAotICAgIDIsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKSAgIHR0X2NtYXAyX3ZhbGlkYXRlLAotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYykgICB0dF9jbWFwMl9nZXRfaW5mbwotICB9OwotCi0jZW5kaWYgLyogVFRfQ09ORklHX0NNQVBfRk9STUFUXzIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICAgIE9GRlNFVCAgICAgICAgIFRZUEUgICAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgbXVzdCBiZSA0ICAgICAgICAgICAgKi8KLSAgLyogICBsZW5ndGggICAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIHRhYmxlIGxlbmd0aCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBieXRlcyAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgICAgNCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc2VnQ291bnRYMiAgICA2ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAyKk5VTV9TRUdTICAgICAgICAgICAqLwotICAvKiAgIHNlYXJjaFJhbmdlICAgOCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgMiooMSA8PCBMT0dfU0VHUykgICAgKi8KLSAgLyogICBlbnRyeVNlbGVjdG9yIDEwICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIExPR19TRUdTICAgICAgICAgICAgICovCi0gIC8qICAgcmFuZ2VTaGlmdCAgICAxMiAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICBzZWdDb3VudFgyIC0gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hSYW5nZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZW5kQ291bnQgICAgICAxNCAgICAgICAgICAgICBVU0hPUlRbTlVNX1NFR1NdICBlbmQgY2hhcmNvZGUgZm9yICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZWdtZW50OyBsYXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIDB4RkZGRiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHBhZCAgICAgICAgICAgMTQrTlVNX1NFR1MqMiAgVVNIT1JUICAgICAgICAgICAgcGFkZGluZyAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRDb3VudCAgICAxNitOVU1fU0VHUyoyICBVU0hPUlRbTlVNX1NFR1NdICBmaXJzdCBjaGFyY29kZSBmb3IgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZWdtZW50ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgaWREZWx0YSAgICAgICAxNitOVU1fU0VHUyo0ICBTSE9SVFtOVU1fU0VHU10gICBkZWx0YSBmb3IgZWFjaCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCAgICAgICAgICAgICAgKi8KLSAgLyogICBpZE9mZnNldCAgICAgIDE2K05VTV9TRUdTKjYgIFNIT1JUW05VTV9TRUdTXSAgIHJhbmdlIG9mZnNldCBmb3IgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlZ21lbnQ7IGNhbiBiZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZ2x5cGhJZHMgICAgICAxNitOVU1fU0VHUyo4ICBVU0hPUlRbXSAgICAgICAgICBhcnJheSBvZiBnbHlwaCBpZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENoYXJhY3RlciBjb2RlcyBhcmUgbW9kZWxsZWQgYnkgYSBzZXJpZXMgb2Ygb3JkZXJlZCAoaW5jcmVhc2luZykgICAgICAqLwotICAvKiBpbnRlcnZhbHMgY2FsbGVkIHNlZ21lbnRzLiAgRWFjaCBzZWdtZW50IGhhcyBzdGFydCBhbmQgZW5kIGNvZGVzLCAgICAgKi8KLSAgLyogcHJvdmlkZWQgYnkgdGhlIGBzdGFydENvdW50JyBhbmQgYGVuZENvdW50JyBhcnJheXMuICBTZWdtZW50cyBtdXN0ICAgICovCi0gIC8qIG5vdCBiZSBvdmVybGFwcGluZyBhbmQgdGhlIGxhc3Qgc2VnbWVudCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gdGhlICAgICAqLwotICAvKiBgMHhGRkZGJyBlbmRDb3VudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBmaWVsZHMgYHNlYXJjaFJhbmdlJywgYGVudHJ5U2VsZWN0b3InIGFuZCBgcmFuZ2VTaGlmdCcgYXJlIGJldHRlciAqLwotICAvKiBpZ25vcmVkICh0aGV5IGFyZSB0cmFjZXMgb2Ygb3Zlci1lbmdpbmVlcmluZyBpbiB0aGUgVHJ1ZVR5cGUgICAgICAgICAgKi8KLSAgLyogc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFYWNoIHNlZ21lbnQgYWxzbyBoYXMgYSBzaWduZWQgYGRlbHRhJywgYXMgd2VsbCBhcyBhbiBvcHRpb25hbCBvZmZzZXQgKi8KLSAgLyogd2l0aGluIHRoZSBgZ2x5cGhJZHMnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBhIHNlZ21lbnQncyBpZE9mZnNldCBpcyAwLCB0aGUgZ2x5cGggaW5kZXggY29ycmVzcG9uZGluZyB0byBhbnkgICAgKi8KLSAgLyogY2hhcmNvZGUgd2l0aGluIHRoZSBzZWdtZW50IGlzIG9idGFpbmVkIGJ5IGFkZGluZyB0aGUgdmFsdWUgb2YgICAgICAgICovCi0gIC8qIGBpZERlbHRhJyBkaXJlY3RseSB0byB0aGUgY2hhcmNvZGUsIG1vZHVsbyA2NTUzNi4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3RoZXJ3aXNlLCBhIGdseXBoIGluZGV4IGlzIHRha2VuIGZyb20gdGhlIGdseXBoIGlkcyBzdWItYXJyYXkgZm9yICAgICovCi0gIC8qIHRoZSBzZWdtZW50LCBhbmQgdGhlIHZhbHVlIG9mIGBpZERlbHRhJyBpcyBhZGRlZCB0byBpdC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZpbmFsbHksIG5vdGUgdGhhdCBjZXJ0YWluIGZvbnRzIGNvbnRhaW4gaW52YWxpZCBjaGFybWFwcyB0aGF0ICAgICAgICAqLwotICAvKiBjb250YWluIGVuZD0weEZGRkYsIHN0YXJ0PTB4RkZGRiwgZGVsdGE9MHgwMDAxLCBvZmZzZXQ9MHhGRkZGIGF0IHRoZSAgKi8KLSAgLyogb2YgdGhlaXIgY2hhcm1hcHMgKGUuZy4gb3BlbnNfX18udHRmIHdoaWNoIGNvbWVzIHdpdGggT3Blbk9mZmljZS5vcmcpICovCi0gIC8qIHdlIG5lZWQgc3BlY2lhbCBjb2RlIHRvIGRlYWwgd2l0aCB0aGVtIGNvcnJlY3RseS4uLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF80Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXA0UmVjXwotICB7Ci0gICAgVFRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VSW50MzIgICBjdXJfY2hhcmNvZGU7ICAgLyogY3VycmVudCBjaGFyY29kZSAqLwotICAgIEZUX1VJbnQgICAgIGN1cl9naW5kZXg7ICAgICAvKiBjdXJyZW50IGdseXBoIGluZGV4ICovCi0KLSAgICBGVF9VSW50ICAgICBudW1fcmFuZ2VzOwotICAgIEZUX1VJbnQgICAgIGN1cl9yYW5nZTsKLSAgICBGVF9VSW50ICAgICBjdXJfc3RhcnQ7Ci0gICAgRlRfVUludCAgICAgY3VyX2VuZDsKLSAgICBGVF9JbnQgICAgICBjdXJfZGVsdGE7Ci0gICAgRlRfQnl0ZSogICAgY3VyX3ZhbHVlczsKLQotICB9IFRUX0NNYXA0UmVjLCAqVFRfQ01hcDQ7Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDRfaW5pdCggVFRfQ01hcDQgIGNtYXAsCi0gICAgICAgICAgICAgICAgIEZUX0J5dGUqICB0YWJsZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLQotCi0gICAgY21hcC0+Y21hcC5kYXRhICAgID0gdGFibGU7Ci0KLSAgICBwICAgICAgICAgICAgICAgICAgPSB0YWJsZSArIDY7Ci0gICAgY21hcC0+bnVtX3JhbmdlcyAgID0gRlRfUEVFS19VU0hPUlQoIHAgKSA+PiAxOwotICAgIGNtYXAtPmN1cl9jaGFyY29kZSA9IDB4RkZGRkZGRkZVTDsKLSAgICBjbWFwLT5jdXJfZ2luZGV4ICAgPSAwOwotCi0gICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfSW50Ci0gIHR0X2NtYXA0X3NldF9yYW5nZSggVFRfQ01hcDQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHJhbmdlX2luZGV4ICkKLSAgewotICAgIEZUX0J5dGUqICB0YWJsZSA9IGNtYXAtPmNtYXAuZGF0YTsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VSW50ICAgbnVtX3JhbmdlcyA9IGNtYXAtPm51bV9yYW5nZXM7Ci0KLQotICAgIHdoaWxlICggcmFuZ2VfaW5kZXggPCBudW1fcmFuZ2VzICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBvZmZzZXQ7Ci0KLQotICAgICAgcCAgICAgICAgICAgICA9IHRhYmxlICsgMTQgKyByYW5nZV9pbmRleCAqIDI7Ci0gICAgICBjbWFwLT5jdXJfZW5kID0gRlRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgcCAgICAgICAgICAgICAgKz0gMiArIG51bV9yYW5nZXMgKiAyOwotICAgICAgY21hcC0+Y3VyX3N0YXJ0ID0gRlRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgcCAgICAgICAgICAgICAgKz0gbnVtX3JhbmdlcyAqIDI7Ci0gICAgICBjbWFwLT5jdXJfZGVsdGEgPSBGVF9QRUVLX1NIT1JUKCBwICk7Ci0KLSAgICAgIHAgICAgICs9IG51bV9yYW5nZXMgKiAyOwotICAgICAgb2Zmc2V0ID0gRlRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBvZmZzZXQgIT0gMHhGRkZGVSApCi0gICAgICB7Ci0gICAgICAgIGNtYXAtPmN1cl92YWx1ZXMgPSBvZmZzZXQgPyBwICsgb2Zmc2V0IDogTlVMTDsKLSAgICAgICAgY21hcC0+Y3VyX3JhbmdlICA9IHJhbmdlX2luZGV4OwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgLyogd2Ugc2tpcCBlbXB0eSBzZWdtZW50cyAqLwotICAgICAgcmFuZ2VfaW5kZXgrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotCi0gIC8qIHNlYXJjaCB0aGUgaW5kZXggb2YgdGhlIGNoYXJjb2RlIG5leHQgdG8gY21hcC0+Y3VyX2NoYXJjb2RlOyAqLwotICAvKiBjYWxsZXIgc2hvdWxkIGNhbGwgdHRfY21hcDRfc2V0X3JhbmdlIHdpdGggcHJvcGVyIHJhbmdlICAgICAgKi8KLSAgLyogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICB0dF9jbWFwNF9uZXh0KCBUVF9DTWFwNCAgY21hcCApCi0gIHsKLSAgICBGVF9VSW50ICBjaGFyY29kZTsKLQotCi0gICAgaWYgKCBjbWFwLT5jdXJfY2hhcmNvZGUgPj0gMHhGRkZGVUwgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgY2hhcmNvZGUgPSBjbWFwLT5jdXJfY2hhcmNvZGUgKyAxOwotCi0gICAgaWYgKCBjaGFyY29kZSA8IGNtYXAtPmN1cl9zdGFydCApCi0gICAgICBjaGFyY29kZSA9IGNtYXAtPmN1cl9zdGFydDsKLQotICAgIGZvciAoIDs7ICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgdmFsdWVzID0gY21hcC0+Y3VyX3ZhbHVlczsKLSAgICAgIEZUX1VJbnQgICBlbmQgICAgPSBjbWFwLT5jdXJfZW5kOwotICAgICAgRlRfSW50ICAgIGRlbHRhICA9IGNtYXAtPmN1cl9kZWx0YTsKLQotCi0gICAgICBpZiAoIGNoYXJjb2RlIDw9IGVuZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggdmFsdWVzICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICBwID0gdmFsdWVzICsgMiAqICggY2hhcmNvZGUgLSBjbWFwLT5jdXJfc3RhcnQgKTsKLQotCi0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBnaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoICggZ2luZGV4ICsgZGVsdGEgKSAmIDB4RkZGRlUgKTsKLSAgICAgICAgICAgICAgaWYgKCBnaW5kZXggIT0gMCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyY29kZTsKLSAgICAgICAgICAgICAgICBjbWFwLT5jdXJfZ2luZGV4ICAgPSBnaW5kZXg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSB3aGlsZSAoICsrY2hhcmNvZGUgPD0gZW5kICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBnaW5kZXggPSAoRlRfVUludCkoICggY2hhcmNvZGUgKyBkZWx0YSApICYgMHhGRkZGVSApOwotCi0KLSAgICAgICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyY29kZTsKLSAgICAgICAgICAgICAgY21hcC0+Y3VyX2dpbmRleCAgID0gZ2luZGV4OwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSB3aGlsZSAoICsrY2hhcmNvZGUgPD0gZW5kICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogd2UgbmVlZCB0byBmaW5kIGFub3RoZXIgcmFuZ2UgKi8KLSAgICAgIGlmICggdHRfY21hcDRfc2V0X3JhbmdlKCBjbWFwLCBjbWFwLT5jdXJfcmFuZ2UgKyAxICkgPCAwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggY2hhcmNvZGUgPCBjbWFwLT5jdXJfc3RhcnQgKQotICAgICAgICBjaGFyY29kZSA9IGNtYXAtPmN1cl9zdGFydDsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSAweEZGRkZGRkZGVUw7Ci0gICAgY21hcC0+Y3VyX2dpbmRleCAgID0gMDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA0X3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCAgICAgID0gdGFibGUgKyAyOyAgICAgICAgICAgICAgIC8qIHNraXAgZm9ybWF0ICovCi0gICAgRlRfVUludCAgIGxlbmd0aCA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRlRfQnl0ZSAgICplbmRzLCAqc3RhcnRzLCAqb2Zmc2V0cywgKmRlbHRhcywgKmdseXBoX2lkczsKLSAgICBGVF9VSW50ICAgbnVtX3NlZ3M7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gU0ZOVF9FcnJfT2s7Ci0KLQotICAgIGlmICggbGVuZ3RoIDwgMTYgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBpbiBjZXJ0YWluIGZvbnRzLCB0aGUgYGxlbmd0aCcgZmllbGQgaXMgaW52YWxpZCBhbmQgZ29lcyAqLwotICAgIC8qIG91dCBvZiBib3VuZC4gIFdlIHRyeSB0byBjb3JyZWN0IHRoaXMgaGVyZS4uLiAgICAgICAgICAgICovCi0gICAgaWYgKCB0YWJsZSArIGxlbmd0aCA+IHZhbGlkLT5saW1pdCApCi0gICAgewotICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgICAgbGVuZ3RoID0gKEZUX1VJbnQpKCB2YWxpZC0+bGltaXQgLSB0YWJsZSApOwotICAgIH0KLQotICAgIHAgICAgICAgID0gdGFibGUgKyA2OwotICAgIG51bV9zZWdzID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsgICAvKiByZWFkIHNlZ0NvdW50WDIgKi8KLQotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYW4gZXZlbiB2YWx1ZSBoZXJlICovCi0gICAgICBpZiAoIG51bV9zZWdzICYgMSApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBudW1fc2VncyAvPSAyOwotCi0gICAgaWYgKCBsZW5ndGggPCAxNiArIG51bV9zZWdzICogMiAqIDQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBjaGVjayB0aGUgc2VhcmNoIHBhcmFtZXRlcnMgLSBldmVuIHRob3VnaCB3ZSBuZXZlciB1c2UgdGhlbSAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfUEFSQU5PSUQgKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIHRoZSB2YWx1ZXMgb2YgJ3NlYXJjaFJhbmdlJywgJ2VudHJ5U2VsZWN0b3InLCAncmFuZ2VTaGlmdCcgKi8KLSAgICAgIEZUX1VJbnQgIHNlYXJjaF9yYW5nZSAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIGVudHJ5X3NlbGVjdG9yID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIHJhbmdlX3NoaWZ0ICAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLQotCi0gICAgICBpZiAoICggc2VhcmNoX3JhbmdlIHwgcmFuZ2Vfc2hpZnQgKSAmIDEgKSAgLyogbXVzdCBiZSBldmVuIHZhbHVlcyAqLwotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgIHNlYXJjaF9yYW5nZSAvPSAyOwotICAgICAgcmFuZ2Vfc2hpZnQgIC89IDI7Ci0KLSAgICAgIC8qIGBzZWFyY2ggcmFuZ2UnIGlzIHRoZSBncmVhdGVzdCBwb3dlciBvZiAyIHRoYXQgaXMgPD0gbnVtX3NlZ3MgKi8KLQotICAgICAgaWYgKCBzZWFyY2hfcmFuZ2UgICAgICAgICAgICAgICAgPiBudW1fc2VncyAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgc2VhcmNoX3JhbmdlICogMiAgICAgICAgICAgIDwgbnVtX3NlZ3MgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHNlYXJjaF9yYW5nZSArIHJhbmdlX3NoaWZ0ICE9IG51bV9zZWdzICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBzZWFyY2hfcmFuZ2UgICAgICAgICAgICAgICAhPSAoIDFVIDw8IGVudHJ5X3NlbGVjdG9yICkgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gICAgZW5kcyAgICAgID0gdGFibGUgICArIDE0OwotICAgIHN0YXJ0cyAgICA9IHRhYmxlICAgKyAxNiArIG51bV9zZWdzICogMjsKLSAgICBkZWx0YXMgICAgPSBzdGFydHMgICsgbnVtX3NlZ3MgKiAyOwotICAgIG9mZnNldHMgICA9IGRlbHRhcyAgKyBudW1fc2VncyAqIDI7Ci0gICAgZ2x5cGhfaWRzID0gb2Zmc2V0cyArIG51bV9zZWdzICogMjsKLQotICAgIC8qIGNoZWNrIGxhc3Qgc2VnbWVudCwgaXRzIGVuZCBjb3VudCBtdXN0IGJlIEZGRkYgKi8KLSAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9QQVJBTk9JRCApCi0gICAgewotICAgICAgcCA9IGVuZHMgKyAoIG51bV9zZWdzIC0gMSApICogMjsKLSAgICAgIGlmICggVFRfUEVFS19VU0hPUlQoIHAgKSAhPSAweEZGRkZVICkKLSAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX1VJbnQgIHN0YXJ0LCBlbmQsIG9mZnNldCwgbjsKLSAgICAgIEZUX1VJbnQgIGxhc3Rfc3RhcnQgPSAwLCBsYXN0X2VuZCA9IDA7Ci0gICAgICBGVF9JbnQgICBkZWx0YTsKLSAgICAgIEZUX0J5dGUqICBwX3N0YXJ0ICAgPSBzdGFydHM7Ci0gICAgICBGVF9CeXRlKiAgcF9lbmQgICAgID0gZW5kczsKLSAgICAgIEZUX0J5dGUqICBwX2RlbHRhICAgPSBkZWx0YXM7Ci0gICAgICBGVF9CeXRlKiAgcF9vZmZzZXQgID0gb2Zmc2V0czsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9zZWdzOyBuKysgKQotICAgICAgewotICAgICAgICBwICAgICAgPSBwX29mZnNldDsKLSAgICAgICAgc3RhcnQgID0gVFRfTkVYVF9VU0hPUlQoIHBfc3RhcnQgKTsKLSAgICAgICAgZW5kICAgID0gVFRfTkVYVF9VU0hPUlQoIHBfZW5kICk7Ci0gICAgICAgIGRlbHRhICA9IFRUX05FWFRfU0hPUlQoIHBfZGVsdGEgKTsKLSAgICAgICAgb2Zmc2V0ID0gVFRfTkVYVF9VU0hPUlQoIHBfb2Zmc2V0ICk7Ci0KLSAgICAgICAgaWYgKCBzdGFydCA+IGVuZCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgIC8qIHRoaXMgdGVzdCBzaG91bGQgYmUgcGVyZm9ybWVkIGF0IGRlZmF1bHQgdmFsaWRhdGlvbiBsZXZlbDsgICovCi0gICAgICAgIC8qIHVuZm9ydHVuYXRlbHksIHNvbWUgcG9wdWxhciBBc2lhbiBmb250cyBwcmVzZW50IG92ZXJsYXBwaW5nICovCi0gICAgICAgIC8qIHJhbmdlcyBpbiB0aGVpciBjaGFybWFwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggc3RhcnQgPD0gbGFzdF9lbmQgJiYgbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBhbGxvdyBvdmVybGFwcGluZyBzZWdtZW50cywgcHJvdmlkZWQgdGhlaXIgc3RhcnQgcG9pbnRzICovCi0gICAgICAgICAgICAvKiBhbmQgZW5kIHBvaW50cywgcmVzcGVjdGl2ZWx5LCBhcmUgaW4gYXNjZW5kaW5nIG9yZGVyLiAgICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIGxhc3Rfc3RhcnQgPiBzdGFydCB8fCBsYXN0X2VuZCA+IGVuZCApCi0gICAgICAgICAgICAgIGVycm9yIHw9IFRUX0NNQVBfRkxBR19VTlNPUlRFRDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZXJyb3IgfD0gVFRfQ01BUF9GTEFHX09WRVJMQVBQSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggb2Zmc2V0ICYmIG9mZnNldCAhPSAweEZGRkZVICkKLSAgICAgICAgewotICAgICAgICAgIHAgKz0gb2Zmc2V0OyAgLyogc3RhcnQgb2YgZ2x5cGggaWQgYXJyYXkgKi8KLQotICAgICAgICAgIC8qIGNoZWNrIHRoYXQgd2UgcG9pbnQgd2l0aGluIHRoZSBnbHlwaCBpZHMgdGFibGUgb25seSAqLwotICAgICAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHAgPCBnbHlwaF9pZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIHAgKyAoIGVuZCAtIHN0YXJ0ICsgMSApICogMiA+IHRhYmxlICsgbGVuZ3RoICkKLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwIDwgZ2x5cGhfaWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgcCArICggZW5kIC0gc3RhcnQgKyAxICkgKiAyID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGNoZWNrIGdseXBoIGluZGljZXMgd2l0aGluIHRoZSBzZWdtZW50IHJhbmdlICovCi0gICAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgIGksIGlkeDsKLQotCi0gICAgICAgICAgICBmb3IgKCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlkeCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICAgIGlmICggaWR4ICE9IDAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWR4ID0gKEZUX1VJbnQpKCBpZHggKyBkZWx0YSApICYgMHhGRkZGVTsKLQotICAgICAgICAgICAgICAgIGlmICggaWR4ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIG9mZnNldCA9PSAweEZGRkZVICkKLSAgICAgICAgewotICAgICAgICAgIC8qIFNvbWUgZm9udHMgKGVycm9uZW91c2x5PykgdXNlIGEgcmFuZ2Ugb2Zmc2V0IG9mIDB4RkZGRiAqLwotICAgICAgICAgIC8qIHRvIG1lYW4gbWlzc2luZyBnbHlwaCBpbiBjbWFwIHRhYmxlICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIG4gIT0gbnVtX3NlZ3MgLSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAhKCBzdGFydCA9PSAweEZGRkZVICYmIGVuZCA9PSAweEZGRkZVICYmIGRlbHRhID09IDB4MVUgKSApCi0gICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgIH0KLQotICAgICAgICBsYXN0X3N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgIGxhc3RfZW5kICAgPSBlbmQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0dF9jbWFwNF9jaGFyX21hcF9saW5lYXIoIFRUX0NNYXAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQqICBwY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgIG5leHQgKQotICB7Ci0gICAgRlRfVUludCAgICBudW1fc2VnczIsIHN0YXJ0LCBlbmQsIG9mZnNldDsKLSAgICBGVF9JbnQgICAgIGRlbHRhOwotICAgIEZUX1VJbnQgICAgaSwgbnVtX3NlZ3M7Ci0gICAgRlRfVUludDMyICBjaGFyY29kZSA9ICpwY2hhcmNvZGU7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICA9IDA7Ci0gICAgRlRfQnl0ZSogICBwOwotCi0KLSAgICBwID0gY21hcC0+ZGF0YSArIDY7Ci0gICAgbnVtX3NlZ3MyID0gRlRfUEFEX0ZMT09SKCBUVF9QRUVLX1VTSE9SVCggcCApLCAyICk7Ci0KLSAgICBudW1fc2VncyA9IG51bV9zZWdzMiA+PiAxOwotCi0gICAgaWYgKCAhbnVtX3NlZ3MgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIG5leHQgKQotICAgICAgY2hhcmNvZGUrKzsKLQotICAgIC8qIGxpbmVhciBzZWFyY2ggKi8KLSAgICBmb3IgKCA7IGNoYXJjb2RlIDw9IDB4RkZGRlU7IGNoYXJjb2RlKysgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBxOwotCi0KLSAgICAgIHAgPSBjbWFwLT5kYXRhICsgMTQ7ICAgICAgICAgICAgICAgLyogZW5kcyB0YWJsZSAgICovCi0gICAgICBxID0gY21hcC0+ZGF0YSArIDE2ICsgbnVtX3NlZ3MyOyAgIC8qIHN0YXJ0cyB0YWJsZSAqLwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9zZWdzOyBpKysgKQotICAgICAgewotICAgICAgICBlbmQgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIHN0YXJ0ID0gVFRfTkVYVF9VU0hPUlQoIHEgKTsKLQotICAgICAgICBpZiAoIGNoYXJjb2RlID49IHN0YXJ0ICYmIGNoYXJjb2RlIDw9IGVuZCApCi0gICAgICAgIHsKLSAgICAgICAgICBwICAgICAgID0gcSAtIDIgKyBudW1fc2VnczI7Ci0gICAgICAgICAgZGVsdGEgICA9IFRUX1BFRUtfU0hPUlQoIHAgKTsKLSAgICAgICAgICBwICAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICAgIG9mZnNldCAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgICAgICAgaWYgKCBvZmZzZXQgPT0gMHhGRkZGVSApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGlmICggb2Zmc2V0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwICs9IG9mZnNldCArICggY2hhcmNvZGUgLSBzdGFydCApICogMjsKLSAgICAgICAgICAgIGdpbmRleCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBnaW5kZXggKyBkZWx0YSApICYgMHhGRkZGVTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBjaGFyY29kZSArIGRlbHRhICkgJiAweEZGRkZVOwotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCAhbmV4dCB8fCBnaW5kZXggKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIG5leHQgJiYgZ2luZGV4ICkKLSAgICAgICpwY2hhcmNvZGUgPSBjaGFyY29kZTsKLQotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIHR0X2NtYXA0X2NoYXJfbWFwX2JpbmFyeSggVFRfQ01hcCAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCogIHBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgbmV4dCApCi0gIHsKLSAgICBGVF9VSW50ICAgbnVtX3NlZ3MyLCBzdGFydCwgZW5kLCBvZmZzZXQ7Ci0gICAgRlRfSW50ICAgIGRlbHRhOwotICAgIEZUX1VJbnQgICBtYXgsIG1pbiwgbWlkLCBudW1fc2VnczsKLSAgICBGVF9VSW50ICAgY2hhcmNvZGUgPSAqcGNoYXJjb2RlOwotICAgIEZUX1VJbnQgICBnaW5kZXggICA9IDA7Ci0gICAgRlRfQnl0ZSogIHA7Ci0KLQotICAgIHAgPSBjbWFwLT5kYXRhICsgNjsKLSAgICBudW1fc2VnczIgPSBGVF9QQURfRkxPT1IoIFRUX1BFRUtfVVNIT1JUKCBwICksIDIgKTsKLQotICAgIGlmICggIW51bV9zZWdzMiApCi0gICAgICByZXR1cm4gMDsKLQotICAgIG51bV9zZWdzID0gbnVtX3NlZ3MyID4+IDE7Ci0KLSAgICAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgbWlkID0gbnVtX3NlZ3M7Ci0gICAgZW5kID0gMHhGRkZGVTsKLQotICAgIGlmICggbmV4dCApCi0gICAgICBjaGFyY29kZSsrOwotCi0gICAgbWluID0gMDsKLSAgICBtYXggPSBudW1fc2VnczsKLQotICAgIC8qIGJpbmFyeSBzZWFyY2ggKi8KLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgbWlkICAgID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgcCAgICAgID0gY21hcC0+ZGF0YSArIDE0ICsgbWlkICogMjsKLSAgICAgIGVuZCAgICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICBwICAgICArPSAyICsgbnVtX3NlZ3MyOwotICAgICAgc3RhcnQgID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBjaGFyY29kZSA8IHN0YXJ0ICkKLSAgICAgICAgbWF4ID0gbWlkOwotICAgICAgZWxzZSBpZiAoIGNoYXJjb2RlID4gZW5kICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICBkZWx0YSAgPSBUVF9QRUVLX1NIT1JUKCBwICk7Ci0gICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgb2Zmc2V0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgICAvKiBzZWFyY2ggdGhlIGZpcnN0IHNlZ21lbnQgY29udGFpbmluZyBgY2hhcmNvZGUnICovCi0gICAgICAgIGlmICggY21hcC0+ZmxhZ3MgJiBUVF9DTUFQX0ZMQUdfT1ZFUkxBUFBJTkcgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICAgICAgLyogY2FsbCB0aGUgY3VycmVudCBzZWdtZW50IGBtYXgnICovCi0gICAgICAgICAgbWF4ID0gbWlkOwotCi0gICAgICAgICAgaWYgKCBvZmZzZXQgPT0gMHhGRkZGVSApCi0gICAgICAgICAgICBtaWQgPSBtYXggKyAxOwotCi0gICAgICAgICAgLyogc2VhcmNoIGluIHNlZ21lbnRzIGJlZm9yZSB0aGUgY3VycmVudCBzZWdtZW50ICovCi0gICAgICAgICAgZm9yICggaSA9IG1heCA7IGkgPiAwOyBpLS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgICBwcmV2X2VuZDsKLSAgICAgICAgICAgIEZUX0J5dGUqICBvbGRfcDsKLQotCi0gICAgICAgICAgICBvbGRfcCAgICA9IHA7Ci0gICAgICAgICAgICBwICAgICAgICA9IGNtYXAtPmRhdGEgKyAxNCArICggaSAtIDEgKSAqIDI7Ci0gICAgICAgICAgICBwcmV2X2VuZCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgICAgIGlmICggY2hhcmNvZGUgPiBwcmV2X2VuZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHAgPSBvbGRfcDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVuZCAgICA9IHByZXZfZW5kOwotICAgICAgICAgICAgcCAgICAgKz0gMiArIG51bV9zZWdzMjsKLSAgICAgICAgICAgIHN0YXJ0ICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICBkZWx0YSAgPSBUVF9QRUVLX1NIT1JUKCBwICk7Ci0gICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICBvZmZzZXQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgICAgICAgICBpZiAoIG9mZnNldCAhPSAweEZGRkZVICkKLSAgICAgICAgICAgICAgbWlkID0gaSAtIDE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogbm8gbHVjayAqLwotICAgICAgICAgIGlmICggbWlkID09IG1heCArIDEgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggaSAhPSBtYXggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwICAgICAgPSBjbWFwLT5kYXRhICsgMTQgKyBtYXggKiAyOwotICAgICAgICAgICAgICBlbmQgICAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgICBwICAgICArPSAyICsgbnVtX3NlZ3MyOwotICAgICAgICAgICAgICBzdGFydCAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICAgIGRlbHRhICA9IFRUX1BFRUtfU0hPUlQoIHAgKTsKLSAgICAgICAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICAgICAgICBvZmZzZXQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtaWQgPSBtYXg7Ci0KLSAgICAgICAgICAgIC8qIHNlYXJjaCBpbiBzZWdtZW50cyBhZnRlciB0aGUgY3VycmVudCBzZWdtZW50ICovCi0gICAgICAgICAgICBmb3IgKCBpID0gbWF4ICsgMTsgaSA8IG51bV9zZWdzOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9VSW50ICBuZXh0X2VuZCwgbmV4dF9zdGFydDsKLQotCi0gICAgICAgICAgICAgIHAgICAgICAgICAgPSBjbWFwLT5kYXRhICsgMTQgKyBpICogMjsKLSAgICAgICAgICAgICAgbmV4dF9lbmQgICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICAgIHAgICAgICAgICArPSAyICsgbnVtX3NlZ3MyOwotICAgICAgICAgICAgICBuZXh0X3N0YXJ0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgICAgICAgICBpZiAoIGNoYXJjb2RlIDwgbmV4dF9zdGFydCApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgZW5kICAgID0gbmV4dF9lbmQ7Ci0gICAgICAgICAgICAgIHN0YXJ0ICA9IG5leHRfc3RhcnQ7Ci0gICAgICAgICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgICAgICAgZGVsdGEgID0gVFRfUEVFS19TSE9SVCggcCApOwotICAgICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICAgIG9mZnNldCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBvZmZzZXQgIT0gMHhGRkZGVSApCi0gICAgICAgICAgICAgICAgbWlkID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGktLTsKLQotICAgICAgICAgICAgLyogc3RpbGwgbm8gbHVjayAqLwotICAgICAgICAgICAgaWYgKCBtaWQgPT0gbWF4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWlkID0gaTsKLQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBlbmQsIHN0YXJ0LCBkZWx0YSwgYW5kIG9mZnNldCBhcmUgZm9yIHRoZSBpJ3RoIHNlZ21lbnQgKi8KLSAgICAgICAgICBpZiAoIG1pZCAhPSBpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwICAgICAgPSBjbWFwLT5kYXRhICsgMTQgKyBtaWQgKiAyOwotICAgICAgICAgICAgZW5kICAgID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIHAgICAgICs9IDIgKyBudW1fc2VnczI7Ci0gICAgICAgICAgICBzdGFydCAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICAgICAgZGVsdGEgID0gVFRfUEVFS19TSE9SVCggcCApOwotICAgICAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICAgICAgb2Zmc2V0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBvZmZzZXQgPT0gMHhGRkZGVSApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggb2Zmc2V0ICkKLSAgICAgICAgewotICAgICAgICAgIHAgKz0gb2Zmc2V0ICsgKCBjaGFyY29kZSAtIHN0YXJ0ICkgKiAyOwotICAgICAgICAgIGdpbmRleCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgaWYgKCBnaW5kZXggIT0gMCApCi0gICAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIGdpbmRleCArIGRlbHRhICkgJiAweEZGRkZVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIGNoYXJjb2RlICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBuZXh0ICkKLSAgICB7Ci0gICAgICBUVF9DTWFwNCAgY21hcDQgPSAoVFRfQ01hcDQpY21hcDsKLQotCi0gICAgICAvKiBpZiBgY2hhcmNvZGUnIGlzIG5vdCBpbiBhbnkgc2VnbWVudCwgdGhlbiBgbWlkJyBpcyAqLwotICAgICAgLyogdGhlIHNlZ21lbnQgbmVhcmVzdCB0byBgY2hhcmNvZGUnICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGlmICggY2hhcmNvZGUgPiBlbmQgKQotICAgICAgewotICAgICAgICBtaWQrKzsKLSAgICAgICAgaWYgKCBtaWQgPT0gbnVtX3NlZ3MgKQotICAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBpZiAoIHR0X2NtYXA0X3NldF9yYW5nZSggY21hcDQsIG1pZCApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBnaW5kZXggKQotICAgICAgICAgICpwY2hhcmNvZGUgPSBjaGFyY29kZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY21hcDQtPmN1cl9jaGFyY29kZSA9IGNoYXJjb2RlOwotCi0gICAgICAgIGlmICggZ2luZGV4ICkKLSAgICAgICAgICBjbWFwNC0+Y3VyX2dpbmRleCA9IGdpbmRleDsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY21hcDQtPmN1cl9jaGFyY29kZSA9IGNoYXJjb2RlOwotICAgICAgICAgIHR0X2NtYXA0X25leHQoIGNtYXA0ICk7Ci0gICAgICAgICAgZ2luZGV4ID0gY21hcDQtPmN1cl9naW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICAgKnBjaGFyY29kZSA9IGNtYXA0LT5jdXJfY2hhcmNvZGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDRfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApCi0gIHsKLSAgICBpZiAoIGNoYXJfY29kZSA+PSAweDEwMDAwVUwgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIGNtYXAtPmZsYWdzICYgVFRfQ01BUF9GTEFHX1VOU09SVEVEICkKLSAgICAgIHJldHVybiB0dF9jbWFwNF9jaGFyX21hcF9saW5lYXIoIGNtYXAsICZjaGFyX2NvZGUsIDAgKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHRfY21hcDRfY2hhcl9tYXBfYmluYXJ5KCBjbWFwLCAmY2hhcl9jb2RlLCAwICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHR0X2NtYXA0X2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICpwY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VJbnQgIGdpbmRleDsKLQotCi0gICAgaWYgKCAqcGNoYXJfY29kZSA+PSAweEZGRkZVICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCBjbWFwLT5mbGFncyAmIFRUX0NNQVBfRkxBR19VTlNPUlRFRCApCi0gICAgICBnaW5kZXggPSB0dF9jbWFwNF9jaGFyX21hcF9saW5lYXIoIGNtYXAsIHBjaGFyX2NvZGUsIDEgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgVFRfQ01hcDQgIGNtYXA0ID0gKFRUX0NNYXA0KWNtYXA7Ci0KLQotICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggKi8KLSAgICAgIGlmICggKnBjaGFyX2NvZGUgPT0gY21hcDQtPmN1cl9jaGFyY29kZSApCi0gICAgICB7Ci0gICAgICAgIHR0X2NtYXA0X25leHQoIGNtYXA0ICk7Ci0gICAgICAgIGdpbmRleCA9IGNtYXA0LT5jdXJfZ2luZGV4OwotICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICAgKnBjaGFyX2NvZGUgPSBjbWFwNC0+Y3VyX2NoYXJjb2RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBnaW5kZXggPSB0dF9jbWFwNF9jaGFyX21hcF9iaW5hcnkoIGNtYXAsIHBjaGFyX2NvZGUsIDEgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDRfZ2V0X2luZm8oIFRUX0NNYXAgICAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gY21hcC0+ZGF0YSArIDQ7Ci0KLQotICAgIGNtYXBfaW5mby0+Zm9ybWF0ID0gNDsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBUVF9DTWFwX0NsYXNzUmVjICB0dF9jbWFwNF9jbGFzc19yZWMgPQotICB7Ci0gICAgewotICAgICAgc2l6ZW9mICggVFRfQ01hcDRSZWMgKSwKLSAgICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcDRfaW5pdCwKLSAgICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgTlVMTCwKLSAgICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDRfY2hhcl9pbmRleCwKLSAgICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDRfY2hhcl9uZXh0LAotCi0gICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gICAgfSwKLSAgICA0LAotICAgIChUVF9DTWFwX1ZhbGlkYXRlRnVuYykgICB0dF9jbWFwNF92YWxpZGF0ZSwKLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpICAgdHRfY21hcDRfZ2V0X2luZm8KLSAgfTsKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF80ICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgICAgIFRZUEUgICAgICAgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICBtdXN0IGJlIDQgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAqLwotICAvKiAgIGxhbmd1YWdlICAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZmlyc3QgICAgICAgIDYgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgZmlyc3Qgc2VnbWVudCBjb2RlICAgICAqLwotICAvKiAgIGNvdW50ICAgICAgICA4ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIHNlZ21lbnQgc2l6ZSBpbiBjaGFycyAgKi8KLSAgLyogICBnbHlwaElkcyAgICAgMTAgICAgICAgICAgICAgVVNIT1JUW2NvdW50XSAgICBnbHlwaCBpZHMgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHZlcnkgc2ltcGxpZmllZCBzZWdtZW50IG1hcHBpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNgotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwNl92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIGxlbmd0aCwgY291bnQ7Ci0KLQotICAgIGlmICggdGFibGUgKyAxMCA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIHAgICAgICA9IHRhYmxlICsgMjsKLSAgICBsZW5ndGggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgcCAgICAgID0gdGFibGUgKyA4OyAgICAgICAgICAgICAvKiBza2lwIGxhbmd1YWdlIGFuZCBzdGFydCBpbmRleCAqLwotICAgIGNvdW50ICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBpZiAoIHRhYmxlICsgbGVuZ3RoID4gdmFsaWQtPmxpbWl0IHx8IGxlbmd0aCA8IDEwICsgY291bnQgKiAyICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgLyogY2hlY2sgZ2x5cGggaW5kaWNlcyAqLwotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBnaW5kZXg7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgewotICAgICAgICBnaW5kZXggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBpZiAoIGdpbmRleCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHR0X2NtYXA2X2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogIHRhYmxlICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfVUludCAgIHJlc3VsdCA9IDA7Ci0gICAgRlRfQnl0ZSogIHAgICAgICA9IHRhYmxlICsgNjsKLSAgICBGVF9VSW50ICAgc3RhcnQgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBGVF9VSW50ICAgY291bnQgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBGVF9VSW50ICAgaWR4ICAgID0gKEZUX1VJbnQpKCBjaGFyX2NvZGUgLSBzdGFydCApOwotCi0KLSAgICBpZiAoIGlkeCA8IGNvdW50ICkKLSAgICB7Ci0gICAgICBwICs9IDIgKiBpZHg7Ci0gICAgICByZXN1bHQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwNl9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfVUludDMyICByZXN1bHQgICAgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGUgKyAxOwotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgID0gMDsKLQotICAgIEZUX0J5dGUqICAgcCAgICAgICAgID0gdGFibGUgKyA2OwotICAgIEZUX1VJbnQgICAgc3RhcnQgICAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBGVF9VSW50ICAgIGNvdW50ICAgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRlRfVUludCAgICBpZHg7Ci0KLQotICAgIGlmICggY2hhcl9jb2RlID49IDB4MTAwMDBVTCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGNoYXJfY29kZSA8IHN0YXJ0ICkKLSAgICAgIGNoYXJfY29kZSA9IHN0YXJ0OwotCi0gICAgaWR4ID0gKEZUX1VJbnQpKCBjaGFyX2NvZGUgLSBzdGFydCApOwotICAgIHAgICs9IDIgKiBpZHg7Ci0KLSAgICBmb3IgKCA7IGlkeCA8IGNvdW50OyBpZHgrKyApCi0gICAgewotICAgICAgZ2luZGV4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjaGFyX2NvZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2hhcl9jb2RlKys7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKnBjaGFyX2NvZGUgPSByZXN1bHQ7Ci0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA2X2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA0OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCA9IDY7Ci0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IChGVF9VTG9uZylUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgVFRfQ01hcF9DbGFzc1JlYyAgdHRfY21hcDZfY2xhc3NfcmVjID0KLSAgewotICAgIHsKLSAgICAgIHNpemVvZiAoIFRUX0NNYXBSZWMgKSwKLQotICAgICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwX2luaXQsCi0gICAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsCi0gICAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXR0X2NtYXA2X2NoYXJfaW5kZXgsCi0gICAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXA2X2NoYXJfbmV4dCwKLQotICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICAgIH0sCi0gICAgNiwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpICAgdHRfY21hcDZfdmFsaWRhdGUsCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKSAgIHR0X2NtYXA2X2dldF9pbmZvCi0gIH07Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogSXQncyBoYXJkIHRvIGNvbXBsZXRlbHkgdW5kZXJzdGFuZCB3aGF0IHRoZSBPcGVuVHlwZSBzcGVjICAgICAqKioqKi8KLSAgLyoqKioqIHNheXMgYWJvdXQgdGhpcyBmb3JtYXQsIGJ1dCBoZXJlIGlzIG15IGNvbmNsdXNpb24uICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmb3JtYXQgaXMgdG8gZWFzaWx5IG1hcCBVVEYtMTYgdGV4dCB0byAgICAqKioqKi8KLSAgLyoqKioqIGdseXBoIGluZGljZXMuICBCYXNpY2FsbHksIHRoZSBgY2hhcl9jb2RlJyBtdXN0IGJlIGluIG9uZSBvZiAgKioqKiovCi0gIC8qKioqKiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgLSBBIDE2LWJpdCB2YWx1ZSB0aGF0IGlzbid0IHBhcnQgb2YgdGhlIFVuaWNvZGUgU3Vycm9nYXRlcyAgKioqKiovCi0gIC8qKioqKiAgICAgQXJlYSAoaS5lLiBVK0Q4MDAtVStERkZGKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgLSBBIDMyLWJpdCB2YWx1ZSwgbWFkZSBvZiB0d28gc3Vycm9nYXRlIHZhbHVlcywgaS5lLi4gaWYgICAgKioqKiovCi0gIC8qKioqKiAgICAgYGNoYXJfY29kZSA9IChjaGFyX2hpIDw8IDE2KSB8IGNoYXJfbG8nLCB0aGVuIGJvdGggICAgICAgICoqKioqLwotICAvKioqKiogICAgIGBjaGFyX2hpJyBhbmQgYGNoYXJfbG8nIG11c3QgYmUgaW4gdGhlIFN1cnJvZ2F0ZXMgQXJlYS4gICAqKioqKi8KLSAgLyoqKioqICAgICAgQXJlYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogVGhlICdpczMyJyB0YWJsZSBlbWJlZGRlZCBpbiB0aGUgY2hhcm1hcCBpbmRpY2F0ZXMgd2hldGhlciBhICAqKioqKi8KLSAgLyoqKioqIGdpdmVuIDE2LWJpdCB2YWx1ZSBpcyBpbiB0aGUgc3Vycm9nYXRlcyBhcmVhIG9yIG5vdC4gICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogU28sIGZvciBhbnkgZ2l2ZW4gYGNoYXJfY29kZScsIHdlIGNhbiBhc3NlcnQgdGhlIGZvbGxvd2luZzogICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIElmIGBjaGFyX2hpID09IDAnIHRoZW4gd2UgbXVzdCBoYXZlIGBpczMyW2NoYXJfbG9dID09IDAnLiAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgSWYgYGNoYXJfaGkgIT0gMCcgdGhlbiB3ZSBtdXN0IGhhdmUgYm90aCAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIGBpczMyW2NoYXJfaGldICE9IDAnIGFuZCBgaXMzMltjaGFyX2xvXSAhPSAwJy4gICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgICAgICBUWVBFICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgICAgIFVTSE9SVCAgICAgIG11c3QgYmUgOCAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICByZXNlcnZlZCAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgNCAgICAgICAgICAgICAgVUxPTkcgICAgICAgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgICAgIFVMT05HICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICAgKi8KLSAgLyogICBpczMyICAgICAgICAxMiAgICAgICAgICAgICBCWVRFWzgxOTJdICAzMi1iaXRuZXNzIGJpdG1hcCAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgODIwNCAgICAgICAgICAgVUxPTkcgICAgICAgbnVtYmVyIG9mIGdyb3VwcyAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgJ2NvdW50JyBncm91cHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0ICAgICAgIDAgICAgICAgICAgICAgIFVMT05HICAgICAgIGZpcnN0IGNoYXJjb2RlICAgICAgICAgICAgICAgKi8KLSAgLyogICBlbmQgICAgICAgICA0ICAgICAgICAgICAgICBVTE9ORyAgICAgICBsYXN0IGNoYXJjb2RlICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRJZCAgICAgOCAgICAgICAgICAgICAgVUxPTkcgICAgICAgc3RhcnQgZ2x5cGggaWQgZm9yIHRoZSBncm91cCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF84Ci0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA4X3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHAgPSB0YWJsZSArIDQ7Ci0gICAgRlRfQnl0ZSogICBpczMyOwotICAgIEZUX1VJbnQzMiAgbGVuZ3RoOwotICAgIEZUX1VJbnQzMiAgbnVtX2dyb3VwczsKLQotCi0gICAgaWYgKCB0YWJsZSArIDE2ICsgODE5MiA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIGxlbmd0aCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBpZiAoIHRhYmxlICsgbGVuZ3RoID4gdmFsaWQtPmxpbWl0IHx8IGxlbmd0aCA8IDgyMDggKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBpczMyICAgICAgID0gdGFibGUgKyAxMjsKLSAgICBwICAgICAgICAgID0gaXMzMiAgKyA4MTkyOyAgICAgICAgICAvKiBza2lwIGBpczMyJyBhcnJheSAqLwotICAgIG51bV9ncm91cHMgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIHAgKyBudW1fZ3JvdXBzICogMTIgPiB2YWxpZC0+bGltaXQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBjaGVjayBncm91cHMsIHRoZXkgbXVzdCBiZSBpbiBpbmNyZWFzaW5nIG9yZGVyICovCi0gICAgewotICAgICAgRlRfVUludDMyICBuLCBzdGFydCwgZW5kLCBzdGFydF9pZCwgY291bnQsIGxhc3QgPSAwOwotCi0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2dyb3VwczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgIGhpLCBsbzsKLQotCi0gICAgICAgIHN0YXJ0ICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBlbmQgICAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgc3RhcnRfaWQgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgICAgaWYgKCBzdGFydCA+IGVuZCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgIGlmICggbiA+IDAgJiYgc3RhcnQgPD0gbGFzdCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggc3RhcnRfaWQgKyBlbmQgLSBzdGFydCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotCi0gICAgICAgICAgY291bnQgPSAoRlRfVUludDMyKSggZW5kIC0gc3RhcnQgKyAxICk7Ci0KLSAgICAgICAgICBpZiAoIHN0YXJ0ICYgfjB4RkZGRlUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHN0YXJ0X2hpICE9IDA7IGNoZWNrIHRoYXQgaXMzMltpXSBpcyAxIGZvciBlYWNoIGkgaW4gKi8KLSAgICAgICAgICAgIC8qIHRoZSBgaGknIGFuZCBgbG8nIG9mIHRoZSByYW5nZSBbc3RhcnQuLmVuZF0gICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzdGFydCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaGkgPSAoRlRfVUludCkoIHN0YXJ0ID4+IDE2ICk7Ci0gICAgICAgICAgICAgIGxvID0gKEZUX1VJbnQpKCBzdGFydCAmIDB4RkZGRlUgKTsKLQotICAgICAgICAgICAgICBpZiAoIChpczMyW2hpID4+IDNdICYgKCAweDgwID4+ICggaGkgJiA3ICkgKSApID09IDAgKQotICAgICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICAgICAgICBpZiAoIChpczMyW2xvID4+IDNdICYgKCAweDgwID4+ICggbG8gJiA3ICkgKSApID09IDAgKQotICAgICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHN0YXJ0X2hpID09IDA7IGNoZWNrIHRoYXQgaXMzMltpXSBpcyAwIGZvciBlYWNoIGkgaW4gKi8KLSAgICAgICAgICAgIC8qIHRoZSByYW5nZSBbc3RhcnQuLmVuZF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgLyogZW5kX2hpIGNhbm5vdCBiZSAhPSAwISAqLwotICAgICAgICAgICAgaWYgKCBlbmQgJiB+MHhGRkZGVSApCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHN0YXJ0KysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsbyA9IChGVF9VSW50KSggc3RhcnQgJiAweEZGRkZVICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCAoaXMzMltsbyA+PiAzXSAmICggMHg4MCA+PiAoIGxvICYgNyApICkgKSAhPSAwICkKLSAgICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbGFzdCA9IGVuZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHR0X2NtYXA4X2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogICB0YWJsZSAgICAgID0gY21hcC0+ZGF0YTsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCAgICAgPSAwOwotICAgIEZUX0J5dGUqICAgcCAgICAgICAgICA9IHRhYmxlICsgODIwNDsKLSAgICBGVF9VSW50MzIgIG51bV9ncm91cHMgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBzdGFydCwgZW5kLCBzdGFydF9pZDsKLQotCi0gICAgZm9yICggOyBudW1fZ3JvdXBzID4gMDsgbnVtX2dyb3Vwcy0tICkKLSAgICB7Ci0gICAgICBzdGFydCAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgc3RhcnRfaWQgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPD0gZW5kICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEZUX1VJbnQpKCBzdGFydF9pZCArIGNoYXJfY29kZSAtIHN0YXJ0ICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwOF9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50MzIgIHJlc3VsdCAgICAgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICA9ICpwY2hhcl9jb2RlICsgMTsKLSAgICBGVF9VSW50ICAgIGdpbmRleCAgICAgPSAwOwotICAgIEZUX0J5dGUqICAgdGFibGUgICAgICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfQnl0ZSogICBwICAgICAgICAgID0gdGFibGUgKyA4MjA0OwotICAgIEZUX1VJbnQzMiAgbnVtX2dyb3VwcyA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBGVF9VSW50MzIgIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkOwotCi0KLSAgICBwID0gdGFibGUgKyA4MjA4OwotCi0gICAgZm9yICggOyBudW1fZ3JvdXBzID4gMDsgbnVtX2dyb3Vwcy0tICkKLSAgICB7Ci0gICAgICBzdGFydCAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgc3RhcnRfaWQgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBjaGFyX2NvZGUgPSBzdGFydDsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPD0gZW5kICkKLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBjaGFyX2NvZGUgLSBzdGFydCArIHN0YXJ0X2lkICk7Ci0gICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gY2hhcl9jb2RlOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgICpwY2hhcl9jb2RlID0gcmVzdWx0OwotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwOF9nZXRfaW5mbyggVFRfQ01hcCAgICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSBjbWFwLT5kYXRhICsgODsKLQotCi0gICAgY21hcF9pbmZvLT5mb3JtYXQgPSA4OwotICAgIGNtYXBfaW5mby0+bGFuZ3VhZ2UgPSAoRlRfVUxvbmcpVFRfUEVFS19VTE9ORyggcCApOwotCi0gICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgVFRfQ01hcF9DbGFzc1JlYyAgdHRfY21hcDhfY2xhc3NfcmVjID0KLSAgewotICAgIHsKLSAgICAgIHNpemVvZiAoIFRUX0NNYXBSZWMgKSwKLQotICAgICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwX2luaXQsCi0gICAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsCi0gICAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXR0X2NtYXA4X2NoYXJfaW5kZXgsCi0gICAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXA4X2NoYXJfbmV4dCwKLQotICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICAgIH0sCi0gICAgOCwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpICAgdHRfY21hcDhfdmFsaWRhdGUsCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKSAgIHR0X2NtYXA4X2dldF9pbmZvCi0gIH07Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfOCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICBPRkZTRVQgIFRZUEUgICAgICAgICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAwICAgICAgVVNIT1JUICAgICAgICAgICAgIG11c3QgYmUgMTAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHJlc2VydmVkICAgMiAgICAgIFVTSE9SVCAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsZW5ndGggICAgIDQgICAgICBVTE9ORyAgICAgICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGFuZ3VhZ2UgICA4ICAgICAgVUxPTkcgICAgICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydCAgICAgMTIgICAgICBVTE9ORyAgICAgICAgICAgICAgZmlyc3QgY2hhciBpbiByYW5nZSAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgIDE2ICAgICAgVUxPTkcgICAgICAgICAgICAgIG51bWJlciBvZiBjaGFycyBpbiByYW5nZSAgICAgICAqLwotICAvKiAgIGdseXBoSWRzICAyMCAgICAgIFVTSE9SVFtjb3VudF0gICAgICBnbHlwaCBpbmRpY2VzIGNvdmVyZWQgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTAKLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDEwX3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSB0YWJsZSArIDQ7Ci0gICAgRlRfVUxvbmcgIGxlbmd0aCwgY291bnQ7Ci0KLQotICAgIGlmICggdGFibGUgKyAyMCA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIGxlbmd0aCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBwICAgICAgPSB0YWJsZSArIDE2OwotICAgIGNvdW50ICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIGlmICggdGFibGUgKyBsZW5ndGggPiB2YWxpZC0+bGltaXQgfHwgbGVuZ3RoIDwgMjAgKyBjb3VudCAqIDIgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBjaGVjayBnbHlwaCBpbmRpY2VzICovCi0gICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGdpbmRleDsKLQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICB7Ci0gICAgICAgIGdpbmRleCA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIGlmICggZ2luZGV4ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDEwX2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0J5dGUqICAgdGFibGUgID0gY21hcC0+ZGF0YTsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCA9IDA7Ci0gICAgRlRfQnl0ZSogICBwICAgICAgPSB0YWJsZSArIDEyOwotICAgIEZUX1VJbnQzMiAgc3RhcnQgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIEZUX1VJbnQzMiAgY291bnQgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIEZUX1VJbnQzMiAgaWR4ICAgID0gKEZUX1VMb25nKSggY2hhcl9jb2RlIC0gc3RhcnQgKTsKLQotCi0gICAgaWYgKCBpZHggPCBjb3VudCApCi0gICAgewotICAgICAgcCAgICAgKz0gMiAqIGlkeDsKLSAgICAgIHJlc3VsdCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIHR0X2NtYXAxMF9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogICB0YWJsZSAgICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGUgKyAxOwotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgID0gMDsKLSAgICBGVF9CeXRlKiAgIHAgICAgICAgICA9IHRhYmxlICsgMTI7Ci0gICAgRlRfVUludDMyICBzdGFydCAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBjb3VudCAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBpZHg7Ci0KLQotICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgY2hhcl9jb2RlID0gc3RhcnQ7Ci0KLSAgICBpZHggPSAoRlRfVUludDMyKSggY2hhcl9jb2RlIC0gc3RhcnQgKTsKLSAgICBwICArPSAyICogaWR4OwotCi0gICAgZm9yICggOyBpZHggPCBjb3VudDsgaWR4KysgKQotICAgIHsKLSAgICAgIGdpbmRleCA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjaGFyX2NvZGUrKzsKLSAgICB9Ci0KLSAgICAqcGNoYXJfY29kZSA9IGNoYXJfY29kZTsKLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDEwX2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSBjbWFwLT5kYXRhICsgODsKLQotCi0gICAgY21hcF9pbmZvLT5mb3JtYXQgPSAxMDsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVUxPTkcoIHAgKTsKLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IFRUX0NNYXBfQ2xhc3NSZWMgIHR0X2NtYXAxMF9jbGFzc19yZWMgPQotICB7Ci0gICAgewotICAgICAgc2l6ZW9mICggVFRfQ01hcFJlYyApLAotCi0gICAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHR0X2NtYXBfaW5pdCwKLSAgICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgTlVMTCwKLSAgICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDEwX2NoYXJfaW5kZXgsCi0gICAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXAxMF9jaGFyX25leHQsCi0KLSAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKLSAgICB9LAotICAgIDEwLAotICAgIChUVF9DTWFwX1ZhbGlkYXRlRnVuYykgICB0dF9jbWFwMTBfdmFsaWRhdGUsCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKSAgIHR0X2NtYXAxMF9nZXRfaW5mbwotICB9OwotCi0jZW5kaWYgLyogVFRfQ09ORklHX0NNQVBfRk9STUFUXzEwICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICBUWVBFICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAwICAgICAgICAgIFVTSE9SVCAgICAgbXVzdCBiZSAxMiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgcmVzZXJ2ZWQgICAgMiAgICAgICAgICBVU0hPUlQgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgIDQgICAgICAgICAgVUxPTkcgICAgICBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICA4ICAgICAgICAgIFVMT05HICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgMTIgICAgICAgICBVTE9ORyAgICAgIG51bWJlciBvZiBncm91cHMgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGBjb3VudCcgZ3JvdXBzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydCAgICAgICAwICAgICAgICAgIFVMT05HICAgICAgZmlyc3QgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZW5kICAgICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxhc3QgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0SWQgICAgIDggICAgICAgICAgVUxPTkcgICAgICBzdGFydCBnbHlwaCBpZCBmb3IgdGhlIGdyb3VwICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTIKLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcDEyUmVjXwotICB7Ci0gICAgVFRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9Cb29sICAgICB2YWxpZDsKLSAgICBGVF9VTG9uZyAgICBjdXJfY2hhcmNvZGU7Ci0gICAgRlRfVUludCAgICAgY3VyX2dpbmRleDsKLSAgICBGVF9VTG9uZyAgICBjdXJfZ3JvdXA7Ci0gICAgRlRfVUxvbmcgICAgbnVtX2dyb3VwczsKLQotICB9IFRUX0NNYXAxMlJlYywgKlRUX0NNYXAxMjsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTJfaW5pdCggVFRfQ01hcDEyICBjbWFwLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICB0YWJsZSApCi0gIHsKLSAgICBjbWFwLT5jbWFwLmRhdGEgID0gdGFibGU7Ci0KLSAgICB0YWJsZSAgICAgICAgICAgKz0gMTI7Ci0gICAgY21hcC0+bnVtX2dyb3VwcyA9IEZUX1BFRUtfVUxPTkcoIHRhYmxlICk7Ci0KLSAgICBjbWFwLT52YWxpZCAgICAgID0gMDsKLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxMl92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIEZUX0J5dGUqICAgcDsKLSAgICBGVF9VTG9uZyAgIGxlbmd0aDsKLSAgICBGVF9VTG9uZyAgIG51bV9ncm91cHM7Ci0KLQotICAgIGlmICggdGFibGUgKyAxNiA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIHAgICAgICA9IHRhYmxlICsgNDsKLSAgICBsZW5ndGggPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBwICAgICAgICAgID0gdGFibGUgKyAxMjsKLSAgICBudW1fZ3JvdXBzID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCB0YWJsZSArIGxlbmd0aCA+IHZhbGlkLT5saW1pdCB8fCBsZW5ndGggPCAxNiArIDEyICogbnVtX2dyb3VwcyApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIGNoZWNrIGdyb3VwcywgdGhleSBtdXN0IGJlIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgbiwgc3RhcnQsIGVuZCwgc3RhcnRfaWQsIGxhc3QgPSAwOwotCi0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2dyb3VwczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgc3RhcnQgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBzdGFydF9pZCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICBpZiAoIHN0YXJ0ID4gZW5kICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgaWYgKCBuID4gMCAmJiBzdGFydCA8PSBsYXN0ICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBzdGFydF9pZCArIGVuZCAtIHN0YXJ0ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBsYXN0ID0gZW5kOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgLyogc2VhcmNoIHRoZSBpbmRleCBvZiB0aGUgY2hhcmNvZGUgbmV4dCB0byBjbWFwLT5jdXJfY2hhcmNvZGUgKi8KLSAgLyogY21hcC0+Y3VyX2dyb3VwIHNob3VsZCBiZSBzZXQgdXAgcHJvcGVybHkgYnkgY2FsbGVyICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgdHRfY21hcDEyX25leHQoIFRUX0NNYXAxMiAgY21hcCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VTG9uZyAgc3RhcnQsIGVuZCwgc3RhcnRfaWQsIGNoYXJfY29kZTsKLSAgICBGVF9VTG9uZyAgbjsKLSAgICBGVF9VSW50ICAgZ2luZGV4OwotCi0KLSAgICBpZiAoIGNtYXAtPmN1cl9jaGFyY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgY2hhcl9jb2RlID0gY21hcC0+Y3VyX2NoYXJjb2RlICsgMTsKLQotICAgIG4gPSBjbWFwLT5jdXJfZ3JvdXA7Ci0KLSAgICBmb3IgKCBuID0gY21hcC0+Y3VyX2dyb3VwOyBuIDwgY21hcC0+bnVtX2dyb3VwczsgbisrICkKLSAgICB7Ci0gICAgICBwICAgICAgICA9IGNtYXAtPmNtYXAuZGF0YSArIDE2ICsgMTIgKiBuOwotICAgICAgc3RhcnQgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBlbmQgICAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIHN0YXJ0X2lkID0gVFRfUEVFS19VTE9ORyggcCApOwotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8IHN0YXJ0ICkKLSAgICAgICAgY2hhcl9jb2RlID0gc3RhcnQ7Ci0KLSAgICAgIGZvciAoIDsgY2hhcl9jb2RlIDw9IGVuZDsgY2hhcl9jb2RlKysgKQotICAgICAgewotICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIHN0YXJ0X2lkICsgY2hhcl9jb2RlIC0gc3RhcnQgKTsKLQotICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgIHsKLSAgICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyX2NvZGU7OwotICAgICAgICAgIGNtYXAtPmN1cl9naW5kZXggICA9IGdpbmRleDsKLSAgICAgICAgICBjbWFwLT5jdXJfZ3JvdXAgICAgPSBuOwotCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgY21hcC0+dmFsaWQgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0dF9jbWFwMTJfY2hhcl9tYXBfYmluYXJ5KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIqICBwY2hhcl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBuZXh0ICkKLSAgewotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgICA9IDA7Ci0gICAgRlRfQnl0ZSogICBwICAgICAgICAgID0gY21hcC0+ZGF0YSArIDEyOwotICAgIEZUX1VJbnQzMiAgbnVtX2dyb3VwcyA9IFRUX1BFRUtfVUxPTkcoIHAgKTsKLSAgICBGVF9VSW50MzIgIGNoYXJfY29kZSAgPSAqcGNoYXJfY29kZTsKLSAgICBGVF9VSW50MzIgIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkOwotICAgIEZUX1VJbnQzMiAgbWF4LCBtaW4sIG1pZDsKLQotCi0gICAgaWYgKCAhbnVtX2dyb3VwcyApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICBtaWQgPSBudW1fZ3JvdXBzOwotICAgIGVuZCA9IDB4RkZGRkZGRkZVTDsKLQotICAgIGlmICggbmV4dCApCi0gICAgICBjaGFyX2NvZGUrKzsKLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtX2dyb3VwczsKLQotICAgIC8qIGJpbmFyeSBzZWFyY2ggKi8KLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgbWlkID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgcCAgID0gY21hcC0+ZGF0YSArIDE2ICsgMTIgKiBtaWQ7Ci0KLSAgICAgIHN0YXJ0ID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZW5kICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICBlbHNlIGlmICggY2hhcl9jb2RlID4gZW5kICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3RhcnRfaWQgPSBUVF9QRUVLX1VMT05HKCBwICk7Ci0gICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggc3RhcnRfaWQgKyBjaGFyX2NvZGUgLSBzdGFydCApOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggbmV4dCApCi0gICAgewotICAgICAgVFRfQ01hcDEyICBjbWFwMTIgPSAoVFRfQ01hcDEyKWNtYXA7Ci0KLQotICAgICAgLyogaWYgYGNoYXJfY29kZScgaXMgbm90IGluIGFueSBncm91cCwgdGhlbiBgbWlkJyBpcyAqLwotICAgICAgLyogdGhlIGdyb3VwIG5lYXJlc3QgdG8gYGNoYXJfY29kZScgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBpZiAoIGNoYXJfY29kZSA+IGVuZCApCi0gICAgICB7Ci0gICAgICAgIG1pZCsrOwotICAgICAgICBpZiAoIG1pZCA9PSBudW1fZ3JvdXBzICkKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgY21hcDEyLT52YWxpZCAgICAgICAgPSAxOwotICAgICAgY21hcDEyLT5jdXJfY2hhcmNvZGUgPSBjaGFyX2NvZGU7Ci0gICAgICBjbWFwMTItPmN1cl9ncm91cCAgICA9IG1pZDsKLQotICAgICAgaWYgKCAhZ2luZGV4ICkKLSAgICAgIHsKLSAgICAgICAgdHRfY21hcDEyX25leHQoIGNtYXAxMiApOwotCi0gICAgICAgIGlmICggY21hcDEyLT52YWxpZCApCi0gICAgICAgICAgZ2luZGV4ID0gY21hcDEyLT5jdXJfZ2luZGV4OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBjbWFwMTItPmN1cl9naW5kZXggPSBnaW5kZXg7Ci0KLSAgICAgIGlmICggZ2luZGV4ICkKLSAgICAgICAgKnBjaGFyX2NvZGUgPSBjbWFwMTItPmN1cl9jaGFyY29kZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwMTJfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgcmV0dXJuIHR0X2NtYXAxMl9jaGFyX21hcF9iaW5hcnkoIGNtYXAsICZjaGFyX2NvZGUsIDAgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDEyX2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBUVF9DTWFwMTIgIGNtYXAxMiA9IChUVF9DTWFwMTIpY21hcDsKLSAgICBGVF9VTG9uZyAgIGdpbmRleDsKLQotCi0gICAgaWYgKCBjbWFwMTItPmN1cl9jaGFyY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBubyBuZWVkIHRvIHNlYXJjaCAqLwotICAgIGlmICggY21hcDEyLT52YWxpZCAmJiBjbWFwMTItPmN1cl9jaGFyY29kZSA9PSAqcGNoYXJfY29kZSApCi0gICAgewotICAgICAgdHRfY21hcDEyX25leHQoIGNtYXAxMiApOwotICAgICAgaWYgKCBjbWFwMTItPnZhbGlkICkKLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ID0gY21hcDEyLT5jdXJfZ2luZGV4OwotICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICAgKnBjaGFyX2NvZGUgPSBjbWFwMTItPmN1cl9jaGFyY29kZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZ2luZGV4ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZ2luZGV4ID0gdHRfY21hcDEyX2NoYXJfbWFwX2JpbmFyeSggY21hcCwgcGNoYXJfY29kZSwgMSApOwotCi0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxMl9nZXRfaW5mbyggVFRfQ01hcCAgICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gY21hcC0+ZGF0YSArIDg7Ci0KLQotICAgIGNtYXBfaW5mby0+Zm9ybWF0ID0gMTI7Ci0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IChGVF9VTG9uZylUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBUVF9DTWFwX0NsYXNzUmVjICB0dF9jbWFwMTJfY2xhc3NfcmVjID0KLSAgewotICAgIHsKLSAgICAgIHNpemVvZiAoIFRUX0NNYXAxMlJlYyApLAotCi0gICAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHR0X2NtYXAxMl9pbml0LAotICAgICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBOVUxMLAotICAgICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwMTJfY2hhcl9pbmRleCwKLSAgICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDEyX2NoYXJfbmV4dCwKLQotICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICAgIH0sCi0gICAgMTIsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKSAgIHR0X2NtYXAxMl92YWxpZGF0ZSwKLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpICAgdHRfY21hcDEyX2dldF9pbmZvCi0gIH07Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICAgT0ZGU0VUICBUWVBFICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgICAgIDAgICAgIFVTSE9SVCAgbXVzdCBiZSAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsZW5ndGggICAgICAgICAyICAgICBVTE9ORyAgIHRhYmxlIGxlbmd0aCBpbiBieXRlcyAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbnVtU2VsZWN0b3IgICAgNiAgICAgVUxPTkcgICBudW1iZXIgb2YgdmFyaWF0aW9uIHNlbC4gcmVjb3JkcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRm9sbG93ZWQgYnkgbnVtU2VsZWN0b3IgcmVjb3JkcywgZWFjaCBvZiB3aGljaCBsb29rcyBsaWtlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHZhclNlbGVjdG9yICAgIDAgICAgIFVJTlQyNCAgVW5pY29kZSBjb2RlcG9pbnQgb2Ygc2VsLiAgICAgICAgICAgICAgKi8KLSAgLyogICBkZWZhdWx0T2ZmICAgICAzICAgICBVTE9ORyAgIG9mZnNldCB0byBhIGRlZmF1bHQgVVZTIHRhYmxlICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliaW5nIGFueSB2YXJpYW50cyB0byBiZSBmb3VuZCBpbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5vcm1hbCBVbmljb2RlIHN1YnRhYmxlLiAgICAgICAgICAgKi8KLSAgLyogICBub25EZWZPZmYgICAgICA3ICAgICBVTE9ORyAgIG9mZnNldCB0byBhIG5vbi1kZWZhdWx0IFVWUyB0YWJsZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliaW5nIGFueSB2YXJpYW50cyBub3QgaW4gdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgY21hcCwgd2l0aCBHSURzIGhlcmUgICAgICAgICAgKi8KLSAgLyogKGVpdGhlciBvZmZzZXQgbWF5IGJlIDAgTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZWxlY3RvcnMgYXJlIHNvcnRlZCBieSBjb2RlIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgZGVmYXVsdCBVbmljb2RlIFZhcmlhdGlvbiBTZWxlY3RvciAoVVZTKSBzdWJ0YWJsZSBpcyBqdXN0IGEgbGlzdCBvZiAqLwotICAvKiByYW5nZXMgb2YgY29kZSBwb2ludHMgd2hpY2ggYXJlIHRvIGJlIGZvdW5kIGluIHRoZSBzdGFuZGFyZCBjbWFwLiAgTm8gKi8KLSAgLyogZ2x5cGggSURzIChHSURzKSBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIG51bVJhbmdlcyAgICAgIDAgICAgIFVMT05HICAgbnVtYmVyIG9mIHJhbmdlcyBmb2xsb3dpbmcgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgcmFuZ2UgbG9va3MgbGlrZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB1bmlTdGFydCAgICAgICAwICAgICBVSU5UMjQgIGNvZGUgcG9pbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGFkZGl0aW9uYWxDbnQgIDMgICAgIFVCWVRFICAgY291bnQgb2YgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGluIHRoaXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlICh6ZXJvIG1lYW5zIGEgcmFuZ2Ugb2YgYSBzaW5nbGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmFuZ2VzIGFyZSBzb3J0ZWQgYnkgYHVuaVN0YXJ0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIG5vbi1kZWZhdWx0IFVuaWNvZGUgVmFyaWF0aW9uIFNlbGVjdG9yIChVVlMpIHN1YnRhYmxlIGlzIGEgbGlzdCBvZiAgKi8KLSAgLyogbWFwcGluZ3MgZnJvbSBjb2RlcG9pbnQgdG8gR0lELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIG51bU1hcHBpbmdzICAgIDAgICAgIFVMT05HICAgbnVtYmVyIG9mIG1hcHBpbmdzICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgcmFuZ2UgbG9va3MgbGlrZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB1bmlTdGFydCAgICAgICAwICAgICBVSU5UMjQgIGNvZGUgcG9pbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEdJRCAgICAgICAgICAgIDMgICAgIFVTSE9SVCAgYW5kIGl0cyBHSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJhbmdlcyBhcmUgc29ydGVkIGJ5IGB1bmlTdGFydCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzE0Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXAxNFJlY18KLSAgewotICAgIFRUX0NNYXBSZWMgIGNtYXA7Ci0gICAgRlRfVUxvbmcgICAgbnVtX3NlbGVjdG9yczsKLQotICAgIC8qIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBzdG9yZSB0aGUgcmVzdWx0cyBvZiB2YXJpb3VzCi0gICAgICogY21hcCAxNCBxdWVyeSBmdW5jdGlvbnMuICBUaGUgZGF0YSBpcyBvdmVyd3JpdHRlbgotICAgICAqIG9uIGVhY2ggY2FsbCB0byB0aGVzZSBmdW5jdGlvbnMuCi0gICAgICovCi0gICAgRlRfVUludCAgICAgbWF4X3Jlc3VsdHM7Ci0gICAgRlRfVUludDMyKiAgcmVzdWx0czsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnk7Ci0KLSAgfSBUVF9DTWFwMTRSZWMsICpUVF9DTWFwMTQ7Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICB0dF9jbWFwMTRfZG9uZSggVFRfQ01hcDE0ICBjbWFwICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gY21hcC0+bWVtb3J5OwotCi0KLSAgICBjbWFwLT5tYXhfcmVzdWx0cyA9IDA7Ci0gICAgaWYgKCBtZW1vcnkgIT0gTlVMTCAmJiBjbWFwLT5yZXN1bHRzICE9IE5VTEwgKQotICAgICAgRlRfRlJFRSggY21hcC0+cmVzdWx0cyApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfY21hcDE0X2Vuc3VyZSggVFRfQ01hcDE0ICBjbWFwLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9yZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9VSW50ICAgb2xkX21heCA9IGNtYXAtPm1heF9yZXN1bHRzOwotICAgIEZUX0Vycm9yICBlcnJvciAgID0gMDsKLQotCi0gICAgaWYgKCBudW1fcmVzdWx0cyA+IGNtYXAtPm1heF9yZXN1bHRzICkKLSAgICB7Ci0gICAgICAgY21hcC0+bWVtb3J5ID0gbWVtb3J5OwotCi0gICAgICAgaWYgKCBGVF9RUkVORVdfQVJSQVkoIGNtYXAtPnJlc3VsdHMsIG9sZF9tYXgsIG51bV9yZXN1bHRzICkgKQotICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgY21hcC0+bWF4X3Jlc3VsdHMgPSBudW1fcmVzdWx0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTRfaW5pdCggVFRfQ01hcDE0ICBjbWFwLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICB0YWJsZSApCi0gIHsKLSAgICBjbWFwLT5jbWFwLmRhdGEgPSB0YWJsZTsKLQotICAgIHRhYmxlICAgICAgICAgICAgICAgKz0gNjsKLSAgICBjbWFwLT5udW1fc2VsZWN0b3JzID0gRlRfUEVFS19VTE9ORyggdGFibGUgKTsKLSAgICBjbWFwLT5tYXhfcmVzdWx0cyAgID0gMDsKLSAgICBjbWFwLT5yZXN1bHRzICAgICAgID0gTlVMTDsKLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxNF92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIEZUX0J5dGUqICBwICAgICAgICAgICAgID0gdGFibGUgKyAyOwotICAgIEZUX1VMb25nICBsZW5ndGggICAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIEZUX1VMb25nICBudW1fc2VsZWN0b3JzID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0KLSAgICBpZiAoIHRhYmxlICsgbGVuZ3RoID4gdmFsaWQtPmxpbWl0IHx8IGxlbmd0aCA8IDEwICsgMTEgKiBudW1fc2VsZWN0b3JzICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgLyogY2hlY2sgc2VsZWN0b3JzLCB0aGV5IG11c3QgYmUgaW4gaW5jcmVhc2luZyBvcmRlciAqLwotICAgIHsKLSAgICAgIC8qIHdlIHN0YXJ0IGxhc3RWYXJTZWwgYXQgMSBiZWNhdXNlIGEgdmFyaWFudCBzZWxlY3RvciB2YWx1ZSBvZiAwCi0gICAgICAgKiBpc24ndCB2YWxpZC4KLSAgICAgICAqLwotICAgICAgRlRfVUxvbmcgIG4sIGxhc3RWYXJTZWwgPSAxOwotCi0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX3NlbGVjdG9yczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUxvbmcgIHZhclNlbCAgICA9IFRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICAgIEZUX1VMb25nICBkZWZPZmYgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIEZUX1VMb25nICBub25kZWZPZmYgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLQotICAgICAgICBpZiAoIGRlZk9mZiA+PSBsZW5ndGggfHwgbm9uZGVmT2ZmID49IGxlbmd0aCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAgICAgaWYgKCB2YXJTZWwgPCBsYXN0VmFyU2VsICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgbGFzdFZhclNlbCA9IHZhclNlbCArIDE7Ci0KLSAgICAgICAgLyogY2hlY2sgdGhlIGRlZmF1bHQgdGFibGUgKHRoZXNlIGdseXBocyBzaG91bGQgYmUgcmVhY2hlZCAgICAgKi8KLSAgICAgICAgLyogdGhyb3VnaCB0aGUgbm9ybWFsIFVuaWNvZGUgY21hcCwgbm8gR0lEcywganVzdCBjaGVjayBvcmRlcikgKi8KLSAgICAgICAgaWYgKCBkZWZPZmYgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgZGVmcCAgICAgID0gdGFibGUgKyBkZWZPZmY7Ci0gICAgICAgICAgRlRfVUxvbmcgIG51bVJhbmdlcyA9IFRUX05FWFRfVUxPTkcoIGRlZnAgKTsKLSAgICAgICAgICBGVF9VTG9uZyAgaTsKLSAgICAgICAgICBGVF9VTG9uZyAgbGFzdEJhc2UgID0gMDsKLQotCi0gICAgICAgICAgaWYgKCBkZWZwICsgbnVtUmFuZ2VzICogNCA+IHZhbGlkLT5saW1pdCApCi0gICAgICAgICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtUmFuZ2VzOyArK2kgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VMb25nICBiYXNlID0gVFRfTkVYVF9VSU5UMjQoIGRlZnAgKTsKLSAgICAgICAgICAgIEZUX1VMb25nICBjbnQgID0gRlRfTkVYVF9CWVRFKCBkZWZwICk7Ci0KLQotICAgICAgICAgICAgaWYgKCBiYXNlICsgY250ID49IDB4MTEwMDAwVUwgKSAgICAgICAgICAgICAgLyogZW5kIG9mIFVuaWNvZGUgKi8KLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgICAgICBpZiAoIGJhc2UgPCBsYXN0QmFzZSApCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICAgICAgbGFzdEJhc2UgPSBiYXNlICsgY250ICsgMVU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogYW5kIHRoZSBub24tZGVmYXVsdCB0YWJsZSAodGhlc2UgZ2x5cGhzIGFyZSBzcGVjaWZpZWQgaGVyZSkgKi8KLSAgICAgICAgaWYgKCBub25kZWZPZmYgIT0gMCApIHsKLSAgICAgICAgICBGVF9CeXRlKiAgbmRwICAgICAgICAgPSB0YWJsZSArIG5vbmRlZk9mZjsKLSAgICAgICAgICBGVF9VTG9uZyAgbnVtTWFwcGluZ3MgPSBUVF9ORVhUX1VMT05HKCBuZHAgKTsKLSAgICAgICAgICBGVF9VTG9uZyAgaSwgbGFzdFVuaSA9IDA7Ci0KLQotICAgICAgICAgIGlmICggbmRwICsgbnVtTWFwcGluZ3MgKiA0ID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1NYXBwaW5nczsgKytpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VTG9uZyAgdW5pID0gVFRfTkVYVF9VSU5UMjQoIG5kcCApOwotICAgICAgICAgICAgRlRfVUxvbmcgIGdpZCA9IFRUX05FWFRfVVNIT1JUKCBuZHAgKTsKLQotCi0gICAgICAgICAgICBpZiAoIHVuaSA+PSAweDExMDAwMFVMICkgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgVW5pY29kZSAqLwotICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgICAgIGlmICggdW5pIDwgbGFzdFVuaSApCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICAgICAgbGFzdFVuaSA9IHVuaSArIDFVOwotCi0gICAgICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCAgICAmJgotICAgICAgICAgICAgICAgICBnaWQgPj0gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgKQotICAgICAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDE0X2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VOVVNFRCggY21hcCApOwotICAgIEZUX1VOVVNFRCggY2hhcl9jb2RlICk7Ci0KLSAgICAvKiBUaGlzIGNhbid0IGhhcHBlbiAqLwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwMTRfY2hhcl9uZXh0KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICpwY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VOVVNFRCggY21hcCApOwotCi0gICAgLyogVGhpcyBjYW4ndCBoYXBwZW4gKi8KLSAgICAqcGNoYXJfY29kZSA9IDA7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTRfZ2V0X2luZm8oIFRUX0NNYXAgICAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGNtYXAgKTsKLQotICAgIGNtYXBfaW5mby0+Zm9ybWF0ID0gMTQ7Ci0gICAgLyogc3VidGFibGUgMTQgZG9lcyBub3QgZGVmaW5lIGEgbGFuZ3VhZ2UgZmllbGQgKi8KLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gMHhGRkZGRkZGRlVMOwotCi0gICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0dF9jbWFwMTRfY2hhcl9tYXBfZGVmX2JpbmFyeSggRlRfQnl0ZSAgICAqYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50MzIgIG51bVJhbmdlcyA9IFRUX1BFRUtfVUxPTkcoIGJhc2UgKTsKLSAgICBGVF9VSW50MzIgIG1heCwgbWluOwotCi0KLSAgICBtaW4gPSAwOwotICAgIG1heCA9IG51bVJhbmdlczsKLQotICAgIGJhc2UgKz0gNDsKLQotICAgIC8qIGJpbmFyeSBzZWFyY2ggKi8KLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgRlRfVUludDMyICBtaWQgICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIEZUX0J5dGUqICAgcCAgICAgPSBiYXNlICsgNCAqIG1pZDsKLSAgICAgIEZUX1VMb25nICAgc3RhcnQgPSBUVF9ORVhUX1VJTlQyNCggcCApOwotICAgICAgRlRfVUludCAgICBjbnQgICA9IEZUX05FWFRfQllURSggcCApOwotCi0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICBlbHNlIGlmICggY2hhcl9jb2RlID4gc3RhcnQrY250ICkKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0dF9jbWFwMTRfY2hhcl9tYXBfbm9uZGVmX2JpbmFyeSggRlRfQnl0ZSAgICAqYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50MzIgIG51bU1hcHBpbmdzID0gVFRfUEVFS19VTE9ORyggYmFzZSApOwotICAgIEZUX1VJbnQzMiAgbWF4LCBtaW47Ci0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtTWFwcGluZ3M7Ci0KLSAgICBiYXNlICs9IDQ7Ci0KLSAgICAvKiBiaW5hcnkgc2VhcmNoICovCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIEZUX1VJbnQzMiAgbWlkID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgRlRfQnl0ZSogICBwICAgPSBiYXNlICsgNSAqIG1pZDsKLSAgICAgIEZUX1VJbnQzMiAgdW5pID0gVFRfTkVYVF9VSU5UMjQoIHAgKTsKLQotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8IHVuaSApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UgaWYgKCBjaGFyX2NvZGUgPiB1bmkgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0J5dGUqCi0gIHR0X2NtYXAxNF9maW5kX3ZhcmlhbnQoIEZUX0J5dGUgICAgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgIHZhcmlhbnRDb2RlICkKLSAgewotICAgIEZUX1VJbnQzMiAgbnVtVmFyID0gVFRfUEVFS19VTE9ORyggYmFzZSApOwotICAgIEZUX1VJbnQzMiAgbWF4LCBtaW47Ci0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtVmFyOwotCi0gICAgYmFzZSArPSA0OwotCi0gICAgLyogYmluYXJ5IHNlYXJjaCAqLwotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIG1pZCAgICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIEZUX0J5dGUqICAgcCAgICAgID0gYmFzZSArIDExICogbWlkOwotICAgICAgRlRfVUxvbmcgICB2YXJTZWwgPSBUVF9ORVhUX1VJTlQyNCggcCApOwotCi0KLSAgICAgIGlmICggdmFyaWFudENvZGUgPCB2YXJTZWwgKQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICBlbHNlIGlmICggdmFyaWFudENvZGUgPiB2YXJTZWwgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDE0X2NoYXJfdmFyX2luZGV4KCBUVF9DTWFwICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwICAgdWNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IpCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IHR0X2NtYXAxNF9maW5kX3ZhcmlhbnQoIGNtYXAtPmRhdGEgKyA2LCB2YXJpYW50U2VsZWN0b3IgKTsKLSAgICBGVF9VTG9uZyAgZGVmT2ZmOwotICAgIEZUX1VMb25nICBub25kZWZPZmY7Ci0KLQotICAgIGlmICggIXAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkZWZPZmYgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbm9uZGVmT2ZmID0gVFRfUEVFS19VTE9ORyggcCApOwotCi0gICAgaWYgKCBkZWZPZmYgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdHRfY21hcDE0X2NoYXJfbWFwX2RlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBkZWZPZmYsIGNoYXJjb2RlICkgKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFyaWFudCBvZiB0aGlzIGNoYXJjb2RlLiAgR0lEIG5vdCBzdG9yZWQgKi8KLSAgICAgIC8qIGhlcmU7IHN0b3JlZCBpbiB0aGUgbm9ybWFsIFVuaWNvZGUgY2hhcm1hcCBpbnN0ZWFkLiAgICAgICAgICAgKi8KLSAgICAgIHJldHVybiB1Y21hcC0+Y21hcC5jbGF6ei0+Y2hhcl9pbmRleCggJnVjbWFwLT5jbWFwLCBjaGFyY29kZSApOwotICAgIH0KLQotICAgIGlmICggbm9uZGVmT2ZmICE9IDAgKQotICAgICAgcmV0dXJuIHR0X2NtYXAxNF9jaGFyX21hcF9ub25kZWZfYmluYXJ5KCBjbWFwLT5kYXRhICsgbm9uZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyY29kZSApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfSW50ICkKLSAgdHRfY21hcDE0X2NoYXJfdmFyX2lzZGVmYXVsdCggVFRfQ01hcCAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IHR0X2NtYXAxNF9maW5kX3ZhcmlhbnQoIGNtYXAtPmRhdGEgKyA2LCB2YXJpYW50U2VsZWN0b3IgKTsKLSAgICBGVF9VTG9uZyAgZGVmT2ZmOwotICAgIEZUX1VMb25nICBub25kZWZPZmY7Ci0KLQotICAgIGlmICggIXAgKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgZGVmT2ZmICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIG5vbmRlZk9mZiA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIGlmICggZGVmT2ZmICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHR0X2NtYXAxNF9jaGFyX21hcF9kZWZfYmluYXJ5KCBjbWFwLT5kYXRhICsgZGVmT2ZmLCBjaGFyY29kZSApICkKLSAgICAgIHJldHVybiAxOwotCi0gICAgaWYgKCBub25kZWZPZmYgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHR0X2NtYXAxNF9jaGFyX21hcF9ub25kZWZfYmluYXJ5KCBjbWFwLT5kYXRhICsgbm9uZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJjb2RlICkgIT0gMCAgICAgICAgICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiogKQotICB0dF9jbWFwMTRfdmFyaWFudHMoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBUVF9DTWFwMTQgICBjbWFwMTQgPSAoVFRfQ01hcDE0KWNtYXA7Ci0gICAgRlRfVUludCAgICAgY291bnQgID0gY21hcDE0LT5udW1fc2VsZWN0b3JzOwotICAgIEZUX0J5dGUqICAgIHAgICAgICA9IGNtYXAtPmRhdGEgKyAxMDsKLSAgICBGVF9VSW50MzIqICByZXN1bHQ7Ci0gICAgRlRfVUludCAgICAgaTsKLQotCi0gICAgaWYgKCB0dF9jbWFwMTRfZW5zdXJlKCBjbWFwMTQsICggY291bnQgKyAxICksIG1lbW9yeSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmVzdWx0ID0gY21hcDE0LT5yZXN1bHRzOwotICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7ICsraSApCi0gICAgewotICAgICAgcmVzdWx0W2ldID0gVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgIHAgICAgICAgICs9IDg7Ci0gICAgfQotICAgIHJlc3VsdFtpXSA9IDA7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiAqICkKLSAgdHRfY21hcDE0X2NoYXJfdmFyaWFudHMoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjaGFyQ29kZSApCi0gIHsKLSAgICBUVF9DTWFwMTQgICBjbWFwMTQgPSAoVFRfQ01hcDE0KSAgY21hcDsKLSAgICBGVF9VSW50ICAgICBjb3VudCAgPSBjbWFwMTQtPm51bV9zZWxlY3RvcnM7Ci0gICAgRlRfQnl0ZSogICAgcCAgICAgID0gY21hcC0+ZGF0YSArIDEwOwotICAgIEZUX1VJbnQzMiogIHE7Ci0KLQotICAgIGlmICggdHRfY21hcDE0X2Vuc3VyZSggY21hcDE0LCAoIGNvdW50ICsgMSApLCBtZW1vcnkgKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGZvciAoIHEgPSBjbWFwMTQtPnJlc3VsdHM7IGNvdW50ID4gMDsgLS1jb3VudCApCi0gICAgewotICAgICAgRlRfVUludDMyICB2YXJTZWwgICAgPSBUVF9ORVhUX1VJTlQyNCggcCApOwotICAgICAgRlRfVUxvbmcgICBkZWZPZmYgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBGVF9VTG9uZyAgIG5vbmRlZk9mZiA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotCi0gICAgICBpZiAoICggZGVmT2ZmICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgdHRfY21hcDE0X2NoYXJfbWFwX2RlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBkZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlICkgICAgICAgICAgICAgICAgICkgfHwKLSAgICAgICAgICAgKCBub25kZWZPZmYgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICB0dF9jbWFwMTRfY2hhcl9tYXBfbm9uZGVmX2JpbmFyeSggY21hcC0+ZGF0YSArIG5vbmRlZk9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhckNvZGUgKSAhPSAwICAgICAgICAgKSApCi0gICAgICB7Ci0gICAgICAgIHFbMF0gPSB2YXJTZWw7Ci0gICAgICAgIHErKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcVswXSA9IDA7Ci0KLSAgICByZXR1cm4gY21hcDE0LT5yZXN1bHRzOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0dF9jbWFwMTRfZGVmX2NoYXJfY291bnQoIEZUX0J5dGUgICpwICkKLSAgewotICAgIEZUX1VJbnQzMiAgbnVtUmFuZ2VzID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIEZUX1VJbnQgICAgdG90ICAgICAgID0gMDsKLQotCi0gICAgcCArPSAzOyAgLyogcG9pbnQgdG8gdGhlIGZpcnN0ICdjbnQnIGZpZWxkICovCi0gICAgZm9yICggOyBudW1SYW5nZXMgPiAwOyBudW1SYW5nZXMtLSApCi0gICAgewotICAgICAgdG90ICs9IDEgKyBwWzBdOwotICAgICAgcCAgICs9IDQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRvdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQzMioKLSAgdHRfY21hcDE0X2dldF9kZWZfY2hhcnMoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5ICkKLSAgewotICAgIFRUX0NNYXAxNCAgIGNtYXAxNCA9IChUVF9DTWFwMTQpIGNtYXA7Ci0gICAgRlRfVUludDMyICAgbnVtUmFuZ2VzOwotICAgIEZUX1VJbnQgICAgIGNudDsKLSAgICBGVF9VSW50MzIqICBxOwotCi0KLSAgICBjbnQgICAgICAgPSB0dF9jbWFwMTRfZGVmX2NoYXJfY291bnQoIHAgKTsKLSAgICBudW1SYW5nZXMgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIHR0X2NtYXAxNF9lbnN1cmUoIGNtYXAxNCwgKCBjbnQgKyAxICksIG1lbW9yeSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZm9yICggcSA9IGNtYXAxNC0+cmVzdWx0czsgbnVtUmFuZ2VzID4gMDsgLS1udW1SYW5nZXMgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIHVuaSA9IFRUX05FWFRfVUlOVDI0KCBwICk7Ci0KLQotICAgICAgY250ID0gRlRfTkVYVF9CWVRFKCBwICkgKyAxOwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgcVswXSAgPSB1bmk7Ci0gICAgICAgIHVuaSAgKz0gMTsKLSAgICAgICAgcSAgICArPSAxOwotICAgICAgfSB3aGlsZSAoIC0tY250ICE9IDAgKTsKLSAgICB9Ci0gICAgcVswXSA9IDA7Ci0KLSAgICByZXR1cm4gY21hcDE0LT5yZXN1bHRzOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludCoKLSAgdHRfY21hcDE0X2dldF9ub25kZWZfY2hhcnMoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlICAgICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5ICkKLSAgewotICAgIFRUX0NNYXAxNCAgIGNtYXAxNCA9IChUVF9DTWFwMTQpIGNtYXA7Ci0gICAgRlRfVUludDMyICAgbnVtTWFwcGluZ3M7Ci0gICAgRlRfVUludCAgICAgaTsKLSAgICBGVF9VSW50MzIgICpyZXQ7Ci0KLQotICAgIG51bU1hcHBpbmdzID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCB0dF9jbWFwMTRfZW5zdXJlKCBjbWFwMTQsICggbnVtTWFwcGluZ3MgKyAxICksIG1lbW9yeSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmV0ID0gY21hcDE0LT5yZXN1bHRzOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7ICsraSApCi0gICAgewotICAgICAgcmV0W2ldID0gVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgIHAgKz0gMjsKLSAgICB9Ci0gICAgcmV0W2ldID0gMDsKLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICogKQotICB0dF9jbWFwMTRfdmFyaWFudF9jaGFycyggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHZhcmlhbnRTZWxlY3RvciApCi0gIHsKLSAgICBGVF9CeXRlICAgICpwICA9IHR0X2NtYXAxNF9maW5kX3ZhcmlhbnQoIGNtYXAtPmRhdGEgKyA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudFNlbGVjdG9yICk7Ci0gICAgRlRfVUludDMyICAqcmV0OwotICAgIEZUX0ludCAgICAgIGk7Ci0gICAgRlRfVUxvbmcgICAgZGVmT2ZmOwotICAgIEZUX1VMb25nICAgIG5vbmRlZk9mZjsKLQotCi0gICAgaWYgKCAhcCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGRlZk9mZiAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBub25kZWZPZmYgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIGRlZk9mZiA9PSAwICYmIG5vbmRlZk9mZiA9PSAwICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCBkZWZPZmYgPT0gMCApCi0gICAgICByZXR1cm4gdHRfY21hcDE0X2dldF9ub25kZWZfY2hhcnMoIGNtYXAsIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgIGVsc2UgaWYgKCBub25kZWZPZmYgPT0gMCApCi0gICAgICByZXR1cm4gdHRfY21hcDE0X2dldF9kZWZfY2hhcnMoIGNtYXAsIGNtYXAtPmRhdGEgKyBkZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBCb3RoIGEgZGVmYXVsdCBhbmQgYSBub24tZGVmYXVsdCBnbHlwaCBzZXQ/ICBUaGF0J3MgcHJvYmFibHkgbm90ICovCi0gICAgICAvKiBnb29kIGZvbnQgZGVzaWduLCBidXQgdGhlIHNwZWMgYWxsb3dzIGZvciBpdC4uLiAgICAgICAgICAgICAgICAgICovCi0gICAgICBUVF9DTWFwMTQgIGNtYXAxNCA9IChUVF9DTWFwMTQpIGNtYXA7Ci0gICAgICBGVF9VSW50MzIgIG51bVJhbmdlczsKLSAgICAgIEZUX1VJbnQzMiAgbnVtTWFwcGluZ3M7Ci0gICAgICBGVF9VSW50MzIgIGR1bmk7Ci0gICAgICBGVF9VSW50MzIgIGRjbnQ7Ci0gICAgICBGVF9VSW50MzIgIG51bmk7Ci0gICAgICBGVF9CeXRlKiAgIGRwOwotICAgICAgRlRfVUludCAgICBkaSwgbmksIGs7Ci0KLQotICAgICAgcCAgPSBjbWFwLT5kYXRhICsgbm9uZGVmT2ZmOwotICAgICAgZHAgPSBjbWFwLT5kYXRhICsgZGVmT2ZmOwotCi0gICAgICBudW1NYXBwaW5ncyA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGRjbnQgICAgICAgID0gdHRfY21hcDE0X2RlZl9jaGFyX2NvdW50KCBkcCApOwotICAgICAgbnVtUmFuZ2VzICAgPSBUVF9ORVhUX1VMT05HKCBkcCApOwotCi0gICAgICBpZiAoIG51bU1hcHBpbmdzID09IDAgKQotICAgICAgICByZXR1cm4gdHRfY21hcDE0X2dldF9kZWZfY2hhcnMoIGNtYXAsIGNtYXAtPmRhdGEgKyBkZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGRjbnQgPT0gMCApCi0gICAgICAgIHJldHVybiB0dF9jbWFwMTRfZ2V0X25vbmRlZl9jaGFycyggY21hcCwgY21hcC0+ZGF0YSArIG5vbmRlZk9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKTsKLQotICAgICAgaWYgKCB0dF9jbWFwMTRfZW5zdXJlKCBjbWFwMTQsICggZGNudCArIG51bU1hcHBpbmdzICsgMSApLCBtZW1vcnkgKSApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICByZXQgID0gY21hcDE0LT5yZXN1bHRzOwotICAgICAgZHVuaSA9IFRUX05FWFRfVUlOVDI0KCBkcCApOwotICAgICAgZGNudCA9IEZUX05FWFRfQllURSggZHAgKTsKLSAgICAgIGRpICAgPSAxOwotICAgICAgbnVuaSA9IFRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICBwICAgKz0gMjsKLSAgICAgIG5pICAgPSAxOwotICAgICAgaSAgICA9IDA7Ci0KLSAgICAgIGZvciAoIDs7ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBudW5pID4gZHVuaSArIGRjbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yICggayA9IDA7IGsgPD0gZGNudDsgKytrICkKLSAgICAgICAgICAgIHJldFtpKytdID0gZHVuaSArIGs7Ci0KLSAgICAgICAgICArK2RpOwotCi0gICAgICAgICAgaWYgKCBkaSA+IG51bVJhbmdlcyApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGR1bmkgPSBUVF9ORVhUX1VJTlQyNCggZHAgKTsKLSAgICAgICAgICBkY250ID0gRlRfTkVYVF9CWVRFKCBkcCApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggbnVuaSA8IGR1bmkgKQotICAgICAgICAgICAgcmV0W2krK10gPSBudW5pOwotICAgICAgICAgIC8qIElmIGl0IGlzIHdpdGhpbiB0aGUgZGVmYXVsdCByYW5nZSB0aGVuIGlnbm9yZSBpdCAtLSAqLwotICAgICAgICAgIC8qIHRoYXQgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICsrbmk7Ci0gICAgICAgICAgaWYgKCBuaSA+IG51bU1hcHBpbmdzICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgbnVuaSA9IFRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICAgICAgcCArPSAyOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggbmkgPD0gbnVtTWFwcGluZ3MgKQotICAgICAgewotICAgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIGhhdmUgcnVuIG91dCBvZiBhbGwgZGVmYXVsdCByYW5nZXMuICAgKi8KLSAgICAgICAgLyogV2UgaGF2ZSByZWFkIG9uZSBub24tZGVmYXVsdCBtYXBwaW5nIHdoaWNoIHdlIGhhdmVuJ3Qgc3RvcmVkICovCi0gICAgICAgIC8qIGFuZCB0aGVyZSBtYXkgYmUgb3RoZXJzIHRoYXQgbmVlZCB0byBiZSByZWFkLiAgICAgICAgICAgICAgICAqLwotICAgICAgICByZXRbaSsrXSA9IG51bmk7Ci0gICAgICAgIHdoaWxlICggbmkgPCBudW1NYXBwaW5ncyApCi0gICAgICAgIHsKLSAgICAgICAgICByZXRbaSsrXSA9IFRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICAgICAgcCArPSAyOwotICAgICAgICAgICsrbmk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBkaSA8PSBudW1SYW5nZXMgKQotICAgICAgewotICAgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIGhhdmUgcnVuIG91dCBvZiBhbGwgbm9uLWRlZmF1bHQgICAgICovCi0gICAgICAgIC8qIG1hcHBpbmdzLiAgV2UgaGF2ZSByZWFkIG9uZSBkZWZhdWx0IHJhbmdlIHdoaWNoIHdlIGhhdmVuJ3QgKi8KLSAgICAgICAgLyogc3RvcmVkIGFuZCB0aGVyZSBtYXkgYmUgb3RoZXJzIHRoYXQgbmVlZCB0byBiZSByZWFkLiAgICAgICAqLwotICAgICAgICBmb3IgKCBrID0gMDsgayA8PSBkY250OyArK2sgKQotICAgICAgICAgIHJldFtpKytdID0gZHVuaSArIGs7Ci0KLSAgICAgICAgd2hpbGUgKCBkaSA8IG51bVJhbmdlcyApCi0gICAgICAgIHsKLSAgICAgICAgICBkdW5pID0gVFRfTkVYVF9VSU5UMjQoIGRwICk7Ci0gICAgICAgICAgZGNudCA9IEZUX05FWFRfQllURSggZHAgKTsKLQotICAgICAgICAgIGZvciAoIGsgPSAwOyBrIDw9IGRjbnQ7ICsrayApCi0gICAgICAgICAgICByZXRbaSsrXSA9IGR1bmkgKyBrOwotICAgICAgICAgICsrZGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0W2ldID0gMDsKLQotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBUVF9DTWFwX0NsYXNzUmVjICB0dF9jbWFwMTRfY2xhc3NfcmVjID0KLSAgewotICAgIHsKLSAgICAgIHNpemVvZiAoIFRUX0NNYXAxNFJlYyApLAotCi0gICAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHR0X2NtYXAxNF9pbml0LAotICAgICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICB0dF9jbWFwMTRfZG9uZSwKLSAgICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDE0X2NoYXJfaW5kZXgsCi0gICAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXAxNF9jaGFyX25leHQsCi0KLSAgICAgIC8qIEZvcm1hdCAxNCBleHRlbnNpb24gZnVuY3Rpb25zICovCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySW5kZXhGdW5jKSAgICB0dF9jbWFwMTRfY2hhcl92YXJfaW5kZXgsCi0gICAgICAoRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYyl0dF9jbWFwMTRfY2hhcl92YXJfaXNkZWZhdWx0LAotICAgICAgKEZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSAgICAgdHRfY21hcDE0X3ZhcmlhbnRzLAotICAgICAgKEZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykgdHRfY21hcDE0X2NoYXJfdmFyaWFudHMsCi0gICAgICAoRlRfQ01hcF9WYXJpYW50Q2hhckxpc3RGdW5jKSB0dF9jbWFwMTRfdmFyaWFudF9jaGFycwotICAgIH0sCi0gICAgMTQsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKXR0X2NtYXAxNF92YWxpZGF0ZSwKLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfY21hcDE0X2dldF9pbmZvCi0gIH07Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMCAqLwotCi0KLSAgc3RhdGljIGNvbnN0IFRUX0NNYXBfQ2xhc3MgIHR0X2NtYXBfY2xhc3Nlc1tdID0KLSAgewotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8wCi0gICAgJnR0X2NtYXAwX2NsYXNzX3JlYywKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzIKLSAgICAmdHRfY21hcDJfY2xhc3NfcmVjLAotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNAotICAgICZ0dF9jbWFwNF9jbGFzc19yZWMsCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF82Ci0gICAgJnR0X2NtYXA2X2NsYXNzX3JlYywKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzgKLSAgICAmdHRfY21hcDhfY2xhc3NfcmVjLAotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTAKLSAgICAmdHRfY21hcDEwX2NsYXNzX3JlYywKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEyCi0gICAgJnR0X2NtYXAxMl9jbGFzc19yZWMsCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xNAotICAgICZ0dF9jbWFwMTRfY2xhc3NfcmVjLAotI2VuZGlmCi0KLSAgICBOVUxMLAotICB9OwotCi0KLSAgLyogcGFyc2UgdGhlIGBjbWFwJyB0YWJsZSBhbmQgYnVpbGQgdGhlIGNvcnJlc3BvbmRpbmcgVFRfQ01hcCBvYmplY3RzICovCi0gIC8qIGluIHRoZSBjdXJyZW50IGZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfYnVpbGRfY21hcHMoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIHRhYmxlID0gZmFjZS0+Y21hcF90YWJsZTsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgbGltaXQgPSB0YWJsZSArIGZhY2UtPmNtYXBfc2l6ZTsKLSAgICBGVF9VSW50IHZvbGF0aWxlICAgbnVtX2NtYXBzOwotICAgIEZUX0J5dGUqIHZvbGF0aWxlICBwICAgICA9IHRhYmxlOwotCi0KLSAgICBpZiAoIHAgKyA0ID4gbGltaXQgKQotICAgICAgcmV0dXJuIFNGTlRfRXJyX0ludmFsaWRfVGFibGU7Ci0KLSAgICAvKiBvbmx5IHJlY29nbml6ZSBmb3JtYXQgMCAqLwotICAgIGlmICggVFRfTkVYVF9VU0hPUlQoIHAgKSAhPSAwICkKLSAgICB7Ci0gICAgICBwIC09IDI7Ci0gICAgICBGVF9FUlJPUigoICJ0dF9mYWNlX2J1aWxkX2NtYXBzOiB1bnN1cHBvcnRlZCBgY21hcCcgdGFibGUgZm9ybWF0ID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgIFRUX1BFRUtfVVNIT1JUKCBwICkgKSk7Ci0gICAgICByZXR1cm4gU0ZOVF9FcnJfSW52YWxpZF9UYWJsZTsKLSAgICB9Ci0KLSAgICBudW1fY21hcHMgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgZm9yICggOyBudW1fY21hcHMgPiAwICYmIHAgKyA4IDw9IGxpbWl0OyBudW1fY21hcHMtLSApCi0gICAgewotICAgICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsKLSAgICAgIEZUX1VJbnQzMiAgICAgIG9mZnNldDsKLQotCi0gICAgICBjaGFybWFwLnBsYXRmb3JtX2lkID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgY2hhcm1hcC5mYWNlICAgICAgICA9IEZUX0ZBQ0UoIGZhY2UgKTsKLSAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19OT05FOyAgLyogd2lsbCBiZSBmaWxsZWQgbGF0ZXIgKi8KLSAgICAgIG9mZnNldCAgICAgICAgICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggb2Zmc2V0ICYmIG9mZnNldCA8PSBmYWNlLT5jbWFwX3NpemUgLSAyICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogdm9sYXRpbGUgICAgICAgICAgICAgIGNtYXAgICA9IHRhYmxlICsgb2Zmc2V0OwotICAgICAgICB2b2xhdGlsZSBGVF9VSW50ICAgICAgICAgICAgICAgZm9ybWF0ID0gVFRfUEVFS19VU0hPUlQoIGNtYXAgKTsKLSAgICAgICAgY29uc3QgVFRfQ01hcF9DbGFzcyogdm9sYXRpbGUgIHBjbGF6eiA9IHR0X2NtYXBfY2xhc3NlczsKLSAgICAgICAgVFRfQ01hcF9DbGFzcyB2b2xhdGlsZSAgICAgICAgIGNsYXp6OwotCi0KLSAgICAgICAgZm9yICggOyAqcGNsYXp6OyBwY2xhenorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBjbGF6eiA9ICpwY2xheno7Ci0gICAgICAgICAgaWYgKCBjbGF6ei0+Zm9ybWF0ID09IGZvcm1hdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgdm9sYXRpbGUgVFRfVmFsaWRhdG9yUmVjICB2YWxpZDsKLSAgICAgICAgICAgIHZvbGF0aWxlIEZUX0Vycm9yICAgICAgICAgZXJyb3IgPSBTRk5UX0Vycl9PazsKLQotCi0gICAgICAgICAgICBmdF92YWxpZGF0b3JfaW5pdCggRlRfVkFMSURBVE9SKCAmdmFsaWQgKSwgY21hcCwgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfREVGQVVMVCApOwotCi0gICAgICAgICAgICB2YWxpZC5udW1fZ2x5cGhzID0gKEZUX1VJbnQpZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzOwotCi0gICAgICAgICAgICBpZiAoIGZ0X3NldGptcCgKLSAgICAgICAgICAgICAgKigoZnRfam1wX2J1ZiopJkZUX1ZBTElEQVRPUiggJnZhbGlkICktPmp1bXBfYnVmZmVyKSApID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiB2YWxpZGF0ZSB0aGlzIGNtYXAgc3ViLXRhYmxlICovCi0gICAgICAgICAgICAgIGVycm9yID0gY2xhenotPnZhbGlkYXRlKCBjbWFwLCBGVF9WQUxJREFUT1IoICZ2YWxpZCApICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggdmFsaWQudmFsaWRhdG9yLmVycm9yID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9DTWFwICB0dGNtYXA7Ci0KLQotICAgICAgICAgICAgICAvKiBJdCBtaWdodCBtYWtlIHNlbnNlIHRvIHN0b3JlIHRoZSBzaW5nbGUgdmFyaWF0aW9uIHNlbGVjdG9yICovCi0gICAgICAgICAgICAgIC8qIGNtYXAgc29tZXdoZXJlIHNwZWNpYWwuICBCdXQgaXQgd291bGQgaGF2ZSB0byBiZSBpbiB0aGUgICAgKi8KLSAgICAgICAgICAgICAgLyogcHVibGljIEZUX0ZhY2VSZWMsIGFuZCB3ZSBjYW4ndCBjaGFuZ2UgdGhhdC4gICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgIGlmICggIUZUX0NNYXBfTmV3KCAoRlRfQ01hcF9DbGFzcyljbGF6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtYXAsICZjaGFybWFwLCAmdHRjbWFwICkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaXQgaXMgc2ltcGxlciB0byBkaXJlY3RseSBzZXQgYGZsYWdzJyB0aGFuIGFkZGluZyAqLwotICAgICAgICAgICAgICAgIC8qIGEgcGFyYW1ldGVyIHRvIEZUX0NNYXBfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAoKFRUX0NNYXApdHRjbWFwKS0+ZmxhZ3MgPSAoRlRfSW50KWVycm9yOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfYnVpbGRfY21hcHM6IiApKTsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAiIGJyb2tlbiBjbWFwIHN1Yi10YWJsZSBpZ25vcmVkIVxuIiApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKnBjbGF6eiA9PSBOVUxMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfYnVpbGRfY21hcHM6IiApKTsKLSAgICAgICAgICBGVF9FUlJPUigoICIgdW5zdXBwb3J0ZWQgY21hcCBzdWItdGFibGUgaWdub3JlZCFcbiIgKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2dldF9jbWFwX2luZm8oIEZUX0NoYXJNYXAgICAgY2hhcm1hcCwKLSAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQ01hcCAgICAgICAgY21hcCAgPSAoRlRfQ01hcCljaGFybWFwOwotICAgIFRUX0NNYXBfQ2xhc3MgIGNsYXp6ID0gKFRUX0NNYXBfQ2xhc3MpY21hcC0+Y2xheno7Ci0KLQotICAgIHJldHVybiBjbGF6ei0+Z2V0X2NtYXBfaW5mbyggY2hhcm1hcCwgY21hcF9pbmZvICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0Y21hcC5oIGIvc3JjL3NmbnQvdHRjbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMGEzZTIuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRjbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgKGNtYXApIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVENNQVBfSF9fCi0jZGVmaW5lIF9fVFRDTUFQX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVkFMSURBVEVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UVF9DTUFQX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBUVF9DTUFQX0ZMQUdfVU5TT1JURUQgICAgIDEKLSNkZWZpbmUgVFRfQ01BUF9GTEFHX09WRVJMQVBQSU5HICAyCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXBSZWNfCi0gIHsKLSAgICBGVF9DTWFwUmVjICBjbWFwOwotICAgIEZUX0J5dGUqICAgIGRhdGE7ICAgICAgICAgICAvKiBwb2ludGVyIHRvIGluLW1lbW9yeSBjbWFwIHRhYmxlICovCi0gICAgRlRfSW50ICAgICAgZmxhZ3M7ICAgICAgICAgIC8qIGZvciBmb3JtYXQgNCBvbmx5ICAgICAgICAgICAgICAgKi8KLQotICB9IFRUX0NNYXBSZWMsICpUVF9DTWFwOwotCi0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IFRUX0NNYXBfQ2xhc3NSZWNfKiAgVFRfQ01hcF9DbGFzczsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9DTWFwX1ZhbGlkYXRlRnVuYykoIEZUX0J5dGUqICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKTsKLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcF9DbGFzc1JlY18KLSAgewotICAgIEZUX0NNYXBfQ2xhc3NSZWMgICAgICBjbGF6ejsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgZm9ybWF0OwotICAgIFRUX0NNYXBfVmFsaWRhdGVGdW5jICB2YWxpZGF0ZTsKLSAgICBUVF9DTWFwX0luZm9fR2V0RnVuYyAgZ2V0X2NtYXBfaW5mbzsKLQotICB9IFRUX0NNYXBfQ2xhc3NSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfVmFsaWRhdG9yUmVjXwotICB7Ci0gICAgRlRfVmFsaWRhdG9yUmVjICB2YWxpZGF0b3I7Ci0gICAgRlRfVUludCAgICAgICAgICBudW1fZ2x5cGhzOwotCi0gIH0gVFRfVmFsaWRhdG9yUmVjLCAqVFRfVmFsaWRhdG9yOwotCi0KLSNkZWZpbmUgVFRfVkFMSURBVE9SKCB4ICkgICAgICAgICAgKChUVF9WYWxpZGF0b3IpKCB4ICkpCi0jZGVmaW5lIFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB4ICkgIFRUX1ZBTElEQVRPUiggeCApLT5udW1fZ2x5cGhzCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2J1aWxkX2NtYXBzKCBUVF9GYWNlICBmYWNlICk7Ci0KLSAgLyogdXNlZCBpbiB0dC1jbWFwcyBzZXJ2aWNlICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2dldF9jbWFwX2luZm8oIEZUX0NoYXJNYXAgICAgY2hhcm1hcCwKLSAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUQ01BUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0a2Vybi5jIGIvc3JjL3NmbnQvdHRrZXJuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTUyYzMuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRrZXJuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRrZXJuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIGJhc2ljIFRydWVUeXBlIGtlcm5pbmcgdGFibGUuICBUaGlzIGRvZXNuJ3QgaGFuZGxlICAgICAgICAgICovCi0vKiAgICBrZXJuaW5nIGRhdGEgd2l0aGluIHRoZSBHUE9TIHRhYmxlIGF0IHRoZSBtb21lbnQuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSAidHRrZXJuLmgiCi0jaW5jbHVkZSAidHRsb2FkLmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRrZXJuCi0KLQotI3VuZGVmICBUVF9LRVJOX0lOREVYCi0jZGVmaW5lIFRUX0tFUk5fSU5ERVgoIGcxLCBnMiApICAoICggKEZUX1VMb25nKShnMSkgPDwgMTYgKSB8IChnMikgKQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9rZXJuKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1VMb25nICAgdGFibGVfc2l6ZTsKLSAgICBGVF9CeXRlKiAgIHA7Ci0gICAgRlRfQnl0ZSogICBwX2xpbWl0OwotICAgIEZUX1VJbnQgICAgbm4sIG51bV90YWJsZXM7Ci0gICAgRlRfVUludDMyICBhdmFpbCA9IDAsIG9yZGVyZWQgPSAwOwotCi0KLSAgICAvKiB0aGUga2VybiB0YWJsZSBpcyBvcHRpb25hbDsgZXhpdCBzaWxlbnRseSBpZiBpdCBpcyBtaXNzaW5nICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2tlcm4sIHN0cmVhbSwgJnRhYmxlX3NpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggdGFibGVfc2l6ZSA8IDQgKSAgLyogdGhlIGNhc2Ugb2YgYSBtYWxmb3JtZWQgdGFibGUgKi8KLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJrZXJuaW5nIHRhYmxlIGlzIHRvbyBzbWFsbCAtIGlnbm9yZWRcbiIgKSk7Ci0gICAgICBlcnJvciA9IFNGTlRfRXJyX1RhYmxlX01pc3Npbmc7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCB0YWJsZV9zaXplLCBmYWNlLT5rZXJuX3RhYmxlICkgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNvdWxkIG5vdCBleHRyYWN0IGtlcm5pbmcgdGFibGVcbiIgKSk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZmFjZS0+a2Vybl90YWJsZV9zaXplID0gdGFibGVfc2l6ZTsKLQotICAgIHAgICAgICAgPSBmYWNlLT5rZXJuX3RhYmxlOwotICAgIHBfbGltaXQgPSBwICsgdGFibGVfc2l6ZTsKLQotICAgIHAgICAgICAgICArPSAyOyAvKiBza2lwIHZlcnNpb24gKi8KLSAgICBudW1fdGFibGVzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIGlmICggbnVtX3RhYmxlcyA+IDMyICkgLyogd2Ugb25seSBzdXBwb3J0IHVwIHRvIDMyIHN1Yi10YWJsZXMgKi8KLSAgICAgIG51bV90YWJsZXMgPSAzMjsKLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fdGFibGVzOyBubisrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgIG51bV9wYWlycywgbGVuZ3RoLCBjb3ZlcmFnZTsKLSAgICAgIEZUX0J5dGUqICAgcF9uZXh0OwotICAgICAgRlRfVUludDMyICBtYXNrID0gMVVMIDw8IG5uOwotCi0KLSAgICAgIGlmICggcCArIDYgPiBwX2xpbWl0ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHBfbmV4dCA9IHA7Ci0KLSAgICAgIHAgKz0gMjsgLyogc2tpcCB2ZXJzaW9uICovCi0gICAgICBsZW5ndGggICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBjb3ZlcmFnZSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIGlmICggbGVuZ3RoIDw9IDYgKQotICAgICAgICBicmVhazsKLQotICAgICAgcF9uZXh0ICs9IGxlbmd0aDsKLQotICAgICAgLyogb25seSB1c2UgaG9yaXpvbnRhbCBrZXJuaW5nIHRhYmxlcyAqLwotICAgICAgaWYgKCAoIGNvdmVyYWdlICYgfjggKSAhPSAweDAwMDEgfHwKLSAgICAgICAgICAgcCArIDggPiBwX2xpbWl0ICAgICAgICAgICAgICkKLSAgICAgICAgZ290byBOZXh0VGFibGU7Ci0KLSAgICAgIG51bV9wYWlycyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBwICAgICAgICArPSA2OwotCi0gICAgICBpZiAoIHAgKyA2ICogbnVtX3BhaXJzID4gcF9saW1pdCApCi0gICAgICAgIGdvdG8gTmV4dFRhYmxlOwotCi0gICAgICBhdmFpbCB8PSBtYXNrOwotCi0gICAgICAvKgotICAgICAgICogIE5vdyBjaGVjayB3aGV0aGVyIHRoZSBwYWlycyBpbiB0aGlzIHRhYmxlIGFyZSBvcmRlcmVkLgotICAgICAgICogIFdlIHRoZW4gY2FuIHVzZSBiaW5hcnkgc2VhcmNoLgotICAgICAgICovCi0gICAgICBpZiAoIG51bV9wYWlycyA+IDAgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBjb3VudDsKLSAgICAgICAgRlRfVUludCAgb2xkX3BhaXI7Ci0KLQotICAgICAgICBvbGRfcGFpciA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgcCAgICAgICArPSAyOwotCi0gICAgICAgIGZvciAoIGNvdW50ID0gbnVtX3BhaXJzIC0gMTsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQzMiAgY3VyX3BhaXI7Ci0KLQotICAgICAgICAgIGN1cl9wYWlyID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICAgIGlmICggY3VyX3BhaXIgPD0gb2xkX3BhaXIgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBwICs9IDI7Ci0gICAgICAgICAgb2xkX3BhaXIgPSBjdXJfcGFpcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggY291bnQgPT0gMCApCi0gICAgICAgICAgb3JkZXJlZCB8PSBtYXNrOwotICAgICAgfQotCi0gICAgTmV4dFRhYmxlOgotICAgICAgcCA9IHBfbmV4dDsKLSAgICB9Ci0KLSAgICBmYWNlLT5udW1fa2Vybl90YWJsZXMgPSBubjsKLSAgICBmYWNlLT5rZXJuX2F2YWlsX2JpdHMgPSBhdmFpbDsKLSAgICBmYWNlLT5rZXJuX29yZGVyX2JpdHMgPSBvcmRlcmVkOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0dF9mYWNlX2RvbmVfa2VybiggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0KLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT5rZXJuX3RhYmxlICk7Ci0gICAgZmFjZS0+a2Vybl90YWJsZV9zaXplID0gMDsKLSAgICBmYWNlLT5udW1fa2Vybl90YWJsZXMgPSAwOwotICAgIGZhY2UtPmtlcm5fYXZhaWxfYml0cyA9IDA7Ci0gICAgZmFjZS0+a2Vybl9vcmRlcl9iaXRzID0gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9JbnQgKQotICB0dF9mYWNlX2dldF9rZXJuaW5nKCBUVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBsZWZ0X2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICByaWdodF9nbHlwaCApCi0gIHsKLSAgICBGVF9JbnQgICAgcmVzdWx0ID0gMDsKLSAgICBGVF9VSW50ICAgY291bnQsIG1hc2sgPSAxOwotICAgIEZUX0J5dGUqICBwICAgICAgID0gZmFjZS0+a2Vybl90YWJsZTsKLQotCi0gICAgcCAgICs9IDQ7Ci0gICAgbWFzayA9IDB4MDAwMTsKLQotICAgIGZvciAoIGNvdW50ID0gZmFjZS0+bnVtX2tlcm5fdGFibGVzOyBjb3VudCA+IDA7IGNvdW50LS0sIG1hc2sgPDw9IDEgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqIGJhc2UgICAgID0gcDsKLSAgICAgIEZUX0J5dGUqIG5leHQgICAgID0gYmFzZTsKLSAgICAgIEZUX1VJbnQgIHZlcnNpb24gID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIGxlbmd0aCAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIGNvdmVyYWdlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX0ludCAgIHZhbHVlICAgID0gMDsKLQotICAgICAgRlRfVU5VU0VEKCB2ZXJzaW9uICk7Ci0KLQotICAgICAgbmV4dCA9IGJhc2UgKyBsZW5ndGg7Ci0KLSAgICAgIGlmICggKCBmYWNlLT5rZXJuX2F2YWlsX2JpdHMgJiBtYXNrICkgPT0gMCApCi0gICAgICAgIGdvdG8gTmV4dFRhYmxlOwotCi0gICAgICBpZiAoIHAgKyA4ID4gbmV4dCApCi0gICAgICAgIGdvdG8gTmV4dFRhYmxlOwotCi0gICAgICBzd2l0Y2ggKCBjb3ZlcmFnZSA+PiA4ICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgICBudW1fcGFpcnMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICAgIEZUX1VMb25nICBrZXkwICAgICAgPSBUVF9LRVJOX0lOREVYKCBsZWZ0X2dseXBoLCByaWdodF9nbHlwaCApOwotCi0KLSAgICAgICAgICBwICs9IDY7Ci0KLSAgICAgICAgICBpZiAoIGZhY2UtPmtlcm5fb3JkZXJfYml0cyAmIG1hc2sgKSAgIC8qIGJpbmFyeSBzZWFyY2ggKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICAgbWluID0gMDsKLSAgICAgICAgICAgIEZUX1VJbnQgICBtYXggPSBudW1fcGFpcnM7Ci0KLQotICAgICAgICAgICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9VSW50ICAgbWlkID0gKCBtaW4gKyBtYXggKSA+PiAxOwotICAgICAgICAgICAgICBGVF9CeXRlKiAgcSAgID0gcCArIDYgKiBtaWQ7Ci0gICAgICAgICAgICAgIEZUX1VMb25nICBrZXk7Ci0KLQotICAgICAgICAgICAgICBrZXkgPSBGVF9ORVhUX1VMT05HKCBxICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBrZXkgPT0ga2V5MCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZUX1BFRUtfU0hPUlQoIHEgKTsKLSAgICAgICAgICAgICAgICBnb3RvIEZvdW5kOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmICgga2V5IDwga2V5MCApCi0gICAgICAgICAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1heCA9IG1pZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSAvKiBsaW5lYXIgc2VhcmNoICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgY291bnQyOwotCi0KLSAgICAgICAgICAgIGZvciAoIGNvdW50MiA9IG51bV9wYWlyczsgY291bnQyID4gMDsgY291bnQyLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9VTG9uZyAga2V5ID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0KLSAgICAgICAgICAgICAgaWYgKCBrZXkgPT0ga2V5MCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZUX1BFRUtfU0hPUlQoIHAgKTsKLSAgICAgICAgICAgICAgICBnb3RvIEZvdW5kOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAvKgotICAgICAgICAqICBXZSBkb24ndCBzdXBwb3J0IGZvcm1hdCAyIGJlY2F1c2Ugd2UgaGF2ZW4ndCBzZWVuIGEgc2luZ2xlIGZvbnQKLSAgICAgICAgKiAgdXNpbmcgaXQgaW4gcmVhbCBsaWZlLi4uCi0gICAgICAgICovCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIDsKLSAgICAgIH0KLQotICAgICAgZ290byBOZXh0VGFibGU7Ci0KLSAgICBGb3VuZDoKLSAgICAgIGlmICggY292ZXJhZ2UgJiA4ICkgLyogb3ZlcnJpZGUgb3IgYWRkICovCi0gICAgICAgIHJlc3VsdCA9IHZhbHVlOwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgKz0gdmFsdWU7Ci0KLSAgICBOZXh0VGFibGU6Ci0gICAgICBwID0gbmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSN1bmRlZiBUVF9LRVJOX0lOREVYCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRrZXJuLmggYi9zcmMvc2ZudC90dGtlcm4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxZGE5Yi4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dGtlcm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0a2Vybi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSBrZXJuaW5nIHRhYmxlLiAgVGhpcyBkb2Vzbid0IGhhbmRsZSAgICAgICAgICAqLwotLyogICAga2VybmluZyBkYXRhIHdpdGhpbiB0aGUgR1BPUyB0YWJsZSBhdCB0aGUgbW9tZW50LiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNSwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVEtFUk5fSF9fCi0jZGVmaW5lIF9fVFRLRVJOX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciAgKQotICB0dF9mYWNlX2xvYWRfa2VybiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZG9uZV9rZXJuKCBUVF9GYWNlICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0ludCApCi0gIHR0X2ZhY2VfZ2V0X2tlcm5pbmcoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoICk7Ci0KLSNkZWZpbmUgVFRfRkFDRV9IQVNfS0VSTklORyggZmFjZSApICAoIChmYWNlKS0+a2Vybl9hdmFpbF9iaXRzICE9IDAgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRLRVJOX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRsb2FkLmMgYi9zcmMvc2ZudC90dGxvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3YzM0Mi4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dGxvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDExODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIGJhc2ljIFRydWVUeXBlIHRhYmxlcywgaS5lLiwgdGFibGVzIHRoYXQgY2FuIGJlIGVpdGhlciBpbiAgICovCi0vKiAgICBUVEYgb3IgT1RGIGZvbnRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSAidHRsb2FkLmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRsb2FkCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb29rcyBmb3IgYSBUcnVlVHlwZSB0YWJsZSBieSBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgZmFjZSBvYmplY3QgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgOjogVGhlIHNlYXJjaGVkIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byB0aGUgdGFibGUgZGlyZWN0b3J5IGVudHJ5LiAgMCBpZiBub3QgZm91bmQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBUVF9UYWJsZSAgKQotICB0dF9mYWNlX2xvb2t1cF90YWJsZSggVFRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdGFnICApCi0gIHsKLSAgICBUVF9UYWJsZSAgZW50cnk7Ci0gICAgVFRfVGFibGUgIGxpbWl0OwotCi0KLSAgICBGVF9UUkFDRTQoKCAidHRfZmFjZV9sb29rdXBfdGFibGU6ICUwOHAsIGAlYyVjJWMlYycgLS0gIiwKLSAgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFnID4+IDI0ICksCi0gICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWcgPj4gMTYgKSwKLSAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhZyA+PiA4ICApLAotICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFnICAgICAgICkgKSk7Ci0KLSAgICBlbnRyeSA9IGZhY2UtPmRpcl90YWJsZXM7Ci0gICAgbGltaXQgPSBlbnRyeSArIGZhY2UtPm51bV90YWJsZXM7Ci0KLSAgICBmb3IgKCA7IGVudHJ5IDwgbGltaXQ7IGVudHJ5KysgKQotICAgIHsKLSAgICAgIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cywgd2UgY29uc2lkZXIgMC1sZW5ndGggKi8KLSAgICAgIC8qIHRhYmxlcyB0aGUgc2FtZSBhcyBtaXNzaW5nIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggZW50cnktPlRhZyA9PSB0YWcgJiYgZW50cnktPkxlbmd0aCAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U0KCggImZvdW5kIHRhYmxlLlxuIiApKTsKLSAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFNCgoICJjb3VsZCBub3QgZmluZCB0YWJsZSFcbiIgKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZ290b190YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvb2tzIGZvciBhIFRydWVUeXBlIHRhYmxlIGJ5IG5hbWUsIHRoZW4gc2VlayBhIHN0cmVhbSB0byBpdC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGZhY2Ugb2JqZWN0IGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IFRoZSBzZWFyY2hlZCB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIHN0cmVhbSB0byBzZWVrIHdoZW4gdGhlIHRhYmxlIGlzIGZvdW5kLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2UuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2dvdG9fdGFibGUoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApCi0gIHsKLSAgICBUVF9UYWJsZSAgdGFibGU7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICB0YWJsZSA9IHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCB0YWcgKTsKLSAgICBpZiAoIHRhYmxlICkKLSAgICB7Ci0gICAgICBpZiAoIGxlbmd0aCApCi0gICAgICAgICpsZW5ndGggPSB0YWJsZS0+TGVuZ3RoOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCB0YWJsZS0+T2Zmc2V0ICkgKQotICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBTRk5UX0Vycl9UYWJsZV9NaXNzaW5nOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBIZXJlLCB3ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY2hlY2sgdGhhdCBgbnVtX3RhYmxlcycgaXMgdmFsaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGxvb2sgZm9yIGEgYGhlYWQnIHRhYmxlLCBjaGVjayBpdHMgc2l6ZSwgYW5kIHBhcnNlIGl0IHRvIGNoZWNrICAgICAgKi8KLSAgLyogICB3aGV0aGVyIGl0cyBgbWFnaWMnIGZpZWxkIGlzIGNvcnJlY3RseSBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXaGVuIGNoZWNraW5nIGRpcmVjdG9yeSBlbnRyaWVzLCBpZ25vcmUgdGhlIHRhYmxlcyBgZ2x5eCcgYW5kIGBsb2N4JyAgKi8KLSAgLyogd2hpY2ggYXJlIGhhY2tlZC1vdXQgdmVyc2lvbnMgb2YgYGdseWYnIGFuZCBgbG9jYScgaW4gc29tZSBQb3N0U2NyaXB0ICovCi0gIC8qIFR5cGUgNDIgZm9udHMsIGFuZCB3aGljaCBhcmUgZ2VuZXJhbGx5IGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNoZWNrX3RhYmxlX2RpciggU0ZOVF9IZWFkZXIgIHNmbnQsCi0gICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgRlRfVUludCAgICAgICAgIG5uOwotICAgIEZUX1VJbnQgICAgICAgICBoYXNfaGVhZCA9IDAsIGhhc19zaW5nID0gMCwgaGFzX21ldGEgPSAwOwotICAgIEZUX1VMb25nICAgICAgICBvZmZzZXQgPSBzZm50LT5vZmZzZXQgKyAxMjsKLQotICAgIGNvbnN0IEZUX1VMb25nICBnbHl4X3RhZyA9IEZUX01BS0VfVEFHKCAnZycsICdsJywgJ3knLCAneCcgKTsKLSAgICBjb25zdCBGVF9VTG9uZyAgbG9jeF90YWcgPSBGVF9NQUtFX1RBRyggJ2wnLCAnbycsICdjJywgJ3gnICk7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHRhYmxlX2Rpcl9lbnRyeV9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9UYWJsZVJlYwotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMTYgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIFRhZyApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggQ2hlY2tTdW0gKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIE9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggTGVuZ3RoICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0KLSAgICBpZiAoIHNmbnQtPm51bV90YWJsZXMgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgb2Zmc2V0ICsgc2ZudC0+bnVtX3RhYmxlcyAqIDE2ID4gc3RyZWFtLT5zaXplICkKLSAgICAgIHJldHVybiBTRk5UX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IHNmbnQtPm51bV90YWJsZXM7IG5uKysgKQotICAgIHsKLSAgICAgIFRUX1RhYmxlUmVjICB0YWJsZTsKLQotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggdGFibGVfZGlyX2VudHJ5X2ZpZWxkcywgJnRhYmxlICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGlmICggdGFibGUuT2Zmc2V0ICsgdGFibGUuTGVuZ3RoID4gc3RyZWFtLT5zaXplICYmCi0gICAgICAgICAgIHRhYmxlLlRhZyAhPSBnbHl4X3RhZyAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICB0YWJsZS5UYWcgIT0gbG9jeF90YWcgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICByZXR1cm4gU0ZOVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdDsKLQotICAgICAgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19oZWFkIHx8IHRhYmxlLlRhZyA9PSBUVEFHX2JoZWQgKQotICAgICAgewotICAgICAgICBGVF9VSW50MzIgIG1hZ2ljOwotCi0KLSNpZm5kZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0gICAgICAgIGlmICggdGFibGUuVGFnID09IFRUQUdfaGVhZCApCi0jZW5kaWYKLSAgICAgICAgICBoYXNfaGVhZCA9IDE7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHRhYmxlIGxlbmd0aCBzaG91bGQgYmUgMHgzNiwgYnV0IGNlcnRhaW4gZm9udCB0b29scyBtYWtlIGl0Ci0gICAgICAgICAqIDB4MzgsIHNvIHdlIHdpbGwganVzdCBjaGVjayB0aGF0IGl0IGlzIGdyZWF0ZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIE5vdGUgdGhhdCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24sIHRoZSB0YWJsZSBtdXN0IGJlCi0gICAgICAgICAqIHBhZGRlZCB0byAzMi1iaXQgbGVuZ3RocywgYnV0IHRoaXMgZG9lc24ndCBhcHBseSB0byB0aGUgdmFsdWUgb2YKLSAgICAgICAgICogaXRzIGBMZW5ndGgnIGZpZWxkIQotICAgICAgICAgKgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCB0YWJsZS5MZW5ndGggPCAweDM2ICkKLSAgICAgICAgICByZXR1cm4gU0ZOVF9FcnJfVW5rbm93bl9GaWxlX0Zvcm1hdDsKLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCB0YWJsZS5PZmZzZXQgKyAxMiApIHx8Ci0gICAgICAgICAgICAgRlRfUkVBRF9VTE9ORyggbWFnaWMgKSAgICAgICAgICAgICAgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgICBpZiAoIG1hZ2ljICE9IDB4NUYwRjNDRjVVTCApCi0gICAgICAgICAgcmV0dXJuIFNGTlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQ7Ci0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICsgKCBubiArIDEgKSAqIDE2ICkgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19TSU5HICkKLSAgICAgICAgaGFzX3NpbmcgPSAxOwotICAgICAgZWxzZSBpZiAoIHRhYmxlLlRhZyA9PSBUVEFHX01FVEEgKQotICAgICAgICBoYXNfbWV0YSA9IDE7Ci0gICAgfQotCi0gICAgLyogaWYgYHNpbmcnIGFuZCBgbWV0YScgdGFibGVzIGFyZSBwcmVzZW50LCB0aGVyZSBpcyBubyBgaGVhZCcgdGFibGUgKi8KLSAgICBpZiAoIGhhc19oZWFkIHx8ICggaGFzX3NpbmcgJiYgaGFzX21ldGEgKSApCi0gICAgICByZXR1cm4gU0ZOVF9FcnJfT2s7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIFNGTlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9mb250X2RpciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBoZWFkZXIgb2YgYSBTRk5UIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2ZudCAgICAgICA6OiBUaGUgU0ZOVCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb250IGRpcmVjdG9yeS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2ZvbnRfZGlyKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgU0ZOVF9IZWFkZXJSZWMgIHNmbnQ7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBUVF9UYWJsZVJlYyogICAgZW50cnk7Ci0gICAgVFRfVGFibGVSZWMqICAgIGxpbWl0OwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBvZmZzZXRfdGFibGVfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgU0ZOVF9IZWFkZXJSZWMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBudW1fdGFibGVzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggc2VhcmNoX3JhbmdlICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZW50cnlfc2VsZWN0b3IgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCByYW5nZV9zaGlmdCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgRlRfVFJBQ0UyKCggInR0X2ZhY2VfbG9hZF9mb250X2RpcjogJTA4cFxuIiwgZmFjZSApKTsKLQotICAgIC8qIHJlYWQgdGhlIG9mZnNldCB0YWJsZSAqLwotCi0gICAgc2ZudC5vZmZzZXQgPSBGVF9TVFJFQU1fUE9TKCk7Ci0KLSAgICBpZiAoIEZUX1JFQURfVUxPTkcoIHNmbnQuZm9ybWF0X3RhZyApICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfU1RSRUFNX1JFQURfRklFTERTKCBvZmZzZXRfdGFibGVfZmllbGRzLCAmc2ZudCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIG1hbnkgZm9udHMgZG9uJ3QgaGF2ZSB0aGVzZSBmaWVsZHMgc2V0IGNvcnJlY3RseSAqLwotI2lmIDAKLSAgICBpZiAoIHNmbnQuc2VhcmNoX3JhbmdlICE9IDEgPDwgKCBzZm50LmVudHJ5X3NlbGVjdG9yICsgNCApICAgICAgICB8fAotICAgICAgICAgc2ZudC5zZWFyY2hfcmFuZ2UgKyBzZm50LnJhbmdlX3NoaWZ0ICE9IHNmbnQubnVtX3RhYmxlcyA8PCA0ICkKLSAgICAgIHJldHVybiBTRk5UX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OwotI2VuZGlmCi0KLSAgICAvKiBsb2FkIHRoZSB0YWJsZSBkaXJlY3RvcnkgKi8KLQotICAgIEZUX1RSQUNFMigoICItLSBUYWJsZXMgY291bnQ6ICAgJTEydVxuIiwgIHNmbnQubnVtX3RhYmxlcyApKTsKLSAgICBGVF9UUkFDRTIoKCAiLS0gRm9ybWF0IHZlcnNpb246ICUwOGx4XG4iLCBzZm50LmZvcm1hdF90YWcgKSk7Ci0KLSAgICAvKiBjaGVjayBmaXJzdCAqLwotICAgIGVycm9yID0gY2hlY2tfdGFibGVfZGlyKCAmc2ZudCwgc3RyZWFtICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggInR0X2ZhY2VfbG9hZF9mb250X2RpcjogaW52YWxpZCB0YWJsZSBkaXJlY3RvcnkhXG4iICkpOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgZmFjZS0+bnVtX3RhYmxlcyA9IHNmbnQubnVtX3RhYmxlczsKLSAgICBmYWNlLT5mb3JtYXRfdGFnID0gc2ZudC5mb3JtYXRfdGFnOwotCi0gICAgaWYgKCBGVF9RTkVXX0FSUkFZKCBmYWNlLT5kaXJfdGFibGVzLCBmYWNlLT5udW1fdGFibGVzICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc2ZudC5vZmZzZXQgKyAxMiApICAgICAgIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggZmFjZS0+bnVtX3RhYmxlcyAqIDE2TCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGVudHJ5ID0gZmFjZS0+ZGlyX3RhYmxlczsKLSAgICBsaW1pdCA9IGVudHJ5ICsgZmFjZS0+bnVtX3RhYmxlczsKLQotICAgIGZvciAoIDsgZW50cnkgPCBsaW1pdDsgZW50cnkrKyApCi0gICAgewotICAgICAgZW50cnktPlRhZyAgICAgID0gRlRfR0VUX1RBRzQoKTsKLSAgICAgIGVudHJ5LT5DaGVja1N1bSA9IEZUX0dFVF9VTE9ORygpOwotICAgICAgZW50cnktPk9mZnNldCAgID0gRlRfR0VUX0xPTkcoKTsKLSAgICAgIGVudHJ5LT5MZW5ndGggICA9IEZUX0dFVF9MT05HKCk7Ci0KLSAgICAgIEZUX1RSQUNFMigoICIgICVjJWMlYyVjICAtICAlMDhseCAgLSAgJTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LT5UYWcgPj4gMjQgKSwKLSAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnktPlRhZyA+PiAxNiApLAotICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS0+VGFnID4+IDggICksCi0gICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LT5UYWcgICAgICAgKSwKLSAgICAgICAgICAgICAgICAgIGVudHJ5LT5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICBlbnRyeS0+TGVuZ3RoICkpOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIEZUX1RSQUNFMigoICJ0YWJsZSBkaXJlY3RvcnkgbG9hZGVkXG5cbiIgKSk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9hbnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBUaGUgZmFjZSBvYmplY3QgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IFRoZSB0YWcgb2YgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWUgMCBpZiB5b3Ugd2FudCAgICovCi0gIC8qICAgICAgICAgICAgICB0byBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZSwgZWxzZSBzZXQgdGhpcyBwYXJhbWV0ZXIgICAqLwotICAvKiAgICAgICAgICAgICAgdG8gYSB2YWxpZCBUcnVlVHlwZSB0YWJsZSB0YWcgdGhhdCB5b3UgY2FuIGZvcmdlIHdpdGggICAgKi8KLSAgLyogICAgICAgICAgICAgIHRoZSBNQUtFX1RUX1RBRyBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXQgOjogVGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgdGFibGUgKG9yIHRoZSBmaWxlIGlmICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHRhZyA9PSAwKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGRlY2lzaW9uIHZhcmlhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmIGxlbmd0aCA9PSBOVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSB3aG9sZSB0YWJsZS4gIFJldHVybnMgYW4gZXJyb3IgaWYgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgb2Zmc2V0JyA9PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoID09IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBFeGl0cyBpbW1lZGlhdGVseTsgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuICovCi0gIC8qICAgICAgICAgICAgICAgICAgdGFibGUgb3Igb2YgdGhlIGZvbnQgZmlsZSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAqLwotICAvKiAgICAgICAgICAgICAgICAgIGB0YWcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggIT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSBuZXh0IGBsZW5ndGgnIGJ5dGVzIG9mIHRhYmxlIG9yIGZvbnQsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCBvZmZzZXQgYG9mZnNldCcgKGluIHRhYmxlIG9yIGZvbnQgdG9vKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyIDo6IFRoZSBhZGRyZXNzIG9mIHRhcmdldCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2FueSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotICAgIFRUX1RhYmxlICAgdGFibGU7Ci0gICAgRlRfVUxvbmcgICBzaXplOwotCi0KLSAgICBpZiAoIHRhZyAhPSAwICkKLSAgICB7Ci0gICAgICAvKiBsb29rIGZvciB0YWcgaW4gZm9udCBkaXJlY3RvcnkgKi8KLSAgICAgIHRhYmxlID0gdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIHRhZyApOwotICAgICAgaWYgKCAhdGFibGUgKQotICAgICAgewotICAgICAgICBlcnJvciA9IFNGTlRfRXJyX1RhYmxlX01pc3Npbmc7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgb2Zmc2V0ICs9IHRhYmxlLT5PZmZzZXQ7Ci0gICAgICBzaXplICAgID0gdGFibGUtPkxlbmd0aDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgLyogdGFnID09IDAgLS0gdGhlIHVzZXIgd2FudHMgdG8gYWNjZXNzIHRoZSBmb250IGZpbGUgZGlyZWN0bHkgKi8KLSAgICAgIHNpemUgPSBmYWNlLT5yb290LnN0cmVhbS0+c2l6ZTsKLQotICAgIGlmICggbGVuZ3RoICYmICpsZW5ndGggPT0gMCApCi0gICAgewotICAgICAgKmxlbmd0aCA9IHNpemU7Ci0KLSAgICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgICB9Ci0KLSAgICBpZiAoIGxlbmd0aCApCi0gICAgICBzaXplID0gKmxlbmd0aDsKLQotICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotICAgIC8qIHRoZSBgaWYnIGlzIHN5bnRhY3RpYyBzdWdhciBmb3IgcGlja3kgY29tcGlsZXJzICovCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9BVCggb2Zmc2V0LCBidWZmZXIsIHNpemUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9nZW5lcmljX2hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBUcnVlVHlwZSB0YWJsZSBgaGVhZCcgb3IgYGJoZWQnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfZmFjZV9sb2FkX2dlbmVyaWNfaGVhZGVyKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgVFRfSGVhZGVyKiAgaGVhZGVyOwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBoZWFkZXJfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgVFRfSGVhZGVyCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA1NCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIFRhYmxlX1ZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBGb250X1JldmlzaW9uICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggQ2hlY2tTdW1fQWRqdXN0ICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggTWFnaWNfTnVtYmVyICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggRmxhZ3MgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBVbml0c19QZXJfRU0gKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBDcmVhdGVkWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggQ3JlYXRlZFsxXSApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIE1vZGlmaWVkWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggTW9kaWZpZWRbMV0gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB4TWluICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeU1pbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHhNYXggKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB5TWF4ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggTWFjX1N0eWxlICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggTG93ZXN0X1JlY19QUEVNICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggRm9udF9EaXJlY3Rpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBJbmRleF9Ub19Mb2NfRm9ybWF0ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggR2x5cGhfRGF0YV9Gb3JtYXQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgdGFnLCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGhlYWRlciA9ICZmYWNlLT5oZWFkZXI7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggaGVhZGVyX2ZpZWxkcywgaGVhZGVyICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfVFJBQ0UzKCggIlVuaXRzIHBlciBFTTogJTR1XG4iLCBoZWFkZXItPlVuaXRzX1Blcl9FTSApKTsKLSAgICBGVF9UUkFDRTMoKCAiSW5kZXhUb0xvYzogICAlNGRcbiIsIGhlYWRlci0+SW5kZXhfVG9fTG9jX0Zvcm1hdCApKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9oZWFkKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICByZXR1cm4gdHRfZmFjZV9sb2FkX2dlbmVyaWNfaGVhZGVyKCBmYWNlLCBzdHJlYW0sIFRUQUdfaGVhZCApOwotICB9Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfYmhlZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgcmV0dXJuIHR0X2ZhY2VfbG9hZF9nZW5lcmljX2hlYWRlciggZmFjZSwgc3RyZWFtLCBUVEFHX2JoZWQgKTsKLSAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfbWF4X3Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgbWF4aW11bSBwcm9maWxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9tYXhwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgVFRfTWF4UHJvZmlsZSogIG1heFByb2ZpbGUgPSAmZmFjZS0+bWF4X3Byb2ZpbGU7Ci0KLSAgICBjb25zdCBGVF9GcmFtZV9GaWVsZCAgbWF4cF9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9NYXhQcm9maWxlCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA2ICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggdmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG51bUdseXBocyApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBtYXhwX2ZpZWxkc19leHRyYVtdID0KLSAgICB7Ci0gICAgICBGVF9GUkFNRV9TVEFSVCggMjYgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhQb2ludHMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhDb250b3VycyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heENvbXBvc2l0ZVBvaW50cyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heENvbXBvc2l0ZUNvbnRvdXJzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4Wm9uZXMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhUd2lsaWdodFBvaW50cyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heFN0b3JhZ2UgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhGdW5jdGlvbkRlZnMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhJbnN0cnVjdGlvbkRlZnMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhTdGFja0VsZW1lbnRzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4Q29tcG9uZW50RWxlbWVudHMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhDb21wb25lbnREZXB0aCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX21heHAsIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG1heHBfZmllbGRzLCBtYXhQcm9maWxlICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgbWF4UHJvZmlsZS0+bWF4UG9pbnRzICAgICAgICAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhDb250b3VycyAgICAgICAgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heENvbXBvc2l0ZVBvaW50cyAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4Q29tcG9zaXRlQ29udG91cnMgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhab25lcyAgICAgICAgICAgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heFR3aWxpZ2h0UG9pbnRzICAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4U3RvcmFnZSAgICAgICAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhGdW5jdGlvbkRlZnMgICAgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heEluc3RydWN0aW9uRGVmcyAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4U3RhY2tFbGVtZW50cyAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heENvbXBvbmVudEVsZW1lbnRzICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4Q29tcG9uZW50RGVwdGggICAgID0gMDsKLQotICAgIGlmICggbWF4UHJvZmlsZS0+dmVyc2lvbiA+PSAweDEwMDAwTCApCi0gICAgewotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG1heHBfZmllbGRzX2V4dHJhLCBtYXhQcm9maWxlICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIFhYWDogYW4gYWRqdXN0bWVudCB0aGF0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIGNlcnRhaW4gKi8KLSAgICAgIC8qICAgICAgYnJva2VuIGZvbnRzIGxpa2UgYEtleXN0cm9rZXMgTVQnIDotKCAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgV2UgYWxsb2NhdGUgNjQgZnVuY3Rpb24gZW50cmllcyBieSBkZWZhdWx0IHdoZW4gICAgKi8KLSAgICAgIC8qICAgdGhlIG1heEZ1bmN0aW9uRGVmcyBmaWVsZCBpcyBudWxsLiAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBtYXhQcm9maWxlLT5tYXhGdW5jdGlvbkRlZnMgPT0gMCApCi0gICAgICAgIG1heFByb2ZpbGUtPm1heEZ1bmN0aW9uRGVmcyA9IDY0OwotCi0gICAgICAvKiB3ZSBhZGQgNCBwaGFudG9tIHBvaW50cyBsYXRlciAqLwotICAgICAgaWYgKCBtYXhQcm9maWxlLT5tYXhUd2lsaWdodFBvaW50cyA+ICggMHhGRkZGVSAtIDQgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIlRvbyBtdWNoIHR3aWxpZ2h0IHBvaW50cyBpbiBgbWF4cCcgdGFibGU7XG4iICkpOwotICAgICAgICBGVF9FUlJPUigoICIgIHNvbWUgZ2x5cGhzIG1pZ2h0IGJlIHJlbmRlcmVkIGluY29ycmVjdGx5LlxuIiApKTsKLQotICAgICAgICBtYXhQcm9maWxlLT5tYXhUd2lsaWdodFBvaW50cyA9IDB4RkZGRlUgLSA0OwotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFMygoICJudW1HbHlwaHM6ICV1XG4iLCBtYXhQcm9maWxlLT5udW1HbHlwaHMgKSk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9uYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX25hbWUoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VTG9uZyAgICAgIHRhYmxlX3BvcywgdGFibGVfbGVuOwotICAgIEZUX1VMb25nICAgICAgc3RvcmFnZV9zdGFydCwgc3RvcmFnZV9saW1pdDsKLSAgICBGVF9VSW50ICAgICAgIGNvdW50OwotICAgIFRUX05hbWVUYWJsZSAgdGFibGU7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIG5hbWVfdGFibGVfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgVFRfTmFtZVRhYmxlUmVjCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA2ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZm9ybWF0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbnVtTmFtZVJlY29yZHMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBzdG9yYWdlT2Zmc2V0ICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBuYW1lX3JlY29yZF9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9OYW1lRW50cnlSZWMKLQotICAgICAgLyogbm8gRlRfRlJBTUVfU1RBUlQgKi8KLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBwbGF0Zm9ybUlEICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZW5jb2RpbmdJRCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGxhbmd1YWdlSUQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBuYW1lSUQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBzdHJpbmdMZW5ndGggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBzdHJpbmdPZmZzZXQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIHRhYmxlICAgICAgICAgPSAmZmFjZS0+bmFtZV90YWJsZTsKLSAgICB0YWJsZS0+c3RyZWFtID0gc3RyZWFtOwotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX25hbWUsIHN0cmVhbSwgJnRhYmxlX2xlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgdGFibGVfcG9zID0gRlRfU1RSRUFNX1BPUygpOwotCi0KLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggbmFtZV90YWJsZV9maWVsZHMsIHRhYmxlICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogU29tZSBwb3B1bGFyIEFzaWFuIGZvbnRzIGhhdmUgYW4gaW52YWxpZCBgc3RvcmFnZU9mZnNldCcgdmFsdWUgICAqLwotICAgIC8qIChpdCBzaG91bGQgYmUgYXQgbGVhc3QgIjYgKyAxMipudW1fbmFtZXMiKS4gIEhvd2V2ZXIsIHRoZSBzdHJpbmcgKi8KLSAgICAvKiBvZmZzZXRzLCBjb21wdXRlZCBhcyAic3RvcmFnZU9mZnNldCArIGVudHJ5LT5zdHJpbmdPZmZzZXQiLCBhcmUgICovCi0gICAgLyogdmFsaWQgcG9pbnRlcnMgd2l0aGluIHRoZSBuYW1lIHRhYmxlLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBXZSB0aHVzIGNhbid0IGNoZWNrIGBzdG9yYWdlT2Zmc2V0JyByaWdodCBub3cuICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHN0b3JhZ2Vfc3RhcnQgPSB0YWJsZV9wb3MgKyA2ICsgMTIqdGFibGUtPm51bU5hbWVSZWNvcmRzOwotICAgIHN0b3JhZ2VfbGltaXQgPSB0YWJsZV9wb3MgKyB0YWJsZV9sZW47Ci0KLSAgICBpZiAoIHN0b3JhZ2Vfc3RhcnQgPiBzdG9yYWdlX2xpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJpbnZhbGlkIGBuYW1lJyB0YWJsZVxuIiApKTsKLSAgICAgIGVycm9yID0gU0ZOVF9FcnJfTmFtZV9UYWJsZV9NaXNzaW5nOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBhcnJheSBvZiBuYW1lIHJlY29yZHMuICovCi0gICAgY291bnQgICAgICAgICAgICAgICAgID0gdGFibGUtPm51bU5hbWVSZWNvcmRzOwotICAgIHRhYmxlLT5udW1OYW1lUmVjb3JkcyA9IDA7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggdGFibGUtPm5hbWVzLCBjb3VudCApIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggY291bnQgKiAxMiApICAgICAgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBMb2FkIHRoZSBuYW1lIHJlY29yZHMgYW5kIGRldGVybWluZSBob3cgbXVjaCBzdG9yYWdlIGlzIG5lZWRlZCAqLwotICAgIC8qIHRvIGhvbGQgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgVFRfTmFtZUVudHJ5UmVjKiAgZW50cnkgPSB0YWJsZS0+bmFtZXM7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgewotICAgICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggbmFtZV9yZWNvcmRfZmllbGRzLCBlbnRyeSApICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBjaGVjayB0aGF0IHRoZSBuYW1lIGlzIG5vdCBlbXB0eSAqLwotICAgICAgICBpZiAoIGVudHJ5LT5zdHJpbmdMZW5ndGggPT0gMCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgbmFtZSBzdHJpbmcgaXMgd2l0aGluIHRoZSB0YWJsZSAqLwotICAgICAgICBlbnRyeS0+c3RyaW5nT2Zmc2V0ICs9IHRhYmxlX3BvcyArIHRhYmxlLT5zdG9yYWdlT2Zmc2V0OwotICAgICAgICBpZiAoIGVudHJ5LT5zdHJpbmdPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgIDwgc3RvcmFnZV9zdGFydCB8fAotICAgICAgICAgICAgIGVudHJ5LT5zdHJpbmdPZmZzZXQgKyBlbnRyeS0+c3RyaW5nTGVuZ3RoID4gc3RvcmFnZV9saW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBpbnZhbGlkIGVudHJ5IC0gaWdub3JlIGl0ICovCi0gICAgICAgICAgZW50cnktPnN0cmluZ09mZnNldCA9IDA7Ci0gICAgICAgICAgZW50cnktPnN0cmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnRyeSsrOwotICAgICAgfQotCi0gICAgICB0YWJsZS0+bnVtTmFtZVJlY29yZHMgPSAoRlRfVUludCkoIGVudHJ5IC0gdGFibGUtPm5hbWVzICk7Ci0gICAgfQotCi0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgLyogZXZlcnl0aGluZyB3ZW50IHdlbGwsIHVwZGF0ZSBmYWNlLT5udW1fbmFtZXMgKi8KLSAgICBmYWNlLT5udW1fbmFtZXMgPSAoRlRfVVNob3J0KSB0YWJsZS0+bnVtTmFtZVJlY29yZHM7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZnJlZV9uYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVzIHRoZSBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX25hbWUoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBmYWNlLT5yb290LmRyaXZlci0+cm9vdC5tZW1vcnk7Ci0gICAgVFRfTmFtZVRhYmxlICB0YWJsZSAgPSAmZmFjZS0+bmFtZV90YWJsZTsKLSAgICBUVF9OYW1lRW50cnkgIGVudHJ5ICA9IHRhYmxlLT5uYW1lczsKLSAgICBGVF9VSW50ICAgICAgIGNvdW50ICA9IHRhYmxlLT5udW1OYW1lUmVjb3JkczsKLQotCi0gICAgaWYgKCB0YWJsZS0+bmFtZXMgKQotICAgIHsKLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBlbnRyeSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotICAgICAgICBlbnRyeS0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgIH0KLQotICAgICAgLyogZnJlZSBzdHJpbmdzIHRhYmxlICovCi0gICAgICBGVF9GUkVFKCB0YWJsZS0+bmFtZXMgKTsKLSAgICB9Ci0KLSAgICB0YWJsZS0+bnVtTmFtZVJlY29yZHMgPSAwOwotICAgIHRhYmxlLT5mb3JtYXQgICAgICAgICA9IDA7Ci0gICAgdGFibGUtPnN0b3JhZ2VPZmZzZXQgID0gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2NtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIGNtYXAgZGlyZWN0b3J5IGluIGEgZmFjZSBvYmplY3QuICBUaGUgY21hcHMgdGhlbXNlbHZlcyAgICovCi0gIC8qICAgIGFyZSBsb2FkZWQgb24gZGVtYW5kIGluIHRoZSBgdHRjbWFwLmMnIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfY21hcCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfY21hcCwgc3RyZWFtLCAmZmFjZS0+Y21hcF9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIGZhY2UtPmNtYXBfc2l6ZSwgZmFjZS0+Y21hcF90YWJsZSApICkKLSAgICAgIGZhY2UtPmNtYXBfc2l6ZSA9IDA7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX29zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIE9TMiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfb3MyKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBUVF9PUzIqICAgb3MyOwotCi0gICAgY29uc3QgRlRfRnJhbWVfRmllbGQgIG9zMl9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9PUzIKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDc4ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHhBdmdDaGFyV2lkdGggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c1dlaWdodENsYXNzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNXaWR0aENsYXNzICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggZnNUeXBlICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1YnNjcmlwdFhTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1YnNjcmlwdFlTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1YnNjcmlwdFhPZmZzZXQgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB5U3Vic2NyaXB0WU9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdXBlcnNjcmlwdFhTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1cGVyc2NyaXB0WVNpemUgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB5U3VwZXJzY3JpcHRYT2Zmc2V0ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1cGVyc2NyaXB0WU9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdHJpa2VvdXRTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN0cmlrZW91dFBvc2l0aW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggc0ZhbWlseUNsYXNzICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzFdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzJdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzNdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzRdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzVdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzZdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzddICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzhdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggcGFub3NlWzldICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdWxVbmljb2RlUmFuZ2UxICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdWxVbmljb2RlUmFuZ2UyICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdWxVbmljb2RlUmFuZ2UzICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggdWxVbmljb2RlUmFuZ2U0ICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggYWNoVmVuZElEWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggYWNoVmVuZElEWzFdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggYWNoVmVuZElEWzJdICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggYWNoVmVuZElEWzNdICksCi0KLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBmc1NlbGVjdGlvbiApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzRmlyc3RDaGFySW5kZXggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c0xhc3RDaGFySW5kZXggKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBzVHlwb0FzY2VuZGVyICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggc1R5cG9EZXNjZW5kZXIgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBzVHlwb0xpbmVHYXAgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c1dpbkFzY2VudCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzV2luRGVzY2VudCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBvczJfZmllbGRzX2V4dHJhW10gPQotICAgIHsKLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA4ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCB1bENvZGVQYWdlUmFuZ2UxICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCB1bENvZGVQYWdlUmFuZ2UyICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0gICAgY29uc3QgRlRfRnJhbWVfRmllbGQgIG9zMl9maWVsZHNfZXh0cmEyW10gPQotICAgIHsKLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCAxMCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHN4SGVpZ2h0ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggc0NhcEhlaWdodCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzRGVmYXVsdENoYXIgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c0JyZWFrQ2hhciApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzTWF4Q29udGV4dCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgLyogV2Ugbm93IHN1cHBvcnQgb2xkIE1hYyBmb250cyB3aGVyZSB0aGUgT1MvMiB0YWJsZSBkb2Vzbid0ICAqLwotICAgIC8qIGV4aXN0LiAgU2ltcGx5IHB1dCwgd2Ugc2V0IHRoZSBgdmVyc2lvbicgZmllbGQgdG8gMHhGRkZGICAgKi8KLSAgICAvKiBhbmQgdGVzdCB0aGlzIHZhbHVlIGVhY2ggdGltZSB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgdGFibGUuICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX09TMiwgc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBvczIgPSAmZmFjZS0+b3MyOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG9zMl9maWVsZHMsIG9zMiApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG9zMi0+dWxDb2RlUGFnZVJhbmdlMSA9IDA7Ci0gICAgb3MyLT51bENvZGVQYWdlUmFuZ2UyID0gMDsKLSAgICBvczItPnN4SGVpZ2h0ICAgICAgICAgPSAwOwotICAgIG9zMi0+c0NhcEhlaWdodCAgICAgICA9IDA7Ci0gICAgb3MyLT51c0RlZmF1bHRDaGFyICAgID0gMDsKLSAgICBvczItPnVzQnJlYWtDaGFyICAgICAgPSAwOwotICAgIG9zMi0+dXNNYXhDb250ZXh0ICAgICA9IDA7Ci0KLSAgICBpZiAoIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgKQotICAgIHsKLSAgICAgIC8qIG9ubHkgdmVyc2lvbiAxIHRhYmxlcyAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG9zMl9maWVsZHNfZXh0cmEsIG9zMiApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIG9zMi0+dmVyc2lvbiA+PSAweDAwMDIgKQotICAgICAgewotICAgICAgICAvKiBvbmx5IHZlcnNpb24gMiB0YWJsZXMgKi8KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG9zMl9maWVsZHNfZXh0cmEyLCBvczIgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFMygoICJzVHlwb0FzY2VuZGVyOiAgJTRkXG4iLCAgIG9zMi0+c1R5cG9Bc2NlbmRlciApKTsKLSAgICBGVF9UUkFDRTMoKCAic1R5cG9EZXNjZW5kZXI6ICU0ZFxuIiwgICBvczItPnNUeXBvRGVzY2VuZGVyICkpOwotICAgIEZUX1RSQUNFMygoICJ1c1dpbkFzY2VudDogICAgJTR1XG4iLCAgIG9zMi0+dXNXaW5Bc2NlbnQgKSk7Ci0gICAgRlRfVFJBQ0UzKCggInVzV2luRGVzY2VudDogICAlNHVcbiIsICAgb3MyLT51c1dpbkRlc2NlbnQgKSk7Ci0gICAgRlRfVFJBQ0UzKCggImZzU2VsZWN0aW9uOiAgICAweCUyeFxuIiwgb3MyLT5mc1NlbGVjdGlvbiApKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX3Bvc3RzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIFBvc3RzY3JpcHQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfcG9zdCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIFRUX1Bvc3RzY3JpcHQqICBwb3N0ID0gJmZhY2UtPnBvc3RzY3JpcHQ7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBvc3RfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgVFRfUG9zdHNjcmlwdAotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMzIgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIEZvcm1hdFR5cGUgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIGl0YWxpY0FuZ2xlICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUKCB1bmRlcmxpbmVQb3NpdGlvbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCggdW5kZXJsaW5lVGhpY2tuZXNzICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBpc0ZpeGVkUGl0Y2ggKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIG1pbk1lbVR5cGU0MiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggbWF4TWVtVHlwZTQyICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBtaW5NZW1UeXBlMSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggbWF4TWVtVHlwZTEgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19wb3N0LCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBwb3N0X2ZpZWxkcywgcG9zdCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIHdlIGRvbid0IGxvYWQgdGhlIGdseXBoIG5hbWVzLCB3ZSBkbyB0aGF0IGluIGFub3RoZXIgKi8KLSAgICAvKiBtb2R1bGUgKHR0cG9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9UUkFDRTMoKCAiRm9ybWF0VHlwZTogICAweCV4XG4iLCBwb3N0LT5Gb3JtYXRUeXBlICkpOwotICAgIEZUX1RSQUNFMygoICJpc0ZpeGVkUGl0Y2g6ICAgJXNcbiIsIHBvc3QtPmlzRml4ZWRQaXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIiAgeWVzIiA6ICIgICBubyIgKSk7Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9wY2x0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBQQ0wgNSBUYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3BjbHQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgcGNsdF9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9QQ0xUCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA1NCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIFZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBGb250TnVtYmVyICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggUGl0Y2ggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB4SGVpZ2h0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggU3R5bGUgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBUeXBlRmFtaWx5ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggQ2FwSGVpZ2h0ICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEVTICggVHlwZUZhY2UsIDE2ICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEVTICggQ2hhcmFjdGVyQ29tcGxlbWVudCwgOCApLAotICAgICAgICBGVF9GUkFNRV9CWVRFUyAoIEZpbGVOYW1lLCA2ICksCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIgICggU3Ryb2tlV2VpZ2h0ICksCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIgICggV2lkdGhUeXBlICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggU2VyaWZTdHlsZSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIFJlc2VydmVkICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIFRUX1BDTFQqICBwY2x0ID0gJmZhY2UtPnBjbHQ7Ci0KLQotICAgIC8qIG9wdGlvbmFsIHRhYmxlICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX1BDTFQsIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHBjbHRfZmllbGRzLCBwY2x0ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfZ2FzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgYGdhc3AnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9nYXNwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLSAgICBGVF9VSW50ICAgICAgICBqLG51bV9yYW5nZXM7Ci0gICAgVFRfR2FzcFJhbmdlICAgZ2FzcHJhbmdlczsKLQotCi0gICAgLyogdGhlIGdhc3AgdGFibGUgaXMgb3B0aW9uYWwgKi8KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZ2FzcCwgc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCA0TCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZhY2UtPmdhc3AudmVyc2lvbiAgID0gRlRfR0VUX1VTSE9SVCgpOwotICAgIGZhY2UtPmdhc3AubnVtUmFuZ2VzID0gRlRfR0VUX1VTSE9SVCgpOwotCi0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgLyogb25seSBzdXBwb3J0IHZlcnNpb25zIDAgYW5kIDEgb2YgdGhlIHRhYmxlICovCi0gICAgaWYgKCBmYWNlLT5nYXNwLnZlcnNpb24gPj0gMiApCi0gICAgewotICAgICAgZmFjZS0+Z2FzcC5udW1SYW5nZXMgPSAwOwotICAgICAgZXJyb3IgPSBTRk5UX0Vycl9JbnZhbGlkX1RhYmxlOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIG51bV9yYW5nZXMgPSBmYWNlLT5nYXNwLm51bVJhbmdlczsKLSAgICBGVF9UUkFDRTMoKCAibnVtUmFuZ2VzOiAldVxuIiwgbnVtX3JhbmdlcyApKTsKLQotICAgIGlmICggRlRfUU5FV19BUlJBWSggZ2FzcHJhbmdlcywgbnVtX3JhbmdlcyApIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggbnVtX3JhbmdlcyAqIDRMICkgICAgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmYWNlLT5nYXNwLmdhc3BSYW5nZXMgPSBnYXNwcmFuZ2VzOwotCi0gICAgZm9yICggaiA9IDA7IGogPCBudW1fcmFuZ2VzOyBqKysgKQotICAgIHsKLSAgICAgIGdhc3ByYW5nZXNbal0ubWF4UFBFTSAgPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgICBnYXNwcmFuZ2VzW2pdLmdhc3BGbGFnID0gRlRfR0VUX1VTSE9SVCgpOwotCi0gICAgICBGVF9UUkFDRTMoKCAiZ2FzcFJhbmdlICVkOiByYW5nZU1heFBQRU0gJTVkLCByYW5nZUdhc3BCZWhhdmlvciAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgaiwKLSAgICAgICAgICAgICAgICAgIGdhc3ByYW5nZXNbal0ubWF4UFBFTSwKLSAgICAgICAgICAgICAgICAgIGdhc3ByYW5nZXNbal0uZ2FzcEZsYWcgKSk7Ci0gICAgfQotCi0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dGxvYWQuaCBiL3NyYy9zZm50L3R0bG9hZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWExYWVlLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3R0bG9hZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0bG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSB0YWJsZXMsIGkuZS4sIHRhYmxlcyB0aGF0IGNhbiBiZSBlaXRoZXIgaW4gICAqLwotLyogICAgVFRGIG9yIE9URiBmb250cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVExPQURfSF9fCi0jZGVmaW5lIF9fVFRMT0FEX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCBUVF9UYWJsZSAgKQotICB0dF9mYWNlX2xvb2t1cF90YWJsZSggVFRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdGFnICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9nb3RvX3RhYmxlKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9mb250X2RpciggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfYW55KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfaGVhZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9jbWFwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX21heHAoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfbmFtZSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9vczIoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9wb3N0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3BjbHQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfbmFtZSggVFRfRmFjZSAgZmFjZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2dhc3AoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfYmhlZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRMT0FEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRtdHguYyBiL3NyYy9zZm50L3R0bXR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjY4MWEuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRtdHguYworKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG10eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTG9hZCB0aGUgbWV0cmljcyB0YWJsZXMgY29tbW9uIHRvIFRURiBhbmQgT1RGIGZvbnRzIChib2R5KS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgInR0bXR4LmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRtdHgKLQotCi0gIC8qCi0gICAqICBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW4ndCBlbmFibGUgb3VyIG1lbW9yeSBvcHRpbWl6YXRpb25zIGlmCi0gICAqICBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgaXMgZGVmaW5lZC4gIFRoaXMgaXMgYmVjYXVzZSBhdCBsZWFzdAotICAgKiAgb25lIHJvZ3VlIGNsaWVudCAobGliWGZvbnQgaW4gdGhlIFguT3JnIFhTZXJ2ZXIpIGlzIGRpcmVjdGx5IGFjY2Vzc2luZwotICAgKiAgdGhlIG1ldHJpY3MuCi0gICAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9obXR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGBobXR4JyBvciBgdm10eCcgdGFibGUgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCA6OiBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCBgdm10eCcuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgIWRlZmluZWQgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9obXR4KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgdmVydGljYWwgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgIHRhZywgdGFibGVfc2l6ZTsKLSAgICBGVF9VTG9uZyogIHB0YWJsZV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcqICBwdGFibGVfc2l6ZTsKLQotCi0gICAgaWYgKCB2ZXJ0aWNhbCApCi0gICAgewotICAgICAgdGFnICAgICAgICAgICA9IFRUQUdfdm10eDsKLSAgICAgIHB0YWJsZV9vZmZzZXQgPSAmZmFjZS0+dmVydF9tZXRyaWNzX29mZnNldDsKLSAgICAgIHB0YWJsZV9zaXplICAgPSAmZmFjZS0+dmVydF9tZXRyaWNzX3NpemU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0YWcgICAgICAgICAgID0gVFRBR19obXR4OwotICAgICAgcHRhYmxlX29mZnNldCA9ICZmYWNlLT5ob3J6X21ldHJpY3Nfb2Zmc2V0OwotICAgICAgcHRhYmxlX3NpemUgICA9ICZmYWNlLT5ob3J6X21ldHJpY3Nfc2l6ZTsKLSAgICB9Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIHRhZywgc3RyZWFtLCAmdGFibGVfc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgKnB0YWJsZV9zaXplICAgPSB0YWJsZV9zaXplOwotICAgICpwdGFibGVfb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbHNlIC8qICFPUFRJTUlaRV9NRU1PUlkgfHwgT0xEX0lOVEVSTkFMUyAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfaG10eCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHZlcnRpY2FsICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotICAgIEZUX1VMb25nICAgdGFibGVfbGVuOwotICAgIEZUX0xvbmcgICAgbnVtX3Nob3J0cywgbnVtX2xvbmdzLCBudW1fc2hvcnRzX2NoZWNrZWQ7Ci0KLSAgICBUVF9Mb25nTWV0cmljcyogICAgbG9uZ3M7Ci0gICAgVFRfU2hvcnRNZXRyaWNzKiogIHNob3J0czsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgcDsKLQotCi0gICAgaWYgKCB2ZXJ0aWNhbCApCi0gICAgewotICAgICAgdm9pZCogICBsbSA9ICZmYWNlLT52ZXJ0aWNhbC5sb25nX21ldHJpY3M7Ci0gICAgICB2b2lkKiogIHNtID0gJmZhY2UtPnZlcnRpY2FsLnNob3J0X21ldHJpY3M7Ci0KLQotICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX3ZtdHgsIHN0cmVhbSwgJnRhYmxlX2xlbiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgbnVtX2xvbmdzID0gZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzOwotICAgICAgaWYgKCAoRlRfVUxvbmcpbnVtX2xvbmdzID4gdGFibGVfbGVuIC8gNCApCi0gICAgICAgIG51bV9sb25ncyA9IChGVF9Mb25nKSggdGFibGVfbGVuIC8gNCApOwotCi0gICAgICBmYWNlLT52ZXJ0aWNhbC5udW1iZXJfT2ZfVk1ldHJpY3MgPSAwOwotCi0gICAgICBsb25ncyAgPSAoVFRfTG9uZ01ldHJpY3MqKWxtOwotICAgICAgc2hvcnRzID0gKFRUX1Nob3J0TWV0cmljcyoqKXNtOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdm9pZCogICBsbSA9ICZmYWNlLT5ob3Jpem9udGFsLmxvbmdfbWV0cmljczsKLSAgICAgIHZvaWQqKiAgc20gPSAmZmFjZS0+aG9yaXpvbnRhbC5zaG9ydF9tZXRyaWNzOwotCi0KLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19obXR4LCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIG51bV9sb25ncyA9IGZhY2UtPmhvcml6b250YWwubnVtYmVyX09mX0hNZXRyaWNzOwotICAgICAgaWYgKCAoRlRfVUxvbmcpbnVtX2xvbmdzID4gdGFibGVfbGVuIC8gNCApCi0gICAgICAgIG51bV9sb25ncyA9IChGVF9Mb25nKSggdGFibGVfbGVuIC8gNCApOwotCi0gICAgICBmYWNlLT5ob3Jpem9udGFsLm51bWJlcl9PZl9ITWV0cmljcyA9IDA7Ci0KLSAgICAgIGxvbmdzICA9IChUVF9Mb25nTWV0cmljcyopbG07Ci0gICAgICBzaG9ydHMgPSAoVFRfU2hvcnRNZXRyaWNzKiopc207Ci0gICAgfQotCi0gICAgLyogbmV2ZXIgdHJ1c3QgZGVyaXZlZCB2YWx1ZXMgKi8KLQotICAgIG51bV9zaG9ydHMgICAgICAgICA9IGZhY2UtPm1heF9wcm9maWxlLm51bUdseXBocyAtIG51bV9sb25nczsKLSAgICBudW1fc2hvcnRzX2NoZWNrZWQgPSAoIHRhYmxlX2xlbiAtIG51bV9sb25ncyAqIDRMICkgLyAyOwotCi0gICAgaWYgKCBudW1fc2hvcnRzIDwgMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiJWNtdHggaGFzIG1vcmUgbWV0cmljcyB0aGFuIGdseXBocy5cbiIgKSk7Ci0KLSAgICAgIC8qIEFkb2JlIHNpbXBseSBpZ25vcmVzIHRoaXMgcHJvYmxlbS4gIFNvIHdlIHNoYWxsIGRvIHRoZSBzYW1lLiAqLwotI2lmIDAKLSAgICAgIGVycm9yID0gdmVydGljYWwgPyBTRk5UX0Vycl9JbnZhbGlkX1ZlcnRfTWV0cmljcwotICAgICAgICAgICAgICAgICAgICAgICA6IFNGTlRfRXJyX0ludmFsaWRfSG9yaXpfTWV0cmljczsKLSAgICAgIGdvdG8gRXhpdDsKLSNlbHNlCi0gICAgICBudW1fc2hvcnRzID0gMDsKLSNlbmRpZgotICAgIH0KLQotICAgIGlmICggRlRfUU5FV19BUlJBWSggKmxvbmdzLCAgbnVtX2xvbmdzICApIHx8Ci0gICAgICAgICBGVF9RTkVXX0FSUkFZKCAqc2hvcnRzLCBudW1fc2hvcnRzICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggdGFibGVfbGVuICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgcCA9IHN0cmVhbS0+Y3Vyc29yOwotCi0gICAgewotICAgICAgVFRfTG9uZ01ldHJpY3MgIGN1ciAgID0gKmxvbmdzOwotICAgICAgVFRfTG9uZ01ldHJpY3MgIGxpbWl0ID0gY3VyICsgbnVtX2xvbmdzOwotCi0KLSAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgIHsKLSAgICAgICAgY3VyLT5hZHZhbmNlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgY3VyLT5iZWFyaW5nID0gRlRfTkVYVF9TSE9SVCggcCApOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGRvIHdlIGhhdmUgYW4gaW5jb25zaXN0ZW50IG51bWJlciBvZiBtZXRyaWMgdmFsdWVzPyAqLwotICAgIHsKLSAgICAgIFRUX1Nob3J0TWV0cmljcyogIGN1ciAgID0gKnNob3J0czsKLSAgICAgIFRUX1Nob3J0TWV0cmljcyogIGxpbWl0ID0gY3VyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTUlOKCBudW1fc2hvcnRzLCBudW1fc2hvcnRzX2NoZWNrZWQgKTsKLQotCi0gICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCi0gICAgICAgICpjdXIgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0KLSAgICAgIC8qIFdlIGZpbGwgdXAgdGhlIG1pc3NpbmcgbGVmdCBzaWRlIGJlYXJpbmdzIHdpdGggdGhlICAgICAqLwotICAgICAgLyogbGFzdCB2YWxpZCB2YWx1ZS4gIFNpbmNlIHRoaXMgd2lsbCBvY2N1ciBmb3IgYnVnZ3kgQ0pLICovCi0gICAgICAvKiBmb250cyB1c3VhbGx5IG9ubHksIG5vdGhpbmcgc2VyaW91cyB3aWxsIGhhcHBlbi4gICAgICAgKi8KLSAgICAgIGlmICggbnVtX3Nob3J0cyA+IG51bV9zaG9ydHNfY2hlY2tlZCAmJiBudW1fc2hvcnRzX2NoZWNrZWQgPiAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfU2hvcnQgIHZhbCA9ICgqc2hvcnRzKVtudW1fc2hvcnRzX2NoZWNrZWQgLSAxXTsKLQotCi0gICAgICAgIGxpbWl0ID0gKnNob3J0cyArIG51bV9zaG9ydHM7Ci0gICAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgICAgICAqY3VyID0gdmFsOwotICAgICAgfQotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIGlmICggdmVydGljYWwgKQotICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID0gKEZUX1VTaG9ydCludW1fbG9uZ3M7Ci0gICAgZWxzZQotICAgICAgZmFjZS0+aG9yaXpvbnRhbC5udW1iZXJfT2ZfSE1ldHJpY3MgPSAoRlRfVVNob3J0KW51bV9sb25nczsKLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogIU9QVElNSVpFX01FTU9SWSB8fCBPTERfSU5URVJOQUxTICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfaGhlYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBgaGhlYScgb3IgJ3ZoZWEnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgYHZoZWEnLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hoZWEoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICB2ZXJ0aWNhbCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgVFRfSG9yaUhlYWRlciogIGhlYWRlcjsKLQotICAgIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBtZXRyaWNzX2hlYWRlcl9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9Ib3JpSGVhZGVyCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCAzNiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIFZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBBc2NlbmRlciApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIERlc2NlbmRlciApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIExpbmVfR2FwICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggYWR2YW5jZV9XaWR0aF9NYXggKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBtaW5fTGVmdF9TaWRlX0JlYXJpbmcgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBtaW5fUmlnaHRfU2lkZV9CZWFyaW5nICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeE1heF9FeHRlbnQgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBjYXJldF9TbG9wZV9SaXNlICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggY2FyZXRfU2xvcGVfUnVuICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggY2FyZXRfT2Zmc2V0ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggUmVzZXJ2ZWRbMF0gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBSZXNlcnZlZFsxXSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIFJlc2VydmVkWzJdICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggUmVzZXJ2ZWRbM10gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBtZXRyaWNfRGF0YV9Gb3JtYXQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBudW1iZXJfT2ZfSE1ldHJpY3MgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIGlmICggdmVydGljYWwgKQotICAgIHsKLSAgICAgIHZvaWQgICp2ID0gJmZhY2UtPnZlcnRpY2FsOwotCi0KLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR192aGVhLCBzdHJlYW0sIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGhlYWRlciA9IChUVF9Ib3JpSGVhZGVyKil2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2hoZWEsIHN0cmVhbSwgMCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgaGVhZGVyID0gJmZhY2UtPmhvcml6b250YWw7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG1ldHJpY3NfaGVhZGVyX2ZpZWxkcywgaGVhZGVyICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgRlRfVFJBQ0UzKCggIkFzY2VuZGVyOiAgICAgICAgICAlNWRcbiIsIGhlYWRlci0+QXNjZW5kZXIgKSk7Ci0gICAgRlRfVFJBQ0UzKCggIkRlc2NlbmRlcjogICAgICAgICAlNWRcbiIsIGhlYWRlci0+RGVzY2VuZGVyICkpOwotICAgIEZUX1RSQUNFMygoICJudW1iZXJfT2ZfTWV0cmljczogJTV1XG4iLCBoZWFkZXItPm51bWJlcl9PZl9ITWV0cmljcyApKTsKLQotICAgIGhlYWRlci0+bG9uZ19tZXRyaWNzICA9IE5VTEw7Ci0gICAgaGVhZGVyLT5zaG9ydF9tZXRyaWNzID0gTlVMTDsKLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9nZXRfbWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJucyB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBtZXRyaWNzIGluIGZvbnQgdW5pdHMgZm9yIGEgICAgICovCi0gIC8qICAgIGdpdmVuIGdseXBoLiAgVGhlIG1ldHJpY3MgYXJlIHRoZSBsZWZ0IHNpZGUgYmVhcmluZyAocmVzcC4gdG9wICAgICAqLwotICAvKiAgICBzaWRlIGJlYXJpbmcpIGFuZCBhZHZhbmNlIHdpZHRoIChyZXNwLiBhZHZhbmNlIGhlaWdodCkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWFkZXIgIDo6IEEgcG9pbnRlciB0byBlaXRoZXIgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgbWV0cmljcyAgKi8KLSAgLyogICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggICAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZWFyaW5nIDo6IFRoZSBiZWFyaW5nLCBlaXRoZXIgbGVmdCBzaWRlIG9yIHRvcCBzaWRlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgOjogVGhlIGFkdmFuY2Ugd2lkdGggcmVzcC4gYWR2YW5jZSBoZWlnaHQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAhZGVmaW5lZCBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMKLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9nZXRfbWV0cmljcyggVFRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgdmVydGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQgICAqYWJlYXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgKmFhZHZhbmNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgVFRfSG9yaUhlYWRlciogIGhlYWRlcjsKLSAgICBGVF9VTG9uZyAgICAgICAgdGFibGVfcG9zLCB0YWJsZV9zaXplLCB0YWJsZV9lbmQ7Ci0gICAgRlRfVVNob3J0ICAgICAgIGs7Ci0KLQotICAgIGlmICggdmVydGljYWwgKQotICAgIHsKLSAgICAgIHZvaWQqICB2ID0gJmZhY2UtPnZlcnRpY2FsOwotCi0KLSAgICAgIGhlYWRlciAgICAgPSAoVFRfSG9yaUhlYWRlciopdjsKLSAgICAgIHRhYmxlX3BvcyAgPSBmYWNlLT52ZXJ0X21ldHJpY3Nfb2Zmc2V0OwotICAgICAgdGFibGVfc2l6ZSA9IGZhY2UtPnZlcnRfbWV0cmljc19zaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaGVhZGVyICAgICA9ICZmYWNlLT5ob3Jpem9udGFsOwotICAgICAgdGFibGVfcG9zICA9IGZhY2UtPmhvcnpfbWV0cmljc19vZmZzZXQ7Ci0gICAgICB0YWJsZV9zaXplID0gZmFjZS0+aG9yel9tZXRyaWNzX3NpemU7Ci0gICAgfQotCi0gICAgdGFibGVfZW5kID0gdGFibGVfcG9zICsgdGFibGVfc2l6ZTsKLQotICAgIGsgPSBoZWFkZXItPm51bWJlcl9PZl9ITWV0cmljczsKLQotICAgIGlmICggayA+IDAgKQotICAgIHsKLSAgICAgIGlmICggZ2luZGV4IDwgKEZUX1VJbnQpayApCi0gICAgICB7Ci0gICAgICAgIHRhYmxlX3BvcyArPSA0ICogZ2luZGV4OwotICAgICAgICBpZiAoIHRhYmxlX3BvcyArIDQgPiB0YWJsZV9lbmQgKQotICAgICAgICAgIGdvdG8gTm9EYXRhOwotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHRhYmxlX3BvcyApIHx8Ci0gICAgICAgICAgICAgRlRfUkVBRF9VU0hPUlQoICphYWR2YW5jZSApIHx8Ci0gICAgICAgICAgICAgRlRfUkVBRF9TSE9SVCggKmFiZWFyaW5nICkgICkKLSAgICAgICAgICBnb3RvIE5vRGF0YTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGFibGVfcG9zICs9IDQgKiAoIGsgLSAxICk7Ci0gICAgICAgIGlmICggdGFibGVfcG9zICsgNCA+IHRhYmxlX2VuZCApCi0gICAgICAgICAgZ290byBOb0RhdGE7Ci0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggdGFibGVfcG9zICkgfHwKLSAgICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggKmFhZHZhbmNlICkgKQotICAgICAgICAgIGdvdG8gTm9EYXRhOwotCi0gICAgICAgIHRhYmxlX3BvcyArPSA0ICsgMiAqICggZ2luZGV4IC0gayApOwotICAgICAgICBpZiAoIHRhYmxlX3BvcyArIDIgPiB0YWJsZV9lbmQgKQotICAgICAgICAgICphYmVhcmluZyA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggIUZUX1NUUkVBTV9TRUVLKCB0YWJsZV9wb3MgKSApCi0gICAgICAgICAgICAodm9pZClGVF9SRUFEX1NIT1JUKCAqYWJlYXJpbmcgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIE5vRGF0YToKLSAgICAgICphYmVhcmluZyA9IDA7Ci0gICAgICAqYWFkdmFuY2UgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0jZWxzZSAvKiBPTERfSU5URVJOQUxTICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZ2V0X21ldHJpY3MoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIHZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgIGFiZWFyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhYWR2YW5jZSApCi0gIHsKLSAgICB2b2lkKiAgICAgICAgICAgdiA9ICZmYWNlLT52ZXJ0aWNhbDsKLSAgICB2b2lkKiAgICAgICAgICAgaCA9ICZmYWNlLT5ob3Jpem9udGFsOwotICAgIFRUX0hvcmlIZWFkZXIqICBoZWFkZXIgPSB2ZXJ0aWNhbCA/IChUVF9Ib3JpSGVhZGVyKil2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKFRUX0hvcmlIZWFkZXIqKWg7Ci0gICAgVFRfTG9uZ01ldHJpY3MgIGxvbmdzX207Ci0gICAgRlRfVVNob3J0ICAgICAgIGsgPSBoZWFkZXItPm51bWJlcl9PZl9ITWV0cmljczsKLQotCi0gICAgaWYgKCBrID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAhaGVhZGVyLT5sb25nX21ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBnaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzICkKLSAgICB7Ci0gICAgICAqYWJlYXJpbmcgPSAqYWFkdmFuY2UgPSAwOwotICAgICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICAgIH0KLQotICAgIGlmICggZ2luZGV4IDwgKEZUX1VJbnQpayApCi0gICAgewotICAgICAgbG9uZ3NfbSAgID0gKFRUX0xvbmdNZXRyaWNzKWhlYWRlci0+bG9uZ19tZXRyaWNzICsgZ2luZGV4OwotICAgICAgKmFiZWFyaW5nID0gbG9uZ3NfbS0+YmVhcmluZzsKLSAgICAgICphYWR2YW5jZSA9IGxvbmdzX20tPmFkdmFuY2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAqYWJlYXJpbmcgPSAoKFRUX1Nob3J0TWV0cmljcyopaGVhZGVyLT5zaG9ydF9tZXRyaWNzKVtnaW5kZXggLSBrXTsKLSAgICAgICphYWR2YW5jZSA9ICgoVFRfTG9uZ01ldHJpY3MpaGVhZGVyLT5sb25nX21ldHJpY3MpW2sgLSAxXS5hZHZhbmNlOwotICAgIH0KLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0jZW5kaWYgLyogIU9QVElNSVpFX01FTU9SWSB8fCBPTERfSU5URVJOQUxTICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dG10eC5oIGIvc3JjL3NmbnQvdHRtdHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5MWExMS4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dG10eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRtdHguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIG1ldHJpY3MgdGFibGVzIGNvbW1vbiB0byBUVEYgYW5kIE9URiBmb250cyAoc3BlY2lmaWNhdGlvbikuICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRNVFhfSF9fCi0jZGVmaW5lIF9fVFRNVFhfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hoZWEoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICB2ZXJ0aWNhbCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2htdHgoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICB2ZXJ0aWNhbCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9nZXRfbWV0cmljcyggVFRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgdmVydGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICAgYWJlYXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIGFhZHZhbmNlICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRNVFhfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dHBvc3QuYyBiL3NyYy9zZm50L3R0cG9zdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTYxNjM2Li4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3R0cG9zdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0cG9zdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0Y3JpcHQgbmFtZSB0YWJsZSBwcm9jZXNzaW5nIGZvciBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZm9udHMgICAgICAqLwotLyogICAgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHBvc3QgdGFibGUgaXMgbm90IGNvbXBsZXRlbHkgbG9hZGVkIGJ5IHRoZSBjb3JlIGVuZ2luZS4gIFRoaXMgICAgICovCi0gIC8qIGZpbGUgbG9hZHMgdGhlIG1pc3NpbmcgUFMgZ2x5cGggbmFtZXMgYW5kIGltcGxlbWVudHMgYW4gQVBJIHRvIGFjY2VzcyAqLwotICAvKiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgInR0cG9zdC5oIgotI2luY2x1ZGUgInR0bG9hZC5oIgotCi0jaW5jbHVkZSAic2ZlcnJvcnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0cG9zdAotCi0KLSAgLyogSWYgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlzIGRlZmluZWQsIHdlIHJlbHkgb24gdGhlIGBQU05hbWVzJyAqLwotICAvKiBtb2R1bGUgdG8gZ3JhYiB0aGUgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLQotCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotCi0jZGVmaW5lIE1BQ19OQU1FKCB4ICkgICggKEZUX1N0cmluZyopcHNuYW1lcy0+bWFjaW50b3NoX25hbWUoIHggKSApCi0KLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTICovCi0KLQotICAgLyogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgdGhlIGBQU05hbWVzJyBtb2R1bGUsIGFuZCBwcm92aWRlIG91ciBvd24gICovCi0gICAvKiB0YWJsZSBvZiBNYWMgbmFtZXMuICBUaHVzLCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCBhIHZlcnNpb24gb2YgKi8KLSAgIC8qIEZyZWVUeXBlIHdpdGhvdXQgdGhlIFR5cGUgMSBkcml2ZXIgJiBQU05hbWVzIG1vZHVsZS4gICAgICAgICAgICAqLwotCi0jZGVmaW5lIE1BQ19OQU1FKCB4ICkgIHR0X3Bvc3RfZGVmYXVsdF9uYW1lc1t4XQotCi0gIC8qIHRoZSAyNTggZGVmYXVsdCBNYWMgUFMgZ2x5cGggbmFtZXMgKi8KLQotICBzdGF0aWMgY29uc3QgRlRfU3RyaW5nKiAgdHRfcG9zdF9kZWZhdWx0X25hbWVzWzI1OF0gPQotICB7Ci0gICAgLyogICAwICovCi0gICAgIi5ub3RkZWYiLCAiLm51bGwiLCAiQ1IiLCAic3BhY2UiLCAiZXhjbGFtIiwKLSAgICAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLAotICAgIC8qICAxMCAqLwotICAgICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwKLSAgICAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwKLSAgICAvKiAgMjAgKi8KLSAgICAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLAotICAgICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsCi0gICAgLyogIDMwICovCi0gICAgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLAotICAgICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwKLSAgICAvKiAgNDAgKi8KLSAgICAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwKLSAgICAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwKLSAgICAvKiAgNTAgKi8KLSAgICAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwKLSAgICAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwKLSAgICAvKiAgNjAgKi8KLSAgICAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLAotICAgICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsCi0gICAgLyogIDcwICovCi0gICAgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsCi0gICAgImgiLCAiaSIsICJqIiwgImsiLCAibCIsCi0gICAgLyogIDgwICovCi0gICAgIm0iLCAibiIsICJvIiwgInAiLCAicSIsCi0gICAgInIiLCAicyIsICJ0IiwgInUiLCAidiIsCi0gICAgLyogIDkwICovCi0gICAgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwKLSAgICAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLAotICAgIC8qIDEwMCAqLwotICAgICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLAotICAgICJhYWN1dGUiLCAiYWdyYXZlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhdGlsZGUiLAotICAgIC8qIDExMCAqLwotICAgICJhcmluZyIsICJjY2VkaWxsYSIsICJlYWN1dGUiLCAiZWdyYXZlIiwgImVjaXJjdW1mbGV4IiwKLSAgICAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwKLSAgICAvKiAxMjAgKi8KLSAgICAibnRpbGRlIiwgIm9hY3V0ZSIsICJvZ3JhdmUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwKLSAgICAib3RpbGRlIiwgInVhY3V0ZSIsICJ1Z3JhdmUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwKLSAgICAvKiAxMzAgKi8KLSAgICAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLAotICAgICJidWxsZXQiLCAicGFyYWdyYXBoIiwgImdlcm1hbmRibHMiLCAicmVnaXN0ZXJlZCIsICJjb3B5cmlnaHQiLAotICAgIC8qIDE0MCAqLwotICAgICJ0cmFkZW1hcmsiLCAiYWN1dGUiLCAiZGllcmVzaXMiLCAibm90ZXF1YWwiLCAiQUUiLAotICAgICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLAotICAgIC8qIDE1MCAqLwotICAgICJ5ZW4iLCAibXUiLCAicGFydGlhbGRpZmYiLCAic3VtbWF0aW9uIiwgInByb2R1Y3QiLAotICAgICJwaSIsICJpbnRlZ3JhbCIsICJvcmRmZW1pbmluZSIsICJvcmRtYXNjdWxpbmUiLCAiT21lZ2EiLAotICAgIC8qIDE2MCAqLwotICAgICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsCi0gICAgInJhZGljYWwiLCAiZmxvcmluIiwgImFwcHJveGVxdWFsIiwgIkRlbHRhIiwgImd1aWxsZW1vdGxlZnQiLAotICAgIC8qIDE3MCAqLwotICAgICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJuYnNwYWNlIiwgIkFncmF2ZSIsICJBdGlsZGUiLAotICAgICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsCi0gICAgLyogMTgwICovCi0gICAgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgImRpdmlkZSIsCi0gICAgImxvemVuZ2UiLCAieWRpZXJlc2lzIiwgIllkaWVyZXNpcyIsICJmcmFjdGlvbiIsICJjdXJyZW5jeSIsCi0gICAgLyogMTkwICovCi0gICAgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwKLSAgICAicGVyaW9kY2VudGVyZWQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInBlcnRob3VzYW5kIiwgIkFjaXJjdW1mbGV4IiwKLSAgICAvKiAyMDAgKi8KLSAgICAiRWNpcmN1bWZsZXgiLCAiQWFjdXRlIiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwKLSAgICAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLAotICAgIC8qIDIxMCAqLwotICAgICJhcHBsZSIsICJPZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVncmF2ZSIsCi0gICAgImRvdGxlc3NpIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwKLSAgICAvKiAyMjAgKi8KLSAgICAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwKLSAgICAiY2Fyb24iLCAiTHNsYXNoIiwgImxzbGFzaCIsICJTY2Fyb24iLCAic2Nhcm9uIiwKLSAgICAvKiAyMzAgKi8KLSAgICAiWmNhcm9uIiwgInpjYXJvbiIsICJicm9rZW5iYXIiLCAiRXRoIiwgImV0aCIsCi0gICAgIllhY3V0ZSIsICJ5YWN1dGUiLCAiVGhvcm4iLCAidGhvcm4iLCAibWludXMiLAotICAgIC8qIDI0MCAqLwotICAgICJtdWx0aXBseSIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgIm9uZWhhbGYiLAotICAgICJvbmVxdWFydGVyIiwgInRocmVlcXVhcnRlcnMiLCAiZnJhbmMiLCAiR2JyZXZlIiwgImdicmV2ZSIsCi0gICAgLyogMjUwICovCi0gICAgIklkb3QiLCAiU2NlZGlsbGEiLCAic2NlZGlsbGEiLCAiQ2FjdXRlIiwgImNhY3V0ZSIsCi0gICAgIkNjYXJvbiIsICJjY2Fyb24iLCAiZG1hY3JvbiIsCi0gIH07Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyAqLwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGxvYWRfZm9ybWF0XzIwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotICAgIEZUX0ludCAgICAgIG51bV9nbHlwaHM7Ci0gICAgRlRfVVNob3J0ICAgbnVtX25hbWVzOwotCi0gICAgRlRfVVNob3J0KiAgZ2x5cGhfaW5kaWNlcyA9IDA7Ci0gICAgRlRfQ2hhcioqICAgbmFtZV9zdHJpbmdzICA9IDA7Ci0KLQotICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG51bV9nbHlwaHMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGlzIHRhYmxlIGNhbiBiZSBzbWFsbGVyICovCi0gICAgLyogdGhhbiB0aGUgdmFsdWUgaW4gdGhlIG1heHAgdGFibGUgKGNmLiBjeWJlcmJpdC50dGYpLiAgICAgICAgICAgICAqLwotCi0gICAgLyogVGhlcmUgYWxyZWFkeSBleGlzdCBmb250cyB3aGljaCBoYXZlIG1vcmUgdGhhbiAzMjc2OCBnbHlwaCBuYW1lcyAqLwotICAgIC8qIGluIHRoaXMgdGFibGUsIHNvIHRoZSB0ZXN0IGZvciB0aGlzIHRocmVzaG9sZCBoYXMgYmVlbiBkcm9wcGVkLiAgKi8KLQotICAgIGlmICggbnVtX2dseXBocyA+IGZhY2UtPm1heF9wcm9maWxlLm51bUdseXBocyApCi0gICAgewotICAgICAgZXJyb3IgPSBTRk5UX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGxvYWQgdGhlIGluZGljZXMgKi8KLSAgICB7Ci0gICAgICBGVF9JbnQgIG47Ci0KLQotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkgKCBnbHlwaF9pbmRpY2VzLCBudW1fZ2x5cGhzICkgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIG51bV9nbHlwaHMgKiAyTCApICAgICAgICAgICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCi0gICAgICAgIGdseXBoX2luZGljZXNbbl0gPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlIG51bWJlciBvZiBuYW1lcyBzdG9yZWQgaW4gdGFibGUgKi8KLSAgICB7Ci0gICAgICBGVF9JbnQgIG47Ci0KLQotICAgICAgbnVtX25hbWVzID0gMDsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ2x5cGhzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIGlkeDsKLQotCi0gICAgICAgIGlkeCA9IGdseXBoX2luZGljZXNbbl07Ci0gICAgICAgIGlmICggaWR4ID49IDI1OCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZHggLT0gMjU3OwotICAgICAgICAgIGlmICggaWR4ID4gbnVtX25hbWVzICkKLSAgICAgICAgICAgIG51bV9uYW1lcyA9IChGVF9VU2hvcnQpaWR4OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogbm93IGxvYWQgdGhlIG5hbWUgc3RyaW5ncyAqLwotICAgIHsKLSAgICAgIEZUX1VTaG9ydCAgbjsKLQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggbmFtZV9zdHJpbmdzLCBudW1fbmFtZXMgKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fbmFtZXM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGxlbjsKLQotCi0gICAgICAgIGlmICggRlRfUkVBRF9CWVRFICAoIGxlbiApICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIEZUX05FV19BUlJBWSggbmFtZV9zdHJpbmdzW25dLCBsZW4gKyAxICkgfHwKLSAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRCAgKCBuYW1lX3N0cmluZ3Nbbl0sIGxlbiApICkKLSAgICAgICAgICBnb3RvIEZhaWwxOwotCi0gICAgICAgIG5hbWVfc3RyaW5nc1tuXVtsZW5dID0gJ1wwJzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhbGwgcmlnaHQsIHNldCB0YWJsZSBmaWVsZHMgYW5kIGV4aXQgc3VjY2Vzc2Z1bGx5ICovCi0gICAgewotICAgICAgVFRfUG9zdF8yMCAgdGFibGUgPSAmZmFjZS0+cG9zdHNjcmlwdF9uYW1lcy5uYW1lcy5mb3JtYXRfMjA7Ci0KLQotICAgICAgdGFibGUtPm51bV9nbHlwaHMgICAgPSAoRlRfVVNob3J0KW51bV9nbHlwaHM7Ci0gICAgICB0YWJsZS0+bnVtX25hbWVzICAgICA9IChGVF9VU2hvcnQpbnVtX25hbWVzOwotICAgICAgdGFibGUtPmdseXBoX2luZGljZXMgPSBnbHlwaF9pbmRpY2VzOwotICAgICAgdGFibGUtPmdseXBoX25hbWVzICAgPSBuYW1lX3N0cmluZ3M7Ci0gICAgfQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLQotICBGYWlsMToKLSAgICB7Ci0gICAgICBGVF9VU2hvcnQgIG47Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fbmFtZXM7IG4rKyApCi0gICAgICAgIEZUX0ZSRUUoIG5hbWVfc3RyaW5nc1tuXSApOwotICAgIH0KLQotICBGYWlsOgotICAgIEZUX0ZSRUUoIG5hbWVfc3RyaW5ncyApOwotICAgIEZUX0ZSRUUoIGdseXBoX2luZGljZXMgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGxvYWRfZm9ybWF0XzI1KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0KLSAgICBGVF9JbnQgICAgIG51bV9nbHlwaHM7Ci0gICAgRlRfQ2hhciogICBvZmZzZXRfdGFibGUgPSAwOwotCi0KLSAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGlzIHZhbHVlIGFwcGVhcnMgb25seSBpbiB0aGUgQXBwbGUgVFQgc3BlY3MuICovCi0gICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbnVtX2dseXBocyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNoZWNrIHRoZSBudW1iZXIgb2YgZ2x5cGhzICovCi0gICAgaWYgKCBudW1fZ2x5cGhzID4gZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzIHx8IG51bV9nbHlwaHMgPiAyNTggKQotICAgIHsKLSAgICAgIGVycm9yID0gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggb2Zmc2V0X3RhYmxlLCBudW1fZ2x5cGhzICkgICB8fAotICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIG9mZnNldF90YWJsZSwgbnVtX2dseXBocyApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIG5vdyBjaGVjayB0aGUgb2Zmc2V0IHRhYmxlICovCi0gICAgewotICAgICAgRlRfSW50ICBuOwotCi0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2dseXBoczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfTG9uZyAgaWR4ID0gKEZUX0xvbmcpbiArIG9mZnNldF90YWJsZVtuXTsKLQotCi0gICAgICAgIGlmICggaWR4IDwgMCB8fCBpZHggPiBudW1fZ2x5cGhzICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBPSywgc2V0IHRhYmxlIGZpZWxkcyBhbmQgZXhpdCBzdWNjZXNzZnVsbHkgKi8KLSAgICB7Ci0gICAgICBUVF9Qb3N0XzI1ICB0YWJsZSA9ICZmYWNlLT5wb3N0c2NyaXB0X25hbWVzLm5hbWVzLmZvcm1hdF8yNTsKLQotCi0gICAgICB0YWJsZS0+bnVtX2dseXBocyA9IChGVF9VU2hvcnQpbnVtX2dseXBoczsKLSAgICAgIHRhYmxlLT5vZmZzZXRzICAgID0gb2Zmc2V0X3RhYmxlOwotICAgIH0KLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLQotICBGYWlsOgotICAgIEZUX0ZSRUUoIG9mZnNldF90YWJsZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF9wb3N0X25hbWVzKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfRml4ZWQgICBmb3JtYXQ7Ci0KLQotICAgIC8qIGdldCBhIHN0cmVhbSBmb3IgdGhlIGZhY2UncyByZXNvdXJjZSAqLwotICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0gICAgLyogc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBQUyBuYW1lcyB0YWJsZSAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19wb3N0LCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZvcm1hdCA9IGZhY2UtPnBvc3RzY3JpcHQuRm9ybWF0VHlwZTsKLQotICAgIC8qIGdvIHRvIGJlZ2lubmluZyBvZiBzdWJ0YWJsZSAqLwotICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIDMyICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbm93IHJlYWQgcG9zdHNjcmlwdCB0YWJsZSAqLwotICAgIGlmICggZm9ybWF0ID09IDB4MDAwMjAwMDBMICkKLSAgICAgIGVycm9yID0gbG9hZF9mb3JtYXRfMjAoIGZhY2UsIHN0cmVhbSApOwotICAgIGVsc2UgaWYgKCBmb3JtYXQgPT0gMHgwMDAyODAwMEwgKQotICAgICAgZXJyb3IgPSBsb2FkX2Zvcm1hdF8yNSggZmFjZSwgc3RyZWFtICk7Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBTRk5UX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotCi0gICAgZmFjZS0+cG9zdHNjcmlwdF9uYW1lcy5sb2FkZWQgPSAxOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfcHNfbmFtZXMoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgVFRfUG9zdF9OYW1lcyAgbmFtZXMgID0gJmZhY2UtPnBvc3RzY3JpcHRfbmFtZXM7Ci0gICAgRlRfRml4ZWQgICAgICAgZm9ybWF0OwotCi0KLSAgICBpZiAoIG5hbWVzLT5sb2FkZWQgKQotICAgIHsKLSAgICAgIGZvcm1hdCA9IGZhY2UtPnBvc3RzY3JpcHQuRm9ybWF0VHlwZTsKLQotICAgICAgaWYgKCBmb3JtYXQgPT0gMHgwMDAyMDAwMEwgKQotICAgICAgewotICAgICAgICBUVF9Qb3N0XzIwICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzIwOwotICAgICAgICBGVF9VU2hvcnQgICBuOwotCi0KLSAgICAgICAgRlRfRlJFRSggdGFibGUtPmdseXBoX2luZGljZXMgKTsKLSAgICAgICAgdGFibGUtPm51bV9nbHlwaHMgPSAwOwotCi0gICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdGFibGUtPm51bV9uYW1lczsgbisrICkKLSAgICAgICAgICBGVF9GUkVFKCB0YWJsZS0+Z2x5cGhfbmFtZXNbbl0gKTsKLQotICAgICAgICBGVF9GUkVFKCB0YWJsZS0+Z2x5cGhfbmFtZXMgKTsKLSAgICAgICAgdGFibGUtPm51bV9uYW1lcyA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggZm9ybWF0ID09IDB4MDAwMjgwMDBMICkKLSAgICAgIHsKLSAgICAgICAgVFRfUG9zdF8yNSAgdGFibGUgPSAmbmFtZXMtPm5hbWVzLmZvcm1hdF8yNTsKLQotCi0gICAgICAgIEZUX0ZSRUUoIHRhYmxlLT5vZmZzZXRzICk7Ci0gICAgICAgIHRhYmxlLT5udW1fZ2x5cGhzID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgbmFtZXMtPmxvYWRlZCA9IDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZ2V0X3BzX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldHMgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaWR4ICAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU25hbWUgOjogVGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcgcG9pbnRlci4gIFdpbGwgYmUgTlVMTCBpbiBjYXNlICAgKi8KLSAgLyogICAgICAgICAgICAgIG9mIGVycm9yLCBvdGhlcndpc2UgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBnbHlwaCBuYW1lLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgWW91IG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nISAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2dldF9wc19uYW1lKCBUVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiogIFBTbmFtZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIFRUX1Bvc3RfTmFtZXMgICAgbmFtZXM7Ci0gICAgRlRfRml4ZWQgICAgICAgICBmb3JtYXQ7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0jZW5kaWYKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gU0ZOVF9FcnJfSW52YWxpZF9GYWNlX0hhbmRsZTsKLQotICAgIGlmICggaWR4ID49IChGVF9VSW50KWZhY2UtPm1heF9wcm9maWxlLm51bUdseXBocyApCi0gICAgICByZXR1cm4gU0ZOVF9FcnJfSW52YWxpZF9HbHlwaF9JbmRleDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICAgIHBzbmFtZXMgPSAoRlRfU2VydmljZV9Qc0NNYXBzKWZhY2UtPnBzbmFtZXM7Ci0gICAgaWYgKCAhcHNuYW1lcyApCi0gICAgICByZXR1cm4gU0ZOVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlOwotI2VuZGlmCi0KLSAgICBuYW1lcyA9ICZmYWNlLT5wb3N0c2NyaXB0X25hbWVzOwotCi0gICAgLyogYC5ub3RkZWYnIGJ5IGRlZmF1bHQgKi8KLSAgICAqUFNuYW1lID0gTUFDX05BTUUoIDAgKTsKLQotICAgIGZvcm1hdCA9IGZhY2UtPnBvc3RzY3JpcHQuRm9ybWF0VHlwZTsKLQotICAgIGlmICggZm9ybWF0ID09IDB4MDAwMTAwMDBMICkKLSAgICB7Ci0gICAgICBpZiAoIGlkeCA8IDI1OCApICAgICAgICAgICAgICAgICAgICAvKiBwYXJhbm9pZCBjaGVja2luZyAqLwotICAgICAgICAqUFNuYW1lID0gTUFDX05BTUUoIGlkeCApOwotICAgIH0KLSAgICBlbHNlIGlmICggZm9ybWF0ID09IDB4MDAwMjAwMDBMICkKLSAgICB7Ci0gICAgICBUVF9Qb3N0XzIwICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzIwOwotCi0KLSAgICAgIGlmICggIW5hbWVzLT5sb2FkZWQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGxvYWRfcG9zdF9uYW1lcyggZmFjZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEVuZDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBpZHggPCAoRlRfVUludCl0YWJsZS0+bnVtX2dseXBocyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VTaG9ydCAgbmFtZV9pbmRleCA9IHRhYmxlLT5nbHlwaF9pbmRpY2VzW2lkeF07Ci0KLQotICAgICAgICBpZiAoIG5hbWVfaW5kZXggPCAyNTggKQotICAgICAgICAgICpQU25hbWUgPSBNQUNfTkFNRSggbmFtZV9pbmRleCApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgKlBTbmFtZSA9IChGVF9TdHJpbmcqKXRhYmxlLT5nbHlwaF9uYW1lc1tuYW1lX2luZGV4IC0gMjU4XTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIGZvcm1hdCA9PSAweDAwMDI4MDAwTCApCi0gICAgewotICAgICAgVFRfUG9zdF8yNSAgdGFibGUgPSAmbmFtZXMtPm5hbWVzLmZvcm1hdF8yNTsKLQotCi0gICAgICBpZiAoICFuYW1lcy0+bG9hZGVkICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBsb2FkX3Bvc3RfbmFtZXMoIGZhY2UgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggaWR4IDwgKEZUX1VJbnQpdGFibGUtPm51bV9nbHlwaHMgKSAgICAvKiBwYXJhbm9pZCBjaGVja2luZyAqLwotICAgICAgewotICAgICAgICBpZHggICAgKz0gdGFibGUtPm9mZnNldHNbaWR4XTsKLSAgICAgICAgKlBTbmFtZSA9IE1BQ19OQU1FKCBpZHggKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBub3RoaW5nIHRvIGRvIGZvciBmb3JtYXQgPT0gMHgwMDAzMDAwMEwgKi8KLQotICBFbmQ6Ci0gICAgcmV0dXJuIFNGTlRfRXJyX09rOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dHBvc3QuaCBiL3NyYy9zZm50L3R0cG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA2ZDc1Li4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3R0cG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRwb3N0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RjcmlwdCBuYW1lIHRhYmxlIHByb2Nlc3NpbmcgZm9yIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmb250cyAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUUE9TVF9IX18KLSNkZWZpbmUgX19UVFBPU1RfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZ2V0X3BzX25hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgUFNuYW1lICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2ZyZWVfcHNfbmFtZXMoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUUE9TVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0c2JpdC5jIGIvc3JjL3NmbnQvdHRzYml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjFiYTUuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvdHRzYml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0c2JpdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotCi0gIC8qCi0gICAqICBBbGFzLCB0aGUgbWVtb3J5LW9wdGltaXplZCBzYml0IGxvYWRlciBjYW4ndCBiZSB1c2VkIHdoZW4gaW1wbGVtZW50aW5nCi0gICAqICB0aGUgYG9sZCBpbnRlcm5hbHMnIGhhY2sKLSAgICovCi0jaWYgIWRlZmluZWQgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0KLSNpbmNsdWRlICJ0dHNiaXQwLmMiCi0KLSNlbHNlIC8qICFGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSAidHRzYml0LmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRzYml0Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibGl0X3NiaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCbGl0cyBhIGJpdG1hcCBmcm9tIGFuIGlucHV0IHN0cmVhbSBpbnRvIGEgZ2l2ZW4gdGFyZ2V0LiAgU3VwcG9ydHMgKi8KLSAgLyogICAgeCBhbmQgeSBvZmZzZXRzIGFzIHdlbGwgYXMgYnl0ZSBwYWRkZWQgbGluZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0ICAgICAgOjogVGhlIHRhcmdldCBiaXRtYXAvcGl4bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3VyY2UgICAgICA6OiBUaGUgaW5wdXQgcGFja2VkIGJpdG1hcCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpbmVfYml0cyAgIDo6IFRoZSBudW1iZXIgb2YgYml0cyBwZXIgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnl0ZV9wYWRkZWQgOjogQSBmbGFnIHdoaWNoIGlzIHRydWUgaWYgbGluZXMgYXJlIGJ5dGUtcGFkZGVkLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X29mZnNldCAgICA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfb2Zmc2V0ICAgIDo6IFRoZSB2ZXJ0aWNhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElNUE9SVEFOVDogVGhlIHggYW5kIHkgb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHRvcCBjb3JuZXIgb2YgICAqLwotICAvKiAgICAgICAgICAgICAgIHRoZSB0YXJnZXQgYml0bWFwICh1bmxpa2UgdGhlIG5vcm1hbCBUcnVlVHlwZSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBjb252ZW50aW9uKS4gIEEgcG9zaXRpdmUgeSBvZmZzZXQgaW5kaWNhdGVzIGEgZG93bndhcmRzICovCi0gIC8qICAgICAgICAgICAgICAgZGlyZWN0aW9uISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgYmxpdF9zYml0KCBGVF9CaXRtYXAqICB0YXJnZXQsCi0gICAgICAgICAgICAgRlRfQnl0ZSogICAgc291cmNlLAotICAgICAgICAgICAgIEZUX0ludCAgICAgIGxpbmVfYml0cywKLSAgICAgICAgICAgICBGVF9Cb29sICAgICBieXRlX3BhZGRlZCwKLSAgICAgICAgICAgICBGVF9JbnQgICAgICB4X29mZnNldCwKLSAgICAgICAgICAgICBGVF9JbnQgICAgICB5X29mZnNldCApCi0gIHsKLSAgICBGVF9CeXRlKiAgIGxpbmVfYnVmZjsKLSAgICBGVF9JbnQgICAgIGxpbmVfaW5jcjsKLSAgICBGVF9JbnQgICAgIGhlaWdodDsKLQotICAgIEZUX1VTaG9ydCAgYWNjOwotICAgIEZUX1VJbnQgICAgbG9hZGVkOwotCi0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIGNvbXB1dGUgc3RhcnRpbmcgd3JpdGUgcG9zaXRpb24gKi8KLSAgICBsaW5lX2luY3IgPSB0YXJnZXQtPnBpdGNoOwotICAgIGxpbmVfYnVmZiA9IHRhcmdldC0+YnVmZmVyOwotCi0gICAgaWYgKCBsaW5lX2luY3IgPCAwICkKLSAgICAgIGxpbmVfYnVmZiAtPSBsaW5lX2luY3IgKiAoIHRhcmdldC0+cm93cyAtIDEgKTsKLQotICAgIGxpbmVfYnVmZiArPSAoIHhfb2Zmc2V0ID4+IDMgKSArIHlfb2Zmc2V0ICogbGluZV9pbmNyOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBXZSB1c2UgdGhlIGV4dHJhLWNsYXNzaWMgYGFjY3VtdWxhdG9yJyB0cmljayB0byBleHRyYWN0IHRoZSBiaXRzICAgICovCi0gICAgLyogZnJvbSB0aGUgc291cmNlIGJ5dGUgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBOYW1lbHksIHRoZSB2YXJpYWJsZSBgYWNjJyBpcyBhIDE2LWJpdCBhY2N1bXVsYXRvciBjb250YWluaW5nIHRoZSAgICovCi0gICAgLyogbGFzdCBgbG9hZGVkJyBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIFRoZSBiaXRzIGFyZSBzaGlmdGVkIHRvICAqLwotICAgIC8qIHRoZSB1cG1vc3QgcG9zaXRpb24gaW4gYGFjYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgYWNjICAgID0gMDsgIC8qIGNsZWFyIGFjY3VtdWxhdG9yICAgKi8KLSAgICBsb2FkZWQgPSAwOyAgLyogbm8gYml0cyB3ZXJlIGxvYWRlZCAqLwotCi0gICAgZm9yICggaGVpZ2h0ID0gdGFyZ2V0LT5yb3dzOyBoZWlnaHQgPiAwOyBoZWlnaHQtLSApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGN1ciAgID0gbGluZV9idWZmOyAgICAgICAgLyogY3VycmVudCB3cml0ZSBjdXJzb3IgICAgICAgICAgKi8KLSAgICAgIEZUX0ludCAgICBjb3VudCA9IGxpbmVfYml0czsgICAgICAgIC8qICMgb2YgYml0cyB0byBleHRyYWN0IHBlciBsaW5lICovCi0gICAgICBGVF9CeXRlICAgc2hpZnQgPSAoRlRfQnl0ZSkoIHhfb2Zmc2V0ICYgNyApOyAvKiBjdXJyZW50IHdyaXRlIHNoaWZ0ICAqLwotICAgICAgRlRfQnl0ZSAgIHNwYWNlID0gKEZUX0J5dGUpKCA4IC0gc2hpZnQgKTsKLQotCi0gICAgICAvKiBmaXJzdCBvZiBhbGwsIHJlYWQgaW5kaXZpZHVhbCBzb3VyY2UgYnl0ZXMgKi8KLSAgICAgIGlmICggY291bnQgPj0gOCApCi0gICAgICB7Ci0gICAgICAgIGNvdW50IC09IDg7Ci0gICAgICAgIHsKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0J5dGUgIHZhbDsKLQotCi0gICAgICAgICAgICAvKiBlbnN1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgOCBiaXRzIGluIHRoZSBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgaWYgKCBsb2FkZWQgPCA4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYWNjICAgIHw9IChGVF9VU2hvcnQpKChGVF9VU2hvcnQpKnNvdXJjZSsrIDw8ICggOCAtIGxvYWRlZCApKTsKLSAgICAgICAgICAgICAgbG9hZGVkICs9IDg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIG5vdyB3cml0ZSBvbmUgYnl0ZSAqLwotICAgICAgICAgICAgdmFsID0gKEZUX0J5dGUpKCBhY2MgPj4gOCApOwotICAgICAgICAgICAgaWYgKCBzaGlmdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGN1clswXSB8PSAoRlRfQnl0ZSkoIHZhbCA+PiBzaGlmdCApOwotICAgICAgICAgICAgICBjdXJbMV0gfD0gKEZUX0J5dGUpKCB2YWwgPDwgc3BhY2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgY3VyWzBdIHw9IHZhbDsKLQotICAgICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgICBhY2MgICA8PD0gODsgIC8qIHJlbW92ZSBiaXRzIGZyb20gYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIGxvYWRlZCAtPSA4OwotICAgICAgICAgICAgY291bnQgIC09IDg7Ci0KLSAgICAgICAgICB9IHdoaWxlICggY291bnQgPj0gMCApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcmVzdG9yZSBgY291bnQnIHRvIGNvcnJlY3QgdmFsdWUgKi8KLSAgICAgICAgY291bnQgKz0gODsKLSAgICAgIH0KLQotICAgICAgLyogbm93IHdyaXRlIHJlbWFpbmluZyBiaXRzIChjb3VudCA8IDgpICovCi0gICAgICBpZiAoIGNvdW50ID4gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUgIHZhbDsKLQotCi0gICAgICAgIC8qIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBgY291bnQnIGJpdHMgaW4gdGhlIGFjY3VtdWxhdG9yICovCi0gICAgICAgIGlmICggKEZUX0ludClsb2FkZWQgPCBjb3VudCApCi0gICAgICAgIHsKLSAgICAgICAgICBhY2MgICAgfD0gKEZUX1VTaG9ydCkoKEZUX1VTaG9ydCkqc291cmNlKysgPDwgKCA4IC0gbG9hZGVkICkpOwotICAgICAgICAgIGxvYWRlZCArPSA4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm93IHdyaXRlIHJlbWFpbmluZyBiaXRzICovCi0gICAgICAgIHZhbCAgICAgPSAoRlRfQnl0ZSkoICggKEZUX0J5dGUpKCBhY2MgPj4gOCApICkgJiB+KCAweEZGID4+IGNvdW50ICkgKTsKLSAgICAgICAgY3VyWzBdIHw9IChGVF9CeXRlKSggdmFsID4+IHNoaWZ0ICk7Ci0KLSAgICAgICAgaWYgKCBjb3VudCA+IHNwYWNlICkKLSAgICAgICAgICBjdXJbMV0gfD0gKEZUX0J5dGUpKCB2YWwgPDwgc3BhY2UgKTsKLQotICAgICAgICBhY2MgICA8PD0gY291bnQ7Ci0gICAgICAgIGxvYWRlZCAtPSBjb3VudDsKLSAgICAgIH0KLQotICAgICAgLyogbm93LCBza2lwIHRvIG5leHQgbGluZSAqLwotICAgICAgaWYgKCBieXRlX3BhZGRlZCApCi0gICAgICB7Ci0gICAgICAgIGFjYyAgICA9IDA7Ci0gICAgICAgIGxvYWRlZCA9IDA7ICAgLyogY2xlYXIgYWNjdW11bGF0b3Igb24gYnl0ZS1wYWRkZWQgbGluZXMgKi8KLSAgICAgIH0KLQotICAgICAgbGluZV9idWZmICs9IGxpbmVfaW5jcjsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgc2JpdF9tZXRyaWNzX2ZpZWxkc1tdID0KLSAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9TQml0X01ldHJpY3NSZWMKLQotICAgIEZUX0ZSQU1FX1NUQVJUKCA4ICksCi0gICAgICBGVF9GUkFNRV9CWVRFKCBoZWlnaHQgKSwKLSAgICAgIEZUX0ZSQU1FX0JZVEUoIHdpZHRoICksCi0KLSAgICAgIEZUX0ZSQU1FX0NIQVIoIGhvcmlCZWFyaW5nWCApLAotICAgICAgRlRfRlJBTUVfQ0hBUiggaG9yaUJlYXJpbmdZICksCi0gICAgICBGVF9GUkFNRV9CWVRFKCBob3JpQWR2YW5jZSApLAotCi0gICAgICBGVF9GUkFNRV9DSEFSKCB2ZXJ0QmVhcmluZ1ggKSwKLSAgICAgIEZUX0ZSQU1FX0NIQVIoIHZlcnRCZWFyaW5nWSApLAotICAgICAgRlRfRlJBTUVfQllURSggdmVydEFkdmFuY2UgKSwKLSAgICBGVF9GUkFNRV9FTkQKLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRfU0JpdF9Db25zdF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBtZXRyaWNzIGZvciBgRUJMQycgaW5kZXggdGFibGVzIGZvcm1hdCAyIGFuZCA1LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlICA6OiBUaGUgdGFyZ2V0IHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgTG9hZF9TQml0X0NvbnN0X01ldHJpY3MoIFRUX1NCaXRfUmFuZ2UgIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HKCByYW5nZS0+aW1hZ2Vfc2l6ZSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHJldHVybiBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHNiaXRfbWV0cmljc19maWVsZHMsICZyYW5nZS0+bWV0cmljcyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkX1NCaXRfUmFuZ2VfQ29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgcmFuZ2UgY29kZXMgZm9yIGBFQkxDJyBpbmRleCB0YWJsZXMgZm9ybWF0IDQgYW5kIDUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYW5nZSAgICAgICAgOjogVGhlIHRhcmdldCByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9vZmZzZXRzIDo6IEEgZmxhZyB3aGV0aGVyIHRvIGxvYWQgdGhlIGdseXBoIG9mZnNldCB0YWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgTG9hZF9TQml0X1JhbmdlX0NvZGVzKCBUVF9TQml0X1JhbmdlICByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgbG9hZF9vZmZzZXRzICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfVUxvbmcgICBjb3VudCwgbiwgc2l6ZTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIEZUX1JFQURfVUxPTkcoIGNvdW50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcmFuZ2UtPm51bV9nbHlwaHMgPSBjb3VudDsKLQotICAgIC8qIEFsbG9jYXRlIGdseXBoIG9mZnNldHMgdGFibGUgaWYgbmVlZGVkICovCi0gICAgaWYgKCBsb2FkX29mZnNldHMgKQotICAgIHsKLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCByYW5nZS0+Z2x5cGhfb2Zmc2V0cywgY291bnQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgc2l6ZSA9IGNvdW50ICogNEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHNpemUgPSBjb3VudCAqIDJMOwotCi0gICAgLyogQWxsb2NhdGUgZ2x5cGggY29kZXMgdGFibGUgYW5kIGFjY2VzcyBmcmFtZSAqLwotICAgIGlmICggRlRfTkVXX0FSUkFZICggcmFuZ2UtPmdseXBoX2NvZGVzLCBjb3VudCApIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggc2l6ZSApICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICB7Ci0gICAgICByYW5nZS0+Z2x5cGhfY29kZXNbbl0gPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgIGlmICggbG9hZF9vZmZzZXRzICkKLSAgICAgICAgcmFuZ2UtPmdseXBoX29mZnNldHNbbl0gPSAoRlRfVUxvbmcpcmFuZ2UtPmltYWdlX29mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR0VUX1VTSE9SVCgpOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZF9TQml0X1JhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgYSBnaXZlbiBgRUJMQycgaW5kZXgvcmFuZ2UgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFuZ2UgIDo6IFRoZSB0YXJnZXQgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBMb2FkX1NCaXRfUmFuZ2UoIFRUX1NCaXRfUmFuZ2UgIHJhbmdlLAotICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgIHN3aXRjaCggcmFuZ2UtPmluZGV4X2Zvcm1hdCApCi0gICAgewotICAgIGNhc2UgMTogICAvKiB2YXJpYWJsZSBtZXRyaWNzIHdpdGggNC1ieXRlIG9mZnNldHMgKi8KLSAgICBjYXNlIDM6ICAgLyogdmFyaWFibGUgbWV0cmljcyB3aXRoIDItYnl0ZSBvZmZzZXRzICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBudW1fZ2x5cGhzLCBuOwotICAgICAgICBGVF9JbnQgICAgc2l6ZV9lbGVtOwotICAgICAgICBGVF9Cb29sICAgbGFyZ2UgPSBGVF9CT09MKCByYW5nZS0+aW5kZXhfZm9ybWF0ID09IDEgKTsKLQotCi0KLSAgICAgICAgaWYgKCByYW5nZS0+bGFzdF9nbHlwaCA8IHJhbmdlLT5maXJzdF9nbHlwaCApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IFNGTlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgbnVtX2dseXBocyAgICAgICAgPSByYW5nZS0+bGFzdF9nbHlwaCAtIHJhbmdlLT5maXJzdF9nbHlwaCArIDFMOwotICAgICAgICByYW5nZS0+bnVtX2dseXBocyA9IG51bV9nbHlwaHM7Ci0gICAgICAgIG51bV9nbHlwaHMrKzsgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWDogQkVXQVJFIC0gc2VlIHNwZWMgKi8KLQotICAgICAgICBzaXplX2VsZW0gPSBsYXJnZSA/IDQgOiAyOwotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCByYW5nZS0+Z2x5cGhfb2Zmc2V0cywgbnVtX2dseXBocyApIHx8Ci0gICAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIG51bV9nbHlwaHMgKiBzaXplX2VsZW0gKSAgICAgICAgICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ2x5cGhzOyBuKysgKQotICAgICAgICAgIHJhbmdlLT5nbHlwaF9vZmZzZXRzW25dID0gKEZUX1VMb25nKSggcmFuZ2UtPmltYWdlX29mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGxhcmdlID8gRlRfR0VUX1VMT05HKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9HRVRfVVNIT1JUKCkgKSApOwotICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjogICAvKiBhbGwgZ2x5cGhzIGhhdmUgaWRlbnRpY2FsIG1ldHJpY3MgKi8KLSAgICAgIGVycm9yID0gTG9hZF9TQml0X0NvbnN0X01ldHJpY3MoIHJhbmdlLCBzdHJlYW0gKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgZXJyb3IgPSBMb2FkX1NCaXRfUmFuZ2VfQ29kZXMoIHJhbmdlLCBzdHJlYW0sIDEgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA1OgotICAgICAgZXJyb3IgPSBMb2FkX1NCaXRfQ29uc3RfTWV0cmljcyggcmFuZ2UsIHN0cmVhbSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IExvYWRfU0JpdF9SYW5nZV9Db2RlcyggcmFuZ2UsIHN0cmVhbSwgMCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3IgPSBTRk5UX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2VibGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIHRhYmxlIG9mIGVtYmVkZGVkIGJpdG1hcCBzaXplcyBmb3IgdGhpcyBmYWNlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZWJsYyggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSAwOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRml4ZWQgICB2ZXJzaW9uOwotICAgIEZUX1VMb25nICAgbnVtX3N0cmlrZXM7Ci0gICAgRlRfVUxvbmcgICB0YWJsZV9iYXNlOwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBzYml0X2xpbmVfbWV0cmljc19maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjCi0KLSAgICAgIC8qIG5vIEZUX0ZSQU1FX1NUQVJUICovCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIoIGFzY2VuZGVyICksCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIoIGRlc2NlbmRlciApLAotICAgICAgICBGVF9GUkFNRV9CWVRFKCBtYXhfd2lkdGggKSwKLQotICAgICAgICBGVF9GUkFNRV9DSEFSKCBjYXJldF9zbG9wZV9udW1lcmF0b3IgKSwKLSAgICAgICAgRlRfRlJBTUVfQ0hBUiggY2FyZXRfc2xvcGVfZGVub21pbmF0b3IgKSwKLSAgICAgICAgRlRfRlJBTUVfQ0hBUiggY2FyZXRfb2Zmc2V0ICksCi0KLSAgICAgICAgRlRfRlJBTUVfQ0hBUiggbWluX29yaWdpbl9TQiApLAotICAgICAgICBGVF9GUkFNRV9DSEFSKCBtaW5fYWR2YW5jZV9TQiApLAotICAgICAgICBGVF9GUkFNRV9DSEFSKCBtYXhfYmVmb3JlX0JMICksCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIoIG1pbl9hZnRlcl9CTCApLAotICAgICAgICBGVF9GUkFNRV9DSEFSKCBwYWRzWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIoIHBhZHNbMV0gKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHN0cmlrZV9zdGFydF9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9TQml0X1N0cmlrZVJlYwotCi0gICAgICAvKiBubyBGVF9GUkFNRV9TVEFSVCAqLwotICAgICAgICBGVF9GUkFNRV9VTE9ORyggcmFuZ2VzX29mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9TS0lQX0xPTkcsCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBudW1fcmFuZ2VzICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBjb2xvcl9yZWYgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHN0cmlrZV9lbmRfZmllbGRzW10gPQotICAgIHsKLSAgICAgIC8qIG5vIEZUX0ZSQU1FX1NUQVJUICovCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggc3RhcnRfZ2x5cGggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBlbmRfZ2x5cGggKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSAgKCB4X3BwZW0gKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSAgKCB5X3BwZW0gKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSAgKCBiaXRfZGVwdGggKSwKLSAgICAgICAgRlRfRlJBTUVfQ0hBUiAgKCBmbGFncyApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgZmFjZS0+bnVtX3NiaXRfc3RyaWtlcyA9IDA7Ci0KLSAgICAvKiB0aGlzIHRhYmxlIGlzIG9wdGlvbmFsICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX0VCTEMsIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2Jsb2MsIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgdGFibGVfYmFzZSA9IEZUX1NUUkVBTV9QT1MoKTsKLSAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCA4TCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHZlcnNpb24gICAgID0gRlRfR0VUX0xPTkcoKTsKLSAgICBudW1fc3RyaWtlcyA9IEZUX0dFVF9VTE9ORygpOwotCi0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgLyogY2hlY2sgdmVyc2lvbiBudW1iZXIgYW5kIHN0cmlrZSBjb3VudCAqLwotICAgIGlmICggdmVyc2lvbiAgICAgIT0gMHgwMDAyMDAwMEwgfHwKLSAgICAgICAgIG51bV9zdHJpa2VzID49IDB4MTAwMDBMICAgICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ0dF9mYWNlX2xvYWRfc2JpdF9zdHJpa2VzOiBpbnZhbGlkIHRhYmxlIHZlcnNpb24hXG4iICkpOwotICAgICAgZXJyb3IgPSBTRk5UX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgdGhlIHN0cmlrZXMgdGFibGUgKi8KLSAgICBpZiAoIEZUX05FV19BUlJBWSggZmFjZS0+c2JpdF9zdHJpa2VzLCBudW1fc3RyaWtlcyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZhY2UtPm51bV9zYml0X3N0cmlrZXMgPSBudW1fc3RyaWtlczsKLQotICAgIC8qIG5vdyByZWFkIGVhY2ggc3RyaWtlIHRhYmxlIHNlcGFyYXRlbHkgKi8KLSAgICB7Ci0gICAgICBUVF9TQml0X1N0cmlrZSAgc3RyaWtlID0gZmFjZS0+c2JpdF9zdHJpa2VzOwotICAgICAgRlRfVUxvbmcgICAgICAgIGNvdW50ICA9IG51bV9zdHJpa2VzOwotCi0KLSAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDQ4TCAqIG51bV9zdHJpa2VzICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHdoaWxlICggY291bnQgPiAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHN0cmlrZV9zdGFydF9maWVsZHMsIHN0cmlrZSApICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1JFQURfRklFTERTKCBzYml0X2xpbmVfbWV0cmljc19maWVsZHMsICZzdHJpa2UtPmhvcmkgKSB8fAotICAgICAgICAgICAgIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggc2JpdF9saW5lX21ldHJpY3NfZmllbGRzLCAmc3RyaWtlLT52ZXJ0ICkgfHwKLSAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHN0cmlrZV9lbmRfZmllbGRzLCBzdHJpa2UgKSAgICAgICAgICAgICAgICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjb3VudC0tOwotICAgICAgICBzdHJpa2UrKzsKLSAgICAgIH0KLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIHRoZSBpbmRleCByYW5nZXMgZm9yIGVhY2ggc3RyaWtlIHRhYmxlICovCi0gICAgewotICAgICAgVFRfU0JpdF9TdHJpa2UgIHN0cmlrZSA9IGZhY2UtPnNiaXRfc3RyaWtlczsKLSAgICAgIEZUX1VMb25nICAgICAgICBjb3VudCAgPSBudW1fc3RyaWtlczsKLQotCi0gICAgICB3aGlsZSAoIGNvdW50ID4gMCApCi0gICAgICB7Ci0gICAgICAgIFRUX1NCaXRfUmFuZ2UgIHJhbmdlOwotICAgICAgICBGVF9VTG9uZyAgICAgICBjb3VudDIgPSBzdHJpa2UtPm51bV9yYW5nZXM7Ci0KLQotICAgICAgICAvKiByZWFkIGVhY2ggcmFuZ2UgKi8KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggdGFibGVfYmFzZSArIHN0cmlrZS0+cmFuZ2VzX29mZnNldCApIHx8Ci0gICAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHN0cmlrZS0+bnVtX3JhbmdlcyAqIDhMICkgICAgICAgICAgICApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBzdHJpa2UtPnNiaXRfcmFuZ2VzLCBzdHJpa2UtPm51bV9yYW5nZXMgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIHJhbmdlID0gc3RyaWtlLT5zYml0X3JhbmdlczsKLSAgICAgICAgd2hpbGUgKCBjb3VudDIgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIHJhbmdlLT5maXJzdF9nbHlwaCAgPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgICAgICAgcmFuZ2UtPmxhc3RfZ2x5cGggICA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgICByYW5nZS0+dGFibGVfb2Zmc2V0ID0gdGFibGVfYmFzZSArIHN0cmlrZS0+cmFuZ2VzX29mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR0VUX1VMT05HKCk7Ci0gICAgICAgICAgY291bnQyLS07Ci0gICAgICAgICAgcmFuZ2UrKzsKLSAgICAgICAgfQotCi0gICAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgICAgICAvKiBOb3csIHJlYWQgZWFjaCBpbmRleCB0YWJsZSAqLwotICAgICAgICBjb3VudDIgPSBzdHJpa2UtPm51bV9yYW5nZXM7Ci0gICAgICAgIHJhbmdlICA9IHN0cmlrZS0+c2JpdF9yYW5nZXM7Ci0gICAgICAgIHdoaWxlICggY291bnQyID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBSZWFkIHRoZSBoZWFkZXIgKi8KLSAgICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCByYW5nZS0+dGFibGVfb2Zmc2V0ICkgfHwKLSAgICAgICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCA4TCApICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgcmFuZ2UtPmluZGV4X2Zvcm1hdCA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgICByYW5nZS0+aW1hZ2VfZm9ybWF0ID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgICAgIHJhbmdlLT5pbWFnZV9vZmZzZXQgPSBGVF9HRVRfVUxPTkcoKTsKLQotICAgICAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgICAgICAgIGVycm9yID0gTG9hZF9TQml0X1JhbmdlKCByYW5nZSwgc3RyZWFtICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBjb3VudDItLTsKLSAgICAgICAgICByYW5nZSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQtLTsKLSAgICAgICAgc3RyaWtlKys7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2ZyZWVfZWJsYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZWxlYXNlcyB0aGUgZW1iZWRkZWQgYml0bWFwIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9lYmxjKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgICAgICAgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBUVF9TQml0X1N0cmlrZSAgc3RyaWtlICAgICAgID0gZmFjZS0+c2JpdF9zdHJpa2VzOwotICAgIFRUX1NCaXRfU3RyaWtlICBzdHJpa2VfbGltaXQgPSBzdHJpa2UgKyBmYWNlLT5udW1fc2JpdF9zdHJpa2VzOwotCi0KLSAgICBpZiAoIHN0cmlrZSApCi0gICAgewotICAgICAgZm9yICggOyBzdHJpa2UgPCBzdHJpa2VfbGltaXQ7IHN0cmlrZSsrICkKLSAgICAgIHsKLSAgICAgICAgVFRfU0JpdF9SYW5nZSAgcmFuZ2UgICAgICAgPSBzdHJpa2UtPnNiaXRfcmFuZ2VzOwotICAgICAgICBUVF9TQml0X1JhbmdlICByYW5nZV9saW1pdCA9IHJhbmdlICsgc3RyaWtlLT5udW1fcmFuZ2VzOwotCi0KLSAgICAgICAgaWYgKCByYW5nZSApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKCA7IHJhbmdlIDwgcmFuZ2VfbGltaXQ7IHJhbmdlKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIGdseXBoIG9mZnNldHMgYW5kIGNvZGVzIHRhYmxlcyAqLwotICAgICAgICAgICAgLyogd2hlcmUgYXBwcm9wcmlhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGVF9GUkVFKCByYW5nZS0+Z2x5cGhfb2Zmc2V0cyApOwotICAgICAgICAgICAgRlRfRlJFRSggcmFuZ2UtPmdseXBoX2NvZGVzICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZUX0ZSRUUoIHN0cmlrZS0+c2JpdF9yYW5nZXMgKTsKLSAgICAgICAgc3RyaWtlLT5udW1fcmFuZ2VzID0gMDsKLSAgICAgIH0KLSAgICAgIEZUX0ZSRUUoIGZhY2UtPnNiaXRfc3RyaWtlcyApOwotICAgIH0KLSAgICBmYWNlLT5udW1fc2JpdF9zdHJpa2VzID0gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2Vfc2V0X3NiaXRfc3RyaWtlKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICAgYXN0cmlrZV9pbmRleCApCi0gIHsKLSAgICByZXR1cm4gRlRfTWF0Y2hfU2l6ZSggKEZUX0ZhY2UpZmFjZSwgcmVxLCAwLCBhc3RyaWtlX2luZGV4ICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgKQotICB7Ci0gICAgVFRfU0JpdF9TdHJpa2UgIHN0cmlrZTsKLQotCi0gICAgaWYgKCBzdHJpa2VfaW5kZXggPj0gZmFjZS0+bnVtX3NiaXRfc3RyaWtlcyApCi0gICAgICByZXR1cm4gU0ZOVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIHN0cmlrZSA9IGZhY2UtPnNiaXRfc3RyaWtlcyArIHN0cmlrZV9pbmRleDsKLQotICAgIG1ldHJpY3MtPnhfcHBlbSA9IHN0cmlrZS0+eF9wcGVtOwotICAgIG1ldHJpY3MtPnlfcHBlbSA9IHN0cmlrZS0+eV9wcGVtOwotCi0gICAgbWV0cmljcy0+YXNjZW5kZXIgID0gc3RyaWtlLT5ob3JpLmFzY2VuZGVyIDw8IDY7Ci0gICAgbWV0cmljcy0+ZGVzY2VuZGVyID0gc3RyaWtlLT5ob3JpLmRlc2NlbmRlciA8PCA2OwotCi0gICAgLyogWFhYOiBJcyB0aGlzIGNvcnJlY3Q/ICovCi0gICAgbWV0cmljcy0+bWF4X2FkdmFuY2UgPSAoIHN0cmlrZS0+aG9yaS5taW5fb3JpZ2luX1NCICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZS0+aG9yaS5tYXhfd2lkdGggICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZS0+aG9yaS5taW5fYWR2YW5jZV9TQiApIDw8IDY7Ci0KLSAgICBtZXRyaWNzLT5oZWlnaHQgPSBtZXRyaWNzLT5hc2NlbmRlciAtIG1ldHJpY3MtPmRlc2NlbmRlcjsKLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmluZF9zYml0X3JhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2NhbnMgYSBnaXZlbiBzdHJpa2UncyByYW5nZXMgYW5kIHJldHVybiwgZm9yIGEgZ2l2ZW4gZ2x5cGggICAgICAgICovCi0gIC8qICAgIGluZGV4LCB0aGUgY29ycmVzcG9uZGluZyBzYml0IHJhbmdlLCBhbmQgYEVCRFQnIG9mZnNldC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaWtlICAgICAgICA6OiBUaGUgc291cmNlL2N1cnJlbnQgc2JpdCBzdHJpa2UuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXJhbmdlICAgICAgICA6OiBUaGUgc2JpdCByYW5nZSBjb250YWluaW5nIHRoZSBnbHlwaCBpbmRleC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGhfb2Zmc2V0IDo6IFRoZSBvZmZzZXQgb2YgdGhlIGdseXBoIGRhdGEgaW4gYEVCRFQnIHRhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyB0aGUgZ2x5cGggaW5kZXggd2FzIGZvdW5kLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmaW5kX3NiaXRfcmFuZ2UoIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgVFRfU0JpdF9TdHJpa2UgICBzdHJpa2UsCi0gICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSAgICphcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICphZ2x5cGhfb2Zmc2V0ICkKLSAgewotICAgIFRUX1NCaXRfUmFuZ2VSZWMgICpyYW5nZSwgKnJhbmdlX2xpbWl0OwotCi0KLSAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBnbHlwaCBpbmRleCBpcyB3aXRoaW4gdGhpcyBzdHJpa2UncyAqLwotICAgIC8qIGdseXBoIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBnbHlwaF9pbmRleCA8IChGVF9VSW50KXN0cmlrZS0+c3RhcnRfZ2x5cGggfHwKLSAgICAgICAgIGdseXBoX2luZGV4ID4gKEZUX1VJbnQpc3RyaWtlLT5lbmRfZ2x5cGggICApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBzY2FuIGFsbCByYW5nZXMgaW4gc3RyaWtlICovCi0gICAgcmFuZ2UgICAgICAgPSBzdHJpa2UtPnNiaXRfcmFuZ2VzOwotICAgIHJhbmdlX2xpbWl0ID0gcmFuZ2UgKyBzdHJpa2UtPm51bV9yYW5nZXM7Ci0gICAgaWYgKCAhcmFuZ2UgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZm9yICggOyByYW5nZSA8IHJhbmdlX2xpbWl0OyByYW5nZSsrICkKLSAgICB7Ci0gICAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KXJhbmdlLT5maXJzdF9nbHlwaCAmJgotICAgICAgICAgICBnbHlwaF9pbmRleCA8PSAoRlRfVUludClyYW5nZS0+bGFzdF9nbHlwaCAgKQotICAgICAgewotICAgICAgICBGVF9VU2hvcnQgIGRlbHRhID0gKEZUX1VTaG9ydCkoIGdseXBoX2luZGV4IC0gcmFuZ2UtPmZpcnN0X2dseXBoICk7Ci0KLQotICAgICAgICBzd2l0Y2ggKCByYW5nZS0+aW5kZXhfZm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAqYWdseXBoX29mZnNldCA9IHJhbmdlLT5nbHlwaF9vZmZzZXRzW2RlbHRhXTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgKmFnbHlwaF9vZmZzZXQgPSByYW5nZS0+aW1hZ2Vfb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLT5pbWFnZV9zaXplICogZGVsdGE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUxvbmcgIG47Ci0KLQotICAgICAgICAgICAgZm9yICggbiA9IDA7IG4gPCByYW5nZS0+bnVtX2dseXBoczsgbisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCAoRlRfVUludClyYW5nZS0+Z2x5cGhfY29kZXNbbl0gPT0gZ2x5cGhfaW5kZXggKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCByYW5nZS0+aW5kZXhfZm9ybWF0ID09IDQgKQotICAgICAgICAgICAgICAgICAgKmFnbHlwaF9vZmZzZXQgPSByYW5nZS0+Z2x5cGhfb2Zmc2V0c1tuXTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAqYWdseXBoX29mZnNldCA9IHJhbmdlLT5pbWFnZV9vZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICogcmFuZ2UtPmltYWdlX3NpemU7Ci0gICAgICAgICAgICAgICAgZ290byBGb3VuZDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgRm91bmQ6Ci0gICAgICAgIC8qIHJldHVybiBzdWNjZXNzZnVsbHkhICovCi0gICAgICAgICphcmFuZ2UgID0gcmFuZ2U7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgICphcmFuZ2UgICAgICAgID0gMDsKLSAgICAqYWdseXBoX29mZnNldCA9IDA7Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmluZF9zYml0X2ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2hlY2tzIHdoZXRoZXIgYW4gZW1iZWRkZWQgYml0bWFwIChhbiBgc2JpdCcpIGV4aXN0cyBmb3IgYSBnaXZlbiAgICovCi0gIC8qICAgIGdseXBoLCBhdCBhIGdpdmVuIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpa2VfaW5kZXggIDo6IFRoZSBjdXJyZW50IHN0cmlrZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcmFuZ2UgICAgICAgIDo6IFRoZSBTQml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzdHJpa2UgICAgICAgOjogVGhlIFNCaXQgc3RyaWtlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdseXBoX29mZnNldCA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBnbHlwaCBkYXRhIGluIGBFQkRUJyB0YWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlRfRXJyX0ludmFsaWRfQXJndW1lbnQgaWYgbm8gc2JpdCBleGlzdHMgZm9yIHRoZSByZXF1ZXN0ZWQgICAgICAqLwotICAvKiAgICBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZpbmRfc2JpdF9pbWFnZSggVFRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSAgICphcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9TdHJpa2UgICphc3RyaWtlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAqYWdseXBoX29mZnNldCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgVFRfU0JpdF9TdHJpa2UgIHN0cmlrZTsKLQotCi0gICAgaWYgKCAhZmFjZS0+c2JpdF9zdHJpa2VzICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICggZmFjZS0+bnVtX3NiaXRfc3RyaWtlcyA8PSBzdHJpa2VfaW5kZXggKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBzdHJpa2UgPSAmZmFjZS0+c2JpdF9zdHJpa2VzW3N0cmlrZV9pbmRleF07Ci0KLSAgICBlcnJvciA9IGZpbmRfc2JpdF9yYW5nZSggZ2x5cGhfaW5kZXgsIHN0cmlrZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJhbmdlLCBhZ2x5cGhfb2Zmc2V0ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAqYXN0cmlrZSA9IHN0cmlrZTsKLQotICAgIHJldHVybiBTRk5UX0Vycl9PazsKLQotICBGYWlsOgotICAgIC8qIG5vIGVtYmVkZGVkIGJpdG1hcCBmb3IgdGhpcyBnbHlwaCBpbiBmYWNlICovCi0gICAgKmFyYW5nZSAgICAgICAgPSAwOwotICAgICphc3RyaWtlICAgICAgID0gMDsKLSAgICAqYWdseXBoX29mZnNldCA9IDA7Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfbG9hZF9zYml0X21ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0cyB0aGUgYmlnIG1ldHJpY3MgZm9yIGEgZ2l2ZW4gU0JpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYW5nZSAgICAgICA6OiBUaGUgU0JpdCByYW5nZSBjb250YWluaW5nIHRoZSBnbHlwaC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaWdfbWV0cmljcyA6OiBBIGJpZyBTQml0IG1ldHJpY3Mgc3RydWN0dXJlIGZvciB0aGUgZ2x5cGguICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIHBvc2l0aW9uZWQgYXQgdGhlIGdseXBoJ3Mgb2Zmc2V0IHdpdGhpbiAgKi8KLSAgLyogICAgdGhlIGBFQkRUJyB0YWJsZSBiZWZvcmUgdGhlIGNhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgaW1hZ2UgZm9ybWF0IHVzZXMgdmFyaWFibGUgbWV0cmljcywgdGhlIHN0cmVhbSBjdXJzb3IgaXMgICAgKi8KLSAgLyogICAgcG9zaXRpb25lZCBqdXN0IGFmdGVyIHRoZSBtZXRyaWNzIGhlYWRlciBpbiB0aGUgYEVCRFQnIHRhYmxlIG9uICAgICovCi0gIC8qICAgIGZ1bmN0aW9uIGV4aXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfbG9hZF9zYml0X21ldHJpY3MoIEZUX1N0cmVhbSAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSAgICByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBTRk5UX0Vycl9PazsKLQotCi0gICAgc3dpdGNoICggcmFuZ2UtPmltYWdlX2Zvcm1hdCApCi0gICAgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA4OgotICAgICAgLyogdmFyaWFibGUgc21hbGwgbWV0cmljcyAqLwotICAgICAgewotICAgICAgICBUVF9TQml0X1NtYWxsTWV0cmljc1JlYyAgc21ldHJpY3M7Ci0KLSAgICAgICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBzYml0X3NtYWxsX21ldHJpY3NfZmllbGRzW10gPQotICAgICAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX1NCaXRfU21hbGxNZXRyaWNzUmVjCi0KLSAgICAgICAgICBGVF9GUkFNRV9TVEFSVCggNSApLAotICAgICAgICAgICAgRlRfRlJBTUVfQllURSggaGVpZ2h0ICksCi0gICAgICAgICAgICBGVF9GUkFNRV9CWVRFKCB3aWR0aCApLAotICAgICAgICAgICAgRlRfRlJBTUVfQ0hBUiggYmVhcmluZ1ggKSwKLSAgICAgICAgICAgIEZUX0ZSQU1FX0NIQVIoIGJlYXJpbmdZICksCi0gICAgICAgICAgICBGVF9GUkFNRV9CWVRFKCBhZHZhbmNlICksCi0gICAgICAgICAgRlRfRlJBTUVfRU5ECi0gICAgICAgIH07Ci0KLQotICAgICAgICAvKiByZWFkIHNtYWxsIG1ldHJpY3MgKi8KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHNiaXRfc21hbGxfbWV0cmljc19maWVsZHMsICZzbWV0cmljcyApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogY29udmVydCBpdCB0byBhIGJpZyBtZXRyaWNzICovCi0gICAgICAgIG1ldHJpY3MtPmhlaWdodCAgICAgICA9IHNtZXRyaWNzLmhlaWdodDsKLSAgICAgICAgbWV0cmljcy0+d2lkdGggICAgICAgID0gc21ldHJpY3Mud2lkdGg7Ci0gICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IHNtZXRyaWNzLmJlYXJpbmdYOwotICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBzbWV0cmljcy5iZWFyaW5nWTsKLSAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgID0gc21ldHJpY3MuYWR2YW5jZTsKLQotICAgICAgICAvKiB0aGVzZSBtZXRyaWNzIGFyZSBtYWRlIHVwIGF0IGEgaGlnaGVyIGxldmVsIHdoZW4gKi8KLSAgICAgICAgLyogbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IDA7Ci0gICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IDA7Ci0gICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNjoKLSAgICBjYXNlIDc6Ci0gICAgY2FzZSA5OgotICAgICAgLyogdmFyaWFibGUgYmlnIG1ldHJpY3MgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBzYml0X21ldHJpY3NfZmllbGRzLCBtZXRyaWNzICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNToKLSAgICBkZWZhdWx0OiAgLyogY29uc3RhbnQgbWV0cmljcyAqLwotICAgICAgaWYgKCByYW5nZS0+aW5kZXhfZm9ybWF0ID09IDIgfHwgcmFuZ2UtPmluZGV4X2Zvcm1hdCA9PSA1ICkKLSAgICAgICAgKm1ldHJpY3MgPSByYW5nZS0+bWV0cmljczsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFNGTlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNyb3BfYml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyb3BzIGEgYml0bWFwIHRvIGl0cyB0aWdodGVzdCBib3VuZGluZyBib3gsIGFuZCBhZGp1c3RzIGl0cyAgICAgICAqLwotICAvKiAgICBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXAgICAgIDo6IFRoZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3MgOjogVGhlIGNvcnJlc3BvbmRpbmcgbWV0cmljcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY3JvcF9iaXRtYXAoIEZUX0JpdG1hcCogICAgICAgbWFwLAotICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzICBtZXRyaWNzICkKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSW4gdGhpcyBzaXR1YXRpb24sIHNvbWUgYm91bmRpbmcgYm94ZXMgb2YgZW1iZWRkZWQgYml0bWFwcyBhcmUgdG9vICAqLwotICAgIC8qIGxhcmdlLiAgV2UgbmVlZCB0byBjcm9wIGl0IHRvIGEgcmVhc29uYWJsZSBzaXplLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAtLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgIC0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIHwgICoqKiAgfCAgICAgICAgICAgICAgICB8KioqfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICB8ICAgKiAgIHwgICAgICAgICAgICAgICAgfCAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgfCAgICogICB8ICAgIC0tLS0tLT4gICAgIHwgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIHwgICAqICAgfCAgICAgICAgICAgICAgICB8ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICB8ICAgKiAgIHwgICAgICAgICAgICAgICAgfCAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgfCAgKioqICB8ICAgICAgICAgICAgICAgIHwqKip8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIC0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIEZUX0ludCAgICByb3dzLCBjb3VudDsKLSAgICBGVF9Mb25nICAgbGluZV9sZW47Ci0gICAgRlRfQnl0ZSogIGxpbmU7Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBjaGVjayB0aGUgdG9wLW1vc3QgbGluZXMgb2YgdGhlIGJpdG1hcCwgYW5kIHJlbW92ZSAgICAqLwotICAgIC8qIHRoZW0gaWYgdGhleSdyZSBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgbGluZSAgICAgPSAoRlRfQnl0ZSopbWFwLT5idWZmZXI7Ci0gICAgICByb3dzICAgICA9IG1hcC0+cm93czsKLSAgICAgIGxpbmVfbGVuID0gbWFwLT5waXRjaDsKLQotCi0gICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgcm93czsgY291bnQrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBjdXIgICA9IGxpbmU7Ci0gICAgICAgIEZUX0J5dGUqICBsaW1pdCA9IGxpbmUgKyBsaW5lX2xlbjsKLQotCi0gICAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgICAgICBpZiAoIGN1clswXSApCi0gICAgICAgICAgICBnb3RvIEZvdW5kX1RvcDsKLQotICAgICAgICAvKiB0aGUgY3VycmVudCBsaW5lIHdhcyBlbXB0eSAtIHNraXAgdG8gbmV4dCBvbmUgKi8KLSAgICAgICAgbGluZSAgPSBsaW1pdDsKLSAgICAgIH0KLQotICAgIEZvdW5kX1RvcDoKLSAgICAgIC8qIGNoZWNrIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgZmlsbGVkIGxpbmUgKi8KLSAgICAgIGlmICggY291bnQgPj0gcm93cyApCi0gICAgICAgIGdvdG8gRW1wdHlfQml0bWFwOwotCi0gICAgICAvKiBub3csIGNyb3AgdGhlIGVtcHR5IHVwcGVyIGxpbmVzICovCi0gICAgICBpZiAoIGNvdW50ID4gMCApCi0gICAgICB7Ci0gICAgICAgIGxpbmUgPSAoRlRfQnl0ZSopbWFwLT5idWZmZXI7Ci0KLSAgICAgICAgRlRfTUVNX01PVkUoIGxpbmUsIGxpbmUgKyBjb3VudCAqIGxpbmVfbGVuLAotICAgICAgICAgICAgICAgICAgICAgKCByb3dzIC0gY291bnQgKSAqIGxpbmVfbGVuICk7Ci0KLSAgICAgICAgbWV0cmljcy0+aGVpZ2h0ICAgICAgID0gKEZUX0J5dGUpKCBtZXRyaWNzLT5oZWlnaHQgLSBjb3VudCApOwotICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSAoRlRfQ2hhcikoIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSAtIGNvdW50ICk7Ci0gICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IChGVF9DaGFyKSggbWV0cmljcy0+dmVydEJlYXJpbmdZIC0gY291bnQgKTsKLQotICAgICAgICBtYXAtPnJvd3MgLT0gY291bnQ7Ci0gICAgICAgIHJvd3MgICAgICAtPSBjb3VudDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHNlY29uZCwgY3JvcCB0aGUgbG93ZXIgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgbGluZSA9IChGVF9CeXRlKiltYXAtPmJ1ZmZlciArICggcm93cyAtIDEgKSAqIGxpbmVfbGVuOwotCi0gICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgcm93czsgY291bnQrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBjdXIgICA9IGxpbmU7Ci0gICAgICAgIEZUX0J5dGUqICBsaW1pdCA9IGxpbmUgKyBsaW5lX2xlbjsKLQotCi0gICAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgICAgICBpZiAoIGN1clswXSApCi0gICAgICAgICAgICBnb3RvIEZvdW5kX0JvdHRvbTsKLQotICAgICAgICAvKiB0aGUgY3VycmVudCBsaW5lIHdhcyBlbXB0eSAtIHNraXAgdG8gcHJldmlvdXMgb25lICovCi0gICAgICAgIGxpbmUgLT0gbGluZV9sZW47Ci0gICAgICB9Ci0KLSAgICBGb3VuZF9Cb3R0b206Ci0gICAgICBpZiAoIGNvdW50ID4gMCApCi0gICAgICB7Ci0gICAgICAgIG1ldHJpY3MtPmhlaWdodCAgPSAoRlRfQnl0ZSkoIG1ldHJpY3MtPmhlaWdodCAtIGNvdW50ICk7Ci0gICAgICAgIHJvd3MgICAgICAgICAgICAtPSBjb3VudDsKLSAgICAgICAgbWFwLT5yb3dzICAgICAgIC09IGNvdW50OwotICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcmQsIGdldCByaWQgb2YgdGhlIHNwYWNlIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGdseXBoICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBkbwotICAgIHsKLSAgICAgIEZUX0J5dGUqICBsaW1pdDsKLQotCi0gICAgICBsaW5lICA9IChGVF9CeXRlKiltYXAtPmJ1ZmZlcjsKLSAgICAgIGxpbWl0ID0gbGluZSArIHJvd3MgKiBsaW5lX2xlbjsKLQotICAgICAgZm9yICggOyBsaW5lIDwgbGltaXQ7IGxpbmUgKz0gbGluZV9sZW4gKQotICAgICAgICBpZiAoIGxpbmVbMF0gJiAweDgwICkKLSAgICAgICAgICBnb3RvIEZvdW5kX0xlZnQ7Ci0KLSAgICAgIC8qIHNoaWZ0IHRoZSB3aG9sZSBnbHlwaCBvbmUgcGl4ZWwgdG8gdGhlIGxlZnQgKi8KLSAgICAgIGxpbmUgID0gKEZUX0J5dGUqKW1hcC0+YnVmZmVyOwotICAgICAgbGltaXQgPSBsaW5lICsgcm93cyAqIGxpbmVfbGVuOwotCi0gICAgICBmb3IgKCA7IGxpbmUgPCBsaW1pdDsgbGluZSArPSBsaW5lX2xlbiApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgICBuLCB3aWR0aCA9IG1hcC0+d2lkdGg7Ci0gICAgICAgIEZUX0J5dGUgICBvbGQ7Ci0gICAgICAgIEZUX0J5dGUqICBjdXIgPSBsaW5lOwotCi0KLSAgICAgICAgb2xkID0gKEZUX0J5dGUpKGN1clswXSA8PCAxKTsKLSAgICAgICAgZm9yICggbiA9IDg7IG4gPCB3aWR0aDsgbiArPSA4ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUgIHZhbDsKLQotCi0gICAgICAgICAgdmFsICAgID0gY3VyWzFdOwotICAgICAgICAgIGN1clswXSA9IChGVF9CeXRlKSggb2xkIHwgKCB2YWwgPj4gNyApICk7Ci0gICAgICAgICAgb2xkICAgID0gKEZUX0J5dGUpKCB2YWwgPDwgMSApOwotICAgICAgICAgIGN1cisrOwotICAgICAgICB9Ci0gICAgICAgIGN1clswXSA9IG9sZDsKLSAgICAgIH0KLQotICAgICAgbWFwLT53aWR0aC0tOwotICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYKys7Ci0gICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1grKzsKLSAgICAgIG1ldHJpY3MtPndpZHRoLS07Ci0KLSAgICB9IHdoaWxlICggbWFwLT53aWR0aCA+IDAgKTsKLQotICBGb3VuZF9MZWZ0OgotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBmaW5hbGx5LCBjcm9wIHRoZSBiaXRtYXAgd2lkdGggdG8gZ2V0IHJpZCBvZiB0aGUgc3BhY2Ugb24gdGhlIHJpZ2h0ICovCi0gICAgLyogc2lkZSBvZiB0aGUgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBkbwotICAgIHsKLSAgICAgIEZUX0ludCAgICByaWdodCA9IG1hcC0+d2lkdGggLSAxOwotICAgICAgRlRfQnl0ZSogIGxpbWl0OwotICAgICAgRlRfQnl0ZSAgIG1hc2s7Ci0KLQotICAgICAgbGluZSAgPSAoRlRfQnl0ZSopbWFwLT5idWZmZXIgKyAoIHJpZ2h0ID4+IDMgKTsKLSAgICAgIGxpbWl0ID0gbGluZSArIHJvd3MgKiBsaW5lX2xlbjsKLSAgICAgIG1hc2sgID0gKEZUX0J5dGUpKCAweDgwID4+ICggcmlnaHQgJiA3ICkgKTsKLQotICAgICAgZm9yICggOyBsaW5lIDwgbGltaXQ7IGxpbmUgKz0gbGluZV9sZW4gKQotICAgICAgICBpZiAoIGxpbmVbMF0gJiBtYXNrICkKLSAgICAgICAgICBnb3RvIEZvdW5kX1JpZ2h0OwotCi0gICAgICAvKiBjcm9wIHRoZSB3aG9sZSBnbHlwaCB0byB0aGUgcmlnaHQgKi8KLSAgICAgIG1hcC0+d2lkdGgtLTsKLSAgICAgIG1ldHJpY3MtPndpZHRoLS07Ci0KLSAgICB9IHdoaWxlICggbWFwLT53aWR0aCA+IDAgKTsKLQotICBGb3VuZF9SaWdodDoKLSAgICAvKiBhbGwgcmlnaHQsIHRoZSBiaXRtYXAgd2FzIGNyb3BwZWQgKi8KLSAgICByZXR1cm47Ci0KLSAgRW1wdHlfQml0bWFwOgotICAgIG1hcC0+d2lkdGggICAgICA9IDA7Ci0gICAgbWFwLT5yb3dzICAgICAgID0gMDsKLSAgICBtYXAtPnBpdGNoICAgICAgPSAwOwotICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTU9OTzsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIExvYWRfU0JpdF9TaW5nbGUoIEZUX0JpdG1hcCogICAgICAgbWFwLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgIHhfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgIHlfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgIHBpeF9iaXRzLAotICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgIGltYWdlX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIC8qIGNoZWNrIHRoYXQgdGhlIHNvdXJjZSBiaXRtYXAgZml0cyBpbnRvIHRoZSB0YXJnZXQgcGl4bWFwICovCi0gICAgaWYgKCB4X29mZnNldCA8IDAgfHwgeF9vZmZzZXQgKyBtZXRyaWNzLT53aWR0aCAgPiBtYXAtPndpZHRoIHx8Ci0gICAgICAgICB5X29mZnNldCA8IDAgfHwgeV9vZmZzZXQgKyBtZXRyaWNzLT5oZWlnaHQgPiBtYXAtPnJvd3MgICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFNGTlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBGVF9JbnQgICBnbHlwaF93aWR0aCAgPSBtZXRyaWNzLT53aWR0aDsKLSAgICAgIEZUX0ludCAgIGdseXBoX2hlaWdodCA9IG1ldHJpY3MtPmhlaWdodDsKLSAgICAgIEZUX0ludCAgIGdseXBoX3NpemU7Ci0gICAgICBGVF9JbnQgICBsaW5lX2JpdHMgICAgPSBwaXhfYml0cyAqIGdseXBoX3dpZHRoOwotICAgICAgRlRfQm9vbCAgcGFkX2J5dGVzICAgID0gMDsKLQotCi0gICAgICAvKiBjb21wdXRlIHNpemUgb2YgZ2x5cGggaW1hZ2UgKi8KLSAgICAgIHN3aXRjaCAoIGltYWdlX2Zvcm1hdCApCi0gICAgICB7Ci0gICAgICBjYXNlIDE6ICAvKiBieXRlLXBhZGRlZCBmb3JtYXRzICovCi0gICAgICBjYXNlIDY6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIGxpbmVfbGVuZ3RoOwotCi0KLSAgICAgICAgICBzd2l0Y2ggKCBwaXhfYml0cyApCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGxpbmVfbGVuZ3RoID0gKCBnbHlwaF93aWR0aCArIDcgKSA+PiAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgbGluZV9sZW5ndGggPSAoIGdseXBoX3dpZHRoICsgMyApID4+IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBsaW5lX2xlbmd0aCA9ICggZ2x5cGhfd2lkdGggKyAxICkgPj4gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBsaW5lX2xlbmd0aCA9ICAgZ2x5cGhfd2lkdGg7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZ2x5cGhfc2l6ZSA9IGdseXBoX2hlaWdodCAqIGxpbmVfbGVuZ3RoOwotICAgICAgICAgIHBhZF9ieXRlcyAgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICBjYXNlIDU6Ci0gICAgICBjYXNlIDc6Ci0gICAgICAgIGxpbmVfYml0cyAgPSAgIGdseXBoX3dpZHRoICAqIHBpeF9iaXRzOwotICAgICAgICBnbHlwaF9zaXplID0gKCBnbHlwaF9oZWlnaHQgKiBsaW5lX2JpdHMgKyA3ICkgPj4gMzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6ICAvKiBpbnZhbGlkIGZvcm1hdCAqLwotICAgICAgICByZXR1cm4gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgIH0KLQotICAgICAgLyogTm93IHJlYWQgZGF0YSBhbmQgZHJhdyBnbHlwaCBpbnRvIHRhcmdldCBwaXhtYXAgICAgICAgKi8KLSAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGdseXBoX3NpemUgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIG11bHRpcGx5IGB4X29mZnNldCcgYnkgYG1hcC0+cGl4X2JpdHMnIGFzICovCi0gICAgICAvKiB0aGUgc2JpdCBibGl0dGVyIGRvZXNuJ3QgbWFrZSBhIGRpZmZlcmVuY2UgYmV0d2VlbiBwaXhtYXAgKi8KLSAgICAgIC8qIGRlcHRocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgYmxpdF9zYml0KCBtYXAsIChGVF9CeXRlKilzdHJlYW0tPmN1cnNvciwgbGluZV9iaXRzLCBwYWRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgIHhfb2Zmc2V0ICogcGl4X2JpdHMsIHlfb2Zmc2V0ICk7Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBMb2FkX1NCaXRfSW1hZ2UoIFRUX1NCaXRfU3RyaWtlICAgc3RyaWtlLAotICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICBlYmR0X3BvcywKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgIGdseXBoX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgICB4X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgIHlfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgIGRlcHRoICkKLSAgewotICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX0JpdG1hcCogIG1hcCAgICA9ICZzbG90LT5iaXRtYXA7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0KLQotICAgIC8qIHBsYWNlIHN0cmVhbSBhdCBiZWdpbm5pbmcgb2YgZ2x5cGggZGF0YSBhbmQgcmVhZCBtZXRyaWNzICovCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZWJkdF9wb3MgKyBnbHlwaF9vZmZzZXQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IHR0X2xvYWRfc2JpdF9tZXRyaWNzKCBzdHJlYW0sIHJhbmdlLCBtZXRyaWNzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHJlY3Vyc2l2ZS4gIEF0IHRoZSB0b3AtbGV2ZWwgY2FsbCwgd2UgICovCi0gICAgLyogY29tcHV0ZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgaGlnaGVyLWxldmVsIGdseXBoIHRvICAgICAqLwotICAgIC8qIGFsbG9jYXRlIHRoZSBmaW5hbCBwaXhtYXAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGRlcHRoID09IDAgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgIHNpemU7Ci0KLQotICAgICAgbWFwLT53aWR0aCA9IG1ldHJpY3MtPndpZHRoOwotICAgICAgbWFwLT5yb3dzICA9IG1ldHJpY3MtPmhlaWdodDsKLQotICAgICAgc3dpdGNoICggc3RyaWtlLT5iaXRfZGVwdGggKQotICAgICAgewotICAgICAgY2FzZSAxOgotICAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX01PTk87Ci0gICAgICAgIG1hcC0+cGl0Y2ggICAgICA9ICggbWFwLT53aWR0aCArIDcgKSA+PiAzOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAyOgotICAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVkyOwotICAgICAgICBtYXAtPnBpdGNoICAgICAgPSAoIG1hcC0+d2lkdGggKyAzICkgPj4gMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgNDoKLSAgICAgICAgbWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZNDsKLSAgICAgICAgbWFwLT5waXRjaCAgICAgID0gKCBtYXAtPndpZHRoICsgMSApID4+IDE7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDg6Ci0gICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTsKLSAgICAgICAgbWFwLT5waXRjaCAgICAgID0gbWFwLT53aWR0aDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBTRk5UX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgfQotCi0gICAgICBzaXplID0gbWFwLT5yb3dzICogbWFwLT5waXRjaDsKLQotICAgICAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBubyBlbXB0eSBpbWFnZSAqLwotICAgICAgaWYgKCBzaXplID09IDAgKQotICAgICAgICBnb3RvIEV4aXQ7ICAgICAvKiBleGl0IHN1Y2Nlc3NmdWxseSEgKi8KLQotICAgICAgZXJyb3IgPSBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKCBzbG90LCBzaXplICk7Ci0gICAgICBpZiAoZXJyb3IpCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKCByYW5nZS0+aW1hZ2VfZm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOiAgLyogc2luZ2xlIHNiaXQgaW1hZ2UgLSBsb2FkIGl0ICovCi0gICAgY2FzZSAyOgotICAgIGNhc2UgNToKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIExvYWRfU0JpdF9TaW5nbGUoIG1hcCwgeF9vZmZzZXQsIHlfb2Zmc2V0LCBzdHJpa2UtPmJpdF9kZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS0+aW1hZ2VfZm9ybWF0LCBtZXRyaWNzLCBzdHJlYW0gKTsKLQotICAgIGNhc2UgODogIC8qIGNvbXBvdW5kIGZvcm1hdCAqLwotICAgICAgRlRfU3RyZWFtX1NraXAoIHN0cmVhbSwgMUwgKTsKLSAgICAgIC8qIGZhbGx0aHJvdWdoICovCi0KLSAgICBjYXNlIDk6Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6IC8qIGludmFsaWQgaW1hZ2UgZm9ybWF0ICovCi0gICAgICByZXR1cm4gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICB9Ci0KLSAgICAvKiBBbGwgcmlnaHQsIHdlIGhhdmUgYSBjb21wb3VuZCBmb3JtYXQuICBGaXJzdCBvZiBhbGwsIHJlYWQgKi8KLSAgICAvKiB0aGUgYXJyYXkgb2YgZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBUVF9TQml0X0NvbXBvbmVudCAgY29tcG9uZW50czsKLSAgICAgIFRUX1NCaXRfQ29tcG9uZW50ICBjb21wOwotICAgICAgRlRfVVNob3J0ICAgICAgICAgIG51bV9jb21wb25lbnRzLCBjb3VudDsKLQotCi0gICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBudW1fY29tcG9uZW50cyApICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9ORVdfQVJSQVkoIGNvbXBvbmVudHMsIG51bV9jb21wb25lbnRzICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGNvdW50ID0gbnVtX2NvbXBvbmVudHM7Ci0KLSAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDRMICogbnVtX2NvbXBvbmVudHMgKSApCi0gICAgICAgIGdvdG8gRmFpbF9NZW1vcnk7Ci0KLSAgICAgIGZvciAoIGNvbXAgPSBjb21wb25lbnRzOyBjb3VudCA+IDA7IGNvdW50LS0sIGNvbXArKyApCi0gICAgICB7Ci0gICAgICAgIGNvbXAtPmdseXBoX2NvZGUgPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgICAgIGNvbXAtPnhfb2Zmc2V0ICAgPSBGVF9HRVRfQ0hBUigpOwotICAgICAgICBjb21wLT55X29mZnNldCAgID0gRlRfR0VUX0NIQVIoKTsKLSAgICAgIH0KLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgICAvKiBOb3cgcmVjdXJzaXZlbHkgbG9hZCBlYWNoIGVsZW1lbnQgZ2x5cGggKi8KLSAgICAgIGNvdW50ID0gbnVtX2NvbXBvbmVudHM7Ci0gICAgICBjb21wICA9IGNvbXBvbmVudHM7Ci0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgY29tcCsrICkKLSAgICAgIHsKLSAgICAgICAgVFRfU0JpdF9SYW5nZSAgICAgICBlbGVtX3JhbmdlOwotICAgICAgICBUVF9TQml0X01ldHJpY3NSZWMgIGVsZW1fbWV0cmljczsKLSAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICBlbGVtX29mZnNldDsKLQotCi0gICAgICAgIC8qIGZpbmQgdGhlIHJhbmdlIGZvciB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgZXJyb3IgPSBmaW5kX3NiaXRfcmFuZ2UoIGNvbXAtPmdseXBoX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpa2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbV9yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtX29mZnNldCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWxfTWVtb3J5OwotCi0gICAgICAgIC8qIG5vdyBsb2FkIHRoZSBlbGVtZW50LCByZWN1cnNpdmVseSAqLwotICAgICAgICBlcnJvciA9IExvYWRfU0JpdF9JbWFnZSggc3RyaWtlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV9yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGViZHRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmZzZXQgKyBjb21wLT54X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfb2Zmc2V0ICsgY29tcC0+eV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbV9tZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggKyAxICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbF9NZW1vcnk7Ci0gICAgICB9Ci0KLSAgICBGYWlsX01lbW9yeToKLSAgICAgIEZUX0ZSRUUoIGNvbXBvbmVudHMgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9zYml0X2ltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIGEgZ2l2ZW4gZ2x5cGggc2JpdCBpbWFnZSBmcm9tIHRoZSBmb250IHJlc291cmNlLiAgVGhpcyBhbHNvICAqLwotICAvKiAgICByZXR1cm5zIGl0cyBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCA6OiBUaGUgY3VycmVudCBzdHJpa2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggIDo6IFRoZSBjdXJyZW50IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICAgOjogVGhlIGdseXBoIGxvYWQgZmxhZ3MgKHRoZSBjb2RlIGNoZWNrcyBmb3IgdGhlIGZsYWcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEZUX0xPQURfQ1JPUF9CSVRNQVApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXAgICAgICAgICAgOjogVGhlIHRhcmdldCBwaXhtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3MgICAgICA6OiBBIGJpZyBzYml0IG1ldHJpY3Mgc3RydWN0dXJlIGZvciB0aGUgZ2x5cGggaW1hZ2UuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLwotICAvKiAgICBnbHlwaCBzYml0IGV4aXN0cyBmb3IgdGhlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYG1hcC5idWZmZXInIGZpZWxkIGlzIGFsd2F5cyBmcmVlZCBiZWZvcmUgdGhlIGdseXBoIGlzIGxvYWRlZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc2JpdF9pbWFnZSggVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgICAgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgKm1ldHJpY3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIEZUX1VMb25nICAgICAgICBlYmR0X3BvcywgZ2x5cGhfb2Zmc2V0OwotCi0gICAgVFRfU0JpdF9TdHJpa2UgIHN0cmlrZTsKLSAgICBUVF9TQml0X1JhbmdlICAgcmFuZ2U7Ci0KLQotICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBnbHlwaCBzYml0IGZvciB0aGUgY3VycmVudCBpbmRleCAqLwotICAgIGVycm9yID0gdHRfZmluZF9zYml0X2ltYWdlKCBmYWNlLCBnbHlwaF9pbmRleCwgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdHJpa2UsICZnbHlwaF9vZmZzZXQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIG5vdywgZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIGBFQkRUJyB0YWJsZSBpbiAqLwotICAgIC8qIHRoZSBmb250IGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19FQkRULCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19iZGF0LCBzdHJlYW0sIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGViZHRfcG9zID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgZXJyb3IgPSBMb2FkX1NCaXRfSW1hZ2UoIHN0cmlrZSwgcmFuZ2UsIGViZHRfcG9zLCBnbHlwaF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuZ2x5cGgsIDAsIDAsIHN0cmVhbSwgbWV0cmljcywgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2V0dXAgdmVydGljYWwgbWV0cmljcyBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIHN0cmlrZS0+ZmxhZ3MgJiAxICkKLSAgICB7Ci0gICAgICAvKiBpbiBjYXNlIG9mIGEgaG9yaXpvbnRhbCBzdHJpa2Ugb25seSAqLwotICAgICAgRlRfSW50ICBhZHZhbmNlOwotCi0KLSAgICAgIGFkdmFuY2UgPSBzdHJpa2UtPmhvcmkuYXNjZW5kZXIgLSBzdHJpa2UtPmhvcmkuZGVzY2VuZGVyOwotCi0gICAgICAvKiBzb21lIGhldXJpc3RpYyB2YWx1ZXMgKi8KLQotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gKEZUX0NoYXIpKC1tZXRyaWNzLT53aWR0aCAvIDIgKTsKLSAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IChGVF9DaGFyKSggKCBhZHZhbmNlIC0gbWV0cmljcy0+aGVpZ2h0ICkgLyAyICk7Ci0gICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSAoRlRfQ2hhcikoIGFkdmFuY2UgKiAxMiAvIDEwICk7Ci0gICAgfQotCi0gICAgLyogQ3JvcCB0aGUgYml0bWFwIG5vdywgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UgKi8KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX0NST1BfQklUTUFQICkKLSAgICAgIGNyb3BfYml0bWFwKCBtYXAsIG1ldHJpY3MgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRzYml0LmggYi9zcmMvc2ZudC90dHNiaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNjdjMC4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC90dHNiaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0c2JpdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUU0JJVF9IX18KLSNkZWZpbmUgX19UVFNCSVRfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRsb2FkLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZWJsYyggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9lYmxjKCBUVF9GYWNlICBmYWNlICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX3NldF9zYml0X3N0cmlrZSggVFRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgIGFzdHJpa2VfaW5kZXggKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgKTsKLQotI2lmIGRlZmluZWQgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZpbmRfc2JpdF9pbWFnZSggVFRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSAgICphcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9TdHJpa2UgICphc3RyaWtlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAqYWdseXBoX29mZnNldCApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2xvYWRfc2JpdF9tZXRyaWNzKCBGVF9TdHJlYW0gICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MgIG1ldHJpY3MgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyAqLwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9zYml0X2ltYWdlKCBUVF9GYWNlICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAgICAgICAgICAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzUmVjICAqbWV0cmljcyApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRTQklUX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRzYml0MC5jIGIvc3JjL3NmbnQvdHRzYml0MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2M3YTliLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3R0c2JpdDAuYworKysgL2Rldi9udWxsCkBAIC0xLDk5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHNiaXQwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgaXMgYSBoZWFwLW9wdGltaXplZCB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgdHRzYml0LmMgKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlICJ0dHNiaXQuaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dHNiaXQKLQotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICB0dF9zYml0X2xpbmVfbWV0cmljc19maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjCi0KLSAgICAgIC8qIG5vIEZUX0ZSQU1FX1NUQVJUICovCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIoIGFzY2VuZGVyICksCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIoIGRlc2NlbmRlciApLAotICAgICAgICBGVF9GUkFNRV9CWVRFKCBtYXhfd2lkdGggKSwKLQotICAgICAgICBGVF9GUkFNRV9DSEFSKCBjYXJldF9zbG9wZV9udW1lcmF0b3IgKSwKLSAgICAgICAgRlRfRlJBTUVfQ0hBUiggY2FyZXRfc2xvcGVfZGVub21pbmF0b3IgKSwKLSAgICAgICAgRlRfRlJBTUVfQ0hBUiggY2FyZXRfb2Zmc2V0ICksCi0KLSAgICAgICAgRlRfRlJBTUVfQ0hBUiggbWluX29yaWdpbl9TQiApLAotICAgICAgICBGVF9GUkFNRV9DSEFSKCBtaW5fYWR2YW5jZV9TQiApLAotICAgICAgICBGVF9GUkFNRV9DSEFSKCBtYXhfYmVmb3JlX0JMICksCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIoIG1pbl9hZnRlcl9CTCApLAotICAgICAgICBGVF9GUkFNRV9DSEFSKCBwYWRzWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0NIQVIoIHBhZHNbMV0gKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHR0X3N0cmlrZV9zdGFydF9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9TQml0X1N0cmlrZVJlYwotCi0gICAgICAvKiBubyBGVF9GUkFNRV9TVEFSVCAqLwotICAgICAgICBGVF9GUkFNRV9VTE9ORyggcmFuZ2VzX29mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9TS0lQX0xPTkcsCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBudW1fcmFuZ2VzICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBjb2xvcl9yZWYgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHR0X3N0cmlrZV9lbmRfZmllbGRzW10gPQotICAgIHsKLSAgICAgIC8qIG5vIEZUX0ZSQU1FX1NUQVJUICovCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggc3RhcnRfZ2x5cGggKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBlbmRfZ2x5cGggKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSAgKCB4X3BwZW0gKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSAgKCB5X3BwZW0gKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSAgKCBiaXRfZGVwdGggKSwKLSAgICAgICAgRlRfRlJBTUVfQ0hBUiAgKCBmbGFncyApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZWJsYyggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBTRk5UX0Vycl9PazsKLSAgICBGVF9GaXhlZCAgIHZlcnNpb247Ci0gICAgRlRfVUxvbmcgICBudW1fc3RyaWtlcywgdGFibGVfc2l6ZTsKLSAgICBGVF9CeXRlKiAgIHA7Ci0gICAgRlRfQnl0ZSogICBwX2xpbWl0OwotICAgIEZUX1VJbnQgICAgY291bnQ7Ci0KLQotICAgIGZhY2UtPnNiaXRfbnVtX3N0cmlrZXMgPSAwOwotCi0gICAgLyogdGhpcyB0YWJsZSBpcyBvcHRpb25hbCAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19FQkxDLCBzdHJlYW0sICZ0YWJsZV9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfYmxvYywgc3RyZWFtLCAmdGFibGVfc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCB0YWJsZV9zaXplIDwgOCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiJXM6IHRhYmxlIHRvbyBzaG9ydCFcbiIsICJ0dF9mYWNlX2xvYWRfc2JpdF9zdHJpa2VzIiApKTsKLSAgICAgIGVycm9yID0gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIHRhYmxlX3NpemUsIGZhY2UtPnNiaXRfdGFibGUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmYWNlLT5zYml0X3RhYmxlX3NpemUgPSB0YWJsZV9zaXplOwotCi0gICAgcCAgICAgICA9IGZhY2UtPnNiaXRfdGFibGU7Ci0gICAgcF9saW1pdCA9IHAgKyB0YWJsZV9zaXplOwotCi0gICAgdmVyc2lvbiAgICAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbnVtX3N0cmlrZXMgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIHZlcnNpb24gIT0gMHgwMDAyMDAwMFVMIHx8IG51bV9zdHJpa2VzID49IDB4MTAwMDBVTCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiJXM6IGludmFsaWQgdGFibGUgdmVyc2lvbiFcbiIsCi0gICAgICAgICAgICAgICAgICJ0dF9mYWNlX2xvYWRfc2JpdF9zdHJpa2VzIiApKTsKLSAgICAgIGVycm9yID0gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBDb3VudCB0aGUgbnVtYmVyIG9mIHN0cmlrZXMgYXZhaWxhYmxlIGluIHRoZSB0YWJsZS4gIFdlIGFyZSBhIGJpdAotICAgICAqICBwYXJhbm9pZCB0aGVyZSBhbmQgZG9uJ3QgdHJ1c3QgdGhlIGRhdGEuCi0gICAgICovCi0gICAgY291bnQgPSAoRlRfVUludCludW1fc3RyaWtlczsKLSAgICBpZiAoIDggKyA0OFVMICogY291bnQgPiB0YWJsZV9zaXplICkKLSAgICAgIGNvdW50ID0gKEZUX1VJbnQpKCAoIHBfbGltaXQgLSBwICkgLyA0OCApOwotCi0gICAgZmFjZS0+c2JpdF9udW1fc3RyaWtlcyA9IGNvdW50OwotCi0gICAgRlRfVFJBQ0UzKCggInNiaXRfbnVtX3N0cmlrZXM6ICV1XG4iLCBjb3VudCApKTsKLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT5zYml0X3RhYmxlICk7Ci0gICAgZmFjZS0+c2JpdF90YWJsZV9zaXplID0gMDsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9lYmxjKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0KLQotICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGZhY2UtPnNiaXRfdGFibGUgKTsKLSAgICBmYWNlLT5zYml0X3RhYmxlX3NpemUgID0gMDsKLSAgICBmYWNlLT5zYml0X251bV9zdHJpa2VzID0gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2Vfc2V0X3NiaXRfc3RyaWtlKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICAgYXN0cmlrZV9pbmRleCApCi0gIHsKLSAgICByZXR1cm4gRlRfTWF0Y2hfU2l6ZSggKEZUX0ZhY2UpZmFjZSwgcmVxLCAwLCBhc3RyaWtlX2luZGV4ICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgKQotICB7Ci0gICAgRlRfQnl0ZSogICAgICAgICBzdHJpa2U7Ci0KLQotICAgIGlmICggc3RyaWtlX2luZGV4ID49IChGVF9VTG9uZylmYWNlLT5zYml0X251bV9zdHJpa2VzICkKLSAgICAgIHJldHVybiBTRk5UX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgc3RyaWtlID0gZmFjZS0+c2JpdF90YWJsZSArIDggKyBzdHJpa2VfaW5kZXggKiA0ODsKLQotICAgIG1ldHJpY3MtPnhfcHBlbSA9IChGVF9VU2hvcnQpc3RyaWtlWzQ0XTsKLSAgICBtZXRyaWNzLT55X3BwZW0gPSAoRlRfVVNob3J0KXN0cmlrZVs0NV07Ci0KLSAgICBtZXRyaWNzLT5hc2NlbmRlciAgPSAoRlRfQ2hhcilzdHJpa2VbMTZdIDw8IDY7ICAvKiBob3JpLmFzY2VuZGVyICAqLwotICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9IChGVF9DaGFyKXN0cmlrZVsxN10gPDwgNjsgIC8qIGhvcmkuZGVzY2VuZGVyICovCi0gICAgbWV0cmljcy0+aGVpZ2h0ICAgID0gbWV0cmljcy0+YXNjZW5kZXIgLSBtZXRyaWNzLT5kZXNjZW5kZXI7Ci0KLSAgICAvKiBYWFg6IElzIHRoaXMgY29ycmVjdD8gKi8KLSAgICBtZXRyaWNzLT5tYXhfYWR2YW5jZSA9ICggKEZUX0NoYXIpc3RyaWtlWzIyXSArIC8qIG1pbl9vcmlnaW5fU0IgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZVsxOF0gKyAvKiBtYXhfd2lkdGggICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcilzdHJpa2VbMjNdICAgLyogbWluX2FkdmFuY2VfU0IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDw8IDY7Ci0KLSAgICByZXR1cm4gU0ZOVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0RGVjb2RlclJlY18KLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgZmFjZTsKLSAgICBGVF9TdHJlYW0gICAgICAgIHN0cmVhbTsKLSAgICBGVF9CaXRtYXAqICAgICAgIGJpdG1hcDsKLSAgICBUVF9TQml0X01ldHJpY3MgIG1ldHJpY3M7Ci0gICAgRlRfQm9vbCAgICAgICAgICBtZXRyaWNzX2xvYWRlZDsKLSAgICBGVF9Cb29sICAgICAgICAgIGJpdG1hcF9hbGxvY2F0ZWQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgICBiaXRfZGVwdGg7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIGViZHRfc3RhcnQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICBlYmR0X3NpemU7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleF9hcnJheTsKLSAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleF9jb3VudDsKLSAgICBGVF9CeXRlKiAgICAgICAgIGVibGNfYmFzZTsKLSAgICBGVF9CeXRlKiAgICAgICAgIGVibGNfbGltaXQ7Ci0KLSAgfSBUVF9TQml0RGVjb2RlclJlYywgKlRUX1NCaXREZWNvZGVyOwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9pbml0KCBUVF9TQml0RGVjb2RlciAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyogIG1ldHJpY3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotICAgIEZUX1VMb25nICAgZWJkdF9zaXplOwotCi0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfRUJEVCwgc3RyZWFtLCAmZWJkdF9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfYmRhdCwgc3RyZWFtLCAmZWJkdF9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBkZWNvZGVyLT5mYWNlICAgID0gZmFjZTsKLSAgICBkZWNvZGVyLT5zdHJlYW0gID0gc3RyZWFtOwotICAgIGRlY29kZXItPmJpdG1hcCAgPSAmZmFjZS0+cm9vdC5nbHlwaC0+Yml0bWFwOwotICAgIGRlY29kZXItPm1ldHJpY3MgPSBtZXRyaWNzOwotCi0gICAgZGVjb2Rlci0+bWV0cmljc19sb2FkZWQgICA9IDA7Ci0gICAgZGVjb2Rlci0+Yml0bWFwX2FsbG9jYXRlZCA9IDA7Ci0KLSAgICBkZWNvZGVyLT5lYmR0X3N0YXJ0ID0gRlRfU1RSRUFNX1BPUygpOwotICAgIGRlY29kZXItPmViZHRfc2l6ZSAgPSBlYmR0X3NpemU7Ci0KLSAgICBkZWNvZGVyLT5lYmxjX2Jhc2UgID0gZmFjZS0+c2JpdF90YWJsZTsKLSAgICBkZWNvZGVyLT5lYmxjX2xpbWl0ID0gZmFjZS0+c2JpdF90YWJsZSArIGZhY2UtPnNiaXRfdGFibGVfc2l6ZTsKLQotICAgIC8qIG5vdyBmaW5kIHRoZSBzdHJpa2UgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kZXggKi8KLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgcDsKLQotCi0gICAgICBpZiAoIDggKyA0OCAqIHN0cmlrZV9pbmRleCArIDMgKiA0ICsgMzQgKyAxID4gZmFjZS0+c2JpdF90YWJsZV9zaXplICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBTRk5UX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHAgPSBkZWNvZGVyLT5lYmxjX2Jhc2UgKyA4ICsgNDggKiBzdHJpa2VfaW5kZXg7Ci0KLSAgICAgIGRlY29kZXItPnN0cmlrZV9pbmRleF9hcnJheSA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIHAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IDQ7Ci0gICAgICBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfY291bnQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBwICAgICAgICAgICAgICAgICAgICAgICAgICArPSAzNDsKLSAgICAgIGRlY29kZXItPmJpdF9kZXB0aCAgICAgICAgICA9ICpwOwotCi0gICAgICBpZiAoIGRlY29kZXItPnN0cmlrZV9pbmRleF9hcnJheSA+IGZhY2UtPnNiaXRfdGFibGVfc2l6ZSAgICAgICAgICAgICB8fAotICAgICAgICAgICBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfYXJyYXkgKyA4ICogZGVjb2Rlci0+c3RyaWtlX2luZGV4X2NvdW50ID4KLSAgICAgICAgICAgICBmYWNlLT5zYml0X3RhYmxlX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgZXJyb3IgPSBTRk5UX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdHRfc2JpdF9kZWNvZGVyX2RvbmUoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyICkKLSAgewotICAgIEZUX1VOVVNFRCggZGVjb2RlciApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2JpdF9kZWNvZGVyX2FsbG9jX2JpdG1hcCggVFRfU0JpdERlY29kZXIgIGRlY29kZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSBTRk5UX0Vycl9PazsKLSAgICBGVF9VSW50ICAgICB3aWR0aCwgaGVpZ2h0OwotICAgIEZUX0JpdG1hcCogIG1hcCA9IGRlY29kZXItPmJpdG1hcDsKLSAgICBGVF9Mb25nICAgICBzaXplOwotCi0KLSAgICBpZiAoICFkZWNvZGVyLT5tZXRyaWNzX2xvYWRlZCApCi0gICAgewotICAgICAgZXJyb3IgPSBTRk5UX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIHdpZHRoICA9IGRlY29kZXItPm1ldHJpY3MtPndpZHRoOwotICAgIGhlaWdodCA9IGRlY29kZXItPm1ldHJpY3MtPmhlaWdodDsKLQotICAgIG1hcC0+d2lkdGggPSAoaW50KXdpZHRoOwotICAgIG1hcC0+cm93cyAgPSAoaW50KWhlaWdodDsKLQotICAgIHN3aXRjaCAoIGRlY29kZXItPmJpdF9kZXB0aCApCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTU9OTzsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9ICggbWFwLT53aWR0aCArIDcgKSA+PiAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVkyOwotICAgICAgbWFwLT5waXRjaCAgICAgID0gKCBtYXAtPndpZHRoICsgMyApID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTQ7Ci0gICAgICBtYXAtPnBpdGNoICAgICAgPSAoIG1hcC0+d2lkdGggKyAxICkgPj4gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA4OgotICAgICAgbWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZOwotICAgICAgbWFwLT5waXRjaCAgICAgID0gbWFwLT53aWR0aDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBzaXplID0gbWFwLT5yb3dzICogbWFwLT5waXRjaDsKLQotICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gZW1wdHkgaW1hZ2UgKi8KLSAgICBpZiAoIHNpemUgPT0gMCApCi0gICAgICBnb3RvIEV4aXQ7ICAgICAvKiBleGl0IHN1Y2Nlc3NmdWxseSEgKi8KLQotICAgIGVycm9yID0gZnRfZ2x5cGhzbG90X2FsbG9jX2JpdG1hcCggZGVjb2Rlci0+ZmFjZS0+cm9vdC5nbHlwaCwgc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZGVjb2Rlci0+Yml0bWFwX2FsbG9jYXRlZCA9IDE7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9tZXRyaWNzKCBUVF9TQml0RGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgKnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBiaWcgKQotICB7Ci0gICAgRlRfQnl0ZSogICAgICAgICBwICAgICAgID0gKnBwOwotICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcyA9IGRlY29kZXItPm1ldHJpY3M7Ci0KLQotICAgIGlmICggcCArIDUgPiBsaW1pdCApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBpZiAoICFkZWNvZGVyLT5tZXRyaWNzX2xvYWRlZCApCi0gICAgewotICAgICAgbWV0cmljcy0+aGVpZ2h0ICAgICAgID0gcFswXTsKLSAgICAgIG1ldHJpY3MtPndpZHRoICAgICAgICA9IHBbMV07Ci0gICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSAoRlRfQ2hhcilwWzJdOwotICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZID0gKEZUX0NoYXIpcFszXTsKLSAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IHBbNF07Ci0gICAgfQotCi0gICAgcCArPSA1OwotICAgIGlmICggYmlnICkKLSAgICB7Ci0gICAgICBpZiAoIHAgKyAzID4gbGltaXQgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGlmICggIWRlY29kZXItPm1ldHJpY3NfbG9hZGVkICkKLSAgICAgIHsKLSAgICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gKEZUX0NoYXIpcFswXTsKLSAgICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdZID0gKEZUX0NoYXIpcFsxXTsKLSAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgID0gcFsyXTsKLSAgICAgIH0KLQotICAgICAgcCArPSAzOwotICAgIH0KLQotICAgIGRlY29kZXItPm1ldHJpY3NfbG9hZGVkID0gMTsKLSAgICAqcHAgPSBwOwotICAgIHJldHVybiAwOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIFNGTlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gIH0KLQotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlKCBUVF9TQml0RGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB5X3BvcyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IgICgqVFRfU0JpdERlY29kZXJfTG9hZEZ1bmMpKCBUVF9TQml0RGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIHBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB5X3BvcyApOwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2J5dGVfYWxpZ25lZCggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeV9wb3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSBTRk5UX0Vycl9PazsKLSAgICBGVF9CeXRlKiAgICBsaW5lOwotICAgIEZUX0ludCAgICAgIGJpdF9oZWlnaHQsIGJpdF93aWR0aCwgcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIGg7Ci0gICAgRlRfQml0bWFwKiAgYml0bWFwOwotCi0KLSAgICBpZiAoICFkZWNvZGVyLT5iaXRtYXBfYWxsb2NhdGVkICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHR0X3NiaXRfZGVjb2Rlcl9hbGxvY19iaXRtYXAoIGRlY29kZXIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSBjYW4gd3JpdGUgdGhlIGdseXBoIGludG8gdGhlIGJpdG1hcCAqLwotICAgIGJpdG1hcCAgICAgPSBkZWNvZGVyLT5iaXRtYXA7Ci0gICAgYml0X3dpZHRoICA9IGJpdG1hcC0+d2lkdGg7Ci0gICAgYml0X2hlaWdodCA9IGJpdG1hcC0+cm93czsKLSAgICBwaXRjaCAgICAgID0gYml0bWFwLT5waXRjaDsKLSAgICBsaW5lICAgICAgID0gYml0bWFwLT5idWZmZXI7Ci0KLSAgICB3aWR0aCAgPSBkZWNvZGVyLT5tZXRyaWNzLT53aWR0aDsKLSAgICBoZWlnaHQgPSBkZWNvZGVyLT5tZXRyaWNzLT5oZWlnaHQ7Ci0KLSAgICBpZiAoIHhfcG9zIDwgMCB8fCB4X3BvcyArIHdpZHRoID4gYml0X3dpZHRoICAgfHwKLSAgICAgICAgIHlfcG9zIDwgMCB8fCB5X3BvcyArIGhlaWdodCA+IGJpdF9oZWlnaHQgKQotICAgIHsKLSAgICAgIGVycm9yID0gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIHAgKyAoICggd2lkdGggKyA3ICkgPj4gMyApICogaGVpZ2h0ID4gbGltaXQgKQotICAgIHsKLSAgICAgIGVycm9yID0gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBub3cgZG8gdGhlIGJsaXQgKi8KLSAgICBsaW5lICArPSB5X3BvcyAqIHBpdGNoICsgKCB4X3BvcyA+PiAzICk7Ci0gICAgeF9wb3MgJj0gNzsKLQotICAgIGlmICggeF9wb3MgPT0gMCApICAvKiB0aGUgZWFzeSBvbmUgKi8KLSAgICB7Ci0gICAgICBmb3IgKCBoID0gaGVpZ2h0OyBoID4gMDsgaC0tLCBsaW5lICs9IHBpdGNoICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIHdyaXRlID0gbGluZTsKLSAgICAgICAgRlRfSW50ICAgIHc7Ci0KLQotICAgICAgICBmb3IgKCB3ID0gd2lkdGg7IHcgPj0gODsgdyAtPSA4ICkKLSAgICAgICAgewotICAgICAgICAgIHdyaXRlWzBdID0gKEZUX0J5dGUpKCB3cml0ZVswXSB8ICpwKysgKTsKLSAgICAgICAgICB3cml0ZSAgICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHcgPiAwICkKLSAgICAgICAgICB3cml0ZVswXSA9IChGVF9CeXRlKSggd3JpdGVbMF0gfCAoICpwKysgJiAoIDB4RkYwMFUgPj4gdyApICkgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAgLyogeF9wb3MgPiAwICovCi0gICAgewotICAgICAgZm9yICggaCA9IGhlaWdodDsgaCA+IDA7IGgtLSwgbGluZSArPSBwaXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICB3cml0ZSA9IGxpbmU7Ci0gICAgICAgIEZUX0ludCAgICB3OwotICAgICAgICBGVF9VSW50ICAgd3ZhbCA9IDA7Ci0KLQotICAgICAgICBmb3IgKCB3ID0gd2lkdGg7IHcgPj0gODsgdyAtPSA4ICkKLSAgICAgICAgewotICAgICAgICAgIHd2YWwgICAgICA9IChGVF9VSW50KSggd3ZhbCB8ICpwKysgKTsKLSAgICAgICAgICB3cml0ZVswXSAgPSAoRlRfQnl0ZSkoIHdyaXRlWzBdIHwgKCB3dmFsID4+IHhfcG9zICkgKTsKLSAgICAgICAgICB3cml0ZSAgICArPSAxOwotICAgICAgICAgIHd2YWwgICAgPDw9IDg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHcgPiAwICkKLSAgICAgICAgICB3dmFsID0gKEZUX1VJbnQpKCB3dmFsIHwgKCAqcCsrICYgKCAweEZGMDBVID4+IHcgKSApICk7Ci0KLSAgICAgICAgLyogYWxsIGJpdHMgcmVhZCBhbmQgdGhlcmUgYXJlICggeF9wb3MgKyB3ICkgYml0cyB0byBiZSB3cml0dGVuICovCi0KLSAgICAgICAgd3JpdGVbMF0gPSAoRlRfQnl0ZSkoIHdyaXRlWzBdIHwgKCB3dmFsID4+IHhfcG9zICkgKTsKLQotICAgICAgICBpZiAoIHhfcG9zICsgdyA+IDggKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGUrKzsKLSAgICAgICAgICB3dmFsICAgPDw9IDg7Ci0gICAgICAgICAgd3JpdGVbMF0gPSAoRlRfQnl0ZSkoIHdyaXRlWzBdIHwgKCB3dmFsID4+IHhfcG9zICkgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdF9hbGlnbmVkKCBUVF9TQml0RGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gU0ZOVF9FcnJfT2s7Ci0gICAgRlRfQnl0ZSogICAgbGluZTsKLSAgICBGVF9JbnQgICAgICBiaXRfaGVpZ2h0LCBiaXRfd2lkdGgsIHBpdGNoLCB3aWR0aCwgaGVpZ2h0LCBoLCBuYml0czsKLSAgICBGVF9CaXRtYXAqICBiaXRtYXA7Ci0gICAgRlRfVVNob3J0ICAgcnZhbDsKLQotCi0gICAgaWYgKCAhZGVjb2Rlci0+Yml0bWFwX2FsbG9jYXRlZCApCi0gICAgewotICAgICAgZXJyb3IgPSB0dF9zYml0X2RlY29kZXJfYWxsb2NfYml0bWFwKCBkZWNvZGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoYXQgd2UgY2FuIHdyaXRlIHRoZSBnbHlwaCBpbnRvIHRoZSBiaXRtYXAgKi8KLSAgICBiaXRtYXAgICAgID0gZGVjb2Rlci0+Yml0bWFwOwotICAgIGJpdF93aWR0aCAgPSBiaXRtYXAtPndpZHRoOwotICAgIGJpdF9oZWlnaHQgPSBiaXRtYXAtPnJvd3M7Ci0gICAgcGl0Y2ggICAgICA9IGJpdG1hcC0+cGl0Y2g7Ci0gICAgbGluZSAgICAgICA9IGJpdG1hcC0+YnVmZmVyOwotCi0gICAgd2lkdGggID0gZGVjb2Rlci0+bWV0cmljcy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gZGVjb2Rlci0+bWV0cmljcy0+aGVpZ2h0OwotCi0gICAgaWYgKCB4X3BvcyA8IDAgfHwgeF9wb3MgKyB3aWR0aCAgPiBiaXRfd2lkdGggIHx8Ci0gICAgICAgICB5X3BvcyA8IDAgfHwgeV9wb3MgKyBoZWlnaHQgPiBiaXRfaGVpZ2h0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFNGTlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBwICsgKCAoIHdpZHRoICogaGVpZ2h0ICsgNyApID4+IDMgKSA+IGxpbWl0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFNGTlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbm93IGRvIHRoZSBibGl0ICovCi0gICAgbGluZSAgKz0geV9wb3MgKiBwaXRjaCArICggeF9wb3MgPj4gMyApOwotICAgIHhfcG9zICY9IDc7Ci0KLSAgICAvKiB0aGUgaGlnaGVyIGJ5dGUgb2YgYHJ2YWwnIGlzIHVzZWQgYXMgYSBidWZmZXIgKi8KLSAgICBydmFsICA9IDA7Ci0gICAgbmJpdHMgPSAwOwotCi0gICAgZm9yICggaCA9IGhlaWdodDsgaCA+IDA7IGgtLSwgbGluZSArPSBwaXRjaCApCi0gICAgewotICAgICAgRlRfQnl0ZSogIHdyaXRlID0gbGluZTsKLSAgICAgIEZUX0ludCAgICB3ID0gd2lkdGg7Ci0KLQotICAgICAgaWYgKCB4X3BvcyApCi0gICAgICB7Ci0gICAgICAgIHcgPSAoIHdpZHRoIDwgOCAtIHhfcG9zICkgPyB3aWR0aCA6IDggLSB4X3BvczsKLQotICAgICAgICBpZiAoIG5iaXRzIDwgdyApCi0gICAgICAgIHsKLSAgICAgICAgICBydmFsICB8PSAqcCsrOwotICAgICAgICAgIG5iaXRzICs9IDggLSB3OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJ2YWwgID4+PSA4OwotICAgICAgICAgIG5iaXRzICAtPSB3OwotICAgICAgICB9Ci0KLSAgICAgICAgKndyaXRlKysgfD0gKCAoIHJ2YWwgPj4gbmJpdHMgKSAmIDB4RkYgKSAmIH4oIDB4RkYgPDwgdyApOwotICAgICAgICBydmFsICAgIDw8PSA4OwotCi0gICAgICAgIHcgPSB3aWR0aCAtIHc7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIDsgdyA+PSA4OyB3IC09IDggKQotICAgICAgewotICAgICAgICBydmFsICAgICB8PSAqcCsrOwotICAgICAgICAqd3JpdGUrKyB8PSAoIHJ2YWwgPj4gbmJpdHMgKSAmIDB4RkY7Ci0KLSAgICAgICAgcnZhbCA8PD0gODsKLSAgICAgIH0KLQotICAgICAgaWYgKCB3ID4gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggbmJpdHMgPCB3ICkKLSAgICAgICAgewotICAgICAgICAgIHJ2YWwgICB8PSAqcCsrOwotICAgICAgICAgICp3cml0ZSB8PSAoICggcnZhbCA+PiBuYml0cyApICYgMHhGRiApICYgKCAweEZGMDBVID4+IHcgKTsKLSAgICAgICAgICBuYml0cyAgKz0gOCAtIHc7Ci0KLSAgICAgICAgICBydmFsIDw8PSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICp3cml0ZSB8PSAoICggcnZhbCA+PiBuYml0cyApICYgMHhGRiApICYgKCAweEZGMDBVID4+IHcgKTsKLSAgICAgICAgICBuYml0cyAgLT0gdzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2NvbXBvdW5kKCBUVF9TQml0RGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IFNGTlRfRXJyX09rOwotICAgIEZUX1VJbnQgICBudW1fY29tcG9uZW50cywgbm47Ci0KLQotICAgIGlmICggcCArIDIgPiBsaW1pdCApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBudW1fY29tcG9uZW50cyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgaWYgKCBwICsgNCAqIG51bV9jb21wb25lbnRzID4gbGltaXQgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9jb21wb25lbnRzOyBubisrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBnaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgRlRfQnl0ZSAgZHggICAgID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICBGVF9CeXRlICBkeSAgICAgPSBGVF9ORVhUX0JZVEUoIHAgKTsKLQotCi0gICAgICAvKiBOQjogYSByZWN1cnNpdmUgY2FsbCAqLwotICAgICAgZXJyb3IgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSggZGVjb2RlciwgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9wb3MgKyBkeCwgeV9wb3MgKyBkeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIGVycm9yID0gU0ZOVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdDsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRtYXAoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnbHlwaF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGdseXBoX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBnbHlwaF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeV9wb3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGRlY29kZXItPnN0cmVhbTsKLSAgICBGVF9CeXRlKiAgIHA7Ci0gICAgRlRfQnl0ZSogICBwX2xpbWl0OwotICAgIEZUX0J5dGUqICAgZGF0YTsKLQotCi0gICAgLyogc2VlayBpbnRvIHRoZSBFQkRUIHRhYmxlIG5vdyAqLwotICAgIGlmICggZ2x5cGhfc3RhcnQgKyBnbHlwaF9zaXplID4gZGVjb2Rlci0+ZWJkdF9zaXplICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFNGTlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZGVjb2Rlci0+ZWJkdF9zdGFydCArIGdseXBoX3N0YXJ0ICkgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VYVFJBQ1QoIGdseXBoX3NpemUsIGRhdGEgKSAgICAgICAgICAgICAgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBwICAgICAgID0gZGF0YTsKLSAgICBwX2xpbWl0ID0gcCArIGdseXBoX3NpemU7Ci0KLSAgICAvKiByZWFkIHRoZSBkYXRhLCBkZXBlbmRpbmcgb24gdGhlIGdseXBoIGZvcm1hdCAqLwotICAgIHN3aXRjaCAoIGdseXBoX2Zvcm1hdCApCi0gICAgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA4OgotICAgICAgZXJyb3IgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9tZXRyaWNzKCBkZWNvZGVyLCAmcCwgcF9saW1pdCwgMCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgIGNhc2UgOToKLSAgICAgIGVycm9yID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyggZGVjb2RlciwgJnAsIHBfbGltaXQsIDEgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gU0ZOVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICB7Ci0gICAgICBUVF9TQml0RGVjb2Rlcl9Mb2FkRnVuYyAgbG9hZGVyOwotCi0KLSAgICAgIHN3aXRjaCAoIGdseXBoX2Zvcm1hdCApCi0gICAgICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICBjYXNlIDY6Ci0gICAgICAgIGxvYWRlciA9IHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2J5dGVfYWxpZ25lZDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjoKLSAgICAgIGNhc2UgNToKLSAgICAgIGNhc2UgNzoKLSAgICAgICAgbG9hZGVyID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDg6Ci0gICAgICAgIGlmICggcCArIDEgPiBwX2xpbWl0ICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcCArPSAxOyAgLyogc2tpcCBwYWRkaW5nICovCi0gICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLwotCi0gICAgICBjYXNlIDk6Ci0gICAgICAgIGxvYWRlciA9IHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2NvbXBvdW5kOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICBlcnJvciA9IGxvYWRlciggZGVjb2RlciwgcCwgcF9saW1pdCwgeF9wb3MsIHlfcG9zICk7Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgRlRfRlJBTUVfUkVMRUFTRSggZGF0YSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2UoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zICkKLSAgewotICAgIC8qCi0gICAgICogIEZpcnN0LCB3ZSBmaW5kIHRoZSBjb3JyZWN0IHN0cmlrZSByYW5nZSB0aGF0IGFwcGxpZXMgdG8gdGhpcwotICAgICAqICBnbHlwaCBpbmRleC4KLSAgICAgKi8KLQotICAgIEZUX0J5dGUqICBwICAgICAgICAgID0gZGVjb2Rlci0+ZWJsY19iYXNlICsgZGVjb2Rlci0+c3RyaWtlX2luZGV4X2FycmF5OwotICAgIEZUX0J5dGUqICBwX2xpbWl0ICAgID0gZGVjb2Rlci0+ZWJsY19saW1pdDsKLSAgICBGVF9VTG9uZyAgbnVtX3JhbmdlcyA9IGRlY29kZXItPnN0cmlrZV9pbmRleF9jb3VudDsKLSAgICBGVF9VSW50ICAgc3RhcnQsIGVuZCwgaW5kZXhfZm9ybWF0LCBpbWFnZV9mb3JtYXQ7Ci0gICAgRlRfVUxvbmcgIGltYWdlX3N0YXJ0ID0gMCwgaW1hZ2VfZW5kID0gMCwgaW1hZ2Vfb2Zmc2V0OwotCi0KLSAgICBmb3IgKCA7IG51bV9yYW5nZXMgPiAwOyBudW1fcmFuZ2VzLS0gKQotICAgIHsKLSAgICAgIHN0YXJ0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGVuZCAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBnbHlwaF9pbmRleCA+PSBzdGFydCAmJiBnbHlwaF9pbmRleCA8PSBlbmQgKQotICAgICAgICBnb3RvIEZvdW5kUmFuZ2U7Ci0KLSAgICAgIHAgKz0gNDsgIC8qIGlnbm9yZSBpbmRleCBvZmZzZXQgKi8KLSAgICB9Ci0gICAgZ290byBOb0JpdG1hcDsKLQotICBGb3VuZFJhbmdlOgotICAgIGltYWdlX29mZnNldCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIC8qIG92ZXJmbG93IGNoZWNrICovCi0gICAgaWYgKCBkZWNvZGVyLT5lYmxjX2Jhc2UgKyBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfYXJyYXkgKyBpbWFnZV9vZmZzZXQgPAotICAgICAgICAgICBkZWNvZGVyLT5lYmxjX2Jhc2UgKQotICAgICAgZ290byBGYWlsdXJlOwotCi0gICAgcCA9IGRlY29kZXItPmVibGNfYmFzZSArIGRlY29kZXItPnN0cmlrZV9pbmRleF9hcnJheSArIGltYWdlX29mZnNldDsKLSAgICBpZiAoIHAgKyA4ID4gcF9saW1pdCApCi0gICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgLyogbm93IGZpbmQgdGhlIGdseXBoJ3MgbG9jYXRpb24gYW5kIGV4dGVuZCB3aXRoaW4gdGhlIGViZHQgdGFibGUgKi8KLSAgICBpbmRleF9mb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGltYWdlX2Zvcm1hdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgaW1hZ2Vfb2Zmc2V0ID0gRlRfTkVYVF9VTE9ORyAoIHAgKTsKLQotICAgIHN3aXRjaCAoIGluZGV4X2Zvcm1hdCApCi0gICAgewotICAgIGNhc2UgMTogLyogNC1ieXRlIG9mZnNldHMgcmVsYXRpdmUgdG8gYGltYWdlX29mZnNldCcgKi8KLSAgICAgIHsKLSAgICAgICAgcCArPSA0ICogKCBnbHlwaF9pbmRleCAtIHN0YXJ0ICk7Ci0gICAgICAgIGlmICggcCArIDggPiBwX2xpbWl0ICkKLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgICAgIGltYWdlX3N0YXJ0ID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBpbWFnZV9lbmQgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICBpZiAoIGltYWdlX3N0YXJ0ID09IGltYWdlX2VuZCApICAvKiBtaXNzaW5nIGdseXBoICovCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOiAvKiBiaWcgbWV0cmljcywgY29uc3RhbnQgaW1hZ2Ugc2l6ZSAqLwotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgaW1hZ2Vfc2l6ZTsKLQotCi0gICAgICAgIGlmICggcCArIDEyID4gcF9saW1pdCApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBpbWFnZV9zaXplID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIGlmICggdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyggZGVjb2RlciwgJnAsIHBfbGltaXQsIDEgKSApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBpbWFnZV9zdGFydCA9IGltYWdlX3NpemUgKiAoIGdseXBoX2luZGV4IC0gc3RhcnQgKTsKLSAgICAgICAgaW1hZ2VfZW5kICAgPSBpbWFnZV9zdGFydCArIGltYWdlX3NpemU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzogLyogMi1ieXRlIG9mZnNldHMgcmVsYXRpdmUgdG8gJ2ltYWdlX29mZnNldCcgKi8KLSAgICAgIHsKLSAgICAgICAgcCArPSAyICogKCBnbHlwaF9pbmRleCAtIHN0YXJ0ICk7Ci0gICAgICAgIGlmICggcCArIDQgPiBwX2xpbWl0ICkKLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgICAgIGltYWdlX3N0YXJ0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgaW1hZ2VfZW5kICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAgIGlmICggaW1hZ2Vfc3RhcnQgPT0gaW1hZ2VfZW5kICkgIC8qIG1pc3NpbmcgZ2x5cGggKi8KLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6IC8qIHNwYXJzZSBnbHlwaCBhcnJheSB3aXRoIChnbHlwaCxvZmZzZXQpIHBhaXJzICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBtbSwgbnVtX2dseXBoczsKLQotCi0gICAgICAgIGlmICggcCArIDQgPiBwX2xpbWl0ICkKLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgICAgIG51bV9nbHlwaHMgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgICAgLyogb3ZlcmZsb3cgY2hlY2sgKi8KLSAgICAgICAgaWYgKCBwICsgKCBudW1fZ2x5cGhzICsgMSApICogNCA8IHAgKQotICAgICAgICAgIGdvdG8gRmFpbHVyZTsKLQotICAgICAgICBpZiAoIHAgKyAoIG51bV9nbHlwaHMgKyAxICkgKiA0ID4gcF9saW1pdCApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBmb3IgKCBtbSA9IDA7IG1tIDwgbnVtX2dseXBoczsgbW0rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBnaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgICAgICBpZiAoIGdpbmRleCA9PSBnbHlwaF9pbmRleCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaW1hZ2Vfc3RhcnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICAgICAgcCAgICAgICAgICArPSAyOwotICAgICAgICAgICAgaW1hZ2VfZW5kICAgPSBGVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbW0gPj0gbnVtX2dseXBocyApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA1OiAvKiBjb25zdGFudCBtZXRyaWNzIHdpdGggc3BhcnNlIGdseXBoIGNvZGVzICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBpbWFnZV9zaXplLCBtbSwgbnVtX2dseXBoczsKLQotCi0gICAgICAgIGlmICggcCArIDE2ID4gcF9saW1pdCApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBpbWFnZV9zaXplID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIGlmICggdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyggZGVjb2RlciwgJnAsIHBfbGltaXQsIDEgKSApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBudW1fZ2x5cGhzID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIC8qIG92ZXJmbG93IGNoZWNrICovCi0gICAgICAgIGlmICggcCArIDIgKiBudW1fZ2x5cGhzIDwgcCApCi0gICAgICAgICAgZ290byBGYWlsdXJlOwotCi0gICAgICAgIGlmICggcCArIDIgKiBudW1fZ2x5cGhzID4gcF9saW1pdCApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBmb3IgKCBtbSA9IDA7IG1tIDwgbnVtX2dseXBoczsgbW0rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBnaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgICAgICBpZiAoIGdpbmRleCA9PSBnbHlwaF9pbmRleCApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbW0gPj0gbnVtX2dseXBocyApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBpbWFnZV9zdGFydCA9IGltYWdlX3NpemUgKiBtbTsKLSAgICAgICAgaW1hZ2VfZW5kICAgPSBpbWFnZV9zdGFydCArIGltYWdlX3NpemU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBnb3RvIE5vQml0bWFwOwotICAgIH0KLQotICAgIGlmICggaW1hZ2Vfc3RhcnQgPiBpbWFnZV9lbmQgKQotICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgIGltYWdlX2VuZCAgLT0gaW1hZ2Vfc3RhcnQ7Ci0gICAgaW1hZ2Vfc3RhcnQgPSBpbWFnZV9vZmZzZXQgKyBpbWFnZV9zdGFydDsKLQotICAgIHJldHVybiB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRtYXAoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3BvcyApOwotCi0gIEZhaWx1cmU6Ci0gICAgcmV0dXJuIFNGTlRfRXJyX0ludmFsaWRfVGFibGU7Ci0KLSAgTm9CaXRtYXA6Ci0gICAgcmV0dXJuIFNGTlRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9zYml0X2ltYWdlKCBUVF9GYWNlICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAgICAgICAgICAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzUmVjICAqbWV0cmljcyApCi0gIHsKLSAgICBUVF9TQml0RGVjb2RlclJlYyAgZGVjb2RlclsxXTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3I7Ci0KLSAgICBGVF9VTlVTRUQoIGxvYWRfZmxhZ3MgKTsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotICAgIEZUX1VOVVNFRCggbWFwICk7Ci0KLQotICAgIGVycm9yID0gdHRfc2JpdF9kZWNvZGVyX2luaXQoIGRlY29kZXIsIGZhY2UsIHN0cmlrZV9pbmRleCwgbWV0cmljcyApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2ltYWdlKCBkZWNvZGVyLCBnbHlwaF9pbmRleCwgMCwgMCApOwotICAgICAgdHRfc2JpdF9kZWNvZGVyX2RvbmUoIGRlY29kZXIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotLyogRU9GICovCmRpZmYgLS1naXQgYS9zcmMvc21vb3RoL2Z0Z3JheXMuYyBiL3NyYy9zbW9vdGgvZnRncmF5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGQxZGQyLi4wMDAwMDAwCi0tLSBhL3NyYy9zbW9vdGgvZnRncmF5cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdyYXlzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQSBuZXcgYHBlcmZlY3QnIGFudGktYWxpYXNpbmcgcmVuZGVyZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IHRoZSByZXN0IG9mIHRoZSBGcmVlVHlwZSBlbmdpbmUsIGJ5ICovCi0gIC8qIGRlZmluaW5nIHRoZSBfU1RBTkRBTE9ORV8gbWFjcm8gd2hlbiBjb21waWxpbmcgaXQuICBZb3UgYWxzbyBuZWVkIHRvICAqLwotICAvKiBwdXQgdGhlIGZpbGVzIGBmdGdyYXlzLmgnIGFuZCBgZnRpbWFnZS5oJyBpbnRvIHRoZSBjdXJyZW50ICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgVHlwaWNhbGx5LCB5b3UgY291bGQgZG8gc29tZXRoaW5nIGxpa2UgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNvcHkgYHNyYy9zbW9vdGgvZnRncmF5cy5jJyAodGhpcyBmaWxlKSB0byB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29weSBgaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgnIGFuZCBgc3JjL3Ntb290aC9mdGdyYXlzLmgnIHRvIHRoZSAqLwotICAvKiAgIHNhbWUgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29tcGlsZSBgZnRncmF5cycgd2l0aCB0aGUgX1NUQU5EQUxPTkVfIG1hY3JvIGRlZmluZWQsIGFzIGluICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNjIC1jIC1EX1NUQU5EQUxPTkVfIGZ0Z3JheXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgcmVuZGVyZXIgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggYSBjYWxsIHRvICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYGZ0X2dyYXlfcmFzdGVyLnJhc3Rlcl9uZXcnOyBhbiBhbnRpLWFsaWFzZWQgYml0bWFwIGNhbiBiZSBnZW5lcmF0ZWQgICovCi0gIC8qIHdpdGggYSBjYWxsIHRvIGBmdF9ncmF5X3Jhc3Rlci5yYXN0ZXJfcmVuZGVyJy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2VlIHRoZSBjb21tZW50cyBhbmQgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZmlsZSBgZnRpbWFnZS5oJyBmb3IgbW9yZSAgICovCi0gIC8qIGRldGFpbHMgb24gaG93IHRoZSByYXN0ZXIgd29ya3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIGEgbmV3IGFudGktYWxpYXNpbmcgc2Nhbi1jb252ZXJ0ZXIgZm9yIEZyZWVUeXBlIDIuICBUaGUgICAgICAgKi8KLSAgLyogYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBfdmVyeV8gZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpbiB0aGUgc3RhbmRhcmQgICovCi0gIC8qIGBmdHJhc3RlcicgbW9kdWxlLiAgQWN0dWFsbHksIGBmdGdyYXlzJyBjb21wdXRlcyB0aGUgX2V4YWN0XyAgICAgICAgICAqLwotICAvKiBjb3ZlcmFnZSBvZiB0aGUgb3V0bGluZSBvbiBlYWNoIHBpeGVsIGNlbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIGJhc2VkIG9uIGlkZWFzIHRoYXQgSSBpbml0aWFsbHkgZm91bmQgaW4gUmFwaCBMZXZpZW4ncyAgICAgICAgICAqLwotICAvKiBleGNlbGxlbnQgTGliQXJ0IGdyYXBoaWNzIGxpYnJhcnkgKHNlZSBodHRwOi8vd3d3Lmxldmllbi5jb20vbGliYXJ0ICAgKi8KLSAgLyogZm9yIG1vcmUgaW5mb3JtYXRpb24sIHRob3VnaCB0aGUgd2ViIHBhZ2VzIGRvIG5vdCB0ZWxsIGFueXRoaW5nICAgICAgICovCi0gIC8qIGFib3V0IHRoZSByZW5kZXJlcjsgeW91J2xsIGhhdmUgdG8gZGl2ZSBpbnRvIHRoZSBzb3VyY2UgY29kZSB0byAgICAgICAqLwotICAvKiB1bmRlcnN0YW5kIGhvdyBpdCB3b3JrcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhpcyBpcyBhIF92ZXJ5XyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gICAgICAgICAqLwotICAvKiBjb21wYXJlZCB0byBSYXBoJ3MuICBDb3ZlcmFnZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYSB2ZXJ5ICAgICAgICAgKi8KLSAgLyogZGlmZmVyZW50IHdheSwgYW5kIEkgZG9uJ3QgdXNlIHNvcnRlZCB2ZWN0b3IgcGF0aHMuICBBbHNvLCBpdCBkb2Vzbid0ICovCi0gIC8qIHVzZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyByZW5kZXJlciBoYXMgdGhlIGZvbGxvd2luZyBhZHZhbnRhZ2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEl0IGRvZXNuJ3QgbmVlZCBhbiBpbnRlcm1lZGlhdGUgYml0bWFwLiAgSW5zdGVhZCwgb25lIGNhbiBzdXBwbHkgYSAgKi8KLSAgLyogICBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSByZW5kZXJlciB0byBkcmF3IGdyYXkgICovCi0gIC8qICAgc3BhbnMgb24gYW55IHRhcmdldCBzdXJmYWNlLiAgWW91IGNhbiB0aHVzIGRvIGRpcmVjdCBjb21wb3NpdGlvbiBvbiAqLwotICAvKiAgIGFueSBraW5kIG9mIGJpdG1hcCwgcHJvdmlkZWQgdGhhdCB5b3UgZ2l2ZSB0aGUgcmVuZGVyZXIgdGhlIHJpZ2h0ICAgKi8KLSAgLyogICBjYWxsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEEgcGVyZmVjdCBhbnRpLWFsaWFzZXIsIGkuZS4sIGl0IGNvbXB1dGVzIHRoZSBfZXhhY3RfIGNvdmVyYWdlIG9uICAgKi8KLSAgLyogICBlYWNoIHBpeGVsIGNlbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEl0IHBlcmZvcm1zIGEgc2luZ2xlIHBhc3Mgb24gdGhlIG91dGxpbmUgKHRoZSBgc3RhbmRhcmQnIEZUMiAgICAgICAgKi8KLSAgLyogICByZW5kZXJlciBtYWtlcyB0d28gcGFzc2VzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEl0IGNhbiBlYXNpbHkgYmUgbW9kaWZpZWQgdG8gcmVuZGVyIHRvIF9hbnlfIG51bWJlciBvZiBncmF5IGxldmVscyAgKi8KLSAgLyogICBjaGVhcGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEZvciBzbWFsbCAoPCAyMCkgcGl4ZWwgc2l6ZXMsIGl0IGlzIGZhc3RlciB0aGFuIHRoZSBzdGFuZGFyZCAgICAgICAgKi8KLSAgLyogICByZW5kZXJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3Ntb290aAotCi0KLQotCi0jaWZkZWYgX1NUQU5EQUxPTkVfCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgLyogZm9yIGZ0X21lbWNweSgpICovCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jZGVmaW5lIEZUX1VJTlRfTUFYICBVSU5UX01BWAotCi0jZGVmaW5lIGZ0X21lbXNldCAgIG1lbXNldAotCi0jZGVmaW5lIGZ0X3NldGptcCAgIHNldGptcAotI2RlZmluZSBmdF9sb25nam1wICBsb25nam1wCi0jZGVmaW5lIGZ0X2ptcF9idWYgIGptcF9idWYKLQotCi0jZGVmaW5lIEVyclJhc3Rlcl9JbnZhbGlkX01vZGUgICAgICAtMgotI2RlZmluZSBFcnJSYXN0ZXJfSW52YWxpZF9PdXRsaW5lICAgLTEKLSNkZWZpbmUgRXJyUmFzdGVyX0ludmFsaWRfQXJndW1lbnQgIC0zCi0jZGVmaW5lIEVyclJhc3Rlcl9NZW1vcnlfT3ZlcmZsb3cgICAtNAotCi0jZGVmaW5lIEZUX0JFR0lOX0hFQURFUgotI2RlZmluZSBGVF9FTkRfSEVBREVSCi0KLSNpbmNsdWRlICJmdGltYWdlLmgiCi0jaW5jbHVkZSAiZnRncmF5cy5oIgotCi0gIC8qIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHVudXNlZC4gKi8KLSAgLyogSXRzIHB1cnBvc2UgaXMgc2ltcGx5IHRvIHJlZHVjZSBjb21waWxlciB3YXJuaW5ncy4gIE5vdGUgYWxzbyB0aGF0ICAqLwotICAvKiBzaW1wbHkgZGVmaW5pbmcgaXQgYXMgYCh2b2lkKXgnIGRvZXNuJ3QgYXZvaWQgd2FybmluZ3Mgd2l0aCBjZXJ0YWluICovCi0gIC8qIEFOU0kgY29tcGlsZXJzIChlLmcuIExDQykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfVU5VU0VEKCB4ICkgICh4KSA9ICh4KQotCi0gIC8qIERpc2FibGUgdGhlIHRyYWNpbmcgbWVjaGFuaXNtIGZvciBzaW1wbGljaXR5IC0tIGRldmVsb3BlcnMgY2FuICAgICAgKi8KLSAgLyogYWN0aXZhdGUgaXQgZWFzaWx5IGJ5IHJlZGVmaW5pbmcgdGhlc2UgdHdvIG1hY3Jvcy4gICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FUlJPUgotI2RlZmluZSBGVF9FUlJPUiggeCApICBkbyA7IHdoaWxlICggMCApICAgICAvKiBub3RoaW5nICovCi0jZW5kaWYKLQotI2lmbmRlZiBGVF9UUkFDRQotI2RlZmluZSBGVF9UUkFDRSggeCApICBkbyA7IHdoaWxlICggMCApICAgICAvKiBub3RoaW5nICovCi0jZW5kaWYKLQotI2Vsc2UgLyogIV9TVEFOREFMT05FXyAqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJmdGdyYXlzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotCi0jaW5jbHVkZSAiZnRzbWVycnMuaCIKLQotI2RlZmluZSBFcnJSYXN0ZXJfSW52YWxpZF9Nb2RlICAgICAgU21vb3RoX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoCi0jZGVmaW5lIEVyclJhc3Rlcl9JbnZhbGlkX091dGxpbmUgICBTbW9vdGhfRXJyX0ludmFsaWRfT3V0bGluZQotI2RlZmluZSBFcnJSYXN0ZXJfTWVtb3J5X092ZXJmbG93ICAgU21vb3RoX0Vycl9PdXRfT2ZfTWVtb3J5Ci0jZGVmaW5lIEVyclJhc3Rlcl9JbnZhbGlkX0FyZ3VtZW50ICBTbW9vdGhfRXJyX0JhZF9Bcmd1bWVudAotCi0jZW5kaWYgLyogIV9TVEFOREFMT05FXyAqLwotCi0KLSNpZm5kZWYgRlRfTUVNX1NFVAotI2RlZmluZSBGVF9NRU1fU0VUKCBkLCBzLCBjICkgIGZ0X21lbXNldCggZCwgcywgYyApCi0jZW5kaWYKLQotI2lmbmRlZiBGVF9NRU1fWkVSTwotI2RlZmluZSBGVF9NRU1fWkVSTyggZGVzdCwgY291bnQgKSAgRlRfTUVNX1NFVCggZGVzdCwgMCwgY291bnQgKQotI2VuZGlmCi0KLSAgLyogZGVmaW5lIHRoaXMgdG8gZHVtcCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgeHh4REVCVUdfR1JBWVMKLQotCi0gIC8qIGFzIHVzdWFsLCBmb3IgdGhlIHNwZWVkIGh1bmdyeSA6LSkgKi8KLQotI2lmbmRlZiBGVF9TVEFUSUNfUkFTVEVSCi0KLQotI2RlZmluZSBSQVNfQVJHICAgUFdvcmtlciAgd29ya2VyCi0jZGVmaW5lIFJBU19BUkdfICBQV29ya2VyICB3b3JrZXIsCi0KLSNkZWZpbmUgUkFTX1ZBUiAgIHdvcmtlcgotI2RlZmluZSBSQVNfVkFSXyAgd29ya2VyLAotCi0jZGVmaW5lIHJhcyAgICAgICAoKndvcmtlcikKLQotCi0jZWxzZSAvKiBGVF9TVEFUSUNfUkFTVEVSICovCi0KLQotI2RlZmluZSBSQVNfQVJHICAgLyogZW1wdHkgKi8KLSNkZWZpbmUgUkFTX0FSR18gIC8qIGVtcHR5ICovCi0jZGVmaW5lIFJBU19WQVIgICAvKiBlbXB0eSAqLwotI2RlZmluZSBSQVNfVkFSXyAgLyogZW1wdHkgKi8KLQotICBzdGF0aWMgVFdvcmtlciAgcmFzOwotCi0KLSNlbmRpZiAvKiBGVF9TVEFUSUNfUkFTVEVSICovCi0KLQotICAvKiBtdXN0IGJlIGF0IGxlYXN0IDYgYml0cyEgKi8KLSNkZWZpbmUgUElYRUxfQklUUyAgOAotCi0jZGVmaW5lIE9ORV9QSVhFTCAgICAgICAoIDFMIDw8IFBJWEVMX0JJVFMgKQotI2RlZmluZSBQSVhFTF9NQVNLICAgICAgKCAtMUwgPDwgUElYRUxfQklUUyApCi0jZGVmaW5lIFRSVU5DKCB4ICkgICAgICAoIChUQ29vcmQpKCAoeCkgPj4gUElYRUxfQklUUyApICkKLSNkZWZpbmUgU1VCUElYRUxTKCB4ICkgICggKFRQb3MpKHgpIDw8IFBJWEVMX0JJVFMgKQotI2RlZmluZSBGTE9PUiggeCApICAgICAgKCAoeCkgJiAtT05FX1BJWEVMICkKLSNkZWZpbmUgQ0VJTElORyggeCApICAgICggKCAoeCkgKyBPTkVfUElYRUwgLSAxICkgJiAtT05FX1BJWEVMICkKLSNkZWZpbmUgUk9VTkQoIHggKSAgICAgICggKCAoeCkgKyBPTkVfUElYRUwgLyAyICkgJiAtT05FX1BJWEVMICkKLQotI2lmIFBJWEVMX0JJVFMgPj0gNgotI2RlZmluZSBVUFNDQUxFKCB4ICkgICAgKCAoeCkgPDwgKCBQSVhFTF9CSVRTIC0gNiApICkKLSNkZWZpbmUgRE9XTlNDQUxFKCB4ICkgICggKHgpID4+ICggUElYRUxfQklUUyAtIDYgKSApCi0jZWxzZQotI2RlZmluZSBVUFNDQUxFKCB4ICkgICAgKCAoeCkgPj4gKCA2IC0gUElYRUxfQklUUyApICkKLSNkZWZpbmUgRE9XTlNDQUxFKCB4ICkgICggKHgpIDw8ICggNiAtIFBJWEVMX0JJVFMgKSApCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIGRvbid0IGNoYW5nZSB0aGUgZm9sbG93aW5nIHR5cGVzIHRvIEZUX0ludCBvciBGVF9Qb3MsIHNpbmNlIHdlIG1pZ2h0ICovCi0gIC8qIG5lZWQgdG8gZGVmaW5lIHRoZW0gdG8gImZsb2F0IiBvciAiZG91YmxlIiB3aGVuIGV4cGVyaW1lbnRpbmcgd2l0aCAgICovCi0gIC8qIG5ldyBhbGdvcml0aG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgdHlwZWRlZiBpbnQgICBUQ29vcmQ7ICAgLyogaW50ZWdlciBzY2FubGluZS9waXhlbCBjb29yZGluYXRlICovCi0gIHR5cGVkZWYgbG9uZyAgVFBvczsgICAgIC8qIHN1Yi1waXhlbCBjb29yZGluYXRlICAgICAgICAgICAgICAqLwotCi0gIC8qIGRldGVybWluZSB0aGUgdHlwZSB1c2VkIHRvIHN0b3JlIGNlbGwgYXJlYXMuICBUaGlzIG5vcm1hbGx5IHRha2VzIGF0ICovCi0gIC8qIGxlYXN0IFBJWEVMX0JJVFMqMiArIDEgYml0cy4gIE9uIDE2LWJpdCBzeXN0ZW1zLCB3ZSBuZWVkIHRvIHVzZSAgICAgICovCi0gIC8qIGBsb25nJyBpbnN0ZWFkIG9mIGBpbnQnLCBvdGhlcndpc2UgYmFkIHRoaW5ncyBoYXBwZW4gICAgICAgICAgICAgICAgICovCi0KLSNpZiBQSVhFTF9CSVRTIDw9IDcKLQotICB0eXBlZGVmIGludCAgVEFyZWE7Ci0KLSNlbHNlIC8qIFBJWEVMX0JJVFMgPj0gOCAqLwotCi0gIC8qIGFwcHJveGltYXRlbHkgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGludGVnZXJzIHVzaW5nIGFuIEFOU0ktQyBoZWFkZXIgKi8KLSNpZiBGVF9VSU5UX01BWCA9PSAweEZGRkZVCi0gIHR5cGVkZWYgbG9uZyAgVEFyZWE7Ci0jZWxzZQotICB0eXBlZGVmIGludCAgIFRBcmVhOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBQSVhFTF9CSVRTID49IDggKi8KLQotCi0gIC8qIG1heGltYWwgbnVtYmVyIG9mIGdyYXkgc3BhbnMgaW4gYSBjYWxsIHRvIHRoZSBzcGFuIGNhbGxiYWNrICovCi0jZGVmaW5lIEZUX01BWF9HUkFZX1NQQU5TICAzMgotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgVENlbGxfKiAgUENlbGw7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRDZWxsXwotICB7Ci0gICAgaW50ICAgIHg7Ci0gICAgaW50ICAgIGNvdmVyOwotICAgIFRBcmVhICBhcmVhOwotICAgIFBDZWxsICBuZXh0OwotCi0gIH0gVENlbGw7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVFdvcmtlcl8KLSAgewotICAgIFRDb29yZCAgZXgsIGV5OwotICAgIFRQb3MgICAgbWluX2V4LCBtYXhfZXg7Ci0gICAgVFBvcyAgICBtaW5fZXksIG1heF9leTsKLSAgICBUUG9zICAgIGNvdW50X2V4LCBjb3VudF9leTsKLQotICAgIFRBcmVhICAgYXJlYTsKLSAgICBpbnQgICAgIGNvdmVyOwotICAgIGludCAgICAgaW52YWxpZDsKLQotICAgIFBDZWxsICAgY2VsbHM7Ci0gICAgaW50ICAgICBtYXhfY2VsbHM7Ci0gICAgaW50ICAgICBudW1fY2VsbHM7Ci0KLSAgICBUQ29vcmQgIGN4LCBjeTsKLSAgICBUUG9zICAgIHgsICB5OwotCi0gICAgVFBvcyAgICBsYXN0X2V5OwotCi0gICAgRlRfVmVjdG9yICAgYmV6X3N0YWNrWzMyICogMyArIDFdOwotICAgIGludCAgICAgICAgIGxldl9zdGFja1szMl07Ci0KLSAgICBGVF9PdXRsaW5lICBvdXRsaW5lOwotICAgIEZUX0JpdG1hcCAgIHRhcmdldDsKLSAgICBGVF9CQm94ICAgICBjbGlwX2JveDsKLQotICAgIEZUX1NwYW4gICAgIGdyYXlfc3BhbnNbRlRfTUFYX0dSQVlfU1BBTlNdOwotICAgIGludCAgICAgICAgIG51bV9ncmF5X3NwYW5zOwotCi0gICAgRlRfUmFzdGVyX1NwYW5fRnVuYyAgcmVuZGVyX3NwYW47Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgcmVuZGVyX3NwYW5fZGF0YTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBzcGFuX3k7Ci0KLSAgICBpbnQgIGJhbmRfc2l6ZTsKLSAgICBpbnQgIGJhbmRfc2hvb3Q7Ci0gICAgaW50ICBjb25pY19sZXZlbDsKLSAgICBpbnQgIGN1YmljX2xldmVsOwotCi0gICAgZnRfam1wX2J1ZiAganVtcF9idWZmZXI7Ci0KLSAgICB2b2lkKiAgICAgICBidWZmZXI7Ci0gICAgbG9uZyAgICAgICAgYnVmZmVyX3NpemU7Ci0KLSAgICBQQ2VsbCogICAgIHljZWxsczsKLSAgICBpbnQgICAgICAgIHljb3VudDsKLQotICB9IFRXb3JrZXIsICpQV29ya2VyOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgVFJhc3Rlcl8KLSAgewotICAgIHZvaWQqICAgIGJ1ZmZlcjsKLSAgICBsb25nICAgICBidWZmZXJfc2l6ZTsKLSAgICBpbnQgICAgICBiYW5kX3NpemU7Ci0gICAgdm9pZCogICAgbWVtb3J5OwotICAgIFBXb3JrZXIgIHdvcmtlcjsKLQotICB9IFRSYXN0ZXIsICpQUmFzdGVyOwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluaXRpYWxpemUgdGhlIGNlbGxzIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9pbml0X2NlbGxzKCBSQVNfQVJHXyB2b2lkKiAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBieXRlX3NpemUgKQotICB7Ci0gICAgcmFzLmJ1ZmZlciAgICAgID0gYnVmZmVyOwotICAgIHJhcy5idWZmZXJfc2l6ZSA9IGJ5dGVfc2l6ZTsKLQotICAgIHJhcy55Y2VsbHMgICAgICA9IChQQ2VsbCopIGJ1ZmZlcjsKLSAgICByYXMuY2VsbHMgICAgICAgPSBOVUxMOwotICAgIHJhcy5tYXhfY2VsbHMgICA9IDA7Ci0gICAgcmFzLm51bV9jZWxscyAgID0gMDsKLSAgICByYXMuYXJlYSAgICAgICAgPSAwOwotICAgIHJhcy5jb3ZlciAgICAgICA9IDA7Ci0gICAgcmFzLmludmFsaWQgICAgID0gMTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21wdXRlIHRoZSBvdXRsaW5lIGJvdW5kaW5nIGJveC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfY29tcHV0ZV9jYm94KCBSQVNfQVJHICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gJnJhcy5vdXRsaW5lOwotICAgIEZUX1ZlY3RvciogICB2ZWMgICAgID0gb3V0bGluZS0+cG9pbnRzOwotICAgIEZUX1ZlY3RvciogICBsaW1pdCAgID0gdmVjICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPD0gMCApCi0gICAgewotICAgICAgcmFzLm1pbl9leCA9IHJhcy5tYXhfZXggPSAwOwotICAgICAgcmFzLm1pbl9leSA9IHJhcy5tYXhfZXkgPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJhcy5taW5fZXggPSByYXMubWF4X2V4ID0gdmVjLT54OwotICAgIHJhcy5taW5fZXkgPSByYXMubWF4X2V5ID0gdmVjLT55OwotCi0gICAgdmVjKys7Ci0KLSAgICBmb3IgKCA7IHZlYyA8IGxpbWl0OyB2ZWMrKyApCi0gICAgewotICAgICAgVFBvcyAgeCA9IHZlYy0+eDsKLSAgICAgIFRQb3MgIHkgPSB2ZWMtPnk7Ci0KLQotICAgICAgaWYgKCB4IDwgcmFzLm1pbl9leCApIHJhcy5taW5fZXggPSB4OwotICAgICAgaWYgKCB4ID4gcmFzLm1heF9leCApIHJhcy5tYXhfZXggPSB4OwotICAgICAgaWYgKCB5IDwgcmFzLm1pbl9leSApIHJhcy5taW5fZXkgPSB5OwotICAgICAgaWYgKCB5ID4gcmFzLm1heF9leSApIHJhcy5tYXhfZXkgPSB5OwotICAgIH0KLQotICAgIC8qIHRydW5jYXRlIHRoZSBib3VuZGluZyBib3ggdG8gaW50ZWdlciBwaXhlbHMgKi8KLSAgICByYXMubWluX2V4ID0gcmFzLm1pbl9leCA+PiA2OwotICAgIHJhcy5taW5fZXkgPSByYXMubWluX2V5ID4+IDY7Ci0gICAgcmFzLm1heF9leCA9ICggcmFzLm1heF9leCArIDYzICkgPj4gNjsKLSAgICByYXMubWF4X2V5ID0gKCByYXMubWF4X2V5ICsgNjMgKSA+PiA2OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJlY29yZCB0aGUgY3VycmVudCBjZWxsIGluIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIFBDZWxsCi0gIGdyYXlfZmluZF9jZWxsKCBSQVNfQVJHICkKLSAgewotICAgIFBDZWxsICAqcGNlbGwsIGNlbGw7Ci0gICAgaW50ICAgICB4ID0gcmFzLmV4OwotCi0KLSAgICBpZiAoIHggPiByYXMubWF4X2V4ICkKLSAgICAgIHggPSByYXMubWF4X2V4OwotCi0gICAgcGNlbGwgPSAmcmFzLnljZWxsc1tyYXMuZXldOwotICAgIGZvciAoOzspCi0gICAgewotICAgICAgY2VsbCA9ICpwY2VsbDsKLSAgICAgIGlmICggY2VsbCA9PSBOVUxMIHx8IGNlbGwtPnggPiB4ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggY2VsbC0+eCA9PSB4ICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwY2VsbCA9ICZjZWxsLT5uZXh0OwotICAgIH0KLQotICAgIGlmICggcmFzLm51bV9jZWxscyA+PSByYXMubWF4X2NlbGxzICkKLSAgICAgIGZ0X2xvbmdqbXAoIHJhcy5qdW1wX2J1ZmZlciwgMSApOwotCi0gICAgY2VsbCAgICAgICAgPSByYXMuY2VsbHMgKyByYXMubnVtX2NlbGxzKys7Ci0gICAgY2VsbC0+eCAgICAgPSB4OwotICAgIGNlbGwtPmFyZWEgID0gMDsKLSAgICBjZWxsLT5jb3ZlciA9IDA7Ci0KLSAgICBjZWxsLT5uZXh0ICA9ICpwY2VsbDsKLSAgICAqcGNlbGwgICAgICA9IGNlbGw7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gY2VsbDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9yZWNvcmRfY2VsbCggUkFTX0FSRyApCi0gIHsKLSAgICBpZiAoICFyYXMuaW52YWxpZCAmJiAoIHJhcy5hcmVhIHwgcmFzLmNvdmVyICkgKQotICAgIHsKLSAgICAgIFBDZWxsICBjZWxsID0gZ3JheV9maW5kX2NlbGwoIFJBU19WQVIgKTsKLQotCi0gICAgICBjZWxsLT5hcmVhICArPSByYXMuYXJlYTsKLSAgICAgIGNlbGwtPmNvdmVyICs9IHJhcy5jb3ZlcjsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2V0IHRoZSBjdXJyZW50IGNlbGwgdG8gYSBuZXcgcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBncmF5X3NldF9jZWxsKCBSQVNfQVJHXyBUQ29vcmQgIGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIGV5ICkKLSAgewotICAgIC8qIE1vdmUgdGhlIGNlbGwgcG9pbnRlciB0byBhIG5ldyBwb3NpdGlvbi4gIFdlIHNldCB0aGUgYGludmFsaWQnICAgICAgKi8KLSAgICAvKiBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGNlbGwgaXNuJ3QgcGFydCBvZiB0aG9zZSB3ZSdyZSBpbnRlcmVzdGVkICovCi0gICAgLyogaW4gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuICBUaGlzIG1lYW5zIHRoYXQ6ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAuIHRoZSBuZXcgdmVydGljYWwgcG9zaXRpb24gbXVzdCBiZSB3aXRoaW4gbWluX2V5Li5tYXhfZXktMS4gICAgICAgICovCi0gICAgLyogLiB0aGUgbmV3IGhvcml6b250YWwgcG9zaXRpb24gbXVzdCBiZSBzdHJpY3RseSBsZXNzIHRoYW4gbWF4X2V4ICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBOb3RlIHRoYXQgaWYgYSBjZWxsIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBjbGlwcGluZyByZWdpb24sIGl0IGlzICAgICovCi0gICAgLyogYWN0dWFsbHkgc2V0IHRvIHRoZSAobWluX2V4LTEpIGhvcml6b250YWwgcG9zaXRpb24uICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogQWxsIGNlbGxzIHRoYXQgYXJlIG9uIHRoZSBsZWZ0IG9mIHRoZSBjbGlwcGluZyByZWdpb24gZ28gdG8gdGhlICovCi0gICAgLyogbWluX2V4IC0gMSBob3Jpem9udGFsIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZXkgLT0gcmFzLm1pbl9leTsKLQotICAgIGlmICggZXggPiByYXMubWF4X2V4ICkKLSAgICAgIGV4ID0gcmFzLm1heF9leDsKLQotICAgIGV4IC09IHJhcy5taW5fZXg7Ci0gICAgaWYgKCBleCA8IDAgKQotICAgICAgZXggPSAtMTsKLQotICAgIC8qIGFyZSB3ZSBtb3ZpbmcgdG8gYSBkaWZmZXJlbnQgY2VsbCA/ICovCi0gICAgaWYgKCBleCAhPSByYXMuZXggfHwgZXkgIT0gcmFzLmV5ICkKLSAgICB7Ci0gICAgICAvKiByZWNvcmQgdGhlIGN1cnJlbnQgb25lIGlmIGl0IGlzIHZhbGlkICovCi0gICAgICBpZiAoICFyYXMuaW52YWxpZCApCi0gICAgICAgIGdyYXlfcmVjb3JkX2NlbGwoIFJBU19WQVIgKTsKLQotICAgICAgcmFzLmFyZWEgID0gMDsKLSAgICAgIHJhcy5jb3ZlciA9IDA7Ci0gICAgfQotCi0gICAgcmFzLmV4ICAgICAgPSBleDsKLSAgICByYXMuZXkgICAgICA9IGV5OwotICAgIHJhcy5pbnZhbGlkID0gKCAodW5zaWduZWQpZXkgPj0gKHVuc2lnbmVkKXJhcy5jb3VudF9leSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXggPj0gcmFzLmNvdW50X2V4ICAgICAgICAgICApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YXJ0IGEgbmV3IGNvbnRvdXIgYXQgYSBnaXZlbiBjZWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9zdGFydF9jZWxsKCBSQVNfQVJHXyBUQ29vcmQgIGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDb29yZCAgZXkgKQotICB7Ci0gICAgaWYgKCBleCA+IHJhcy5tYXhfZXggKQotICAgICAgZXggPSAoVENvb3JkKSggcmFzLm1heF9leCApOwotCi0gICAgaWYgKCBleCA8IHJhcy5taW5fZXggKQotICAgICAgZXggPSAoVENvb3JkKSggcmFzLm1pbl9leCAtIDEgKTsKLQotICAgIHJhcy5hcmVhICAgID0gMDsKLSAgICByYXMuY292ZXIgICA9IDA7Ci0gICAgcmFzLmV4ICAgICAgPSBleCAtIHJhcy5taW5fZXg7Ci0gICAgcmFzLmV5ICAgICAgPSBleSAtIHJhcy5taW5fZXk7Ci0gICAgcmFzLmxhc3RfZXkgPSBTVUJQSVhFTFMoIGV5ICk7Ci0gICAgcmFzLmludmFsaWQgPSAwOwotCi0gICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gZXgsIGV5ICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmVuZGVyIGEgc2NhbmxpbmUgYXMgb25lIG9yIG1vcmUgY2VsbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBncmF5X3JlbmRlcl9zY2FubGluZSggUkFTX0FSR18gVENvb3JkICBleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDb29yZCAgeTIgKQotICB7Ci0gICAgVENvb3JkICBleDEsIGV4MiwgZngxLCBmeDIsIGRlbHRhOwotICAgIGxvbmcgICAgcCwgZmlyc3QsIGR4OwotICAgIGludCAgICAgaW5jciwgbGlmdCwgbW9kLCByZW07Ci0KLQotICAgIGR4ID0geDIgLSB4MTsKLQotICAgIGV4MSA9IFRSVU5DKCB4MSApOwotICAgIGV4MiA9IFRSVU5DKCB4MiApOwotICAgIGZ4MSA9IChUQ29vcmQpKCB4MSAtIFNVQlBJWEVMUyggZXgxICkgKTsKLSAgICBmeDIgPSAoVENvb3JkKSggeDIgLSBTVUJQSVhFTFMoIGV4MiApICk7Ci0KLSAgICAvKiB0cml2aWFsIGNhc2UuICBIYXBwZW5zIG9mdGVuICovCi0gICAgaWYgKCB5MSA9PSB5MiApCi0gICAgewotICAgICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gZXgyLCBleSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGV2ZXJ5dGhpbmcgaXMgbG9jYXRlZCBpbiBhIHNpbmdsZSBjZWxsLiAgVGhhdCBpcyBlYXN5ISAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZXgxID09IGV4MiApCi0gICAgewotICAgICAgZGVsdGEgICAgICA9IHkyIC0geTE7Ci0gICAgICByYXMuYXJlYSAgKz0gKFRBcmVhKSggZngxICsgZngyICkgKiBkZWx0YTsKLSAgICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBvaywgd2UnbGwgaGF2ZSB0byByZW5kZXIgYSBydW4gb2YgYWRqYWNlbnQgY2VsbHMgb24gdGhlIHNhbWUgKi8KLSAgICAvKiBzY2FubGluZS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBwICAgICA9ICggT05FX1BJWEVMIC0gZngxICkgKiAoIHkyIC0geTEgKTsKLSAgICBmaXJzdCA9IE9ORV9QSVhFTDsKLSAgICBpbmNyICA9IDE7Ci0KLSAgICBpZiAoIGR4IDwgMCApCi0gICAgewotICAgICAgcCAgICAgPSBmeDEgKiAoIHkyIC0geTEgKTsKLSAgICAgIGZpcnN0ID0gMDsKLSAgICAgIGluY3IgID0gLTE7Ci0gICAgICBkeCAgICA9IC1keDsKLSAgICB9Ci0KLSAgICBkZWx0YSA9IChUQ29vcmQpKCBwIC8gZHggKTsKLSAgICBtb2QgICA9IChUQ29vcmQpKCBwICUgZHggKTsKLSAgICBpZiAoIG1vZCA8IDAgKQotICAgIHsKLSAgICAgIGRlbHRhLS07Ci0gICAgICBtb2QgKz0gKFRDb29yZClkeDsKLSAgICB9Ci0KLSAgICByYXMuYXJlYSAgKz0gKFRBcmVhKSggZngxICsgZmlyc3QgKSAqIGRlbHRhOwotICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLQotICAgIGV4MSArPSBpbmNyOwotICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4MSwgZXkgKTsKLSAgICB5MSAgKz0gZGVsdGE7Ci0KLSAgICBpZiAoIGV4MSAhPSBleDIgKQotICAgIHsKLSAgICAgIHAgICAgPSBPTkVfUElYRUwgKiAoIHkyIC0geTEgKyBkZWx0YSApOwotICAgICAgbGlmdCA9IChUQ29vcmQpKCBwIC8gZHggKTsKLSAgICAgIHJlbSAgPSAoVENvb3JkKSggcCAlIGR4ICk7Ci0gICAgICBpZiAoIHJlbSA8IDAgKQotICAgICAgewotICAgICAgICBsaWZ0LS07Ci0gICAgICAgIHJlbSArPSAoVENvb3JkKWR4OwotICAgICAgfQotCi0gICAgICBtb2QgLT0gKGludClkeDsKLQotICAgICAgd2hpbGUgKCBleDEgIT0gZXgyICkKLSAgICAgIHsKLSAgICAgICAgZGVsdGEgPSBsaWZ0OwotICAgICAgICBtb2QgICs9IHJlbTsKLSAgICAgICAgaWYgKCBtb2QgPj0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBtb2QgLT0gKFRDb29yZClkeDsKLSAgICAgICAgICBkZWx0YSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmFzLmFyZWEgICs9IChUQXJlYSlPTkVfUElYRUwgKiBkZWx0YTsKLSAgICAgICAgcmFzLmNvdmVyICs9IGRlbHRhOwotICAgICAgICB5MSAgICAgICAgKz0gZGVsdGE7Ci0gICAgICAgIGV4MSAgICAgICArPSBpbmNyOwotICAgICAgICBncmF5X3NldF9jZWxsKCBSQVNfVkFSXyBleDEsIGV5ICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZGVsdGEgICAgICA9IHkyIC0geTE7Ci0gICAgcmFzLmFyZWEgICs9IChUQXJlYSkoIGZ4MiArIE9ORV9QSVhFTCAtIGZpcnN0ICkgKiBkZWx0YTsKLSAgICByYXMuY292ZXIgKz0gZGVsdGE7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmVuZGVyIGEgZ2l2ZW4gbGluZSBhcyBhIHNlcmllcyBvZiBzY2FubGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBncmF5X3JlbmRlcl9saW5lKCBSQVNfQVJHXyBUUG9zICB0b194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUG9zICB0b195ICkKLSAgewotICAgIFRDb29yZCAgZXkxLCBleTIsIGZ5MSwgZnkyOwotICAgIFRQb3MgICAgZHgsIGR5LCB4LCB4MjsKLSAgICBsb25nICAgIHAsIGZpcnN0OwotICAgIGludCAgICAgZGVsdGEsIHJlbSwgbW9kLCBsaWZ0LCBpbmNyOwotCi0KLSAgICBleTEgPSBUUlVOQyggcmFzLmxhc3RfZXkgKTsKLSAgICBleTIgPSBUUlVOQyggdG9feSApOyAgICAgLyogaWYgKGV5MiA+PSByYXMubWF4X2V5KSBleTIgPSByYXMubWF4X2V5LTE7ICovCi0gICAgZnkxID0gKFRDb29yZCkoIHJhcy55IC0gcmFzLmxhc3RfZXkgKTsKLSAgICBmeTIgPSAoVENvb3JkKSggdG9feSAtIFNVQlBJWEVMUyggZXkyICkgKTsKLQotICAgIGR4ID0gdG9feCAtIHJhcy54OwotICAgIGR5ID0gdG9feSAtIHJhcy55OwotCi0gICAgLyogWFhYOiB3ZSBzaG91bGQgZG8gc29tZXRoaW5nIGFib3V0IHRoZSB0cml2aWFsIGNhc2Ugd2hlcmUgZHggPT0gMCwgKi8KLSAgICAvKiAgICAgIGFzIGl0IGhhcHBlbnMgdmVyeSBvZnRlbiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogcGVyZm9ybSB2ZXJ0aWNhbCBjbGlwcGluZyAqLwotICAgIHsKLSAgICAgIFRDb29yZCAgbWluLCBtYXg7Ci0KLQotICAgICAgbWluID0gZXkxOwotICAgICAgbWF4ID0gZXkyOwotICAgICAgaWYgKCBleTEgPiBleTIgKQotICAgICAgewotICAgICAgICBtaW4gPSBleTI7Ci0gICAgICAgIG1heCA9IGV5MTsKLSAgICAgIH0KLSAgICAgIGlmICggbWluID49IHJhcy5tYXhfZXkgfHwgbWF4IDwgcmFzLm1pbl9leSApCi0gICAgICAgIGdvdG8gRW5kOwotICAgIH0KLQotICAgIC8qIGV2ZXJ5dGhpbmcgaXMgb24gYSBzaW5nbGUgc2NhbmxpbmUgKi8KLSAgICBpZiAoIGV5MSA9PSBleTIgKQotICAgIHsKLSAgICAgIGdyYXlfcmVuZGVyX3NjYW5saW5lKCBSQVNfVkFSXyBleTEsIHJhcy54LCBmeTEsIHRvX3gsIGZ5MiApOwotICAgICAgZ290byBFbmQ7Ci0gICAgfQotCi0gICAgLyogdmVydGljYWwgbGluZSAtIGF2b2lkIGNhbGxpbmcgZ3JheV9yZW5kZXJfc2NhbmxpbmUgKi8KLSAgICBpbmNyID0gMTsKLQotICAgIGlmICggZHggPT0gMCApCi0gICAgewotICAgICAgVENvb3JkICBleCAgICAgPSBUUlVOQyggcmFzLnggKTsKLSAgICAgIFRDb29yZCAgdHdvX2Z4ID0gKFRDb29yZCkoICggcmFzLnggLSBTVUJQSVhFTFMoIGV4ICkgKSA8PCAxICk7Ci0gICAgICBUUG9zICAgIGFyZWE7Ci0KLQotICAgICAgZmlyc3QgPSBPTkVfUElYRUw7Ci0gICAgICBpZiAoIGR5IDwgMCApCi0gICAgICB7Ci0gICAgICAgIGZpcnN0ID0gMDsKLSAgICAgICAgaW5jciAgPSAtMTsKLSAgICAgIH0KLQotICAgICAgZGVsdGEgICAgICA9IChpbnQpKCBmaXJzdCAtIGZ5MSApOwotICAgICAgcmFzLmFyZWEgICs9IChUQXJlYSl0d29fZnggKiBkZWx0YTsKLSAgICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLSAgICAgIGV5MSAgICAgICArPSBpbmNyOwotCi0gICAgICBncmF5X3NldF9jZWxsKCAmcmFzLCBleCwgZXkxICk7Ci0KLSAgICAgIGRlbHRhID0gKGludCkoIGZpcnN0ICsgZmlyc3QgLSBPTkVfUElYRUwgKTsKLSAgICAgIGFyZWEgID0gKFRBcmVhKXR3b19meCAqIGRlbHRhOwotICAgICAgd2hpbGUgKCBleTEgIT0gZXkyICkKLSAgICAgIHsKLSAgICAgICAgcmFzLmFyZWEgICs9IGFyZWE7Ci0gICAgICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLSAgICAgICAgZXkxICAgICAgICs9IGluY3I7Ci0KLSAgICAgICAgZ3JheV9zZXRfY2VsbCggJnJhcywgZXgsIGV5MSApOwotICAgICAgfQotCi0gICAgICBkZWx0YSAgICAgID0gKGludCkoIGZ5MiAtIE9ORV9QSVhFTCArIGZpcnN0ICk7Ci0gICAgICByYXMuYXJlYSAgKz0gKFRBcmVhKXR3b19meCAqIGRlbHRhOwotICAgICAgcmFzLmNvdmVyICs9IGRlbHRhOwotCi0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0KLSAgICAvKiBvaywgd2UgaGF2ZSB0byByZW5kZXIgc2V2ZXJhbCBzY2FubGluZXMgKi8KLSAgICBwICAgICA9ICggT05FX1BJWEVMIC0gZnkxICkgKiBkeDsKLSAgICBmaXJzdCA9IE9ORV9QSVhFTDsKLSAgICBpbmNyICA9IDE7Ci0KLSAgICBpZiAoIGR5IDwgMCApCi0gICAgewotICAgICAgcCAgICAgPSBmeTEgKiBkeDsKLSAgICAgIGZpcnN0ID0gMDsKLSAgICAgIGluY3IgID0gLTE7Ci0gICAgICBkeSAgICA9IC1keTsKLSAgICB9Ci0KLSAgICBkZWx0YSA9IChpbnQpKCBwIC8gZHkgKTsKLSAgICBtb2QgICA9IChpbnQpKCBwICUgZHkgKTsKLSAgICBpZiAoIG1vZCA8IDAgKQotICAgIHsKLSAgICAgIGRlbHRhLS07Ci0gICAgICBtb2QgKz0gKFRDb29yZClkeTsKLSAgICB9Ci0KLSAgICB4ID0gcmFzLnggKyBkZWx0YTsKLSAgICBncmF5X3JlbmRlcl9zY2FubGluZSggUkFTX1ZBUl8gZXkxLCByYXMueCwgZnkxLCB4LCAoVENvb3JkKWZpcnN0ICk7Ci0KLSAgICBleTEgKz0gaW5jcjsKLSAgICBncmF5X3NldF9jZWxsKCBSQVNfVkFSXyBUUlVOQyggeCApLCBleTEgKTsKLQotICAgIGlmICggZXkxICE9IGV5MiApCi0gICAgewotICAgICAgcCAgICAgPSBPTkVfUElYRUwgKiBkeDsKLSAgICAgIGxpZnQgID0gKGludCkoIHAgLyBkeSApOwotICAgICAgcmVtICAgPSAoaW50KSggcCAlIGR5ICk7Ci0gICAgICBpZiAoIHJlbSA8IDAgKQotICAgICAgewotICAgICAgICBsaWZ0LS07Ci0gICAgICAgIHJlbSArPSAoaW50KWR5OwotICAgICAgfQotICAgICAgbW9kIC09IChpbnQpZHk7Ci0KLSAgICAgIHdoaWxlICggZXkxICE9IGV5MiApCi0gICAgICB7Ci0gICAgICAgIGRlbHRhID0gbGlmdDsKLSAgICAgICAgbW9kICArPSByZW07Ci0gICAgICAgIGlmICggbW9kID49IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgbW9kIC09IChpbnQpZHk7Ci0gICAgICAgICAgZGVsdGErKzsKLSAgICAgICAgfQotCi0gICAgICAgIHgyID0geCArIGRlbHRhOwotICAgICAgICBncmF5X3JlbmRlcl9zY2FubGluZSggUkFTX1ZBUl8gZXkxLCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRDb29yZCkoIE9ORV9QSVhFTCAtIGZpcnN0ICksIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRDb29yZClmaXJzdCApOwotICAgICAgICB4ID0geDI7Ci0KLSAgICAgICAgZXkxICs9IGluY3I7Ci0gICAgICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIFRSVU5DKCB4ICksIGV5MSApOwotICAgICAgfQotICAgIH0KLQotICAgIGdyYXlfcmVuZGVyX3NjYW5saW5lKCBSQVNfVkFSXyBleTEsIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUQ29vcmQpKCBPTkVfUElYRUwgLSBmaXJzdCApLCB0b194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeTIgKTsKLQotICBFbmQ6Ci0gICAgcmFzLnggICAgICAgPSB0b194OwotICAgIHJhcy55ICAgICAgID0gdG9feTsKLSAgICByYXMubGFzdF9leSA9IFNVQlBJWEVMUyggZXkyICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfc3BsaXRfY29uaWMoIEZUX1ZlY3RvciogIGJhc2UgKQotICB7Ci0gICAgVFBvcyAgYSwgYjsKLQotCi0gICAgYmFzZVs0XS54ID0gYmFzZVsyXS54OwotICAgIGIgPSBiYXNlWzFdLng7Ci0gICAgYSA9IGJhc2VbM10ueCA9ICggYmFzZVsyXS54ICsgYiApIC8gMjsKLSAgICBiID0gYmFzZVsxXS54ID0gKCBiYXNlWzBdLnggKyBiICkgLyAyOwotICAgIGJhc2VbMl0ueCA9ICggYSArIGIgKSAvIDI7Ci0KLSAgICBiYXNlWzRdLnkgPSBiYXNlWzJdLnk7Ci0gICAgYiA9IGJhc2VbMV0ueTsKLSAgICBhID0gYmFzZVszXS55ID0gKCBiYXNlWzJdLnkgKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnkgPSAoIGJhc2VbMF0ueSArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gKCBhICsgYiApIC8gMjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9yZW5kZXJfY29uaWMoIFJBU19BUkdfIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICB0byApCi0gIHsKLSAgICBUUG9zICAgICAgICBkeCwgZHk7Ci0gICAgaW50ICAgICAgICAgdG9wLCBsZXZlbDsKLSAgICBpbnQqICAgICAgICBsZXZlbHM7Ci0gICAgRlRfVmVjdG9yKiAgYXJjOwotCi0KLSAgICBkeCA9IERPV05TQ0FMRSggcmFzLnggKSArIHRvLT54IC0gKCBjb250cm9sLT54IDw8IDEgKTsKLSAgICBpZiAoIGR4IDwgMCApCi0gICAgICBkeCA9IC1keDsKLSAgICBkeSA9IERPV05TQ0FMRSggcmFzLnkgKSArIHRvLT55IC0gKCBjb250cm9sLT55IDw8IDEgKTsKLSAgICBpZiAoIGR5IDwgMCApCi0gICAgICBkeSA9IC1keTsKLSAgICBpZiAoIGR4IDwgZHkgKQotICAgICAgZHggPSBkeTsKLQotICAgIGxldmVsID0gMTsKLSAgICBkeCA9IGR4IC8gcmFzLmNvbmljX2xldmVsOwotICAgIHdoaWxlICggZHggPiAwICkKLSAgICB7Ci0gICAgICBkeCA+Pj0gMjsKLSAgICAgIGxldmVsKys7Ci0gICAgfQotCi0gICAgLyogYSBzaG9ydGN1dCB0byBzcGVlZCB0aGluZ3MgdXAgKi8KLSAgICBpZiAoIGxldmVsIDw9IDEgKQotICAgIHsKLSAgICAgIC8qIHdlIGNvbXB1dGUgdGhlIG1pZC1wb2ludCBkaXJlY3RseSBpbiBvcmRlciB0byBhdm9pZCAqLwotICAgICAgLyogY2FsbGluZyBncmF5X3NwbGl0X2NvbmljKCkgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBUUG9zICB0b194LCB0b195LCBtaWRfeCwgbWlkX3k7Ci0KLQotICAgICAgdG9feCAgPSBVUFNDQUxFKCB0by0+eCApOwotICAgICAgdG9feSAgPSBVUFNDQUxFKCB0by0+eSApOwotICAgICAgbWlkX3ggPSAoIHJhcy54ICsgdG9feCArIDIgKiBVUFNDQUxFKCBjb250cm9sLT54ICkgKSAvIDQ7Ci0gICAgICBtaWRfeSA9ICggcmFzLnkgKyB0b195ICsgMiAqIFVQU0NBTEUoIGNvbnRyb2wtPnkgKSApIC8gNDsKLQotICAgICAgZ3JheV9yZW5kZXJfbGluZSggUkFTX1ZBUl8gbWlkX3gsIG1pZF95ICk7Ci0gICAgICBncmF5X3JlbmRlcl9saW5lKCBSQVNfVkFSXyB0b194LCB0b195ICk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhcmMgICAgICAgPSByYXMuYmV6X3N0YWNrOwotICAgIGxldmVscyAgICA9IHJhcy5sZXZfc3RhY2s7Ci0gICAgdG9wICAgICAgID0gMDsKLSAgICBsZXZlbHNbMF0gPSBsZXZlbDsKLQotICAgIGFyY1swXS54ID0gVVBTQ0FMRSggdG8tPnggKTsKLSAgICBhcmNbMF0ueSA9IFVQU0NBTEUoIHRvLT55ICk7Ci0gICAgYXJjWzFdLnggPSBVUFNDQUxFKCBjb250cm9sLT54ICk7Ci0gICAgYXJjWzFdLnkgPSBVUFNDQUxFKCBjb250cm9sLT55ICk7Ci0gICAgYXJjWzJdLnggPSByYXMueDsKLSAgICBhcmNbMl0ueSA9IHJhcy55OwotCi0gICAgd2hpbGUgKCB0b3AgPj0gMCApCi0gICAgewotICAgICAgbGV2ZWwgPSBsZXZlbHNbdG9wXTsKLSAgICAgIGlmICggbGV2ZWwgPiAxICkKLSAgICAgIHsKLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgYXJjIGNyb3NzZXMgdGhlIGN1cnJlbnQgYmFuZCAqLwotICAgICAgICBUUG9zICBtaW4sIG1heCwgeTsKLQotCi0gICAgICAgIG1pbiA9IG1heCA9IGFyY1swXS55OwotCi0gICAgICAgIHkgPSBhcmNbMV0ueTsKLSAgICAgICAgaWYgKCB5IDwgbWluICkgbWluID0geTsKLSAgICAgICAgaWYgKCB5ID4gbWF4ICkgbWF4ID0geTsKLQotICAgICAgICB5ID0gYXJjWzJdLnk7Ci0gICAgICAgIGlmICggeSA8IG1pbiApIG1pbiA9IHk7Ci0gICAgICAgIGlmICggeSA+IG1heCApIG1heCA9IHk7Ci0KLSAgICAgICAgaWYgKCBUUlVOQyggbWluICkgPj0gcmFzLm1heF9leSB8fCBUUlVOQyggbWF4ICkgPCByYXMubWluX2V5ICkKLSAgICAgICAgICBnb3RvIERyYXc7Ci0KLSAgICAgICAgZ3JheV9zcGxpdF9jb25pYyggYXJjICk7Ci0gICAgICAgIGFyYyArPSAyOwotICAgICAgICB0b3ArKzsKLSAgICAgICAgbGV2ZWxzW3RvcF0gPSBsZXZlbHNbdG9wIC0gMV0gPSBsZXZlbCAtIDE7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgRHJhdzoKLSAgICAgIHsKLSAgICAgICAgVFBvcyAgdG9feCwgdG9feSwgbWlkX3gsIG1pZF95OwotCi0KLSAgICAgICAgdG9feCAgPSBhcmNbMF0ueDsKLSAgICAgICAgdG9feSAgPSBhcmNbMF0ueTsKLSAgICAgICAgbWlkX3ggPSAoIHJhcy54ICsgdG9feCArIDIgKiBhcmNbMV0ueCApIC8gNDsKLSAgICAgICAgbWlkX3kgPSAoIHJhcy55ICsgdG9feSArIDIgKiBhcmNbMV0ueSApIC8gNDsKLQotICAgICAgICBncmF5X3JlbmRlcl9saW5lKCBSQVNfVkFSXyBtaWRfeCwgbWlkX3kgKTsKLSAgICAgICAgZ3JheV9yZW5kZXJfbGluZSggUkFTX1ZBUl8gdG9feCwgdG9feSApOwotCi0gICAgICAgIHRvcC0tOwotICAgICAgICBhcmMgLT0gMjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfc3BsaXRfY3ViaWMoIEZUX1ZlY3RvciogIGJhc2UgKQotICB7Ci0gICAgVFBvcyAgYSwgYiwgYywgZDsKLQotCi0gICAgYmFzZVs2XS54ID0gYmFzZVszXS54OwotICAgIGMgPSBiYXNlWzFdLng7Ci0gICAgZCA9IGJhc2VbMl0ueDsKLSAgICBiYXNlWzFdLnggPSBhID0gKCBiYXNlWzBdLnggKyBjICkgLyAyOwotICAgIGJhc2VbNV0ueCA9IGIgPSAoIGJhc2VbM10ueCArIGQgKSAvIDI7Ci0gICAgYyA9ICggYyArIGQgKSAvIDI7Ci0gICAgYmFzZVsyXS54ID0gYSA9ICggYSArIGMgKSAvIDI7Ci0gICAgYmFzZVs0XS54ID0gYiA9ICggYiArIGMgKSAvIDI7Ci0gICAgYmFzZVszXS54ID0gKCBhICsgYiApIC8gMjsKLQotICAgIGJhc2VbNl0ueSA9IGJhc2VbM10ueTsKLSAgICBjID0gYmFzZVsxXS55OwotICAgIGQgPSBiYXNlWzJdLnk7Ci0gICAgYmFzZVsxXS55ID0gYSA9ICggYmFzZVswXS55ICsgYyApIC8gMjsKLSAgICBiYXNlWzVdLnkgPSBiID0gKCBiYXNlWzNdLnkgKyBkICkgLyAyOwotICAgIGMgPSAoIGMgKyBkICkgLyAyOwotICAgIGJhc2VbMl0ueSA9IGEgPSAoIGEgKyBjICkgLyAyOwotICAgIGJhc2VbNF0ueSA9IGIgPSAoIGIgKyBjICkgLyAyOwotICAgIGJhc2VbM10ueSA9ICggYSArIGIgKSAvIDI7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmVuZGVyX2N1YmljKCBSQVNfQVJHXyBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8gKQotICB7Ci0gICAgVFBvcyAgICAgICAgZHgsIGR5LCBkYSwgZGI7Ci0gICAgaW50ICAgICAgICAgdG9wLCBsZXZlbDsKLSAgICBpbnQqICAgICAgICBsZXZlbHM7Ci0gICAgRlRfVmVjdG9yKiAgYXJjOwotCi0KLSAgICBkeCA9IERPV05TQ0FMRSggcmFzLnggKSArIHRvLT54IC0gKCBjb250cm9sMS0+eCA8PCAxICk7Ci0gICAgaWYgKCBkeCA8IDAgKQotICAgICAgZHggPSAtZHg7Ci0gICAgZHkgPSBET1dOU0NBTEUoIHJhcy55ICkgKyB0by0+eSAtICggY29udHJvbDEtPnkgPDwgMSApOwotICAgIGlmICggZHkgPCAwICkKLSAgICAgIGR5ID0gLWR5OwotICAgIGlmICggZHggPCBkeSApCi0gICAgICBkeCA9IGR5OwotICAgIGRhID0gZHg7Ci0KLSAgICBkeCA9IERPV05TQ0FMRSggcmFzLnggKSArIHRvLT54IC0gMyAqICggY29udHJvbDEtPnggKyBjb250cm9sMi0+eCApOwotICAgIGlmICggZHggPCAwICkKLSAgICAgIGR4ID0gLWR4OwotICAgIGR5ID0gRE9XTlNDQUxFKCByYXMueSApICsgdG8tPnkgLSAzICogKCBjb250cm9sMS0+eCArIGNvbnRyb2wyLT55ICk7Ci0gICAgaWYgKCBkeSA8IDAgKQotICAgICAgZHkgPSAtZHk7Ci0gICAgaWYgKCBkeCA8IGR5ICkKLSAgICAgIGR4ID0gZHk7Ci0gICAgZGIgPSBkeDsKLQotICAgIGxldmVsID0gMTsKLSAgICBkYSAgICA9IGRhIC8gcmFzLmN1YmljX2xldmVsOwotICAgIGRiICAgID0gZGIgLyByYXMuY29uaWNfbGV2ZWw7Ci0gICAgd2hpbGUgKCBkYSA+IDAgfHwgZGIgPiAwICkKLSAgICB7Ci0gICAgICBkYSA+Pj0gMjsKLSAgICAgIGRiID4+PSAzOwotICAgICAgbGV2ZWwrKzsKLSAgICB9Ci0KLSAgICBpZiAoIGxldmVsIDw9IDEgKQotICAgIHsKLSAgICAgIFRQb3MgICB0b194LCB0b195LCBtaWRfeCwgbWlkX3k7Ci0KLQotICAgICAgdG9feCAgPSBVUFNDQUxFKCB0by0+eCApOwotICAgICAgdG9feSAgPSBVUFNDQUxFKCB0by0+eSApOwotICAgICAgbWlkX3ggPSAoIHJhcy54ICsgdG9feCArCi0gICAgICAgICAgICAgICAgMyAqIFVQU0NBTEUoIGNvbnRyb2wxLT54ICsgY29udHJvbDItPnggKSApIC8gODsKLSAgICAgIG1pZF95ID0gKCByYXMueSArIHRvX3kgKwotICAgICAgICAgICAgICAgIDMgKiBVUFNDQUxFKCBjb250cm9sMS0+eSArIGNvbnRyb2wyLT55ICkgKSAvIDg7Ci0KLSAgICAgIGdyYXlfcmVuZGVyX2xpbmUoIFJBU19WQVJfIG1pZF94LCBtaWRfeSApOwotICAgICAgZ3JheV9yZW5kZXJfbGluZSggUkFTX1ZBUl8gdG9feCwgdG9feSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFyYyAgICAgID0gcmFzLmJlel9zdGFjazsKLSAgICBhcmNbMF0ueCA9IFVQU0NBTEUoIHRvLT54ICk7Ci0gICAgYXJjWzBdLnkgPSBVUFNDQUxFKCB0by0+eSApOwotICAgIGFyY1sxXS54ID0gVVBTQ0FMRSggY29udHJvbDItPnggKTsKLSAgICBhcmNbMV0ueSA9IFVQU0NBTEUoIGNvbnRyb2wyLT55ICk7Ci0gICAgYXJjWzJdLnggPSBVUFNDQUxFKCBjb250cm9sMS0+eCApOwotICAgIGFyY1syXS55ID0gVVBTQ0FMRSggY29udHJvbDEtPnkgKTsKLSAgICBhcmNbM10ueCA9IHJhcy54OwotICAgIGFyY1szXS55ID0gcmFzLnk7Ci0KLSAgICBsZXZlbHMgICAgPSByYXMubGV2X3N0YWNrOwotICAgIHRvcCAgICAgICA9IDA7Ci0gICAgbGV2ZWxzWzBdID0gbGV2ZWw7Ci0KLSAgICB3aGlsZSAoIHRvcCA+PSAwICkKLSAgICB7Ci0gICAgICBsZXZlbCA9IGxldmVsc1t0b3BdOwotICAgICAgaWYgKCBsZXZlbCA+IDEgKQotICAgICAgewotICAgICAgICAvKiBjaGVjayB0aGF0IHRoZSBhcmMgY3Jvc3NlcyB0aGUgY3VycmVudCBiYW5kICovCi0gICAgICAgIFRQb3MgIG1pbiwgbWF4LCB5OwotCi0KLSAgICAgICAgbWluID0gbWF4ID0gYXJjWzBdLnk7Ci0gICAgICAgIHkgPSBhcmNbMV0ueTsKLSAgICAgICAgaWYgKCB5IDwgbWluICkgbWluID0geTsKLSAgICAgICAgaWYgKCB5ID4gbWF4ICkgbWF4ID0geTsKLSAgICAgICAgeSA9IGFyY1syXS55OwotICAgICAgICBpZiAoIHkgPCBtaW4gKSBtaW4gPSB5OwotICAgICAgICBpZiAoIHkgPiBtYXggKSBtYXggPSB5OwotICAgICAgICB5ID0gYXJjWzNdLnk7Ci0gICAgICAgIGlmICggeSA8IG1pbiApIG1pbiA9IHk7Ci0gICAgICAgIGlmICggeSA+IG1heCApIG1heCA9IHk7Ci0gICAgICAgIGlmICggVFJVTkMoIG1pbiApID49IHJhcy5tYXhfZXkgfHwgVFJVTkMoIG1heCApIDwgMCApCi0gICAgICAgICAgZ290byBEcmF3OwotICAgICAgICBncmF5X3NwbGl0X2N1YmljKCBhcmMgKTsKLSAgICAgICAgYXJjICs9IDM7Ci0gICAgICAgIHRvcCArKzsKLSAgICAgICAgbGV2ZWxzW3RvcF0gPSBsZXZlbHNbdG9wIC0gMV0gPSBsZXZlbCAtIDE7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgRHJhdzoKLSAgICAgIHsKLSAgICAgICAgVFBvcyAgdG9feCwgdG9feSwgbWlkX3gsIG1pZF95OwotCi0KLSAgICAgICAgdG9feCAgPSBhcmNbMF0ueDsKLSAgICAgICAgdG9feSAgPSBhcmNbMF0ueTsKLSAgICAgICAgbWlkX3ggPSAoIHJhcy54ICsgdG9feCArIDMgKiAoIGFyY1sxXS54ICsgYXJjWzJdLnggKSApIC8gODsKLSAgICAgICAgbWlkX3kgPSAoIHJhcy55ICsgdG9feSArIDMgKiAoIGFyY1sxXS55ICsgYXJjWzJdLnkgKSApIC8gODsKLQotICAgICAgICBncmF5X3JlbmRlcl9saW5lKCBSQVNfVkFSXyBtaWRfeCwgbWlkX3kgKTsKLSAgICAgICAgZ3JheV9yZW5kZXJfbGluZSggUkFTX1ZBUl8gdG9feCwgdG9feSApOwotICAgICAgICB0b3AgLS07Ci0gICAgICAgIGFyYyAtPSAzOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLSAgfQotCi0KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfbW92ZV90byggY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgUFdvcmtlciAgICAgICAgICAgd29ya2VyICkKLSAgewotICAgIFRQb3MgIHgsIHk7Ci0KLQotICAgIC8qIHJlY29yZCBjdXJyZW50IGNlbGwsIGlmIGFueSAqLwotICAgIGdyYXlfcmVjb3JkX2NlbGwoIHdvcmtlciApOwotCi0gICAgLyogc3RhcnQgdG8gYSBuZXcgcG9zaXRpb24gKi8KLSAgICB4ID0gVVBTQ0FMRSggdG8tPnggKTsKLSAgICB5ID0gVVBTQ0FMRSggdG8tPnkgKTsKLQotICAgIGdyYXlfc3RhcnRfY2VsbCggd29ya2VyLCBUUlVOQyggeCApLCBUUlVOQyggeSApICk7Ci0KLSAgICB3b3JrZXItPnggPSB4OwotICAgIHdvcmtlci0+eSA9IHk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9saW5lX3RvKCBjb25zdCBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICBQV29ya2VyICAgICAgICAgICB3b3JrZXIgKQotICB7Ci0gICAgZ3JheV9yZW5kZXJfbGluZSggd29ya2VyLCBVUFNDQUxFKCB0by0+eCApLCBVUFNDQUxFKCB0by0+eSApICk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9jb25pY190byggY29uc3QgRlRfVmVjdG9yKiAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgIFBXb3JrZXIgICAgICAgICAgIHdvcmtlciApCi0gIHsKLSAgICBncmF5X3JlbmRlcl9jb25pYyggd29ya2VyLCBjb250cm9sLCB0byApOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfY3ViaWNfdG8oIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgIFBXb3JrZXIgICAgICAgICAgIHdvcmtlciApCi0gIHsKLSAgICBncmF5X3JlbmRlcl9jdWJpYyggd29ya2VyLCBjb250cm9sMSwgY29udHJvbDIsIHRvICk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmVuZGVyX3NwYW4oIGludCAgICAgICAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1NwYW4qICBzcGFucywKLSAgICAgICAgICAgICAgICAgICAgUFdvcmtlciAgICAgICAgIHdvcmtlciApCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyKiAgcDsKLSAgICBGVF9CaXRtYXAqICAgICAgbWFwID0gJndvcmtlci0+dGFyZ2V0OwotCi0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIGNvbXB1dGUgdGhlIHNjYW5saW5lIG9mZnNldCAqLwotICAgIHAgPSAodW5zaWduZWQgY2hhciopbWFwLT5idWZmZXIgLSB5ICogbWFwLT5waXRjaDsKLSAgICBpZiAoIG1hcC0+cGl0Y2ggPj0gMCApCi0gICAgICBwICs9ICggbWFwLT5yb3dzIC0gMSApICogbWFwLT5waXRjaDsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzcGFucysrICkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICBjb3ZlcmFnZSA9IHNwYW5zLT5jb3ZlcmFnZTsKLQotCi0gICAgICBpZiAoIGNvdmVyYWdlICkKLSAgICAgIHsKLSAgICAgICAgLyogRm9yIHNtYWxsLXNwYW5zIGl0IGlzIGZhc3RlciB0byBkbyBpdCBieSBvdXJzZWx2ZXMgdGhhbgotICAgICAgICAgKiBjYWxsaW5nIGBtZW1zZXQnLiAgVGhpcyBpcyBtYWlubHkgZHVlIHRvIHRoZSBjb3N0IG9mIHRoZQotICAgICAgICAgKiBmdW5jdGlvbiBjYWxsLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBzcGFucy0+bGVuID49IDggKQotICAgICAgICAgIEZUX01FTV9TRVQoIHAgKyBzcGFucy0+eCwgKHVuc2lnbmVkIGNoYXIpY292ZXJhZ2UsIHNwYW5zLT5sZW4gKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgY2hhciogIHEgPSBwICsgc3BhbnMtPng7Ci0KLQotICAgICAgICAgIHN3aXRjaCAoIHNwYW5zLT5sZW4gKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDc6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDY6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDU6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDQ6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDM6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDI6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDE6ICpxICAgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9obGluZSggUkFTX0FSR18gVENvb3JkICB4LAotICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIHksCi0gICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICAgYXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICBhY291bnQgKQotICB7Ci0gICAgRlRfU3BhbiogIHNwYW47Ci0gICAgaW50ICAgICAgIGNvdW50OwotICAgIGludCAgICAgICBjb3ZlcmFnZTsKLQotCi0gICAgLyogY29tcHV0ZSB0aGUgY292ZXJhZ2UgbGluZSdzIGNvdmVyYWdlLCBkZXBlbmRpbmcgb24gdGhlICAgICovCi0gICAgLyogb3V0bGluZSBmaWxsIHJ1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhlIGNvdmVyYWdlIHBlcmNlbnRhZ2UgaXMgYXJlYS8oUElYRUxfQklUUypQSVhFTF9CSVRTKjIpICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgY292ZXJhZ2UgPSAoaW50KSggYXJlYSA+PiAoIFBJWEVMX0JJVFMgKiAyICsgMSAtIDggKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSByYW5nZSAwLi4yNTYgKi8KLSAgICBpZiAoIGNvdmVyYWdlIDwgMCApCi0gICAgICBjb3ZlcmFnZSA9IC1jb3ZlcmFnZTsKLQotICAgIGlmICggcmFzLm91dGxpbmUuZmxhZ3MgJiBGVF9PVVRMSU5FX0VWRU5fT0REX0ZJTEwgKQotICAgIHsKLSAgICAgIGNvdmVyYWdlICY9IDUxMTsKLQotICAgICAgaWYgKCBjb3ZlcmFnZSA+IDI1NiApCi0gICAgICAgIGNvdmVyYWdlID0gNTEyIC0gY292ZXJhZ2U7Ci0gICAgICBlbHNlIGlmICggY292ZXJhZ2UgPT0gMjU2ICkKLSAgICAgICAgY292ZXJhZ2UgPSAyNTU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBub3JtYWwgbm9uLXplcm8gd2luZGluZyBydWxlICovCi0gICAgICBpZiAoIGNvdmVyYWdlID49IDI1NiApCi0gICAgICAgIGNvdmVyYWdlID0gMjU1OwotICAgIH0KLQotICAgIHkgKz0gKFRDb29yZClyYXMubWluX2V5OwotICAgIHggKz0gKFRDb29yZClyYXMubWluX2V4OwotCi0gICAgLyogRlRfU3Bhbi54IGlzIGEgMTYtYml0IHNob3J0LCBzbyBsaW1pdCBvdXIgY29vcmRpbmF0ZXMgYXBwcm9wcmlhdGVseSAqLwotICAgIGlmICggeCA+PSAzMjc2OCApCi0gICAgICB4ID0gMzI3Njc7Ci0KLSAgICBpZiAoIGNvdmVyYWdlICkKLSAgICB7Ci0gICAgICAvKiBzZWUgd2hldGhlciB3ZSBjYW4gYWRkIHRoaXMgc3BhbiB0byB0aGUgY3VycmVudCBsaXN0ICovCi0gICAgICBjb3VudCA9IHJhcy5udW1fZ3JheV9zcGFuczsKLSAgICAgIHNwYW4gID0gcmFzLmdyYXlfc3BhbnMgKyBjb3VudCAtIDE7Ci0gICAgICBpZiAoIGNvdW50ID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgcmFzLnNwYW5feSA9PSB5ICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoaW50KXNwYW4tPnggKyBzcGFuLT5sZW4gPT0gKGludCl4ICYmCi0gICAgICAgICAgIHNwYW4tPmNvdmVyYWdlID09IGNvdmVyYWdlICAgICAgICAgKQotICAgICAgewotICAgICAgICBzcGFuLT5sZW4gPSAodW5zaWduZWQgc2hvcnQpKCBzcGFuLT5sZW4gKyBhY291bnQgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoIHJhcy5zcGFuX3kgIT0geSB8fCBjb3VudCA+PSBGVF9NQVhfR1JBWV9TUEFOUyApCi0gICAgICB7Ci0gICAgICAgIGlmICggcmFzLnJlbmRlcl9zcGFuICYmIGNvdW50ID4gMCApCi0gICAgICAgICAgcmFzLnJlbmRlcl9zcGFuKCByYXMuc3Bhbl95LCBjb3VudCwgcmFzLmdyYXlfc3BhbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByYXMucmVuZGVyX3NwYW5fZGF0YSApOwotICAgICAgICAvKiByYXMucmVuZGVyX3NwYW4oIHNwYW4tPnksIHJhcy5ncmF5X3NwYW5zLCBjb3VudCApOyAqLwotCi0jaWZkZWYgREVCVUdfR1JBWVMKLQotICAgICAgICBpZiAoIHJhcy5zcGFuX3kgPj0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgIG47Ci0KLQotICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgInk9JTNkICIsIHJhcy5zcGFuX3kgKTsKLSAgICAgICAgICBzcGFuID0gcmFzLmdyYXlfc3BhbnM7Ci0gICAgICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrLCBzcGFuKysgKQotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiWyVkLi4lZF06JTAyeCAiLAotICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+eCwgc3Bhbi0+eCArIHNwYW4tPmxlbiAtIDEsIHNwYW4tPmNvdmVyYWdlICk7Ci0gICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qIERFQlVHX0dSQVlTICovCi0KLSAgICAgICAgcmFzLm51bV9ncmF5X3NwYW5zID0gMDsKLSAgICAgICAgcmFzLnNwYW5feSAgICAgICAgID0geTsKLQotICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgIHNwYW4gID0gcmFzLmdyYXlfc3BhbnM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHNwYW4rKzsKLQotICAgICAgLyogYWRkIGEgZ3JheSBzcGFuIHRvIHRoZSBjdXJyZW50IGxpc3QgKi8KLSAgICAgIHNwYW4tPnggICAgICAgID0gKHNob3J0KXg7Ci0gICAgICBzcGFuLT5sZW4gICAgICA9ICh1bnNpZ25lZCBzaG9ydClhY291bnQ7Ci0gICAgICBzcGFuLT5jb3ZlcmFnZSA9ICh1bnNpZ25lZCBjaGFyKWNvdmVyYWdlOwotCi0gICAgICByYXMubnVtX2dyYXlfc3BhbnMrKzsKLSAgICB9Ci0gIH0KLQotCi0jaWZkZWYgREVCVUdfR1JBWVMKLQotICAvKiB0byBiZSBjYWxsZWQgd2hpbGUgaW4gdGhlIGRlYnVnZ2VyICovCi0gIGdyYXlfZHVtcF9jZWxscyggUkFTX0FSRyApCi0gIHsKLSAgICBpbnQgIHlpbmRleDsKLQotCi0gICAgZm9yICggeWluZGV4ID0gMDsgeWluZGV4IDwgcmFzLnljb3VudDsgeWluZGV4KysgKQotICAgIHsKLSAgICAgIFBDZWxsICBjZWxsOwotCi0KLSAgICAgIHByaW50ZiggIiUzZDoiLCB5aW5kZXggKTsKLQotICAgICAgZm9yICggY2VsbCA9IHJhcy55Y2VsbHNbeWluZGV4XTsgY2VsbCAhPSBOVUxMOyBjZWxsID0gY2VsbC0+bmV4dCApCi0gICAgICAgIHByaW50ZiggIiAoJTNkLCBjOiU0ZCwgYTolNmQpIiwgY2VsbC0+eCwgY2VsbC0+Y292ZXIsIGNlbGwtPmFyZWEgKTsKLSAgICAgIHByaW50ZiggIlxuIiApOwotICAgIH0KLSAgfQotCi0jZW5kaWYgLyogREVCVUdfR1JBWVMgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfc3dlZXAoIFJBU19BUkdfIGNvbnN0IEZUX0JpdG1hcCogIHRhcmdldCApCi0gIHsKLSAgICBpbnQgIHlpbmRleDsKLQotICAgIEZUX1VOVVNFRCggdGFyZ2V0ICk7Ci0KLQotICAgIGlmICggcmFzLm51bV9jZWxscyA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIHJhcy5udW1fZ3JheV9zcGFucyA9IDA7Ci0KLSAgICBmb3IgKCB5aW5kZXggPSAwOyB5aW5kZXggPCByYXMueWNvdW50OyB5aW5kZXgrKyApCi0gICAgewotICAgICAgUENlbGwgICBjZWxsICA9IHJhcy55Y2VsbHNbeWluZGV4XTsKLSAgICAgIFRDb29yZCAgY292ZXIgPSAwOwotICAgICAgVENvb3JkICB4ICAgICA9IDA7Ci0KLQotICAgICAgZm9yICggOyBjZWxsICE9IE5VTEw7IGNlbGwgPSBjZWxsLT5uZXh0ICkKLSAgICAgIHsKLSAgICAgICAgVEFyZWEgIGFyZWE7Ci0KLQotICAgICAgICBpZiAoIGNlbGwtPnggPiB4ICYmIGNvdmVyICE9IDAgKQotICAgICAgICAgIGdyYXlfaGxpbmUoIFJBU19WQVJfIHgsIHlpbmRleCwgY292ZXIgKiAoIE9ORV9QSVhFTCAqIDIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBjZWxsLT54IC0geCApOwotCi0gICAgICAgIGNvdmVyICs9IGNlbGwtPmNvdmVyOwotICAgICAgICBhcmVhICAgPSBjb3ZlciAqICggT05FX1BJWEVMICogMiApIC0gY2VsbC0+YXJlYTsKLQotICAgICAgICBpZiAoIGFyZWEgIT0gMCAmJiBjZWxsLT54ID49IDAgKQotICAgICAgICAgIGdyYXlfaGxpbmUoIFJBU19WQVJfIGNlbGwtPngsIHlpbmRleCwgYXJlYSwgMSApOwotCi0gICAgICAgIHggPSBjZWxsLT54ICsgMTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBjb3ZlciAhPSAwICkKLSAgICAgICAgZ3JheV9obGluZSggUkFTX1ZBUl8geCwgeWluZGV4LCBjb3ZlciAqICggT05FX1BJWEVMICogMiApLAotICAgICAgICAgICAgICAgICAgICByYXMuY291bnRfZXggLSB4ICk7Ci0gICAgfQotCi0gICAgaWYgKCByYXMucmVuZGVyX3NwYW4gJiYgcmFzLm51bV9ncmF5X3NwYW5zID4gMCApCi0gICAgICByYXMucmVuZGVyX3NwYW4oIHJhcy5zcGFuX3ksIHJhcy5udW1fZ3JheV9zcGFucywKLSAgICAgICAgICAgICAgICAgICAgICAgcmFzLmdyYXlfc3BhbnMsIHJhcy5yZW5kZXJfc3Bhbl9kYXRhICk7Ci0gIH0KLQotCi0jaWZkZWYgX1NUQU5EQUxPTkVfCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBzaG91bGQgb25seSBjb21waWxlIGluIHN0YW5kX2Fsb25lIG1vZGUsICAgICAgKi8KLSAgLyogIGkuZS4sIHdoZW4gYnVpbGRpbmcgdGhpcyBjb21wb25lbnQgd2l0aG91dCB0aGUgcmVzdCBvZiBGcmVlVHlwZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXYWxrcyBvdmVyIGFuIG91dGxpbmUncyBzdHJ1Y3R1cmUgdG8gZGVjb21wb3NlIGl0IGludG8gaW5kaXZpZHVhbCAgKi8KLSAgLyogICAgc2VnbWVudHMgYW5kIEJlemllciBhcmNzLiAgVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFibGUgdG8gZW1pdCAgICAgICovCi0gIC8qICAgIGBtb3ZlIHRvJyBhbmQgYGNsb3NlIHRvJyBvcGVyYXRpb25zIHRvIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kICAqLwotICAvKiAgICBvZiBuZXcgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSB0YXJnZXQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNfaW50ZXJmYWNlIDo6IEEgdGFibGUgb2YgYGVtaXR0ZXJzJywgaS5lLC4gZnVuY3Rpb24gcG9pbnRlcnMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgZHVyaW5nIGRlY29tcG9zaXRpb24gdG8gaW5kaWNhdGUgcGF0aCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgICAgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgd2hpY2ggaXMgcGFzc2VkIHRvIGVhY2ggICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgZW1pdHRlciBkdXJpbmcgdGhlIGRlY29tcG9zaXRpb24uICBJdCBjYW4gYmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gc3RvcmUgdGhlIHN0YXRlIGR1cmluZyB0aGUgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYwotICBpbnQgIEZUX091dGxpbmVfRGVjb21wb3NlKCBjb25zdCBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3V0bGluZV9GdW5jcyogIGZ1bmNfaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgdXNlciApCi0gIHsKLSN1bmRlZiBTQ0FMRUQKLSNpZiAwCi0jZGVmaW5lIFNDQUxFRCggeCApICAoICggKHgpIDw8IHNoaWZ0ICkgLSBkZWx0YSApCi0jZWxzZQotI2RlZmluZSBTQ0FMRUQoIHggKSAgKHgpCi0jZW5kaWYKLQotICAgIEZUX1ZlY3RvciAgIHZfbGFzdDsKLSAgICBGVF9WZWN0b3IgICB2X2NvbnRyb2w7Ci0gICAgRlRfVmVjdG9yICAgdl9zdGFydDsKLQotICAgIEZUX1ZlY3RvciogIHBvaW50OwotICAgIEZUX1ZlY3RvciogIGxpbWl0OwotICAgIGNoYXIqICAgICAgIHRhZ3M7Ci0KLSAgICBpbnQgICBuOyAgICAgICAgIC8qIGluZGV4IG9mIGNvbnRvdXIgaW4gb3V0bGluZSAgICAgKi8KLSAgICBpbnQgICBmaXJzdDsgICAgIC8qIGluZGV4IG9mIGZpcnN0IHBvaW50IGluIGNvbnRvdXIgKi8KLSAgICBpbnQgICBlcnJvcjsKLSAgICBjaGFyICB0YWc7ICAgICAgIC8qIGN1cnJlbnQgcG9pbnQncyBzdGF0ZSAgICAgICAgICAgKi8KLQotI2lmIDAKLSAgICBpbnQgICBzaGlmdCA9IGZ1bmNfaW50ZXJmYWNlLT5zaGlmdDsKLSAgICBUUG9zICBkZWx0YSA9IGZ1bmNfaW50ZXJmYWNlLT5kZWx0YTsKLSNlbmRpZgotCi0KLSAgICBmaXJzdCA9IDA7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IG91dGxpbmUtPm5fY29udG91cnM7IG4rKyApCi0gICAgewotICAgICAgaW50ICBsYXN0OyAgLyogaW5kZXggb2YgbGFzdCBwb2ludCBpbiBjb250b3VyICovCi0KLQotICAgICAgbGFzdCAgPSBvdXRsaW5lLT5jb250b3Vyc1tuXTsKLSAgICAgIGxpbWl0ID0gb3V0bGluZS0+cG9pbnRzICsgbGFzdDsKLQotICAgICAgdl9zdGFydCA9IG91dGxpbmUtPnBvaW50c1tmaXJzdF07Ci0gICAgICB2X2xhc3QgID0gb3V0bGluZS0+cG9pbnRzW2xhc3RdOwotCi0gICAgICB2X3N0YXJ0LnggPSBTQ0FMRUQoIHZfc3RhcnQueCApOwotICAgICAgdl9zdGFydC55ID0gU0NBTEVEKCB2X3N0YXJ0LnkgKTsKLQotICAgICAgdl9sYXN0LnggID0gU0NBTEVEKCB2X2xhc3QueCApOwotICAgICAgdl9sYXN0LnkgID0gU0NBTEVEKCB2X2xhc3QueSApOwotCi0gICAgICB2X2NvbnRyb2wgPSB2X3N0YXJ0OwotCi0gICAgICBwb2ludCA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwotICAgICAgdGFncyAgPSBvdXRsaW5lLT50YWdzICArIGZpcnN0OwotICAgICAgdGFnICAgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLQotICAgICAgLyogQSBjb250b3VyIGNhbm5vdCBzdGFydCB3aXRoIGEgY3ViaWMgY29udHJvbCBwb2ludCEgKi8KLSAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19DVUJJQyApCi0gICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAvKiBjaGVjayBmaXJzdCBwb2ludCB0byBkZXRlcm1pbmUgb3JpZ2luICovCi0gICAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ09OSUMgKQotICAgICAgewotICAgICAgICAvKiBmaXJzdCBwb2ludCBpcyBjb25pYyBjb250cm9sLiAgWWVzLCB0aGlzIGhhcHBlbnMuICovCi0gICAgICAgIGlmICggRlRfQ1VSVkVfVEFHKCBvdXRsaW5lLT50YWdzW2xhc3RdICkgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHN0YXJ0IGF0IGxhc3QgcG9pbnQgaWYgaXQgaXMgb24gdGhlIGN1cnZlICovCi0gICAgICAgICAgdl9zdGFydCA9IHZfbGFzdDsKLSAgICAgICAgICBsaW1pdC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIGlmIGJvdGggZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBjb25pYywgICAgICAgICAqLwotICAgICAgICAgIC8qIHN0YXJ0IGF0IHRoZWlyIG1pZGRsZSBhbmQgcmVjb3JkIGl0cyBwb3NpdGlvbiAgICAqLwotICAgICAgICAgIC8qIGZvciBjbG9zdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7Ci0gICAgICAgICAgdl9zdGFydC55ID0gKCB2X3N0YXJ0LnkgKyB2X2xhc3QueSApIC8gMjsKLQotICAgICAgICAgIHZfbGFzdCA9IHZfc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcG9pbnQtLTsKLSAgICAgICAgdGFncy0tOwotICAgICAgfQotCi0gICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5tb3ZlX3RvKCAmdl9zdGFydCwgdXNlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgd2hpbGUgKCBwb2ludCA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQrKzsKLSAgICAgICAgdGFncysrOwotCi0gICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotICAgICAgICBzd2l0Y2ggKCB0YWcgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX09OOiAgLyogZW1pdCBhIHNpbmdsZSBsaW5lX3RvICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICB2ZWMueSA9IFNDQUxFRCggcG9pbnQtPnkgKTsKLQotICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+bGluZV90byggJnZlYywgdXNlciApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIEZUX0NVUlZFX1RBR19DT05JQzogIC8qIGNvbnN1bWUgY29uaWMgYXJjcyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZfY29udHJvbC54ID0gU0NBTEVEKCBwb2ludC0+eCApOwotICAgICAgICAgICAgdl9jb250cm9sLnkgPSBTQ0FMRUQoIHBvaW50LT55ICk7Ci0KLSAgICAgICAgICBEb19Db25pYzoKLSAgICAgICAgICAgIGlmICggcG9pbnQgPCBsaW1pdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotICAgICAgICAgICAgICBGVF9WZWN0b3IgIHZfbWlkZGxlOwotCi0KLSAgICAgICAgICAgICAgcG9pbnQrKzsKLSAgICAgICAgICAgICAgdGFncysrOwotICAgICAgICAgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLQotICAgICAgICAgICAgICB2ZWMueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICAgICAgdmVjLnkgPSBTQ0FMRUQoIHBvaW50LT55ICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAoIHRhZyAhPSBGVF9DVVJWRV9UQUdfQ09OSUMgKQotICAgICAgICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgICAgICAgIHZfbWlkZGxlLnggPSAoIHZfY29udHJvbC54ICsgdmVjLnggKSAvIDI7Ci0gICAgICAgICAgICAgIHZfbWlkZGxlLnkgPSAoIHZfY29udHJvbC55ICsgdmVjLnkgKSAvIDI7Ci0KLSAgICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y29uaWNfdG8oICZ2X2NvbnRyb2wsICZ2X21pZGRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAgIHZfY29udHJvbCA9IHZlYzsKLSAgICAgICAgICAgICAgZ290byBEb19Db25pYzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y29uaWNfdG8oICZ2X2NvbnRyb2wsICZ2X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgKTsKLSAgICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6ICAvKiBGVF9DVVJWRV9UQUdfQ1VCSUMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzEsIHZlYzI7Ci0KLQotICAgICAgICAgICAgaWYgKCBwb2ludCArIDEgPiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCB0YWdzWzFdICkgIT0gRlRfQ1VSVkVfVEFHX0NVQklDICkKLSAgICAgICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgICAgIHBvaW50ICs9IDI7Ci0gICAgICAgICAgICB0YWdzICArPSAyOwotCi0gICAgICAgICAgICB2ZWMxLnggPSBTQ0FMRUQoIHBvaW50Wy0yXS54ICk7Ci0gICAgICAgICAgICB2ZWMxLnkgPSBTQ0FMRUQoIHBvaW50Wy0yXS55ICk7Ci0KLSAgICAgICAgICAgIHZlYzIueCA9IFNDQUxFRCggcG9pbnRbLTFdLnggKTsKLSAgICAgICAgICAgIHZlYzIueSA9IFNDQUxFRCggcG9pbnRbLTFdLnkgKTsKLQotICAgICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICAgIHZlYy55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmN1YmljX3RvKCAmdmVjMSwgJnZlYzIsICZ2ZWMsIHVzZXIgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y3ViaWNfdG8oICZ2ZWMxLCAmdmVjMiwgJnZfc3RhcnQsIHVzZXIgKTsKLSAgICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNsb3NlIHRoZSBjb250b3VyIHdpdGggYSBsaW5lIHNlZ21lbnQgKi8KLSAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmxpbmVfdG8oICZ2X3N0YXJ0LCB1c2VyICk7Ci0KLSAgIENsb3NlOgotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBJbnZhbGlkX091dGxpbmU6Ci0gICAgcmV0dXJuIEVyclJhc3Rlcl9JbnZhbGlkX091dGxpbmU7Ci0gIH0KLQotI2VuZGlmIC8qIF9TVEFOREFMT05FXyAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRCYW5kXwotICB7Ci0gICAgVFBvcyAgbWluLCBtYXg7Ci0KLSAgfSBUQmFuZDsKLQotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9jb252ZXJ0X2dseXBoX2lubmVyKCBSQVNfQVJHICkKLSAgewotICAgIHN0YXRpYwotICAgIGNvbnN0IEZUX091dGxpbmVfRnVuY3MgIGZ1bmNfaW50ZXJmYWNlID0KLSAgICB7Ci0gICAgICAoRlRfT3V0bGluZV9Nb3ZlVG9fRnVuYykgZ3JheV9tb3ZlX3RvLAotICAgICAgKEZUX091dGxpbmVfTGluZVRvX0Z1bmMpIGdyYXlfbGluZV90bywKLSAgICAgIChGVF9PdXRsaW5lX0NvbmljVG9fRnVuYylncmF5X2NvbmljX3RvLAotICAgICAgKEZUX091dGxpbmVfQ3ViaWNUb19GdW5jKWdyYXlfY3ViaWNfdG8sCi0gICAgICAwLAotICAgICAgMAotICAgIH07Ci0KLSAgICB2b2xhdGlsZSBpbnQgIGVycm9yID0gMDsKLQotICAgIGlmICggZnRfc2V0am1wKCByYXMuanVtcF9idWZmZXIgKSA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX091dGxpbmVfRGVjb21wb3NlKCAmcmFzLm91dGxpbmUsICZmdW5jX2ludGVyZmFjZSwgJnJhcyApOwotICAgICAgZ3JheV9yZWNvcmRfY2VsbCggUkFTX1ZBUiApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXJyb3IgPSBFcnJSYXN0ZXJfTWVtb3J5X092ZXJmbG93OwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBncmF5X2NvbnZlcnRfZ2x5cGgoIFJBU19BUkcgKQotICB7Ci0gICAgVEJhbmQgICAgICAgICAgICBiYW5kc1s0MF07Ci0gICAgVEJhbmQqIHZvbGF0aWxlICBiYW5kOwotICAgIGludCB2b2xhdGlsZSAgICAgbiwgbnVtX2JhbmRzOwotICAgIFRQb3Mgdm9sYXRpbGUgICAgbWluLCBtYXgsIG1heF95OwotICAgIEZUX0JCb3gqICAgICAgICAgY2xpcDsKLQotCi0gICAgLyogU2V0IHVwIHN0YXRlIGluIHRoZSByYXN0ZXIgb2JqZWN0ICovCi0gICAgZ3JheV9jb21wdXRlX2Nib3goIFJBU19WQVIgKTsKLQotICAgIC8qIGNsaXAgdG8gdGFyZ2V0IGJpdG1hcCwgZXhpdCBpZiBub3RoaW5nIHRvIGRvICovCi0gICAgY2xpcCA9ICZyYXMuY2xpcF9ib3g7Ci0KLSAgICBpZiAoIHJhcy5tYXhfZXggPD0gY2xpcC0+eE1pbiB8fCByYXMubWluX2V4ID49IGNsaXAtPnhNYXggfHwKLSAgICAgICAgIHJhcy5tYXhfZXkgPD0gY2xpcC0+eU1pbiB8fCByYXMubWluX2V5ID49IGNsaXAtPnlNYXggKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIHJhcy5taW5fZXggPCBjbGlwLT54TWluICkgcmFzLm1pbl9leCA9IGNsaXAtPnhNaW47Ci0gICAgaWYgKCByYXMubWluX2V5IDwgY2xpcC0+eU1pbiApIHJhcy5taW5fZXkgPSBjbGlwLT55TWluOwotCi0gICAgaWYgKCByYXMubWF4X2V4ID4gY2xpcC0+eE1heCApIHJhcy5tYXhfZXggPSBjbGlwLT54TWF4OwotICAgIGlmICggcmFzLm1heF9leSA+IGNsaXAtPnlNYXggKSByYXMubWF4X2V5ID0gY2xpcC0+eU1heDsKLQotICAgIHJhcy5jb3VudF9leCA9IHJhcy5tYXhfZXggLSByYXMubWluX2V4OwotICAgIHJhcy5jb3VudF9leSA9IHJhcy5tYXhfZXkgLSByYXMubWluX2V5OwotCi0gICAgLyogc2ltcGxlIGhldXJpc3RpYyB1c2VkIHRvIHNwZWVkIHVwIHRoZSBiZXppZXIgZGVjb21wb3NpdGlvbiAtLSBzZWUgKi8KLSAgICAvKiB0aGUgY29kZSBpbiBncmF5X3JlbmRlcl9jb25pYygpIGFuZCBncmF5X3JlbmRlcl9jdWJpYygpIGZvciBtb3JlICAqLwotICAgIC8qIGRldGFpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgcmFzLmNvbmljX2xldmVsID0gMzI7Ci0gICAgcmFzLmN1YmljX2xldmVsID0gMTY7Ci0KLSAgICB7Ci0gICAgICBpbnQgbGV2ZWwgPSAwOwotCi0KLSAgICAgIGlmICggcmFzLmNvdW50X2V4ID4gMjQgfHwgcmFzLmNvdW50X2V5ID4gMjQgKQotICAgICAgICBsZXZlbCsrOwotICAgICAgaWYgKCByYXMuY291bnRfZXggPiAxMjAgfHwgcmFzLmNvdW50X2V5ID4gMTIwICkKLSAgICAgICAgbGV2ZWwrKzsKLQotICAgICAgcmFzLmNvbmljX2xldmVsIDw8PSBsZXZlbDsKLSAgICAgIHJhcy5jdWJpY19sZXZlbCA8PD0gbGV2ZWw7Ci0gICAgfQotCi0gICAgLyogc2V0dXAgdmVydGljYWwgYmFuZHMgKi8KLSAgICBudW1fYmFuZHMgPSAoaW50KSggKCByYXMubWF4X2V5IC0gcmFzLm1pbl9leSApIC8gcmFzLmJhbmRfc2l6ZSApOwotICAgIGlmICggbnVtX2JhbmRzID09IDAgKSAgbnVtX2JhbmRzID0gMTsKLSAgICBpZiAoIG51bV9iYW5kcyA+PSAzOSApIG51bV9iYW5kcyA9IDM5OwotCi0gICAgcmFzLmJhbmRfc2hvb3QgPSAwOwotCi0gICAgbWluICAgPSByYXMubWluX2V5OwotICAgIG1heF95ID0gcmFzLm1heF9leTsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2JhbmRzOyBuKyssIG1pbiA9IG1heCApCi0gICAgewotICAgICAgbWF4ID0gbWluICsgcmFzLmJhbmRfc2l6ZTsKLSAgICAgIGlmICggbiA9PSBudW1fYmFuZHMgLSAxIHx8IG1heCA+IG1heF95ICkKLSAgICAgICAgbWF4ID0gbWF4X3k7Ci0KLSAgICAgIGJhbmRzWzBdLm1pbiA9IG1pbjsKLSAgICAgIGJhbmRzWzBdLm1heCA9IG1heDsKLSAgICAgIGJhbmQgICAgICAgICA9IGJhbmRzOwotCi0gICAgICB3aGlsZSAoIGJhbmQgPj0gYmFuZHMgKQotICAgICAgewotICAgICAgICBUUG9zICBib3R0b20sIHRvcCwgbWlkZGxlOwotICAgICAgICBpbnQgICBlcnJvcjsKLQotICAgICAgICB7Ci0gICAgICAgICAgUENlbGwgIGNlbGxzX21heDsKLSAgICAgICAgICBpbnQgICAgeWluZGV4OwotICAgICAgICAgIGxvbmcgICBjZWxsX3N0YXJ0LCBjZWxsX2VuZCwgY2VsbF9tb2Q7Ci0KLQotICAgICAgICAgIHJhcy55Y2VsbHMgPSAoUENlbGwqKXJhcy5idWZmZXI7Ci0gICAgICAgICAgcmFzLnljb3VudCA9IGJhbmQtPm1heCAtIGJhbmQtPm1pbjsKLQotICAgICAgICAgIGNlbGxfc3RhcnQgPSBzaXplb2YgKCBQQ2VsbCApICogcmFzLnljb3VudDsKLSAgICAgICAgICBjZWxsX21vZCAgID0gY2VsbF9zdGFydCAlIHNpemVvZiAoIFRDZWxsICk7Ci0gICAgICAgICAgaWYgKCBjZWxsX21vZCA+IDAgKQotICAgICAgICAgICAgY2VsbF9zdGFydCArPSBzaXplb2YgKCBUQ2VsbCApIC0gY2VsbF9tb2Q7Ci0KLSAgICAgICAgICBjZWxsX2VuZCAgPSByYXMuYnVmZmVyX3NpemU7Ci0gICAgICAgICAgY2VsbF9lbmQgLT0gY2VsbF9lbmQgJSBzaXplb2YoIFRDZWxsICk7Ci0KLSAgICAgICAgICBjZWxsc19tYXggPSAoUENlbGwpKCAoY2hhciopcmFzLmJ1ZmZlciArIGNlbGxfZW5kICk7Ci0gICAgICAgICAgcmFzLmNlbGxzID0gKFBDZWxsKSggKGNoYXIqKXJhcy5idWZmZXIgKyBjZWxsX3N0YXJ0ICk7Ci0gICAgICAgICAgaWYgKCByYXMuY2VsbHMgPj0gY2VsbHNfbWF4ICkKLSAgICAgICAgICAgIGdvdG8gUmVkdWNlQmFuZHM7Ci0KLSAgICAgICAgICByYXMubWF4X2NlbGxzID0gY2VsbHNfbWF4IC0gcmFzLmNlbGxzOwotICAgICAgICAgIGlmICggcmFzLm1heF9jZWxscyA8IDIgKQotICAgICAgICAgICAgZ290byBSZWR1Y2VCYW5kczsKLQotICAgICAgICAgIGZvciAoIHlpbmRleCA9IDA7IHlpbmRleCA8IHJhcy55Y291bnQ7IHlpbmRleCsrICkKLSAgICAgICAgICAgIHJhcy55Y2VsbHNbeWluZGV4XSA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICByYXMubnVtX2NlbGxzID0gMDsKLSAgICAgICAgcmFzLmludmFsaWQgICA9IDE7Ci0gICAgICAgIHJhcy5taW5fZXkgICAgPSBiYW5kLT5taW47Ci0gICAgICAgIHJhcy5tYXhfZXkgICAgPSBiYW5kLT5tYXg7Ci0gICAgICAgIHJhcy5jb3VudF9leSAgPSBiYW5kLT5tYXggLSBiYW5kLT5taW47Ci0KLSAgICAgICAgZXJyb3IgPSBncmF5X2NvbnZlcnRfZ2x5cGhfaW5uZXIoIFJBU19WQVIgKTsKLQotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHsKLSAgICAgICAgICBncmF5X3N3ZWVwKCBSQVNfVkFSXyAmcmFzLnRhcmdldCApOwotICAgICAgICAgIGJhbmQtLTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggZXJyb3IgIT0gRXJyUmFzdGVyX01lbW9yeV9PdmVyZmxvdyApCi0gICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIFJlZHVjZUJhbmRzOgotICAgICAgICAvKiByZW5kZXIgcG9vbCBvdmVyZmxvdzsgd2Ugd2lsbCByZWR1Y2UgdGhlIHJlbmRlciBiYW5kIGJ5IGhhbGYgKi8KLSAgICAgICAgYm90dG9tID0gYmFuZC0+bWluOwotICAgICAgICB0b3AgICAgPSBiYW5kLT5tYXg7Ci0gICAgICAgIG1pZGRsZSA9IGJvdHRvbSArICggKCB0b3AgLSBib3R0b20gKSA+PiAxICk7Ci0KLSAgICAgICAgLyogVGhpcyBpcyB0b28gY29tcGxleCBmb3IgYSBzaW5nbGUgc2NhbmxpbmU7IHRoZXJlIG11c3QgKi8KLSAgICAgICAgLyogYmUgc29tZSBwcm9ibGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBtaWRkbGUgPT0gYm90dG9tICkKLSAgICAgICAgewotI2lmZGVmIERFQlVHX0dSQVlTCi0gICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiUm90dGVuIGdseXBoIVxuIiApOwotI2VuZGlmCi0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGJvdHRvbS10b3AgPj0gcmFzLmJhbmRfc2l6ZSApCi0gICAgICAgICAgcmFzLmJhbmRfc2hvb3QrKzsKLQotICAgICAgICBiYW5kWzFdLm1pbiA9IGJvdHRvbTsKLSAgICAgICAgYmFuZFsxXS5tYXggPSBtaWRkbGU7Ci0gICAgICAgIGJhbmRbMF0ubWluID0gbWlkZGxlOwotICAgICAgICBiYW5kWzBdLm1heCA9IHRvcDsKLSAgICAgICAgYmFuZCsrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggcmFzLmJhbmRfc2hvb3QgPiA4ICYmIHJhcy5iYW5kX3NpemUgPiAxNiApCi0gICAgICByYXMuYmFuZF9zaXplID0gcmFzLmJhbmRfc2l6ZSAvIDI7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBncmF5X3Jhc3Rlcl9yZW5kZXIoIFBSYXN0ZXIgICAgICAgICAgICAgICAgICByYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfUmFzdGVyX1BhcmFtcyogIHBhcmFtcyApCi0gIHsKLSAgICBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSAgICA9IChjb25zdCBGVF9PdXRsaW5lKilwYXJhbXMtPnNvdXJjZTsKLSAgICBjb25zdCBGVF9CaXRtYXAqICAgdGFyZ2V0X21hcCA9IHBhcmFtcy0+dGFyZ2V0OwotICAgIFBXb3JrZXIgICAgICAgICAgICB3b3JrZXI7Ci0KLQotICAgIGlmICggIXJhc3RlciB8fCAhcmFzdGVyLT5idWZmZXIgfHwgIXJhc3Rlci0+YnVmZmVyX3NpemUgKQotICAgICAgcmV0dXJuIEVyclJhc3Rlcl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm4gRXJyUmFzdGVyX0ludmFsaWRfT3V0bGluZTsKLQotICAgIC8qIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgb3V0bGluZSBpcyBlbXB0eSAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCB8fCBvdXRsaW5lLT5uX2NvbnRvdXJzIDw9IDAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoICFvdXRsaW5lLT5jb250b3VycyB8fCAhb3V0bGluZS0+cG9pbnRzICkKLSAgICAgIHJldHVybiBFcnJSYXN0ZXJfSW52YWxpZF9PdXRsaW5lOwotCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyAhPQotICAgICAgICAgICBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV0gKyAxICkKLSAgICAgIHJldHVybiBFcnJSYXN0ZXJfSW52YWxpZF9PdXRsaW5lOwotCi0gICAgd29ya2VyID0gcmFzdGVyLT53b3JrZXI7Ci0KLSAgICAvKiBpZiBkaXJlY3QgbW9kZSBpcyBub3Qgc2V0LCB3ZSBtdXN0IGhhdmUgYSB0YXJnZXQgYml0bWFwICovCi0gICAgaWYgKCAoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19ESVJFQ1QgKSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoICF0YXJnZXRfbWFwICkKLSAgICAgICAgcmV0dXJuIEVyclJhc3Rlcl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgICBpZiAoICF0YXJnZXRfbWFwLT53aWR0aCB8fCAhdGFyZ2V0X21hcC0+cm93cyApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICBpZiAoICF0YXJnZXRfbWFwLT5idWZmZXIgKQotICAgICAgICByZXR1cm4gRXJyUmFzdGVyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgfQotCi0gICAgLyogdGhpcyB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgbW9ub2Nocm9tZSByZW5kZXJpbmcgKi8KLSAgICBpZiAoICEoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19BQSApICkKLSAgICAgIHJldHVybiBFcnJSYXN0ZXJfSW52YWxpZF9Nb2RlOwotCi0gICAgLyogY29tcHV0ZSBjbGlwcGluZyBib3ggKi8KLSAgICBpZiAoICggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCApID09IDAgKQotICAgIHsKLSAgICAgIC8qIGNvbXB1dGUgY2xpcCBib3ggZnJvbSB0YXJnZXQgcGl4bWFwICovCi0gICAgICByYXMuY2xpcF9ib3gueE1pbiA9IDA7Ci0gICAgICByYXMuY2xpcF9ib3gueU1pbiA9IDA7Ci0gICAgICByYXMuY2xpcF9ib3gueE1heCA9IHRhcmdldF9tYXAtPndpZHRoOwotICAgICAgcmFzLmNsaXBfYm94LnlNYXggPSB0YXJnZXRfbWFwLT5yb3dzOwotICAgIH0KLSAgICBlbHNlIGlmICggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0NMSVAgKQotICAgIHsKLSAgICAgIHJhcy5jbGlwX2JveCA9IHBhcmFtcy0+Y2xpcF9ib3g7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByYXMuY2xpcF9ib3gueE1pbiA9IC0zMjc2OEw7Ci0gICAgICByYXMuY2xpcF9ib3gueU1pbiA9IC0zMjc2OEw7Ci0gICAgICByYXMuY2xpcF9ib3gueE1heCA9ICAzMjc2N0w7Ci0gICAgICByYXMuY2xpcF9ib3gueU1heCA9ICAzMjc2N0w7Ci0gICAgfQotCi0gICAgZ3JheV9pbml0X2NlbGxzKCB3b3JrZXIsIHJhc3Rlci0+YnVmZmVyLCByYXN0ZXItPmJ1ZmZlcl9zaXplICk7Ci0KLSAgICByYXMub3V0bGluZSAgICAgICAgPSAqb3V0bGluZTsKLSAgICByYXMubnVtX2NlbGxzICAgICAgPSAwOwotICAgIHJhcy5pbnZhbGlkICAgICAgICA9IDE7Ci0gICAgcmFzLmJhbmRfc2l6ZSAgICAgID0gcmFzdGVyLT5iYW5kX3NpemU7Ci0gICAgcmFzLm51bV9ncmF5X3NwYW5zID0gMDsKLQotICAgIGlmICggdGFyZ2V0X21hcCApCi0gICAgICByYXMudGFyZ2V0ID0gKnRhcmdldF9tYXA7Ci0KLSAgICByYXMucmVuZGVyX3NwYW4gICAgICA9IChGVF9SYXN0ZXJfU3Bhbl9GdW5jKWdyYXlfcmVuZGVyX3NwYW47Ci0gICAgcmFzLnJlbmRlcl9zcGFuX2RhdGEgPSAmcmFzOwotCi0gICAgaWYgKCBwYXJhbXMtPmZsYWdzICYgRlRfUkFTVEVSX0ZMQUdfRElSRUNUICkKLSAgICB7Ci0gICAgICByYXMucmVuZGVyX3NwYW4gICAgICA9IChGVF9SYXN0ZXJfU3Bhbl9GdW5jKXBhcmFtcy0+Z3JheV9zcGFuczsKLSAgICAgIHJhcy5yZW5kZXJfc3Bhbl9kYXRhID0gcGFyYW1zLT51c2VyOwotICAgIH0KLQotICAgIHJldHVybiBncmF5X2NvbnZlcnRfZ2x5cGgoIHdvcmtlciApOwotICB9Ci0KLQotICAvKioqKiBSQVNURVIgT0JKRUNUIENSRUFUSU9OOiBJbiBzdGFuZGFsb25lIG1vZGUsIHdlIHNpbXBseSB1c2UgKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgIGEgc3RhdGljIG9iamVjdC4gICAgICAgICAgICAgICAgICAqKioqKi8KLQotI2lmZGVmIF9TVEFOREFMT05FXwotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9yYXN0ZXJfbmV3KCB2b2lkKiAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgRlRfUmFzdGVyKiAgYXJhc3RlciApCi0gIHsKLSAgICBzdGF0aWMgVFJhc3RlciAgdGhlX3Jhc3RlcjsKLQotICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0KLQotICAgICphcmFzdGVyID0gKEZUX1Jhc3RlcikmdGhlX3Jhc3RlcjsKLSAgICBGVF9NRU1fWkVSTyggJnRoZV9yYXN0ZXIsIHNpemVvZiAoIHRoZV9yYXN0ZXIgKSApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmFzdGVyX2RvbmUoIEZUX1Jhc3RlciAgcmFzdGVyICkKLSAgewotICAgIC8qIG5vdGhpbmcgKi8KLSAgICBGVF9VTlVTRUQoIHJhc3RlciApOwotICB9Ci0KLSNlbHNlIC8qIF9TVEFOREFMT05FXyAqLwotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9yYXN0ZXJfbmV3KCBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgRlRfUmFzdGVyKiAgYXJhc3RlciApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgUFJhc3RlciAgIHJhc3RlcjsKLQotCi0gICAgKmFyYXN0ZXIgPSAwOwotICAgIGlmICggIUZUX0FMTE9DKCByYXN0ZXIsIHNpemVvZiAoIFRSYXN0ZXIgKSApICkKLSAgICB7Ci0gICAgICByYXN0ZXItPm1lbW9yeSA9IG1lbW9yeTsKLSAgICAgICphcmFzdGVyID0gKEZUX1Jhc3RlcilyYXN0ZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBncmF5X3Jhc3Rlcl9kb25lKCBGVF9SYXN0ZXIgIHJhc3RlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IChGVF9NZW1vcnkpKChQUmFzdGVyKXJhc3RlciktPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggcmFzdGVyICk7Ci0gIH0KLQotI2VuZGlmIC8qIF9TVEFOREFMT05FXyAqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9yYXN0ZXJfcmVzZXQoIEZUX1Jhc3RlciAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICBwb29sX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHBvb2xfc2l6ZSApCi0gIHsKLSAgICBQUmFzdGVyICByYXN0ID0gKFBSYXN0ZXIpcmFzdGVyOwotCi0KLSAgICBpZiAoIHJhc3RlciApCi0gICAgewotICAgICAgaWYgKCBwb29sX2Jhc2UgJiYgcG9vbF9zaXplID49IChsb25nKXNpemVvZiAoIFRXb3JrZXIgKSArIDIwNDggKQotICAgICAgewotICAgICAgICBQV29ya2VyICB3b3JrZXIgPSAoUFdvcmtlcilwb29sX2Jhc2U7Ci0KLQotICAgICAgICByYXN0LT53b3JrZXIgICAgICA9IHdvcmtlcjsKLSAgICAgICAgcmFzdC0+YnVmZmVyICAgICAgPSBwb29sX2Jhc2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHNpemVvZiAoIFRXb3JrZXIgKSArIHNpemVvZiAoIFRDZWxsICkgLSAxICkgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCBzaXplb2YgKCBUQ2VsbCApIC0gMSApICk7Ci0gICAgICAgIHJhc3QtPmJ1ZmZlcl9zaXplID0gKGxvbmcpKCAoIHBvb2xfYmFzZSArIHBvb2xfc2l6ZSApIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilyYXN0LT5idWZmZXIgKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oIHNpemVvZiAoIFRDZWxsICkgLSAxICk7Ci0gICAgICAgIHJhc3QtPmJhbmRfc2l6ZSAgID0gKGludCkoIHJhc3QtPmJ1ZmZlcl9zaXplIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHNpemVvZiAoIFRDZWxsICkgKiA4ICkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmFzdC0+YnVmZmVyICAgICAgPSBOVUxMOwotICAgICAgICByYXN0LT5idWZmZXJfc2l6ZSA9IDA7Ci0gICAgICAgIHJhc3QtPndvcmtlciAgICAgID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIGNvbnN0IEZUX1Jhc3Rlcl9GdW5jcyAgZnRfZ3JheXNfcmFzdGVyID0KLSAgewotICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLAotCi0gICAgKEZUX1Jhc3Rlcl9OZXdfRnVuYykgICAgIGdyYXlfcmFzdGVyX25ldywKLSAgICAoRlRfUmFzdGVyX1Jlc2V0X0Z1bmMpICAgZ3JheV9yYXN0ZXJfcmVzZXQsCi0gICAgKEZUX1Jhc3Rlcl9TZXRfTW9kZV9GdW5jKTAsCi0gICAgKEZUX1Jhc3Rlcl9SZW5kZXJfRnVuYykgIGdyYXlfcmFzdGVyX3JlbmRlciwKLSAgICAoRlRfUmFzdGVyX0RvbmVfRnVuYykgICAgZ3JheV9yYXN0ZXJfZG9uZQotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9mdGdyYXlzLmggYi9zcmMvc21vb3RoL2Z0Z3JheXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0MDk1NC4uMDAwMDAwMAotLS0gYS9zcmMvc21vb3RoL2Z0Z3JheXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z3JheXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzbW9vdGggcmVuZGVyZXIgZGVjbGFyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUR1JBWVNfSF9fCi0jZGVmaW5lIF9fRlRHUkFZU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gIGV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotI2lmZGVmIF9TVEFOREFMT05FXwotI2luY2x1ZGUgImZ0aW1hZ2UuaCIKLSNlbHNlCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lNQUdFX0gKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUbyBtYWtlIGZ0Z3JheXMuaCBpbmRlcGVuZGVudCBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2UgY2hlY2sgICAgICAgKi8KLSAgLyogd2hldGhlciBGVF9FWFBPUlRfVkFSIGhhcyBiZWVuIGRlZmluZWQgYWxyZWFkeS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPbiBzb21lIHN5c3RlbXMgYW5kIGNvbXBpbGVycyAoV2luMzIgbW9zdGx5KSwgYW4gZXh0cmEga2V5d29yZCBpcyAgICAgKi8KLSAgLyogbmVjZXNzYXJ5IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgYXMgYSBETEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FWFBPUlRfVkFSCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9SYXN0ZXJfRnVuY3MgKSAgZnRfZ3JheXNfcmFzdGVyOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICB9Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fRlRHUkFZU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRzbWVycnMuaCBiL3NyYy9zbW9vdGgvZnRzbWVycnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyYTJlYy4uMDAwMDAwMAotLS0gYS9zcmMvc21vb3RoL2Z0c21lcnJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNtZXJycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgc21vb3RoIHJlbmRlcmVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIHNtb290aCByZW5kZXJlciBlcnJvciBlbnVtZXJhdGlvbiAgICAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0ZUU01FUlJTX0hfXwotI2RlZmluZSBfX0ZUU01FUlJTX0hfXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgU21vb3RoX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9TbW9vdGgKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIF9fRlRTTUVSUlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc21vb3RoL2Z0c21vb3RoLmMgYi9zcmMvc21vb3RoL2Z0c21vb3RoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDA0ZWIuLjAwMDAwMDAKLS0tIGEvc3JjL3Ntb290aC9mdHNtb290aC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c21vb3RoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBbnRpLWFsaWFzaW5nIHJlbmRlcmVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgImZ0c21vb3RoLmgiCi0jaW5jbHVkZSAiZnRncmF5cy5oIgotCi0jaW5jbHVkZSAiZnRzbWVycnMuaCIKLQotCi0gIC8qIGluaXRpYWxpemUgcmVuZGVyZXIgLS0gaW5pdCBpdHMgcmFzdGVyICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfaW5pdCggRlRfUmVuZGVyZXIgIHJlbmRlciApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gRlRfTU9EVUxFX0xJQlJBUlkoIHJlbmRlciApOwotCi0KLSAgICByZW5kZXItPmNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9yZXNldCggcmVuZGVyLT5yYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnktPnJhc3Rlcl9wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LT5yYXN0ZXJfcG9vbF9zaXplICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogc2V0cyByZW5kZXItc3BlY2lmaWMgbW9kZSAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3NldF9tb2RlKCBGVF9SZW5kZXJlciAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBtb2RlX3RhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgZGF0YSApCi0gIHsKLSAgICAvKiB3ZSBzaW1wbHkgcGFzcyBpdCB0byB0aGUgcmFzdGVyICovCi0gICAgcmV0dXJuIHJlbmRlci0+Y2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX3NldF9tb2RlKCByZW5kZXItPnJhc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSApOwotICB9Ci0KLSAgLyogdHJhbnNmb3JtIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF90cmFuc2Zvcm0oIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBkZWx0YSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBTbW9vdGhfRXJyX09rOwotCi0KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSByZW5kZXItPmdseXBoX2Zvcm1hdCApCi0gICAgewotICAgICAgZXJyb3IgPSBTbW9vdGhfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBtYXRyaXggKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oICZzbG90LT5vdXRsaW5lLCBtYXRyaXggKTsKLQotICAgIGlmICggZGVsdGEgKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZzbG90LT5vdXRsaW5lLCBkZWx0YS0+eCwgZGVsdGEtPnkgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcmV0dXJuIHRoZSBnbHlwaCdzIGNvbnRyb2wgYm94ICovCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3Ntb290aF9nZXRfY2JveCggRlRfUmVuZGVyZXIgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3gqICAgICAgY2JveCApCi0gIHsKLSAgICBGVF9NRU1fWkVSTyggY2JveCwgc2l6ZW9mICggKmNib3ggKSApOwotCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgPT0gcmVuZGVyLT5nbHlwaF9mb3JtYXQgKQotICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJnNsb3QtPm91dGxpbmUsIGNib3ggKTsKLSAgfQotCi0KLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIHJlcXVpcmVkX21vZGUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gTlVMTDsKLSAgICBGVF9CQm94ICAgICAgY2JveDsKLSAgICBGVF9VSW50ICAgICAgd2lkdGgsIGhlaWdodCwgaGVpZ2h0X29yZywgd2lkdGhfb3JnLCBwaXRjaDsKLSAgICBGVF9CaXRtYXAqICAgYml0bWFwOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnk7Ci0gICAgRlRfSW50ICAgICAgIGhtdWwgPSBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRDsKLSAgICBGVF9JbnQgICAgICAgdm11bCA9IG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1Y7Ci0gICAgRlRfUG9zICAgICAgIHhfc2hpZnQsIHlfc2hpZnQsIHhfbGVmdCwgeV90b3A7Ci0KLSAgICBGVF9SYXN0ZXJfUGFyYW1zICBwYXJhbXM7Ci0KLQotICAgIC8qIGNoZWNrIGdseXBoIGltYWdlIGZvcm1hdCAqLwotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IHJlbmRlci0+Z2x5cGhfZm9ybWF0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFNtb290aF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBtb2RlICovCi0gICAgaWYgKCBtb2RlICE9IHJlcXVpcmVkX21vZGUgKQotICAgICAgcmV0dXJuIFNtb290aF9FcnJfQ2Fubm90X1JlbmRlcl9HbHlwaDsKLQotICAgIG91dGxpbmUgPSAmc2xvdC0+b3V0bGluZTsKLQotICAgIC8qIHRyYW5zbGF0ZSB0aGUgb3V0bGluZSB0byB0aGUgbmV3IG9yaWdpbiBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIG9yaWdpbiApCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgb3JpZ2luLT54LCBvcmlnaW4tPnkgKTsKLQotICAgIC8qIGNvbXB1dGUgdGhlIGNvbnRyb2wgYm94LCBhbmQgZ3JpZCBmaXQgaXQgKi8KLSAgICBGVF9PdXRsaW5lX0dldF9DQm94KCBvdXRsaW5lLCAmY2JveCApOwotCi0gICAgY2JveC54TWluID0gRlRfUElYX0ZMT09SKCBjYm94LnhNaW4gKTsKLSAgICBjYm94LnlNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueU1pbiApOwotICAgIGNib3gueE1heCA9IEZUX1BJWF9DRUlMKCBjYm94LnhNYXggKTsKLSAgICBjYm94LnlNYXggPSBGVF9QSVhfQ0VJTCggY2JveC55TWF4ICk7Ci0KLSAgICB3aWR0aCAgPSAoRlRfVUludCkoICggY2JveC54TWF4IC0gY2JveC54TWluICkgPj4gNiApOwotICAgIGhlaWdodCA9IChGVF9VSW50KSggKCBjYm94LnlNYXggLSBjYm94LnlNaW4gKSA+PiA2ICk7Ci0gICAgYml0bWFwID0gJnNsb3QtPmJpdG1hcDsKLSAgICBtZW1vcnkgPSByZW5kZXItPnJvb3QubWVtb3J5OwotCi0gICAgd2lkdGhfb3JnICA9IHdpZHRoOwotICAgIGhlaWdodF9vcmcgPSBoZWlnaHQ7Ci0KLSAgICAvKiByZWxlYXNlIG9sZCBiaXRtYXAgYnVmZmVyICovCi0gICAgaWYgKCBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJiBGVF9HTFlQSF9PV05fQklUTUFQICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBiaXRtYXAtPmJ1ZmZlciApOwotICAgICAgc2xvdC0+aW50ZXJuYWwtPmZsYWdzICY9IH5GVF9HTFlQSF9PV05fQklUTUFQOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIG5ldyBvbmUsIGRlcGVuZHMgb24gcGl4ZWwgZm9ybWF0ICovCi0gICAgcGl0Y2ggPSB3aWR0aDsKLSAgICBpZiAoIGhtdWwgKQotICAgIHsKLSAgICAgIHdpZHRoID0gd2lkdGggKiAzOwotICAgICAgcGl0Y2ggPSBGVF9QQURfQ0VJTCggd2lkdGgsIDQgKTsKLSAgICB9Ci0KLSAgICBpZiAoIHZtdWwgKQotICAgICAgaGVpZ2h0ICo9IDM7Ci0KLSAgICB4X3NoaWZ0ID0gKEZUX0ludCkgY2JveC54TWluOwotICAgIHlfc2hpZnQgPSAoRlRfSW50KSBjYm94LnlNaW47Ci0gICAgeF9sZWZ0ICA9IChGVF9JbnQpKCBjYm94LnhNaW4gPj4gNiApOwotICAgIHlfdG9wICAgPSAoRlRfSW50KSggY2JveC55TWF4ID4+IDYgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HCi0KLSAgICBpZiAoIHNsb3QtPmxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYyApCi0gICAgewotICAgICAgRlRfSW50ICBleHRyYSA9IHNsb3QtPmxpYnJhcnktPmxjZF9leHRyYTsKLQotCi0gICAgICBpZiAoIGhtdWwgKQotICAgICAgewotICAgICAgICB4X3NoaWZ0IC09IDY0ICogKCBleHRyYSA+PiAxICk7Ci0gICAgICAgIHdpZHRoICAgKz0gMyAqIGV4dHJhOwotICAgICAgICBwaXRjaCAgICA9IEZUX1BBRF9DRUlMKCB3aWR0aCwgNCApOwotICAgICAgICB4X2xlZnQgIC09IGV4dHJhID4+IDE7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdm11bCApCi0gICAgICB7Ci0gICAgICAgIHlfc2hpZnQgLT0gNjQgKiAoIGV4dHJhID4+IDEgKTsKLSAgICAgICAgaGVpZ2h0ICArPSAzICogZXh0cmE7Ci0gICAgICAgIHlfdG9wICAgKz0gZXh0cmEgPj4gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgYml0bWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZOwotICAgIGJpdG1hcC0+bnVtX2dyYXlzICA9IDI1NjsKLSAgICBiaXRtYXAtPndpZHRoICAgICAgPSB3aWR0aDsKLSAgICBiaXRtYXAtPnJvd3MgICAgICAgPSBoZWlnaHQ7Ci0gICAgYml0bWFwLT5waXRjaCAgICAgID0gcGl0Y2g7Ci0KLSAgICAvKiB0cmFuc2xhdGUgb3V0bGluZSB0byByZW5kZXIgaXQgaW50byB0aGUgYml0bWFwICovCi0gICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsIC14X3NoaWZ0LCAteV9zaGlmdCApOwotCi0gICAgaWYgKCBGVF9BTExPQyggYml0bWFwLT5idWZmZXIsIChGVF9VTG9uZylwaXRjaCAqIGhlaWdodCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHNsb3QtPmludGVybmFsLT5mbGFncyB8PSBGVF9HTFlQSF9PV05fQklUTUFQOwotCi0gICAgLyogc2V0IHVwIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMudGFyZ2V0ID0gYml0bWFwOwotICAgIHBhcmFtcy5zb3VyY2UgPSBvdXRsaW5lOwotICAgIHBhcmFtcy5mbGFncyAgPSBGVF9SQVNURVJfRkxBR19BQTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HCi0KLSAgICAvKiBpbXBsb2RlIG91dGxpbmUgaWYgbmVlZGVkICovCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgcG9pbnRzICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHBvaW50c19lbmQgPSBwb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHZlYzsKLQotCi0gICAgICBpZiAoIGhtdWwgKQotICAgICAgICBmb3IgKCB2ZWMgPSBwb2ludHM7IHZlYyA8IHBvaW50c19lbmQ7IHZlYysrICkKLSAgICAgICAgICB2ZWMtPnggKj0gMzsKLQotICAgICAgaWYgKCB2bXVsICkKLSAgICAgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCi0gICAgICAgICAgdmVjLT55ICo9IDM7Ci0gICAgfQotCi0gICAgLyogcmVuZGVyIG91dGxpbmUgaW50byB0aGUgYml0bWFwICovCi0gICAgZXJyb3IgPSByZW5kZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlci0+cmFzdGVyLCAmcGFyYW1zICk7Ci0KLSAgICAvKiBkZWZsYXRlIG91dGxpbmUgaWYgbmVlZGVkICovCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgcG9pbnRzICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHBvaW50c19lbmQgPSBwb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHZlYzsKLQotCi0gICAgICBpZiAoIGhtdWwgKQotICAgICAgICBmb3IgKCB2ZWMgPSBwb2ludHM7IHZlYyA8IHBvaW50c19lbmQ7IHZlYysrICkKLSAgICAgICAgICB2ZWMtPnggLz0gMzsKLQotICAgICAgaWYgKCB2bXVsICkKLSAgICAgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCi0gICAgICAgICAgdmVjLT55IC89IDM7Ci0gICAgfQotCi0gICAgaWYgKCBzbG90LT5saWJyYXJ5LT5sY2RfZmlsdGVyX2Z1bmMgKQotICAgICAgc2xvdC0+bGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jKCBiaXRtYXAsIG1vZGUsIHNsb3QtPmxpYnJhcnkgKTsKLQotI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICovCi0KLSAgICAvKiByZW5kZXIgb3V0bGluZSBpbnRvIGJpdG1hcCAqLwotICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOwotCi0gICAgLyogZXhwYW5kIGl0IGhvcml6b250YWxseSAqLwotICAgIGlmICggaG11bCApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGxpbmUgPSBiaXRtYXAtPmJ1ZmZlcjsKLSAgICAgIEZUX1VJbnQgICBoaDsKLQotCi0gICAgICBmb3IgKCBoaCA9IGhlaWdodF9vcmc7IGhoID4gMDsgaGgtLSwgbGluZSArPSBwaXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgICB4eDsKLSAgICAgICAgRlRfQnl0ZSogIGVuZCA9IGxpbmUgKyB3aWR0aDsKLQotCi0gICAgICAgIGZvciAoIHh4ID0gd2lkdGhfb3JnOyB4eCA+IDA7IHh4LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgcGl4ZWwgPSBsaW5lW3h4LTFdOwotCi0KLSAgICAgICAgICBlbmRbLTNdID0gKEZUX0J5dGUpcGl4ZWw7Ci0gICAgICAgICAgZW5kWy0yXSA9IChGVF9CeXRlKXBpeGVsOwotICAgICAgICAgIGVuZFstMV0gPSAoRlRfQnl0ZSlwaXhlbDsKLSAgICAgICAgICBlbmQgICAgLT0gMzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIGV4cGFuZCBpdCB2ZXJ0aWNhbGx5ICovCi0gICAgaWYgKCB2bXVsICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgcmVhZCAgPSBiaXRtYXAtPmJ1ZmZlciArICggaGVpZ2h0IC0gaGVpZ2h0X29yZyApICogcGl0Y2g7Ci0gICAgICBGVF9CeXRlKiAgd3JpdGUgPSBiaXRtYXAtPmJ1ZmZlcjsKLSAgICAgIEZUX1VJbnQgICBoaDsKLQotCi0gICAgICBmb3IgKCBoaCA9IGhlaWdodF9vcmc7IGhoID4gMDsgaGgtLSApCi0gICAgICB7Ci0gICAgICAgIG1lbWNweSggd3JpdGUsIHJlYWQsIHBpdGNoICk7Ci0gICAgICAgIHdyaXRlICs9IHBpdGNoOwotCi0gICAgICAgIG1lbWNweSggd3JpdGUsIHJlYWQsIHBpdGNoICk7Ci0gICAgICAgIHdyaXRlICs9IHBpdGNoOwotCi0gICAgICAgIG1lbWNweSggd3JpdGUsIHJlYWQsIHBpdGNoICk7Ci0gICAgICAgIHdyaXRlICs9IHBpdGNoOwotICAgICAgICByZWFkICArPSBwaXRjaDsKLSAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KLQotICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBvdXRsaW5lLCB4X3NoaWZ0LCB5X3NoaWZ0ICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHNsb3QtPmZvcm1hdCAgICAgID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKLSAgICBzbG90LT5iaXRtYXBfbGVmdCA9IHhfbGVmdDsKLSAgICBzbG90LT5iaXRtYXBfdG9wICA9IHlfdG9wOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBvdXRsaW5lICYmIG9yaWdpbiApCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgLW9yaWdpbi0+eCwgLW9yaWdpbi0+eSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBjb252ZXJ0IGEgc2xvdCdzIGdseXBoIGltYWdlIGludG8gYSBiaXRtYXAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9yZW5kZXIoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgb3JpZ2luICkKLSAgewotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCApCi0gICAgICBtb2RlID0gRlRfUkVOREVSX01PREVfTk9STUFMOwotCi0gICAgcmV0dXJuIGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyggcmVuZGVyLCBzbG90LCBtb2RlLCBvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUkVOREVSX01PREVfTk9STUFMICk7Ci0gIH0KLQotCi0gIC8qIGNvbnZlcnQgYSBzbG90J3MgZ2x5cGggaW1hZ2UgaW50byBhIGhvcml6b250YWwgTENEIGJpdG1hcCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3JlbmRlcl9sY2QoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgb3JpZ2luICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIGVycm9yID0gZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKCByZW5kZXIsIHNsb3QsIG1vZGUsIG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUkVOREVSX01PREVfTENEICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgc2xvdC0+Yml0bWFwLnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0xDRDsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgdmVydGljYWwgTENEIGJpdG1hcCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3JlbmRlcl9sY2RfdiggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0gICAgZXJyb3IgPSBmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMoIHJlbmRlciwgc2xvdCwgbW9kZSwgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SRU5ERVJfTU9ERV9MQ0RfViApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgIHNsb3QtPmJpdG1hcC5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9MQ0RfVjsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSLAotICAgICAgc2l6ZW9mKCBGVF9SZW5kZXJlclJlYyApLAotCi0gICAgICAic21vb3RoIiwKLSAgICAgIDB4MTAwMDBMLAotICAgICAgMHgyMDAwMEwsCi0KLSAgICAgIDAsICAgIC8qIG1vZHVsZSBzcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilmdF9zbW9vdGhfaW5pdCwKLSAgICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgMCwKLSAgICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgMAotICAgIH0sCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSAgIGZ0X3Ntb290aF9yZW5kZXIsCi0gICAgKEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMpZnRfc21vb3RoX3RyYW5zZm9ybSwKLSAgICAoRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMpICBmdF9zbW9vdGhfZ2V0X2Nib3gsCi0gICAgKEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSAgZnRfc21vb3RoX3NldF9tb2RlLAotCi0gICAgKEZUX1Jhc3Rlcl9GdW5jcyopICAgICZmdF9ncmF5c19yYXN0ZXIKLSAgfTsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyAgZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcyA9Ci0gIHsKLSAgICB7Ci0gICAgICBGVF9NT0RVTEVfUkVOREVSRVIsCi0gICAgICBzaXplb2YoIEZUX1JlbmRlcmVyUmVjICksCi0KLSAgICAgICJzbW9vdGgtbGNkIiwKLSAgICAgIDB4MTAwMDBMLAotICAgICAgMHgyMDAwMEwsCi0KLSAgICAgIDAsICAgIC8qIG1vZHVsZSBzcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilmdF9zbW9vdGhfaW5pdCwKLSAgICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgMCwKLSAgICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgMAotICAgIH0sCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSAgIGZ0X3Ntb290aF9yZW5kZXJfbGNkLAotICAgIChGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jKWZ0X3Ntb290aF90cmFuc2Zvcm0sCi0gICAgKEZUX1JlbmRlcmVyX0dldENCb3hGdW5jKSAgZnRfc21vb3RoX2dldF9jYm94LAotICAgIChGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYykgIGZ0X3Ntb290aF9zZXRfbW9kZSwKLQotICAgIChGVF9SYXN0ZXJfRnVuY3MqKSAgICAmZnRfZ3JheXNfcmFzdGVyCi0gIH07Ci0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyAgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSLAotICAgICAgc2l6ZW9mKCBGVF9SZW5kZXJlclJlYyApLAotCi0gICAgICAic21vb3RoLWxjZHYiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgMCwgICAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKWZ0X3Ntb290aF9pbml0LAotICAgICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSAwLAotICAgICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICAwCi0gICAgfSwKLQotICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLAotCi0gICAgKEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMpICAgZnRfc21vb3RoX3JlbmRlcl9sY2RfdiwKLSAgICAoRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYylmdF9zbW9vdGhfdHJhbnNmb3JtLAotICAgIChGVF9SZW5kZXJlcl9HZXRDQm94RnVuYykgIGZ0X3Ntb290aF9nZXRfY2JveCwKLSAgICAoRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMpICBmdF9zbW9vdGhfc2V0X21vZGUsCi0KLSAgICAoRlRfUmFzdGVyX0Z1bmNzKikgICAgJmZ0X2dyYXlzX3Jhc3RlcgotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9mdHNtb290aC5oIGIvc3JjL3Ntb290aC9mdHNtb290aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmNjZWQ0Li4wMDAwMDAwCi0tLSBhL3NyYy9zbW9vdGgvZnRzbW9vdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c21vb3RoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBbnRpLWFsaWFzaW5nIHJlbmRlcmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUU01PT1RIX0hfXwotI2RlZmluZSBfX0ZUU01PT1RIX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfUkVOREVSX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fTk9fU1REX1JBU1RFUgotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyApICBmdF9zdGRfcmVuZGVyZXJfY2xhc3M7Ci0jZW5kaWYKLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX1NNT09USF9SQVNURVIKLSAgRlRfRVhQT1JUX1ZBUiggY29uc3QgRlRfUmVuZGVyZXJfQ2xhc3MgKSAgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzOwotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICkgIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3M7Ci0KLSAgRlRfRVhQT1JUX1ZBUiggY29uc3QgRlRfUmVuZGVyZXJfQ2xhc3MgKSAgZnRfc21vb3RoX2xjZF92X3JlbmRlcmVyX2NsYXNzOwotI2VuZGlmCi0KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUU01PT1RIX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9zbW9vdGguYyBiL3NyYy9zbW9vdGgvc21vb3RoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNmJlM2UuLjAwMDAwMDAKLS0tIGEvc3JjL3Ntb290aC9zbW9vdGguYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNtb290aC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBhbnRpLWFsaWFzaW5nIHJhc3RlcmVyIG1vZHVsZSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImZ0Z3JheXMuYyIKLSNpbmNsdWRlICJmdHNtb290aC5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3RydWV0eXBlLmMgYi9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2NDczYS4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHRydWV0eXBlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBUcnVlVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDA0LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0ZHJpdmVyLmMiICAgLyogZHJpdmVyIGludGVyZmFjZSAgICAqLwotI2luY2x1ZGUgInR0cGxvYWQuYyIgICAgLyogdGFibGVzIGxvYWRlciAgICAgICAqLwotI2luY2x1ZGUgInR0Z2xvYWQuYyIgICAgLyogZ2x5cGggbG9hZGVyICAgICAgICAqLwotI2luY2x1ZGUgInR0b2Jqcy5jIiAgICAgLyogb2JqZWN0IG1hbmFnZXIgICAgICAqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0jaW5jbHVkZSAidHRpbnRlcnAuYyIKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgInR0Z3h2YXIuYyIgICAgLyogZ3ggZGlzdG9ydGFibGUgZm9udCAqLwotI2VuZGlmCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyBiL3NyYy90cnVldHlwZS90dGRyaXZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ3Y2Y1Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dGRyaXZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0ZHJpdmVyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBmb250IGRyaXZlciBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IGJ5ICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2VuZGlmCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFJVRVRZUEVfRU5HSU5FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFJVRVRZUEVfR0xZRl9ICi0KLSNpbmNsdWRlICJ0dGRyaXZlci5oIgotI2luY2x1ZGUgInR0Z2xvYWQuaCIKLSNpbmNsdWRlICJ0dHBsb2FkLmgiCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSAidHRneHZhci5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRkcml2ZXIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEYgQSBDIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIFBBSVJfVEFHCi0jZGVmaW5lIFBBSVJfVEFHKCBsZWZ0LCByaWdodCApICAoICggKEZUX1VMb25nKWxlZnQgPDwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpcmlnaHQgICAgICAgICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2dldF9rZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLwotICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICovCi0gIC8qICAgIGtlcm5pbmdzLCBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X2dldF9rZXJuaW5nKCBGVF9GYWNlICAgICB0dGZhY2UsICAgICAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGtlcm5pbmcgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICBmYWNlID0gKFRUX0ZhY2UpdHRmYWNlOwotICAgIFNGTlRfU2VydmljZSAgc2ZudCA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotCi0gICAga2VybmluZy0+eCA9IDA7Ci0gICAga2VybmluZy0+eSA9IDA7Ci0KLSAgICBpZiAoIHNmbnQgKQotICAgICAga2VybmluZy0+eCA9IHNmbnQtPmdldF9rZXJuaW5nKCBmYWNlLCBsZWZ0X2dseXBoLCByaWdodF9nbHlwaCApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0jdW5kZWYgUEFJUl9UQUcKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9nZXRfYWR2YW5jZXMoIEZUX0ZhY2UgICAgdHRmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYWR2YW5jZXMgKQotICB7Ci0gICAgRlRfVUludCAgbm47Ci0gICAgVFRfRmFjZSAgZmFjZSAgPSAoVFRfRmFjZSkgdHRmYWNlOwotICAgIEZUX0Jvb2wgIGNoZWNrID0gRlRfQk9PTCghKGZsYWdzICYgRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpKTsKLQotICAgIC8qIFhYWDogVE9ETzogY2hlY2sgZm9yIHNiaXRzICovCi0KLSAgICBpZiAoZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCkKLSAgICB7Ci0gICAgICBmb3IgKG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKykKLSAgICAgIHsKLSAgICAgICAgRlRfU2hvcnQgICB0c2I7Ci0gICAgICAgIEZUX1VTaG9ydCAgYWg7Ci0KLSAgICAgICAgVFRfR2V0X1ZNZXRyaWNzKCBmYWNlLCBzdGFydCArIG5uLCBjaGVjaywgJnRzYiwgJmFoICk7Ci0gICAgICAgIGFkdmFuY2VzW25uXSA9IGFoOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChubiA9IDA7IG5uIDwgY291bnQ7IG5uKyspCi0gICAgICB7Ci0gICAgICAgIEZUX1Nob3J0ICAgbHNiOwotICAgICAgICBGVF9VU2hvcnQgIGF3OwotCi0gICAgICAgIFRUX0dldF9ITWV0cmljcyggZmFjZSwgc3RhcnQgKyBubiwgY2hlY2ssICZsc2IsICZhdyApOwotICAgICAgICBhZHZhbmNlc1tubl0gPSBhdzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgUyBJIFogRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zaXplX3NlbGVjdCggRlRfU2l6ZSAgIHNpemUsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICkKLSAgewotICAgIFRUX0ZhY2UgICB0dGZhY2UgPSAoVFRfRmFjZSlzaXplLT5mYWNlOwotICAgIFRUX1NpemUgICB0dHNpemUgPSAoVFRfU2l6ZSlzaXplOwotICAgIEZUX0Vycm9yICBlcnJvciAgPSBUVF9FcnJfT2s7Ci0KLQotICAgIHR0c2l6ZS0+c3RyaWtlX2luZGV4ID0gc3RyaWtlX2luZGV4OwotCi0gICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggc2l6ZS0+ZmFjZSApICkKLSAgICB7Ci0gICAgICAvKiB1c2UgdGhlIHNjYWxlZCBtZXRyaWNzLCBldmVuIHdoZW4gdHRfc2l6ZV9yZXNldCBmYWlscyAqLwotICAgICAgRlRfU2VsZWN0X01ldHJpY3MoIHNpemUtPmZhY2UsIHN0cmlrZV9pbmRleCApOwotCi0gICAgICB0dF9zaXplX3Jlc2V0KCB0dHNpemUgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFNGTlRfU2VydmljZSAgICAgIHNmbnQgICAgPSAoU0ZOVF9TZXJ2aWNlKSB0dGZhY2UtPnNmbnQ7Ci0gICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzID0gJnNpemUtPm1ldHJpY3M7Ci0KLQotICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX3N0cmlrZV9tZXRyaWNzKCB0dGZhY2UsIHN0cmlrZV9pbmRleCwgbWV0cmljcyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHR0c2l6ZS0+c3RyaWtlX2luZGV4ID0gMHhGRkZGRkZGRlVMOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2l6ZV9yZXF1ZXN0KCBGVF9TaXplICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgVFRfU2l6ZSAgIHR0c2l6ZSA9IChUVF9TaXplKXNpemU7Ci0gICAgRlRfRXJyb3IgIGVycm9yICA9IFRUX0Vycl9PazsKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgICBpZiAoIEZUX0hBU19GSVhFRF9TSVpFUyggc2l6ZS0+ZmFjZSApICkKLSAgICB7Ci0gICAgICBUVF9GYWNlICAgICAgIHR0ZmFjZSA9IChUVF9GYWNlKXNpemUtPmZhY2U7Ci0gICAgICBTRk5UX1NlcnZpY2UgIHNmbnQgICA9IChTRk5UX1NlcnZpY2UpIHR0ZmFjZS0+c2ZudDsKLSAgICAgIEZUX1VMb25nICAgICAgc3RyaWtlX2luZGV4OwotCi0KLSAgICAgIGVycm9yID0gc2ZudC0+c2V0X3NiaXRfc3RyaWtlKCB0dGZhY2UsIHJlcSwgJnN0cmlrZV9pbmRleCApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgdHRzaXplLT5zdHJpa2VfaW5kZXggPSAweEZGRkZGRkZGVUw7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiB0dF9zaXplX3NlbGVjdCggc2l6ZSwgc3RyaWtlX2luZGV4ICk7Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLSAgICBGVF9SZXF1ZXN0X01ldHJpY3MoIHNpemUtPmZhY2UsIHJlcSApOwotCi0gICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggc2l6ZS0+ZmFjZSApICkKLSAgICAgIGVycm9yID0gdHRfc2l6ZV9yZXNldCggdHRzaXplICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIGxvYWQgYSBnbHlwaCB3aXRoaW4gYSBnaXZlbiBnbHlwaCBzbG90LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2xvdCBvYmplY3Qgd2hlcmUgdGhlIGdseXBoICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGxvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBzaXplIGF0IHdoaWNoIHRoZSBnbHlwaCAqLwotICAvKiAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHNjYWxlZCwgbG9hZGVkLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggaW4gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogQSBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBsb2FkIGZvciB0aGlzIGdseXBoLiAgVGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEZUTE9BRF8/Pz8gY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sIHdoZXRoZXIgdGhlIG91dGxpbmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNjYWxlZCwgd2hldGhlciB0byBsb2FkIGJpdG1hcHMgb3Igbm90LCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIExvYWRfR2x5cGgoIEZUX0dseXBoU2xvdCAgdHRzbG90LCAgICAgICAgIC8qIFRUX0dseXBoU2xvdCAqLwotICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHR0c2l6ZSwgICAgICAgICAvKiBUVF9TaXplICAgICAgKi8KLSAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICkKLSAgewotICAgIFRUX0dseXBoU2xvdCAgc2xvdCA9IChUVF9HbHlwaFNsb3QpdHRzbG90OwotICAgIFRUX1NpemUgICAgICAgc2l6ZSA9IChUVF9TaXplKXR0c2l6ZTsKLSAgICBGVF9GYWNlICAgICAgIGZhY2UgPSB0dHNsb3QtPmZhY2U7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhc2xvdCApCi0gICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfU2xvdF9IYW5kbGU7Ci0KLSAgICBpZiAoICFzaXplICkKLSAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9TaXplX0hhbmRsZTsKLQotICAgIGlmICggIWZhY2UgfHwgZ2x5cGhfaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBocyApCi0gICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiAoIEZUX0xPQURfTk9fUkVDVVJTRSB8IEZUX0xPQURfTk9fU0NBTEUgKSApCi0gICAgewotICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkcgfAotICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX0JJVE1BUCAgfAotICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX1NDQUxFOwotICAgIH0KLQotICAgIC8qIG5vdyBsb2FkIHRoZSBnbHlwaCBvdXRsaW5lIGlmIG5lY2Vzc2FyeSAqLwotICAgIGVycm9yID0gVFRfTG9hZF9HbHlwaCggc2l6ZSwgc2xvdCwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MgKTsKLQotICAgIC8qIGZvcmNlIGRyb3Atb3V0IG1vZGUgdG8gMiAtIGlycmVsZXZhbnQgbm93ICovCi0gICAgLyogc2xvdC0+b3V0bGluZS5kcm9wb3V0X21vZGUgPSAyOyAqLwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgIEQgUiBJIFYgRSBSICBJIE4gVCBFIFIgRiBBIEMgRSAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyAgdHRfc2VydmljZV9neF9tdWx0aV9tYXN0ZXJzID0KLSAgewotICAgIChGVF9HZXRfTU1fRnVuYykgICAgICAgIE5VTEwsCi0gICAgKEZUX1NldF9NTV9EZXNpZ25fRnVuYykgTlVMTCwKLSAgICAoRlRfU2V0X01NX0JsZW5kX0Z1bmMpICBUVF9TZXRfTU1fQmxlbmQsCi0gICAgKEZUX0dldF9NTV9WYXJfRnVuYykgICAgVFRfR2V0X01NX1ZhciwKLSAgICAoRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYylUVF9TZXRfVmFyX0Rlc2lnbgotICB9OwotI2VuZGlmCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfVHJ1ZVR5cGVFbmdpbmVSZWMgIHR0X3NlcnZpY2VfdHJ1ZXR5cGVfZW5naW5lID0KLSAgewotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9VTlBBVEVOVEVECi0jZWxzZQotICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1BBVEVOVEVECi0jZW5kaWYKLQotI2Vsc2UgLyogIVRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfTk9ORQotCi0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfVFRHbHlmUmVjICB0dF9zZXJ2aWNlX3RydWV0eXBlX2dseWYgPQotICB7Ci0gICAgKFRUX0dseWZfR2V0TG9jYXRpb25GdW5jKXR0X2ZhY2VfZ2V0X2xvY2F0aW9uCi0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICB0dF9zZXJ2aWNlc1tdID0KLSAgewotICAgIHsgRlRfU0VSVklDRV9JRF9YRjg2X05BTUUsICAgICAgIEZUX1hGODZfRk9STUFUX1RSVUVUWVBFIH0sCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgIHsgRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTLCAgICZ0dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMgfSwKLSNlbmRpZgotICAgIHsgRlRfU0VSVklDRV9JRF9UUlVFVFlQRV9FTkdJTkUsICZ0dF9zZXJ2aWNlX3RydWV0eXBlX2VuZ2luZSB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9UVF9HTFlGLCAgICAgICAgICZ0dF9zZXJ2aWNlX3RydWV0eXBlX2dseWYgfSwKLSAgICB7IE5VTEwsIE5VTEwgfQotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9Nb2R1bGVfSW50ZXJmYWNlICkKLSAgdHRfZ2V0X2ludGVyZmFjZSggRlRfTW9kdWxlICAgIGRyaXZlciwgICAgLyogVFRfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICB0dF9pbnRlcmZhY2UgKQotICB7Ci0gICAgRlRfTW9kdWxlX0ludGVyZmFjZSAgcmVzdWx0OwotICAgIEZUX01vZHVsZSAgICAgICAgICAgIHNmbnRkOwotICAgIFNGTlRfU2VydmljZSAgICAgICAgIHNmbnQ7Ci0KLQotICAgIHJlc3VsdCA9IGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIHR0X3NlcnZpY2VzLCB0dF9pbnRlcmZhY2UgKTsKLSAgICBpZiAoIHJlc3VsdCAhPSBOVUxMICkKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAvKiBvbmx5IHJldHVybiB0aGUgZGVmYXVsdCBpbnRlcmZhY2UgZnJvbSB0aGUgU0ZOVCBtb2R1bGUgKi8KLSAgICBzZm50ZCA9IEZUX0dldF9Nb2R1bGUoIGRyaXZlci0+bGlicmFyeSwgInNmbnQiICk7Ci0gICAgaWYgKCBzZm50ZCApCi0gICAgewotICAgICAgc2ZudCA9IChTRk5UX1NlcnZpY2UpKCBzZm50ZC0+Y2xhenotPm1vZHVsZV9pbnRlcmZhY2UgKTsKLSAgICAgIGlmICggc2ZudCApCi0gICAgICAgIHJldHVybiBzZm50LT5nZXRfaW50ZXJmYWNlKCBkcml2ZXIsIHR0X2ludGVyZmFjZSApOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKiBUaGUgRlRfRHJpdmVySW50ZXJmYWNlIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIGZ0ZHJpdmVyLmguICovCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyAgdHRfZHJpdmVyX2NsYXNzID0KLSAgewotICAgIHsKLSAgICAgIEZUX01PRFVMRV9GT05UX0RSSVZFUiAgICAgICAgfAotICAgICAgRlRfTU9EVUxFX0RSSVZFUl9TQ0FMQUJMRSAgICB8Ci0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIsCi0jZWxzZQotICAgICAgMCwKLSNlbmRpZgotCi0gICAgICBzaXplb2YgKCBUVF9Ecml2ZXJSZWMgKSwKLQotICAgICAgInRydWV0eXBlIiwgICAgICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAweDEwMDAwTCwgICAgICAgIC8qIGRyaXZlciB2ZXJzaW9uID09IDEuMCAgICAgICAgICAgICAgICAgKi8KLSAgICAgIDB4MjAwMDBMLCAgICAgICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBhYm92ZSAqLwotCi0gICAgICAodm9pZCopMCwgICAgICAgIC8qIGRyaXZlciBzcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgICAgdHRfZHJpdmVyX2luaXQsCi0gICAgICB0dF9kcml2ZXJfZG9uZSwKLSAgICAgIHR0X2dldF9pbnRlcmZhY2UsCi0gICAgfSwKLQotICAgIHNpemVvZiAoIFRUX0ZhY2VSZWMgKSwKLSAgICBzaXplb2YgKCBUVF9TaXplUmVjICksCi0gICAgc2l6ZW9mICggRlRfR2x5cGhTbG90UmVjICksCi0KLSAgICB0dF9mYWNlX2luaXQsCi0gICAgdHRfZmFjZV9kb25lLAotICAgIHR0X3NpemVfaW5pdCwKLSAgICB0dF9zaXplX2RvbmUsCi0gICAgdHRfc2xvdF9pbml0LAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX1Nsb3RfRG9uZUZ1bmMgKi8KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUwotICAgIGZ0X3N0dWJfc2V0X2NoYXJfc2l6ZXMsCi0gICAgZnRfc3R1Yl9zZXRfcGl4ZWxfc2l6ZXMsCi0jZW5kaWYKLSAgICBMb2FkX0dseXBoLAotCi0gICAgdHRfZ2V0X2tlcm5pbmcsCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRlRfRmFjZV9BdHRhY2hGdW5jICAgICAgKi8KLSAgICB0dF9nZXRfYWR2YW5jZXMsCi0KLSAgICB0dF9zaXplX3JlcXVlc3QsCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0gICAgdHRfc2l6ZV9zZWxlY3QKLSNlbHNlCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2l6ZV9TZWxlY3RGdW5jICAgICAgKi8KLSNlbmRpZgotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmggYi9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmMjZlNC4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0ZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIFRydWVUeXBlIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RURFJJVkVSX0hfXwotI2RlZmluZSBfX1RURFJJVkVSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyApICB0dF9kcml2ZXJfY2xhc3M7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVERSSVZFUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGVycm9ycy5oIGIvc3JjL3RydWV0eXBlL3R0ZXJyb3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTdjNzAuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0ZXJyb3JzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGVycm9ycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFRydWVUeXBlIGVycm9yIGVudW1lcmF0aW9uICAgICAgICAgICAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1RURVJST1JTX0hfXwotI2RlZmluZSBfX1RURVJST1JTX0hfXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgVFRfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1RydWVUeXBlCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX1RURVJST1JTX0hfXyAqLwotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGdsb2FkLmMgYi9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGNlYTk3Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dGdsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Z2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IGJ5ICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0KLSNpbmNsdWRlICJ0dGdsb2FkLmgiCi0jaW5jbHVkZSAidHRwbG9hZC5oIgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgInR0Z3h2YXIuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAidHRlcnJvcnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0Z2xvYWQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcG9zaXRlIGZvbnQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBUkdTX0FSRV9XT1JEUyAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgQVJHU19BUkVfWFlfVkFMVUVTICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFJPVU5EX1hZX1RPX0dSSUQgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBXRV9IQVZFX0FfU0NBTEUgICAgICAgICAgICAweDAwMDgKLS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICovCi0jZGVmaW5lIE1PUkVfQ09NUE9ORU5UUyAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBXRV9IQVZFX0FOX1hZX1NDQUxFICAgICAgICAweDAwNDAKLSNkZWZpbmUgV0VfSEFWRV9BXzJYMiAgICAgICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIFdFX0hBVkVfSU5TVFIgICAgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBVU0VfTVlfTUVUUklDUyAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgT1ZFUkxBUF9DT01QT1VORCAgICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFNDQUxFRF9DT01QT05FTlRfT0ZGU0VUICAgIDB4MDgwMAotI2RlZmluZSBVTlNDQUxFRF9DT01QT05FTlRfT0ZGU0VUICAweDEwMDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmV0dXJucyB0aGUgaG9yaXpvbnRhbCBtZXRyaWNzIGluIGZvbnQgdW5pdHMgZm9yIGEgZ2l2ZW4gZ2x5cGguICBJZiAgICovCi0gIC8qIGBjaGVjaycgaXMgdHJ1ZSwgdGFrZSBjYXJlIG9mIG1vbm9zcGFjZWQgZm9udHMgYnkgcmV0dXJuaW5nIHRoZSAgICAgICAqLwotICAvKiBhZHZhbmNlIHdpZHRoIG1heGltdW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRih2b2lkKQotICBUVF9HZXRfSE1ldHJpY3MoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIGNoZWNrLAotICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgIGxzYiwKLSAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhdyApCi0gIHsKLSAgICAoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMCwgaWR4LCBsc2IsIGF3ICk7Ci0KLSAgICBpZiAoIGNoZWNrICYmIGZhY2UtPnBvc3RzY3JpcHQuaXNGaXhlZFBpdGNoICkKLSAgICAgICphdyA9IGZhY2UtPmhvcml6b250YWwuYWR2YW5jZV9XaWR0aF9NYXg7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmV0dXJucyB0aGUgdmVydGljYWwgbWV0cmljcyBpbiBmb250IHVuaXRzIGZvciBhIGdpdmVuIGdseXBoLiAgICAgICAgICovCi0gIC8qIEdyZWcgSGl0Y2hjb2NrIGZyb20gTWljcm9zb2Z0IHRvbGQgdXMgdGhhdCBpZiB0aGVyZSB3ZXJlIG5vIGB2bXR4JyAgICAqLwotICAvKiB0YWJsZSwgdHlwb0FzY2VuZGVyL0Rlc2NlbmRlciBmcm9tIHRoZSBgT1MvMicgdGFibGUgd291bGQgYmUgdXNlZCAgICAgKi8KLSAgLyogaW5zdGVhZCwgYW5kIGlmIHRoZXJlIHdlcmUgbm8gYE9TLzInIHRhYmxlLCB1c2UgYXNjZW5kZXIvZGVzY2VuZGVyICAgICovCi0gIC8qIGZyb20gdGhlIGBoaGVhJyB0YWJsZS4gIEJ1dCB0aGF0IGlzIG5vdCB3aGF0IE1pY3Jvc29mdCdzIHJhc3Rlcml6ZXIgICAqLwotICAvKiBhcHBhcmVudGx5IGRvZXM6IEl0IHVzZXMgdGhlIHBwZW0gdmFsdWUgYXMgdGhlIGFkdmFuY2UgaGVpZ2h0LCBhbmQgICAgKi8KLSAgLyogc2V0cyB0aGUgdG9wIHNpZGUgYmVhcmluZyB0byBiZSB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbW9ub3NwYWNlIGBjaGVjaycgaXMgcHJvYmFibHkgbm90IG1lYW5pbmdmdWwgaGVyZSwgYnV0IHdlIGxlYXZlICAgKi8KLSAgLyogaXQgaW4gZm9yIGEgY29uc2lzdGVudCBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYodm9pZCkKLSAgVFRfR2V0X1ZNZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBjaGVjaywKLSAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICB0c2IsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgYWggKQotICB7Ci0gICAgRlRfVU5VU0VEKCBjaGVjayApOwotCi0gICAgaWYgKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICkKLSAgICAgICggKFNGTlRfU2VydmljZSlmYWNlLT5zZm50ICktPmdldF9tZXRyaWNzKCBmYWNlLCAxLCBpZHgsIHRzYiwgYWggKTsKLQotI2lmIDEgICAgICAgICAgICAgLyogRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCwgYXQgdmFyaWFuY2Ugd2l0aCB3aGF0IE1TIHNhaWQgKi8KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAqdHNiID0gMDsKLSAgICAgICphaCAgPSBmYWNlLT5yb290LnVuaXRzX3Blcl9FTTsKLSAgICB9Ci0KLSNlbHNlICAgICAgLyogVGhpcyBpcyB3aGF0IE1TIHNhaWQgdG8gZG8uICBJdCBpc24ndCB3aGF0IHRoZXkgZG8sIGhvd2V2ZXIuICovCi0KLSAgICBlbHNlIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGVSApCi0gICAgewotICAgICAgKnRzYiA9IGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyOwotICAgICAgKmFoICA9IGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyIC0gZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgKnRzYiA9IGZhY2UtPmhvcml6b250YWwuQXNjZW5kZXI7Ci0gICAgICAqYWggID0gZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlciAtIGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyOwotICAgIH0KLQotI2VuZGlmCi0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUcmFuc2xhdGVzIGFuIGFycmF5IG9mIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIHRyYW5zbGF0ZV9hcnJheSggRlRfVUludCAgICAgbiwKLSAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgZGVsdGFfeCwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICBkZWx0YV95ICkKLSAgewotICAgIEZUX1VJbnQgIGs7Ci0KLQotICAgIGlmICggZGVsdGFfeCApCi0gICAgICBmb3IgKCBrID0gMDsgayA8IG47IGsrKyApCi0gICAgICAgIGNvb3Jkc1trXS54ICs9IGRlbHRhX3g7Ci0KLSAgICBpZiAoIGRlbHRhX3kgKQotICAgICAgZm9yICggayA9IDA7IGsgPCBuOyBrKysgKQotICAgICAgICBjb29yZHNba10ueSArPSBkZWx0YV95OwotICB9Ci0KLQotI3VuZGVmICBJU19ISU5URUQKLSNkZWZpbmUgSVNfSElOVEVEKCBmbGFncyApICAoICggZmxhZ3MgJiBGVF9MT0FEX05PX0hJTlRJTkcgKSA9PSAwICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgYnkgZGVmYXVsdCB3aXRoIFRydWVUeXBlIGZvbnRzLiAgICAgICovCi0gIC8qIEhvd2V2ZXIsIHRoZXkgY2FuIGJlIHJlcGxhY2VkIGJ5IGFsdGVybmF0aXZlcyBpZiB3ZSBuZWVkIHRvIHN1cHBvcnQgICAqLwotICAvKiBUcnVlVHlwZS1jb21wcmVzc2VkIGZvcm1hdHMgKGxpa2UgTWljcm9UeXBlKSBpbiB0aGUgZnV0dXJlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUVF9BY2Nlc3NfR2x5cGhfRnJhbWUoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBieXRlX2NvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBsb2FkZXItPnN0cmVhbTsKLQotICAgIC8qIGZvciBub24tZGVidWcgbW9kZSAqLwotICAgIEZUX1VOVVNFRCggZ2x5cGhfaW5kZXggKTsKLQotCi0gICAgRlRfVFJBQ0U1KCggIkdseXBoICVsZFxuIiwgZ2x5cGhfaW5kZXggKSk7Ci0KLSAgICAvKiB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyB0aGUgYGVycm9yJyB2YXJpYWJsZSB0aHJvdWdoIG1hY3JvcyEgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSB8fCBGVF9GUkFNRV9FTlRFUiggYnl0ZV9jb3VudCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGxvYWRlci0+Y3Vyc29yID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgbG9hZGVyLT5saW1pdCAgPSBzdHJlYW0tPmxpbWl0OwotCi0gICAgcmV0dXJuIFRUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgVFRfRm9yZ2V0X0dseXBoX0ZyYW1lKCBUVF9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGxvYWRlci0+c3RyZWFtOwotCi0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0dseXBoX0hlYWRlciggVFRfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgICAgID0gbG9hZGVyLT5jdXJzb3I7Ci0gICAgRlRfQnl0ZSogIGxpbWl0ID0gbG9hZGVyLT5saW1pdDsKLQotCi0gICAgaWYgKCBwICsgMTAgPiBsaW1pdCApCi0gICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfT3V0bGluZTsKLQotICAgIGxvYWRlci0+bl9jb250b3VycyA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLQotICAgIGxvYWRlci0+YmJveC54TWluID0gRlRfTkVYVF9TSE9SVCggcCApOwotICAgIGxvYWRlci0+YmJveC55TWluID0gRlRfTkVYVF9TSE9SVCggcCApOwotICAgIGxvYWRlci0+YmJveC54TWF4ID0gRlRfTkVYVF9TSE9SVCggcCApOwotICAgIGxvYWRlci0+YmJveC55TWF4ID0gRlRfTkVYVF9TSE9SVCggcCApOwotCi0gICAgRlRfVFJBQ0U1KCggIiAgIyBvZiBjb250b3VyczogJWRcbiIsIGxvYWRlci0+bl9jb250b3VycyApKTsKLSAgICBGVF9UUkFDRTUoKCAiICB4TWluOiAlNGQgIHhNYXg6ICU0ZFxuIiwgbG9hZGVyLT5iYm94LnhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+YmJveC54TWF4ICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHlNaW46ICU0ZCAgeU1heDogJTRkXG4iLCBsb2FkZXItPmJib3gueU1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5iYm94LnlNYXggKSk7Ci0gICAgbG9hZGVyLT5jdXJzb3IgPSBwOwotCi0gICAgcmV0dXJuIFRUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIFRUX0xvYWRfU2ltcGxlX0dseXBoKCBUVF9Mb2FkZXIgIGxvYWQgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIEZUX0J5dGUqICAgICAgICBwICAgICAgICAgID0gbG9hZC0+Y3Vyc29yOwotICAgIEZUX0J5dGUqICAgICAgICBsaW1pdCAgICAgID0gbG9hZC0+bGltaXQ7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgICAgPSBsb2FkLT5nbG9hZGVyOwotICAgIEZUX0ludCAgICAgICAgICBuX2NvbnRvdXJzID0gbG9hZC0+bl9jb250b3VyczsKLSAgICBGVF9PdXRsaW5lKiAgICAgb3V0bGluZTsKLSAgICBUVF9GYWNlICAgICAgICAgZmFjZSAgICAgICA9IChUVF9GYWNlKWxvYWQtPmZhY2U7Ci0gICAgRlRfVVNob3J0ICAgICAgIG5faW5zOwotICAgIEZUX0ludCAgICAgICAgICBuX3BvaW50czsKLQotICAgIEZUX0J5dGUgICAgICAgICAqZmxhZywgKmZsYWdfbGltaXQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgIGMsIGNvdW50OwotICAgIEZUX1ZlY3RvciAgICAgICAqdmVjLCAqdmVjX2xpbWl0OwotICAgIEZUX1BvcyAgICAgICAgICB4OwotICAgIEZUX1Nob3J0ICAgICAgICAqY29udCwgKmNvbnRfbGltaXQsIHByZXZfY29udDsKLSAgICBGVF9JbnQgICAgICAgICAgeHlfc2l6ZSA9IDA7Ci0KLQotICAgIC8qIGNoZWNrIHRoYXQgd2UgY2FuIGFkZCB0aGUgY29udG91cnMgdG8gdGhlIGdseXBoICovCi0gICAgZXJyb3IgPSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGdsb2FkZXIsIDAsIG5fY29udG91cnMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIHJlYWRpbmcgdGhlIGNvbnRvdXJzJyBlbmRwb2ludHMgJiBudW1iZXIgb2YgcG9pbnRzICovCi0gICAgY29udCAgICAgICA9IGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5jb250b3VyczsKLSAgICBjb250X2xpbWl0ID0gY29udCArIG5fY29udG91cnM7Ci0KLSAgICAvKiBjaGVjayBzcGFjZSBmb3IgY29udG91cnMgYXJyYXkgKyBpbnN0cnVjdGlvbnMgY291bnQgKi8KLSAgICBpZiAoIG5fY29udG91cnMgPj0gMHhGRkYgfHwgcCArICggbl9jb250b3VycyArIDEgKSAqIDIgPiBsaW1pdCApCi0gICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgIHByZXZfY29udCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBpZiAoIG5fY29udG91cnMgPiAwICkKLSAgICAgIGNvbnRbMF0gPSBwcmV2X2NvbnQ7Ci0KLSAgICBmb3IgKCBjb250Kys7IGNvbnQgPCBjb250X2xpbWl0OyBjb250KysgKQotICAgIHsKLSAgICAgIGNvbnRbMF0gPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgaWYgKCBjb250WzBdIDw9IHByZXZfY29udCApCi0gICAgICB7Ci0gICAgICAgIC8qIHVub3JkZXJlZCBjb250b3VyczogdGhpcyBpcyBpbnZhbGlkICovCi0gICAgICAgIGVycm9yID0gRlRfRXJyX0ludmFsaWRfVGFibGU7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICAgIHByZXZfY29udCA9IGNvbnRbMF07Ci0gICAgfQotCi0gICAgbl9wb2ludHMgPSAwOwotICAgIGlmICggbl9jb250b3VycyA+IDAgKQotICAgIHsKLSAgICAgIG5fcG9pbnRzID0gY29udFstMV0gKyAxOwotICAgICAgaWYgKCBuX3BvaW50cyA8IDAgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLSAgICB9Ci0KLSAgICAvKiBub3RlIHRoYXQgd2Ugd2lsbCBhZGQgZm91ciBwaGFudG9tIHBvaW50cyBsYXRlciAqLwotICAgIGVycm9yID0gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBnbG9hZGVyLCBuX3BvaW50cyArIDQsIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIHdlJ2QgYmV0dGVyIGNoZWNrIHRoZSBjb250b3VycyB0YWJsZSByaWdodCBub3cgKi8KLSAgICBvdXRsaW5lID0gJmdsb2FkZXItPmN1cnJlbnQub3V0bGluZTsKLQotICAgIGZvciAoIGNvbnQgPSBvdXRsaW5lLT5jb250b3VycyArIDE7IGNvbnQgPCBjb250X2xpbWl0OyBjb250KysgKQotICAgICAgaWYgKCBjb250Wy0xXSA+PSBjb250WzBdICkKLSAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAvKiByZWFkaW5nIHRoZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgKi8KLSAgICBsb2FkLT5nbHlwaC0+Y29udHJvbF9sZW4gID0gMDsKLSAgICBsb2FkLT5nbHlwaC0+Y29udHJvbF9kYXRhID0gMDsKLQotICAgIGlmICggcCArIDIgPiBsaW1pdCApCi0gICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgIG5faW5zID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIEZUX1RSQUNFNSgoICIgIEluc3RydWN0aW9ucyBzaXplOiAldVxuIiwgbl9pbnMgKSk7Ci0KLSAgICBpZiAoIG5faW5zID4gZmFjZS0+bWF4X3Byb2ZpbGUubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTAoKCAiVFRfTG9hZF9TaW1wbGVfR2x5cGg6IFRvbyBtYW55IGluc3RydWN0aW9ucyAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgbl9pbnMgKSk7Ci0gICAgICBlcnJvciA9IFRUX0Vycl9Ub29fTWFueV9IaW50czsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoICggbGltaXQgLSBwICkgPCBuX2lucyApCi0gICAgewotICAgICAgRlRfVFJBQ0UwKCggIlRUX0xvYWRfU2ltcGxlX0dseXBoOiBJbnN0cnVjdGlvbiBjb3VudCBtaXNtYXRjaCFcbiIgKSk7Ci0gICAgICBlcnJvciA9IFRUX0Vycl9Ub29fTWFueV9IaW50czsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIGlmICggSVNfSElOVEVEKCBsb2FkLT5sb2FkX2ZsYWdzICkgKQotICAgIHsKLSAgICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2xlbiAgPSBuX2luczsKLSAgICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2RhdGEgPSBsb2FkLT5leGVjLT5nbHlwaEluczsKLQotICAgICAgRlRfTUVNX0NPUFkoIGxvYWQtPmV4ZWMtPmdseXBoSW5zLCBwLCAoRlRfTG9uZyluX2lucyApOwotICAgIH0KLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gICAgcCArPSBuX2luczsKLQotICAgIC8qIHJlYWRpbmcgdGhlIHBvaW50IHRhZ3MgKi8KLSAgICBmbGFnICAgICAgID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3M7Ci0gICAgZmxhZ19saW1pdCA9IGZsYWcgKyBuX3BvaW50czsKLQotICAgIEZUX0FTU0VSVCggZmxhZyAhPSBOVUxMICk7Ci0KLSAgICB3aGlsZSAoIGZsYWcgPCBmbGFnX2xpbWl0ICkKLSAgICB7Ci0gICAgICBpZiAoIHAgKyAxID4gbGltaXQgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgKmZsYWcrKyA9IGMgPSBGVF9ORVhUX0JZVEUoIHAgKTsKLSAgICAgIGlmICggYyAmIDggKQotICAgICAgewotICAgICAgICBpZiAoIHAgKyAxID4gbGltaXQgKQotICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgIGNvdW50ID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICAgIGlmICggZmxhZyArIChGVF9JbnQpY291bnQgPiBmbGFnX2xpbWl0ICkKLSAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgICAgKmZsYWcrKyA9IGM7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogcmVhZGluZyB0aGUgWCBjb29yZGluYXRlcyAqLwotCi0gICAgdmVjICAgICAgID0gb3V0bGluZS0+cG9pbnRzOwotICAgIHZlY19saW1pdCA9IHZlYyArIG5fcG9pbnRzOwotICAgIGZsYWcgICAgICA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzOwotICAgIHggICAgICAgICA9IDA7Ci0KLSAgICBpZiAoIHAgKyB4eV9zaXplID4gbGltaXQgKQotICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICBmb3IgKCA7IHZlYyA8IHZlY19saW1pdDsgdmVjKyssIGZsYWcrKyApCi0gICAgewotICAgICAgRlRfUG9zICB5ID0gMDsKLSAgICAgIEZUX0J5dGUgZiA9ICpmbGFnOwotCi0KLSAgICAgIGlmICggZiAmIDIgKQotICAgICAgewotICAgICAgICBpZiAoIHAgKyAxID4gbGltaXQgKQotICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgIHkgPSAoRlRfUG9zKUZUX05FWFRfQllURSggcCApOwotICAgICAgICBpZiAoICggZiAmIDE2ICkgPT0gMCApCi0gICAgICAgICAgeSA9IC15OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoICggZiAmIDE2ICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggcCArIDIgPiBsaW1pdCApCi0gICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgeSA9IChGVF9Qb3MpRlRfTkVYVF9TSE9SVCggcCApOwotICAgICAgfQotCi0gICAgICB4ICAgICArPSB5OwotICAgICAgdmVjLT54ID0geDsKLSAgICAgICpmbGFnICA9IGYgJiB+KCAyIHwgMTYgKTsKLSAgICB9Ci0KLSAgICAvKiByZWFkaW5nIHRoZSBZIGNvb3JkaW5hdGVzICovCi0KLSAgICB2ZWMgICAgICAgPSBnbG9hZGVyLT5jdXJyZW50Lm91dGxpbmUucG9pbnRzOwotICAgIHZlY19saW1pdCA9IHZlYyArIG5fcG9pbnRzOwotICAgIGZsYWcgICAgICA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzOwotICAgIHggICAgICAgICA9IDA7Ci0KLSAgICBmb3IgKCA7IHZlYyA8IHZlY19saW1pdDsgdmVjKyssIGZsYWcrKyApCi0gICAgewotICAgICAgRlRfUG9zICB5ID0gMDsKLSAgICAgIEZUX0J5dGUgZiA9ICpmbGFnOwotCi0KLSAgICAgIGlmICggZiAmIDQgKQotICAgICAgewotICAgICAgICBpZiAoIHAgKyAxID4gbGltaXQgKQotICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgIHkgPSAoRlRfUG9zKUZUX05FWFRfQllURSggcCApOwotICAgICAgICBpZiAoICggZiAmIDMyICkgPT0gMCApCi0gICAgICAgICAgeSA9IC15OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoICggZiAmIDMyICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggcCArIDIgPiBsaW1pdCApCi0gICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgeSA9IChGVF9Qb3MpRlRfTkVYVF9TSE9SVCggcCApOwotICAgICAgfQotCi0gICAgICB4ICAgICArPSB5OwotICAgICAgdmVjLT55ID0geDsKLSAgICAgICpmbGFnICA9IGYgJiBGVF9DVVJWRV9UQUdfT047Ci0gICAgfQotCi0gICAgb3V0bGluZS0+bl9wb2ludHMgICA9IChGVF9VU2hvcnQpbl9wb2ludHM7Ci0gICAgb3V0bGluZS0+bl9jb250b3VycyA9IChGVF9TaG9ydCkgbl9jb250b3VyczsKLQotICAgIGxvYWQtPmN1cnNvciA9IHA7Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgSW52YWxpZF9PdXRsaW5lOgotICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfT3V0bGluZTsKLSAgICBnb3RvIEZhaWw7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaCggVFRfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIEZUX0J5dGUqICAgICAgICBwICAgICAgID0gbG9hZGVyLT5jdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgIGxpbWl0ICAgPSBsb2FkZXItPmxpbWl0OwotICAgIEZUX0dseXBoTG9hZGVyICBnbG9hZGVyID0gbG9hZGVyLT5nbG9hZGVyOwotICAgIEZUX1N1YkdseXBoICAgICBzdWJnbHlwaDsKLSAgICBGVF9VSW50ICAgICAgICAgbnVtX3N1YmdseXBoczsKLQotCi0gICAgbnVtX3N1YmdseXBocyA9IDA7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIEZUX0ZpeGVkICB4eCwgeHksIHl5LCB5eDsKLSAgICAgIEZUX1VJbnQgICBjb3VudDsKLQotCi0gICAgICAvKiBjaGVjayB0aGF0IHdlIGNhbiBsb2FkIGEgbmV3IHN1YmdseXBoICovCi0gICAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NoZWNrU3ViR2x5cGhzKCBnbG9hZGVyLCBudW1fc3ViZ2x5cGhzICsgMSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgLyogY2hlY2sgc3BhY2UgKi8KLSAgICAgIGlmICggcCArIDQgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9Db21wb3NpdGU7Ci0KLSAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+Y3VycmVudC5zdWJnbHlwaHMgKyBudW1fc3ViZ2x5cGhzOwotCi0gICAgICBzdWJnbHlwaC0+YXJnMSA9IHN1YmdseXBoLT5hcmcyID0gMDsKLQotICAgICAgc3ViZ2x5cGgtPmZsYWdzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIHN1YmdseXBoLT5pbmRleCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIC8qIGNoZWNrIHNwYWNlICovCi0gICAgICBjb3VudCA9IDI7Ci0gICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1dPUkRTICkKLSAgICAgICAgY291bnQgKz0gMjsKLSAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgV0VfSEFWRV9BX1NDQUxFICkKLSAgICAgICAgY291bnQgKz0gMjsKLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FOX1hZX1NDQUxFICkKLSAgICAgICAgY291bnQgKz0gNDsKLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FfMlgyICkKLSAgICAgICAgY291bnQgKz0gODsKLQotICAgICAgaWYgKCBwICsgY291bnQgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9Db21wb3NpdGU7Ci0KLSAgICAgIC8qIHJlYWQgYXJndW1lbnRzICovCi0gICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1dPUkRTICkKLSAgICAgIHsKLSAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICAgIHN1YmdseXBoLT5hcmcyID0gRlRfTkVYVF9TSE9SVCggcCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdWJnbHlwaC0+YXJnMSA9IEZUX05FWFRfQ0hBUiggcCApOwotICAgICAgICBzdWJnbHlwaC0+YXJnMiA9IEZUX05FWFRfQ0hBUiggcCApOwotICAgICAgfQotCi0gICAgICAvKiByZWFkIHRyYW5zZm9ybSAqLwotICAgICAgeHggPSB5eSA9IDB4MTAwMDBMOwotICAgICAgeHkgPSB5eCA9IDA7Ci0KLSAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgV0VfSEFWRV9BX1NDQUxFICkKLSAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApIDw8IDI7Ci0gICAgICAgIHl5ID0geHg7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgV0VfSEFWRV9BTl9YWV9TQ0FMRSApCi0gICAgICB7Ci0gICAgICAgIHh4ID0gKEZUX0ZpeGVkKUZUX05FWFRfU0hPUlQoIHAgKSA8PCAyOwotICAgICAgICB5eSA9IChGVF9GaXhlZClGVF9ORVhUX1NIT1JUKCBwICkgPDwgMjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FfMlgyICkKLSAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApIDw8IDI7Ci0gICAgICAgIHl4ID0gKEZUX0ZpeGVkKUZUX05FWFRfU0hPUlQoIHAgKSA8PCAyOwotICAgICAgICB4eSA9IChGVF9GaXhlZClGVF9ORVhUX1NIT1JUKCBwICkgPDwgMjsKLSAgICAgICAgeXkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApIDw8IDI7Ci0gICAgICB9Ci0KLSAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueHggPSB4eDsKLSAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueHkgPSB4eTsKLSAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueXggPSB5eDsKLSAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueXkgPSB5eTsKLQotICAgICAgbnVtX3N1YmdseXBocysrOwotCi0gICAgfSB3aGlsZSAoIHN1YmdseXBoLT5mbGFncyAmIE1PUkVfQ09NUE9ORU5UUyApOwotCi0gICAgZ2xvYWRlci0+Y3VycmVudC5udW1fc3ViZ2x5cGhzID0gbnVtX3N1YmdseXBoczsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgewotICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBsb2FkZXItPnN0cmVhbTsKLQotCi0gICAgICAvKiB3ZSBtdXN0IHVuZG8gdGhlIEZUX0ZSQU1FX0VOVEVSIGluIG9yZGVyIHRvIHBvaW50IHRvIHRoZSAqLwotICAgICAgLyogY29tcG9zaXRlIGluc3RydWN0aW9ucywgaWYgd2UgZmluZCBzb21lLiAgICAgICAgICAgICAgICovCi0gICAgICAvKiB3ZSB3aWxsIHByb2Nlc3MgdGhlbSBsYXRlci4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgbG9hZGVyLT5pbnNfcG9zID0gKEZUX1VMb25nKSggRlRfU1RSRUFNX1BPUygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgLSBsaW1pdCApOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICBsb2FkZXItPmN1cnNvciA9IHA7Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgSW52YWxpZF9Db21wb3NpdGU6Ci0gICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9Db21wb3NpdGU7Ci0gICAgZ290byBGYWlsOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUVF9Jbml0X0dseXBoX0xvYWRpbmcoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgZmFjZS0+YWNjZXNzX2dseXBoX2ZyYW1lICAgPSBUVF9BY2Nlc3NfR2x5cGhfRnJhbWU7Ci0gICAgZmFjZS0+cmVhZF9nbHlwaF9oZWFkZXIgICAgPSBUVF9Mb2FkX0dseXBoX0hlYWRlcjsKLSAgICBmYWNlLT5yZWFkX3NpbXBsZV9nbHlwaCAgICA9IFRUX0xvYWRfU2ltcGxlX0dseXBoOwotICAgIGZhY2UtPnJlYWRfY29tcG9zaXRlX2dseXBoID0gVFRfTG9hZF9Db21wb3NpdGVfR2x5cGg7Ci0gICAgZmFjZS0+Zm9yZ2V0X2dseXBoX2ZyYW1lICAgPSBUVF9Gb3JnZXRfR2x5cGhfRnJhbWU7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHR0X3ByZXBhcmVfem9uZSggVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgIEZUX0dseXBoTG9hZCAgbG9hZCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIHN0YXJ0X3BvaW50LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgc3RhcnRfY29udG91ciApCi0gIHsKLSAgICB6b25lLT5uX3BvaW50cyAgICA9IChGVF9VU2hvcnQpKCBsb2FkLT5vdXRsaW5lLm5fcG9pbnRzIC0gc3RhcnRfcG9pbnQgKTsKLSAgICB6b25lLT5uX2NvbnRvdXJzICA9IChGVF9TaG9ydCkgKCBsb2FkLT5vdXRsaW5lLm5fY29udG91cnMgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfY29udG91ciApOwotICAgIHpvbmUtPm9yZyAgICAgICAgID0gbG9hZC0+ZXh0cmFfcG9pbnRzICsgc3RhcnRfcG9pbnQ7Ci0gICAgem9uZS0+Y3VyICAgICAgICAgPSBsb2FkLT5vdXRsaW5lLnBvaW50cyArIHN0YXJ0X3BvaW50OwotICAgIHpvbmUtPm9ydXMgICAgICAgID0gbG9hZC0+ZXh0cmFfcG9pbnRzMiArIHN0YXJ0X3BvaW50OwotICAgIHpvbmUtPnRhZ3MgICAgICAgID0gKEZUX0J5dGUqKWxvYWQtPm91dGxpbmUudGFncyArIHN0YXJ0X3BvaW50OwotICAgIHpvbmUtPmNvbnRvdXJzICAgID0gKEZUX1VTaG9ydCopbG9hZC0+b3V0bGluZS5jb250b3VycyArIHN0YXJ0X2NvbnRvdXI7Ci0gICAgem9uZS0+Zmlyc3RfcG9pbnQgPSAoRlRfVVNob3J0KXN0YXJ0X3BvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9IaW50X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIaW50IHRoZSBnbHlwaCB1c2luZyB0aGUgem9uZSBwcmVwYXJlZCBieSB0aGUgY2FsbGVyLiAgTm90ZSB0aGF0ICAgKi8KLSAgLyogICAgdGhlIHpvbmUgaXMgc3VwcG9zZWQgdG8gaW5jbHVkZSBmb3VyIHBoYW50b20gcG9pbnRzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgVFRfSGludF9HbHlwaCggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgaXNfY29tcG9zaXRlICkKLSAgewotICAgIFRUX0dseXBoWm9uZSAgem9uZSA9ICZsb2FkZXItPnpvbmU7Ci0gICAgRlRfUG9zICAgICAgICBvcmlnaW47Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICBGVF9VSW50ICAgICAgIG5faW5zOwotI2Vsc2UKLSAgICBGVF9VTlVTRUQoIGlzX2NvbXBvc2l0ZSApOwotI2VuZGlmCi0KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotICAgIG5faW5zID0gbG9hZGVyLT5nbHlwaC0+Y29udHJvbF9sZW47Ci0jZW5kaWYKLQotICAgIG9yaWdpbiA9IHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDRdLng7Ci0gICAgb3JpZ2luID0gRlRfUElYX1JPVU5EKCBvcmlnaW4gKSAtIG9yaWdpbjsKLSAgICBpZiAoIG9yaWdpbiApCi0gICAgICB0cmFuc2xhdGVfYXJyYXkoIHpvbmUtPm5fcG9pbnRzLCB6b25lLT5jdXIsIG9yaWdpbiwgMCApOwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgLyogc2F2ZSBvcmlnaW5hbCBwb2ludCBwb3NpdGlvbiBpbiBvcmcgKi8KLSAgICBpZiAoIG5faW5zID4gMCApCi0gICAgICBGVF9BUlJBWV9DT1BZKCB6b25lLT5vcmcsIHpvbmUtPmN1ciwgem9uZS0+bl9wb2ludHMgKTsKLSAgICAvKiBSZXNldCBncmFwaGljcyBzdGF0ZS4gKi8KLSAgICBsb2FkZXItPmV4ZWMtPkdTID0gKChUVF9TaXplKWxvYWRlci0+c2l6ZSktPkdTOwotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIEhpbnRpbmcgaW5zdHJ1Y3Rpb25zIG9mIGEgY29tcG9zaXRlIGdseXBoICovCi0gICAgLyogICAgICBjb21wbGV0ZWx5IHJlZmVyIHRvIHRoZSAoYWxyZWFkeSkgaGludGVkIHN1YmdseXBocy4gICAgICovCi0gICAgaWYgKCBpc19jb21wb3NpdGUgKQotICAgIHsKLSAgICAgIGxvYWRlci0+ZXhlYy0+bWV0cmljcy54X3NjYWxlID0gMSA8PCAxNjsKLSAgICAgIGxvYWRlci0+ZXhlYy0+bWV0cmljcy55X3NjYWxlID0gMSA8PCAxNjsKLQotICAgICAgRlRfQVJSQVlfQ09QWSggem9uZS0+b3J1cywgem9uZS0+Y3VyLCB6b25lLT5uX3BvaW50cyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbG9hZGVyLT5leGVjLT5tZXRyaWNzLnhfc2NhbGUgPQotICAgICAgICAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgbG9hZGVyLT5leGVjLT5tZXRyaWNzLnlfc2NhbGUgPQotICAgICAgICAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy55X3NjYWxlOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogcm91bmQgcHAyIGFuZCBwcDQgKi8KLSAgICB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAzXS54ID0KLSAgICAgIEZUX1BJWF9ST1VORCggem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gM10ueCApOwotICAgIHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDFdLnkgPQotICAgICAgRlRfUElYX1JPVU5EKCB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAxXS55ICk7Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIGlmICggbl9pbnMgPiAwICkKLSAgICB7Ci0gICAgICBGVF9Cb29sICAgZGVidWc7Ci0gICAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgICAgZXJyb3IgPSBUVF9TZXRfQ29kZVJhbmdlKCBsb2FkZXItPmV4ZWMsIHR0X2NvZGVyYW5nZV9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5leGVjLT5nbHlwaElucywgbl9pbnMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGxvYWRlci0+ZXhlYy0+aXNfY29tcG9zaXRlID0gaXNfY29tcG9zaXRlOwotICAgICAgbG9hZGVyLT5leGVjLT5wdHMgICAgICAgICAgPSAqem9uZTsKLQotICAgICAgZGVidWcgPSBGVF9CT09MKCAhKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKChUVF9TaXplKWxvYWRlci0+c2l6ZSktPmRlYnVnICAgICAgICAgICAgICk7Ci0KLSAgICAgIGVycm9yID0gVFRfUnVuX0NvbnRleHQoIGxvYWRlci0+ZXhlYywgZGVidWcgKTsKLSAgICAgIGlmICggZXJyb3IgJiYgbG9hZGVyLT5leGVjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICAvKiBzYXZlIGdseXBoIHBoYW50b20gcG9pbnRzICovCi0gICAgaWYgKCAhbG9hZGVyLT5wcmVzZXJ2ZV9wcHMgKQotICAgIHsKLSAgICAgIGxvYWRlci0+cHAxID0gem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gNF07Ci0gICAgICBsb2FkZXItPnBwMiA9IHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDNdOwotICAgICAgbG9hZGVyLT5wcDMgPSB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAyXTsKLSAgICAgIGxvYWRlci0+cHA0ID0gem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gMV07Ci0gICAgfQotCi0gICAgcmV0dXJuIFRUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25jZSBhIHNpbXBsZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQsIGl0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZC4gICAgICovCi0gIC8qICAgIFVzdWFsbHksIHRoaXMgbWVhbnMgc2NhbGluZyBhbmQgaGludGluZyB0aHJvdWdoIGJ5dGVjb2RlICAgICAgICAgICAqLwotICAvKiAgICBpbnRlcnByZXRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCggVFRfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgPSBsb2FkZXItPmdsb2FkZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yICAgPSBUVF9FcnJfT2s7Ci0gICAgRlRfT3V0bGluZSogICAgIG91dGxpbmU7Ci0gICAgRlRfSW50ICAgICAgICAgIG5fcG9pbnRzOwotCi0KLSAgICBvdXRsaW5lICA9ICZnbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0gICAgbl9wb2ludHMgPSBvdXRsaW5lLT5uX3BvaW50czsKLQotICAgIC8qIHNldCBwaGFudG9tIHBvaW50cyAqLwotCi0gICAgb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzICAgIF0gPSBsb2FkZXItPnBwMTsKLSAgICBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgKyAxXSA9IGxvYWRlci0+cHAyOwotICAgIG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyArIDJdID0gbG9hZGVyLT5wcDM7Ci0gICAgb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzICsgM10gPSBsb2FkZXItPnBwNDsKLQotICAgIG91dGxpbmUtPnRhZ3Nbbl9wb2ludHMgICAgXSA9IDA7Ci0gICAgb3V0bGluZS0+dGFnc1tuX3BvaW50cyArIDFdID0gMDsKLSAgICBvdXRsaW5lLT50YWdzW25fcG9pbnRzICsgMl0gPSAwOwotICAgIG91dGxpbmUtPnRhZ3Nbbl9wb2ludHMgKyAzXSA9IDA7Ci0KLSAgICBuX3BvaW50cyArPSA0OwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotCi0gICAgaWYgKCAoKFRUX0ZhY2UpbG9hZGVyLT5mYWNlKS0+ZG9ibGVuZCApCi0gICAgewotICAgICAgLyogRGVsdGFzIGFwcGx5IHRvIHRoZSB1bnNjYWxlZCBkYXRhLiAqLwotICAgICAgRlRfVmVjdG9yKiAgZGVsdGFzOwotICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gbG9hZGVyLT5mYWNlLT5tZW1vcnk7Ci0gICAgICBGVF9JbnQgICAgICBpOwotCi0KLSAgICAgIGVycm9yID0gVFRfVmFyeV9HZXRfR2x5cGhfRGVsdGFzKCAoVFRfRmFjZSkobG9hZGVyLT5mYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9wb2ludHMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbl9wb2ludHM7ICsraSApCi0gICAgICB7Ci0gICAgICAgIG91dGxpbmUtPnBvaW50c1tpXS54ICs9IGRlbHRhc1tpXS54OwotICAgICAgICBvdXRsaW5lLT5wb2ludHNbaV0ueSArPSBkZWx0YXNbaV0ueTsKLSAgICAgIH0KLQotICAgICAgRlRfRlJFRSggZGVsdGFzICk7Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCAqLwotCi0gICAgaWYgKCBJU19ISU5URUQoIGxvYWRlci0+bG9hZF9mbGFncyApICkKLSAgICB7Ci0gICAgICB0dF9wcmVwYXJlX3pvbmUoICZsb2FkZXItPnpvbmUsICZnbG9hZGVyLT5jdXJyZW50LCAwLCAwICk7Ci0KLSAgICAgIEZUX0FSUkFZX0NPUFkoIGxvYWRlci0+em9uZS5vcnVzLCBsb2FkZXItPnpvbmUuY3VyLAotICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT56b25lLm5fcG9pbnRzICsgNCApOwotICAgIH0KLQotICAgIC8qIHNjYWxlIHRoZSBnbHlwaCAqLwotICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIGxpbWl0ICAgPSBvdXRsaW5lLT5wb2ludHMgKyBuX3BvaW50czsKLSAgICAgIEZUX0ZpeGVkICAgIHhfc2NhbGUgPSAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgRlRfRml4ZWQgICAgeV9zY2FsZSA9ICgoVFRfU2l6ZSlsb2FkZXItPnNpemUpLT5tZXRyaWNzLnlfc2NhbGU7Ci0KLQotICAgICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgICAgewotICAgICAgICB2ZWMtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApOwotICAgICAgICB2ZWMtPnkgPSBGVF9NdWxGaXgoIHZlYy0+eSwgeV9zY2FsZSApOwotICAgICAgfQotCi0gICAgICBsb2FkZXItPnBwMSA9IG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDRdOwotICAgICAgbG9hZGVyLT5wcDIgPSBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgLSAzXTsKLSAgICAgIGxvYWRlci0+cHAzID0gb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzIC0gMl07Ci0gICAgICBsb2FkZXItPnBwNCA9IG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDFdOwotICAgIH0KLQotICAgIGlmICggSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSApCi0gICAgewotICAgICAgbG9hZGVyLT56b25lLm5fcG9pbnRzICs9IDQ7Ci0KLSAgICAgIGVycm9yID0gVFRfSGludF9HbHlwaCggbG9hZGVyLCAwICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmNlIGEgY29tcG9zaXRlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQsIGl0IG5lZWRzIHRvIGJlICAgICAgICAgKi8KLSAgLyogICAgcHJvY2Vzc2VkLiAgVXN1YWxseSwgdGhpcyBtZWFucyB0cmFuc2Zvcm1pbmcgYW5kIHRyYW5zbGF0aW5nLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgVFRfUHJvY2Vzc19Db21wb3NpdGVfQ29tcG9uZW50KCBUVF9Mb2FkZXIgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgc3RhcnRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bV9iYXNlX3BvaW50cyApCi0gIHsKLSAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciAgICA9IGxvYWRlci0+Z2xvYWRlcjsKLSAgICBGVF9WZWN0b3IqICAgICAgYmFzZV92ZWMgICA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHM7Ci0gICAgRlRfVUludCAgICAgICAgIG51bV9wb2ludHMgPSBnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0gICAgRlRfQm9vbCAgICAgICAgIGhhdmVfc2NhbGU7Ci0gICAgRlRfUG9zICAgICAgICAgIHgsIHk7Ci0KLQotICAgIGhhdmVfc2NhbGUgPSBGVF9CT09MKCBzdWJnbHlwaC0+ZmxhZ3MgJiAoIFdFX0hBVkVfQV9TQ0FMRSAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFX0hBVkVfQU5fWFlfU0NBTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFX0hBVkVfQV8yWDIgICAgICAgKSApOwotCi0gICAgLyogcGVyZm9ybSB0aGUgdHJhbnNmb3JtIHJlcXVpcmVkIGZvciB0aGlzIHN1YmdseXBoICovCi0gICAgaWYgKCBoYXZlX3NjYWxlICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgIGZvciAoIGkgPSBudW1fYmFzZV9wb2ludHM7IGkgPCBudW1fcG9pbnRzOyBpKysgKQotICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtKCBiYXNlX3ZlYyArIGksICZzdWJnbHlwaC0+dHJhbnNmb3JtICk7Ci0gICAgfQotCi0gICAgLyogZ2V0IG9mZnNldCAqLwotICAgIGlmICggISggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfWFlfVkFMVUVTICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgIGsgPSBzdWJnbHlwaC0+YXJnMTsKLSAgICAgIEZUX1VJbnQgICAgIGwgPSBzdWJnbHlwaC0+YXJnMjsKLSAgICAgIEZUX1ZlY3RvciogIHAxOwotICAgICAgRlRfVmVjdG9yKiAgcDI7Ci0KLQotICAgICAgLyogbWF0Y2ggbC10aCBwb2ludCBvZiB0aGUgbmV3bHkgbG9hZGVkIGNvbXBvbmVudCB0byB0aGUgay10aCBwb2ludCAqLwotICAgICAgLyogb2YgdGhlIHByZXZpb3VzbHkgbG9hZGVkIGNvbXBvbmVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBjaGFuZ2UgdG8gdGhlIHBvaW50IG51bWJlcnMgdXNlZCBieSBvdXIgb3V0bGluZSAqLwotICAgICAgayArPSBzdGFydF9wb2ludDsKLSAgICAgIGwgKz0gbnVtX2Jhc2VfcG9pbnRzOwotICAgICAgaWYgKCBrID49IG51bV9iYXNlX3BvaW50cyB8fAotICAgICAgICAgICBsID49IG51bV9wb2ludHMgICAgICApCi0gICAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9Db21wb3NpdGU7Ci0KLSAgICAgIHAxID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLnBvaW50cyArIGs7Ci0gICAgICBwMiA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKyBsOwotCi0gICAgICB4ID0gcDEtPnggLSBwMi0+eDsKLSAgICAgIHkgPSBwMS0+eSAtIHAyLT55OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgeCA9IHN1YmdseXBoLT5hcmcxOwotICAgICAgeSA9IHN1YmdseXBoLT5hcmcyOwotCi0gICAgICBpZiAoICF4ICYmICF5ICkKLSAgICAgICAgcmV0dXJuIFRUX0Vycl9PazsKLQotICAvKiBVc2UgYSBkZWZhdWx0IHZhbHVlIGRlcGVuZGVudCBvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVELiAgVGhpcyBpcyB1c2VmdWwgZm9yIG9sZCBUVCAqLwotICAvKiBmb250cyB3aGljaCBkb24ndCBzZXQgdGhlIHh4eF9DT01QT05FTlRfT0ZGU0VUIGJpdC4gICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBpZiAoIGhhdmVfc2NhbGUgJiYKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVECi0gICAgICAgICAgICEoIHN1YmdseXBoLT5mbGFncyAmIFVOU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQgKSApCi0jZWxzZQotICAgICAgICAgICAgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBTQ0FMRURfQ09NUE9ORU5UX09GRlNFVCApICkKLSNlbmRpZgotICAgICAgewotCi0jaWYgMAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBhbGdvcml0aG0gaXMgd2hhdCBBcHBsZSBkb2N1bWVudHMuICBCdXQgaXQgZG9lc24ndCB3b3JrLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpbnQgIGEgPSBzdWJnbHlwaC0+dHJhbnNmb3JtLnh4ID4gMCA/ICBzdWJnbHlwaC0+dHJhbnNmb3JtLnh4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLXN1YmdseXBoLT50cmFuc2Zvcm0ueHg7Ci0gICAgICAgIGludCAgYiA9IHN1YmdseXBoLT50cmFuc2Zvcm0ueXggPiAwID8gIHN1YmdseXBoLT50cmFuc2Zvcm0ueXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtc3ViZ2x5cGgtPnRyYW5zZm9ybS55eDsKLSAgICAgICAgaW50ICBjID0gc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSA+IDAgPyAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC1zdWJnbHlwaC0+dHJhbnNmb3JtLnh5OwotICAgICAgICBpbnQgIGQgPSBzdWJnbHlwaC0+dHJhbnNmb3JtLnl5ID4gMCA/IHN1YmdseXBoLT50cmFuc2Zvcm0ueXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtc3ViZ2x5cGgtPnRyYW5zZm9ybS55eTsKLSAgICAgICAgaW50ICBtID0gYSA+IGIgPyBhIDogYjsKLSAgICAgICAgaW50ICBuID0gYyA+IGQgPyBjIDogZDsKLQotCi0gICAgICAgIGlmICggYSAtIGIgPD0gMzMgJiYgYSAtIGIgPj0gLTMzICkKLSAgICAgICAgICBtICo9IDI7Ci0gICAgICAgIGlmICggYyAtIGQgPD0gMzMgJiYgYyAtIGQgPj0gLTMzICkKLSAgICAgICAgICBuICo9IDI7Ci0gICAgICAgIHggPSBGVF9NdWxGaXgoIHgsIG0gKTsKLSAgICAgICAgeSA9IEZUX011bEZpeCggeSwgbiApOwotCi0jZWxzZSAvKiAwICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGFsZ29yaXRobSBpcyBhIGd1ZXNzIGFuZCB3b3JrcyBtdWNoIGJldHRlciB0aGFuIHRoZSBhYm92ZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIEZUX0ZpeGVkICBtYWNfeHNjYWxlID0gRlRfU3FydEZpeGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBzdWJnbHlwaC0+dHJhbnNmb3JtLnh4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJnbHlwaC0+dHJhbnNmb3JtLnh4ICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBzdWJnbHlwaC0+dHJhbnNmb3JtLnh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJnbHlwaC0+dHJhbnNmb3JtLnh5ICkgKTsKLSAgICAgICAgRlRfRml4ZWQgIG1hY195c2NhbGUgPSBGVF9TcXJ0Rml4ZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIHN1YmdseXBoLT50cmFuc2Zvcm0ueXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueXkgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIHN1YmdseXBoLT50cmFuc2Zvcm0ueXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueXggKSApOwotCi0KLSAgICAgICAgeCA9IEZUX011bEZpeCggeCwgbWFjX3hzY2FsZSApOwotICAgICAgICB5ID0gRlRfTXVsRml4KCB5LCBtYWNfeXNjYWxlICk7Ci0KLSNlbmRpZiAvKiAwICovCi0KLSAgICAgIH0KLQotICAgICAgaWYgKCAhKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgKQotICAgICAgewotICAgICAgICBGVF9GaXhlZCAgeF9zY2FsZSA9ICgoVFRfU2l6ZSlsb2FkZXItPnNpemUpLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICAgIEZUX0ZpeGVkICB5X3NjYWxlID0gKChUVF9TaXplKWxvYWRlci0+c2l6ZSktPm1ldHJpY3MueV9zY2FsZTsKLQotCi0gICAgICAgIHggPSBGVF9NdWxGaXgoIHgsIHhfc2NhbGUgKTsKLSAgICAgICAgeSA9IEZUX011bEZpeCggeSwgeV9zY2FsZSApOwotCi0gICAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgUk9VTkRfWFlfVE9fR1JJRCApCi0gICAgICAgIHsKLSAgICAgICAgICB4ID0gRlRfUElYX1JPVU5EKCB4ICk7Ci0gICAgICAgICAgeSA9IEZUX1BJWF9ST1VORCggeSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCB4IHx8IHkgKQotICAgICAgdHJhbnNsYXRlX2FycmF5KCBudW1fcG9pbnRzIC0gbnVtX2Jhc2VfcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3ZlYyArIG51bV9iYXNlX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgeCwgeSApOwotCi0gICAgcmV0dXJuIFRUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUHJvY2Vzc19Db21wb3NpdGVfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwgaW4gdGhhdCAgICovCi0gIC8qICAgIGl0cyBzb2xlIHB1cnBvc2UgaXMgdG8gaGludCB0aGUgZ2x5cGguICBUaHVzIHRoaXMgZnVuY3Rpb24gaXMgICAgICAqLwotICAvKiAgICBvbmx5IGF2YWlsYWJsZSB3aGVuIGJ5dGVjb2RlIGludGVycHJldGVyIGlzIGVuYWJsZWQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9HbHlwaCggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHN0YXJ0X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBzdGFydF9jb250b3VyICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZTsKLSAgICBGVF9VSW50ICAgICAgaTsKLQotCi0gICAgb3V0bGluZSA9ICZsb2FkZXItPmdsb2FkZXItPmJhc2Uub3V0bGluZTsKLQotICAgIC8qIG1ha2Ugcm9vbSBmb3IgcGhhbnRvbSBwb2ludHMgKi8KLSAgICBlcnJvciA9IEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggbG9hZGVyLT5nbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5uX3BvaW50cyArIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIG91dGxpbmUtPnBvaW50c1tvdXRsaW5lLT5uX3BvaW50cyAgICBdID0gbG9hZGVyLT5wcDE7Ci0gICAgb3V0bGluZS0+cG9pbnRzW291dGxpbmUtPm5fcG9pbnRzICsgMV0gPSBsb2FkZXItPnBwMjsKLSAgICBvdXRsaW5lLT5wb2ludHNbb3V0bGluZS0+bl9wb2ludHMgKyAyXSA9IGxvYWRlci0+cHAzOwotICAgIG91dGxpbmUtPnBvaW50c1tvdXRsaW5lLT5uX3BvaW50cyArIDNdID0gbG9hZGVyLT5wcDQ7Ci0KLSAgICBvdXRsaW5lLT50YWdzW291dGxpbmUtPm5fcG9pbnRzICAgIF0gPSAwOwotICAgIG91dGxpbmUtPnRhZ3Nbb3V0bGluZS0+bl9wb2ludHMgKyAxXSA9IDA7Ci0gICAgb3V0bGluZS0+dGFnc1tvdXRsaW5lLT5uX3BvaW50cyArIDJdID0gMDsKLSAgICBvdXRsaW5lLT50YWdzW291dGxpbmUtPm5fcG9pbnRzICsgM10gPSAwOwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGxvYWRlci0+c3RyZWFtOwotICAgICAgRlRfVVNob3J0ICBuX2luczsKLQotCi0gICAgICAvKiBUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaCBvbmx5IGdpdmVzIHVzIHRoZSBvZmZzZXQgb2YgaW5zdHJ1Y3Rpb25zICovCi0gICAgICAvKiBzbyB3ZSByZWFkIHRoZW0gaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBsb2FkZXItPmluc19wb3MgKSB8fAotICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggbl9pbnMgKSAgICAgICAgICAgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgIEluc3RydWN0aW9ucyBzaXplID0gJWRcbiIsIG5faW5zICkpOwotCi0gICAgICAvKiBjaGVjayBpdCAqLwotICAgICAgaWYgKCBuX2lucyA+ICgoVFRfRmFjZSlsb2FkZXItPmZhY2UpLT5tYXhfcHJvZmlsZS5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAiVFRfUHJvY2Vzc19Db21wb3NpdGVfR2x5cGg6IFRvbyBtYW55IGluc3RydWN0aW9ucyAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICBuX2lucyApKTsKLQotICAgICAgICByZXR1cm4gVFRfRXJyX1Rvb19NYW55X0hpbnRzOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIG5faW5zID09IDAgKQotICAgICAgICByZXR1cm4gVFRfRXJyX09rOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEKCBsb2FkZXItPmV4ZWMtPmdseXBoSW5zLCBuX2lucyApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBsb2FkZXItPmdseXBoLT5jb250cm9sX2RhdGEgPSBsb2FkZXItPmV4ZWMtPmdseXBoSW5zOwotICAgICAgbG9hZGVyLT5nbHlwaC0+Y29udHJvbF9sZW4gID0gbl9pbnM7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIHR0X3ByZXBhcmVfem9uZSggJmxvYWRlci0+em9uZSwgJmxvYWRlci0+Z2xvYWRlci0+YmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvaW50LCBzdGFydF9jb250b3VyICk7Ci0KLSAgICAvKiBTb21lIHBvaW50cyBhcmUgbGlrZWx5IHRvdWNoZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiAgKi8KLSAgICAvKiBpbnN0cnVjdGlvbnMgb24gY29tcG9uZW50cy4gIFNvIGxldCdzIHVudG91Y2ggdGhlbS4gKi8KLSAgICBmb3IgKCBpID0gc3RhcnRfcG9pbnQ7IGkgPCBsb2FkZXItPnpvbmUubl9wb2ludHM7IGkrKyApCi0gICAgICBsb2FkZXItPnpvbmUudGFnc1tpXSAmPSB+KCBGVF9DVVJWRV9UQUdfVE9VQ0hfWCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DVVJWRV9UQUdfVE9VQ0hfWSApOwotCi0gICAgbG9hZGVyLT56b25lLm5fcG9pbnRzICs9IDQ7Ci0KLSAgICByZXR1cm4gVFRfSGludF9HbHlwaCggbG9hZGVyLCAxICk7Ci0gIH0KLQotCi0gIC8qIENhbGN1bGF0ZSB0aGUgZm91ciBwaGFudG9tIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZmlyc3QgdHdvIHN0YW5kIGZvciBob3Jpem9udGFsIG9yaWdpbiBhbmQgYWR2YW5jZS4gKi8KLSAgLyogVGhlIGxhc3QgdHdvIHN0YW5kIGZvciB2ZXJ0aWNhbCBvcmlnaW4gYW5kIGFkdmFuY2UuICAgICovCi0jZGVmaW5lIFRUX0xPQURFUl9TRVRfUFAoIGxvYWRlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDEueCA9IChsb2FkZXIpLT5iYm94LnhNaW4gLSAobG9hZGVyKS0+bGVmdF9iZWFyaW5nOyBcCi0gICAgICAgICAgICAobG9hZGVyKS0+cHAxLnkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKGxvYWRlciktPnBwMi54ID0gKGxvYWRlciktPnBwMS54ICsgKGxvYWRlciktPmFkdmFuY2U7ICAgICAgICAgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDIueSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAobG9hZGVyKS0+cHAzLnggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKGxvYWRlciktPnBwMy55ID0gKGxvYWRlciktPnRvcF9iZWFyaW5nICsgKGxvYWRlciktPmJib3gueU1heDsgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDQueCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAobG9hZGVyKS0+cHA0LnkgPSAobG9hZGVyKS0+cHAzLnkgLSAobG9hZGVyKS0+dmFkdmFuY2U7ICAgICAgICAgXAotICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfdHJ1ZXR5cGVfZ2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIGEgZ2l2ZW4gdHJ1ZXR5cGUgZ2x5cGguICBIYW5kbGVzIGNvbXBvc2l0ZXMgYW5kIHVzZXMgYSAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBsb2FkX3RydWV0eXBlX2dseXBoKCBUVF9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICByZWN1cnNlX2NvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKLSAgICBGVF9GaXhlZCAgICAgICAgeF9zY2FsZSwgeV9zY2FsZTsKLSAgICBGVF9VTG9uZyAgICAgICAgb2Zmc2V0OwotICAgIFRUX0ZhY2UgICAgICAgICBmYWNlICAgICAgICAgPSAoVFRfRmFjZSlsb2FkZXItPmZhY2U7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgICAgICA9IGxvYWRlci0+Z2xvYWRlcjsKLSAgICBGVF9Cb29sICAgICAgICAgb3BlbmVkX2ZyYW1lID0gMDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBGVF9WZWN0b3IqICAgICAgZGVsdGFzICAgICAgID0gTlVMTDsKLSNlbmRpZgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIEZUX1N0cmVhbVJlYyAgICBpbmNfc3RyZWFtOwotICAgIEZUX0RhdGEgICAgICAgICBnbHlwaF9kYXRhOwotICAgIEZUX0Jvb2wgICAgICAgICBnbHlwaF9kYXRhX2xvYWRlZCA9IDA7Ci0jZW5kaWYKLQotCi0gICAgLyogc29tZSBmb250cyBoYXZlIGFuIGluY29ycmVjdCB2YWx1ZSBvZiBgbWF4Q29tcG9uZW50RGVwdGgnLCAqLwotICAgIC8qIHRodXMgd2UgYWxsb3cgZGVwdGggMSB0byBjYXRjaCB0aGUgbWFqb3JpdHkgb2YgdGhlbSAgICAgICAgKi8KLSAgICBpZiAoIHJlY3Vyc2VfY291bnQgPiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgcmVjdXJzZV9jb3VudCA+IGZhY2UtPm1heF9wcm9maWxlLm1heENvbXBvbmVudERlcHRoICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFRUX0Vycl9JbnZhbGlkX0NvbXBvc2l0ZTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBnbHlwaCBpbmRleCAqLwotICAgIGlmICggZ2x5cGhfaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFRUX0Vycl9JbnZhbGlkX0dseXBoX0luZGV4OwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGxvYWRlci0+Z2x5cGhfaW5kZXggPSBnbHlwaF9pbmRleDsKLQotICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgewotICAgICAgeF9zY2FsZSA9ICgoVFRfU2l6ZSlsb2FkZXItPnNpemUpLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICB5X3NjYWxlID0gKChUVF9TaXplKWxvYWRlci0+c2l6ZSktPm1ldHJpY3MueV9zY2FsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHhfc2NhbGUgPSAweDEwMDAwTDsKLSAgICAgIHlfc2NhbGUgPSAweDEwMDAwTDsKLSAgICB9Ci0KLSAgICAvKiBnZXQgbWV0cmljcywgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgKi8KLSAgICB7Ci0gICAgICBGVF9TaG9ydCAgIGxlZnRfYmVhcmluZyA9IDAsIHRvcF9iZWFyaW5nID0gMDsKLSAgICAgIEZUX1VTaG9ydCAgYWR2YW5jZV93aWR0aCA9IDAsIGFkdmFuY2VfaGVpZ2h0ID0gMDsKLQotCi0gICAgICBUVF9HZXRfSE1ldHJpY3MoIGZhY2UsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAoRlRfQm9vbCkhKCBsb2FkZXItPmxvYWRfZmxhZ3MgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCApLAotICAgICAgICAgICAgICAgICAgICAgICAmbGVmdF9iZWFyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAmYWR2YW5jZV93aWR0aCApOwotICAgICAgVFRfR2V0X1ZNZXRyaWNzKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgKEZUX0Jvb2wpISggbG9hZGVyLT5sb2FkX2ZsYWdzICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggKSwKLSAgICAgICAgICAgICAgICAgICAgICAgJnRvcF9iZWFyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAmYWR2YW5jZV9oZWlnaHQgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBpbmNyZW1lbnRhbGx5IGxvYWRlZCBmb250IHNlZSBpZiB0aGVyZSBhcmUgKi8KLSAgICAgIC8qIG92ZXJyaWRpbmcgbWV0cmljcyBmb3IgdGhpcyBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSAmJgotICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcyApCi0gICAgICB7Ci0gICAgICAgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWMgIG1ldHJpY3M7Ci0KLQotICAgICAgICBtZXRyaWNzLmJlYXJpbmdfeCA9IGxlZnRfYmVhcmluZzsKLSAgICAgICAgbWV0cmljcy5iZWFyaW5nX3kgPSAwOwotICAgICAgICBtZXRyaWNzLmFkdmFuY2UgPSBhZHZhbmNlX3dpZHRoOwotICAgICAgICBlcnJvciA9IGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzKAotICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5vYmplY3QsCi0gICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgRkFMU0UsICZtZXRyaWNzICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgbGVmdF9iZWFyaW5nICA9IChGVF9TaG9ydCltZXRyaWNzLmJlYXJpbmdfeDsKLSAgICAgICAgYWR2YW5jZV93aWR0aCA9IChGVF9VU2hvcnQpbWV0cmljcy5hZHZhbmNlOwotCi0jaWYgMAotCi0gICAgICAgIC8qIEdXVzogRG8gSSBkbyB0aGUgc2FtZSBmb3IgdmVydGljYWwgbWV0cmljcz8gKi8KLSAgICAgICAgbWV0cmljcy5iZWFyaW5nX3ggPSAwOwotICAgICAgICBtZXRyaWNzLmJlYXJpbmdfeSA9IHRvcF9iZWFyaW5nOwotICAgICAgICBtZXRyaWNzLmFkdmFuY2UgPSBhZHZhbmNlX2hlaWdodDsKLSAgICAgICAgZXJyb3IgPSBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcygKLSAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsIFRSVUUsICZtZXRyaWNzICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgdG9wX2JlYXJpbmcgID0gKEZUX1Nob3J0KW1ldHJpY3MuYmVhcmluZ195OwotICAgICAgICBhZHZhbmNlX2hlaWdodCA9IChGVF9VU2hvcnQpbWV0cmljcy5hZHZhbmNlOwotCi0jZW5kaWYgLyogMCAqLwotCi0gICAgICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICAgIGxvYWRlci0+bGVmdF9iZWFyaW5nID0gbGVmdF9iZWFyaW5nOwotICAgICAgbG9hZGVyLT5hZHZhbmNlICAgICAgPSBhZHZhbmNlX3dpZHRoOwotICAgICAgbG9hZGVyLT50b3BfYmVhcmluZyAgPSB0b3BfYmVhcmluZzsKLSAgICAgIGxvYWRlci0+dmFkdmFuY2UgICAgID0gYWR2YW5jZV9oZWlnaHQ7Ci0KLSAgICAgIGlmICggIWxvYWRlci0+bGluZWFyX2RlZiApCi0gICAgICB7Ci0gICAgICAgIGxvYWRlci0+bGluZWFyX2RlZiA9IDE7Ci0gICAgICAgIGxvYWRlci0+bGluZWFyICAgICA9IGFkdmFuY2Vfd2lkdGg7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IGBvZmZzZXQnIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2x5cGggcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mICovCi0gICAgLyogdGhlIGBnbHlmJyB0YWJsZSwgYW5kIGBieXRlX2xlbicgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZ2x5cGggaW4gICovCi0gICAgLyogYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0KLSAgICAvKiBJZiB3ZSBhcmUgbG9hZGluZyBnbHlwaCBkYXRhIHZpYSB0aGUgaW5jcmVtZW50YWwgaW50ZXJmYWNlLCBzZXQgKi8KLSAgICAvKiB0aGUgbG9hZGVyIHN0cmVhbSB0byBhIG1lbW9yeSBzdHJlYW0gcmVhZGluZyB0aGUgZGF0YSByZXR1cm5lZCAgKi8KLSAgICAvKiBieSB0aGUgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfZGF0YSgKLSAgICAgICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwKLSAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgJmdseXBoX2RhdGEgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGdseXBoX2RhdGFfbG9hZGVkID0gMTsKLSAgICAgIG9mZnNldCAgICAgICAgICAgID0gMDsKLSAgICAgIGxvYWRlci0+Ynl0ZV9sZW4gID0gZ2x5cGhfZGF0YS5sZW5ndGg7Ci0KLSAgICAgIEZUX01FTV9aRVJPKCAmaW5jX3N0cmVhbSwgc2l6ZW9mICggaW5jX3N0cmVhbSApICk7Ci0gICAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggJmluY19zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfZGF0YS5wb2ludGVyLCBnbHlwaF9kYXRhLmxlbmd0aCApOwotCi0gICAgICBsb2FkZXItPnN0cmVhbSA9ICZpbmNfc3RyZWFtOwotICAgIH0KLSAgICBlbHNlCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICAgIG9mZnNldCA9IHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCopJmxvYWRlci0+Ynl0ZV9sZW4gKTsKLQotICAgIGlmICggbG9hZGVyLT5ieXRlX2xlbiA+IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gZmFjZS0+YWNjZXNzX2dseXBoX2ZyYW1lKCBsb2FkZXIsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+Z2x5Zl9vZmZzZXQgKyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5ieXRlX2xlbiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgb3BlbmVkX2ZyYW1lID0gMTsKLQotICAgICAgLyogcmVhZCBmaXJzdCBnbHlwaCBoZWFkZXIgKi8KLSAgICAgIGVycm9yID0gZmFjZS0+cmVhZF9nbHlwaF9oZWFkZXIoIGxvYWRlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIGxvYWRlci0+Ynl0ZV9sZW4gPT0gMCB8fCBsb2FkZXItPm5fY29udG91cnMgPT0gMCApCi0gICAgewotICAgICAgbG9hZGVyLT5iYm94LnhNaW4gPSAwOwotICAgICAgbG9hZGVyLT5iYm94LnhNYXggPSAwOwotICAgICAgbG9hZGVyLT5iYm94LnlNaW4gPSAwOwotICAgICAgbG9hZGVyLT5iYm94LnlNYXggPSAwOwotCi0gICAgICBUVF9MT0FERVJfU0VUX1BQKCBsb2FkZXIgKTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotICAgICAgaWYgKCAoKFRUX0ZhY2UpKGxvYWRlci0+ZmFjZSkpLT5kb2JsZW5kICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHNjYWxpbmcgKi8KLSAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsb2FkZXItPmZhY2UtPm1lbW9yeTsKLQotCi0gICAgICAgIGVycm9yID0gVFRfVmFyeV9HZXRfR2x5cGhfRGVsdGFzKCAoVFRfRmFjZSkobG9hZGVyLT5mYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCAmZGVsdGFzLCA0ICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBsb2FkZXItPnBwMS54ICs9IGRlbHRhc1swXS54OyBsb2FkZXItPnBwMS55ICs9IGRlbHRhc1swXS55OwotICAgICAgICBsb2FkZXItPnBwMi54ICs9IGRlbHRhc1sxXS54OyBsb2FkZXItPnBwMi55ICs9IGRlbHRhc1sxXS55OwotICAgICAgICBsb2FkZXItPnBwMy54ICs9IGRlbHRhc1syXS54OyBsb2FkZXItPnBwMy55ICs9IGRlbHRhc1syXS55OwotICAgICAgICBsb2FkZXItPnBwNC54ICs9IGRlbHRhc1szXS54OyBsb2FkZXItPnBwNC55ICs9IGRlbHRhc1szXS55OwotCi0gICAgICAgIEZUX0ZSRUUoIGRlbHRhcyApOwotICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgaWYgKCAoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgbG9hZGVyLT5wcDEueCA9IEZUX011bEZpeCggbG9hZGVyLT5wcDEueCwgeF9zY2FsZSApOwotICAgICAgICBsb2FkZXItPnBwMi54ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwMi54LCB4X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHAzLnkgPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAzLnksIHlfc2NhbGUgKTsKLSAgICAgICAgbG9hZGVyLT5wcDQueSA9IEZUX011bEZpeCggbG9hZGVyLT5wcDQueSwgeV9zY2FsZSApOwotICAgICAgfQotCi0gICAgICBlcnJvciA9IFRUX0Vycl9PazsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBUVF9MT0FERVJfU0VUX1BQKCBsb2FkZXIgKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogaWYgaXQgaXMgYSBzaW1wbGUgZ2x5cGgsIGxvYWQgaXQgKi8KLQotICAgIGlmICggbG9hZGVyLT5uX2NvbnRvdXJzID4gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5yZWFkX3NpbXBsZV9nbHlwaCggbG9hZGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBhbGwgZGF0YSBoYXZlIGJlZW4gcmVhZCAqLwotICAgICAgZmFjZS0+Zm9yZ2V0X2dseXBoX2ZyYW1lKCBsb2FkZXIgKTsKLSAgICAgIG9wZW5lZF9mcmFtZSA9IDA7Ci0KLSAgICAgIGVycm9yID0gVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgoIGxvYWRlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfR2x5cGhMb2FkZXJfQWRkKCBnbG9hZGVyICk7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBvdGhlcndpc2UsIGxvYWQgYSBjb21wb3NpdGUhICovCi0gICAgZWxzZSBpZiAoIGxvYWRlci0+bl9jb250b3VycyA9PSAtMSApCi0gICAgewotICAgICAgRlRfVUludCAgIHN0YXJ0X3BvaW50OwotICAgICAgRlRfVUludCAgIHN0YXJ0X2NvbnRvdXI7Ci0gICAgICBGVF9VTG9uZyAgaW5zX3BvczsgIC8qIHBvc2l0aW9uIG9mIGNvbXBvc2l0ZSBpbnN0cnVjdGlvbnMsIGlmIGFueSAqLwotCi0KLSAgICAgIHN0YXJ0X3BvaW50ICAgPSBnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0gICAgICBzdGFydF9jb250b3VyID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fY29udG91cnM7Ci0KLSAgICAgIC8qIGZvciBlYWNoIHN1YmdseXBoLCByZWFkIGNvbXBvc2l0ZSBoZWFkZXIgKi8KLSAgICAgIGVycm9yID0gZmFjZS0+cmVhZF9jb21wb3NpdGVfZ2x5cGgoIGxvYWRlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogc3RvcmUgdGhlIG9mZnNldCBvZiBpbnN0cnVjdGlvbnMgKi8KLSAgICAgIGluc19wb3MgPSBsb2FkZXItPmluc19wb3M7Ci0KLSAgICAgIC8qIGFsbCBkYXRhIHdlIG5lZWQgYXJlIHJlYWQgKi8KLSAgICAgIGZhY2UtPmZvcmdldF9nbHlwaF9mcmFtZSggbG9hZGVyICk7Ci0gICAgICBvcGVuZWRfZnJhbWUgPSAwOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotCi0gICAgICBpZiAoIGZhY2UtPmRvYmxlbmQgKQotICAgICAgewotICAgICAgICBGVF9JbnQgICAgICAgaSwgbGltaXQ7Ci0gICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaDsKLSAgICAgICAgRlRfTWVtb3J5ICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotCi0KLSAgICAgICAgLyogdGhpcyBwcm92aWRlcyBhZGRpdGlvbmFsIG9mZnNldHMgKi8KLSAgICAgICAgLyogZm9yIGVhY2ggY29tcG9uZW50J3MgdHJhbnNsYXRpb24gKi8KLQotICAgICAgICBpZiAoICggZXJyb3IgPSBUVF9WYXJ5X0dldF9HbHlwaF9EZWx0YXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsdGFzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2FkZXItPmN1cnJlbnQubnVtX3N1YmdseXBocyArIDQgKSkgIT0gMCApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+Y3VycmVudC5zdWJnbHlwaHMgKyBnbG9hZGVyLT5iYXNlLm51bV9zdWJnbHlwaHM7Ci0gICAgICAgIGxpbWl0ICAgID0gZ2xvYWRlci0+Y3VycmVudC5udW1fc3ViZ2x5cGhzOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGltaXQ7ICsraSwgKytzdWJnbHlwaCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUyApCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgKz0gZGVsdGFzW2ldLng7Ci0gICAgICAgICAgICBzdWJnbHlwaC0+YXJnMiArPSBkZWx0YXNbaV0ueTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb2FkZXItPnBwMS54ICs9IGRlbHRhc1tpICsgMF0ueDsgbG9hZGVyLT5wcDEueSArPSBkZWx0YXNbaSArIDBdLnk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggKz0gZGVsdGFzW2kgKyAxXS54OyBsb2FkZXItPnBwMi55ICs9IGRlbHRhc1tpICsgMV0ueTsKLSAgICAgICAgbG9hZGVyLT5wcDMueCArPSBkZWx0YXNbaSArIDJdLng7IGxvYWRlci0+cHAzLnkgKz0gZGVsdGFzW2kgKyAyXS55OwotICAgICAgICBsb2FkZXItPnBwNC54ICs9IGRlbHRhc1tpICsgM10ueDsgbG9hZGVyLT5wcDQueSArPSBkZWx0YXNbaSArIDNdLnk7Ci0KLSAgICAgICAgRlRfRlJFRSggZGVsdGFzICk7Ci0gICAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUICovCi0KLSAgICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGxvYWRlci0+cHAxLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAxLngsIHhfc2NhbGUgKTsKLSAgICAgICAgbG9hZGVyLT5wcDIueCA9IEZUX011bEZpeCggbG9hZGVyLT5wcDIueCwgeF9zY2FsZSApOwotICAgICAgICBsb2FkZXItPnBwMy55ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwMy55LCB5X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgPSBGVF9NdWxGaXgoIGxvYWRlci0+cHA0LnksIHlfc2NhbGUgKTsKLSAgICAgIH0KLQotICAgICAgLyogaWYgdGhlIGZsYWcgRlRfTE9BRF9OT19SRUNVUlNFIGlzIHNldCwgd2UgcmV0dXJuIHRoZSBzdWJnbHlwaCAqLwotICAgICAgLyogYGFzIGlzJyBpbiB0aGUgZ2x5cGggc2xvdCAodGhlIGNsaWVudCBhcHBsaWNhdGlvbiB3aWxsIGJlICAgICAqLwotICAgICAgLyogcmVzcG9uc2libGUgZm9yIGludGVycHJldGluZyB0aGVzZSBkYXRhKS4uLiAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKQotICAgICAgewotICAgICAgICBGVF9HbHlwaExvYWRlcl9BZGQoIGdsb2FkZXIgKTsKLSAgICAgICAgbG9hZGVyLT5nbHlwaC0+Zm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURTsKLQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgICAgbiwgbnVtX2Jhc2VfcG9pbnRzOwotICAgICAgICBGVF9TdWJHbHlwaCAgc3ViZ2x5cGggICAgICAgPSAwOwotCi0gICAgICAgIEZUX1VJbnQgICAgICBudW1fcG9pbnRzICAgICA9IHN0YXJ0X3BvaW50OwotICAgICAgICBGVF9VSW50ICAgICAgbnVtX3N1YmdseXBocyAgPSBnbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHM7Ci0gICAgICAgIEZUX1VJbnQgICAgICBudW1fYmFzZV9zdWJncyA9IGdsb2FkZXItPmJhc2UubnVtX3N1YmdseXBoczsKLQotICAgICAgICBGVF9TdHJlYW0gICAgb2xkX3N0cmVhbSAgICAgPSBsb2FkZXItPnN0cmVhbTsKLQotCi0gICAgICAgIEZUX0dseXBoTG9hZGVyX0FkZCggZ2xvYWRlciApOwotCi0gICAgICAgIC8qIHJlYWQgZWFjaCBzdWJnbHlwaCBpbmRlcGVuZGVudGx5ICovCi0gICAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX3N1YmdseXBoczsgbisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1ZlY3RvciAgcHBbNF07Ci0KLQotCi0gICAgICAgICAgLyogRWFjaCB0aW1lIHdlIGNhbGwgbG9hZF90cnVldHlwZV9nbHlwaCBpbiB0aGlzIGxvb3AsIHRoZSAgICovCi0gICAgICAgICAgLyogdmFsdWUgb2YgYGdsb2FkZXIuYmFzZS5zdWJnbHlwaHMnIGNhbiBjaGFuZ2UgZHVlIHRvIHRhYmxlICovCi0gICAgICAgICAgLyogcmVhbGxvY2F0aW9ucy4gIFdlIHRodXMgbmVlZCB0byByZWNvbXB1dGUgdGhlIHN1YmdseXBoICAgICovCi0gICAgICAgICAgLyogcG9pbnRlciBvbiBlYWNoIGl0ZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgc3ViZ2x5cGggPSBnbG9hZGVyLT5iYXNlLnN1YmdseXBocyArIG51bV9iYXNlX3N1YmdzICsgbjsKLQotICAgICAgICAgIHBwWzBdID0gbG9hZGVyLT5wcDE7Ci0gICAgICAgICAgcHBbMV0gPSBsb2FkZXItPnBwMjsKLSAgICAgICAgICBwcFsyXSA9IGxvYWRlci0+cHAzOwotICAgICAgICAgIHBwWzNdID0gbG9hZGVyLT5wcDQ7Ci0KLSAgICAgICAgICBudW1fYmFzZV9wb2ludHMgPSBnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0KLSAgICAgICAgICBlcnJvciA9IGxvYWRfdHJ1ZXR5cGVfZ2x5cGgoIGxvYWRlciwgc3ViZ2x5cGgtPmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZV9jb3VudCArIDEgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIC8qIHJlc3RvcmUgc3ViZ2x5cGggcG9pbnRlciAqLwotICAgICAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+YmFzZS5zdWJnbHlwaHMgKyBudW1fYmFzZV9zdWJncyArIG47Ci0KLSAgICAgICAgICBpZiAoICEoIHN1YmdseXBoLT5mbGFncyAmIFVTRV9NWV9NRVRSSUNTICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvYWRlci0+cHAxID0gcHBbMF07Ci0gICAgICAgICAgICBsb2FkZXItPnBwMiA9IHBwWzFdOwotICAgICAgICAgICAgbG9hZGVyLT5wcDMgPSBwcFsyXTsKLSAgICAgICAgICAgIGxvYWRlci0+cHA0ID0gcHBbM107Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbnVtX3BvaW50cyA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5uX3BvaW50czsKLQotICAgICAgICAgIGlmICggbnVtX3BvaW50cyA9PSBudW1fYmFzZV9wb2ludHMgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAvKiBnbG9hZGVyLT5iYXNlLm91dGxpbmUgY29uc2lzdHMgb2YgdGhyZWUgcGFydHM6ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAwIC0oMSktPiBzdGFydF9wb2ludCAtKDIpLT4gbnVtX2Jhc2VfcG9pbnRzIC0oMyktPiBuX3BvaW50cy4gKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAoMSk6IGV4aXN0cyBmcm9tIHRoZSBiZWdpbm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAoMik6IGNvbXBvbmVudHMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIHNvIGZhciAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAoMyk6IHRoZSBuZXdseSBsb2FkZWQgY29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQoIGxvYWRlciwgc3ViZ2x5cGgsIHN0YXJ0X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2Jhc2VfcG9pbnRzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2FkZXItPnN0cmVhbSA9IG9sZF9zdHJlYW07Ci0KLSAgICAgICAgLyogcHJvY2VzcyB0aGUgZ2x5cGggKi8KLSAgICAgICAgbG9hZGVyLT5pbnNfcG9zID0gaW5zX3BvczsKLSAgICAgICAgaWYgKCBJU19ISU5URUQoIGxvYWRlci0+bG9hZF9mbGFncyApICYmCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgICAgICAgICAgIHN1YmdseXBoLT5mbGFncyAmIFdFX0hBVkVfSU5TVFIgJiYKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICBudW1fcG9pbnRzID4gc3RhcnRfcG9pbnQgKQotICAgICAgICAgIFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0dseXBoKCBsb2FkZXIsIHN0YXJ0X3BvaW50LCBzdGFydF9jb250b3VyICk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGludmFsaWQgY29tcG9zaXRlIGNvdW50IChuZWdhdGl2ZSBidXQgbm90IC0xKSAqLwotICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9PdXRsaW5lOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEV4aXQ6Ci0KLSAgICBpZiAoIG9wZW5lZF9mcmFtZSApCi0gICAgICBmYWNlLT5mb3JnZXRfZ2x5cGhfZnJhbWUoIGxvYWRlciApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgaWYgKCBnbHlwaF9kYXRhX2xvYWRlZCApCi0gICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5mcmVlX2dseXBoX2RhdGEoCi0gICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAmZ2x5cGhfZGF0YSApOwotCi0jZW5kaWYKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNvbXB1dGVfZ2x5cGhfbWV0cmljcyggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCApCi0gIHsKLSAgICBGVF9CQm94ICAgICAgIGJib3g7Ci0gICAgVFRfRmFjZSAgICAgICBmYWNlID0gKFRUX0ZhY2UpbG9hZGVyLT5mYWNlOwotICAgIEZUX0ZpeGVkICAgICAgeV9zY2FsZTsKLSAgICBUVF9HbHlwaFNsb3QgIGdseXBoID0gbG9hZGVyLT5nbHlwaDsKLSAgICBUVF9TaXplICAgICAgIHNpemUgPSAoVFRfU2l6ZSlsb2FkZXItPnNpemU7Ci0KLQotICAgIHlfc2NhbGUgPSAweDEwMDAwTDsKLSAgICBpZiAoICggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKQotICAgICAgeV9zY2FsZSA9IHNpemUtPnJvb3QubWV0cmljcy55X3NjYWxlOwotCi0gICAgaWYgKCBnbHlwaC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUgKQotICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJmdseXBoLT5vdXRsaW5lLCAmYmJveCApOwotICAgIGVsc2UKLSAgICAgIGJib3ggPSBsb2FkZXItPmJib3g7Ci0KLSAgICAvKiBnZXQgdGhlIGRldmljZS1pbmRlcGVuZGVudCBob3Jpem9udGFsIGFkdmFuY2U7IGl0IGlzIHNjYWxlZCBsYXRlciAqLwotICAgIC8qIGJ5IHRoZSBiYXNlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgRlRfUG9zICBhZHZhbmNlID0gbG9hZGVyLT5saW5lYXI7Ci0KLQotICAgICAgLyogdGhlIGZsYWcgRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggd2FzIGludHJvZHVjZWQgdG8gKi8KLSAgICAgIC8qIGNvcnJlY3RseSBzdXBwb3J0IER5bmFMYWIgZm9udHMsIHdoaWNoIGhhdmUgYW4gaW5jb3JyZWN0ICAgICAgICovCi0gICAgICAvKiBgYWR2YW5jZV9XaWR0aF9NYXgnIGZpZWxkISAgSXQgaXMgdXNlZCwgdG8gbXkga25vd2xlZGdlLCAgICAgICAqLwotICAgICAgLyogZXhjbHVzaXZlbHkgaW4gdGhlIFgtVHJ1ZVR5cGUgZm9udCBzZXJ2ZXIuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGZhY2UtPnBvc3RzY3JpcHQuaXNGaXhlZFBpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggKSA9PSAwICkKLSAgICAgICAgYWR2YW5jZSA9IGZhY2UtPmhvcml6b250YWwuYWR2YW5jZV9XaWR0aF9NYXg7Ci0KLSAgICAgIC8qIHdlIG5lZWQgdG8gcmV0dXJuIHRoZSBhZHZhbmNlIGluIGZvbnQgdW5pdHMgaW4gbGluZWFySG9yaUFkdmFuY2UsICovCi0gICAgICAvKiBpdCB3aWxsIGJlIHNjYWxlZCBsYXRlciBieSB0aGUgYmFzZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZ2x5cGgtPmxpbmVhckhvcmlBZHZhbmNlID0gYWR2YW5jZTsKLSAgICB9Ci0KLSAgICBnbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1ggPSBiYm94LnhNaW47Ci0gICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gYmJveC55TWF4OwotICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IGxvYWRlci0+cHAyLnggLSBsb2FkZXItPnBwMS54OwotCi0gICAgLyogTm93IHRha2UgY2FyZSBvZiB2ZXJ0aWNhbCBtZXRyaWNzLiAgSW4gdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgICAgKi8KLSAgICAvKiBubyB2ZXJ0aWNhbCBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGZvbnQgKHJlbGF0aXZlbHkgY29tbW9uKSwgbWFrZSAqLwotICAgIC8qIHVwIHNvbWUgbWV0cmljcyBieSBgaGFuZCcuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB7Ci0gICAgICBGVF9Qb3MgIHRvcDsgICAgICAvKiBzY2FsZWQgdmVydGljYWwgdG9wIHNpZGUgYmVhcmluZyAgKi8KLSAgICAgIEZUX1BvcyAgYWR2YW5jZTsgIC8qIHNjYWxlZCB2ZXJ0aWNhbCBhZHZhbmNlIGhlaWdodCAgICAqLwotCi0KLSAgICAgIC8qIEdldCB0aGUgdW5zY2FsZWQgdG9wIGJlYXJpbmcgYW5kIGFkdmFuY2UgaGVpZ2h0LiAqLwotICAgICAgaWYgKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICYmCi0gICAgICAgICAgIGZhY2UtPnZlcnRpY2FsLm51bWJlcl9PZl9WTWV0cmljcyA+IDAgKQotICAgICAgewotICAgICAgICB0b3AgPSAoRlRfU2hvcnQpRlRfRGl2Rml4KCBsb2FkZXItPnBwMy55IC0gYmJveC55TWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlICk7Ci0KLSAgICAgICAgaWYgKCBsb2FkZXItPnBwMy55IDw9IGxvYWRlci0+cHA0LnkgKQotICAgICAgICAgIGFkdmFuY2UgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYWR2YW5jZSA9IChGVF9VU2hvcnQpRlRfRGl2Rml4KCBsb2FkZXItPnBwMy55IC0gbG9hZGVyLT5wcDQueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfc2NhbGUgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBoZWlnaHQ7Ci0KLQotICAgICAgICAvKiBYWFggQ29tcHV0ZSB0b3Agc2lkZSBiZWFyaW5nIGFuZCBhZHZhbmNlIGhlaWdodCBpbiAgKi8KLSAgICAgICAgLyogICAgIEdldF9WTWV0cmljcyBpbnN0ZWFkIG9mIGhlcmUuICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgLyogTk9URTogVGhlIE9TLzIgdmFsdWVzIGFyZSB0aGUgb25seSBgcG9ydGFibGUnIG9uZXMsICovCi0gICAgICAgIC8qICAgICAgIHdoaWNoIGlzIHdoeSB3ZSB1c2UgdGhlbSwgaWYgdGhlcmUgaXMgYW4gT1MvMiAqLwotICAgICAgICAvKiAgICAgICB0YWJsZSBpbiB0aGUgZm9udC4gIE90aGVyd2lzZSwgd2UgdXNlIHRoZSAgICAgKi8KLSAgICAgICAgLyogICAgICAgdmFsdWVzIGRlZmluZWQgaW4gdGhlIGhvcml6b250YWwgaGVhZGVyLiAgICAgICovCi0KLSAgICAgICAgaGVpZ2h0ID0gKEZUX1Nob3J0KUZUX0RpdkZpeCggYmJveC55TWF4IC0gYmJveC55TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlICk7Ci0gICAgICAgIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGVSApCi0gICAgICAgICAgYWR2YW5jZSA9IChGVF9Qb3MpKCBmYWNlLT5vczIuc1R5cG9Bc2NlbmRlciAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5vczIuc1R5cG9EZXNjZW5kZXIgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGFkdmFuY2UgPSAoRlRfUG9zKSggZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlciAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLkRlc2NlbmRlciApOwotCi0gICAgICAgIHRvcCA9ICggYWR2YW5jZSAtIGhlaWdodCApIC8gMjsKLSAgICAgIH0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAgIHsKLSAgICAgICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjKiAgaW5jcjsKLSAgICAgICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYyAgICAgbWV0cmljczsKLSAgICAgICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7Ci0KLQotICAgICAgICBpbmNyID0gZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlOwotCi0gICAgICAgIC8qIElmIHRoaXMgaXMgYW4gaW5jcmVtZW50YWxseSBsb2FkZWQgZm9udCBzZWUgaWYgdGhlcmUgYXJlICovCi0gICAgICAgIC8qIG92ZXJyaWRpbmcgbWV0cmljcyBmb3IgdGhpcyBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggaW5jciAmJiBpbmNyLT5mdW5jcy0+Z2V0X2dseXBoX21ldHJpY3MgKQotICAgICAgICB7Ci0gICAgICAgICAgbWV0cmljcy5iZWFyaW5nX3ggPSAwOwotICAgICAgICAgIG1ldHJpY3MuYmVhcmluZ195ID0gdG9wOwotICAgICAgICAgIG1ldHJpY3MuYWR2YW5jZSAgID0gYWR2YW5jZTsKLQotICAgICAgICAgIGVycm9yID0gaW5jci0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzKCBpbmNyLT5vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0cmljcyApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgICAgdG9wICAgICA9IG1ldHJpY3MuYmVhcmluZ195OwotICAgICAgICAgIGFkdmFuY2UgPSBtZXRyaWNzLmFkdmFuY2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogR1dXOiBEbyB2ZXJ0aWNhbCBtZXRyaWNzIGdldCBsb2FkZWQgaW5jcmVtZW50YWxseSB0b28/ICovCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICAgIGdseXBoLT5saW5lYXJWZXJ0QWR2YW5jZSA9IGFkdmFuY2U7Ci0KLSAgICAgIC8qIHNjYWxlIHRoZSBtZXRyaWNzICovCi0gICAgICBpZiAoICEoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSApCi0gICAgICB7Ci0gICAgICAgIHRvcCAgICAgPSBGVF9NdWxGaXgoIHRvcCwgeV9zY2FsZSApOwotICAgICAgICBhZHZhbmNlID0gRlRfTXVsRml4KCBhZHZhbmNlLCB5X3NjYWxlICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFhYWDogZm9yIG5vdywgd2UgaGF2ZSBubyBiZXR0ZXIgYWxnb3JpdGhtIGZvciB0aGUgbHNiLCBidXQgaXQgKi8KLSAgICAgIC8qICAgICAgc2hvdWxkIHdvcmsgZmluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRCZWFyaW5nWCA9ICggYmJveC54TWluIC0gYmJveC54TWF4ICkgLyAyOwotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEJlYXJpbmdZID0gdG9wOwotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEFkdmFuY2UgID0gYWR2YW5jZTsKLSAgICB9Ci0KLSAgICAvKiBhZGp1c3QgYWR2YW5jZSB3aWR0aCB0byB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBoZG14IHRhYmxlICovCi0gICAgaWYgKCAhZmFjZS0+cG9zdHNjcmlwdC5pc0ZpeGVkUGl0Y2ggJiYKLSAgICAgICAgIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgICAgICAgICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgd2lkdGhwOwotCi0KLSAgICAgIHdpZHRocCA9IHR0X2ZhY2VfZ2V0X2RldmljZV9tZXRyaWNzKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPnJvb3QubWV0cmljcy54X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXggKTsKLQotICAgICAgaWYgKCB3aWR0aHAgKQotICAgICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSA9ICp3aWR0aHAgPDwgNjsKLSAgICB9Ci0KLSAgICAvKiBzZXQgZ2x5cGggZGltZW5zaW9ucyAqLwotICAgIGdseXBoLT5tZXRyaWNzLndpZHRoICA9IGJib3gueE1heCAtIGJib3gueE1pbjsKLSAgICBnbHlwaC0+bWV0cmljcy5oZWlnaHQgPSBiYm94LnlNYXggLSBiYm94LnlNaW47Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF9zYml0X2ltYWdlKCBUVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgVFRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgICAgIGZhY2U7Ci0gICAgU0ZOVF9TZXJ2aWNlICAgICAgICBzZm50OwotICAgIEZUX1N0cmVhbSAgICAgICAgICAgc3RyZWFtOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7Ci0gICAgVFRfU0JpdF9NZXRyaWNzUmVjICBtZXRyaWNzOwotCi0KLSAgICBmYWNlICAgPSAoVFRfRmFjZSlnbHlwaC0+ZmFjZTsKLSAgICBzZm50ICAgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0gICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0KLSAgICBlcnJvciA9IHNmbnQtPmxvYWRfc2JpdF9pbWFnZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+c3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludClsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaC0+Yml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0cmljcyApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBnbHlwaC0+b3V0bGluZS5uX3BvaW50cyAgID0gMDsKLSAgICAgIGdseXBoLT5vdXRsaW5lLm5fY29udG91cnMgPSAwOwotCi0gICAgICBnbHlwaC0+bWV0cmljcy53aWR0aCAgPSAoRlRfUG9zKW1ldHJpY3Mud2lkdGggIDw8IDY7Ci0gICAgICBnbHlwaC0+bWV0cmljcy5oZWlnaHQgPSAoRlRfUG9zKW1ldHJpY3MuaGVpZ2h0IDw8IDY7Ci0KLSAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQmVhcmluZ1ggPDwgNjsKLSAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWSA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQmVhcmluZ1kgPDwgNjsKLSAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQWR2YW5jZSAgPDwgNjsKLQotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLnZlcnRCZWFyaW5nWCA8PCA2OwotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLnZlcnRCZWFyaW5nWSA8PCA2OwotICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLnZlcnRBZHZhbmNlICA8PCA2OwotCi0gICAgICBnbHlwaC0+Zm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKLSAgICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICAgIHsKLSAgICAgICAgZ2x5cGgtPmJpdG1hcF9sZWZ0ID0gbWV0cmljcy52ZXJ0QmVhcmluZ1g7Ci0gICAgICAgIGdseXBoLT5iaXRtYXBfdG9wICA9IG1ldHJpY3MudmVydEJlYXJpbmdZOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnbHlwaC0+Yml0bWFwX2xlZnQgPSBtZXRyaWNzLmhvcmlCZWFyaW5nWDsKLSAgICAgICAgZ2x5cGgtPmJpdG1hcF90b3AgID0gbWV0cmljcy5ob3JpQmVhcmluZ1k7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9sb2FkZXJfaW5pdCggVFRfTG9hZGVyICAgICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICBUVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICBUVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICkKLSAgewotICAgIFRUX0ZhY2UgICAgZmFjZTsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbTsKLQotCi0gICAgZmFjZSAgID0gKFRUX0ZhY2UpZ2x5cGgtPmZhY2U7Ci0gICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0KLSAgICBGVF9NRU1fWkVSTyggbG9hZGVyLCBzaXplb2YgKCBUVF9Mb2FkZXJSZWMgKSApOwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICAvKiBsb2FkIGV4ZWN1dGlvbiBjb250ZXh0ICovCi0gICAgaWYgKCBJU19ISU5URUQoIGxvYWRfZmxhZ3MgKSApCi0gICAgewotICAgICAgVFRfRXhlY0NvbnRleHQgIGV4ZWM7Ci0gICAgICBGVF9Cb29sICAgICAgICAgZ3JheXNjYWxlOwotCi0KLSAgICAgIGlmICggIXNpemUtPmN2dF9yZWFkeSApCi0gICAgICB7Ci0gICAgICAgIEZUX0Vycm9yICBlcnJvciA9IHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUoIHNpemUgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotCi0gICAgICAvKiBxdWVyeSBuZXcgZXhlY3V0aW9uIGNvbnRleHQgKi8KLSAgICAgIGV4ZWMgPSBzaXplLT5kZWJ1ZyA/IHNpemUtPmNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICA6ICggKFRUX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZmFjZSApICktPmNvbnRleHQ7Ci0gICAgICBpZiAoICFleGVjICkKLSAgICAgICAgcmV0dXJuIFRUX0Vycl9Db3VsZF9Ob3RfRmluZF9Db250ZXh0OwotCi0gICAgICBncmF5c2NhbGUgPQotICAgICAgICBGVF9CT09MKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0gRlRfUkVOREVSX01PREVfTU9OTyApOwotCi0gICAgICBUVF9Mb2FkX0NvbnRleHQoIGV4ZWMsIGZhY2UsIHNpemUgKTsKLQotICAgICAgLyogYSBjaGFuZ2UgZnJvbSBtb25vIHRvIGdyYXlzY2FsZSByZW5kZXJpbmcgKGFuZCB2aWNlIHZlcnNhKSAqLwotICAgICAgLyogcmVxdWlyZXMgYSByZS1leGVjdXRpb24gb2YgdGhlIENWVCBwcm9ncmFtICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBncmF5c2NhbGUgIT0gZXhlYy0+Z3JheXNjYWxlICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICAgIGV4ZWMtPmdyYXlzY2FsZSA9IGdyYXlzY2FsZTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHNpemUtPmN2dF9zaXplOyBpKysgKQotICAgICAgICAgIHNpemUtPmN2dFtpXSA9IEZUX011bEZpeCggZmFjZS0+Y3Z0W2ldLCBzaXplLT50dG1ldHJpY3Muc2NhbGUgKTsKLSAgICAgICAgdHRfc2l6ZV9ydW5fcHJlcCggc2l6ZSApOwotICAgICAgfQotCi0gICAgICAvKiBzZWUgd2hldGhlciB0aGUgY3Z0IHByb2dyYW0gaGFzIGRpc2FibGVkIGhpbnRpbmcgKi8KLSAgICAgIGlmICggZXhlYy0+R1MuaW5zdHJ1Y3RfY29udHJvbCAmIDEgKQotICAgICAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fSElOVElORzsKLQotICAgICAgLyogbG9hZCBkZWZhdWx0IGdyYXBoaWNzIHN0YXRlIC0tIGlmIG5lZWRlZCAqLwotICAgICAgaWYgKCBleGVjLT5HUy5pbnN0cnVjdF9jb250cm9sICYgMiApCi0gICAgICAgIGV4ZWMtPkdTID0gdHRfZGVmYXVsdF9ncmFwaGljc19zdGF0ZTsKLQotICAgICAgZXhlYy0+cGVkYW50aWNfaGludGluZyA9IEZUX0JPT0woIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1BFREFOVElDICk7Ci0gICAgICBsb2FkZXItPmV4ZWMgPSBleGVjOwotICAgICAgbG9hZGVyLT5pbnN0cnVjdGlvbnMgPSBleGVjLT5nbHlwaEluczsKLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgIC8qIHNlZWsgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2x5cGggdGFibGUgLS0gZm9yIFR5cGUgNDIgZm9udHMgICAgICovCi0gICAgLyogdGhlIHRhYmxlIG1pZ2h0IGJlIGFjY2Vzc2VkIGZyb20gYSBQb3N0c2NyaXB0IHN0cmVhbSBvciBzb21ldGhpbmcgKi8KLSAgICAvKiBlbHNlLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgICAgbG9hZGVyLT5nbHlmX29mZnNldCA9IDA7Ci0gICAgZWxzZQotCi0jZW5kaWYKLQotICAgIHsKLSAgICAgIEZUX0Vycm9yICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZ2x5Ziwgc3RyZWFtLCAwICk7Ci0KLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIlRUX0xvYWRfR2x5cGg6IGNvdWxkIG5vdCBhY2Nlc3MgZ2x5cGggdGFibGVcbiIgKSk7Ci0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIH0KLSAgICAgIGxvYWRlci0+Z2x5Zl9vZmZzZXQgPSBGVF9TVFJFQU1fUE9TKCk7Ci0gICAgfQotCi0gICAgLyogZ2V0IGZhY2UncyBnbHlwaCBsb2FkZXIgKi8KLSAgICB7Ci0gICAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciA9IGdseXBoLT5pbnRlcm5hbC0+bG9hZGVyOwotCi0KLSAgICAgIEZUX0dseXBoTG9hZGVyX1Jld2luZCggZ2xvYWRlciApOwotICAgICAgbG9hZGVyLT5nbG9hZGVyID0gZ2xvYWRlcjsKLSAgICB9Ci0KLSAgICBsb2FkZXItPmxvYWRfZmxhZ3MgICAgPSBsb2FkX2ZsYWdzOwotCi0gICAgbG9hZGVyLT5mYWNlICAgPSAoRlRfRmFjZSlmYWNlOwotICAgIGxvYWRlci0+c2l6ZSAgID0gKEZUX1NpemUpc2l6ZTsKLSAgICBsb2FkZXItPmdseXBoICA9IChGVF9HbHlwaFNsb3QpZ2x5cGg7Ci0gICAgbG9hZGVyLT5zdHJlYW0gPSBzdHJlYW07Ci0KLSAgICByZXR1cm4gVFRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gbG9hZCBhIHNpbmdsZSBnbHlwaCB3aXRoaW4gYSBnaXZlbiBnbHlwaCBzbG90LCAgKi8KLSAgLyogICAgZm9yIGEgZ2l2ZW4gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggICAgICAgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgc2xvdCBvYmplY3Qgd2hlcmUgdGhlIGdseXBoICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIHNpemUgYXQgd2hpY2ggdGhlIGdseXBoICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG11c3QgYmUgc2NhbGVkL2xvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCBpbiB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgRlRfTE9BRF9YWFggY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfTG9hZF9HbHlwaCggVFRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICBUVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICBmYWNlOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgVFRfTG9hZGVyUmVjICBsb2FkZXI7Ci0KLQotICAgIGZhY2UgICA9IChUVF9GYWNlKWdseXBoLT5mYWNlOwotICAgIGVycm9yICA9IFRUX0Vycl9PazsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0gICAgLyogdHJ5IHRvIGxvYWQgZW1iZWRkZWQgYml0bWFwIGlmIGFueSAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFhYWDogVGhlIGNvbnZlbnRpb24gc2hvdWxkIGJlIGVtcGhhc2l6ZWQgaW4gICAgICovCi0gICAgLyogICAgICB0aGUgZG9jdW1lbnRzIGJlY2F1c2UgaXQgY2FuIGJlIGNvbmZ1c2luZy4gKi8KLSAgICBpZiAoIHNpemUtPnN0cmlrZV9pbmRleCAhPSAweEZGRkZGRkZGVUwgICAgICAmJgotICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19CSVRNQVAgKSA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGxvYWRfc2JpdF9pbWFnZSggc2l6ZSwgZ2x5cGgsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHJldHVybiBUVF9FcnJfT2s7Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLSAgICAvKiBpZiBGVF9MT0FEX05PX1NDQUxFIGlzIG5vdCBzZXQsIGB0dG1ldHJpY3MnIG11c3QgYmUgdmFsaWQgKi8KLSAgICBpZiAoICEoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgJiYgIXNpemUtPnR0bWV0cmljcy52YWxpZCApCi0gICAgICByZXR1cm4gVFRfRXJyX0ludmFsaWRfU2l6ZV9IYW5kbGU7Ci0KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1NCSVRTX09OTFkgKQotICAgICAgcmV0dXJuIFRUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotCi0gICAgZXJyb3IgPSB0dF9sb2FkZXJfaW5pdCggJmxvYWRlciwgc2l6ZSwgZ2x5cGgsIGxvYWRfZmxhZ3MgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGdseXBoLT5mb3JtYXQgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX09VVExJTkU7Ci0gICAgZ2x5cGgtPm51bV9zdWJnbHlwaHMgPSAwOwotICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzID0gMDsKLQotICAgIC8qIG1haW4gbG9hZGluZyBsb29wICovCi0gICAgZXJyb3IgPSBsb2FkX3RydWV0eXBlX2dseXBoKCAmbG9hZGVyLCBnbHlwaF9pbmRleCwgMCApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBpZiAoIGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSApCi0gICAgICB7Ci0gICAgICAgIGdseXBoLT5udW1fc3ViZ2x5cGhzID0gbG9hZGVyLmdsb2FkZXItPmJhc2UubnVtX3N1YmdseXBoczsKLSAgICAgICAgZ2x5cGgtPnN1YmdseXBocyAgICAgPSBsb2FkZXIuZ2xvYWRlci0+YmFzZS5zdWJnbHlwaHM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdseXBoLT5vdXRsaW5lICAgICAgICA9IGxvYWRlci5nbG9hZGVyLT5iYXNlLm91dGxpbmU7Ci0gICAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzICY9IH5GVF9PVVRMSU5FX1NJTkdMRV9QQVNTOwotCi0gICAgICAgIC8qIEluIGNhc2UgYml0IDEgb2YgdGhlIGBmbGFncycgZmllbGQgaW4gdGhlIGBoZWFkJyB0YWJsZSBpc24ndCAqLwotICAgICAgICAvKiBzZXQsIHRyYW5zbGF0ZSBhcnJheSBzbyB0aGF0ICgwLDApIGlzIHRoZSBnbHlwaCdzIG9yaWdpbi4gICAgKi8KLSAgICAgICAgaWYgKCAoIGZhY2UtPmhlYWRlci5GbGFncyAmIDIgKSA9PSAwICYmIGxvYWRlci5wcDEueCApCi0gICAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZnbHlwaC0+b3V0bGluZSwgLWxvYWRlci5wcDEueCwgMCApOwotICAgICAgfQotCi0gICAgICBjb21wdXRlX2dseXBoX21ldHJpY3MoICZsb2FkZXIsIGdseXBoX2luZGV4ICk7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBgaGlnaCBwcmVjaXNpb24nIGJpdCBmbGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhpcyBpcyBfY3JpdGljYWxfIHRvIGdldCBjb3JyZWN0IG91dHB1dCBmb3IgbW9ub2Nocm9tZSAgICAgICovCi0gICAgLyogVHJ1ZVR5cGUgZ2x5cGhzIGF0IGFsbCBzaXplcyB1c2luZyB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApICYmCi0gICAgICAgICBzaXplLT5yb290Lm1ldHJpY3MueV9wcGVtIDwgMjQgICAgICkKLSAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzIHw9IEZUX09VVExJTkVfSElHSF9QUkVDSVNJT047Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGdsb2FkLmggYi9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTNiYjE0Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dGdsb2FkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGdsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgR2x5cGggTG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVEdMT0FEX0hfXwotI2RlZmluZSBfX1RUR0xPQURfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRvYmpzLmgiCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSNpbmNsdWRlICJ0dGludGVycC5oIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFRUX0luaXRfR2x5cGhfTG9hZGluZyggVFRfRmFjZSAgZmFjZSApOwotCi0gIEZUX0xPQ0FMKHZvaWQpCi0gIFRUX0dldF9ITWV0cmljcyggVFRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgY2hlY2ssCi0gICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICAgbHNiLAotICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIGF3ICk7Ci0KLSAgRlRfTE9DQUwodm9pZCkKLSAgVFRfR2V0X1ZNZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBjaGVjaywKLSAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICB0c2IsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgYWggKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0dseXBoKCBUVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIFRUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRHTE9BRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGd4dmFyLmMgYi9zcmMvdHJ1ZXR5cGUvdHRneHZhci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjNhZGJjLi4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dGd4dmFyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Z3h2YXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBHWCBGb250IFZhcmlhdGlvbiBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcsIGFuZCBHZW9yZ2UgV2lsbGlhbXMuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBBcHBsZSBkb2N1bWVudHMgdGhlIGBmdmFyJywgYGd2YXInLCBgY3ZhcicsIGFuZCBgYXZhcicgdGFibGVzIGF0ICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVFRSZWZNYW4vUk0wNi9DaGFwNltmZ2NhXXZhci5odG1sICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGRvY3VtZW50YXRpb24gZm9yIGBmdmFyJyBpcyBpbmNvbnNpc3RlbnQuICBBdCBvbmUgcG9pbnQgaXQgc2F5cyAgICAgKi8KLS8qIHRoYXQgYGNvdW50U2l6ZVBhaXJzJyBzaG91bGQgYmUgMywgYXQgYW5vdGhlciBwb2ludCAyLiAgSXQgc2hvdWxkIGJlIDIuICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGRvY3VtZW50YXRpb24gZm9yIGBndmFyJyBpcyBub3QgaW50ZWxsaWdpYmxlOyBgY3ZhcicgcmVmZXJzIHlvdSB0byAgKi8KLS8qIGBndmFyJyBhbmQgaXMgdGh1cyBhbHNvIGluY29tcHJlaGVuc2libGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGRvY3VtZW50YXRpb24gZm9yIGBhdmFyJyBhcHBlYXJzIGNvcnJlY3QsIGJ1dCBBcHBsZSBoYXMgbm8gZm9udHMgICAgKi8KLS8qIHdpdGggYW4gYGF2YXInIHRhYmxlLCBzbyBpdCBpcyBoYXJkIHRvIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTWFueSB0aGFua3MgdG8gSm9obiBKZW5raW5zIChhdCBBcHBsZSkgaW4gZmlndXJpbmcgdGhpcyBvdXQuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQXBwbGUncyBga2VybicgdGFibGUgaGFzIHNvbWUgcmVmZXJlbmNlcyB0byB0dXBsZSBpbmRpY2VzLCBidXQgYXMgdGhlcmUgKi8KLS8qIGlzIG5vIGluZGljYXRpb24gd2hlcmUgdGhlc2UgaW5kaWNlcyBhcmUgZGVmaW5lZCwgbm9yIGhvdyB0byAgICAgICAgICAgICovCi0vKiBpbnRlcnBvbGF0ZSB0aGUga2VybmluZyB2YWx1ZXMgKGRpZmZlcmVudCB0dXBsZXMgaGF2ZSBkaWZmZXJlbnQgICAgICAgICAqLwotLyogY2xhc3NlcykgdGhpcyBpc3N1ZSBpcyBpZ25vcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLQotI2luY2x1ZGUgInR0ZHJpdmVyLmgiCi0jaW5jbHVkZSAidHRwbG9hZC5oIgotI2luY2x1ZGUgInR0Z3h2YXIuaCIKLQotI2luY2x1ZGUgInR0ZXJyb3JzLmgiCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotCi0jZGVmaW5lIEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICkgIFwKLSAgICAgICAgICAoIChzdHJlYW0pLT5jdXJzb3IgLSAoc3RyZWFtKS0+YmFzZSApCi0jZGVmaW5lIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIG9mZiApIFwKLSAgICAgICAgICAgICAgKCAoc3RyZWFtKS0+Y3Vyc29yID0gKHN0cmVhbSktPmJhc2UrKG9mZikgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRneHZhcgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCBSb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBBTExfUE9JTlRTIGlzIHVzZWQgaW4gYGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzJy4gIEl0ICAgICAgICAqLwotICAvKiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGRlbHRhIGZvciBldmVyeSBwb2ludCB3aXRob3V0IG5lZWRpbmcgdG8gICAgKi8KLSAgLyogZW51bWVyYXRlIGFsbCBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBTExfUE9JTlRTICAoRlRfVVNob3J0KikoIC0xICkKLQotCi0gIGVudW0KLSAgewotICAgIEdYX1BUX1BPSU5UU19BUkVfV09SRFMgICAgID0gMHg4MCwKLSAgICBHWF9QVF9QT0lOVF9SVU5fQ09VTlRfTUFTSyA9IDB4N0YKLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWQgYSBzZXQgb2YgcG9pbnRzIHRvIHdoaWNoIHRoZSBmb2xsb3dpbmcgZGVsdGFzIHdpbGwgYXBwbHkuICAgICAqLwotICAvKiAgICBQb2ludHMgYXJlIHBhY2tlZCB3aXRoIGEgcnVuIGxlbmd0aCBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgOjogVGhlIGRhdGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludF9jbnQgOjogVGhlIG51bWJlciBvZiBwb2ludHMgcmVhZC4gIEEgemVybyB2YWx1ZSBtZWFucyB0aGF0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGFsbCBwb2ludHMgaW4gdGhlIGdseXBoIHdpbGwgYmUgYWZmZWN0ZWQsIHdpdGhvdXQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBlbnVtZXJhdGluZyB0aGVtIGluZGl2aWR1YWxseS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGFycmF5IG9mIEZUX1VTaG9ydCBjb250YWluaW5nIHRoZSBhZmZlY3RlZCBwb2ludHMgb3IgdGhlICAgICAgICAqLwotICAvKiAgICBzcGVjaWFsIHZhbHVlIEFMTF9QT0lOVFMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9VU2hvcnQqCi0gIGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqcG9pbnRfY250ICkKLSAgewotICAgIEZUX1VTaG9ydCAqcG9pbnRzOwotICAgIEZUX0ludCAgICAgbjsKLSAgICBGVF9JbnQgICAgIHJ1bmNudDsKLSAgICBGVF9JbnQgICAgIGk7Ci0gICAgRlRfSW50ICAgICBqOwotICAgIEZUX0ludCAgICAgZmlyc3Q7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yID0gVFRfRXJyX09rOwotCi0gICAgRlRfVU5VU0VEKCBlcnJvciApOwotCi0KLSAgICAqcG9pbnRfY250ID0gbiA9IEZUX0dFVF9CWVRFKCk7Ci0gICAgaWYgKCBuID09IDAgKQotICAgICAgcmV0dXJuIEFMTF9QT0lOVFM7Ci0KLSAgICBpZiAoIG4gJiBHWF9QVF9QT0lOVFNfQVJFX1dPUkRTICkKLSAgICAgIG4gPSBGVF9HRVRfQllURSgpIHwgKCAoIG4gJiBHWF9QVF9QT0lOVF9SVU5fQ09VTlRfTUFTSyApIDw8IDggKTsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBwb2ludHMsIG4gKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGkgPSAwOwotICAgIHdoaWxlICggaSA8IG4gKQotICAgIHsKLSAgICAgIHJ1bmNudCA9IEZUX0dFVF9CWVRFKCk7Ci0gICAgICBpZiAoIHJ1bmNudCAmIEdYX1BUX1BPSU5UU19BUkVfV09SRFMgKQotICAgICAgewotICAgICAgICBydW5jbnQgPSBydW5jbnQgJiBHWF9QVF9QT0lOVF9SVU5fQ09VTlRfTUFTSzsKLSAgICAgICAgZmlyc3QgID0gcG9pbnRzW2krK10gPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgICAgLyogZmlyc3QgcG9pbnQgbm90IGluY2x1ZGVkIGluIHJ1bmNvdW50ICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgcnVuY250OyArK2ogKQotICAgICAgICAgIHBvaW50c1tpKytdID0gKEZUX1VTaG9ydCkoIGZpcnN0ICs9IEZUX0dFVF9VU0hPUlQoKSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmaXJzdCA9IHBvaW50c1tpKytdID0gRlRfR0VUX0JZVEUoKTsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHJ1bmNudDsgKytqICkKLSAgICAgICAgICBwb2ludHNbaSsrXSA9IChGVF9VU2hvcnQpKCBmaXJzdCArPSBGVF9HRVRfQllURSgpICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHBvaW50czsKLSAgfQotCi0KLSAgZW51bQotICB7Ci0gICAgR1hfRFRfREVMVEFTX0FSRV9aRVJPICAgICAgPSAweDgwLAotICAgIEdYX0RUX0RFTFRBU19BUkVfV09SRFMgICAgID0gMHg0MCwKLSAgICBHWF9EVF9ERUxUQV9SVU5fQ09VTlRfTUFTSyA9IDB4M0YKLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWQgYSBzZXQgb2YgZGVsdGFzLiAgVGhlc2UgYXJlIHBhY2tlZCBzbGlnaHRseSBkaWZmZXJlbnRseSB0aGFuICAqLwotICAvKiAgICBwb2ludHMuICBJbiBwYXJ0aWN1bGFyIHRoZXJlIGlzIG5vIG92ZXJhbGwgY291bnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgOjogVGhlIGRhdGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhX2NudCA6OiBUaGUgbnVtYmVyIG9mIHRvIGJlIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGFycmF5IG9mIEZUX1Nob3J0IGNvbnRhaW5pbmcgdGhlIGRlbHRhcyBmb3IgdGhlIGFmZmVjdGVkICAgICAgICAqLwotICAvKiAgICBwb2ludHMuICAoVGhpcyBvbmx5IGdldHMgdGhlIGRlbHRhcyBmb3Igb25lIGRpbWVuc2lvbi4gIEl0IHdpbGwgICAgKi8KLSAgLyogICAgZ2VuZXJhbGx5IGJlIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgeCwgb25jZSBmb3IgeS4gIFdoZW4gdXNlZCBpbiAgICovCi0gIC8qICAgIGN2dCB0YWJsZSwgaXQgd2lsbCBvbmx5IGJlIGNhbGxlZCBvbmNlLikgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX1Nob3J0KgotICBmdF92YXJfcmVhZHBhY2tlZGRlbHRhcyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRlbHRhX2NudCApCi0gIHsKLSAgICBGVF9TaG9ydCAgKmRlbHRhczsKLSAgICBGVF9JbnQgICAgIHJ1bmNudDsKLSAgICBGVF9JbnQgICAgIGk7Ci0gICAgRlRfSW50ICAgICBqOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IFRUX0Vycl9PazsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGRlbHRhcywgZGVsdGFfY250ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpID0gMDsKLSAgICB3aGlsZSAoIGkgPCBkZWx0YV9jbnQgKQotICAgIHsKLSAgICAgIHJ1bmNudCA9IEZUX0dFVF9CWVRFKCk7Ci0gICAgICBpZiAoIHJ1bmNudCAmIEdYX0RUX0RFTFRBU19BUkVfWkVSTyApCi0gICAgICB7Ci0gICAgICAgIC8qIHJ1bmNudCB6ZXJvZXMgZ2V0IGFkZGVkICovCi0gICAgICAgIGZvciAoIGogPSAwOwotICAgICAgICAgICAgICBqIDw9ICggcnVuY250ICYgR1hfRFRfREVMVEFfUlVOX0NPVU5UX01BU0sgKSAmJiBpIDwgZGVsdGFfY250OwotICAgICAgICAgICAgICArK2ogKQotICAgICAgICAgIGRlbHRhc1tpKytdID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBydW5jbnQgJiBHWF9EVF9ERUxUQVNfQVJFX1dPUkRTICkKLSAgICAgIHsKLSAgICAgICAgLyogcnVuY250IHNob3J0cyBmcm9tIHRoZSBzdGFjayAqLwotICAgICAgICBmb3IgKCBqID0gMDsKLSAgICAgICAgICAgICAgaiA8PSAoIHJ1bmNudCAmIEdYX0RUX0RFTFRBX1JVTl9DT1VOVF9NQVNLICkgJiYgaSA8IGRlbHRhX2NudDsKLSAgICAgICAgICAgICAgKytqICkKLSAgICAgICAgICBkZWx0YXNbaSsrXSA9IEZUX0dFVF9TSE9SVCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBydW5jbnQgc2lnbmVkIGJ5dGVzIGZyb20gdGhlIHN0YWNrICovCi0gICAgICAgIGZvciAoIGogPSAwOwotICAgICAgICAgICAgICBqIDw9ICggcnVuY250ICYgR1hfRFRfREVMVEFfUlVOX0NPVU5UX01BU0sgKSAmJiBpIDwgZGVsdGFfY250OwotICAgICAgICAgICAgICArK2ogKQotICAgICAgICAgIGRlbHRhc1tpKytdID0gRlRfR0VUX0NIQVIoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBqIDw9ICggcnVuY250ICYgR1hfRFRfREVMVEFfUlVOX0NPVU5UX01BU0sgKSApCi0gICAgICB7Ci0gICAgICAgIC8qIEJhZCBmb3JtYXQgKi8KLSAgICAgICAgRlRfRlJFRSggZGVsdGFzICk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkZWx0YXM7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3Zhcl9sb2FkX2F2YXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlIHRoZSBgYXZhcicgdGFibGUgaWYgcHJlc2VudC4gIEl0IG5lZWQgbm90IGJlLCBzbyB3ZSByZXR1cm4gICAqLwotICAvKiAgICBub3RoaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IFRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3Zhcl9sb2FkX2F2YXIoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbSA9IEZUX0ZBQ0VfU1RSRUFNKGZhY2UpOwotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBHWF9CbGVuZCAgICAgICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0gICAgR1hfQVZhclNlZ21lbnQgIHNlZ21lbnQ7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yID0gVFRfRXJyX09rOwotICAgIEZUX1VMb25nICAgICAgICB2ZXJzaW9uOwotICAgIEZUX0xvbmcgICAgICAgICBheGlzQ291bnQ7Ci0gICAgRlRfSW50ICAgICAgICAgIGksIGo7Ci0gICAgRlRfVUxvbmcgICAgICAgIHRhYmxlX2xlbjsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgYmxlbmQtPmF2YXJfY2hlY2tlZCA9IFRSVUU7Ci0gICAgaWYgKCAoZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2F2YXIsIHN0cmVhbSwgJnRhYmxlX2xlbiApKSAhPSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIHRhYmxlX2xlbiApICkKLSAgICAgIHJldHVybjsKLQotICAgIHZlcnNpb24gICA9IEZUX0dFVF9MT05HKCk7Ci0gICAgYXhpc0NvdW50ID0gRlRfR0VUX0xPTkcoKTsKLQotICAgIGlmICggdmVyc2lvbiAhPSAweDAwMDEwMDAwTCAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGF4aXNDb3VudCAhPSAoRlRfTG9uZylibGVuZC0+bW12YXItPm51bV9heGlzICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+YXZhcl9zZWdtZW50LCBheGlzQ291bnQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzZWdtZW50ID0gJmJsZW5kLT5hdmFyX3NlZ21lbnRbMF07Ci0gICAgZm9yICggaSA9IDA7IGkgPCBheGlzQ291bnQ7ICsraSwgKytzZWdtZW50ICkKLSAgICB7Ci0gICAgICBzZWdtZW50LT5wYWlyQ291bnQgPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggc2VnbWVudC0+Y29ycmVzcG9uZGVuY2UsIHNlZ21lbnQtPnBhaXJDb3VudCApICkKLSAgICAgIHsKLSAgICAgICAgLyogRmFpbHVyZS4gIEZyZWUgZXZlcnl0aGluZyB3ZSBoYXZlIGRvbmUgc28gZmFyLiAgV2UgbXVzdCBkbyAqLwotICAgICAgICAvKiBpdCByaWdodCBub3cgc2luY2UgbG9hZGluZyB0aGUgYGF2YXInIHRhYmxlIGlzIG9wdGlvbmFsLiAgICovCi0KLSAgICAgICAgZm9yICggaiA9IGkgLSAxOyBqID49IDA7IC0taiApCi0gICAgICAgICAgRlRfRlJFRSggYmxlbmQtPmF2YXJfc2VnbWVudFtqXS5jb3JyZXNwb25kZW5jZSApOwotCi0gICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5hdmFyX3NlZ21lbnQgKTsKLSAgICAgICAgYmxlbmQtPmF2YXJfc2VnbWVudCA9IE5VTEw7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgZm9yICggaiA9IDA7IGogPCBzZWdtZW50LT5wYWlyQ291bnQ7ICsraiApCi0gICAgICB7Ci0gICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCA9Ci0gICAgICAgICAgRlRfR0VUX1NIT1JUKCkgPDwgMjsgICAgLyogY29udmVydCB0byBGaXhlZCAqLwotICAgICAgICBzZWdtZW50LT5jb3JyZXNwb25kZW5jZVtqXS50b0Nvb3JkID0KLSAgICAgICAgICBGVF9HRVRfU0hPUlQoKTw8MjsgICAgLyogY29udmVydCB0byBGaXhlZCAqLwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgfQotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0dWYXJfSGVhZF8KLSAgewotICAgIEZUX0xvbmcgICAgdmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgIGF4aXNDb3VudDsKLSAgICBGVF9VU2hvcnQgIGdsb2JhbENvb3JkQ291bnQ7Ci0gICAgRlRfVUxvbmcgICBvZmZzZXRUb0Nvb3JkOwotICAgIEZUX1VTaG9ydCAgZ2x5cGhDb3VudDsKLSAgICBGVF9VU2hvcnQgIGZsYWdzOwotICAgIEZUX1VMb25nICAgb2Zmc2V0VG9EYXRhOwotCi0gIH0gR1hfR1Zhcl9IZWFkOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX2xvYWRfZ3ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2VzIHRoZSBgZ3ZhcicgdGFibGUgaWYgcHJlc2VudC4gIElmIGBmdmFyJyBpcyB0aGVyZSwgYGd2YXInICAgICovCi0gIC8qICAgIGhhZCBiZXR0ZXIgYmUgdGhlcmUgdG9vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogVGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Zhcl9sb2FkX2d2YXIoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICAgICBzdHJlYW0gPSBGVF9GQUNFX1NUUkVBTShmYWNlKTsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEdYX0JsZW5kICAgICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBGVF9VSW50ICAgICAgIGksIGo7Ci0gICAgRlRfVUxvbmcgICAgICB0YWJsZV9sZW47Ci0gICAgRlRfVUxvbmcgICAgICBndmFyX3N0YXJ0OwotICAgIEZUX1VMb25nICAgICAgb2Zmc2V0VG9EYXRhOwotICAgIEdYX0dWYXJfSGVhZCAgZ3Zhcl9oZWFkOwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBndmFyX2ZpZWxkc1tdID0KLSAgICB7Ci0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgR1hfR1Zhcl9IZWFkCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCAyMCApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIHZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBheGlzQ291bnQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBnbG9iYWxDb29yZENvdW50ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggb2Zmc2V0VG9Db29yZCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGdseXBoQ291bnQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBmbGFncyApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG9mZnNldFRvRGF0YSApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIGlmICggKGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19ndmFyLCBzdHJlYW0sICZ0YWJsZV9sZW4gKSkgIT0gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBndmFyX3N0YXJ0ID0gRlRfU1RSRUFNX1BPUyggKTsKLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggZ3Zhcl9maWVsZHMsICZndmFyX2hlYWQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBibGVuZC0+dHVwbGVjb3VudCAgPSBndmFyX2hlYWQuZ2xvYmFsQ29vcmRDb3VudDsKLSAgICBibGVuZC0+Z3ZfZ2x5cGhjbnQgPSBndmFyX2hlYWQuZ2x5cGhDb3VudDsKLSAgICBvZmZzZXRUb0RhdGEgICAgICAgPSBndmFyX3N0YXJ0ICsgZ3Zhcl9oZWFkLm9mZnNldFRvRGF0YTsKLQotICAgIGlmICggZ3Zhcl9oZWFkLnZlcnNpb24gICAhPSAoRlRfTG9uZykweDAwMDEwMDAwTCAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGd2YXJfaGVhZC5heGlzQ291bnQgIT0gKEZUX1VTaG9ydClibGVuZC0+bW12YXItPm51bV9heGlzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFRUX0Vycl9JbnZhbGlkX1RhYmxlOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+Z2x5cGhvZmZzZXRzLCBibGVuZC0+Z3ZfZ2x5cGhjbnQgKyAxICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBndmFyX2hlYWQuZmxhZ3MgJiAxICkKLSAgICB7Ci0gICAgICAvKiBsb25nIG9mZnNldHMgKG9uZSBtb3JlIG9mZnNldCB0aGFuIGdseXBocywgdG8gbWFyayBzaXplIG9mIGxhc3QpICovCi0gICAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCAoIGJsZW5kLT5ndl9nbHlwaGNudCArIDEgKSAqIDRMICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDw9IGJsZW5kLT5ndl9nbHlwaGNudDsgKytpICkKLSAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tpXSA9IG9mZnNldFRvRGF0YSArIEZUX0dFVF9MT05HKCk7Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHNob3J0IG9mZnNldHMgKG9uZSBtb3JlIG9mZnNldCB0aGFuIGdseXBocywgdG8gbWFyayBzaXplIG9mIGxhc3QpICovCi0gICAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCAoIGJsZW5kLT5ndl9nbHlwaGNudCArIDEgKSAqIDJMICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDw9IGJsZW5kLT5ndl9nbHlwaGNudDsgKytpICkKLSAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tpXSA9IG9mZnNldFRvRGF0YSArIEZUX0dFVF9VU0hPUlQoKSAqIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBVbmRvY3VtZW50ZWQ6IGAqMichICovCi0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgICBpZiAoIGJsZW5kLT50dXBsZWNvdW50ICE9IDAgKQotICAgIHsKLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+dHVwbGVjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3Zhcl9oZWFkLmF4aXNDb3VudCAqIGJsZW5kLT50dXBsZWNvdW50ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGd2YXJfc3RhcnQgKyBndmFyX2hlYWQub2Zmc2V0VG9Db29yZCApICAgICAgIHx8Ci0gICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBibGVuZC0+dHVwbGVjb3VudCAqIGd2YXJfaGVhZC5heGlzQ291bnQgKiAyTCApICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IGJsZW5kLT50dXBsZWNvdW50OyArK2kgKQotICAgICAgICBmb3IgKCBqID0gMCA7IGogPCAoRlRfVUludClndmFyX2hlYWQuYXhpc0NvdW50OyArK2ogKQotICAgICAgICAgIGJsZW5kLT50dXBsZWNvb3Jkc1tpICogZ3Zhcl9oZWFkLmF4aXNDb3VudCArIGpdID0KLSAgICAgICAgICAgIEZUX0dFVF9TSE9SVCgpIDw8IDI7ICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gRlRfRml4ZWQgKi8KLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX2FwcGx5X3R1cGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmlndXJlIG91dCB3aGV0aGVyIGEgZ2l2ZW4gdHVwbGUgKGRlc2lnbikgYXBwbGllcyB0byB0aGUgY3VycmVudCAgICovCi0gIC8qICAgIGJsZW5kLCBhbmQgaWYgc28sIHdoYXQgaXMgdGhlIHNjYWxpbmcgZmFjdG9yLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsZW5kICAgICAgICAgICA6OiBUaGUgY3VycmVudCBibGVuZCBvZiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHVwbGVJbmRleCAgICAgIDo6IEEgZmxhZyBzYXlpbmcgd2hldGhlciB0aGlzIGlzIGFuIGludGVybWVkaWF0ZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICB0dXBsZSBvciBub3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHVwbGVfY29vcmRzICAgIDo6IFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdHVwbGUgaW4gbm9ybWFsaXplZCBheGlzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1fc3RhcnRfY29vcmRzIDo6IFRoZSBpbml0aWFsIGNvb3JkaW5hdGVzIHdoZXJlIHRoaXMgdHVwbGUgc3RhcnRzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICB0byBhcHBseSAoZm9yIGludGVybWVkaWF0ZSBjb29yZGluYXRlcykuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1fZW5kX2Nvb3JkcyAgIDo6IFRoZSBmaW5hbCBjb29yZGluYXRlcyBhZnRlciB3aGljaCB0aGlzIHR1cGxlIG5vICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBsb25nZXIgYXBwbGllcyAoZm9yIGludGVybWVkaWF0ZSBjb29yZGluYXRlcykuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEZUX0ZpeGVkIHZhbHVlIGNvbnRhaW5pbmcgdGhlIHNjYWxpbmcgZmFjdG9yLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGZ0X3Zhcl9hcHBseV90dXBsZSggR1hfQmxlbmQgICBibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgIHR1cGxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB0dXBsZV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBpbV9zdGFydF9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBpbV9lbmRfY29vcmRzICkKLSAgewotICAgIEZUX1VJbnQgICBpOwotICAgIEZUX0ZpeGVkICBhcHBseTsKLSAgICBGVF9GaXhlZCAgdGVtcDsKLQotCi0gICAgYXBwbHkgPSAweDEwMDAwTDsKLSAgICBmb3IgKCBpID0gMDsgaSA8IGJsZW5kLT5udW1fYXhpczsgKytpICkKLSAgICB7Ci0gICAgICBpZiAoIHR1cGxlX2Nvb3Jkc1tpXSA9PSAwICkKLSAgICAgICAgLyogSXQncyBub3QgY2xlYXIgd2h5IChmb3IgaW50ZXJtZWRpYXRlIHR1cGxlcykgd2UgZG9uJ3QgbmVlZCAgICAgKi8KLSAgICAgICAgLyogdG8gY2hlY2sgYWdhaW5zdCBzdGFydC9lbmQgLS0gdGhlIGRvY3VtZW50YXRpb24gc2F5cyB3ZSBkb24ndC4gKi8KLSAgICAgICAgLyogU2ltaWxhcmx5LCBpdCdzIHVuY2xlYXIgd2h5IHdlIGRvbid0IG5lZWQgdG8gc2NhbGUgYWxvbmcgdGhlICAgKi8KLSAgICAgICAgLyogYXhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGVsc2UgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldIDwgMCAmJiB0dXBsZV9jb29yZHNbaV0gPiAwICkgfHwKLSAgICAgICAgICAgICAgICAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID4gMCAmJiB0dXBsZV9jb29yZHNbaV0gPCAwICkgKQotICAgICAgewotICAgICAgICBhcHBseSA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmICggISggdHVwbGVJbmRleCAmIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSApICkKLSAgICAgICAgLyogbm90IGFuIGludGVybWVkaWF0ZSB0dXBsZSAqLwotICAgICAgICBhcHBseSA9IEZUX011bERpdiggYXBwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA+IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC1ibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDBMICk7Ci0KLSAgICAgIGVsc2UgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA8PSBpbV9zdGFydF9jb29yZHNbaV0gfHwKLSAgICAgICAgICAgICAgICBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA+PSBpbV9lbmRfY29vcmRzW2ldICAgKQotICAgICAgewotICAgICAgICBhcHBseSA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCB0dXBsZV9jb29yZHNbaV0gKQotICAgICAgewotICAgICAgICB0ZW1wID0gRlRfTXVsRGl2KCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAtIGltX3N0YXJ0X2Nvb3Jkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlX2Nvb3Jkc1tpXSAtIGltX3N0YXJ0X2Nvb3Jkc1tpXSk7Ci0gICAgICAgIGFwcGx5ID0gRlRfTXVsRGl2KCBhcHBseSwgdGVtcCwgMHgxMDAwMEwgKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0ZW1wID0gRlRfTXVsRGl2KCBpbV9lbmRfY29vcmRzW2ldIC0gYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzW2ldIC0gdHVwbGVfY29vcmRzW2ldICk7Ci0gICAgICAgIGFwcGx5ID0gRlRfTXVsRGl2KCBhcHBseSwgdGVtcCwgMHgxMDAwMEwgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYXBwbHk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgIE1VTFRJUExFIE1BU1RFUlMgU0VSVklDRSBGVU5DVElPTlMgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0ZWYXJfSGVhZF8KLSAgewotICAgIEZUX0xvbmcgICAgdmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgIG9mZnNldFRvRGF0YTsKLSAgICBGVF9VU2hvcnQgIGNvdW50U2l6ZVBhaXJzOwotICAgIEZUX1VTaG9ydCAgYXhpc0NvdW50OwotICAgIEZUX1VTaG9ydCAgYXhpc1NpemU7Ci0gICAgRlRfVVNob3J0ICBpbnN0YW5jZUNvdW50OwotICAgIEZUX1VTaG9ydCAgaW5zdGFuY2VTaXplOwotCi0gIH0gR1hfRlZhcl9IZWFkOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIGZ2YXJfYXhpc18KLSAgewotICAgIEZUX1VMb25nICAgYXhpc1RhZzsKLSAgICBGVF9VTG9uZyAgIG1pblZhbHVlOwotICAgIEZUX1VMb25nICAgZGVmYXVsdFZhbHVlOwotICAgIEZUX1VMb25nICAgbWF4VmFsdWU7Ci0gICAgRlRfVVNob3J0ICBmbGFnczsKLSAgICBGVF9VU2hvcnQgIG5hbWVJRDsKLQotICB9IEdYX0ZWYXJfQXhpczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dldF9NTV9WYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrIHRoYXQgdGhlIGZvbnQncyBgZnZhcicgdGFibGUgaXMgdmFsaWQsIHBhcnNlIGl0LCBhbmQgcmV0dXJuICAqLwotICAvKiAgICB0aG9zZSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogVGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIFRUX0dldF9NTV9WYXIgaW5pdGlhbGl6ZXMgdGhlIGJsZW5kIHN0cnVjdHVyZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFzdGVyIDo6IFRoZSBgZnZhcicgZGF0YSAobXVzdCBiZSBmcmVlZCBieSBjYWxsZXIpLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfR2V0X01NX1ZhciggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICptYXN0ZXIgKQotICB7Ci0gICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgdGFibGVfbGVuOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgIGVycm9yICA9IFRUX0Vycl9PazsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICBmdmFyX3N0YXJ0OwotICAgIEZUX0ludCAgICAgICAgICAgICAgIGksIGo7Ci0gICAgRlRfTU1fVmFyKiAgICAgICAgICAgbW12YXI7Ci0gICAgRlRfRml4ZWQqICAgICAgICAgICAgbmV4dF9jb29yZHM7Ci0gICAgRlRfU3RyaW5nKiAgICAgICAgICAgbmV4dF9uYW1lOwotICAgIEZUX1Zhcl9BeGlzKiAgICAgICAgIGE7Ci0gICAgRlRfVmFyX05hbWVkX1N0eWxlKiAgbnM7Ci0gICAgR1hfRlZhcl9IZWFkICAgICAgICAgZnZhcl9oZWFkOwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBmdmFyX2ZpZWxkc1tdID0KLSAgICB7Ci0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgR1hfRlZhcl9IZWFkCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCAxNiApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIHZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBvZmZzZXRUb0RhdGEgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBjb3VudFNpemVQYWlycyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGF4aXNDb3VudCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGF4aXNTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggaW5zdGFuY2VDb3VudCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGluc3RhbmNlU2l6ZSApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgZnZhcmF4aXNfZmllbGRzW10gPQotICAgIHsKLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBHWF9GVmFyX0F4aXMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDIwICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggYXhpc1RhZyApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG1pblZhbHVlICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggZGVmYXVsdFZhbHVlICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggbWF4VmFsdWUgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBmbGFncyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG5hbWVJRCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgaWYgKCBmYWNlLT5ibGVuZCA9PSBOVUxMICkKLSAgICB7Ci0gICAgICAvKiBib3RoIGBmdmFyJyBhbmQgYGd2YXInIG11c3QgYmUgcHJlc2VudCAqLwotICAgICAgaWYgKCAoZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2d2YXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgJnRhYmxlX2xlbiApKSAhPSAwICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIChlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZnZhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCAmdGFibGVfbGVuICkpICE9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZ2YXJfc3RhcnQgPSBGVF9TVFJFQU1fUE9TKCApOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggZnZhcl9maWVsZHMsICZmdmFyX2hlYWQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCBmdmFyX2hlYWQudmVyc2lvbiAhPSAoRlRfTG9uZykweDAwMDEwMDAwTCAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBmdmFyX2hlYWQuY291bnRTaXplUGFpcnMgIT0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBmdmFyX2hlYWQuYXhpc1NpemUgIT0gMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBmdmFyX2hlYWQuaW5zdGFuY2VTaXplICE9IDQgKyA0ICogZnZhcl9oZWFkLmF4aXNDb3VudCAgICAgICAgICB8fAotICAgICAgICAgICBmdmFyX2hlYWQub2Zmc2V0VG9EYXRhICsgZnZhcl9oZWFkLmF4aXNDb3VudCAqIDIwVSArCi0gICAgICAgICAgICAgZnZhcl9oZWFkLmluc3RhbmNlQ291bnQgKiBmdmFyX2hlYWQuaW5zdGFuY2VTaXplID4gdGFibGVfbGVuICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9UYWJsZTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX05FVyggZmFjZS0+YmxlbmQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogWFhYOiBUT0RPIC0gY2hlY2sgZm9yIG92ZXJmbG93cyAqLwotICAgICAgZmFjZS0+YmxlbmQtPm1tdmFyX2xlbiA9Ci0gICAgICAgIHNpemVvZiAoIEZUX01NX1ZhciApICsKLSAgICAgICAgZnZhcl9oZWFkLmF4aXNDb3VudCAqIHNpemVvZiAoIEZUX1Zhcl9BeGlzICkgKwotICAgICAgICBmdmFyX2hlYWQuaW5zdGFuY2VDb3VudCAqIHNpemVvZiAoIEZUX1Zhcl9OYW1lZF9TdHlsZSApICsKLSAgICAgICAgZnZhcl9oZWFkLmluc3RhbmNlQ291bnQgKiBmdmFyX2hlYWQuYXhpc0NvdW50ICogc2l6ZW9mICggRlRfRml4ZWQgKSArCi0gICAgICAgIDUgKiBmdmFyX2hlYWQuYXhpc0NvdW50OwotCi0gICAgICBpZiAoIEZUX0FMTE9DKCBtbXZhciwgZmFjZS0+YmxlbmQtPm1tdmFyX2xlbiApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgZmFjZS0+YmxlbmQtPm1tdmFyID0gbW12YXI7Ci0KLSAgICAgIG1tdmFyLT5udW1fYXhpcyA9Ci0gICAgICAgIGZ2YXJfaGVhZC5heGlzQ291bnQ7Ci0gICAgICBtbXZhci0+bnVtX2Rlc2lnbnMgPQotICAgICAgICAoRlRfVUludCktMTsgICAgICAgICAgIC8qIG1lYW5pbmdsZXNzIGluIHRoaXMgY29udGV4dDsgZWFjaCBnbHlwaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heSBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBkZXNpZ25zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvciB0dXBsZXMsIGFzIGNhbGxlZCBieSBBcHBsZSkgICAgICAgICAqLwotICAgICAgbW12YXItPm51bV9uYW1lZHN0eWxlcyA9Ci0gICAgICAgIGZ2YXJfaGVhZC5pbnN0YW5jZUNvdW50OwotICAgICAgbW12YXItPmF4aXMgPQotICAgICAgICAoRlRfVmFyX0F4aXMqKSYobW12YXJbMV0pOwotICAgICAgbW12YXItPm5hbWVkc3R5bGUgPQotICAgICAgICAoRlRfVmFyX05hbWVkX1N0eWxlKikmKG1tdmFyLT5heGlzW2Z2YXJfaGVhZC5heGlzQ291bnRdKTsKLQotICAgICAgbmV4dF9jb29yZHMgPQotICAgICAgICAoRlRfRml4ZWQqKSYobW12YXItPm5hbWVkc3R5bGVbZnZhcl9oZWFkLmluc3RhbmNlQ291bnRdKTsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnZhcl9oZWFkLmluc3RhbmNlQ291bnQ7ICsraSApCi0gICAgICB7Ci0gICAgICAgIG1tdmFyLT5uYW1lZHN0eWxlW2ldLmNvb3JkcyAgPSBuZXh0X2Nvb3JkczsKLSAgICAgICAgbmV4dF9jb29yZHMgICAgICAgICAgICAgICAgICs9IGZ2YXJfaGVhZC5heGlzQ291bnQ7Ci0gICAgICB9Ci0KLSAgICAgIG5leHRfbmFtZSA9IChGVF9TdHJpbmcqKW5leHRfY29vcmRzOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBmdmFyX2hlYWQuYXhpc0NvdW50OyArK2kgKQotICAgICAgewotICAgICAgICBtbXZhci0+YXhpc1tpXS5uYW1lICA9IG5leHRfbmFtZTsKLSAgICAgICAgbmV4dF9uYW1lICAgICAgICAgICArPSA1OwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBmdmFyX3N0YXJ0ICsgZnZhcl9oZWFkLm9mZnNldFRvRGF0YSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBhID0gbW12YXItPmF4aXM7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZ2YXJfaGVhZC5heGlzQ291bnQ7ICsraSApCi0gICAgICB7Ci0gICAgICAgIEdYX0ZWYXJfQXhpcyAgYXhpc19yZWM7Ci0KLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggZnZhcmF4aXNfZmllbGRzLCAmYXhpc19yZWMgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBhLT50YWcgICAgID0gYXhpc19yZWMuYXhpc1RhZzsKLSAgICAgICAgYS0+bWluaW11bSA9IGF4aXNfcmVjLm1pblZhbHVlOyAgICAgLyogQSBGaXhlZCAqLwotICAgICAgICBhLT5kZWYgICAgID0gYXhpc19yZWMuZGVmYXVsdFZhbHVlOyAvKiBBIEZpeGVkICovCi0gICAgICAgIGEtPm1heGltdW0gPSBheGlzX3JlYy5tYXhWYWx1ZTsgICAgIC8qIEEgRml4ZWQgKi8KLSAgICAgICAgYS0+c3RyaWQgICA9IGF4aXNfcmVjLm5hbWVJRDsKLQotICAgICAgICBhLT5uYW1lWzBdID0gKEZUX1N0cmluZykoICAgYS0+dGFnID4+IDI0ICk7Ci0gICAgICAgIGEtPm5hbWVbMV0gPSAoRlRfU3RyaW5nKSggKCBhLT50YWcgPj4gMTYgKSAmIDB4RkYgKTsKLSAgICAgICAgYS0+bmFtZVsyXSA9IChGVF9TdHJpbmcpKCAoIGEtPnRhZyA+PiAgOCApICYgMHhGRiApOwotICAgICAgICBhLT5uYW1lWzNdID0gKEZUX1N0cmluZykoICggYS0+dGFnICAgICAgICkgJiAweEZGICk7Ci0gICAgICAgIGEtPm5hbWVbNF0gPSAwOwotCi0gICAgICAgICsrYTsKLSAgICAgIH0KLQotICAgICAgbnMgPSBtbXZhci0+bmFtZWRzdHlsZTsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnZhcl9oZWFkLmluc3RhbmNlQ291bnQ7ICsraSwgKytucyApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDRMICsgNEwgKiBmdmFyX2hlYWQuYXhpc0NvdW50ICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBucy0+c3RyaWQgICAgICAgPSAgICBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgICAgICh2b2lkKSAvKiBmbGFncyA9ICovIEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGZ2YXJfaGVhZC5heGlzQ291bnQ7ICsraiApCi0gICAgICAgICAgbnMtPmNvb3Jkc1tqXSA9IEZUX0dFVF9VTE9ORygpOyAgICAgLyogQSBGaXhlZCAqLwotCi0gICAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIG1hc3RlciAhPSBOVUxMICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBuOwotCi0KLSAgICAgIGlmICggRlRfQUxMT0MoIG1tdmFyLCBmYWNlLT5ibGVuZC0+bW12YXJfbGVuICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICBGVF9NRU1fQ09QWSggbW12YXIsIGZhY2UtPmJsZW5kLT5tbXZhciwgZmFjZS0+YmxlbmQtPm1tdmFyX2xlbiApOwotCi0gICAgICBtbXZhci0+YXhpcyA9Ci0gICAgICAgIChGVF9WYXJfQXhpcyopJihtbXZhclsxXSk7Ci0gICAgICBtbXZhci0+bmFtZWRzdHlsZSA9Ci0gICAgICAgIChGVF9WYXJfTmFtZWRfU3R5bGUqKSYobW12YXItPmF4aXNbbW12YXItPm51bV9heGlzXSk7Ci0gICAgICBuZXh0X2Nvb3JkcyA9Ci0gICAgICAgIChGVF9GaXhlZCopJihtbXZhci0+bmFtZWRzdHlsZVttbXZhci0+bnVtX25hbWVkc3R5bGVzXSk7Ci0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbW12YXItPm51bV9uYW1lZHN0eWxlczsgKytuICkKLSAgICAgIHsKLSAgICAgICAgbW12YXItPm5hbWVkc3R5bGVbbl0uY29vcmRzICA9IG5leHRfY29vcmRzOwotICAgICAgICBuZXh0X2Nvb3JkcyAgICAgICAgICAgICAgICAgKz0gbW12YXItPm51bV9heGlzOwotICAgICAgfQotCi0gICAgICBhID0gbW12YXItPmF4aXM7Ci0gICAgICBuZXh0X25hbWUgPSAoRlRfU3RyaW5nKiluZXh0X2Nvb3JkczsKLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbW12YXItPm51bV9heGlzOyArK24gKQotICAgICAgewotICAgICAgICBhLT5uYW1lID0gbmV4dF9uYW1lOwotCi0gICAgICAgIC8qIHN0YW5kYXJkIFBvc3RTY3JpcHQgbmFtZXMgZm9yIHNvbWUgc3RhbmRhcmQgYXBwbGUgdGFncyAqLwotICAgICAgICBpZiAoIGEtPnRhZyA9PSBUVEFHX3dnaHQgKQotICAgICAgICAgIGEtPm5hbWUgPSAoY2hhciAqKSJXZWlnaHQiOwotICAgICAgICBlbHNlIGlmICggYS0+dGFnID09IFRUQUdfd2R0aCApCi0gICAgICAgICAgYS0+bmFtZSA9IChjaGFyICopIldpZHRoIjsKLSAgICAgICAgZWxzZSBpZiAoIGEtPnRhZyA9PSBUVEFHX29wc3ogKQotICAgICAgICAgIGEtPm5hbWUgPSAoY2hhciAqKSJPcHRpY2FsU2l6ZSI7Ci0gICAgICAgIGVsc2UgaWYgKCBhLT50YWcgPT0gVFRBR19zbG50ICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIgKikiU2xhbnQiOwotCi0gICAgICAgIG5leHRfbmFtZSArPSA1OwotICAgICAgICArK2E7Ci0gICAgICB9Ci0KLSAgICAgICptYXN0ZXIgPSBtbXZhcjsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NldF9NTV9CbGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCB0aGUgYmxlbmQgKG5vcm1hbGl6ZWQpIGNvb3JkaW5hdGVzIGZvciB0aGlzIGluc3RhbmNlIG9mIHRoZSAgICAqLwotICAvKiAgICBmb250LiAgQ2hlY2sgdGhhdCB0aGUgYGd2YXInIHRhYmxlIGlzIHJlYXNvbmFibGUgYW5kIGRvZXMgc29tZSAgICAgKi8KLSAgLyogICAgaW5pdGlhbCBwcmVwYXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgYmxlbmQgc3RydWN0dXJlIHdpdGggYGd2YXInIGRhdGEuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogTXVzdCBiZSB0aGUgYXhpcyBjb3VudCBvZiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBudW1fY29vcmRzLCBlYWNoIGJldHdlZW4gWy0xLDFdLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfU2V0X01NX0JsZW5kKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gVFRfRXJyX09rOwotICAgIEdYX0JsZW5kICAgIGJsZW5kOwotICAgIEZUX01NX1ZhciogIG1tdmFyOwotICAgIEZUX1VJbnQgICAgIGk7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLSAgICBlbnVtCi0gICAgewotICAgICAgbWN2dF9yZXRhaW4sCi0gICAgICBtY3Z0X21vZGlmeSwKLSAgICAgIG1jdnRfbG9hZAotCi0gICAgfSBtYW5hZ2VDdnQ7Ci0KLQotICAgIGZhY2UtPmRvYmxlbmQgPSBGQUxTRTsKLQotICAgIGlmICggZmFjZS0+YmxlbmQgPT0gTlVMTCApCi0gICAgewotICAgICAgaWYgKCAoZXJyb3IgPSBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMKSkgIT0gMCApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBibGVuZCA9IGZhY2UtPmJsZW5kOwotICAgIG1tdmFyID0gYmxlbmQtPm1tdmFyOwotCi0gICAgaWYgKCBudW1fY29vcmRzICE9IG1tdmFyLT5udW1fYXhpcyApCi0gICAgewotICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9jb29yZHM7ICsraSApCi0gICAgICBpZiAoIGNvb3Jkc1tpXSA8IC0weDAwMDEwMDAwTCB8fCBjb29yZHNbaV0gPiAweDAwMDEwMDAwTCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgIGlmICggYmxlbmQtPmdseXBob2Zmc2V0cyA9PSBOVUxMICkKLSAgICAgIGlmICggKGVycm9yID0gZnRfdmFyX2xvYWRfZ3ZhciggZmFjZSApKSAhPSAwICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3JkcyA9PSBOVUxMICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHMsIG51bV9jb29yZHMgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgbWFuYWdlQ3Z0ID0gbWN2dF9tb2RpZnk7Ci0KLSAgICAgIC8qIElmIHdlIGhhdmUgbm90IHNldCB0aGUgYmxlbmQgY29vcmRpbmF0ZXMgYmVmb3JlIHRoaXMsIHRoZW4gdGhlICAqLwotICAgICAgLyogY3Z0IHRhYmxlIHdpbGwgc3RpbGwgYmUgd2hhdCB3ZSByZWFkIGZyb20gdGhlIGBjdnQgJyB0YWJsZSBhbmQgICovCi0gICAgICAvKiB3ZSBkb24ndCBuZWVkIHRvIHJlbG9hZCBpdC4gIFdlIG1heSBuZWVkIHRvIGNoYW5nZSBpdCB0aG91Z2guLi4gKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoIGkgPSAwOwotICAgICAgICAgICAgaSA8IG51bV9jb29yZHMgJiYgYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPT0gY29vcmRzW2ldOwotICAgICAgICAgICAgKytpICk7Ci0gICAgICAgIGlmICggaSA9PSBudW1fY29vcmRzICkKLSAgICAgICAgICBtYW5hZ2VDdnQgPSBtY3Z0X3JldGFpbjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG1hbmFnZUN2dCA9IG1jdnRfbG9hZDsKLQotICAgICAgLyogSWYgd2UgZG9uJ3QgY2hhbmdlIHRoZSBibGVuZCBjb29yZHMgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvICAqLwotICAgICAgLyogYW55dGhpbmcgdG8gdGhlIGN2dCB0YWJsZS4gIEl0IHdpbGwgYmUgY29ycmVjdC4gIE90aGVyd2lzZSB3ZSAqLwotICAgICAgLyogbm8gbG9uZ2VyIGhhdmUgdGhlIG9yaWdpbmFsIGN2dCAoaXQgd2FzIG1vZGlmaWVkIHdoZW4gd2Ugc2V0ICAqLwotICAgICAgLyogdGhlIGJsZW5kIGxhc3QgdGltZSksIHNvIHdlIG11c3QgcmVsb2FkIGFuZCB0aGVuIG1vZGlmeSBpdC4gICAqLwotICAgIH0KLQotICAgIGJsZW5kLT5udW1fYXhpcyA9IG51bV9jb29yZHM7Ci0gICAgRlRfTUVNX0NPUFkoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzLAotICAgICAgICAgICAgICAgICBjb29yZHMsCi0gICAgICAgICAgICAgICAgIG51bV9jb29yZHMgKiBzaXplb2YgKCBGVF9GaXhlZCApICk7Ci0KLSAgICBmYWNlLT5kb2JsZW5kID0gVFJVRTsKLQotICAgIGlmICggZmFjZS0+Y3Z0ICE9IE5VTEwgKQotICAgIHsKLSAgICAgIHN3aXRjaCAoIG1hbmFnZUN2dCApCi0gICAgICB7Ci0gICAgICBjYXNlIG1jdnRfbG9hZDoKLSAgICAgICAgLyogVGhlIGN2dCB0YWJsZSBoYXMgYmVlbiBsb2FkZWQgYWxyZWFkeTsgZXZlcnkgdGltZSB3ZSBjaGFuZ2UgdGhlICovCi0gICAgICAgIC8qIGJsZW5kIHdlIG1heSBuZWVkIHRvIHJlbG9hZCBhbmQgcmVtb2RpZnkgdGhlIGN2dCB0YWJsZS4gICAgICAgICAqLwotICAgICAgICBGVF9GUkVFKCBmYWNlLT5jdnQgKTsKLSAgICAgICAgZmFjZS0+Y3Z0ID0gTlVMTDsKLQotICAgICAgICB0dF9mYWNlX2xvYWRfY3Z0KCBmYWNlLCBmYWNlLT5yb290LnN0cmVhbSApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBtY3Z0X21vZGlmeToKLSAgICAgICAgLyogVGhlIG9yaWdpbmFsIGN2dCB0YWJsZSBpcyBpbiBtZW1vcnkuICBBbGwgd2UgbmVlZCB0byBkbyBpcyAqLwotICAgICAgICAvKiBhcHBseSB0aGUgYGN2YXInIHRhYmxlIChpZiBhbnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHR0X2ZhY2VfdmFyeV9jdnQoIGZhY2UsIGZhY2UtPnJvb3Quc3RyZWFtICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIG1jdnRfcmV0YWluOgotICAgICAgICAvKiBUaGUgY3Z0IHRhYmxlIGlzIGNvcnJlY3QgZm9yIHRoaXMgc2V0IG9mIGNvb3JkaW5hdGVzLiAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NldF9WYXJfRGVzaWduICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBpbnN0YW5jZSwgbWVhc3VyZWQgaW4gdGhlIHVzZXIgICAgICAgICAqLwotICAvKiAgICBjb29yZGluYXRlIHN5c3RlbS4gIFBhcnNlIHRoZSBgYXZhcicgdGFibGUgKGlmIHByZXNlbnQpIHRvIGNvbnZlcnQgKi8KLSAgLyogICAgZnJvbSB1c2VyIHRvIG5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgYmxlbmQgc3RydWN0IHdpdGggYGd2YXInIGRhdGEuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhpcyBtdXN0IGJlIHRoZSBheGlzIGNvdW50IG9mIHRoZSBmb250LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBIGNvb3JkaW5hdGUgYXJyYXkgd2l0aCBgbnVtX2Nvb3JkcycgZWxlbWVudHMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfU2V0X1Zhcl9EZXNpZ24oIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvciAgICAgID0gVFRfRXJyX09rOwotICAgIEZUX0ZpeGVkKiAgICAgICBub3JtYWxpemVkID0gTlVMTDsKLSAgICBHWF9CbGVuZCAgICAgICAgYmxlbmQ7Ci0gICAgRlRfTU1fVmFyKiAgICAgIG1tdmFyOwotICAgIEZUX1VJbnQgICAgICAgICBpLCBqOwotICAgIEZUX1Zhcl9BeGlzKiAgICBhOwotICAgIEdYX0FWYXJTZWdtZW50ICBhdjsKLSAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLQotICAgIGlmICggZmFjZS0+YmxlbmQgPT0gTlVMTCApCi0gICAgewotICAgICAgaWYgKCAoZXJyb3IgPSBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICkpICE9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKLSAgICBtbXZhciA9IGJsZW5kLT5tbXZhcjsKLQotICAgIGlmICggbnVtX2Nvb3JkcyAhPSBtbXZhci0+bnVtX2F4aXMgKQotICAgIHsKLSAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfQXJndW1lbnQ7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogQXhpcyBub3JtYWxpemF0aW9uIGlzIGEgdHdvIHN0YWdlIHByb2Nlc3MuICBGaXJzdCB3ZSBub3JtYWxpemUgKi8KLSAgICAvKiBiYXNlZCBvbiB0aGUgW21pbixkZWYsbWF4XSB2YWx1ZXMgZm9yIHRoZSBheGlzIHRvIGJlIFstMSwwLDFdLiAqLwotICAgIC8qIFRoZW4sIGlmIHRoZXJlJ3MgYW4gYGF2YXInIHRhYmxlLCB3ZSByZW5vcm1hbGl6ZSB0aGlzIHJhbmdlLiAgICovCi0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggbm9ybWFsaXplZCwgbW12YXItPm51bV9heGlzICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgYSA9IG1tdmFyLT5heGlzOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbW12YXItPm51bV9heGlzOyArK2ksICsrYSApCi0gICAgewotICAgICAgaWYgKCBjb29yZHNbaV0gPiBhLT5tYXhpbXVtIHx8IGNvb3Jkc1tpXSA8IGEtPm1pbmltdW0gKQotICAgICAgewotICAgICAgICBlcnJvciA9IFRUX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggY29vcmRzW2ldIDwgYS0+ZGVmICkKLSAgICAgIHsKLSAgICAgICAgbm9ybWFsaXplZFtpXSA9IC1GVF9NdWxEaXYoIGNvb3Jkc1tpXSAtIGEtPmRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+bWluaW11bSAtIGEtPmRlZiApOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGEtPm1heGltdW0gPT0gYS0+ZGVmICkKLSAgICAgICAgbm9ybWFsaXplZFtpXSA9IDA7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5vcm1hbGl6ZWRbaV0gPSBGVF9NdWxEaXYoIGNvb3Jkc1tpXSAtIGEtPmRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPm1heGltdW0gLSBhLT5kZWYgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoICFibGVuZC0+YXZhcl9jaGVja2VkICkKLSAgICAgIGZ0X3Zhcl9sb2FkX2F2YXIoIGZhY2UgKTsKLQotICAgIGlmICggYmxlbmQtPmF2YXJfc2VnbWVudCAhPSBOVUxMICkKLSAgICB7Ci0gICAgICBhdiA9IGJsZW5kLT5hdmFyX3NlZ21lbnQ7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IG1tdmFyLT5udW1fYXhpczsgKytpLCArK2F2ICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDE7IGogPCAoRlRfVUludClhdi0+cGFpckNvdW50OyArK2ogKQotICAgICAgICAgIGlmICggbm9ybWFsaXplZFtpXSA8IGF2LT5jb3JyZXNwb25kZW5jZVtqXS5mcm9tQ29vcmQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vcm1hbGl6ZWRbaV0gPQotICAgICAgICAgICAgICBGVF9NdWxEaXYoCi0gICAgICAgICAgICAgICAgRlRfTXVsRGl2KAotICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFtpXSAtIGF2LT5jb3JyZXNwb25kZW5jZVtqIC0gMV0uZnJvbUNvb3JkLAotICAgICAgICAgICAgICAgICAgMHgxMDAwMEwsCi0gICAgICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2Vbal0uZnJvbUNvb3JkIC0KLSAgICAgICAgICAgICAgICAgICAgYXYtPmNvcnJlc3BvbmRlbmNlW2ogLSAxXS5mcm9tQ29vcmQgKSwKLSAgICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2Vbal0udG9Db29yZCAtCi0gICAgICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2VbaiAtIDFdLnRvQ29vcmQsCi0gICAgICAgICAgICAgICAgMHgxMDAwMEwgKSArCi0gICAgICAgICAgICAgIGF2LT5jb3JyZXNwb25kZW5jZVtqIC0gMV0udG9Db29yZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnJvciA9IFRUX1NldF9NTV9CbGVuZCggZmFjZSwgbnVtX2Nvb3Jkcywgbm9ybWFsaXplZCApOwotCi0gIEV4aXQ6Ci0gICAgRlRfRlJFRSggbm9ybWFsaXplZCApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgR1ggVkFSIFBBUlNJTkcgUk9VVElORVMgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX3ZhcnlfY3Z0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb2RpZnkgdGhlIGxvYWRlZCBjdnQgdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBgY3ZhcicgdGFibGUgYW5kIHRoZSAgKi8KLSAgLyogICAgZm9udCdzIGJsZW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb3N0IGVycm9ycyBhcmUgaWdub3JlZC4gIEl0IGlzIHBlcmZlY3RseSB2YWxpZCBub3QgdG8gaGF2ZSBhICAgICAgKi8KLSAgLyogICAgYGN2YXInIHRhYmxlIGV2ZW4gaWYgdGhlcmUgaXMgYSBgZ3ZhcicgYW5kIGBmdmFyJyB0YWJsZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV92YXJ5X2N2dCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VTG9uZyAgICB0YWJsZV9zdGFydDsKLSAgICBGVF9VTG9uZyAgICB0YWJsZV9sZW47Ci0gICAgRlRfVUludCAgICAgdHVwbGVDb3VudDsKLSAgICBGVF9VTG9uZyAgICBvZmZzZXRUb0RhdGE7Ci0gICAgRlRfVUxvbmcgICAgaGVyZTsKLSAgICBGVF9VSW50ICAgICBpLCBqOwotICAgIEZUX0ZpeGVkKiAgIHR1cGxlX2Nvb3JkcyAgICA9IE5VTEw7Ci0gICAgRlRfRml4ZWQqICAgaW1fc3RhcnRfY29vcmRzID0gTlVMTDsKLSAgICBGVF9GaXhlZCogICBpbV9lbmRfY29vcmRzICAgPSBOVUxMOwotICAgIEdYX0JsZW5kICAgIGJsZW5kICAgICAgICAgICA9IGZhY2UtPmJsZW5kOwotICAgIEZUX1VJbnQgICAgIHBvaW50X2NvdW50OwotICAgIEZUX1VTaG9ydCogIGxvY2FscG9pbnRzOwotICAgIEZUX1Nob3J0KiAgIGRlbHRhczsKLQotCi0gICAgRlRfVFJBQ0UyKCggIkNWQVIgIiApKTsKLQotICAgIGlmICggYmxlbmQgPT0gTlVMTCApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIm5vIGJsZW5kIHNwZWNpZmllZCFcbiIgKSk7Ci0KLSAgICAgIGVycm9yID0gVFRfRXJyX09rOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggZmFjZS0+Y3Z0ID09IE5VTEwgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJubyBgY3Z0ICcgdGFibGUhXG4iICkpOwotCi0gICAgICBlcnJvciA9IFRUX0Vycl9PazsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfY3Zhciwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmchXG4iICkpOwotCi0gICAgICBlcnJvciA9IFRUX0Vycl9PazsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCB0YWJsZV9sZW4gKSApCi0gICAgewotICAgICAgZXJyb3IgPSBUVF9FcnJfT2s7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgdGFibGVfc3RhcnQgPSBGVF9TdHJlYW1fRlRlbGwoIHN0cmVhbSApOwotICAgIGlmICggRlRfR0VUX0xPTkcoKSAhPSAweDAwMDEwMDAwTCApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImJhZCB0YWJsZSB2ZXJzaW9uIVxuIiApKTsKLQotICAgICAgZXJyb3IgPSBUVF9FcnJfT2s7Ci0gICAgICBnb3RvIEZFeGl0OwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCB0dXBsZV9jb29yZHMsIGJsZW5kLT5udW1fYXhpcyApICAgIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIGltX3N0YXJ0X2Nvb3JkcywgYmxlbmQtPm51bV9heGlzICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggaW1fZW5kX2Nvb3JkcywgYmxlbmQtPm51bV9heGlzICkgICApCi0gICAgICBnb3RvIEZFeGl0OwotCi0gICAgdHVwbGVDb3VudCAgID0gRlRfR0VUX1VTSE9SVCgpOwotICAgIG9mZnNldFRvRGF0YSA9IHRhYmxlX3N0YXJ0ICsgRlRfR0VUX1VTSE9SVCgpOwotCi0gICAgLyogVGhlIGRvY3VtZW50YXRpb24gaW1wbGllcyB0aGVyZSBhcmUgZmxhZ3MgcGFja2VkIGludG8gdGhlICAgICAgICAqLwotICAgIC8qIHR1cGxlY291bnQsIGJ1dCBKb2huIEplbmtpbnMgc2F5cyB0aGF0IHNoYXJlZCBwb2ludHMgZG9uJ3QgYXBwbHkgKi8KLSAgICAvKiB0byBgY3ZhcicsIGFuZCBubyBvdGhlciBmbGFncyBhcmUgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8ICggdHVwbGVDb3VudCAmIDB4RkZGICk7ICsraSApCi0gICAgewotICAgICAgRlRfVUludCAgIHR1cGxlRGF0YVNpemU7Ci0gICAgICBGVF9VSW50ICAgdHVwbGVJbmRleDsKLSAgICAgIEZUX0ZpeGVkICBhcHBseTsKLQotCi0gICAgICB0dXBsZURhdGFTaXplID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgdHVwbGVJbmRleCAgICA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgLyogVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGhlcmUgZm9yIGEgZ2xvYmFsIHR1cGxlIGNvb3JkaW5hdGUgc2VjdGlvbiwgKi8KLSAgICAgIC8qIHNvIEpvaG4gc2F5cy4gIFRoZXJlIGFyZSBubyB0dXBsZSBpbmRpY2VzLCBqdXN0IGVtYmVkZGVkIHR1cGxlcy4gICovCi0KLSAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0VNQkVEREVEX1RVUExFX0NPT1JEICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7ICsraiApCi0gICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgPDwgMjsgLyogY29udmVydCBmcm9tICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3J0IGZyYWMgdG8gZml4ZWQgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCB0aGlzIHR1cGxlOyBpdCBtYWtlcyBubyBzZW5zZSAqLwotCi0gICAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSApCi0gICAgICAgICAgZm9yICggaiA9IDA7IGogPCAyICogYmxlbmQtPm51bV9heGlzOyArK2ogKQotICAgICAgICAgICAgKHZvaWQpRlRfR0VUX1NIT1JUKCk7Ci0KLSAgICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9JTlRFUk1FRElBVEVfVFVQTEUgKQotICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgKytqICkKLSAgICAgICAgICBpbV9zdGFydF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSA8PCAyOwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgKytqICkKLSAgICAgICAgICBpbV9lbmRfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgPDwgMjsKLSAgICAgIH0KLQotICAgICAgYXBwbHkgPSBmdF92YXJfYXBwbHlfdHVwbGUoIGJsZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VU2hvcnQpdHVwbGVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1fc3RhcnRfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX2VuZF9jb29yZHMgKTsKLSAgICAgIGlmICggLyogdHVwbGUgaXNuJ3QgYWN0aXZlIGZvciBvdXIgYmxlbmQgKi8KLSAgICAgICAgICAgYXBwbHkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIC8qIGdsb2JhbCBwb2ludHMgbm90IGFsbG93ZWQsICAgICAgICAgICAqLwotICAgICAgICAgICAvKiBpZiB0aGV5IGFyZW4ndCBsb2NhbCwgbWFrZXMgbm8gc2Vuc2UgKi8KLSAgICAgICAgICAgISggdHVwbGVJbmRleCAmIEdYX1RJX1BSSVZBVEVfUE9JTlRfTlVNQkVSUyApICkKLSAgICAgIHsKLSAgICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBoZXJlID0gRlRfU3RyZWFtX0ZUZWxsKCBzdHJlYW0gKTsKLQotICAgICAgRlRfU3RyZWFtX1NlZWtTZXQoIHN0cmVhbSwgb2Zmc2V0VG9EYXRhICk7Ci0KLSAgICAgIGxvY2FscG9pbnRzID0gZnRfdmFyX3JlYWRwYWNrZWRwb2ludHMoIHN0cmVhbSwgJnBvaW50X2NvdW50ICk7Ci0gICAgICBkZWx0YXMgICAgICA9IGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb3VudCA9PSAwID8gZmFjZS0+Y3Z0X3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwb2ludF9jb3VudCApOwotICAgICAgaWYgKCBsb2NhbHBvaW50cyA9PSBOVUxMIHx8IGRlbHRhcyA9PSBOVUxMICkKLSAgICAgICAgLyogZmFpbHVyZSwgaWdub3JlIGl0ICovOwotCi0gICAgICBlbHNlIGlmICggbG9jYWxwb2ludHMgPT0gQUxMX1BPSU5UUyApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgZGVsdGFzIGZvciBldmVyeSBlbnRyeSBpbiBjdnQgKi8KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBmYWNlLT5jdnRfc2l6ZTsgKytqICkKLSAgICAgICAgICBmYWNlLT5jdnRbal0gPSAoRlRfU2hvcnQpKCBmYWNlLT5jdnRbal0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZGVsdGFzW2pdLCBhcHBseSApICk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBwb2ludF9jb3VudDsgKytqICkKLSAgICAgICAgewotICAgICAgICAgIGludCAgcGluZGV4ID0gbG9jYWxwb2ludHNbal07Ci0KLSAgICAgICAgICBmYWNlLT5jdnRbcGluZGV4XSA9IChGVF9TaG9ydCkoIGZhY2UtPmN2dFtwaW5kZXhdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZGVsdGFzW2pdLCBhcHBseSApICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCBsb2NhbHBvaW50cyAhPSBBTExfUE9JTlRTICkKLSAgICAgICAgRlRfRlJFRSggbG9jYWxwb2ludHMgKTsKLSAgICAgIEZUX0ZSRUUoIGRlbHRhcyApOwotCi0gICAgICBvZmZzZXRUb0RhdGEgKz0gdHVwbGVEYXRhU2l6ZTsKLQotICAgICAgRlRfU3RyZWFtX1NlZWtTZXQoIHN0cmVhbSwgaGVyZSApOwotICAgIH0KLQotICBGRXhpdDoKLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgRXhpdDoKLSAgICBGVF9GUkVFKCB0dXBsZV9jb29yZHMgKTsKLSAgICBGVF9GUkVFKCBpbV9zdGFydF9jb29yZHMgKTsKLSAgICBGVF9GUkVFKCBpbV9lbmRfY29vcmRzICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1ZhcnlfR2V0X0dseXBoX0RlbHRhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGFwcHJvcHJpYXRlIGRlbHRhcyBmb3IgdGhlIGN1cnJlbnQgZ2x5cGguICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCBiZWluZyBtb2RpZmllZC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuX3BvaW50cyAgICA6OiBUaGUgbnVtYmVyIG9mIHRoZSBwb2ludHMgaW4gdGhlIGdseXBoLCBpbmNsdWRpbmcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgcGhhbnRvbSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGFzICAgICAgOjogVGhlIGFycmF5IG9mIHBvaW50cyB0byBjaGFuZ2UuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfVmFyeV9HZXRfR2x5cGhfRGVsdGFzKCBUVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgKmRlbHRhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbl9wb2ludHMgKQotICB7Ci0gICAgRlRfU3RyZWFtICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgR1hfQmxlbmQgICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfVmVjdG9yKiAgZGVsdGFfeHk7Ci0KLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgICBnbHlwaF9zdGFydDsKLSAgICBGVF9VSW50ICAgICB0dXBsZUNvdW50OwotICAgIEZUX1VMb25nICAgIG9mZnNldFRvRGF0YTsKLSAgICBGVF9VTG9uZyAgICBoZXJlOwotICAgIEZUX1VJbnQgICAgIGksIGo7Ci0gICAgRlRfRml4ZWQqICAgdHVwbGVfY29vcmRzICAgID0gTlVMTDsKLSAgICBGVF9GaXhlZCogICBpbV9zdGFydF9jb29yZHMgPSBOVUxMOwotICAgIEZUX0ZpeGVkKiAgIGltX2VuZF9jb29yZHMgICA9IE5VTEw7Ci0gICAgRlRfVUludCAgICAgcG9pbnRfY291bnQsIHNwb2ludF9jb3VudCA9IDA7Ci0gICAgRlRfVVNob3J0KiAgc2hhcmVkcG9pbnRzID0gTlVMTDsKLSAgICBGVF9VU2hvcnQqICBsb2NhbHBvaW50cyAgPSBOVUxMOwotICAgIEZUX1VTaG9ydCogIHBvaW50czsKLSAgICBGVF9TaG9ydCAgICAqZGVsdGFzX3gsICpkZWx0YXNfeTsKLQotCi0gICAgaWYgKCAhZmFjZS0+ZG9ibGVuZCB8fCBibGVuZCA9PSBOVUxMICkKLSAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9Bcmd1bWVudDsKLQotICAgIC8qIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgKi8KLSAgICBpZiAoIEZUX05FV19BUlJBWSggZGVsdGFfeHksIG5fcG9pbnRzICkgKQotICAgICAgZ290byBFeGl0OwotICAgICpkZWx0YXMgPSBkZWx0YV94eTsKLQotICAgIGlmICggZ2x5cGhfaW5kZXggPj0gYmxlbmQtPmd2X2dseXBoY250ICAgICAgfHwKLSAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXhdID09Ci0gICAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXggKyAxXSApCi0gICAgICByZXR1cm4gVFRfRXJyX09rOyAgICAgICAgICAgICAgIC8qIG5vIHZhcmlhdGlvbiBkYXRhIGZvciB0aGlzIGdseXBoICovCi0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBibGVuZC0+Z2x5cGhvZmZzZXRzW2dseXBoX2luZGV4XSApICAgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBibGVuZC0+Z2x5cGhvZmZzZXRzW2dseXBoX2luZGV4ICsgMV0gLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tnbHlwaF9pbmRleF0gKSApCi0gICAgICBnb3RvIEZhaWwxOwotCi0gICAgZ2x5cGhfc3RhcnQgPSBGVF9TdHJlYW1fRlRlbGwoIHN0cmVhbSApOwotCi0gICAgLyogZWFjaCBzZXQgb2YgZ2x5cGggdmFyaWF0aW9uIGRhdGEgaXMgZm9ybWF0dGVkIHNpbWlsYXJseSB0byBgY3ZhcicgKi8KLSAgICAvKiAoZXhjZXB0IHdlIGdldCBzaGFyZWQgcG9pbnRzIGFuZCBnbG9iYWwgdHVwbGVzKSAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHR1cGxlX2Nvb3JkcywgYmxlbmQtPm51bV9heGlzICkgICAgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggaW1fc3RhcnRfY29vcmRzLCBibGVuZC0+bnVtX2F4aXMgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBpbV9lbmRfY29vcmRzLCBibGVuZC0+bnVtX2F4aXMgKSAgICkKLSAgICAgIGdvdG8gRmFpbDI7Ci0KLSAgICB0dXBsZUNvdW50ICAgPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgb2Zmc2V0VG9EYXRhID0gZ2x5cGhfc3RhcnQgKyBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICBpZiAoIHR1cGxlQ291bnQgJiBHWF9UQ19UVVBMRVNfU0hBUkVfUE9JTlRfTlVNQkVSUyApCi0gICAgewotICAgICAgaGVyZSA9IEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICk7Ci0KLSAgICAgIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIG9mZnNldFRvRGF0YSApOwotCi0gICAgICBzaGFyZWRwb2ludHMgPSBmdF92YXJfcmVhZHBhY2tlZHBvaW50cyggc3RyZWFtLCAmc3BvaW50X2NvdW50ICk7Ci0gICAgICBvZmZzZXRUb0RhdGEgPSBGVF9TdHJlYW1fRlRlbGwoIHN0cmVhbSApOwotCi0gICAgICBGVF9TdHJlYW1fU2Vla1NldCggc3RyZWFtLCBoZXJlICk7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCAoIHR1cGxlQ291bnQgJiBHWF9UQ19UVVBMRV9DT1VOVF9NQVNLICk7ICsraSApCi0gICAgewotICAgICAgRlRfVUludCAgIHR1cGxlRGF0YVNpemU7Ci0gICAgICBGVF9VSW50ICAgdHVwbGVJbmRleDsKLSAgICAgIEZUX0ZpeGVkICBhcHBseTsKLQotCi0gICAgICB0dXBsZURhdGFTaXplID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgdHVwbGVJbmRleCAgICA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgaWYgKCB0dXBsZUluZGV4ICYgR1hfVElfRU1CRURERURfVFVQTEVfQ09PUkQgKQotICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgKytqICkKLSAgICAgICAgICB0dXBsZV9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSA8PCAyOyAgLyogY29udmVydCBmcm9tICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG9ydCBmcmFjIHRvIGZpeGVkICovCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICggKCB0dXBsZUluZGV4ICYgR1hfVElfVFVQTEVfSU5ERVhfTUFTSyApID49IGJsZW5kLT50dXBsZWNvdW50ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9UYWJsZTsKLSAgICAgICAgZ290byBGYWlsMzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfTUVNX0NPUFkoCi0gICAgICAgICAgdHVwbGVfY29vcmRzLAotICAgICAgICAgICZibGVuZC0+dHVwbGVjb29yZHNbKHR1cGxlSW5kZXggJiAweEZGRikgKiBibGVuZC0+bnVtX2F4aXNdLAotICAgICAgICAgIGJsZW5kLT5udW1fYXhpcyAqIHNpemVvZiAoIEZUX0ZpeGVkICkgKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCB0dXBsZUluZGV4ICYgR1hfVElfSU5URVJNRURJQVRFX1RVUExFICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7ICsraiApCi0gICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgPDwgMjsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7ICsraiApCi0gICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tqXSA9IEZUX0dFVF9TSE9SVCgpIDw8IDI7Ci0gICAgICB9Ci0KLSAgICAgIGFwcGx5ID0gZnRfdmFyX2FwcGx5X3R1cGxlKCBibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KXR1cGxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzICk7Ci0KLSAgICAgIGlmICggYXBwbHkgPT0gMCApICAgICAgICAgICAgICAvKiB0dXBsZSBpc24ndCBhY3RpdmUgZm9yIG91ciBibGVuZCAqLwotICAgICAgewotICAgICAgICBvZmZzZXRUb0RhdGEgKz0gdHVwbGVEYXRhU2l6ZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGhlcmUgPSBGVF9TdHJlYW1fRlRlbGwoIHN0cmVhbSApOwotCi0gICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9QUklWQVRFX1BPSU5UX05VTUJFUlMgKQotICAgICAgewotICAgICAgICBGVF9TdHJlYW1fU2Vla1NldCggc3RyZWFtLCBvZmZzZXRUb0RhdGEgKTsKLQotICAgICAgICBsb2NhbHBvaW50cyA9IGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzKCBzdHJlYW0sICZwb2ludF9jb3VudCApOwotICAgICAgICBwb2ludHMgICAgICA9IGxvY2FscG9pbnRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwb2ludHMgICAgICA9IHNoYXJlZHBvaW50czsKLSAgICAgICAgcG9pbnRfY291bnQgPSBzcG9pbnRfY291bnQ7Ci0gICAgICB9Ci0KLSAgICAgIGRlbHRhc194ID0gZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXMoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvdW50ID09IDAgPyBuX3BvaW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBvaW50X2NvdW50ICk7Ci0gICAgICBkZWx0YXNfeSA9IGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb3VudCA9PSAwID8gbl9wb2ludHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwb2ludF9jb3VudCApOwotCi0gICAgICBpZiAoIHBvaW50cyA9PSBOVUxMIHx8IGRlbHRhc195ID09IE5VTEwgfHwgZGVsdGFzX3ggPT0gTlVMTCApCi0gICAgICAgIDsgLyogZmFpbHVyZSwgaWdub3JlIGl0ICovCi0KLSAgICAgIGVsc2UgaWYgKCBwb2ludHMgPT0gQUxMX1BPSU5UUyApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgZGVsdGFzIGZvciBldmVyeSBwb2ludCBpbiB0aGUgZ2x5cGggKi8KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBuX3BvaW50czsgKytqICkKLSAgICAgICAgewotICAgICAgICAgIGRlbHRhX3h5W2pdLnggKz0gRlRfTXVsRml4KCBkZWx0YXNfeFtqXSwgYXBwbHkgKTsKLSAgICAgICAgICBkZWx0YV94eVtqXS55ICs9IEZUX011bEZpeCggZGVsdGFzX3lbal0sIGFwcGx5ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHBvaW50X2NvdW50OyArK2ogKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsdGFfeHlbbG9jYWxwb2ludHNbal1dLnggKz0gRlRfTXVsRml4KCBkZWx0YXNfeFtqXSwgYXBwbHkgKTsKLSAgICAgICAgICBkZWx0YV94eVtsb2NhbHBvaW50c1tqXV0ueSArPSBGVF9NdWxGaXgoIGRlbHRhc195W2pdLCBhcHBseSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggbG9jYWxwb2ludHMgIT0gQUxMX1BPSU5UUyApCi0gICAgICAgIEZUX0ZSRUUoIGxvY2FscG9pbnRzICk7Ci0gICAgICBGVF9GUkVFKCBkZWx0YXNfeCApOwotICAgICAgRlRfRlJFRSggZGVsdGFzX3kgKTsKLQotICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7Ci0KLSAgICAgIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIGhlcmUgKTsKLSAgICB9Ci0KLSAgRmFpbDM6Ci0gICAgRlRfRlJFRSggdHVwbGVfY29vcmRzICk7Ci0gICAgRlRfRlJFRSggaW1fc3RhcnRfY29vcmRzICk7Ci0gICAgRlRfRlJFRSggaW1fZW5kX2Nvb3JkcyApOwotCi0gIEZhaWwyOgotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICBGYWlsMToKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBkZWx0YV94eSApOwotICAgICAgKmRlbHRhcyA9IE5VTEw7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kb25lX2JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlcyB0aGUgYmxlbmQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2RvbmVfYmxlbmQoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICBHWF9CbGVuZCAgIGJsZW5kICkKLSAgewotICAgIGlmICggYmxlbmQgIT0gTlVMTCApCi0gICAgewotICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICBGVF9GUkVFKCBibGVuZC0+bm9ybWFsaXplZGNvb3JkcyApOwotICAgICAgRlRfRlJFRSggYmxlbmQtPm1tdmFyICk7Ci0KLSAgICAgIGlmICggYmxlbmQtPmF2YXJfc2VnbWVudCAhPSBOVUxMICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibGVuZC0+bnVtX2F4aXM7ICsraSApCi0gICAgICAgICAgRlRfRlJFRSggYmxlbmQtPmF2YXJfc2VnbWVudFtpXS5jb3JyZXNwb25kZW5jZSApOwotICAgICAgICBGVF9GUkVFKCBibGVuZC0+YXZhcl9zZWdtZW50ICk7Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSRUUoIGJsZW5kLT50dXBsZWNvb3JkcyApOwotICAgICAgRlRfRlJFRSggYmxlbmQtPmdseXBob2Zmc2V0cyApOwotICAgICAgRlRfRlJFRSggYmxlbmQgKTsKLSAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGd4dmFyLmggYi9zcmMvdHJ1ZXR5cGUvdHRneHZhci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDZjYjRkLi4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dGd4dmFyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRneHZhci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIEdYIEZvbnQgVmFyaWF0aW9uIGxvYWRlciAoc3BlY2lmaWNhdGlvbikgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZyBhbmQgR2VvcmdlIFdpbGxpYW1zLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRHWFZBUl9IX18KLSNkZWZpbmUgX19UVEdYVkFSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0b2Jqcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1hfQVZhckNvcnJlc3BvbmRlbmNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYHNob3J0RnJhY0NvcnJlc3BvbmRlbmNlJyBpbiBgYXZhcicgICovCi0gIC8qICAgIHRhYmxlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbnMgZnJvbSBBcHBsZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0FWYXJDb3JyZXNwb25kZW5jZVJlY18KLSAgewotICAgIEZUX0ZpeGVkICBmcm9tQ29vcmQ7Ci0gICAgRlRfRml4ZWQgIHRvQ29vcmQ7Ci0KLSAgfSBHWF9BVmFyQ29ycmVzcG9uZGVuY2VSZWNfLCAqR1hfQVZhckNvcnJlc3BvbmRlbmNlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1hfQVZhclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGF0YSBmcm9tIHRoZSBzZWdtZW50IGZpZWxkIG9mIGBhdmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBheGlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0FWYXJTZWdtZW50UmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICBwYWlyQ291bnQ7Ci0gICAgR1hfQVZhckNvcnJlc3BvbmRlbmNlICBjb3JyZXNwb25kZW5jZTsgLyogYXJyYXkgd2l0aCBwYWlyQ291bnQgZW50cmllcyAqLwotCi0gIH0gR1hfQVZhclNlZ21lbnRSZWMsICpHWF9BVmFyU2VnbWVudDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX0JsZW5kUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERhdGEgZm9yIGludGVycG9sYXRpbmcgYSBmb250IGZyb20gYSBkaXN0b3J0YWJsZSBmb250IHNwZWNpZmllZCAgICAqLwotICAvKiAgICBieSB0aGUgR1ggKnZhciB0YWJsZXMgKFtmZ2NhXXZhcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fYXhpcyAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYXhlcyBhbG9uZyB3aGljaCBpbnRlcnBvbGF0aW9uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGhhcHBlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub3JtYWxpemVkY29vcmRzIDo6IEEgbm9ybWFsaXplZCB2YWx1ZSAoYmV0d2VlbiBbLTEsMV0pIGluZGljYXRpbmcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udHJpYnV0aW9uIGFsb25nIGVhY2ggYXhpcyB0byB0aGUgZmluYWwgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVkIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0JsZW5kUmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgIG51bV9heGlzOwotICAgIEZUX0ZpeGVkKiAgICAgICBub3JtYWxpemVkY29vcmRzOwotCi0gICAgRlRfTU1fVmFyKiAgICAgIG1tdmFyOwotICAgIEZUX0ludCAgICAgICAgICBtbXZhcl9sZW47Ci0KLSAgICBGVF9Cb29sICAgICAgICAgYXZhcl9jaGVja2VkOwotICAgIEdYX0FWYXJTZWdtZW50ICBhdmFyX3NlZ21lbnQ7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgdHVwbGVjb3VudDsgICAgICAvKiBzaGFyZWQgdHVwbGVzIGluIGBndmFyJyAgICAgICAgICAgKi8KLSAgICBGVF9GaXhlZCogICAgICAgdHVwbGVjb29yZHM7ICAgICAvKiB0dXBsZWNvb3Jkc1t0dXBsZWNvdW50XVtudW1fYXhpc10gKi8KLQotICAgIEZUX1VJbnQgICAgICAgICBndl9nbHlwaGNudDsKLSAgICBGVF9VTG9uZyogICAgICAgZ2x5cGhvZmZzZXRzOwotCi0gIH0gR1hfQmxlbmRSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxlbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWF9UdXBsZUNvdW50RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGbGFncyB1c2VkIHdpdGhpbiB0aGUgYFR1cGxlQ291bnQnIGZpZWxkIG9mIHRoZSBgZ3ZhcicgdGFibGUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgR1hfVHVwbGVDb3VudEZsYWdzXwotICB7Ci0gICAgR1hfVENfVFVQTEVTX1NIQVJFX1BPSU5UX05VTUJFUlMgPSAweDgwMDAsCi0gICAgR1hfVENfUkVTRVJWRURfVFVQTEVfRkxBR1MgICAgICAgPSAweDcwMDAsCi0gICAgR1hfVENfVFVQTEVfQ09VTlRfTUFTSyAgICAgICAgICAgPSAweDBGRkYKLQotICB9IEdYX1R1cGxlQ291bnRGbGFnczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPGVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX1R1cGxlSW5kZXhGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZsYWdzIHVzZWQgd2l0aGluIHRoZSBgVHVwbGVJbmRleCcgZmllbGQgb2YgdGhlIGBndmFyJyBhbmQgYGN2YXInICAqLwotICAvKiAgICB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgR1hfVHVwbGVJbmRleEZsYWdzXwotICB7Ci0gICAgR1hfVElfRU1CRURERURfVFVQTEVfQ09PUkQgID0gMHg4MDAwLAotICAgIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSAgICA9IDB4NDAwMCwKLSAgICBHWF9USV9QUklWQVRFX1BPSU5UX05VTUJFUlMgPSAweDIwMDAsCi0gICAgR1hfVElfUkVTRVJWRURfVFVQTEVfRkxBRyAgID0gMHgxMDAwLAotICAgIEdYX1RJX1RVUExFX0lOREVYX01BU0sgICAgICA9IDB4MEZGRgotCi0gIH0gR1hfVHVwbGVJbmRleEZsYWdzOwotCi0KLSNkZWZpbmUgVFRBR193Z2h0ICBGVF9NQUtFX1RBRyggJ3cnLCAnZycsICdoJywgJ3QnICkKLSNkZWZpbmUgVFRBR193ZHRoICBGVF9NQUtFX1RBRyggJ3cnLCAnZCcsICd0JywgJ2gnICkKLSNkZWZpbmUgVFRBR19vcHN6ICBGVF9NQUtFX1RBRyggJ28nLCAncCcsICdzJywgJ3onICkKLSNkZWZpbmUgVFRBR19zbG50ICBGVF9NQUtFX1RBRyggJ3MnLCAnbCcsICduJywgJ3QnICkKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1NldF9NTV9CbGVuZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1NldF9WYXJfRGVzaWduKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX0dldF9NTV9WYXIoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX3ZhcnlfY3Z0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUVF9WYXJ5X0dldF9HbHlwaF9EZWx0YXMoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAqZGVsdGFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBuX3BvaW50cyApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9kb25lX2JsZW5kKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgR1hfQmxlbmQgICBibGVuZCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19UVEdYVkFSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgYi9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljMzY1Ni4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYworKysgL2Rldi9udWxsCkBAIC0xLDc4MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRpbnRlcnAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggYnkgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0KLSNpbmNsdWRlICJ0dGludGVycC5oIgotCi0jaW5jbHVkZSAidHRlcnJvcnMuaCIKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLQotI2RlZmluZSBUVF9NVUxGSVggICAgICAgICAgIEZUX011bEZpeAotI2RlZmluZSBUVF9NVUxESVYgICAgICAgICAgIEZUX011bERpdgotI2RlZmluZSBUVF9NVUxESVZfTk9fUk9VTkQgIEZUX011bERpdl9Ob19Sb3VuZAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRpbnRlcnAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluIG9yZGVyIHRvIGRldGVjdCBpbmZpbml0ZSBsb29wcyBpbiB0aGUgY29kZSwgd2Ugc2V0IHVwIGEgY291bnRlciAgICAqLwotICAvKiB3aXRoaW4gdGhlIHJ1biBsb29wLiAgQSBzaW5nbGUgc3Ryb2tlIG9mIGludGVycHJldGF0aW9uIGlzIG5vdyAgICAgICAgKi8KLSAgLyogbGltaXRlZCB0byBhIG1heGltYWwgbnVtYmVyIG9mIG9wY29kZXMgZGVmaW5lZCBiZWxvdy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNQVhfUlVOTkFCTEVfT1BDT0RFUyAgMTAwMDAwMEwKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBpbXBsZW1lbnRhdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBhLiBzdGF0aWMgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IGlzIGEgc3RhdGljIHZhcmlhYmxlLCB3aGljaCBmaWVsZHMgICAqLwotICAvKiAgICBhcmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgdGhlIGludGVycHJldGVyIGR1cmluZyBleGVjdXRpb24uICBUaGUgICAgKi8KLSAgLyogICAgY29udGV4dCBpcyBuYW1lZCBgY3VyJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHZlcnNpb24gaXMgbm9uLXJlZW50cmFudCwgb2YgY291cnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGIuIGluZGlyZWN0IGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQgaXMgcGFzc2VkIHRvIF9lYWNoXyBmdW5jdGlvbiBhcyBpdHMgICovCi0gIC8qICAgIGZpcnN0IGFyZ3VtZW50LCBhbmQgZWFjaCBmaWVsZCBpcyB0aHVzIGFjY2Vzc2VkIGluZGlyZWN0bHkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB2ZXJzaW9uIGlzIGZ1bGx5IHJlLWVudHJhbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgaWRlYSBpcyB0aGF0IGFuIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIG1heSBiZSBzbG93ZXIgdG8gZXhlY3V0ZSAgKi8KLSAgLyogb24gbG93LWVuZCBwcm9jZXNzb3JzIHRoYXQgYXJlIHVzZWQgaW4gc29tZSBzeXN0ZW1zIChsaWtlIDM4NnMgb3IgICAgICovCi0gIC8qIGV2ZW4gNDg2cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQXMgYSBjb25zZXF1ZW5jZSwgdGhlIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGlzIG5vdyB0aGUgZGVmYXVsdCwgYXMgICovCi0gIC8qIGl0cyBwZXJmb3JtYW5jZSBjb3N0cyBjYW4gYmUgY29uc2lkZXJlZCBuZWdsaWdpYmxlIGluIG91ciBjb250ZXh0LiAgICAqLwotICAvKiBOb3RlLCBob3dldmVyLCB0aGF0IHdlIGtlcHQgdGhlIHNhbWUgc291cmNlIHdpdGggbWFjcm9zIGJlY2F1c2U6ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gVGhlIGNvZGUgaXMga2VwdCB2ZXJ5IGNsb3NlIGluIGRlc2lnbiB0byB0aGUgUGFzY2FsIGNvZGUgdXNlZCBmb3IgICAqLwotICAvKiAgIGRldmVsb3BtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gSXQncyBtdWNoIG1vcmUgcmVhZGFibGUgdGhhdCB3YXkhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBJdCdzIHN0aWxsIG9wZW4gdG8gZXhwZXJpbWVudGF0aW9uIGFuZCB0dW5pbmcuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX0lOVEVSUFJFVEVSICAgICAvKiBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiAqLwotCi0jZGVmaW5lIENVUiAgKCpleGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWUgdHRvYmpzLmggKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgbWFjcm8gaXMgdXNlZCB3aGVuZXZlciBgZXhlYycgaXMgdW51c2VkIGluIGEgZnVuY3Rpb24sIHRvIGF2b2lkICAqLwotICAvKiBzdHVwaWQgd2FybmluZ3MgZnJvbSBwZWRhbnRpYyBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VOVVNFRF9FWEVDICBGVF9VTlVTRUQoIGV4YyApCi0KLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLwotCi0jZGVmaW5lIENVUiAgY3VyCi0KLSNkZWZpbmUgRlRfVU5VU0VEX0VYRUMgIGludCAgX19kdW1teSA9IF9fZHVtbXkKLQotICBzdGF0aWMKLSAgVFRfRXhlY0NvbnRleHRSZWMgIGN1cjsgICAvKiBzdGF0aWMgZXhlYy4gY29udGV4dCB2YXJpYWJsZSAqLwotCi0gIC8qIGFwcGFyZW50bHksIHdlIGhhdmUgYSBfbG90XyBvZiBkaXJlY3QgaW5kZXhpbmcgd2hlbiBhY2Nlc3NpbmcgICovCi0gIC8qIHRoZSBzdGF0aWMgYGN1cicsIHdoaWNoIG1ha2VzIHRoZSBjb2RlIGJpZ2dlciAoZHVlIHRvIGFsbCB0aGUgICovCi0gIC8qIGZvdXIgYnl0ZXMgYWRkcmVzc2VzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NUQVRJQ19JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgaW5zdHJ1Y3Rpb24gYXJndW1lbnQgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElOU19BUkcgIEVYRUNfT1BfIEZUX0xvbmcqICBhcmdzICAgIC8qIHNlZSB0dG9ianMuaCBmb3IgRVhFQ19PUF8gKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtYWNybyBpcyB1c2VkIHdoZW5ldmVyIGBhcmdzJyBpcyB1bnVzZWQgaW4gYSBmdW5jdGlvbiwgdG8gYXZvaWQgICovCi0gIC8qIHN0dXBpZCB3YXJuaW5ncyBmcm9tIHBlZGFudGljIGNvbXBpbGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfVU5VU0VEX0FSRyAgRlRfVU5VU0VEX0VYRUM7IEZUX1VOVVNFRCggYXJncyApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGhpZGUgdGhlIHVzZSBvZiBFWEVDX0FSRyBhbmQgRVhFQ19BUkdfIHRvICAgICAgICAqLwotICAvKiBpbmNyZWFzZSByZWFkYWJpbGl0eSBvZiB0aGUgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgU0tJUF9Db2RlKCkgXAotICAgICAgICAgIFNraXBDb2RlKCBFWEVDX0FSRyApCi0KLSNkZWZpbmUgR0VUX1Nob3J0SW5zKCkgXAotICAgICAgICAgIEdldFNob3J0SW5zKCBFWEVDX0FSRyApCi0KLSNkZWZpbmUgTk9STWFsaXplKCB4LCB5LCB2ICkgXAotICAgICAgICAgIE5vcm1hbGl6ZSggRVhFQ19BUkdfIHgsIHksIHYgKQotCi0jZGVmaW5lIFNFVF9TdXBlclJvdW5kKCBzY2FsZSwgZmxhZ3MgKSBcCi0gICAgICAgICAgU2V0U3VwZXJSb3VuZCggRVhFQ19BUkdfIHNjYWxlLCBmbGFncyApCi0KLSNkZWZpbmUgUk9VTkRfTm9uZSggZCwgYyApIFwKLSAgICAgICAgICBSb3VuZF9Ob25lKCBFWEVDX0FSR18gZCwgYyApCi0KLSNkZWZpbmUgSU5TX0dvdG9fQ29kZVJhbmdlKCByYW5nZSwgaXAgKSBcCi0gICAgICAgICAgSW5zX0dvdG9fQ29kZVJhbmdlKCBFWEVDX0FSR18gcmFuZ2UsIGlwICkKLQotI2RlZmluZSBDVVJfRnVuY19tb3ZlKCB6LCBwLCBkICkgXAotICAgICAgICAgIENVUi5mdW5jX21vdmUoIEVYRUNfQVJHXyB6LCBwLCBkICkKLQotI2RlZmluZSBDVVJfRnVuY19tb3ZlX29yaWcoIHosIHAsIGQgKSBcCi0gICAgICAgICAgQ1VSLmZ1bmNfbW92ZV9vcmlnKCBFWEVDX0FSR18geiwgcCwgZCApCi0KLSNkZWZpbmUgQ1VSX0Z1bmNfcm91bmQoIGQsIGMgKSBcCi0gICAgICAgICAgQ1VSLmZ1bmNfcm91bmQoIEVYRUNfQVJHXyBkLCBjICkKLQotI2RlZmluZSBDVVJfRnVuY19yZWFkX2N2dCggaW5kZXggKSBcCi0gICAgICAgICAgQ1VSLmZ1bmNfcmVhZF9jdnQoIEVYRUNfQVJHXyBpbmRleCApCi0KLSNkZWZpbmUgQ1VSX0Z1bmNfd3JpdGVfY3Z0KCBpbmRleCwgdmFsICkgXAotICAgICAgICAgIENVUi5mdW5jX3dyaXRlX2N2dCggRVhFQ19BUkdfIGluZGV4LCB2YWwgKQotCi0jZGVmaW5lIENVUl9GdW5jX21vdmVfY3Z0KCBpbmRleCwgdmFsICkgXAotICAgICAgICAgIENVUi5mdW5jX21vdmVfY3Z0KCBFWEVDX0FSR18gaW5kZXgsIHZhbCApCi0KLSNkZWZpbmUgQ1VSUkVOVF9SYXRpbygpIFwKLSAgICAgICAgICBDdXJyZW50X1JhdGlvKCBFWEVDX0FSRyApCi0KLSNkZWZpbmUgQ1VSUkVOVF9QcGVtKCkgXAotICAgICAgICAgIEN1cnJlbnRfUHBlbSggRVhFQ19BUkcgKQotCi0jZGVmaW5lIENVUl9QcGVtKCkgXAotICAgICAgICAgIEN1cl9QUEVNKCBFWEVDX0FSRyApCi0KLSNkZWZpbmUgSU5TX1N4VlRMKCBhLCBiLCBjLCBkICkgXAotICAgICAgICAgIEluc19TeFZUTCggRVhFQ19BUkdfIGEsIGIsIGMsIGQgKQotCi0jZGVmaW5lIENPTVBVVEVfRnVuY3MoKSBcCi0gICAgICAgICAgQ29tcHV0ZV9GdW5jcyggRVhFQ19BUkcgKQotCi0jZGVmaW5lIENPTVBVVEVfUm91bmQoIGEgKSBcCi0gICAgICAgICAgQ29tcHV0ZV9Sb3VuZCggRVhFQ19BUkdfIGEgKQotCi0jZGVmaW5lIENPTVBVVEVfUG9pbnRfRGlzcGxhY2VtZW50KCBhLCBiLCBjLCBkICkgXAotICAgICAgICAgIENvbXB1dGVfUG9pbnRfRGlzcGxhY2VtZW50KCBFWEVDX0FSR18gYSwgYiwgYywgZCApCi0KLSNkZWZpbmUgTU9WRV9acDJfUG9pbnQoIGEsIGIsIGMsIHQgKSBcCi0gICAgICAgICAgTW92ZV9acDJfUG9pbnQoIEVYRUNfQVJHXyBhLCBiLCBjLCB0ICkKLQotCi0jZGVmaW5lIENVUl9GdW5jX3Byb2plY3QoIHYxLCB2MiApICBcCi0gICAgICAgICAgQ1VSLmZ1bmNfcHJvamVjdCggRVhFQ19BUkdfICh2MSktPnggLSAodjIpLT54LCAodjEpLT55IC0gKHYyKS0+eSApCi0KLSNkZWZpbmUgQ1VSX0Z1bmNfZHVhbHByb2ooIHYxLCB2MiApICBcCi0gICAgICAgICAgQ1VSLmZ1bmNfZHVhbHByb2ooIEVYRUNfQVJHXyAodjEpLT54IC0gKHYyKS0+eCwgKHYxKS0+eSAtICh2MiktPnkgKQotCi0jZGVmaW5lIENVUl9mYXN0X3Byb2plY3QoIHYgKSBcCi0gICAgICAgICAgQ1VSLmZ1bmNfcHJvamVjdCggRVhFQ19BUkdfICh2KS0+eCwgKHYpLT55ICkKLQotI2RlZmluZSBDVVJfZmFzdF9kdWFscHJvaiggdiApIFwKLSAgICAgICAgICBDVVIuZnVuY19kdWFscHJvaiggRVhFQ19BUkdfICh2KS0+eCwgKHYpLT55ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW5zdHJ1Y3Rpb24gZGlzcGF0Y2ggZnVuY3Rpb24sIGFzIHVzZWQgYnkgdGhlIGludGVycHJldGVyLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQgICgqVEluc3RydWN0aW9uX0Z1bmN0aW9uKSggSU5TX0FSRyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHNpbXBsZSBib3VuZHMtY2hlY2tpbmcgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEJPVU5EUyggeCwgbiApICAoIChGVF9VSW50KSh4KSA+PSAoRlRfVUludCkobikgKQotCi0jdW5kZWYgIFNVQ0NFU1MKLSNkZWZpbmUgU1VDQ0VTUyAgMAotCi0jdW5kZWYgIEZBSUxVUkUKLSNkZWZpbmUgRkFJTFVSRSAgMQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNkZWZpbmUgR1VFU1NfVkVDVE9SKCBWICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuVi54ID0gKEZUX0YyRG90MTQpKCBDVVIuR1MuYm90aF94X2F4aXMgPyAweDQwMDAgOiAwICk7IFwKLSAgICBDVVIuR1MuVi55ID0gKEZUX0YyRG90MTQpKCBDVVIuR1MuYm90aF94X2F4aXMgPyAwIDogMHg0MDAwICk7IFwKLSAgfQotI2Vsc2UKLSNkZWZpbmUgR1VFU1NfVkVDVE9SKCBWICkKLSNlbmRpZgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBDT0RFUkFOR0UgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dvdG9fQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFN3aXRjaGVzIHRvIGEgbmV3IGNvZGUgcmFuZ2UgKHVwZGF0ZXMgdGhlIGNvZGUgcmVsYXRlZCBlbGVtZW50cyBpbiAqLwotICAvKiAgICBgZXhlYycsIGFuZCBgSVAnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYW5nZSA6OiBUaGUgbmV3IGV4ZWN1dGlvbiBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElQICAgIDo6IFRoZSBuZXcgSVAgaW4gdGhlIG5ldyBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgIDo6IFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFRUX0dvdG9fQ29kZVJhbmdlKCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBJUCApCi0gIHsKLSAgICBUVF9Db2RlUmFuZ2UqICBjb2RlcmFuZ2U7Ci0KLQotICAgIEZUX0FTU0VSVCggcmFuZ2UgPj0gMSAmJiByYW5nZSA8PSAzICk7Ci0KLSAgICBjb2RlcmFuZ2UgPSAmZXhlYy0+Y29kZVJhbmdlVGFibGVbcmFuZ2UgLSAxXTsKLQotICAgIEZUX0FTU0VSVCggY29kZXJhbmdlLT5iYXNlICE9IE5VTEwgKTsKLQotICAgIC8qIE5PVEU6IEJlY2F1c2UgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgYSBwcm9ncmFtIG1heSBiZSBhIENBTEwgKi8KLSAgICAvKiAgICAgICB3aGljaCB3aWxsIHJldHVybiB0byB0aGUgZmlyc3QgYnl0ZSAqYWZ0ZXIqIHRoZSBjb2RlICAgICovCi0gICAgLyogICAgICAgcmFuZ2UsIHdlIHRlc3QgZm9yIElQIDw9IFNpemUgaW5zdGVhZCBvZiBJUCA8IFNpemUuICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9BU1NFUlQoIChGVF9VTG9uZylJUCA8PSBjb2RlcmFuZ2UtPnNpemUgKTsKLQotICAgIGV4ZWMtPmNvZGUgICAgID0gY29kZXJhbmdlLT5iYXNlOwotICAgIGV4ZWMtPmNvZGVTaXplID0gY29kZXJhbmdlLT5zaXplOwotICAgIGV4ZWMtPklQICAgICAgID0gSVA7Ci0gICAgZXhlYy0+Y3VyUmFuZ2UgPSByYW5nZTsKLQotICAgIHJldHVybiBUVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NldF9Db2RlUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldHMgYSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlICA6OiBUaGUgY29kZSByYW5nZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZSAgIDo6IFRoZSBuZXcgY29kZSBiYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIHJhbmdlIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBleGVjICAgOjogVGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9TZXRfQ29kZVJhbmdlKCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIGxlbmd0aCApCi0gIHsKLSAgICBGVF9BU1NFUlQoIHJhbmdlID49IDEgJiYgcmFuZ2UgPD0gMyApOwotCi0gICAgZXhlYy0+Y29kZVJhbmdlVGFibGVbcmFuZ2UgLSAxXS5iYXNlID0gKEZUX0J5dGUqKWJhc2U7Ci0gICAgZXhlYy0+Y29kZVJhbmdlVGFibGVbcmFuZ2UgLSAxXS5zaXplID0gbGVuZ3RoOwotCi0gICAgcmV0dXJuIFRUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfQ2xlYXJfQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xlYXJzIGEgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFuZ2UgOjogVGhlIGNvZGUgcmFuZ2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhlYyAgOjogVGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRG9lcyBub3Qgc2V0IHRoZSBFcnJvciB2YXJpYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UgKQotICB7Ci0gICAgRlRfQVNTRVJUKCByYW5nZSA+PSAxICYmIHJhbmdlIDw9IDMgKTsKLQotICAgIGV4ZWMtPmNvZGVSYW5nZVRhYmxlW3JhbmdlIC0gMV0uYmFzZSA9IE5VTEw7Ci0gICAgZXhlYy0+Y29kZVJhbmdlVGFibGVbcmFuZ2UgLSAxXS5zaXplID0gMDsKLQotICAgIHJldHVybiBUVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgRVhFQ1VUSU9OIENPTlRFWFQgUk9VVElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0RvbmVfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSB0aGUgZ2x5cGggbG9hZGVyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfRG9uZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGV4ZWMtPm1lbW9yeTsKLQotCi0gICAgLyogcG9pbnRzIHpvbmUgKi8KLSAgICBleGVjLT5tYXhQb2ludHMgICA9IDA7Ci0gICAgZXhlYy0+bWF4Q29udG91cnMgPSAwOwotCi0gICAgLyogZnJlZSBzdGFjayAqLwotICAgIEZUX0ZSRUUoIGV4ZWMtPnN0YWNrICk7Ci0gICAgZXhlYy0+c3RhY2tTaXplID0gMDsKLQotICAgIC8qIGZyZWUgY2FsbCBzdGFjayAqLwotICAgIEZUX0ZSRUUoIGV4ZWMtPmNhbGxTdGFjayApOwotICAgIGV4ZWMtPmNhbGxTaXplID0gMDsKLSAgICBleGVjLT5jYWxsVG9wICA9IDA7Ci0KLSAgICAvKiBmcmVlIGdseXBoIGNvZGUgcmFuZ2UgKi8KLSAgICBGVF9GUkVFKCBleGVjLT5nbHlwaElucyApOwotICAgIGV4ZWMtPmdseXBoU2l6ZSA9IDA7Ci0KLSAgICBleGVjLT5zaXplID0gTlVMTDsKLSAgICBleGVjLT5mYWNlID0gTlVMTDsKLQotICAgIEZUX0ZSRUUoIGV4ZWMgKTsKLQotICAgIHJldHVybiBUVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgY29udGV4dCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEluaXRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIEZUX1RSQUNFMSgoICJJbml0X0NvbnRleHQ6IG5ldyBvYmplY3QgYXQgMHglMDhwXG4iLCBleGVjICkpOwotCi0gICAgZXhlYy0+bWVtb3J5ICAgPSBtZW1vcnk7Ci0gICAgZXhlYy0+Y2FsbFNpemUgPSAzMjsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBleGVjLT5jYWxsU3RhY2ssIGV4ZWMtPmNhbGxTaXplICkgKQotICAgICAgZ290byBGYWlsX01lbW9yeTsKLQotICAgIC8qIGFsbCB2YWx1ZXMgaW4gdGhlIGNvbnRleHQgYXJlIHNldCB0byAwIGFscmVhZHksIGJ1dCB0aGlzIGlzICovCi0gICAgLyogaGVyZSBhcyBhIHJlbWFpbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBleGVjLT5tYXhQb2ludHMgICA9IDA7Ci0gICAgZXhlYy0+bWF4Q29udG91cnMgPSAwOwotCi0gICAgZXhlYy0+c3RhY2tTaXplID0gMDsKLSAgICBleGVjLT5nbHlwaFNpemUgPSAwOwotCi0gICAgZXhlYy0+c3RhY2sgICAgID0gTlVMTDsKLSAgICBleGVjLT5nbHlwaElucyAgPSBOVUxMOwotCi0gICAgZXhlYy0+ZmFjZSA9IE5VTEw7Ci0gICAgZXhlYy0+c2l6ZSA9IE5VTEw7Ci0KLSAgICByZXR1cm4gVFRfRXJyX09rOwotCi0gIEZhaWxfTWVtb3J5OgotICAgIEZUX0VSUk9SKCggIkluaXRfQ29udGV4dDogbm90IGVub3VnaCBtZW1vcnkgZm9yIDB4JTA4bHhcbiIsCi0gICAgICAgICAgICAgICAoRlRfTG9uZylleGVjICkpOwotICAgIFRUX0RvbmVfQ29udGV4dCggZXhlYyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVwZGF0ZV9NYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrcyB0aGUgc2l6ZSBvZiBhIGJ1ZmZlciBhbmQgcmVhbGxvY2F0ZXMgaXQgaWYgbmVjZXNzYXJ5LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbXVsdGlwbGllciA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGJ1ZmZlci4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXdfbWF4ICAgIDo6IFRoZSBuZXcgY2FwYWNpdHkgKHNpemUpIG9mIHRoZSBidWZmZXIuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIncyBjdXJyZW50IHNpemUgZXhwcmVzc2VkICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpbiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmICAgICAgIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgYmFzZSBwb2ludGVyLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBVcGRhdGVfTWF4KCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgRlRfVUxvbmcqICBzaXplLAotICAgICAgICAgICAgICBGVF9Mb25nICAgIG11bHRpcGxpZXIsCi0gICAgICAgICAgICAgIHZvaWQqICAgICAgX3BidWZmLAotICAgICAgICAgICAgICBGVF9VTG9uZyAgIG5ld19tYXggKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIHZvaWQqKiAgICBwYnVmZiA9ICh2b2lkKiopX3BidWZmOwotCi0KLSAgICBpZiAoICpzaXplIDwgbmV3X21heCApCi0gICAgewotICAgICAgaWYgKCBGVF9SRUFMTE9DKCAqcGJ1ZmYsICpzaXplICogbXVsdGlwbGllciwgbmV3X21heCAqIG11bHRpcGxpZXIgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgICpzaXplID0gbmV3X21heDsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQcmVwYXJlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFRUX0xvYWRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIHNpemUgKQotICB7Ci0gICAgRlRfSW50ICAgICAgICAgIGk7Ci0gICAgRlRfVUxvbmcgICAgICAgIHRtcDsKLSAgICBUVF9NYXhQcm9maWxlKiAgbWF4cDsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIGV4ZWMtPmZhY2UgPSBmYWNlOwotICAgIG1heHAgICAgICAgPSAmZmFjZS0+bWF4X3Byb2ZpbGU7Ci0gICAgZXhlYy0+c2l6ZSA9IHNpemU7Ci0KLSAgICBpZiAoIHNpemUgKQotICAgIHsKLSAgICAgIGV4ZWMtPm51bUZEZWZzICAgPSBzaXplLT5udW1fZnVuY3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPm1heEZEZWZzICAgPSBzaXplLT5tYXhfZnVuY3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPm51bUlEZWZzICAgPSBzaXplLT5udW1faW5zdHJ1Y3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPm1heElEZWZzICAgPSBzaXplLT5tYXhfaW5zdHJ1Y3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPkZEZWZzICAgICAgPSBzaXplLT5mdW5jdGlvbl9kZWZzOwotICAgICAgZXhlYy0+SURlZnMgICAgICA9IHNpemUtPmluc3RydWN0aW9uX2RlZnM7Ci0gICAgICBleGVjLT50dF9tZXRyaWNzID0gc2l6ZS0+dHRtZXRyaWNzOwotICAgICAgZXhlYy0+bWV0cmljcyAgICA9IHNpemUtPm1ldHJpY3M7Ci0KLSAgICAgIGV4ZWMtPm1heEZ1bmMgICAgPSBzaXplLT5tYXhfZnVuYzsKLSAgICAgIGV4ZWMtPm1heElucyAgICAgPSBzaXplLT5tYXhfaW5zOwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IFRUX01BWF9DT0RFX1JBTkdFUzsgaSsrICkKLSAgICAgICAgZXhlYy0+Y29kZVJhbmdlVGFibGVbaV0gPSBzaXplLT5jb2RlUmFuZ2VUYWJsZVtpXTsKLQotICAgICAgLyogc2V0IGdyYXBoaWNzIHN0YXRlICovCi0gICAgICBleGVjLT5HUyA9IHNpemUtPkdTOwotCi0gICAgICBleGVjLT5jdnRTaXplID0gc2l6ZS0+Y3Z0X3NpemU7Ci0gICAgICBleGVjLT5jdnQgICAgID0gc2l6ZS0+Y3Z0OwotCi0gICAgICBleGVjLT5zdG9yZVNpemUgPSBzaXplLT5zdG9yYWdlX3NpemU7Ci0gICAgICBleGVjLT5zdG9yYWdlICAgPSBzaXplLT5zdG9yYWdlOwotCi0gICAgICBleGVjLT50d2lsaWdodCAgPSBzaXplLT50d2lsaWdodDsKLSAgICB9Ci0KLSAgICAvKiBYWFg6IFdlIHJlc2VydmUgYSBsaXR0bGUgbW9yZSBlbGVtZW50cyBvbiB0aGUgc3RhY2sgdG8gZGVhbCBzYWZlbHkgKi8KLSAgICAvKiAgICAgIHdpdGggYnJva2VuIGZvbnRzIGxpa2UgYXJpYWxicywgY291cmJzLCB0aW1lc2JzLCBldGMuICAgICAgICAgKi8KLSAgICB0bXAgPSBleGVjLT5zdGFja1NpemU7Ci0gICAgZXJyb3IgPSBVcGRhdGVfTWF4KCBleGVjLT5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAmdG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRlRfRjI2RG90NiApLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZleGVjLT5zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heHAtPm1heFN0YWNrRWxlbWVudHMgKyAzMiApOwotICAgIGV4ZWMtPnN0YWNrU2l6ZSA9IChGVF9VSW50KXRtcDsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHRtcCA9IGV4ZWMtPmdseXBoU2l6ZTsKLSAgICBlcnJvciA9IFVwZGF0ZV9NYXgoIGV4ZWMtPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGVF9CeXRlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJmV4ZWMtPmdseXBoSW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgbWF4cC0+bWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zICk7Ci0gICAgZXhlYy0+Z2x5cGhTaXplID0gKEZUX1VTaG9ydCl0bXA7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBleGVjLT5wdHMubl9wb2ludHMgICA9IDA7Ci0gICAgZXhlYy0+cHRzLm5fY29udG91cnMgPSAwOwotCi0gICAgZXhlYy0+enAxID0gZXhlYy0+cHRzOwotICAgIGV4ZWMtPnpwMiA9IGV4ZWMtPnB0czsKLSAgICBleGVjLT56cDAgPSBleGVjLT5wdHM7Ci0KLSAgICBleGVjLT5pbnN0cnVjdGlvbl90cmFwID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TYXZlX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTYXZlcyB0aGUgY29kZSByYW5nZXMgaW4gYSBgc2l6ZScgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBleGVjIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9TYXZlX0NvbnRleHQoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgIFRUX1NpemUgICAgICAgICBzaXplICkKLSAgewotICAgIEZUX0ludCAgaTsKLQotCi0gICAgLyogWFhYWDogV2lsbCBwcm9iYWJseSBkaXNhcHBlYXIgc29vbiB3aXRoIGFsbCB0aGUgY29kZSByYW5nZSAqLwotICAgIC8qICAgICAgIG1hbmFnZW1lbnQsIHdoaWNoIGlzIG5vdyByYXRoZXIgb2Jzb2xldGUuICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc2l6ZS0+bnVtX2Z1bmN0aW9uX2RlZnMgICAgPSBleGVjLT5udW1GRGVmczsKLSAgICBzaXplLT5udW1faW5zdHJ1Y3Rpb25fZGVmcyA9IGV4ZWMtPm51bUlEZWZzOwotCi0gICAgc2l6ZS0+bWF4X2Z1bmMgPSBleGVjLT5tYXhGdW5jOwotICAgIHNpemUtPm1heF9pbnMgID0gZXhlYy0+bWF4SW5zOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBUVF9NQVhfQ09ERV9SQU5HRVM7IGkrKyApCi0gICAgICBzaXplLT5jb2RlUmFuZ2VUYWJsZVtpXSA9IGV4ZWMtPmNvZGVSYW5nZVRhYmxlW2ldOwotCi0gICAgcmV0dXJuIFRUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUnVuX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXhlY3V0ZXMgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBleGVjdXRpb24gY29udGV4dC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVidWcgOjogQSBCb29sZWFuIGZsYWcuICBJZiBzZXQsIHRoZSBmdW5jdGlvbiBzZXRzIHNvbWUgaW50ZXJuYWwgICovCi0gIC8qICAgICAgICAgICAgIHZhcmlhYmxlcyBhbmQgcmV0dXJucyBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIFRUX1J1bklucygpICAqLwotICAvKiAgICAgICAgICAgICBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgIFRoaXMgaXMgY29tbWVudGVkIG91dCBjdXJyZW50bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeW9lIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFRUX1J1bl9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZWJ1ZyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGlmICggKCBlcnJvciA9IFRUX0dvdG9fQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfZ2x5cGgsIDAgICkgKQotICAgICAgICAgICAhPSBUVF9FcnJfT2sgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZXhlYy0+enAwID0gZXhlYy0+cHRzOwotICAgIGV4ZWMtPnpwMSA9IGV4ZWMtPnB0czsKLSAgICBleGVjLT56cDIgPSBleGVjLT5wdHM7Ci0KLSAgICBleGVjLT5HUy5nZXAwID0gMTsKLSAgICBleGVjLT5HUy5nZXAxID0gMTsKLSAgICBleGVjLT5HUy5nZXAyID0gMTsKLQotICAgIGV4ZWMtPkdTLnByb2pWZWN0b3IueCA9IDB4NDAwMDsKLSAgICBleGVjLT5HUy5wcm9qVmVjdG9yLnkgPSAweDAwMDA7Ci0KLSAgICBleGVjLT5HUy5mcmVlVmVjdG9yID0gZXhlYy0+R1MucHJvalZlY3RvcjsKLSAgICBleGVjLT5HUy5kdWFsVmVjdG9yID0gZXhlYy0+R1MucHJvalZlY3RvcjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgZXhlYy0+R1MuYm90aF94X2F4aXMgPSBUUlVFOwotI2VuZGlmCi0KLSAgICBleGVjLT5HUy5yb3VuZF9zdGF0ZSA9IDE7Ci0gICAgZXhlYy0+R1MubG9vcCAgICAgICAgPSAxOwotCi0gICAgLyogc29tZSBnbHlwaHMgbGVhdmUgc29tZXRoaW5nIG9uIHRoZSBzdGFjay4gc28gd2UgY2xlYW4gaXQgKi8KLSAgICAvKiBiZWZvcmUgYSBuZXcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGV4ZWMtPnRvcCAgICAgPSAwOwotICAgIGV4ZWMtPmNhbGxUb3AgPSAwOwotCi0jaWYgMQotICAgIEZUX1VOVVNFRCggZGVidWcgKTsKLQotICAgIHJldHVybiBleGVjLT5mYWNlLT5pbnRlcnByZXRlciggZXhlYyApOwotI2Vsc2UKLSAgICBpZiAoICFkZWJ1ZyApCi0gICAgICByZXR1cm4gVFRfUnVuSW5zKCBleGVjICk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIFRUX0Vycl9PazsKLSNlbmRpZgotICB9Ci0KLQotICBjb25zdCBUVF9HcmFwaGljc1N0YXRlICB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlID0KLSAgewotICAgIDAsIDAsIDAsCi0gICAgeyAweDQwMDAsIDAgfSwKLSAgICB7IDB4NDAwMCwgMCB9LAotICAgIHsgMHg0MDAwLCAwIH0sCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIFRSVUUsCi0jZW5kaWYKLQotICAgIDEsIDY0LCAxLAotICAgIFRSVUUsIDY4LCAwLCAwLCA5LCAzLAotICAgIDAsIEZBTFNFLCAyLCAxLCAxLCAxCi0gIH07Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHR0aW50ZXJwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBUVF9FeGVjQ29udGV4dCApCi0gIFRUX05ld19Db250ZXh0KCBUVF9Ecml2ZXIgIGRyaXZlciApCi0gIHsKLSAgICBUVF9FeGVjQ29udGV4dCAgZXhlYzsKLSAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5OwotCi0KLSAgICBtZW1vcnkgPSBkcml2ZXItPnJvb3Qucm9vdC5tZW1vcnk7Ci0gICAgZXhlYyAgID0gZHJpdmVyLT5jb250ZXh0OwotCi0gICAgaWYgKCAhZHJpdmVyLT5jb250ZXh0ICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgICAgLyogYWxsb2NhdGUgb2JqZWN0ICovCi0gICAgICBpZiAoIEZUX05FVyggZXhlYyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBpbml0aWFsaXplIGl0ICovCi0gICAgICBlcnJvciA9IEluaXRfQ29udGV4dCggZXhlYywgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBzdG9yZSBpdCBpbnRvIHRoZSBkcml2ZXIgKi8KLSAgICAgIGRyaXZlci0+Y29udGV4dCA9IGV4ZWM7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGRyaXZlci0+Y29udGV4dDsKLQotICBGYWlsOgotICAgIEZUX0ZSRUUoIGV4ZWMgKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJlZm9yZSBhbiBvcGNvZGUgaXMgZXhlY3V0ZWQsIHRoZSBpbnRlcnByZXRlciB2ZXJpZmllcyB0aGF0IHRoZXJlIGFyZSAqLwotICAvKiBlbm91Z2ggYXJndW1lbnRzIG9uIHRoZSBzdGFjaywgd2l0aCB0aGUgaGVscCBvZiB0aGUgYFBvcF9QdXNoX0NvdW50JyAgKi8KLSAgLyogdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3IgZWFjaCBvcGNvZGUsIHRoZSBmaXJzdCBjb2x1bW4gZ2l2ZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhhdCAgKi8KLSAgLyogYXJlIHBvcHBlZCBmcm9tIHRoZSBzdGFjazsgdGhlIHNlY29uZCBvbmUgZ2l2ZXMgdGhlIG51bWJlciBvZiB0aG9zZSAgICovCi0gIC8qIHRoYXQgYXJlIHB1c2hlZCBpbiByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlcyB3aGljaCBoYXZlIGEgdmFyeWluZyBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgZGF0YSBzdHJlYW0gICovCi0gIC8qIChOUFVTSEIsIE5QVVNIVykgYXJlIGhhbmRsZWQgc3BlY2lhbGx5OyB0aGV5IGhhdmUgYSBuZWdhdGl2ZSB2YWx1ZSBpbiAqLwotICAvKiB0aGUgYG9wY29kZV9sZW5ndGgnIHRhYmxlLCBhbmQgdGhlIHZhbHVlIGluIGBQb3BfUHVzaF9Db3VudCcgaXMgc2V0ICAgKi8KLSAgLyogdG8gemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIFBBQ0sKLSNkZWZpbmUgUEFDSyggeCwgeSApICAoICggeCA8PCA0ICkgfCB5ICkKLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9CeXRlICBQb3BfUHVzaF9Db3VudFsyNTZdID0KLSAgewotICAgIC8qIG9wY29kZXMgYXJlIGdhdGhlcmVkIGluIGdyb3VwcyBvZiAxNiAqLwotICAgIC8qIHBsZWFzZSBrZWVwIHRoZSBzcGFjZXMgYXMgdGhleSBhcmUgICAqLwotCi0gICAgLyogIFNWVENBICB5ICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTVlRDQSAgeCAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU1B2VENBIHkgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNQdlRDQSB4ICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTRnZUQ0EgeSAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU0Z2VENBIHggICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNQdlRMIC8vICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTUHZUTCArICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgU0Z2VEwgLy8gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNGdlRMICsgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTUHZGUyAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgU0Z2RlMgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIEdQViAgICAgICAqLyAgUEFDSyggMCwgMiApLAotICAgIC8qICBHRlYgICAgICAgKi8gIFBBQ0soIDAsIDIgKSwKLSAgICAvKiAgU0Z2VFB2ICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIElTRUNUICAgICAqLyAgUEFDSyggNSwgMCApLAotCi0gICAgLyogIFNSUDAgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTUlAxICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1JQMiAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNaUDAgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTWlAxICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1pQMiAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNaUFMgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTTE9PUCAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgUlRHICAgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFJUSEcgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTTUQgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRUxTRSAgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIEpNUFIgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTQ3ZUQ2kgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1N3Q2kgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNTVyAgICAgICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIERVUCAgICAgICAqLyAgUEFDSyggMSwgMiApLAotICAgIC8qICBQT1AgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgQ0xFQVIgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNXQVAgICAgICAqLyAgUEFDSyggMiwgMiApLAotICAgIC8qICBERVBUSCAgICAgKi8gIFBBQ0soIDAsIDEgKSwKLSAgICAvKiAgQ0lOREVYICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIE1JTkRFWCAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBBbGlnblBUUyAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgSU5TXyQyOCAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFVUUCAgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBMT09QQ0FMTCAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgQ0FMTCAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIEZERUYgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBFTkRGICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgTURBUFswXSAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EQVBbMV0gICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIElVUFswXSAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBJVVBbMV0gICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU0hQWzBdICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNIUFsxXSAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTSENbMF0gICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0hDWzFdICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNIWlswXSAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTSFpbMV0gICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0hQSVggICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIElQICAgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBNU0lSUFswXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTVNJUlBbMV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIEFsaWduUlAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBSVERHICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgTUlBUFswXSAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JQVBbMV0gICAqLyAgUEFDSyggMiwgMCApLAotCi0gICAgLyogIE5QdXNoQiAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBOUHVzaFcgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgV1MgICAgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFJTICAgICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBXQ3Z0UCAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgUkN2dCAgICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIEdDWzBdICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBHQ1sxXSAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgU0NGUyAgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1EWzBdICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBNRFsxXSAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgTVBQRU0gICAgICovICBQQUNLKCAwLCAxICksCi0gICAgLyogIE1QUyAgICAgICAqLyAgUEFDSyggMCwgMSApLAotICAgIC8qICBGbGlwT04gICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgRmxpcE9GRiAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIERFQlVHICAgICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIExUICAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBMVEVRICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgR1QgICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIEdURVEgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBFUSAgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgTkVRICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE9ERCAgICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBFVkVOICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgSUYgICAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIEVJRiAgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBBTkQgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgT1IgICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE5PVCAgICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBEZWx0YVAxICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0RCICAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNEUyAgICAgICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIEFERCAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBTVUIgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgRElWICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE1VTCAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBBQlMgICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgTkVHICAgICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIEZMT09SICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBDRUlMSU5HICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgUk9VTkRbMF0gICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIFJPVU5EWzFdICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBST1VORFsyXSAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgUk9VTkRbM10gICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIE5ST1VORFswXSAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBOUk9VTkRbMV0gKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgTlJPVU5EWzJdICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIE5ST1VORFszXSAqLyAgUEFDSyggMSwgMSApLAotCi0gICAgLyogIFdDdnRGICAgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBEZWx0YVAyICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRGVsdGFQMyAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIERlbHRhQ25bMF0gKi8gUEFDSyggMSwgMCApLAotICAgIC8qICBEZWx0YUNuWzFdICovIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRGVsdGFDblsyXSAqLyBQQUNLKCAxLCAwICksCi0gICAgLyogIFNST1VORCAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTNDVSb3VuZCAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgSlJPVCAgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIEpST0YgICAgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBST0ZGICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ3QiAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFJVVEcgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBSRFRHICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU0FOR1cgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIEFBICAgICAgICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIEZsaXBQVCAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBGbGlwUmdPTiAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgRmxpcFJnT0ZGICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIElOU18kODMgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDg0ICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU2NhbkNUUkwgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNEVlBUTFswXSAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTRFZQVExbMV0gKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgR2V0SU5GTyAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIElERUYgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBST0xMICAgICAgKi8gIFBBQ0soIDMsIDMgKSwKLSAgICAvKiAgTUFYICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE1JTiAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBTY2FuVFlQRSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgSW5zdENUUkwgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIElOU18kOEYgICAqLyAgUEFDSyggMCwgMCApLAotCi0gICAgLyogIElOU18kOTAgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDkxICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5MiAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOTMgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDk0ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5NSAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOTYgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDk3ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5OCAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOTkgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDlBICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5QiAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOUMgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDlEICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5RSAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOUYgICovICAgUEFDSyggMCwgMCApLAotCi0gICAgLyogIElOU18kQTAgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEExICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBMiAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTMgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEE0ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBNSAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTYgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEE3ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBOCAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTkgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEFBICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBQiAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQUMgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEFEICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBRSAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQUYgICovICAgUEFDSyggMCwgMCApLAotCi0gICAgLyogIFB1c2hCWzBdICAqLyAgUEFDSyggMCwgMSApLAotICAgIC8qICBQdXNoQlsxXSAgKi8gIFBBQ0soIDAsIDIgKSwKLSAgICAvKiAgUHVzaEJbMl0gICovICBQQUNLKCAwLCAzICksCi0gICAgLyogIFB1c2hCWzNdICAqLyAgUEFDSyggMCwgNCApLAotICAgIC8qICBQdXNoQls0XSAgKi8gIFBBQ0soIDAsIDUgKSwKLSAgICAvKiAgUHVzaEJbNV0gICovICBQQUNLKCAwLCA2ICksCi0gICAgLyogIFB1c2hCWzZdICAqLyAgUEFDSyggMCwgNyApLAotICAgIC8qICBQdXNoQls3XSAgKi8gIFBBQ0soIDAsIDggKSwKLSAgICAvKiAgUHVzaFdbMF0gICovICBQQUNLKCAwLCAxICksCi0gICAgLyogIFB1c2hXWzFdICAqLyAgUEFDSyggMCwgMiApLAotICAgIC8qICBQdXNoV1syXSAgKi8gIFBBQ0soIDAsIDMgKSwKLSAgICAvKiAgUHVzaFdbM10gICovICBQQUNLKCAwLCA0ICksCi0gICAgLyogIFB1c2hXWzRdICAqLyAgUEFDSyggMCwgNSApLAotICAgIC8qICBQdXNoV1s1XSAgKi8gIFBBQ0soIDAsIDYgKSwKLSAgICAvKiAgUHVzaFdbNl0gICovICBQQUNLKCAwLCA3ICksCi0gICAgLyogIFB1c2hXWzddICAqLyAgUEFDSyggMCwgOCApLAotCi0gICAgLyogIE1EUlBbMDBdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzAxXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswMl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDNdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzA0XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswNV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDZdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzA3XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswOF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDldICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzEwXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxMV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTJdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzEzXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxNF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTVdICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIE1EUlBbMTZdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzE3XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxOF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTldICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzIwXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyMV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjJdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzIzXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyNF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjVdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzI2XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyN10gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjhdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzI5XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFszMF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMzFdICAqLyAgUEFDSyggMSwgMCApLAotCi0gICAgLyogIE1JUlBbMDBdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzAxXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswMl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDNdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzA0XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswNV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDZdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzA3XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswOF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDldICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzEwXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxMV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTJdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzEzXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxNF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTVdICAqLyAgUEFDSyggMiwgMCApLAotCi0gICAgLyogIE1JUlBbMTZdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzE3XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxOF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTldICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzIwXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyMV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjJdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzIzXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyNF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjVdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzI2XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyN10gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjhdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzI5XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFszMF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMzFdICAqLyAgUEFDSyggMiwgMCApCi0gIH07Ci0KLQotICBzdGF0aWMKLSAgY29uc3QgRlRfQ2hhciAgb3Bjb2RlX2xlbmd0aFsyNTZdID0KLSAgewotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0KLSAgIC0xLC0yLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMiwgMywgNCwgNSwgIDYsIDcsIDgsIDksICAzLCA1LCA3LCA5LCAxMSwxMywxNSwxNywKLQotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEKLSAgfTsKLQotI3VuZGVmIFBBQ0sKLQotI2lmIDEKLQotICBzdGF0aWMgRlRfSW50MzIKLSAgVFRfTXVsRml4MTQoIEZUX0ludDMyICBhLAotICAgICAgICAgICAgICAgRlRfSW50ICAgIGIgKQotICB7Ci0gICAgRlRfSW50MzIgICBzaWduOwotICAgIEZUX1VJbnQzMiAgYWgsIGFsLCBtaWQsIGxvLCBoaTsKLQotCi0gICAgc2lnbiA9IGEgXiBiOwotCi0gICAgaWYgKCBhIDwgMCApCi0gICAgICBhID0gLWE7Ci0gICAgaWYgKCBiIDwgMCApCi0gICAgICBiID0gLWI7Ci0KLSAgICBhaCA9IChGVF9VSW50MzIpKCAoIGEgPj4gMTYgKSAmIDB4RkZGRlUgKTsKLSAgICBhbCA9IChGVF9VSW50MzIpKCBhICYgMHhGRkZGVSApOwotCi0gICAgbG8gICAgPSBhbCAqIGI7Ci0gICAgbWlkICAgPSBhaCAqIGI7Ci0gICAgaGkgICAgPSBtaWQgPj4gMTY7Ci0gICAgbWlkICAgPSAoIG1pZCA8PCAxNiApICsgKCAxIDw8IDEzICk7IC8qIHJvdW5kaW5nICovCi0gICAgbG8gICArPSBtaWQ7Ci0gICAgaWYgKCBsbyA8IG1pZCApCi0gICAgICBoaSArPSAxOwotCi0gICAgbWlkID0gKCBsbyA+PiAxNCApIHwgKCBoaSA8PCAxOCApOwotCi0gICAgcmV0dXJuIHNpZ24gPj0gMCA/IChGVF9JbnQzMiltaWQgOiAtKEZUX0ludDMyKW1pZDsKLSAgfQotCi0jZWxzZQotCi0gIC8qIGNvbXB1dGUgKGEqYikvMl4xNCB3aXRoIG1heGltYWwgYWNjdXJhY3kgYW5kIHJvdW5kaW5nICovCi0gIHN0YXRpYyBGVF9JbnQzMgotICBUVF9NdWxGaXgxNCggRlRfSW50MzIgIGEsCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgYiApCi0gIHsKLSAgICBGVF9JbnQzMiAgIG0sIHMsIGhpOwotICAgIEZUX1VJbnQzMiAgbCwgbG87Ci0KLQotICAgIC8qIGNvbXB1dGUgYXgqYnggYXMgNjQtYml0IHZhbHVlICovCi0gICAgbCAgPSAoRlRfVUludDMyKSggKCBhICYgMHhGRkZGVSApICogYiApOwotICAgIG0gID0gKCBhID4+IDE2ICkgKiBiOwotCi0gICAgbG8gPSBsICsgKEZUX1VJbnQzMikoIG0gPDwgMTYgKTsKLSAgICBoaSA9ICggbSA+PiAxNiApICsgKCAoRlRfSW50MzIpbCA+PiAzMSApICsgKCBsbyA8IGwgKTsKLQotICAgIC8qIGRpdmlkZSB0aGUgcmVzdWx0IGJ5IDJeMTQgd2l0aCByb3VuZGluZyAqLwotICAgIHMgICA9IGhpID4+IDMxOwotICAgIGwgICA9IGxvICsgKEZUX1VJbnQzMilzOwotICAgIGhpICs9IHMgKyAoIGwgPCBsbyApOwotICAgIGxvICA9IGw7Ci0KLSAgICBsICAgPSBsbyArIDB4MjAwMFU7Ci0gICAgaGkgKz0gbCA8IGxvOwotCi0gICAgcmV0dXJuICggaGkgPDwgMTggKSB8ICggbCA+PiAxNCApOwotICB9Ci0jZW5kaWYKLQotCi0gIC8qIGNvbXB1dGUgKGF4KmJ4K2F5KmJ5KS8yXjE0IHdpdGggbWF4aW1hbCBhY2N1cmFjeSBhbmQgcm91bmRpbmcgKi8KLSAgc3RhdGljIEZUX0ludDMyCi0gIFRUX0RvdEZpeDE0KCBGVF9JbnQzMiAgYXgsCi0gICAgICAgICAgICAgICBGVF9JbnQzMiAgYXksCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgYngsCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgYnkgKQotICB7Ci0gICAgRlRfSW50MzIgICBtLCBzLCBoaTEsIGhpMiwgaGk7Ci0gICAgRlRfVUludDMyICBsLCBsbzEsIGxvMiwgbG87Ci0KLQotICAgIC8qIGNvbXB1dGUgYXgqYnggYXMgNjQtYml0IHZhbHVlICovCi0gICAgbCA9IChGVF9VSW50MzIpKCAoIGF4ICYgMHhGRkZGVSApICogYnggKTsKLSAgICBtID0gKCBheCA+PiAxNiApICogYng7Ci0KLSAgICBsbzEgPSBsICsgKEZUX1VJbnQzMikoIG0gPDwgMTYgKTsKLSAgICBoaTEgPSAoIG0gPj4gMTYgKSArICggKEZUX0ludDMyKWwgPj4gMzEgKSArICggbG8xIDwgbCApOwotCi0gICAgLyogY29tcHV0ZSBheSpieSBhcyA2NC1iaXQgdmFsdWUgKi8KLSAgICBsID0gKEZUX1VJbnQzMikoICggYXkgJiAweEZGRkZVICkgKiBieSApOwotICAgIG0gPSAoIGF5ID4+IDE2ICkgKiBieTsKLQotICAgIGxvMiA9IGwgKyAoRlRfVUludDMyKSggbSA8PCAxNiApOwotICAgIGhpMiA9ICggbSA+PiAxNiApICsgKCAoRlRfSW50MzIpbCA+PiAzMSApICsgKCBsbzIgPCBsICk7Ci0KLSAgICAvKiBhZGQgdGhlbSAqLwotICAgIGxvID0gbG8xICsgbG8yOwotICAgIGhpID0gaGkxICsgaGkyICsgKCBsbyA8IGxvMSApOwotCi0gICAgLyogZGl2aWRlIHRoZSByZXN1bHQgYnkgMl4xNCB3aXRoIHJvdW5kaW5nICovCi0gICAgcyAgID0gaGkgPj4gMzE7Ci0gICAgbCAgID0gbG8gKyAoRlRfVUludDMyKXM7Ci0gICAgaGkgKz0gcyArICggbCA8IGxvICk7Ci0gICAgbG8gID0gbDsKLQotICAgIGwgICA9IGxvICsgMHgyMDAwVTsKLSAgICBoaSArPSAoIGwgPCBsbyApOwotCi0gICAgcmV0dXJuICggaGkgPDwgMTggKSB8ICggbCA+PiAxNCApOwotICB9Ci0KLQotICAvKiByZXR1cm4gbGVuZ3RoIG9mIGdpdmVuIHZlY3RvciAqLwotCi0jaWYgMAotCi0gIHN0YXRpYyBGVF9JbnQzMgotICBUVF9WZWNMZW4oIEZUX0ludDMyICB4LAotICAgICAgICAgICAgIEZUX0ludDMyICB5ICkKLSAgewotICAgIEZUX0ludDMyICAgbSwgaGkxLCBoaTIsIGhpOwotICAgIEZUX1VJbnQzMiAgbCwgbG8xLCBsbzIsIGxvOwotCi0KLSAgICAvKiBjb21wdXRlIHgqeCBhcyA2NC1iaXQgdmFsdWUgKi8KLSAgICBsbyA9IChGVF9VSW50MzIpKCB4ICYgMHhGRkZGVSApOwotICAgIGhpID0geCA+PiAxNjsKLQotICAgIGwgID0gbG8gKiBsbzsKLSAgICBtICA9IGhpICogbG87Ci0gICAgaGkgPSBoaSAqIGhpOwotCi0gICAgbG8xID0gbCArIChGVF9VSW50MzIpKCBtIDw8IDE3ICk7Ci0gICAgaGkxID0gaGkgKyAoIG0gPj4gMTUgKSArICggbG8xIDwgbCApOwotCi0gICAgLyogY29tcHV0ZSB5KnkgYXMgNjQtYml0IHZhbHVlICovCi0gICAgbG8gPSAoRlRfVUludDMyKSggeSAmIDB4RkZGRlUgKTsKLSAgICBoaSA9IHkgPj4gMTY7Ci0KLSAgICBsICA9IGxvICogbG87Ci0gICAgbSAgPSBoaSAqIGxvOwotICAgIGhpID0gaGkgKiBoaTsKLQotICAgIGxvMiA9IGwgKyAoRlRfVUludDMyKSggbSA8PCAxNyApOwotICAgIGhpMiA9IGhpICsgKCBtID4+IDE1ICkgKyAoIGxvMiA8IGwgKTsKLQotICAgIC8qIGFkZCB0aGVtIHRvIGdldCAneCp4K3kqeScgYXMgNjQtYml0IHZhbHVlICovCi0gICAgbG8gPSBsbzEgKyBsbzI7Ci0gICAgaGkgPSBoaTEgKyBoaTIgKyAoIGxvIDwgbG8xICk7Ci0KLSAgICAvKiBjb21wdXRlIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGlzIHZhbHVlICovCi0gICAgewotICAgICAgRlRfVUludDMyICByb290LCByZW0sIHRlc3RfZGl2OwotICAgICAgRlRfSW50ICAgICBjb3VudDsKLQotCi0gICAgICByb290ID0gMDsKLQotICAgICAgewotICAgICAgICByZW0gICA9IDA7Ci0gICAgICAgIGNvdW50ID0gMzI7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICByZW0gICAgICA9ICggcmVtIDw8IDIgKSB8ICggKEZUX1VJbnQzMiloaSA+PiAzMCApOwotICAgICAgICAgIGhpICAgICAgID0gKCAgaGkgPDwgMiApIHwgKCAgICAgICAgICAgIGxvID4+IDMwICk7Ci0gICAgICAgICAgbG8gICAgIDw8PSAyOwotICAgICAgICAgIHJvb3QgICA8PD0gMTsKLSAgICAgICAgICB0ZXN0X2RpdiA9ICggcm9vdCA8PCAxICkgKyAxOwotCi0gICAgICAgICAgaWYgKCByZW0gPj0gdGVzdF9kaXYgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbSAgLT0gdGVzdF9kaXY7Ci0gICAgICAgICAgICByb290ICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICggLS1jb3VudCApOwotICAgICAgfQotCi0gICAgICByZXR1cm4gKEZUX0ludDMyKXJvb3Q7Ci0gICAgfQotICB9Ci0KLSNlbHNlCi0KLSAgLyogdGhpcyB2ZXJzaW9uIHVzZXMgRlRfVmVjdG9yX0xlbmd0aCB3aGljaCBjb21wdXRlcyB0aGUgc2FtZSB2YWx1ZSAqLwotICAvKiBtdWNoLCBtdWNoIGZhc3Rlci4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgVFRfVmVjTGVuKCBGVF9GMjZEb3Q2ICBYLAotICAgICAgICAgICAgIEZUX0YyNkRvdDYgIFkgKQotICB7Ci0gICAgRlRfVmVjdG9yICB2OwotCi0KLSAgICB2LnggPSBYOwotICAgIHYueSA9IFk7Ci0KLSAgICByZXR1cm4gRlRfVmVjdG9yX0xlbmd0aCggJnYgKTsKLSAgfQotCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEN1cnJlbnRfUmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybnMgdGhlIGN1cnJlbnQgYXNwZWN0IHJhdGlvIHNjYWxpbmcgZmFjdG9yIGRlcGVuZGluZyBvbiB0aGUgICAqLwotICAvKiAgICBwcm9qZWN0aW9uIHZlY3RvcidzIHN0YXRlIGFuZCBkZXZpY2UgcmVzb2x1dGlvbnMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYXNwZWN0IHJhdGlvIGluIDE2LjE2IGZvcm1hdCwgYWx3YXlzIDw9IDEuMCAuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9Mb25nCi0gIEN1cnJlbnRfUmF0aW8oIEVYRUNfT1AgKQotICB7Ci0gICAgaWYgKCAhQ1VSLnR0X21ldHJpY3MucmF0aW8gKQotICAgIHsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgICAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIuR1MuYm90aF94X2F4aXMgKQotICAgICAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gQ1VSLnR0X21ldHJpY3MueF9yYXRpbzsKLSAgICAgICAgZWxzZQotICAgICAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gQ1VSLnR0X21ldHJpY3MueV9yYXRpbzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgICBpZiAoIENVUi5HUy5wcm9qVmVjdG9yLnkgPT0gMCApCi0gICAgICAgICAgQ1VSLnR0X21ldHJpY3MucmF0aW8gPSBDVVIudHRfbWV0cmljcy54X3JhdGlvOwotCi0gICAgICAgIGVsc2UgaWYgKCBDVVIuR1MucHJvalZlY3Rvci54ID09IDAgKQotICAgICAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gQ1VSLnR0X21ldHJpY3MueV9yYXRpbzsKLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Mb25nICB4LCB5OwotCi0KLSAgICAgICAgICB4ID0gVFRfTVVMRElWKCBDVVIuR1MucHJvalZlY3Rvci54LAotICAgICAgICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLnhfcmF0aW8sIDB4NDAwMCApOwotICAgICAgICAgIHkgPSBUVF9NVUxESVYoIENVUi5HUy5wcm9qVmVjdG9yLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MueV9yYXRpbywgMHg0MDAwICk7Ci0gICAgICAgICAgQ1VSLnR0X21ldHJpY3MucmF0aW8gPSBUVF9WZWNMZW4oIHgsIHkgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ1VSLnR0X21ldHJpY3MucmF0aW87Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Mb25nCi0gIEN1cnJlbnRfUHBlbSggRVhFQ19PUCApCi0gIHsKLSAgICByZXR1cm4gVFRfTVVMRklYKCBDVVIudHRfbWV0cmljcy5wcGVtLCBDVVJSRU5UX1JhdGlvKCkgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSAoQ1ZUKS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9GMjZEb3Q2ICkKLSAgUmVhZF9DVlQoIEVYRUNfT1BfIEZUX1VMb25nICBpZHggKQotICB7Ci0gICAgcmV0dXJuIENVUi5jdnRbaWR4XTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9GMjZEb3Q2ICkKLSAgUmVhZF9DVlRfU3RyZXRjaGVkKCBFWEVDX09QXyBGVF9VTG9uZyAgaWR4ICkKLSAgewotICAgIHJldHVybiBUVF9NVUxGSVgoIENVUi5jdnRbaWR4XSwgQ1VSUkVOVF9SYXRpbygpICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIFdyaXRlX0NWVCggRVhFQ19PUF8gRlRfVUxvbmcgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHZhbHVlICkKLSAgewotICAgIENVUi5jdnRbaWR4XSA9IHZhbHVlOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBXcml0ZV9DVlRfU3RyZXRjaGVkKCBFWEVDX09QXyBGVF9VTG9uZyAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHZhbHVlICkKLSAgewotICAgIENVUi5jdnRbaWR4XSA9IEZUX0RpdkZpeCggdmFsdWUsIENVUlJFTlRfUmF0aW8oKSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBNb3ZlX0NWVCggRVhFQ19PUF8gRlRfVUxvbmcgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgdmFsdWUgKQotICB7Ci0gICAgQ1VSLmN2dFtpZHhdICs9IHZhbHVlOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBNb3ZlX0NWVF9TdHJldGNoZWQoIEVYRUNfT1BfIEZUX1VMb25nICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB2YWx1ZSApCi0gIHsKLSAgICBDVVIuY3Z0W2lkeF0gKz0gRlRfRGl2Rml4KCB2YWx1ZSwgQ1VSUkVOVF9SYXRpbygpICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldFNob3J0SW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybnMgYSBzaG9ydCBpbnRlZ2VyIHRha2VuIGZyb20gdGhlIGluc3RydWN0aW9uIHN0cmVhbSBhdCAgICAgICAqLwotICAvKiAgICBhZGRyZXNzIElQLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaG9ydCByZWFkIGF0IGNvZGVbSVBdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG9uZSBjb3VsZCBiZWNvbWUgYSBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9TaG9ydAotICBHZXRTaG9ydElucyggRVhFQ19PUCApCi0gIHsKLSAgICAvKiBSZWFkaW5nIGEgYnl0ZSBzdHJlYW0gc28gdGhlcmUgaXMgbm8gZW5kaWFuZXNzIChEYXZlUCkgKi8KLSAgICBDVVIuSVAgKz0gMjsKLSAgICByZXR1cm4gKEZUX1Nob3J0KSggKCBDVVIuY29kZVtDVVIuSVAgLSAyXSA8PCA4ICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5jb2RlW0NVUi5JUCAtIDFdICAgICAgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zX0dvdG9fQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR29lcyB0byBhIGNlcnRhaW4gY29kZSByYW5nZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYVJhbmdlIDo6IFRoZSBpbmRleCBvZiB0aGUgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhSVAgICAgOjogVGhlIG5ldyBJUCBhZGRyZXNzIGluIHRoZSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9Cb29sCi0gIEluc19Hb3RvX0NvZGVSYW5nZSggRVhFQ19PUF8gRlRfSW50ICAgIGFSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgYUlQICkKLSAgewotICAgIFRUX0NvZGVSYW5nZSogIHJhbmdlOwotCi0KLSAgICBpZiAoIGFSYW5nZSA8IDEgfHwgYVJhbmdlID4gMyApCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0JhZF9Bcmd1bWVudDsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIHJhbmdlID0gJkNVUi5jb2RlUmFuZ2VUYWJsZVthUmFuZ2UgLSAxXTsKLQotICAgIGlmICggcmFuZ2UtPmJhc2UgPT0gTlVMTCApICAgICAvKiBpbnZhbGlkIGNvZGVyYW5nZSAqLwotICAgIHsKLSAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX0NvZGVSYW5nZTsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIC8qIE5PVEU6IEJlY2F1c2UgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgYSBwcm9ncmFtIG1heSBiZSBhIENBTEwgKi8KLSAgICAvKiAgICAgICB3aGljaCB3aWxsIHJldHVybiB0byB0aGUgZmlyc3QgYnl0ZSAqYWZ0ZXIqIHRoZSBjb2RlICAgICovCi0gICAgLyogICAgICAgcmFuZ2UsIHdlIHRlc3QgZm9yIEFJUCA8PSBTaXplLCBpbnN0ZWFkIG9mIEFJUCA8IFNpemUuICAqLwotCi0gICAgaWYgKCBhSVAgPiByYW5nZS0+c2l6ZSApCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0NvZGVfT3ZlcmZsb3c7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBDVVIuY29kZSAgICAgPSByYW5nZS0+YmFzZTsKLSAgICBDVVIuY29kZVNpemUgPSByYW5nZS0+c2l6ZTsKLSAgICBDVVIuSVAgICAgICAgPSBhSVA7Ci0gICAgQ1VSLmN1clJhbmdlID0gYVJhbmdlOwotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpcmVjdF9Nb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vdmVzIGEgcG9pbnQgYnkgYSBnaXZlbiBkaXN0YW5jZSBhbG9uZyB0aGUgZnJlZWRvbSB2ZWN0b3IuICBUaGUgICAqLwotICAvKiAgICBwb2ludCB3aWxsIGJlIGB0b3VjaGVkJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludCAgICA6OiBUaGUgaW5kZXggb2YgdGhlIHBvaW50IHRvIG1vdmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlIDo6IFRoZSBkaXN0YW5jZSB0byBhcHBseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHpvbmUgICAgIDo6IFRoZSBhZmZlY3RlZCBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgRGlyZWN0X01vdmUoIEVYRUNfT1BfIFRUX0dseXBoWm9uZSAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgIGRpc3RhbmNlICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHY7Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgRlRfQVNTRVJUKCAhQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApOwotI2VuZGlmCi0KLSAgICB2ID0gQ1VSLkdTLmZyZWVWZWN0b3IueDsKLQotICAgIGlmICggdiAhPSAwICkKLSAgICB7Ci0gICAgICB6b25lLT5jdXJbcG9pbnRdLnggKz0gVFRfTVVMRElWKCBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKiAweDEwMDAwTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5GX2RvdF9QICk7Ci0KLSAgICAgIHpvbmUtPnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9YOwotICAgIH0KLQotICAgIHYgPSBDVVIuR1MuZnJlZVZlY3Rvci55OwotCi0gICAgaWYgKCB2ICE9IDAgKQotICAgIHsKLSAgICAgIHpvbmUtPmN1cltwb2ludF0ueSArPSBUVF9NVUxESVYoIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAqIDB4MTAwMDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkZfZG90X1AgKTsKLQotICAgICAgem9uZS0+dGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1k7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXJlY3RfTW92ZV9PcmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb3ZlcyB0aGUgKm9yaWdpbmFsKiBwb3NpdGlvbiBvZiBhIHBvaW50IGJ5IGEgZ2l2ZW4gZGlzdGFuY2UgYWxvbmcgKi8KLSAgLyogICAgdGhlIGZyZWVkb20gdmVjdG9yLiAgT2J2aW91c2x5LCB0aGUgcG9pbnQgd2lsbCBub3QgYmUgYHRvdWNoZWQnLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnQgICAgOjogVGhlIGluZGV4IG9mIHRoZSBwb2ludCB0byBtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXN0YW5jZSA6OiBUaGUgZGlzdGFuY2UgdG8gYXBwbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB6b25lICAgICA6OiBUaGUgYWZmZWN0ZWQgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIERpcmVjdF9Nb3ZlX09yaWcoIEVYRUNfT1BfIFRUX0dseXBoWm9uZSAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICBkaXN0YW5jZSApCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICB2OwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIEZUX0FTU0VSVCggIUNVUi5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKTsKLSNlbmRpZgotCi0gICAgdiA9IENVUi5HUy5mcmVlVmVjdG9yLng7Ci0KLSAgICBpZiAoIHYgIT0gMCApCi0gICAgICB6b25lLT5vcmdbcG9pbnRdLnggKz0gVFRfTVVMRElWKCBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKiAweDEwMDAwTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5GX2RvdF9QICk7Ci0KLSAgICB2ID0gQ1VSLkdTLmZyZWVWZWN0b3IueTsKLQotICAgIGlmICggdiAhPSAwICkKLSAgICAgIHpvbmUtPm9yZ1twb2ludF0ueSArPSBUVF9NVUxESVYoIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAqIDB4MTAwMDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkZfZG90X1AgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTcGVjaWFsIHZlcnNpb25zIG9mIERpcmVjdF9Nb3ZlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIGZvbGxvd2luZyB2ZXJzaW9ucyBhcmUgdXNlZCB3aGVuZXZlciBib3RoIHZlY3RvcnMgYXJlIGJvdGggICAgICAqLwotICAvKiAgIGFsb25nIG9uZSBvZiB0aGUgY29vcmRpbmF0ZSB1bml0IHZlY3RvcnMsIGkuZS4gaW4gOTAlIG9mIHRoZSBjYXNlcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgRGlyZWN0X01vdmVfWCggRVhFQ19PUF8gVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgIGRpc3RhbmNlICkKLSAgewotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0gICAgem9uZS0+Y3VyW3BvaW50XS54ICs9IGRpc3RhbmNlOwotICAgIHpvbmUtPnRhZ3NbcG9pbnRdICB8PSBGVF9DVVJWRV9UQUdfVE9VQ0hfWDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgRGlyZWN0X01vdmVfWSggRVhFQ19PUF8gVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgIGRpc3RhbmNlICkKLSAgewotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0gICAgem9uZS0+Y3VyW3BvaW50XS55ICs9IGRpc3RhbmNlOwotICAgIHpvbmUtPnRhZ3NbcG9pbnRdICB8PSBGVF9DVVJWRV9UQUdfVE9VQ0hfWTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTcGVjaWFsIHZlcnNpb25zIG9mIERpcmVjdF9Nb3ZlX09yaWcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIGZvbGxvd2luZyB2ZXJzaW9ucyBhcmUgdXNlZCB3aGVuZXZlciBib3RoIHZlY3RvcnMgYXJlIGJvdGggICAgICAqLwotICAvKiAgIGFsb25nIG9uZSBvZiB0aGUgY29vcmRpbmF0ZSB1bml0IHZlY3RvcnMsIGkuZS4gaW4gOTAlIG9mIHRoZSBjYXNlcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgRGlyZWN0X01vdmVfT3JpZ19YKCBFWEVDX09QXyBUVF9HbHlwaFpvbmUgIHpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgIGRpc3RhbmNlICkKLSAgewotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0gICAgem9uZS0+b3JnW3BvaW50XS54ICs9IGRpc3RhbmNlOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZV9PcmlnX1koIEVYRUNfT1BfIFRUX0dseXBoWm9uZSAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgZGlzdGFuY2UgKQotICB7Ci0gICAgRlRfVU5VU0VEX0VYRUM7Ci0KLSAgICB6b25lLT5vcmdbcG9pbnRdLnkgKz0gZGlzdGFuY2U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX05vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvZXMgbm90IHJvdW5kLCBidXQgYWRkcyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgKG5vdCkgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNvbXBlbnNhdGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gc2F5cyB2ZXJ5IGZldyBhYm91dCB0aGUgcmVsYXRpb25zaGlwICAgICovCi0gIC8qICAgIGJldHdlZW4gcm91bmRpbmcgYW5kIGVuZ2luZSBjb21wZW5zYXRpb24uICBIb3dldmVyLCBpdCBzZWVtcyBmcm9tICAqLwotICAvKiAgICB0aGUgZGVzY3JpcHRpb24gb2Ygc3VwZXIgcm91bmQgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBjb21wZW5zYXRpb24gKi8KLSAgLyogICAgYmVmb3JlIHJvdW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Ob25lKCBFWEVDX09QXyBGVF9GMjZEb3Q2ICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHZhbDsKLQotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9IGRpc3RhbmNlICsgY29tcGVuc2F0aW9uOwotICAgICAgaWYgKCBkaXN0YW5jZSAmJiB2YWwgPCAwICkKLSAgICAgICAgdmFsID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB2YWwgPSBkaXN0YW5jZSAtIGNvbXBlbnNhdGlvbjsKLSAgICAgIGlmICggdmFsID4gMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1RvX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Ub19HcmlkKCBFWEVDX09QXyBGVF9GMjZEb3Q2ICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHZhbDsKLQotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9IGRpc3RhbmNlICsgY29tcGVuc2F0aW9uICsgMzI7Ci0gICAgICBpZiAoIGRpc3RhbmNlICYmIHZhbCA+IDAgKQotICAgICAgICB2YWwgJj0gfjYzOwotICAgICAgZWxzZQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gLUZUX1BJWF9ST1VORCggY29tcGVuc2F0aW9uIC0gZGlzdGFuY2UgKTsKLSAgICAgIGlmICggdmFsID4gMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuICB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1RvX0hhbGZfR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSB0byBoYWxmIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Ub19IYWxmX0dyaWQoIEVYRUNfT1BfIEZUX0YyNkRvdDYgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICB2YWw7Ci0KLSAgICBGVF9VTlVTRURfRVhFQzsKLQotCi0gICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKLSAgICB7Ci0gICAgICB2YWwgPSBGVF9QSVhfRkxPT1IoIGRpc3RhbmNlICsgY29tcGVuc2F0aW9uICkgKyAzMjsKLSAgICAgIGlmICggZGlzdGFuY2UgJiYgdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAtKCBGVF9QSVhfRkxPT1IoIGNvbXBlbnNhdGlvbiAtIGRpc3RhbmNlICkgKyAzMiApOwotICAgICAgaWYgKCB2YWwgPiAwICkKLSAgICAgICAgdmFsID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZF9Eb3duX1RvX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZHMgdmFsdWUgZG93biB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXBlbnNhdGlvbiA6OiBUaGUgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kZWQgZGlzdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfRG93bl9Ub19HcmlkKCBFWEVDX09QXyBGVF9GMjZEb3Q2ICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0gICAgRlRfVU5VU0VEX0VYRUM7Ci0KLQotICAgIGlmICggZGlzdGFuY2UgPj0gMCApCi0gICAgewotICAgICAgdmFsID0gZGlzdGFuY2UgKyBjb21wZW5zYXRpb247Ci0gICAgICBpZiAoIGRpc3RhbmNlICYmIHZhbCA+IDAgKQotICAgICAgICB2YWwgJj0gfjYzOwotICAgICAgZWxzZQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gLSggKCBjb21wZW5zYXRpb24gLSBkaXN0YW5jZSApICYgLTY0ICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1VwX1RvX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSB1cCB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9VcF9Ub19HcmlkKCBFWEVDX09QXyBGVF9GMjZEb3Q2ICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHZhbDsKLQotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9IGRpc3RhbmNlICsgY29tcGVuc2F0aW9uICsgNjM7Ci0gICAgICBpZiAoIGRpc3RhbmNlICYmIHZhbCA+IDAgKQotICAgICAgICB2YWwgJj0gfjYzOwotICAgICAgZWxzZQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gLSBGVF9QSVhfQ0VJTCggY29tcGVuc2F0aW9uIC0gZGlzdGFuY2UgKTsKLSAgICAgIGlmICggdmFsID4gMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfVG9fRG91YmxlX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRzIHZhbHVlIHRvIGRvdWJsZSBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFJvdW5kX1RvX0RvdWJsZV9HcmlkKCBFWEVDX09QXyBGVF9GMjZEb3Q2ICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApCi0gIHsKLSAgICBGVF9GMjZEb3Q2IHZhbDsKLQotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9IGRpc3RhbmNlICsgY29tcGVuc2F0aW9uICsgMTY7Ci0gICAgICBpZiAoIGRpc3RhbmNlICYmIHZhbCA+IDAgKQotICAgICAgICB2YWwgJj0gfjMxOwotICAgICAgZWxzZQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gLUZUX1BBRF9ST1VORCggY29tcGVuc2F0aW9uIC0gZGlzdGFuY2UsIDMyICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1N1cGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFN1cGVyLXJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gc2F5cyB2ZXJ5IGZldyBhYm91dCB0aGUgcmVsYXRpb25zaGlwICAgICovCi0gIC8qICAgIGJldHdlZW4gcm91bmRpbmcgYW5kIGVuZ2luZSBjb21wZW5zYXRpb24uICBIb3dldmVyLCBpdCBzZWVtcyBmcm9tICAqLwotICAvKiAgICB0aGUgZGVzY3JpcHRpb24gb2Ygc3VwZXIgcm91bmQgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBjb21wZW5zYXRpb24gKi8KLSAgLyogICAgYmVmb3JlIHJvdW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9TdXBlciggRVhFQ19PUF8gRlRfRjI2RG90NiAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9ICggZGlzdGFuY2UgLSBDVVIucGhhc2UgKyBDVVIudGhyZXNob2xkICsgY29tcGVuc2F0aW9uICkgJgotICAgICAgICAgICAgICAtQ1VSLnBlcmlvZDsKLSAgICAgIGlmICggZGlzdGFuY2UgJiYgdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgICB2YWwgKz0gQ1VSLnBoYXNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gLSggKCBDVVIudGhyZXNob2xkIC0gQ1VSLnBoYXNlIC0gZGlzdGFuY2UgKyBjb21wZW5zYXRpb24gKSAmCi0gICAgICAgICAgICAgICAtQ1VSLnBlcmlvZCApOwotICAgICAgaWYgKCB2YWwgPiAwICkKLSAgICAgICAgdmFsID0gMDsKLSAgICAgIHZhbCAtPSBDVVIucGhhc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfU3VwZXJfNDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3VwZXItcm91bmRzIHZhbHVlIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGVyZSBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIGZvciBSb3VuZF9TdXBlcl80NSgpIGFzIHdlIG1heSBuZWVkICAgKi8KLSAgLyogICAgZ3JlYXRlciBwcmVjaXNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9TdXBlcl80NSggRVhFQ19PUF8gRlRfRjI2RG90NiAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9ICggKCBkaXN0YW5jZSAtIENVUi5waGFzZSArIENVUi50aHJlc2hvbGQgKyBjb21wZW5zYXRpb24gKSAvCi0gICAgICAgICAgICAgICAgQ1VSLnBlcmlvZCApICogQ1VSLnBlcmlvZDsKLSAgICAgIGlmICggZGlzdGFuY2UgJiYgdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgICB2YWwgKz0gQ1VSLnBoYXNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gLSggKCAoIENVUi50aHJlc2hvbGQgLSBDVVIucGhhc2UgLSBkaXN0YW5jZSArIGNvbXBlbnNhdGlvbiApIC8KLSAgICAgICAgICAgICAgICAgICBDVVIucGVyaW9kICkgKiBDVVIucGVyaW9kICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgICAgdmFsIC09IENVUi5waGFzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlX1JvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRzIHRoZSByb3VuZGluZyBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb3VuZF9tb2RlIDo6IFRoZSByb3VuZGluZyBtb2RlIHRvIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIENvbXB1dGVfUm91bmQoIEVYRUNfT1BfIEZUX0J5dGUgIHJvdW5kX21vZGUgKQotICB7Ci0gICAgc3dpdGNoICggcm91bmRfbW9kZSApCi0gICAgewotICAgIGNhc2UgVFRfUm91bmRfT2ZmOgotICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ob25lOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRUX1JvdW5kX1RvX0dyaWQ6Ci0gICAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0dyaWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFRfUm91bmRfVXBfVG9fR3JpZDoKLSAgICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVXBfVG9fR3JpZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9Eb3duX1RvX0dyaWQ6Ci0gICAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX0Rvd25fVG9fR3JpZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQ6Ci0gICAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0hhbGZfR3JpZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9Ub19Eb3VibGVfR3JpZDoKLSAgICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fRG91YmxlX0dyaWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFRfUm91bmRfU3VwZXI6Ci0gICAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1N1cGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRUX1JvdW5kX1N1cGVyXzQ1OgotICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcl80NTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0U3VwZXJSb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0cyBTdXBlciBSb3VuZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR3JpZFBlcmlvZCA6OiBHcmlkIHBlcmlvZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNlbGVjdG9yICAgOjogU1JPVU5EIG9wY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgU2V0U3VwZXJSb3VuZCggRVhFQ19PUF8gRlRfRjI2RG90NiAgR3JpZFBlcmlvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgc2VsZWN0b3IgKQotICB7Ci0gICAgc3dpdGNoICggKEZUX0ludCkoIHNlbGVjdG9yICYgMHhDMCApICkKLSAgICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIENVUi5wZXJpb2QgPSBHcmlkUGVyaW9kIC8gMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg0MDoKLSAgICAgICAgQ1VSLnBlcmlvZCA9IEdyaWRQZXJpb2Q7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDB4ODA6Ci0gICAgICAgIENVUi5wZXJpb2QgPSBHcmlkUGVyaW9kICogMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFRoaXMgb3Bjb2RlIGlzIHJlc2VydmVkLCBidXQuLi4gKi8KLQotICAgICAgY2FzZSAweEMwOgotICAgICAgICBDVVIucGVyaW9kID0gR3JpZFBlcmlvZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoICggKEZUX0ludCkoIHNlbGVjdG9yICYgMHgzMCApICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgQ1VSLnBoYXNlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDEwOgotICAgICAgQ1VSLnBoYXNlID0gQ1VSLnBlcmlvZCAvIDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMHgyMDoKLSAgICAgIENVUi5waGFzZSA9IENVUi5wZXJpb2QgLyAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MzA6Ci0gICAgICBDVVIucGhhc2UgPSBDVVIucGVyaW9kICogMyAvIDQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoICggc2VsZWN0b3IgJiAweDBGICkgPT0gMCApCi0gICAgICBDVVIudGhyZXNob2xkID0gQ1VSLnBlcmlvZCAtIDE7Ci0gICAgZWxzZQotICAgICAgQ1VSLnRocmVzaG9sZCA9ICggKEZUX0ludCkoIHNlbGVjdG9yICYgMHgwRiApIC0gNCApICogQ1VSLnBlcmlvZCAvIDg7Ci0KLSAgICBDVVIucGVyaW9kICAgIC89IDI1NjsKLSAgICBDVVIucGhhc2UgICAgIC89IDI1NjsKLSAgICBDVVIudGhyZXNob2xkIC89IDI1NjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgICAgICovCi0gIC8qICAgIGN1cnJlbnQgcHJvamVjdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFByb2plY3QoIEVYRUNfT1BfIEZUX1BvcyAgZHgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgZHkgKQotICB7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBGVF9BU1NFUlQoICFDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBUVF9Eb3RGaXgxNCggZHgsIGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkdTLnByb2pWZWN0b3IueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENVUi5HUy5wcm9qVmVjdG9yLnkgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRHVhbF9Qcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdGhlIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICovCi0gIC8qICAgIGN1cnJlbnQgZHVhbCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIER1YWxfUHJvamVjdCggRVhFQ19PUF8gRlRfUG9zICBkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICkKLSAgewotICAgIHJldHVybiBUVF9Eb3RGaXgxNCggZHgsIGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkdTLmR1YWxWZWN0b3IueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENVUi5HUy5kdWFsVmVjdG9yLnkgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJvamVjdF94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdGhlIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICovCi0gIC8qICAgIGhvcml6b250YWwgYXhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFByb2plY3RfeCggRVhFQ19PUF8gRlRfUG9zICBkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICkKLSAgewotICAgIEZUX1VOVVNFRF9FWEVDOwotICAgIEZUX1VOVVNFRCggZHkgKTsKLQotICAgIHJldHVybiBkeDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJvamVjdF95ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdGhlIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICovCi0gIC8qICAgIHZlcnRpY2FsIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFByb2plY3RfeSggRVhFQ19PUF8gRlRfUG9zICBkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICkKLSAgewotICAgIEZUX1VOVVNFRF9FWEVDOwotICAgIEZUX1VOVVNFRCggZHggKTsKLQotICAgIHJldHVybiBkeTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZV9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gYW5kIG1vdmVtZW50IGZ1bmN0aW9uIHBvaW50ZXJzIGFjY29yZGluZyAgICovCi0gIC8qICAgIHRvIHRoZSBjdXJyZW50IGdyYXBoaWNzIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgQ29tcHV0ZV9GdW5jcyggRVhFQ19PUCApCi0gIHsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIGlmICggQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCi0gICAgewotICAgICAgLyogSWYgYm90aCB2ZWN0b3JzIHBvaW50IHJpZ2h0d2FyZHMgYWxvbmcgdGhlIHggYXhpcywgc2V0ICAgICAgICAgICAgICovCi0gICAgICAvKiBgYm90aC14LWF4aXMnIHRydWUsIG90aGVyd2lzZSBzZXQgaXQgZmFsc2UuICBUaGUgeCB2YWx1ZXMgb25seSAgICAgKi8KLSAgICAgIC8qIG5lZWQgYmUgdGVzdGVkIGJlY2F1c2UgdGhlIHZlY3RvciBoYXMgYmVlbiBub3JtYWxpc2VkIHRvIGEgdW5pdCAgICAqLwotICAgICAgLyogdmVjdG9yIG9mIGxlbmd0aCAweDQwMDAgPSB1bml0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBDVVIuR1MuYm90aF94X2F4aXMgPSAoRlRfQm9vbCkoIENVUi5HUy5wcm9qVmVjdG9yLnggPT0gMHg0MDAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnggPT0gMHg0MDAwICk7Ci0KLSAgICAgIC8qIFRocm93IGF3YXkgcHJvamVjdGlvbiBhbmQgZnJlZWRvbSB2ZWN0b3IgaW5mb3JtYXRpb24gKi8KLSAgICAgIC8qIGJlY2F1c2UgdGhlIHBhdGVudHMgZG9uJ3QgYWxsb3cgdGhlbSB0byBiZSBzdG9yZWQuICAgKi8KLSAgICAgIC8qIFRoZSByZWxldmFudCBVUyBQYXRlbnRzIGFyZSA1MTU1ODA1IGFuZCA1MzI1NDc5LiAgICAgKi8KLSAgICAgIENVUi5HUy5wcm9qVmVjdG9yLnggPSAwOwotICAgICAgQ1VSLkdTLnByb2pWZWN0b3IueSA9IDA7Ci0gICAgICBDVVIuR1MuZnJlZVZlY3Rvci54ID0gMDsKLSAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnkgPSAwOwotCi0gICAgICBpZiAoIENVUi5HUy5ib3RoX3hfYXhpcyApCi0gICAgICB7Ci0gICAgICAgIENVUi5mdW5jX3Byb2plY3QgICA9IFByb2plY3RfeDsKLSAgICAgICAgQ1VSLmZ1bmNfbW92ZSAgICAgID0gRGlyZWN0X01vdmVfWDsKLSAgICAgICAgQ1VSLmZ1bmNfbW92ZV9vcmlnID0gRGlyZWN0X01vdmVfT3JpZ19YOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBDVVIuZnVuY19wcm9qZWN0ICAgPSBQcm9qZWN0X3k7Ci0gICAgICAgIENVUi5mdW5jX21vdmUgICAgICA9IERpcmVjdF9Nb3ZlX1k7Ci0gICAgICAgIENVUi5mdW5jX21vdmVfb3JpZyA9IERpcmVjdF9Nb3ZlX09yaWdfWTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBDVVIuR1MuZHVhbFZlY3Rvci54ID09IDB4NDAwMCApCi0gICAgICAgIENVUi5mdW5jX2R1YWxwcm9qID0gUHJvamVjdF94OwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIENVUi5HUy5kdWFsVmVjdG9yLnkgPT0gMHg0MDAwICkKLSAgICAgICAgICBDVVIuZnVuY19kdWFscHJvaiA9IFByb2plY3RfeTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIENVUi5mdW5jX2R1YWxwcm9qID0gRHVhbF9Qcm9qZWN0OwotICAgICAgfQotCi0gICAgICAvKiBGb3JjZSByZWNhbGN1bGF0aW9uIG9mIGNhY2hlZCBhc3BlY3QgcmF0aW8gKi8KLSAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gMDsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyAqLwotCi0gICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci54ID09IDB4NDAwMCApCi0gICAgICBDVVIuRl9kb3RfUCAgICAgICA9IENVUi5HUy5wcm9qVmVjdG9yLnggKiAweDEwMDAwTDsKLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci55ID09IDB4NDAwMCApCi0gICAgICAgIENVUi5GX2RvdF9QICAgICAgID0gQ1VSLkdTLnByb2pWZWN0b3IueSAqIDB4MTAwMDBMOwotICAgICAgZWxzZQotICAgICAgICBDVVIuRl9kb3RfUCA9IChGVF9Mb25nKUNVUi5HUy5wcm9qVmVjdG9yLnggKiBDVVIuR1MuZnJlZVZlY3Rvci54ICogNCArCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpQ1VSLkdTLnByb2pWZWN0b3IueSAqIENVUi5HUy5mcmVlVmVjdG9yLnkgKiA0OwotICAgIH0KLQotICAgIGlmICggQ1VSLkdTLnByb2pWZWN0b3IueCA9PSAweDQwMDAgKQotICAgICAgQ1VSLmZ1bmNfcHJvamVjdCA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF94OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIENVUi5HUy5wcm9qVmVjdG9yLnkgPT0gMHg0MDAwICkKLSAgICAgICAgQ1VSLmZ1bmNfcHJvamVjdCA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF95OwotICAgICAgZWxzZQotICAgICAgICBDVVIuZnVuY19wcm9qZWN0ID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0OwotICAgIH0KLQotICAgIGlmICggQ1VSLkdTLmR1YWxWZWN0b3IueCA9PSAweDQwMDAgKQotICAgICAgQ1VSLmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeDsKLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBDVVIuR1MuZHVhbFZlY3Rvci55ID09IDB4NDAwMCApCi0gICAgICAgIENVUi5mdW5jX2R1YWxwcm9qID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0X3k7Ci0gICAgICBlbHNlCi0gICAgICAgIENVUi5mdW5jX2R1YWxwcm9qID0gKFRUX1Byb2plY3RfRnVuYylEdWFsX1Byb2plY3Q7Ci0gICAgfQotCi0gICAgQ1VSLmZ1bmNfbW92ZSAgICAgID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZTsKLSAgICBDVVIuZnVuY19tb3ZlX29yaWcgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX09yaWc7Ci0KLSAgICBpZiAoIENVUi5GX2RvdF9QID09IDB4NDAwMDAwMDBMICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnggPT0gMHg0MDAwICkKLSAgICAgIHsKLSAgICAgICAgQ1VSLmZ1bmNfbW92ZSAgICAgID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9YOwotICAgICAgICBDVVIuZnVuY19tb3ZlX29yaWcgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX09yaWdfWDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci55ID09IDB4NDAwMCApCi0gICAgICAgIHsKLSAgICAgICAgICBDVVIuZnVuY19tb3ZlICAgICAgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX1k7Ci0gICAgICAgICAgQ1VSLmZ1bmNfbW92ZV9vcmlnID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9PcmlnX1k7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhdCBzbWFsbCBzaXplcywgRl9kb3RfUCBjYW4gYmVjb21lIHRvbyBzbWFsbCwgcmVzdWx0aW5nICAgKi8KLSAgICAvKiBpbiBvdmVyZmxvd3MgYW5kIGBzcGlrZXMnIGluIGEgbnVtYmVyIG9mIGdseXBocyBsaWtlIGB3Jy4gKi8KLQotICAgIGlmICggRlRfQUJTKCBDVVIuRl9kb3RfUCApIDwgMHg0MDAwMDAwTCApCi0gICAgICBDVVIuRl9kb3RfUCA9IDB4NDAwMDAwMDBMOwotCi0gICAgLyogRGlzYWJsZSBjYWNoZWQgYXNwZWN0IHJhdGlvICovCi0gICAgQ1VSLnR0X21ldHJpY3MucmF0aW8gPSAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3JtYWxpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3JtcyBhIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBWeCA6OiBUaGUgaG9yaXpvbnRhbCBpbnB1dCB2ZWN0b3IgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVnkgOjogVGhlIHZlcnRpY2FsIGlucHV0IHZlY3RvciBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUiAgOjogVGhlIG5vcm1lZCB1bml0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJucyBGQUlMVVJFIGlmIGEgdmVjdG9yIHBhcmFtZXRlciBpcyB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gY2FzZSBWeCBhbmQgVnkgYXJlIGJvdGggemVybywgTm9ybWFsaXplKCkgcmV0dXJucyBTVUNDRVNTLCBhbmQgICovCi0gIC8qICAgIFIgaXMgdW5kZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIE5vcm1hbGl6ZSggRVhFQ19PUF8gRlRfRjI2RG90NiAgICAgIFZ4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBWeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Vbml0VmVjdG9yKiAgUiApCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICBXOwotICAgIEZUX0Jvb2wgICAgIFMxLCBTMjsKLQotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0KLSAgICBpZiAoIEZUX0FCUyggVnggKSA8IDB4MTAwMDBMICYmIEZUX0FCUyggVnkgKSA8IDB4MTAwMDBMICkKLSAgICB7Ci0gICAgICBWeCAqPSAweDEwMDsKLSAgICAgIFZ5ICo9IDB4MTAwOwotCi0gICAgICBXID0gVFRfVmVjTGVuKCBWeCwgVnkgKTsKLQotICAgICAgaWYgKCBXID09IDAgKQotICAgICAgewotICAgICAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgSXQgc2VlbXMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB0cnkgICAqLwotICAgICAgICAvKiAgICAgIHRvIG5vcm1hbGl6ZSB0aGUgdmVjdG9yICgwLDApLiAgUmV0dXJuIGltbWVkaWF0ZWx5LiAqLwotICAgICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICAgIH0KLQotICAgICAgUi0+eCA9IChGVF9GMkRvdDE0KUZUX011bERpdiggVngsIDB4NDAwMEwsIFcgKTsKLSAgICAgIFItPnkgPSAoRlRfRjJEb3QxNClGVF9NdWxEaXYoIFZ5LCAweDQwMDBMLCBXICk7Ci0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLQotICAgIFcgPSBUVF9WZWNMZW4oIFZ4LCBWeSApOwotCi0gICAgVnggPSBGVF9NdWxEaXYoIFZ4LCAweDQwMDBMLCBXICk7Ci0gICAgVnkgPSBGVF9NdWxEaXYoIFZ5LCAweDQwMDBMLCBXICk7Ci0KLSAgICBXID0gVnggKiBWeCArIFZ5ICogVnk7Ci0KLSAgICAvKiBOb3csIHdlIHdhbnQgdGhhdCBTcXJ0KCBXICkgPSAweDQwMDAgKi8KLSAgICAvKiBPciAweDEwMDAwMDAwIDw9IFcgPCAweDEwMDA0MDAwICAgICAgICAqLwotCi0gICAgaWYgKCBWeCA8IDAgKQotICAgIHsKLSAgICAgIFZ4ID0gLVZ4OwotICAgICAgUzEgPSBUUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBTMSA9IEZBTFNFOwotCi0gICAgaWYgKCBWeSA8IDAgKQotICAgIHsKLSAgICAgIFZ5ID0gLVZ5OwotICAgICAgUzIgPSBUUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBTMiA9IEZBTFNFOwotCi0gICAgd2hpbGUgKCBXIDwgMHgxMDAwMDAwMEwgKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gaW5jcmVhc2UgVyBieSBhIG1pbmltYWwgYW1vdW50ICovCi0gICAgICBpZiAoIFZ4IDwgVnkgKQotICAgICAgICBWeCsrOwotICAgICAgZWxzZQotICAgICAgICBWeSsrOwotCi0gICAgICBXID0gVnggKiBWeCArIFZ5ICogVnk7Ci0gICAgfQotCi0gICAgd2hpbGUgKCBXID49IDB4MTAwMDQwMDBMICkKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIGRlY3JlYXNlIFcgYnkgYSBtaW5pbWFsIGFtb3VudCAqLwotICAgICAgaWYgKCBWeCA8IFZ5ICkKLSAgICAgICAgVngtLTsKLSAgICAgIGVsc2UKLSAgICAgICAgVnktLTsKLQotICAgICAgVyA9IFZ4ICogVnggKyBWeSAqIFZ5OwotICAgIH0KLQotICAgIC8qIE5vdGUgdGhhdCBpbiB2YXJpb3VzIGNhc2VzLCB3ZSBjYW4gb25seSAgKi8KLSAgICAvKiBjb21wdXRlIGEgU3FydChXKSBvZiAweDNGRkYsIGVnLiBWeCA9IFZ5ICovCi0KLSAgICBpZiAoIFMxICkKLSAgICAgIFZ4ID0gLVZ4OwotCi0gICAgaWYgKCBTMiApCi0gICAgICBWeSA9IC1WeTsKLQotICAgIFItPnggPSAoRlRfRjJEb3QxNClWeDsgICAvKiBUeXBlIGNvbnZlcnNpb24gKi8KLSAgICBSLT55ID0gKEZUX0YyRG90MTQpVnk7ICAgLyogVHlwZSBjb252ZXJzaW9uICovCi0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBIZXJlIHdlIHN0YXJ0IHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2YXJpb3VzIG9wY29kZXMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgSW5zX1N4VlRMKCBFWEVDX09QXyBGVF9VU2hvcnQgICAgICAgYUlkeDEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIGFJZHgyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICBhT3BjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VuaXRWZWN0b3IqICBWZWMgKQotICB7Ci0gICAgRlRfTG9uZyAgICAgQSwgQiwgQzsKLSAgICBGVF9WZWN0b3IqICBwMTsKLSAgICBGVF9WZWN0b3IqICBwMjsKLQotCi0gICAgaWYgKCBCT1VORFMoIGFJZHgxLCBDVVIuenAyLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggYUlkeDIsIENVUi56cDEubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIHAxID0gQ1VSLnpwMS5jdXIgKyBhSWR4MjsKLSAgICBwMiA9IENVUi56cDIuY3VyICsgYUlkeDE7Ci0KLSAgICBBID0gcDEtPnggLSBwMi0+eDsKLSAgICBCID0gcDEtPnkgLSBwMi0+eTsKLQotICAgIGlmICggKCBhT3BjICYgMSApICE9IDAgKQotICAgIHsKLSAgICAgIEMgPSAgQjsgICAvKiBjb3VudGVyIGNsb2Nrd2lzZSByb3RhdGlvbiAqLwotICAgICAgQiA9ICBBOwotICAgICAgQSA9IC1DOwotICAgIH0KLQotICAgIE5PUk1hbGl6ZSggQSwgQiwgVmVjICk7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyogV2hlbiBub3QgdXNpbmcgdGhlIGJpZyBzd2l0Y2ggc3RhdGVtZW50cywgdGhlIGludGVycHJldGVyIHVzZXMgYSAqLwotICAvKiBjYWxsIHRhYmxlIGRlZmluZWQgbGF0ZXIgYmVsb3cgaW4gdGhpcyBzb3VyY2UuICBFYWNoIG9wY29kZSBtdXN0ICovCi0gIC8qIHRodXMgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24sIGV2ZW4gdHJpdmlhbCBvbmVzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGV5IGFyZSBhbGwgZGVmaW5lZCB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgRE9fU1ZUQ0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2hvcnQgIEEsIEI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQSA9IChGVF9TaG9ydCkoIENVUi5vcGNvZGUgJiAxICkgPDwgMTQ7IFwKLSAgICBCID0gQSBeIChGVF9TaG9ydCkweDQwMDA7ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLmZyZWVWZWN0b3IueCA9IEE7ICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MucHJvalZlY3Rvci54ID0gQTsgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5kdWFsVmVjdG9yLnggPSBBOyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZnJlZVZlY3Rvci55ID0gQjsgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5wcm9qVmVjdG9yLnkgPSBCOyAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLmR1YWxWZWN0b3IueSA9IEI7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTVBVVEVfRnVuY3MoKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotCi0jZGVmaW5lIERPX1NQVlRDQSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1Nob3J0ICBBLCBCOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEEgPSAoRlRfU2hvcnQpKCBDVVIub3Bjb2RlICYgMSApIDw8IDE0OyBcCi0gICAgQiA9IEEgXiAoRlRfU2hvcnQpMHg0MDAwOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5wcm9qVmVjdG9yLnggPSBBOyAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLmR1YWxWZWN0b3IueCA9IEE7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5wcm9qVmVjdG9yLnkgPSBCOyAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLmR1YWxWZWN0b3IueSA9IEI7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdVRVNTX1ZFQ1RPUiggZnJlZVZlY3RvciApOyAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotI2RlZmluZSBET19TRlZUQ0EgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TaG9ydCAgQSwgQjsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBID0gKEZUX1Nob3J0KSggQ1VSLm9wY29kZSAmIDEgKSA8PCAxNDsgXAotICAgIEIgPSBBIF4gKEZUX1Nob3J0KTB4NDAwMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZnJlZVZlY3Rvci54ID0gQTsgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5mcmVlVmVjdG9yLnkgPSBCOyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBHVUVTU19WRUNUT1IoIHByb2pWZWN0b3IgKTsgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ09NUFVURV9GdW5jcygpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0KLSNkZWZpbmUgRE9fU1BWVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIElOU19TeFZUTCggKEZUX1VTaG9ydClhcmdzWzFdLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClhcmdzWzBdLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgQ1VSLm9wY29kZSwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgJkNVUi5HUy5wcm9qVmVjdG9yICkgPT0gU1VDQ0VTUyApIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENVUi5HUy5kdWFsVmVjdG9yID0gQ1VSLkdTLnByb2pWZWN0b3I7ICAgICAgICAgIFwKLSAgICAgIEdVRVNTX1ZFQ1RPUiggZnJlZVZlY3RvciApOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENPTVBVVEVfRnVuY3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLQotI2RlZmluZSBET19TRlZUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggSU5TX1N4VlRMKCAoRlRfVVNob3J0KWFyZ3NbMV0sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KWFyZ3NbMF0sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICBDVVIub3Bjb2RlLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAmQ1VSLkdTLmZyZWVWZWN0b3IgKSA9PSBTVUNDRVNTICkgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ09NUFVURV9GdW5jcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotCi0jZGVmaW5lIERPX1NGVlRQViAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdVRVNTX1ZFQ1RPUiggcHJvalZlY3RvciApOyAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZnJlZVZlY3RvciA9IENVUi5HUy5wcm9qVmVjdG9yOyBcCi0gICAgQ09NUFVURV9GdW5jcygpOwotCi0KLSNkZWZpbmUgRE9fU1BWRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TaG9ydCAgUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Mb25nICAgWCwgWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvKiBPbmx5IHVzZSBsb3cgMTZiaXRzLCB0aGVuIHNpZ24gZXh0ZW5kICovIFwKLSAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMV07ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBZID0gKEZUX0xvbmcpUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMF07ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBYID0gKEZUX0xvbmcpUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBOT1JNYWxpemUoIFgsIFksICZDVVIuR1MucHJvalZlY3RvciApOyAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZHVhbFZlY3RvciA9IENVUi5HUy5wcm9qVmVjdG9yOyAgICAgIFwKLSAgICBHVUVTU19WRUNUT1IoIGZyZWVWZWN0b3IgKTsgICAgICAgICAgICAgICAgIFwKLSAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0KLSNkZWZpbmUgRE9fU0ZWRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TaG9ydCAgUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Mb25nICAgWCwgWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvKiBPbmx5IHVzZSBsb3cgMTZiaXRzLCB0aGVuIHNpZ24gZXh0ZW5kICovIFwKLSAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMV07ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBZID0gKEZUX0xvbmcpUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMF07ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBYID0gUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBOT1JNYWxpemUoIFgsIFksICZDVVIuR1MuZnJlZVZlY3RvciApOyAgICAgIFwKLSAgICBHVUVTU19WRUNUT1IoIHByb2pWZWN0b3IgKTsgICAgICAgICAgICAgICAgIFwKLSAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotI2RlZmluZSBET19HUFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIENVUi5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKSAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYXJnc1swXSA9IENVUi5HUy5ib3RoX3hfYXhpcyA/IDB4NDAwMCA6IDA7IFwKLSAgICAgIGFyZ3NbMV0gPSBDVVIuR1MuYm90aF94X2F4aXMgPyAwIDogMHg0MDAwOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBhcmdzWzBdID0gQ1VSLkdTLnByb2pWZWN0b3IueDsgICAgICAgICAgICAgXAotICAgICAgYXJnc1sxXSA9IENVUi5HUy5wcm9qVmVjdG9yLnk7ICAgICAgICAgICAgIFwKLSAgICB9Ci0jZWxzZQotI2RlZmluZSBET19HUFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gQ1VSLkdTLnByb2pWZWN0b3IueDsgICAgICAgICAgICAgICBcCi0gICAgYXJnc1sxXSA9IENVUi5HUy5wcm9qVmVjdG9yLnk7Ci0jZW5kaWYKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNkZWZpbmUgRE9fR0ZWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGFyZ3NbMF0gPSBDVVIuR1MuYm90aF94X2F4aXMgPyAweDQwMDAgOiAwOyBcCi0gICAgICBhcmdzWzFdID0gQ1VSLkdTLmJvdGhfeF9heGlzID8gMCA6IDB4NDAwMDsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYXJnc1swXSA9IENVUi5HUy5mcmVlVmVjdG9yLng7ICAgICAgICAgICAgIFwKLSAgICAgIGFyZ3NbMV0gPSBDVVIuR1MuZnJlZVZlY3Rvci55OyAgICAgICAgICAgICBcCi0gICAgfQotI2Vsc2UKLSNkZWZpbmUgRE9fR0ZWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9IENVUi5HUy5mcmVlVmVjdG9yLng7ICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMV0gPSBDVVIuR1MuZnJlZVZlY3Rvci55OwotI2VuZGlmCi0KLQotI2RlZmluZSBET19TUlAwICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MucnAwID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0KLSNkZWZpbmUgRE9fU1JQMSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnJwMSA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX1NSUDIgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5ycDIgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLQotI2RlZmluZSBET19SVEhHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVG9fSGFsZl9HcmlkOyAgICAgICAgIFwKLSAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0hhbGZfR3JpZDsKLQotCi0jZGVmaW5lIERPX1JURyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVG9fR3JpZDsgICAgICAgICBcCi0gICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19HcmlkOwotCi0KLSNkZWZpbmUgRE9fUlRERyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVG9fRG91YmxlX0dyaWQ7ICAgICAgICAgXAotICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fRG91YmxlX0dyaWQ7Ci0KLQotI2RlZmluZSBET19SVVRHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX1VwX1RvX0dyaWQ7ICAgICAgICAgXAotICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVXBfVG9fR3JpZDsKLQotCi0jZGVmaW5lIERPX1JEVEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Eb3duX1RvX0dyaWQ7ICAgICAgICAgXAotICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfRG93bl9Ub19HcmlkOwotCi0KLSNkZWZpbmUgRE9fUk9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9PZmY7ICAgICAgICAgIFwKLSAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX05vbmU7Ci0KLQotI2RlZmluZSBET19TUk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTRVRfU3VwZXJSb3VuZCggMHg0MDAwLCBhcmdzWzBdICk7ICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfU3VwZXI7ICAgICAgICAgXAotICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXI7Ci0KLQotI2RlZmluZSBET19TNDVST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTRVRfU3VwZXJSb3VuZCggMHgyRDQxLCBhcmdzWzBdICk7ICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfU3VwZXJfNDU7ICAgICAgICAgXAotICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXJfNDU7Ci0KLQotI2RlZmluZSBET19TTE9PUCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggYXJnc1swXSA8IDAgKSAgICAgICAgICAgICAgICAgXAotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0JhZF9Bcmd1bWVudDsgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ1VSLkdTLmxvb3AgPSBhcmdzWzBdOwotCi0KLSNkZWZpbmUgRE9fU01EICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MubWluaW11bV9kaXN0YW5jZSA9IGFyZ3NbMF07Ci0KLQotI2RlZmluZSBET19TQ1ZUQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5jb250cm9sX3ZhbHVlX2N1dGluID0gKEZUX0YyNkRvdDYpYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX1NTV0NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1Muc2luZ2xlX3dpZHRoX2N1dGluID0gKEZUX0YyNkRvdDYpYXJnc1swXTsKLQotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIG9yIGJ1ZyBpbiB0aGUgV2luZG93cyBlbmdpbmU/ICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgSXQgc2VlbXMgdGhhdCB0aGUgdmFsdWUgdGhhdCBpcyByZWFkIGhlcmUgaXMgICovCi0gICAgLyogICAgICBleHByZXNzZWQgaW4gMTYuMTYgZm9ybWF0IHJhdGhlciB0aGFuIGluIGZvbnQgKi8KLSAgICAvKiAgICAgIHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIERPX1NTVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnNpbmdsZV93aWR0aF92YWx1ZSA9IChGVF9GMjZEb3Q2KSggYXJnc1swXSA+PiAxMCApOwotCi0KLSNkZWZpbmUgRE9fRkxJUE9OICAgICAgICAgICAgXAotICAgIENVUi5HUy5hdXRvX2ZsaXAgPSBUUlVFOwotCi0KLSNkZWZpbmUgRE9fRkxJUE9GRiAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuYXV0b19mbGlwID0gRkFMU0U7Ci0KLQotI2RlZmluZSBET19TREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZGVsdGFfYmFzZSA9IChGVF9TaG9ydClhcmdzWzBdOwotCi0KLSNkZWZpbmUgRE9fU0RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5kZWx0YV9zaGlmdCA9IChGVF9TaG9ydClhcmdzWzBdOwotCi0KLSNkZWZpbmUgRE9fTUQgIC8qIG5vdGhpbmcgKi8KLQotCi0jZGVmaW5lIERPX01QUEVNICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9IENVUlJFTlRfUHBlbSgpOwotCi0KLSAgLyogTm90ZTogVGhlIHBvaW50U2l6ZSBzaG91bGQgYmUgaXJyZWxldmFudCBpbiBhIGdpdmVuIGZvbnQgcHJvZ3JhbTsgKi8KLSAgLyogICAgICAgd2UgdGh1cyBkZWNpZGUgdG8gcmV0dXJuIG9ubHkgdGhlIHBwZW0uICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAwCi0KLSNkZWZpbmUgRE9fTVBTICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9IENVUi5tZXRyaWNzLnBvaW50U2l6ZTsKLQotI2Vsc2UKLQotI2RlZmluZSBET19NUFMgICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSBDVVJSRU5UX1BwZW0oKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotCi0jZGVmaW5lIERPX0RVUCAgICAgICAgIFwKLSAgICBhcmdzWzFdID0gYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX0NMRUFSICAgICBcCi0gICAgQ1VSLm5ld190b3AgPSAwOwotCi0KLSNkZWZpbmUgRE9fU1dBUCAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTG9uZyAgTDsgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTCAgICAgICA9IGFyZ3NbMF07IFwKLSAgICBhcmdzWzBdID0gYXJnc1sxXTsgXAotICAgIGFyZ3NbMV0gPSBMOyAgICAgICBcCi0gIH0KLQotCi0jZGVmaW5lIERPX0RFUFRIICAgICAgIFwKLSAgICBhcmdzWzBdID0gQ1VSLnRvcDsKLQotCi0jZGVmaW5lIERPX0NJTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0xvbmcgIEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEwgPSBhcmdzWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEwgPD0gMCB8fCBMID4gQ1VSLmFyZ3MgKSAgICAgICAgICAgXAotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOyBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGFyZ3NbMF0gPSBDVVIuc3RhY2tbQ1VSLmFyZ3MgLSBMXTsgICAgXAotICB9Ci0KLQotI2RlZmluZSBET19KUk9UICAgICAgICAgICAgICAgXAotICAgIGlmICggYXJnc1sxXSAhPSAwICkgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ1VSLklQICAgICAgKz0gYXJnc1swXTsgXAotICAgICAgQ1VSLnN0ZXBfaW5zID0gRkFMU0U7ICAgXAotICAgIH0KLQotCi0jZGVmaW5lIERPX0pNUFIgICAgICAgICAgICAgXAotICAgIENVUi5JUCAgICAgICs9IGFyZ3NbMF07IFwKLSAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKLQotCi0jZGVmaW5lIERPX0pST0YgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBhcmdzWzFdID09IDAgKSAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDVVIuSVAgICAgICArPSBhcmdzWzBdOyBcCi0gICAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsgICBcCi0gICAgfQotCi0KLSNkZWZpbmUgRE9fTFQgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSA8IGFyZ3NbMV0gKTsKLQotCi0jZGVmaW5lIERPX0xURVEgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gKCBhcmdzWzBdIDw9IGFyZ3NbMV0gKTsKLQotCi0jZGVmaW5lIERPX0dUICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gPiBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19HVEVRICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSA+PSBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19FUSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSA9PSBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19ORVEgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSAhPSBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19PREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gKCAoIENVUl9GdW5jX3JvdW5kKCBhcmdzWzBdLCAwICkgJiAxMjcgKSA9PSA2NCApOwotCi0KLSNkZWZpbmUgRE9fRVZFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gKCAoIENVUl9GdW5jX3JvdW5kKCBhcmdzWzBdLCAwICkgJiAxMjcgKSA9PSAwICk7Ci0KLQotI2RlZmluZSBET19BTkQgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSAmJiBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19PUiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSB8fCBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19OT1QgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSAhYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX0FERCAgICAgICAgICBcCi0gICAgYXJnc1swXSArPSBhcmdzWzFdOwotCi0KLSNkZWZpbmUgRE9fU1VCICAgICAgICAgIFwKLSAgICBhcmdzWzBdIC09IGFyZ3NbMV07Ci0KLQotI2RlZmluZSBET19ESVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGFyZ3NbMV0gPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfRGl2aWRlX0J5X1plcm87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGFyZ3NbMF0gPSBUVF9NVUxESVZfTk9fUk9VTkQoIGFyZ3NbMF0sIDY0TCwgYXJnc1sxXSApOwotCi0KLSNkZWZpbmUgRE9fTVVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSBUVF9NVUxESVYoIGFyZ3NbMF0sIGFyZ3NbMV0sIDY0TCApOwotCi0KLSNkZWZpbmUgRE9fQUJTICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gRlRfQUJTKCBhcmdzWzBdICk7Ci0KLQotI2RlZmluZSBET19ORUcgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSAtYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX0ZMT09SICAgIFwKLSAgICBhcmdzWzBdID0gRlRfUElYX0ZMT09SKCBhcmdzWzBdICk7Ci0KLQotI2RlZmluZSBET19DRUlMSU5HICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9IEZUX1BJWF9DRUlMKCBhcmdzWzBdICk7Ci0KLQotI2RlZmluZSBET19SUyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoIEJPVU5EUyggSSwgQ1VSLnN0b3JlU2l6ZSApICkgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKSAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7ICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgYXJnc1swXSA9IDA7ICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGFyZ3NbMF0gPSBDVVIuc3RvcmFnZVtJXTsgICAgICAgXAotICAgfQotCi0KLSNkZWZpbmUgRE9fV1MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgaWYgKCBCT1VORFMoIEksIENVUi5zdG9yZVNpemUgKSApIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOyAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBDVVIuc3RvcmFnZVtJXSA9IGFyZ3NbMV07ICAgICAgIFwKLSAgIH0KLQotCi0jZGVmaW5lIERPX1JDVlQgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOyAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoIEJPVU5EUyggSSwgQ1VSLmN2dFNpemUgKSApICAgICBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBhcmdzWzBdID0gMDsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgYXJnc1swXSA9IENVUl9GdW5jX3JlYWRfY3Z0KCBJICk7IFwKLSAgIH0KLQotCi0jZGVmaW5lIERPX1dDVlRQICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOyAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoIEJPVU5EUyggSSwgQ1VSLmN2dFNpemUgKSApICAgICBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBDVVJfRnVuY193cml0ZV9jdnQoIEksIGFyZ3NbMV0gKTsgXAotICAgfQotCi0KLSNkZWZpbmUgRE9fV0NWVEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoIEJPVU5EUyggSSwgQ1VSLmN2dFNpemUgKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgQ1VSLmN2dFtJXSA9IFRUX01VTEZJWCggYXJnc1sxXSwgQ1VSLnR0X21ldHJpY3Muc2NhbGUgKTsgXAotICAgfQotCi0KLSNkZWZpbmUgRE9fREVCVUcgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLmVycm9yID0gVFRfRXJyX0RlYnVnX09wQ29kZTsKLQotCi0jZGVmaW5lIERPX1JPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSBDVVJfRnVuY19yb3VuZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBhcmdzWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tDVVIub3Bjb2RlIC0gMHg2OF0gKTsKLQotCi0jZGVmaW5lIERPX05ST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gUk9VTkRfTm9uZSggYXJnc1swXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIudHRfbWV0cmljcy5jb21wZW5zYXRpb25zW0NVUi5vcGNvZGUgLSAweDZDXSApOwotCi0KLSNkZWZpbmUgRE9fTUFYICAgICAgICAgICAgICAgXAotICAgIGlmICggYXJnc1sxXSA+IGFyZ3NbMF0gKSBcCi0gICAgICBhcmdzWzBdID0gYXJnc1sxXTsKLQotCi0jZGVmaW5lIERPX01JTiAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGFyZ3NbMV0gPCBhcmdzWzBdICkgXAotICAgICAgYXJnc1swXSA9IGFyZ3NbMV07Ci0KLQotI2lmbmRlZiBUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSAotCi0KLSN1bmRlZiAgQVJSQVlfQk9VTkRfRVJST1IKLSNkZWZpbmUgQVJSQVlfQk9VTkRfRVJST1IgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7IFwKLSAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1ZUQ0FbYV06ICAgICBTZXQgKEYgYW5kIFApIFZlY3RvcnMgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwMC0weDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TVlRDQSggSU5TX0FSRyApCi0gIHsKLSAgICBET19TVlRDQQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNQVlRDQVthXTogICAgU2V0IFBWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDItMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1BWVENBKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NQVlRDQQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNGVlRDQVthXTogICAgU2V0IEZWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDQtMHgwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0ZWVENBKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NGVlRDQQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNQVlRMW2FdOiAgICAgU2V0IFBWZWN0b3IgVG8gTGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDYtMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1BWVEwoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU1BWVEwKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTRlZUTFthXTogICAgIFNldCBGVmVjdG9yIFRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDA4LTB4MDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NGVlRMKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NGVlRMCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0ZWVFBWW106ICAgICBTZXQgRlZlY3RvciBUbyBQVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TRlZUUFYoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU0ZWVFBWCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1BWRlNbXTogICAgICBTZXQgUFZlY3RvciBGcm9tIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyLjE0IGYyLjE0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUFZGUyggSU5TX0FSRyApCi0gIHsKLSAgICBET19TUFZGUwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNGVkZTW106ICAgICAgU2V0IEZWZWN0b3IgRnJvbSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMi4xNCBmMi4xNCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0ZWRlMoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU0ZWRlMKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHUFZbXTogICAgICAgIEdldCBQcm9qZWN0aW9uIFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZWYyLjE0IC0tPiBlZjIuMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0dQViggSU5TX0FSRyApCi0gIHsKLSAgICBET19HUFYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qIEdGVltdOiAgICAgICAgR2V0IEZyZWVkb20gVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBlZjIuMTQgLS0+IGVmMi4xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfR0ZWKCBJTlNfQVJHICkKLSAgewotICAgIERPX0dGVgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNSUDBbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1JQMCggSU5TX0FSRyApCi0gIHsKLSAgICBET19TUlAwCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JQMVtdOiAgICAgICBTZXQgUmVmZXJlbmNlIFBvaW50IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUlAxKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NSUDEKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTUlAyW106ICAgICAgIFNldCBSZWZlcmVuY2UgUG9pbnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NSUDIoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU1JQMgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJUSEdbXTogICAgICAgUm91bmQgVG8gSGFsZiBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUlRIRyggSU5TX0FSRyApCi0gIHsKLSAgICBET19SVEhHCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUlRHW106ICAgICAgICBSb3VuZCBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SVEcoIElOU19BUkcgKQotICB7Ci0gICAgRE9fUlRHCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBSVERHW106ICAgICAgIFJvdW5kIFRvIERvdWJsZSBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDNEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JUREcoIElOU19BUkcgKQotICB7Ci0gICAgRE9fUlRERwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogUlVUR1tdOiAgICAgICBSb3VuZCBVcCBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SVVRHKCBJTlNfQVJHICkKLSAgewotICAgIERPX1JVVEcKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSRFRHW106ICAgICAgIFJvdW5kIERvd24gVG8gR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JEVEcoIElOU19BUkcgKQotICB7Ci0gICAgRE9fUkRURwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJPRkZbXTogICAgICAgUm91bmQgT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUk9GRiggSU5TX0FSRyApCi0gIHsKLSAgICBET19ST0ZGCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JPVU5EW106ICAgICBTdXBlciBST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUk9VTkQoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU1JPVU5ECi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUzQ1Uk9VTkRbXTogICBTdXBlciBST1VORCA0NSBkZWdyZWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TNDVST1VORCggSU5TX0FSRyApCi0gIHsKLSAgICBET19TNDVST1VORAotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNMT09QW106ICAgICAgU2V0IExPT1AgdmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0xPT1AoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU0xPT1AKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTTURbXTogICAgICAgIFNldCBNaW5pbXVtIERpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NNRCggSU5TX0FSRyApCi0gIHsKLSAgICBET19TTUQKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQ1ZUQ0lbXTogICAgIFNldCBDb250cm9sIFZhbHVlIFRhYmxlIEN1dCBJbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NDVlRDSSggSU5TX0FSRyApCi0gIHsKLSAgICBET19TQ1ZUQ0kKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTU1dDSVtdOiAgICAgIFNldCBTaW5nbGUgV2lkdGggQ3V0IEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDFFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NTV0NJKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NTV0NJCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1NXW106ICAgICAgICBTZXQgU2luZ2xlIFdpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TU1coIElOU19BUkcgKQotICB7Ci0gICAgRE9fU1NXCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUE9OW106ICAgICBTZXQgYXV0by1GTElQIHRvIE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTElQT04oIElOU19BUkcgKQotICB7Ci0gICAgRE9fRkxJUE9OCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUE9GRltdOiAgICBTZXQgYXV0by1GTElQIHRvIE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTElQT0ZGKCBJTlNfQVJHICkKLSAgewotICAgIERPX0ZMSVBPRkYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQU5HV1tdOiAgICAgIFNldCBBTkdsZSBXZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NBTkdXKCBJTlNfQVJHICkKLSAgewotICAgIC8qIGluc3RydWN0aW9uIG5vdCBzdXBwb3J0ZWQgYW55bW9yZSAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNEQltdOiAgICAgICAgU2V0IERlbHRhIEJhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0RCKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NEQgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNEU1tdOiAgICAgICAgU2V0IERlbHRhIFNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0RTKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NEUwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1QUEVNW106ICAgICAgTWVhc3VyZSBQaXhlbCBQZXIgRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gRXVpbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTVBQRU0oIElOU19BUkcgKQotICB7Ci0gICAgRE9fTVBQRU0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNUFNbXTogICAgICAgIE1lYXN1cmUgUG9pbnQgU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IEV1aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01QUyggSU5TX0FSRyApCi0gIHsKLSAgICBET19NUFMKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEVVBbXTogICAgICAgIERVUGxpY2F0ZSB0aGUgdG9wIHN0YWNrJ3MgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiBTdGtFbHQgU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0RVUCggSU5TX0FSRyApCi0gIHsKLSAgICBET19EVVAKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQT1BbXTogICAgICAgIFBPUCB0aGUgc3RhY2sncyB0b3AgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1BPUCggSU5TX0FSRyApCi0gIHsKLSAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0xFQVJbXTogICAgICBDTEVBUiB0aGUgZW50aXJlIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdC4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19DTEVBUiggSU5TX0FSRyApCi0gIHsKLSAgICBET19DTEVBUgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNXQVBbXTogICAgICAgU1dBUCB0aGUgc3RhY2sncyB0b3AgdHdvIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAyICogU3RrRWx0IC0tPiAyICogU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1dBUCggSU5TX0FSRyApCi0gIHsKLSAgICBET19TV0FQCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogREVQVEhbXTogICAgICByZXR1cm4gdGhlIHN0YWNrIERFUFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ERVBUSCggSU5TX0FSRyApCi0gIHsKLSAgICBET19ERVBUSAotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENJTkRFWFtdOiAgICAgQ29weSBJTkRFWGVkIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMiAtLT4gU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQ0lOREVYKCBJTlNfQVJHICkKLSAgewotICAgIERPX0NJTkRFWAotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVJRltdOiAgICAgICAgRW5kIElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRUlGKCBJTlNfQVJHICkKLSAgewotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBKUk9UW106ICAgICAgIEp1bXAgUmVsYXRpdmUgT24gVHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IGludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0pST1QoIElOU19BUkcgKQotICB7Ci0gICAgRE9fSlJPVAotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEpNUFJbXTogICAgICAgSnVNUCBSZWxhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSk1QUiggSU5TX0FSRyApCi0gIHsKLSAgICBET19KTVBSCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSlJPRltdOiAgICAgICBKdW1wIFJlbGF0aXZlIE9uIEZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19KUk9GKCBJTlNfQVJHICkKLSAgewotICAgIERPX0pST0YKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMVFtdOiAgICAgICAgIExlc3MgVGhhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0xUKCBJTlNfQVJHICkKLSAgewotICAgIERPX0xUCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTFRFUVtdOiAgICAgICBMZXNzIFRoYW4gb3IgRVF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19MVEVRKCBJTlNfQVJHICkKLSAgewotICAgIERPX0xURVEKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHVFtdOiAgICAgICAgIEdyZWF0ZXIgVGhhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0dUKCBJTlNfQVJHICkKLSAgewotICAgIERPX0dUCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR1RFUVtdOiAgICAgICBHcmVhdGVyIFRoYW4gb3IgRVF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HVEVRKCBJTlNfQVJHICkKLSAgewotICAgIERPX0dURVEKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFUVtdOiAgICAgICAgIEVRdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IFN0a0VsdCAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0VRKCBJTlNfQVJHICkKLSAgewotICAgIERPX0VRCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTkVRW106ICAgICAgICBOb3QgRVF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBTdGtFbHQgLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ORVEoIElOU19BUkcgKQotICB7Ci0gICAgRE9fTkVRCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT0REW106ICAgICAgICBJcyBPREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19PREQoIElOU19BUkcgKQotICB7Ci0gICAgRE9fT0RECi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRVZFTltdOiAgICAgICBJcyBFVkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19FVkVOKCBJTlNfQVJHICkKLSAgewotICAgIERPX0VWRU4KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBTkRbXTogICAgICAgIGxvZ2ljYWwgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0FORCggSU5TX0FSRyApCi0gIHsKLSAgICBET19BTkQKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPUltdOiAgICAgICAgIGxvZ2ljYWwgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX09SKCBJTlNfQVJHICkKLSAgewotICAgIERPX09SCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTk9UW106ICAgICAgICBsb2dpY2FsIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdCAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19OT1QoIElOU19BUkcgKQotICB7Ci0gICAgRE9fTk9UCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQUREW106ICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19BREQoIElOU19BUkcgKQotICB7Ci0gICAgRE9fQURECi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1VCW106ICAgICAgICBTVUJ0cmFjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TVUIoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU1VCCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRElWW106ICAgICAgICBESVZpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ESVYoIElOU19BUkcgKQotICB7Ci0gICAgRE9fRElWCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTVVMW106ICAgICAgICBNVUx0aXBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NVUwoIElOU19BUkcgKQotICB7Ci0gICAgRE9fTVVMCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQUJTW106ICAgICAgICBBQlNvbHV0ZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19BQlMoIElOU19BUkcgKQotICB7Ci0gICAgRE9fQUJTCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTkVHW106ICAgICAgICBORUdhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ORUcoIElOU19BUkcgKQotICB7Ci0gICAgRE9fTkVHCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxPT1JbXTogICAgICBGTE9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTE9PUiggSU5TX0FSRyApCi0gIHsKLSAgICBET19GTE9PUgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENFSUxJTkdbXTogICAgQ0VJTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQ0VJTElORyggSU5TX0FSRyApCi0gIHsKLSAgICBET19DRUlMSU5HCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUlNbXTogICAgICAgICBSZWFkIFN0b3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SUyggSU5TX0FSRyApCi0gIHsKLSAgICBET19SUwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdTW106ICAgICAgICAgV3JpdGUgU3RvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfV1MoIElOU19BUkcgKQotICB7Ci0gICAgRE9fV1MKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXQ1ZUUFtdOiAgICAgIFdyaXRlIENWVCBpbiBQaXhlbCB1bml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1dDVlRQKCBJTlNfQVJHICkKLSAgewotICAgIERPX1dDVlRQCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV0NWVEZbXTogICAgICBXcml0ZSBDVlQgaW4gRnVuaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19XQ1ZURiggSU5TX0FSRyApCi0gIHsKLSAgICBET19XQ1ZURgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJDVlRbXTogICAgICAgUmVhZCBDVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUkNWVCggSU5TX0FSRyApCi0gIHsKLSAgICBET19SQ1ZUCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQUFbXTogICAgICAgICBBZGp1c3QgQW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3RiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19BQSggSU5TX0FSRyApCi0gIHsKLSAgICAvKiBpbnRlbnRpb25hbGx5IG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBERUJVR1tdOiAgICAgIERFQlVHLiAgVW5zdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDRGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZTogVGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIHBvcHMgYSB2YWx1ZSBmcm9tIHRoZSBzdGFjay4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfREVCVUcoIElOU19BUkcgKQotICB7Ci0gICAgRE9fREVCVUcKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBST1VORFthYl06ICAgIFJPVU5EIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDY4LTB4NkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JPVU5EKCBJTlNfQVJHICkKLSAgewotICAgIERPX1JPVU5ECi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTlJPVU5EW2FiXTogICBObyBST1VORGluZyBvZiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2Qy0weDZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19OUk9VTkQoIElOU19BUkcgKQotICB7Ci0gICAgRE9fTlJPVU5ECi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUFYW106ICAgICAgICBNQVhpbXVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NQVgoIElOU19BUkcgKQotICB7Ci0gICAgRE9fTUFYCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUlOW106ICAgICAgICBNSU5pbXVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NSU4oIElOU19BUkcgKQotICB7Ci0gICAgRE9fTUlOCi0gIH0KLQotCi0jZW5kaWYgIC8qICFUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGFzIGlzIHdpdGhpbiB0aGUgc3dpdGNoIHN0YXRlbWVudC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSU5ERVhbXTogICAgIE1vdmUgSU5ERVhlZCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IC0tPiBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01JTkRFWCggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9Mb25nICBMLCBLOwotCi0KLSAgICBMID0gYXJnc1swXTsKLQotICAgIGlmICggTCA8PSAwIHx8IEwgPiBDVVIuYXJncyApCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEsgPSBDVVIuc3RhY2tbQ1VSLmFyZ3MgLSBMXTsKLQotICAgIEZUX0FSUkFZX01PVkUoICZDVVIuc3RhY2tbQ1VSLmFyZ3MgLSBMICAgIF0sCi0gICAgICAgICAgICAgICAgICAgJkNVUi5zdGFja1tDVVIuYXJncyAtIEwgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAoIEwgLSAxICkgKTsKLQotICAgIENVUi5zdGFja1tDVVIuYXJncyAtIDFdID0gSzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBST0xMW106ICAgICAgIFJPTEwgdG9wIHRocmVlIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgMyAqIFN0a0VsdCAtLT4gMyAqIFN0a0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JPTEwoIElOU19BUkcgKQotICB7Ci0gICAgRlRfTG9uZyAgQSwgQiwgQzsKLQotICAgIEZUX1VOVVNFRF9FWEVDOwotCi0KLSAgICBBID0gYXJnc1syXTsKLSAgICBCID0gYXJnc1sxXTsKLSAgICBDID0gYXJnc1swXTsKLQotICAgIGFyZ3NbMl0gPSBDOwotICAgIGFyZ3NbMV0gPSBBOwotICAgIGFyZ3NbMF0gPSBCOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1BTkFHSU5HIFRIRSBGTE9XIE9GIENPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJbnN0cnVjdGlvbnMgYXBwZWFyIGluIHRoZSBzcGVjaWZpY2F0aW9uJ3Mgb3JkZXIuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIFNraXBDb2RlKCBFWEVDX09QICkKLSAgewotICAgIENVUi5JUCArPSBDVVIubGVuZ3RoOwotCi0gICAgaWYgKCBDVVIuSVAgPCBDVVIuY29kZVNpemUgKQotICAgIHsKLSAgICAgIENVUi5vcGNvZGUgPSBDVVIuY29kZVtDVVIuSVBdOwotCi0gICAgICBDVVIubGVuZ3RoID0gb3Bjb2RlX2xlbmd0aFtDVVIub3Bjb2RlXTsKLSAgICAgIGlmICggQ1VSLmxlbmd0aCA8IDAgKQotICAgICAgewotICAgICAgICBpZiAoIENVUi5JUCArIDEgPiBDVVIuY29kZVNpemUgKQotICAgICAgICAgIGdvdG8gRmFpbF9PdmVyZmxvdzsKLSAgICAgICAgQ1VSLmxlbmd0aCA9IDIgLSBDVVIubGVuZ3RoICogQ1VSLmNvZGVbQ1VSLklQICsgMV07Ci0gICAgICB9Ci0KLSAgICAgIGlmICggQ1VSLklQICsgQ1VSLmxlbmd0aCA8PSBDVVIuY29kZVNpemUgKQotICAgICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICB9Ci0KLSAgRmFpbF9PdmVyZmxvdzoKLSAgICBDVVIuZXJyb3IgPSBUVF9FcnJfQ29kZV9PdmVyZmxvdzsKLSAgICByZXR1cm4gRkFJTFVSRTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJRltdOiAgICAgICAgIElGIHRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0lGKCBJTlNfQVJHICkKLSAgewotICAgIEZUX0ludCAgIG5JZnM7Ci0gICAgRlRfQm9vbCAgT3V0OwotCi0KLSAgICBpZiAoIGFyZ3NbMF0gIT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICBuSWZzID0gMTsKLSAgICBPdXQgPSAwOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBpZiAoIFNLSVBfQ29kZSgpID09IEZBSUxVUkUgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQotICAgICAgewotICAgICAgY2FzZSAweDU4OiAgICAgIC8qIElGICovCi0gICAgICAgIG5JZnMrKzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHgxQjogICAgICAvKiBFTFNFICovCi0gICAgICAgIE91dCA9IEZUX0JPT0woIG5JZnMgPT0gMSApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAweDU5OiAgICAgIC8qIEVJRiAqLwotICAgICAgICBuSWZzLS07Ci0gICAgICAgIE91dCA9IEZUX0JPT0woIG5JZnMgPT0gMCApOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IHdoaWxlICggT3V0ID09IDAgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFTFNFW106ICAgICAgIEVMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDFCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0VMU0UoIElOU19BUkcgKQotICB7Ci0gICAgRlRfSW50ICBuSWZzOwotCi0gICAgRlRfVU5VU0VEX0FSRzsKLQotCi0gICAgbklmcyA9IDE7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIGlmICggU0tJUF9Db2RlKCkgPT0gRkFJTFVSRSApCi0gICAgICAgIHJldHVybjsKLQotICAgICAgc3dpdGNoICggQ1VSLm9wY29kZSApCi0gICAgICB7Ci0gICAgICBjYXNlIDB4NTg6ICAgIC8qIElGICovCi0gICAgICAgIG5JZnMrKzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg1OTogICAgLyogRUlGICovCi0gICAgICAgIG5JZnMtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoIG5JZnMgIT0gMCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFRklOSU5HIEFORCBVU0lORyBGVU5DVElPTlMgQU5EIElOU1RSVUNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJbnN0cnVjdGlvbnMgYXBwZWFyIGluIHRoZSBzcGVjaWZpY2F0aW9uJ3Mgb3JkZXIuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkRFRltdOiAgICAgICBGdW5jdGlvbiBERUZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GREVGKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VMb25nICAgICAgIG47Ci0gICAgVFRfRGVmUmVjb3JkKiAgcmVjOwotICAgIFRUX0RlZlJlY29yZCogIGxpbWl0OwotCi0KLSAgICAvKiBzb21lIGZvbnQgcHJvZ3JhbXMgYXJlIGJyb2tlbiBlbm91Z2ggdG8gcmVkZWZpbmUgZnVuY3Rpb25zISAqLwotICAgIC8qIFdlIHdpbGwgdGhlbiBwYXJzZSB0aGUgY3VycmVudCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICByZWMgICA9IENVUi5GRGVmczsKLSAgICBsaW1pdCA9IHJlYyArIENVUi5udW1GRGVmczsKLSAgICBuICAgICA9IGFyZ3NbMF07Ci0KLSAgICBmb3IgKCA7IHJlYyA8IGxpbWl0OyByZWMrKyApCi0gICAgewotICAgICAgaWYgKCByZWMtPm9wYyA9PSBuICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCByZWMgPT0gbGltaXQgKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gZm9yIG5ldyBmdW5jdGlvbnMgKi8KLSAgICAgIGlmICggQ1VSLm51bUZEZWZzID49IENVUi5tYXhGRGVmcyApCi0gICAgICB7Ci0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9Ub29fTWFueV9GdW5jdGlvbl9EZWZzOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBDVVIubnVtRkRlZnMrKzsKLSAgICB9Ci0KLSAgICByZWMtPnJhbmdlICA9IENVUi5jdXJSYW5nZTsKLSAgICByZWMtPm9wYyAgICA9IG47Ci0gICAgcmVjLT5zdGFydCAgPSBDVVIuSVAgKyAxOwotICAgIHJlYy0+YWN0aXZlID0gVFJVRTsKLQotICAgIGlmICggbiA+IENVUi5tYXhGdW5jICkKLSAgICAgIENVUi5tYXhGdW5jID0gbjsKLQotICAgIC8qIE5vdyBza2lwIHRoZSB3aG9sZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAqLwotICAgIC8qIFdlIGRvbid0IGFsbG93IG5lc3RlZCBJREVGUyAmIEZERUZzLiAgICAqLwotCi0gICAgd2hpbGUgKCBTS0lQX0NvZGUoKSA9PSBTVUNDRVNTICkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCBDVVIub3Bjb2RlICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMHg4OTogICAgLyogSURFRiAqLwotICAgICAgY2FzZSAweDJDOiAgICAvKiBGREVGICovCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9OZXN0ZWRfREVGUzsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBjYXNlIDB4MkQ6ICAgLyogRU5ERiAqLwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVOREZbXTogICAgICAgRU5EIEZ1bmN0aW9uIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRU5ERiggSU5TX0FSRyApCi0gIHsKLSAgICBUVF9DYWxsUmVjKiAgcFJlYzsKLQotICAgIEZUX1VOVVNFRF9BUkc7Ci0KLQotICAgIGlmICggQ1VSLmNhbGxUb3AgPD0gMCApICAgICAvKiBXZSBlbmNvdW50ZXJlZCBhbiBFTkRGIHdpdGhvdXQgYSBjYWxsICovCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0VOREZfSW5fRXhlY19TdHJlYW07Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ1VSLmNhbGxUb3AtLTsKLQotICAgIHBSZWMgPSAmQ1VSLmNhbGxTdGFja1tDVVIuY2FsbFRvcF07Ci0KLSAgICBwUmVjLT5DdXJfQ291bnQtLTsKLQotICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOwotCi0gICAgaWYgKCBwUmVjLT5DdXJfQ291bnQgPiAwICkKLSAgICB7Ci0gICAgICBDVVIuY2FsbFRvcCsrOwotICAgICAgQ1VSLklQID0gcFJlYy0+Q3VyX1Jlc3RhcnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgY3VycmVudCBmdW5jdGlvbiAqLwotICAgICAgSU5TX0dvdG9fQ29kZVJhbmdlKCBwUmVjLT5DYWxsZXJfUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWMtPkNhbGxlcl9JUCApOwotCi0gICAgLyogRXhpdCB0aGUgY3VycmVudCBjYWxsIGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogTk9URTogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgYSBwcm9ncmFtIGlzIGEgICAqLwotICAgIC8qICAgICAgIENBTEwgb3IgTE9PUENBTEwsIHRoZSByZXR1cm4gYWRkcmVzcyBpcyAgICAgKi8KLSAgICAvKiAgICAgICBhbHdheXMgb3V0IG9mIHRoZSBjb2RlIHJhbmdlLiAgVGhpcyBpcyBhICAgICovCi0gICAgLyogICAgICAgdmFsaWQgYWRkcmVzcywgYW5kIGl0IGlzIHdoeSB3ZSBkbyBub3QgdGVzdCAqLwotICAgIC8qICAgICAgIHRoZSByZXN1bHQgb2YgSW5zX0dvdG9fQ29kZVJhbmdlKCkgaGVyZSEgICAgKi8KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDQUxMW106ICAgICAgIENBTEwgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDJCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0NBTEwoIElOU19BUkcgKQotICB7Ci0gICAgRlRfVUxvbmcgICAgICAgRjsKLSAgICBUVF9DYWxsUmVjKiAgICBwQ3JlYzsKLSAgICBUVF9EZWZSZWNvcmQqICBkZWY7Ci0KLQotICAgIC8qIGZpcnN0IG9mIGFsbCwgY2hlY2sgdGhlIGluZGV4ICovCi0KLSAgICBGID0gYXJnc1swXTsKLSAgICBpZiAoIEJPVU5EUyggRiwgQ1VSLm1heEZ1bmMgKyAxICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgLyogRXhjZXB0IGZvciBzb21lIG9sZCBBcHBsZSBmb250cywgYWxsIGZ1bmN0aW9ucyBpbiBhIFRydWVUeXBlICovCi0gICAgLyogZm9udCBhcmUgZGVmaW5lZCBpbiBpbmNyZWFzaW5nIG9yZGVyLCBzdGFydGluZyBmcm9tIDAuICBUaGlzICovCi0gICAgLyogbWVhbnMgdGhhdCB3ZSBub3JtYWxseSBoYXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgQ1VSLm1heEZ1bmMrMSA9PSBDVVIubnVtRkRlZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgQ1VSLkZEZWZzW25dLm9wYyA9PSBuIGZvciBuIGluIDAuLkNVUi5tYXhGdW5jICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSWYgdGhpcyBpc24ndCB0cnVlLCB3ZSBuZWVkIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRhYmxlLiAgICovCi0KLSAgICBkZWYgPSBDVVIuRkRlZnMgKyBGOwotICAgIGlmICggQ1VSLm1heEZ1bmMgKyAxICE9IENVUi5udW1GRGVmcyB8fCBkZWYtPm9wYyAhPSBGICkKLSAgICB7Ci0gICAgICAvKiBsb29rIHVwIHRoZSBGRGVmcyB0YWJsZSAqLwotICAgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQ7Ci0KLQotICAgICAgZGVmICAgPSBDVVIuRkRlZnM7Ci0gICAgICBsaW1pdCA9IGRlZiArIENVUi5udW1GRGVmczsKLQotICAgICAgd2hpbGUgKCBkZWYgPCBsaW1pdCAmJiBkZWYtPm9wYyAhPSBGICkKLSAgICAgICAgZGVmKys7Ci0KLSAgICAgIGlmICggZGVmID09IGxpbWl0ICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGFjdGl2ZSAqLwotICAgIGlmICggIWRlZi0+YWN0aXZlICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIGNoZWNrIHRoZSBjYWxsIHN0YWNrICovCi0gICAgaWYgKCBDVVIuY2FsbFRvcCA+PSBDVVIuY2FsbFNpemUgKQotICAgIHsKLSAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwQ3JlYyA9IENVUi5jYWxsU3RhY2sgKyBDVVIuY2FsbFRvcDsKLQotICAgIHBDcmVjLT5DYWxsZXJfUmFuZ2UgPSBDVVIuY3VyUmFuZ2U7Ci0gICAgcENyZWMtPkNhbGxlcl9JUCAgICA9IENVUi5JUCArIDE7Ci0gICAgcENyZWMtPkN1cl9Db3VudCAgICA9IDE7Ci0gICAgcENyZWMtPkN1cl9SZXN0YXJ0ICA9IGRlZi0+c3RhcnQ7Ci0KLSAgICBDVVIuY2FsbFRvcCsrOwotCi0gICAgSU5TX0dvdG9fQ29kZVJhbmdlKCBkZWYtPnJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVmLT5zdGFydCApOwotCi0gICAgQ1VSLnN0ZXBfaW5zID0gRkFMU0U7Ci0gICAgcmV0dXJuOwotCi0gIEZhaWw6Ci0gICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIExPT1BDQUxMW106ICAgTE9PUCBhbmQgQ0FMTCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzI/IEVpbnQxNj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTE9PUENBTEwoIElOU19BUkcgKQotICB7Ci0gICAgRlRfVUxvbmcgICAgICAgRjsKLSAgICBUVF9DYWxsUmVjKiAgICBwQ3JlYzsKLSAgICBUVF9EZWZSZWNvcmQqICBkZWY7Ci0KLQotICAgIC8qIGZpcnN0IG9mIGFsbCwgY2hlY2sgdGhlIGluZGV4ICovCi0gICAgRiA9IGFyZ3NbMV07Ci0gICAgaWYgKCBCT1VORFMoIEYsIENVUi5tYXhGdW5jICsgMSApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIEV4Y2VwdCBmb3Igc29tZSBvbGQgQXBwbGUgZm9udHMsIGFsbCBmdW5jdGlvbnMgaW4gYSBUcnVlVHlwZSAqLwotICAgIC8qIGZvbnQgYXJlIGRlZmluZWQgaW4gaW5jcmVhc2luZyBvcmRlciwgc3RhcnRpbmcgZnJvbSAwLiAgVGhpcyAqLwotICAgIC8qIG1lYW5zIHRoYXQgd2Ugbm9ybWFsbHkgaGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIENVUi5tYXhGdW5jKzEgPT0gQ1VSLm51bUZEZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIENVUi5GRGVmc1tuXS5vcGMgPT0gbiBmb3IgbiBpbiAwLi5DVVIubWF4RnVuYyAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIElmIHRoaXMgaXNuJ3QgdHJ1ZSwgd2UgbmVlZCB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0YWJsZS4gICAqLwotCi0gICAgZGVmID0gQ1VSLkZEZWZzICsgRjsKLSAgICBpZiAoIENVUi5tYXhGdW5jICsgMSAhPSBDVVIubnVtRkRlZnMgfHwgZGVmLT5vcGMgIT0gRiApCi0gICAgewotICAgICAgLyogbG9vayB1cCB0aGUgRkRlZnMgdGFibGUgKi8KLSAgICAgIFRUX0RlZlJlY29yZCogIGxpbWl0OwotCi0KLSAgICAgIGRlZiAgID0gQ1VSLkZEZWZzOwotICAgICAgbGltaXQgPSBkZWYgKyBDVVIubnVtRkRlZnM7Ci0KLSAgICAgIHdoaWxlICggZGVmIDwgbGltaXQgJiYgZGVmLT5vcGMgIT0gRiApCi0gICAgICAgIGRlZisrOwotCi0gICAgICBpZiAoIGRlZiA9PSBsaW1pdCApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGF0IHRoZSBmdW5jdGlvbiBpcyBhY3RpdmUgKi8KLSAgICBpZiAoICFkZWYtPmFjdGl2ZSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBjaGVjayBzdGFjayAqLwotICAgIGlmICggQ1VSLmNhbGxUb3AgPj0gQ1VSLmNhbGxTaXplICkKLSAgICB7Ci0gICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfU3RhY2tfT3ZlcmZsb3c7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBhcmdzWzBdID4gMCApCi0gICAgewotICAgICAgcENyZWMgPSBDVVIuY2FsbFN0YWNrICsgQ1VSLmNhbGxUb3A7Ci0KLSAgICAgIHBDcmVjLT5DYWxsZXJfUmFuZ2UgPSBDVVIuY3VyUmFuZ2U7Ci0gICAgICBwQ3JlYy0+Q2FsbGVyX0lQICAgID0gQ1VSLklQICsgMTsKLSAgICAgIHBDcmVjLT5DdXJfQ291bnQgICAgPSAoRlRfSW50KWFyZ3NbMF07Ci0gICAgICBwQ3JlYy0+Q3VyX1Jlc3RhcnQgID0gZGVmLT5zdGFydDsKLQotICAgICAgQ1VSLmNhbGxUb3ArKzsKLQotICAgICAgSU5TX0dvdG9fQ29kZVJhbmdlKCBkZWYtPnJhbmdlLCBkZWYtPnN0YXJ0ICk7Ci0KLSAgICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOwotICAgIH0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSURFRltdOiAgICAgICBJbnN0cnVjdGlvbiBERUZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19JREVGKCBJTlNfQVJHICkKLSAgewotICAgIFRUX0RlZlJlY29yZCogIGRlZjsKLSAgICBUVF9EZWZSZWNvcmQqICBsaW1pdDsKLQotCi0gICAgLyogIEZpcnN0IG9mIGFsbCwgbG9vayBmb3IgdGhlIHNhbWUgZnVuY3Rpb24gaW4gb3VyIHRhYmxlICovCi0KLSAgICBkZWYgICA9IENVUi5JRGVmczsKLSAgICBsaW1pdCA9IGRlZiArIENVUi5udW1JRGVmczsKLQotICAgIGZvciAoIDsgZGVmIDwgbGltaXQ7IGRlZisrICkKLSAgICAgIGlmICggZGVmLT5vcGMgPT0gKEZUX1VMb25nKWFyZ3NbMF0gKQotICAgICAgICBicmVhazsKLQotICAgIGlmICggZGVmID09IGxpbWl0ICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGZvciBhIG5ldyBpbnN0cnVjdGlvbiAqLwotICAgICAgaWYgKCBDVVIubnVtSURlZnMgPj0gQ1VSLm1heElEZWZzICkKLSAgICAgIHsKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX1Rvb19NYW55X0luc3RydWN0aW9uX0RlZnM7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIENVUi5udW1JRGVmcysrOwotICAgIH0KLQotICAgIGRlZi0+b3BjICAgID0gYXJnc1swXTsKLSAgICBkZWYtPnN0YXJ0ICA9IENVUi5JUCsxOwotICAgIGRlZi0+cmFuZ2UgID0gQ1VSLmN1clJhbmdlOwotICAgIGRlZi0+YWN0aXZlID0gVFJVRTsKLQotICAgIGlmICggKEZUX1VMb25nKWFyZ3NbMF0gPiBDVVIubWF4SW5zICkKLSAgICAgIENVUi5tYXhJbnMgPSBhcmdzWzBdOwotCi0gICAgLyogTm93IHNraXAgdGhlIHdob2xlIGZ1bmN0aW9uIGRlZmluaXRpb24uICovCi0gICAgLyogV2UgZG9uJ3QgYWxsb3cgbmVzdGVkIElERUZzICYgRkRFRnMuICAgICovCi0KLSAgICB3aGlsZSAoIFNLSVBfQ29kZSgpID09IFNVQ0NFU1MgKQotICAgIHsKLSAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQotICAgICAgewotICAgICAgY2FzZSAweDg5OiAgIC8qIElERUYgKi8KLSAgICAgIGNhc2UgMHgyQzogICAvKiBGREVGICovCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9OZXN0ZWRfREVGUzsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSAweDJEOiAgIC8qIEVOREYgKi8KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQVVNISU5HIERBVEEgT05UTyBUSEUgSU5URVJQUkVURVIgU1RBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSW5zdHJ1Y3Rpb25zIGFwcGVhciBpbiB0aGUgc3BlY2lmaWNhdGlvbidzIG9yZGVyLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5QVVNIQltdOiAgICAgUFVTSCBOIEJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTlBVU0hCKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VTaG9ydCAgTCwgSzsKLQotCi0gICAgTCA9IChGVF9VU2hvcnQpQ1VSLmNvZGVbQ1VSLklQICsgMV07Ci0KLSAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnN0YWNrU2l6ZSArIDEgLSBDVVIudG9wICkgKQotICAgIHsKLSAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKCBLID0gMTsgSyA8PSBMOyBLKysgKQotICAgICAgYXJnc1tLIC0gMV0gPSBDVVIuY29kZVtDVVIuSVAgKyBLICsgMV07Ci0KLSAgICBDVVIubmV3X3RvcCArPSBMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5QVVNIV1tdOiAgICAgUFVTSCBOIFdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gaW50MzIuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTlBVU0hXKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VTaG9ydCAgTCwgSzsKLQotCi0gICAgTCA9IChGVF9VU2hvcnQpQ1VSLmNvZGVbQ1VSLklQICsgMV07Ci0KLSAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnN0YWNrU2l6ZSArIDEgLSBDVVIudG9wICkgKQotICAgIHsKLSAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDVVIuSVAgKz0gMjsKLQotICAgIGZvciAoIEsgPSAwOyBLIDwgTDsgSysrICkKLSAgICAgIGFyZ3NbS10gPSBHRVRfU2hvcnRJbnMoKTsKLQotICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOwotICAgIENVUi5uZXdfdG9wICs9IEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUFVTSEJbYWJjXTogICBQVVNIIEJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHhCMC0weEI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiB1aW50MzIuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19QVVNIQiggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9VU2hvcnQgIEwsIEs7Ci0KLQotICAgIEwgPSAoRlRfVVNob3J0KSggQ1VSLm9wY29kZSAtIDB4QjAgKyAxICk7Ci0KLSAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnN0YWNrU2l6ZSArIDEgLSBDVVIudG9wICkgKQotICAgIHsKLSAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKCBLID0gMTsgSyA8PSBMOyBLKysgKQotICAgICAgYXJnc1tLIC0gMV0gPSBDVVIuY29kZVtDVVIuSVAgKyBLXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQVVNIV1thYmNdOiAgIFBVU0ggV29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweEI4LTB4QkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IGludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1BVU0hXKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VTaG9ydCAgTCwgSzsKLQotCi0gICAgTCA9IChGVF9VU2hvcnQpKCBDVVIub3Bjb2RlIC0gMHhCOCArIDEgKTsKLQotICAgIGlmICggQk9VTkRTKCBMLCBDVVIuc3RhY2tTaXplICsgMSAtIENVUi50b3AgKSApCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX1N0YWNrX092ZXJmbG93OwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENVUi5JUCsrOwotCi0gICAgZm9yICggSyA9IDA7IEsgPCBMOyBLKysgKQotICAgICAgYXJnc1tLXSA9IEdFVF9TaG9ydElucygpOwotCi0gICAgQ1VSLnN0ZXBfaW5zID0gRkFMU0U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUFOQUdJTkcgVEhFIEdSQVBISUNTIFNUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgSW5zdHJ1Y3Rpb25zIGFwcGVhciBpbiB0aGUgc3BlY3MnIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHQ1thXTogICAgICAgIEdldCBDb29yZGluYXRlIHByb2plY3RlZCBvbnRvICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQ2LTB4NDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQlVMTFNISVQ6IE1lYXN1cmVzIGZyb20gdGhlIG9yaWdpbmFsIGdseXBoIG11c3QgYmUgdGFrZW4gYWxvbmcgdGhlICAgICovCi0gIC8qICAgICAgICAgICBkdWFsIHByb2plY3Rpb24gdmVjdG9yISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0dDKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VMb25nICAgIEw7Ci0gICAgRlRfRjI2RG90NiAgUjsKLQotCi0gICAgTCA9IChGVF9VTG9uZylhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIEwsIENVUi56cDIubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICB7Ci0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBSID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggQ1VSLm9wY29kZSAmIDEgKQotICAgICAgICBSID0gQ1VSX2Zhc3RfZHVhbHByb2ooICZDVVIuenAyLm9yZ1tMXSApOwotICAgICAgZWxzZQotICAgICAgICBSID0gQ1VSX2Zhc3RfcHJvamVjdCggJkNVUi56cDIuY3VyW0xdICk7Ci0gICAgfQotCi0gICAgYXJnc1swXSA9IFI7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0NGU1tdOiAgICAgICBTZXQgQ29vcmRpbmF0ZSBGcm9tIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvcm11bGE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBPQSA6PSBPQSArICggdmFsdWUgLSBPQS5wICkvKCBmLnAgKSAqIGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0NGUyggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9Mb25nICAgIEs7Ci0gICAgRlRfVVNob3J0ICBMOwotCi0KLSAgICBMID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIEwsIENVUi56cDIubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBLID0gQ1VSX2Zhc3RfcHJvamVjdCggJkNVUi56cDIuY3VyW0xdICk7Ci0KLSAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMiwgTCwgYXJnc1sxXSAtIEsgKTsKLQotICAgIC8qIG5vdCBwYXJ0IG9mIHRoZSBzcGVjcywgYnV0IGhlcmUgZm9yIHNhZmV0eSAqLwotCi0gICAgaWYgKCBDVVIuR1MuZ2VwMiA9PSAwICkKLSAgICAgIENVUi56cDIub3JnW0xdID0gQ1VSLnpwMi5jdXJbTF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTURbYV06ICAgICAgICBNZWFzdXJlIERpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0OS0weDRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJVTExTSElUOiBNZWFzdXJlIHRha2VuIGluIHRoZSBvcmlnaW5hbCBnbHlwaCBtdXN0IGJlIGFsb25nIHRoZSBkdWFsICAqLwotICAvKiAgICAgICAgICAgcHJvamVjdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlY29uZCBCVUxMU0hJVDogRmxhZyBhdHRyaWJ1dGVzIGFyZSBpbnZlcnRlZCEgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIDAgPT4gbWVhc3VyZSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBvdXRsaW5lICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAxID0+IG1lYXN1cmUgZGlzdGFuY2UgaW4gZ3JpZC1maXR0ZWQgb3V0bGluZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlyZCBvbmU6IGB6cDAgLSB6cDEnLCBhbmQgbm90IGB6cDIgLSB6cDEhICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NRCggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9VU2hvcnQgICBLLCBMOwotICAgIEZUX0YyNkRvdDYgIEQ7Ci0KLQotICAgIEsgPSAoRlRfVVNob3J0KWFyZ3NbMV07Ci0gICAgTCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmKCBCT1VORFMoIEwsIENVUi56cDAubl9wb2ludHMgKSB8fAotICAgICAgICBCT1VORFMoIEssIENVUi56cDEubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICB7Ci0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgRCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIENVUi5vcGNvZGUgJiAxICkKLSAgICAgICAgRCA9IENVUl9GdW5jX3Byb2plY3QoIENVUi56cDAuY3VyICsgTCwgQ1VSLnpwMS5jdXIgKyBLICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciogIHZlYzEgPSBDVVIuenAwLm9ydXMgKyBMOwotICAgICAgICBGVF9WZWN0b3IqICB2ZWMyID0gQ1VSLnpwMS5vcnVzICsgSzsKLQotCi0gICAgICAgIGlmICggQ1VSLm1ldHJpY3MueF9zY2FsZSA9PSBDVVIubWV0cmljcy55X3NjYWxlICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgc2hvdWxkIGJlIGZhc3RlciAqLwotICAgICAgICAgIEQgPSBDVVJfRnVuY19kdWFscHJvaiggdmVjMSwgdmVjMiApOwotICAgICAgICAgIEQgPSBUVF9NVUxGSVgoIEQsIENVUi5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9WZWN0b3IgIHZlYzsKLQotCi0gICAgICAgICAgdmVjLnggPSBUVF9NVUxGSVgoIHZlYzEtPnggLSB2ZWMyLT54LCBDVVIubWV0cmljcy54X3NjYWxlICk7Ci0gICAgICAgICAgdmVjLnkgPSBUVF9NVUxGSVgoIHZlYzEtPnkgLSB2ZWMyLT55LCBDVVIubWV0cmljcy55X3NjYWxlICk7Ci0KLSAgICAgICAgICBEID0gQ1VSX2Zhc3RfZHVhbHByb2ooICZ2ZWMgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGFyZ3NbMF0gPSBEOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNEUFZUTFthXTogICAgU2V0IER1YWwgUFZlY3RvciB0byBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODYtMHg4NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0RQVlRMKCBJTlNfQVJHICkKLSAgewotICAgIEZUX0xvbmcgICAgQSwgQiwgQzsKLSAgICBGVF9VU2hvcnQgIHAxLCBwMjsgICAvKiB3YXMgRlRfSW50IGluIHBhcyB0eXBlIEVSUk9SICovCi0KLQotICAgIHAxID0gKEZUX1VTaG9ydClhcmdzWzFdOwotICAgIHAyID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIHAyLCBDVVIuenAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggcDEsIENVUi56cDIubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqIHYxID0gQ1VSLnpwMS5vcmcgKyBwMjsKLSAgICAgIEZUX1ZlY3RvciogdjIgPSBDVVIuenAyLm9yZyArIHAxOwotCi0KLSAgICAgIEEgPSB2MS0+eCAtIHYyLT54OwotICAgICAgQiA9IHYxLT55IC0gdjItPnk7Ci0gICAgfQotCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiAxICkgIT0gMCApCi0gICAgewotICAgICAgQyA9ICBCOyAgIC8qIGNvdW50ZXIgY2xvY2t3aXNlIHJvdGF0aW9uICovCi0gICAgICBCID0gIEE7Ci0gICAgICBBID0gLUM7Ci0gICAgfQotCi0gICAgTk9STWFsaXplKCBBLCBCLCAmQ1VSLkdTLmR1YWxWZWN0b3IgKTsKLQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHYxID0gQ1VSLnpwMS5jdXIgKyBwMjsKLSAgICAgIEZUX1ZlY3RvciogIHYyID0gQ1VSLnpwMi5jdXIgKyBwMTsKLQotCi0gICAgICBBID0gdjEtPnggLSB2Mi0+eDsKLSAgICAgIEIgPSB2MS0+eSAtIHYyLT55OwotICAgIH0KLQotICAgIGlmICggKCBDVVIub3Bjb2RlICYgMSApICE9IDAgKQotICAgIHsKLSAgICAgIEMgPSAgQjsgICAvKiBjb3VudGVyIGNsb2Nrd2lzZSByb3RhdGlvbiAqLwotICAgICAgQiA9ICBBOwotICAgICAgQSA9IC1DOwotICAgIH0KLQotICAgIE5PUk1hbGl6ZSggQSwgQiwgJkNVUi5HUy5wcm9qVmVjdG9yICk7Ci0KLSAgICBHVUVTU19WRUNUT1IoIGZyZWVWZWN0b3IgKTsKLQotICAgIENPTVBVVEVfRnVuY3MoKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTWlAwW106ICAgICAgIFNldCBab25lIFBvaW50ZXIgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NaUDAoIElOU19BUkcgKQotICB7Ci0gICAgc3dpdGNoICggKEZUX0ludClhcmdzWzBdICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgQ1VSLnpwMCA9IENVUi50d2lsaWdodDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgQ1VSLnpwMCA9IENVUi5wdHM7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENVUi5HUy5nZXAwID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNaUDFbXTogICAgICAgU2V0IFpvbmUgUG9pbnRlciAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1pQMSggSU5TX0FSRyApCi0gIHsKLSAgICBzd2l0Y2ggKCAoRlRfSW50KWFyZ3NbMF0gKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBDVVIuenAxID0gQ1VSLnR3aWxpZ2h0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBDVVIuenAxID0gQ1VSLnB0czsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ1VSLkdTLmdlcDEgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1pQMltdOiAgICAgICBTZXQgWm9uZSBQb2ludGVyIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TWlAyKCBJTlNfQVJHICkKLSAgewotICAgIHN3aXRjaCAoIChGVF9JbnQpYXJnc1swXSApCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIENVUi56cDIgPSBDVVIudHdpbGlnaHQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIENVUi56cDIgPSBDVVIucHRzOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDVVIuR1MuZ2VwMiA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTWlBTW106ICAgICAgIFNldCBab25lIFBvaW50ZXJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NaUFMoIElOU19BUkcgKQotICB7Ci0gICAgc3dpdGNoICggKEZUX0ludClhcmdzWzBdICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgQ1VSLnpwMCA9IENVUi50d2lsaWdodDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgQ1VSLnpwMCA9IENVUi5wdHM7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENVUi56cDEgPSBDVVIuenAwOwotICAgIENVUi56cDIgPSBDVVIuenAwOwotCi0gICAgQ1VSLkdTLmdlcDAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gICAgQ1VSLkdTLmdlcDEgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gICAgQ1VSLkdTLmdlcDIgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSU5TVENUUkxbXTogICBJTlNUcnVjdGlvbiBDb25UUm9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyIGludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19JTlNUQ1RSTCggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9Mb25nICBLLCBMOwotCi0KLSAgICBLID0gYXJnc1sxXTsKLSAgICBMID0gYXJnc1swXTsKLQotICAgIGlmICggSyA8IDEgfHwgSyA+IDIgKQotICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBMICE9IDAgKQotICAgICAgICBMID0gSzsKLQotICAgIENVUi5HUy5pbnN0cnVjdF9jb250cm9sID0gRlRfQk9PTCgKLSAgICAgICggKEZUX0J5dGUpQ1VSLkdTLmluc3RydWN0X2NvbnRyb2wgJiB+KEZUX0J5dGUpSyApIHwgKEZUX0J5dGUpTCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNDQU5DVFJMW106ICAgU0NBTiBDb25UUm9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzI/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0NBTkNUUkwoIElOU19BUkcgKQotICB7Ci0gICAgRlRfSW50ICBBOwotCi0KLSAgICAvKiBHZXQgVGhyZXNob2xkICovCi0gICAgQSA9IChGVF9JbnQpKCBhcmdzWzBdICYgMHhGRiApOwotCi0gICAgaWYgKCBBID09IDB4RkYgKQotICAgIHsKLSAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBUUlVFOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmICggQSA9PSAwICkKLSAgICB7Ci0gICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gRkFMU0U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQSAqPSA2NDsKLQotI2lmIDAKLSAgICBpZiAoICggYXJnc1swXSAmIDB4MTAwICkgIT0gMCAmJiBDVVIubWV0cmljcy5wb2ludFNpemUgPD0gQSApCi0gICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gVFJVRTsKLSNlbmRpZgotCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiAweDIwMCApICE9IDAgJiYgQ1VSLnR0X21ldHJpY3Mucm90YXRlZCApCi0gICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gVFJVRTsKLQotICAgIGlmICggKCBhcmdzWzBdICYgMHg0MDAgKSAhPSAwICYmIENVUi50dF9tZXRyaWNzLnN0cmV0Y2hlZCApCi0gICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gVFJVRTsKLQotI2lmIDAKLSAgICBpZiAoICggYXJnc1swXSAmIDB4ODAwICkgIT0gMCAmJiBDVVIubWV0cmljcy5wb2ludFNpemUgPiBBICkKLSAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKLSNlbmRpZgotCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiAweDEwMDAgKSAhPSAwICYmIENVUi50dF9tZXRyaWNzLnJvdGF0ZWQgKQotICAgICAgQ1VSLkdTLnNjYW5fY29udHJvbCA9IEZBTFNFOwotCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiAweDIwMDAgKSAhPSAwICYmIENVUi50dF9tZXRyaWNzLnN0cmV0Y2hlZCApCi0gICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gRkFMU0U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0NBTlRZUEVbXTogICBTQ0FOIFRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TQ0FOVFlQRSggSU5TX0FSRyApCi0gIHsKLSAgICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGZ1dHVyZSBlbmhhbmNlbWVudHMsICovCi0gICAgLyogd2UgbXVzdCBpZ25vcmUgbmV3IG1vZGVzICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBhcmdzWzBdID49IDAgJiYgYXJnc1swXSA8PSA1ICkKLSAgICB7Ci0gICAgICBpZiAoIGFyZ3NbMF0gPT0gMyApCi0gICAgICAgIGFyZ3NbMF0gPSAyOwotCi0gICAgICBDVVIuR1Muc2Nhbl90eXBlID0gKEZUX0ludClhcmdzWzBdOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNQU5BR0lORyBPVVRMSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSW5zdHJ1Y3Rpb25zIGFwcGVhciBpbiB0aGUgc3BlY2lmaWNhdGlvbidzIG9yZGVyLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZMSVBQVFtdOiAgICAgRkxJUCBQb2luVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRkxJUFBUKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VTaG9ydCAgcG9pbnQ7Ci0KLSAgICBGVF9VTlVTRURfQVJHOwotCi0KLSAgICBpZiAoIENVUi50b3AgPCBDVVIuR1MubG9vcCApCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX1Rvb19GZXdfQXJndW1lbnRzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlICggQ1VSLkdTLmxvb3AgPiAwICkKLSAgICB7Ci0gICAgICBDVVIuYXJncy0tOwotCi0gICAgICBwb2ludCA9IChGVF9VU2hvcnQpQ1VSLnN0YWNrW0NVUi5hcmdzXTsKLQotICAgICAgaWYgKCBCT1VORFMoIHBvaW50LCBDVVIucHRzLm5fcG9pbnRzICkgKQotICAgICAgewotICAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgewotICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgQ1VSLnB0cy50YWdzW3BvaW50XSBePSBGVF9DVVJWRV9UQUdfT047Ci0KLSAgICAgIENVUi5HUy5sb29wLS07Ci0gICAgfQotCi0gICAgQ1VSLkdTLmxvb3AgPSAxOwotICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUFJHT05bXTogICBGTElQIFJhbkdlIE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTElQUkdPTiggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9VU2hvcnQgIEksIEssIEw7Ci0KLQotICAgIEsgPSAoRlRfVVNob3J0KWFyZ3NbMV07Ci0gICAgTCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTKCBLLCBDVVIucHRzLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggTCwgQ1VSLnB0cy5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoIEkgPSBMOyBJIDw9IEs7IEkrKyApCi0gICAgICBDVVIucHRzLnRhZ3NbSV0gfD0gRlRfQ1VSVkVfVEFHX09OOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZMSVBSR09GRjogICAgRkxJUCBSYW5HZSBPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRkxJUFJHT0ZGKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VTaG9ydCAgSSwgSywgTDsKLQotCi0gICAgSyA9IChGVF9VU2hvcnQpYXJnc1sxXTsKLSAgICBMID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIEssIENVUi5wdHMubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBMLCBDVVIucHRzLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICggSSA9IEw7IEkgPD0gSzsgSSsrICkKLSAgICAgIENVUi5wdHMudGFnc1tJXSAmPSB+RlRfQ1VSVkVfVEFHX09OOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBDb21wdXRlX1BvaW50X0Rpc3BsYWNlbWVudCggRVhFQ19PUF8gRlRfRjI2RG90NiogICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiogICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICByZWZwICkKLSAgewotICAgIFRUX0dseXBoWm9uZVJlYyAgenA7Ci0gICAgRlRfVVNob3J0ICAgICAgICBwOwotICAgIEZUX0YyNkRvdDYgICAgICAgZDsKLQotCi0gICAgaWYgKCBDVVIub3Bjb2RlICYgMSApCi0gICAgewotICAgICAgenAgPSBDVVIuenAwOwotICAgICAgcCAgPSBDVVIuR1MucnAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgenAgPSBDVVIuenAxOwotICAgICAgcCAgPSBDVVIuR1MucnAyOwotICAgIH0KLQotICAgIGlmICggQk9VTkRTKCBwLCB6cC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgKnJlZnAgPSAwOwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgKnpvbmUgPSB6cDsKLSAgICAqcmVmcCA9IHA7Ci0KLSAgICBkID0gQ1VSX0Z1bmNfcHJvamVjdCggenAuY3VyICsgcCwgenAub3JnICsgcCApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBpZiAoIENVUi5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKQotICAgIHsKLSAgICAgIGlmICggQ1VSLkdTLmJvdGhfeF9heGlzICkKLSAgICAgIHsKLSAgICAgICAgKnggPSBkOwotICAgICAgICAqeSA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICp4ID0gMDsKLSAgICAgICAgKnkgPSBkOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICAqeCA9IFRUX01VTERJViggZCwKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylDVVIuR1MuZnJlZVZlY3Rvci54ICogMHgxMDAwMEwsCi0gICAgICAgICAgICAgICAgICAgICAgQ1VSLkZfZG90X1AgKTsKLSAgICAgICp5ID0gVFRfTVVMRElWKCBkLAotICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKUNVUi5HUy5mcmVlVmVjdG9yLnkgKiAweDEwMDAwTCwKLSAgICAgICAgICAgICAgICAgICAgICBDVVIuRl9kb3RfUCApOwotICAgIH0KLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBNb3ZlX1pwMl9Qb2ludCggRVhFQ19PUF8gRlRfVVNob3J0ICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgdG91Y2ggKQotICB7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBpZiAoIENVUi5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKQotICAgIHsKLSAgICAgIGlmICggQ1VSLkdTLmJvdGhfeF9heGlzICkKLSAgICAgIHsKLSAgICAgICAgQ1VSLnpwMi5jdXJbcG9pbnRdLnggKz0gZHg7Ci0gICAgICAgIGlmICggdG91Y2ggKQotICAgICAgICAgIENVUi56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1g7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIENVUi56cDIuY3VyW3BvaW50XS55ICs9IGR5OwotICAgICAgICBpZiAoIHRvdWNoICkKLSAgICAgICAgICBDVVIuenAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci54ICE9IDAgKQotICAgIHsKLSAgICAgIENVUi56cDIuY3VyW3BvaW50XS54ICs9IGR4OwotICAgICAgaWYgKCB0b3VjaCApCi0gICAgICAgIENVUi56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1g7Ci0gICAgfQotCi0gICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci55ICE9IDAgKQotICAgIHsKLSAgICAgIENVUi56cDIuY3VyW3BvaW50XS55ICs9IGR5OwotICAgICAgaWYgKCB0b3VjaCApCi0gICAgICAgIENVUi56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1k7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNIUFthXTogICAgICAgU0hpZnQgUG9pbnQgYnkgdGhlIGxhc3QgcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MzItMHgzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0hQKCBJTlNfQVJHICkKLSAgewotICAgIFRUX0dseXBoWm9uZVJlYyAgenA7Ci0gICAgRlRfVVNob3J0ICAgICAgICByZWZwOwotCi0gICAgRlRfRjI2RG90NiAgICAgICBkeCwKLSAgICAgICAgICAgICAgICAgICAgIGR5OwotICAgIEZUX1VTaG9ydCAgICAgICAgcG9pbnQ7Ci0KLSAgICBGVF9VTlVTRURfQVJHOwotCi0KLSAgICBpZiAoIENVUi50b3AgPCBDVVIuR1MubG9vcCApCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggQ09NUFVURV9Qb2ludF9EaXNwbGFjZW1lbnQoICZkeCwgJmR5LCAmenAsICZyZWZwICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgd2hpbGUgKCBDVVIuR1MubG9vcCA+IDAgKQotICAgIHsKLSAgICAgIENVUi5hcmdzLS07Ci0gICAgICBwb2ludCA9IChGVF9VU2hvcnQpQ1VSLnN0YWNrW0NVUi5hcmdzXTsKLQotICAgICAgaWYgKCBCT1VORFMoIHBvaW50LCBDVVIuenAyLm5fcG9pbnRzICkgKQotICAgICAgewotICAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgewotICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIFNIUCB0b3VjaGVzIHRoZSBwb2ludHMgKi8KLSAgICAgICAgTU9WRV9acDJfUG9pbnQoIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKLQotICAgICAgQ1VSLkdTLmxvb3AtLTsKLSAgICB9Ci0KLSAgICBDVVIuR1MubG9vcCA9IDE7Ci0gICAgQ1VSLm5ld190b3AgPSBDVVIuYXJnczsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTSENbYV06ICAgICAgIFNIaWZ0IENvbnRvdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDM0LTM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NIQyggSU5TX0FSRyApCi0gIHsKLSAgICBUVF9HbHlwaFpvbmVSZWMgenA7Ci0gICAgRlRfVVNob3J0ICAgICAgIHJlZnA7Ci0gICAgRlRfRjI2RG90NiAgICAgIGR4LAotICAgICAgICAgICAgICAgICAgICBkeTsKLQotICAgIEZUX1Nob3J0ICAgICAgICBjb250b3VyOwotICAgIEZUX1VTaG9ydCAgICAgICBmaXJzdF9wb2ludCwgbGFzdF9wb2ludCwgaTsKLQotCi0gICAgY29udG91ciA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTKCBjb250b3VyLCBDVVIucHRzLm5fY29udG91cnMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIENPTVBVVEVfUG9pbnRfRGlzcGxhY2VtZW50KCAmZHgsICZkeSwgJnpwLCAmcmVmcCApICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggY29udG91ciA9PSAwICkKLSAgICAgIGZpcnN0X3BvaW50ID0gMDsKLSAgICBlbHNlCi0gICAgICBmaXJzdF9wb2ludCA9IChGVF9VU2hvcnQpKCBDVVIucHRzLmNvbnRvdXJzW2NvbnRvdXIgLSAxXSArIDEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnB0cy5maXJzdF9wb2ludCApOwotCi0gICAgbGFzdF9wb2ludCA9IChGVF9VU2hvcnQpKCBDVVIucHRzLmNvbnRvdXJzW2NvbnRvdXJdIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5wdHMuZmlyc3RfcG9pbnQgKTsKLQotICAgIC8qIFhYWDogdGhpcyBpcyBwcm9iYWJseSB3cm9uZy4uLiBhdCBsZWFzdCBpdCBwcmV2ZW50cyBtZW1vcnkgKi8KLSAgICAvKiAgICAgIGNvcnJ1cHRpb24gd2hlbiB6cDIgaXMgdGhlIHR3aWxpZ2h0IHpvbmUgICAgICAgICAgICAgICovCi0gICAgaWYgKCBCT1VORFMoIGxhc3RfcG9pbnQsIENVUi56cDIubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIuenAyLm5fcG9pbnRzID4gMCApCi0gICAgICAgIGxhc3RfcG9pbnQgPSAoRlRfVVNob3J0KShDVVIuenAyLm5fcG9pbnRzIC0gMSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGxhc3RfcG9pbnQgPSAwOwotICAgIH0KLQotICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBTSEMgdG91Y2hlcyB0aGUgcG9pbnRzICovCi0gICAgZm9yICggaSA9IGZpcnN0X3BvaW50OyBpIDw9IGxhc3RfcG9pbnQ7IGkrKyApCi0gICAgewotICAgICAgaWYgKCB6cC5jdXIgIT0gQ1VSLnpwMi5jdXIgfHwgcmVmcCAhPSBpICkKLSAgICAgICAgTU9WRV9acDJfUG9pbnQoIGksIGR4LCBkeSwgVFJVRSApOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTSFpbYV06ICAgICAgIFNIaWZ0IFpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDM2LTM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NIWiggSU5TX0FSRyApCi0gIHsKLSAgICBUVF9HbHlwaFpvbmVSZWMgenA7Ci0gICAgRlRfVVNob3J0ICAgICAgIHJlZnA7Ci0gICAgRlRfRjI2RG90NiAgICAgIGR4LAotICAgICAgICAgICAgICAgICAgICBkeTsKLQotICAgIEZUX1VTaG9ydCAgICAgICBsYXN0X3BvaW50LCBpOwotCi0KLSAgICBpZiAoIEJPVU5EUyggYXJnc1swXSwgMiApICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggQ09NUFVURV9Qb2ludF9EaXNwbGFjZW1lbnQoICZkeCwgJmR5LCAmenAsICZyZWZwICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIFNIWiBkb2Vzbid0IG1vdmUgdGhlIHBoYW50b20gcG9pbnRzLiAgKi8KLSAgICAvKiAgICAgIFR3aWxpZ2h0IHpvbmUgaGFzIG5vIGNvbnRvdXJzLCBzbyB1c2UgYG5fcG9pbnRzJy4gICAqLwotICAgIC8qICAgICAgTm9ybWFsIHpvbmUncyBgbl9wb2ludHMnIGluY2x1ZGVzIHBoYW50b21zLCBzbyBtdXN0ICovCi0gICAgLyogICAgICB1c2UgZW5kIG9mIGxhc3QgY29udG91ci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIENVUi5HUy5nZXAyID09IDAgJiYgQ1VSLnpwMi5uX3BvaW50cyA+IDAgKQotICAgICAgbGFzdF9wb2ludCA9IChGVF9VU2hvcnQpKCBDVVIuenAyLm5fcG9pbnRzIC0gMSApOwotICAgIGVsc2UgaWYgKCBDVVIuR1MuZ2VwMiA9PSAxICYmIENVUi56cDIubl9jb250b3VycyA+IDAgKQotICAgICAgbGFzdF9wb2ludCA9IChGVF9VU2hvcnQpKCBDVVIuenAyLmNvbnRvdXJzW0NVUi56cDIubl9jb250b3VycyAtIDFdICk7Ci0gICAgZWxzZQotICAgICAgbGFzdF9wb2ludCA9IDA7Ci0KLSAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgU0haIGRvZXNuJ3QgdG91Y2ggdGhlIHBvaW50cyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDw9IGxhc3RfcG9pbnQ7IGkrKyApCi0gICAgewotICAgICAgaWYgKCB6cC5jdXIgIT0gQ1VSLnpwMi5jdXIgfHwgcmVmcCAhPSBpICkKLSAgICAgICAgTU9WRV9acDJfUG9pbnQoIGksIGR4LCBkeSwgRkFMU0UgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0hQSVhbXTogICAgICBTSGlmdCBwb2ludHMgYnkgYSBQSVhlbCBhbW91bnQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TSFBJWCggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICBkeCwgZHk7Ci0gICAgRlRfVVNob3J0ICAgcG9pbnQ7Ci0KLQotICAgIGlmICggQ1VSLnRvcCA8IENVUi5HUy5sb29wICsgMSApCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5HUy5ib3RoX3hfYXhpcyApCi0gICAgICB7Ci0gICAgICAgIGR4ID0gVFRfTXVsRml4MTQoIGFyZ3NbMF0sIDB4NDAwMCApOwotICAgICAgICBkeSA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGR4ID0gMDsKLSAgICAgICAgZHkgPSBUVF9NdWxGaXgxNCggYXJnc1swXSwgMHg0MDAwICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIGR4ID0gVFRfTXVsRml4MTQoIGFyZ3NbMF0sIENVUi5HUy5mcmVlVmVjdG9yLnggKTsKLSAgICAgIGR5ID0gVFRfTXVsRml4MTQoIGFyZ3NbMF0sIENVUi5HUy5mcmVlVmVjdG9yLnkgKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIENVUi5HUy5sb29wID4gMCApCi0gICAgewotICAgICAgQ1VSLmFyZ3MtLTsKLQotICAgICAgcG9pbnQgPSAoRlRfVVNob3J0KUNVUi5zdGFja1tDVVIuYXJnc107Ci0KLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMi5uX3BvaW50cyApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIE1PVkVfWnAyX1BvaW50KCBwb2ludCwgZHgsIGR5LCBUUlVFICk7Ci0KLSAgICAgIENVUi5HUy5sb29wLS07Ci0gICAgfQotCi0gICAgQ1VSLkdTLmxvb3AgPSAxOwotICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTVNJUlBbYV06ICAgICBNb3ZlIFN0YWNrIEluZGlyZWN0IFJlbGF0aXZlIFBvc2l0aW9uICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzQS0weDNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NU0lSUCggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9VU2hvcnQgICBwb2ludDsKLSAgICBGVF9GMjZEb3Q2ICBkaXN0YW5jZTsKLQotCi0gICAgcG9pbnQgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICAgQ1VSLnpwMS5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIENVUi5HUy5ycDAsIENVUi56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgYmVoYXZpb3VyICovCi0gICAgaWYgKCBDVVIuR1MuZ2VwMSA9PSAwICkgICAvKiBpZiB0aGUgcG9pbnQgdGhhdCBpcyB0byBiZSBtb3ZlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgaW4gdHdpbGlnaHQgem9uZSAgICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBDVVIuenAxLm9yZ1twb2ludF0gPSBDVVIuenAwLm9yZ1tDVVIuR1MucnAwXTsKLSAgICAgIENVUl9GdW5jX21vdmVfb3JpZyggJkNVUi56cDEsIHBvaW50LCBhcmdzWzFdICk7Ci0gICAgICBDVVIuenAxLmN1cltwb2ludF0gPSBDVVIuenAxLm9yZ1twb2ludF07Ci0gICAgfQotCi0gICAgZGlzdGFuY2UgPSBDVVJfRnVuY19wcm9qZWN0KCBDVVIuenAxLmN1ciArIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXIgKyBDVVIuR1MucnAwICk7Ci0KLSAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMSwgcG9pbnQsIGFyZ3NbMV0gLSBkaXN0YW5jZSApOwotCi0gICAgQ1VSLkdTLnJwMSA9IENVUi5HUy5ycDA7Ci0gICAgQ1VSLkdTLnJwMiA9IHBvaW50OwotCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiAxICkgIT0gMCApCi0gICAgICBDVVIuR1MucnAwID0gcG9pbnQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTURBUFthXTogICAgICBNb3ZlIERpcmVjdCBBYnNvbHV0ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyRS0weDJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NREFQKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotICAgIEZUX0YyNkRvdDYgIGN1cl9kaXN0LAotICAgICAgICAgICAgICAgIGRpc3RhbmNlOwotCi0KLSAgICBwb2ludCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFhYWDogSXMgdGhlcmUgc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSB3aGlsZSBpbiB0aGUgKi8KLSAgICAvKiAgICAgIHR3aWxpZ2h0IHpvbmU/ID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiAxICkgIT0gMCApCi0gICAgewotICAgICAgY3VyX2Rpc3QgPSBDVVJfZmFzdF9wcm9qZWN0KCAmQ1VSLnpwMC5jdXJbcG9pbnRdICk7Ci0gICAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3JvdW5kKCBjdXJfZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbMF0gKSAtIGN1cl9kaXN0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICBkaXN0YW5jZSA9IDA7Ci0KLSAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMCwgcG9pbnQsIGRpc3RhbmNlICk7Ci0KLSAgICBDVVIuR1MucnAwID0gcG9pbnQ7Ci0gICAgQ1VSLkdTLnJwMSA9IHBvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1JQVBbYV06ICAgICAgTW92ZSBJbmRpcmVjdCBBYnNvbHV0ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4M0UtMHgzRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTUlBUCggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9VTG9uZyAgICBjdnRFbnRyeTsKLSAgICBGVF9VU2hvcnQgICBwb2ludDsKLSAgICBGVF9GMjZEb3Q2ICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICBvcmdfZGlzdDsKLQotCi0gICAgY3Z0RW50cnkgPSAoRlRfVUxvbmcpYXJnc1sxXTsKLSAgICBwb2ludCAgICA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgQ1VSLnpwMC5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIGN2dEVudHJ5LCBDVVIuY3Z0U2l6ZSApICAgICAgKQotICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGUgYmVoYXZpb3VyIG9mIGFuIE1JQVAgaW5zdHJ1Y3Rpb24gaXMgcXVpdGUgICAgICovCi0gICAgLyogZGlmZmVyZW50IHdoZW4gdXNlZCBpbiB0aGUgdHdpbGlnaHQgem9uZS4gICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBGaXJzdCwgbm8gY29udHJvbCB2YWx1ZSBjdXQtaW4gdGVzdCBpcyBwZXJmb3JtZWQgICovCi0gICAgLyogYXMgaXQgd291bGQgZmFpbCBhbnl3YXkuICBTZWNvbmQsIHRoZSBvcmlnaW5hbCAgICAqLwotICAgIC8qIHBvaW50LCBpLmUuIChvcmdfeCxvcmdfeSkgb2YgenAwLnBvaW50LCBpcyBzZXQgICAgKi8KLSAgICAvKiB0byB0aGUgYWJzb2x1dGUsIHVucm91bmRlZCBkaXN0YW5jZSBmb3VuZCBpbiAgICAgICovCi0gICAgLyogdGhlIENWVC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGlzIGlzIHVzZWQgaW4gdGhlIENWVCBwcm9ncmFtcyBvZiB0aGUgTWljcm9zb2Z0ICovCi0gICAgLyogZm9udHMgQXJpYWwsIFRpbWVzLCBldGMuLCBpbiBvcmRlciB0byByZS1hZGp1c3QgICAqLwotICAgIC8qIHNvbWUga2V5IGZvbnQgaGVpZ2h0cy4gIEl0IGFsbG93cyB0aGUgdXNlIG9mIHRoZSAgKi8KLSAgICAvKiBJUCBpbnN0cnVjdGlvbiBpbiB0aGUgdHdpbGlnaHQgem9uZSwgd2hpY2ggICAgICAgICovCi0gICAgLyogb3RoZXJ3aXNlIHdvdWxkIGJlIGBpbGxlZ2FsJyBhY2NvcmRpbmcgdG8gdGhlICAgICAqLwotICAgIC8qIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2UgaW1wbGVtZW50IGl0IHdpdGggYSBzcGVjaWFsIHNlcXVlbmNlIGZvciB0aGUgICAqLwotICAgIC8qIHR3aWxpZ2h0IHpvbmUuICBUaGlzIGlzIGEgYmFkIGhhY2ssIGJ1dCBpdCBzZWVtcyAgKi8KLSAgICAvKiB0byB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3JlYWRfY3Z0KCBjdnRFbnRyeSApOwotCi0gICAgaWYgKCBDVVIuR1MuZ2VwMCA9PSAwICkgICAvKiBJZiBpbiB0d2lsaWdodCB6b25lICovCi0gICAgewotICAgICAgQ1VSLnpwMC5vcmdbcG9pbnRdLnggPSBUVF9NdWxGaXgxNCggZGlzdGFuY2UsIENVUi5HUy5mcmVlVmVjdG9yLnggKTsKLSAgICAgIENVUi56cDAub3JnW3BvaW50XS55ID0gVFRfTXVsRml4MTQoIGRpc3RhbmNlLCBDVVIuR1MuZnJlZVZlY3Rvci55ICksCi0gICAgICBDVVIuenAwLmN1cltwb2ludF0gICA9IENVUi56cDAub3JnW3BvaW50XTsKLSAgICB9Ci0KLSAgICBvcmdfZGlzdCA9IENVUl9mYXN0X3Byb2plY3QoICZDVVIuenAwLmN1cltwb2ludF0gKTsKLQotICAgIGlmICggKCBDVVIub3Bjb2RlICYgMSApICE9IDAgKSAgIC8qIHJvdW5kaW5nIGFuZCBjb250cm9sIGN1dGluIGZsYWcgKi8KLSAgICB7Ci0gICAgICBpZiAoIEZUX0FCUyggZGlzdGFuY2UgLSBvcmdfZGlzdCApID4gQ1VSLkdTLmNvbnRyb2xfdmFsdWVfY3V0aW4gKQotICAgICAgICBkaXN0YW5jZSA9IG9yZ19kaXN0OwotCi0gICAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3JvdW5kKCBkaXN0YW5jZSwgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApOwotICAgIH0KLQotICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAwLCBwb2ludCwgZGlzdGFuY2UgLSBvcmdfZGlzdCApOwotCi0gICAgQ1VSLkdTLnJwMCA9IHBvaW50OwotICAgIENVUi5HUy5ycDEgPSBwb2ludDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNRFJQW2FiY2RlXTogIE1vdmUgRGlyZWN0IFJlbGF0aXZlIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweEMwLTB4REYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01EUlAoIElOU19BUkcgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgcG9pbnQ7Ci0gICAgRlRfRjI2RG90NiAgb3JnX2Rpc3QsIGRpc3RhbmNlOwotCi0KLSAgICBwb2ludCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgICBDVVIuenAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggQ1VSLkdTLnJwMCwgQ1VSLnpwMC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFhYWDogSXMgdGhlcmUgc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSB3aGlsZSBpbiB0aGUgKi8KLSAgICAvKiAgICAgIHR3aWxpZ2h0IHpvbmU/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBYWFg6IFVORE9DVU1FTlRFRDogdHdpbGlnaHQgem9uZSBzcGVjaWFsIGNhc2UgKi8KLQotICAgIGlmICggQ1VSLkdTLmdlcDAgPT0gMCB8fCBDVVIuR1MuZ2VwMSA9PSAwICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICB2ZWMxID0gJkNVUi56cDEub3JnW3BvaW50XTsKLSAgICAgIEZUX1ZlY3RvciogIHZlYzIgPSAmQ1VSLnpwMC5vcmdbQ1VSLkdTLnJwMF07Ci0KLQotICAgICAgb3JnX2Rpc3QgPSBDVVJfRnVuY19kdWFscHJvaiggdmVjMSwgdmVjMiApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjMSA9ICZDVVIuenAxLm9ydXNbcG9pbnRdOwotICAgICAgRlRfVmVjdG9yKiAgdmVjMiA9ICZDVVIuenAwLm9ydXNbQ1VSLkdTLnJwMF07Ci0KLQotICAgICAgaWYgKCBDVVIubWV0cmljcy54X3NjYWxlID09IENVUi5tZXRyaWNzLnlfc2NhbGUgKQotICAgICAgewotICAgICAgICAvKiB0aGlzIHNob3VsZCBiZSBmYXN0ZXIgKi8KLSAgICAgICAgb3JnX2Rpc3QgPSBDVVJfRnVuY19kdWFscHJvaiggdmVjMSwgdmVjMiApOwotICAgICAgICBvcmdfZGlzdCA9IFRUX01VTEZJWCggb3JnX2Rpc3QsIENVUi5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICB2ZWMueCA9IFRUX01VTEZJWCggdmVjMS0+eCAtIHZlYzItPngsIENVUi5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgICAgdmVjLnkgPSBUVF9NVUxGSVgoIHZlYzEtPnkgLSB2ZWMyLT55LCBDVVIubWV0cmljcy55X3NjYWxlICk7Ci0KLSAgICAgICAgb3JnX2Rpc3QgPSBDVVJfZmFzdF9kdWFscHJvaiggJnZlYyApOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHNpbmdsZSB3aWR0aCBjdXQtaW4gdGVzdCAqLwotCi0gICAgaWYgKCBGVF9BQlMoIG9yZ19kaXN0IC0gQ1VSLkdTLnNpbmdsZV93aWR0aF92YWx1ZSApIDwKLSAgICAgICAgIENVUi5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gKQotICAgIHsKLSAgICAgIGlmICggb3JnX2Rpc3QgPj0gMCApCi0gICAgICAgIG9yZ19kaXN0ID0gQ1VSLkdTLnNpbmdsZV93aWR0aF92YWx1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgb3JnX2Rpc3QgPSAtQ1VSLkdTLnNpbmdsZV93aWR0aF92YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiByb3VuZCBmbGFnICovCi0KLSAgICBpZiAoICggQ1VSLm9wY29kZSAmIDQgKSAhPSAwICkKLSAgICAgIGRpc3RhbmNlID0gQ1VSX0Z1bmNfcm91bmQoCi0gICAgICAgICAgICAgICAgICAgb3JnX2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tDVVIub3Bjb2RlICYgM10gKTsKLSAgICBlbHNlCi0gICAgICBkaXN0YW5jZSA9IFJPVU5EX05vbmUoCi0gICAgICAgICAgICAgICAgICAgb3JnX2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tDVVIub3Bjb2RlICYgM10gKTsKLQotICAgIC8qIG1pbmltdW0gZGlzdGFuY2UgZmxhZyAqLwotCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiA4ICkgIT0gMCApCi0gICAgewotICAgICAgaWYgKCBvcmdfZGlzdCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaXN0YW5jZSA8IENVUi5HUy5taW5pbXVtX2Rpc3RhbmNlICkKLSAgICAgICAgICBkaXN0YW5jZSA9IENVUi5HUy5taW5pbXVtX2Rpc3RhbmNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIGRpc3RhbmNlID4gLUNVUi5HUy5taW5pbXVtX2Rpc3RhbmNlICkKLSAgICAgICAgICBkaXN0YW5jZSA9IC1DVVIuR1MubWluaW11bV9kaXN0YW5jZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBub3cgbW92ZSB0aGUgcG9pbnQgKi8KLQotICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMS5jdXIgKyBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDAuY3VyICsgQ1VSLkdTLnJwMCApOwotCi0gICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDEsIHBvaW50LCBkaXN0YW5jZSAtIG9yZ19kaXN0ICk7Ci0KLSAgICBDVVIuR1MucnAxID0gQ1VSLkdTLnJwMDsKLSAgICBDVVIuR1MucnAyID0gcG9pbnQ7Ci0KLSAgICBpZiAoICggQ1VSLm9wY29kZSAmIDE2ICkgIT0gMCApCi0gICAgICBDVVIuR1MucnAwID0gcG9pbnQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUlSUFthYmNkZV06ICBNb3ZlIEluZGlyZWN0IFJlbGF0aXZlIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHhFMC0weEZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NSVJQKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotICAgIEZUX1VMb25nICAgIGN2dEVudHJ5OwotCi0gICAgRlRfRjI2RG90NiAgY3Z0X2Rpc3QsCi0gICAgICAgICAgICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgY3VyX2Rpc3QsCi0gICAgICAgICAgICAgICAgb3JnX2Rpc3Q7Ci0KLQotICAgIHBvaW50ICAgID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICAgIGN2dEVudHJ5ID0gKEZUX1VMb25nKSggYXJnc1sxXSArIDEgKTsKLQotICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBjdnRbLTFdID0gMCBhbHdheXMgKi8KLQotICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgICBDVVIuenAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggY3Z0RW50cnksICAgQ1VSLmN2dFNpemUgKyAxICkgIHx8Ci0gICAgICAgICBCT1VORFMoIENVUi5HUy5ycDAsIENVUi56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoICFjdnRFbnRyeSApCi0gICAgICBjdnRfZGlzdCA9IDA7Ci0gICAgZWxzZQotICAgICAgY3Z0X2Rpc3QgPSBDVVJfRnVuY19yZWFkX2N2dCggY3Z0RW50cnkgLSAxICk7Ci0KLSAgICAvKiBzaW5nbGUgd2lkdGggdGVzdCAqLwotCi0gICAgaWYgKCBGVF9BQlMoIGN2dF9kaXN0IC0gQ1VSLkdTLnNpbmdsZV93aWR0aF92YWx1ZSApIDwKLSAgICAgICAgIENVUi5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gKQotICAgIHsKLSAgICAgIGlmICggY3Z0X2Rpc3QgPj0gMCApCi0gICAgICAgIGN2dF9kaXN0ID0gIENVUi5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7Ci0gICAgICBlbHNlCi0gICAgICAgIGN2dF9kaXN0ID0gLUNVUi5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7Ci0gICAgfQotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIC0tIHR3aWxpZ2h0IHpvbmUgKi8KLQotICAgIGlmICggQ1VSLkdTLmdlcDEgPT0gMCApCi0gICAgewotICAgICAgQ1VSLnpwMS5vcmdbcG9pbnRdLnggPSBDVVIuenAwLm9yZ1tDVVIuR1MucnAwXS54ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTXVsRml4MTQoIGN2dF9kaXN0LCBDVVIuR1MuZnJlZVZlY3Rvci54ICk7Ci0KLSAgICAgIENVUi56cDEub3JnW3BvaW50XS55ID0gQ1VSLnpwMC5vcmdbQ1VSLkdTLnJwMF0ueSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX011bEZpeDE0KCBjdnRfZGlzdCwgQ1VSLkdTLmZyZWVWZWN0b3IueSApOwotCi0gICAgICBDVVIuenAxLmN1cltwb2ludF0gPSBDVVIuenAwLmN1cltwb2ludF07Ci0gICAgfQotCi0gICAgb3JnX2Rpc3QgPSBDVVJfRnVuY19kdWFscHJvaiggJkNVUi56cDEub3JnW3BvaW50XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1VSLnpwMC5vcmdbQ1VSLkdTLnJwMF0gKTsKLSAgICBjdXJfZGlzdCA9IENVUl9GdW5jX3Byb2plY3QgKCAmQ1VSLnpwMS5jdXJbcG9pbnRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDVVIuenAwLmN1cltDVVIuR1MucnAwXSApOwotCi0gICAgLyogYXV0by1mbGlwIHRlc3QgKi8KLQotICAgIGlmICggQ1VSLkdTLmF1dG9fZmxpcCApCi0gICAgewotICAgICAgaWYgKCAoIG9yZ19kaXN0IF4gY3Z0X2Rpc3QgKSA8IDAgKQotICAgICAgICBjdnRfZGlzdCA9IC1jdnRfZGlzdDsKLSAgICB9Ci0KLSAgICAvKiBjb250cm9sIHZhbHVlIGN1dGluIGFuZCByb3VuZCAqLwotCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiA0ICkgIT0gMCApCi0gICAgewotICAgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhICBPbmx5IHBlcmZvcm0gY3V0LWluIHRlc3Qgd2hlbiBib3RoIHBvaW50cyAqLwotICAgICAgLyogICAgICByZWZlciB0byB0aGUgc2FtZSB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBpZiAoIENVUi5HUy5nZXAwID09IENVUi5HUy5nZXAxICkKLSAgICAgICAgaWYgKCBGVF9BQlMoIGN2dF9kaXN0IC0gb3JnX2Rpc3QgKSA+PSBDVVIuR1MuY29udHJvbF92YWx1ZV9jdXRpbiApCi0gICAgICAgICAgY3Z0X2Rpc3QgPSBvcmdfZGlzdDsKLQotICAgICAgZGlzdGFuY2UgPSBDVVJfRnVuY19yb3VuZCgKLSAgICAgICAgICAgICAgICAgICBjdnRfZGlzdCwKLSAgICAgICAgICAgICAgICAgICBDVVIudHRfbWV0cmljcy5jb21wZW5zYXRpb25zW0NVUi5vcGNvZGUgJiAzXSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBkaXN0YW5jZSA9IFJPVU5EX05vbmUoCi0gICAgICAgICAgICAgICAgICAgY3Z0X2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tDVVIub3Bjb2RlICYgM10gKTsKLQotICAgIC8qIG1pbmltdW0gZGlzdGFuY2UgdGVzdCAqLwotCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiA4ICkgIT0gMCApCi0gICAgewotICAgICAgaWYgKCBvcmdfZGlzdCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaXN0YW5jZSA8IENVUi5HUy5taW5pbXVtX2Rpc3RhbmNlICkKLSAgICAgICAgICBkaXN0YW5jZSA9IENVUi5HUy5taW5pbXVtX2Rpc3RhbmNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIGRpc3RhbmNlID4gLUNVUi5HUy5taW5pbXVtX2Rpc3RhbmNlICkKLSAgICAgICAgICBkaXN0YW5jZSA9IC1DVVIuR1MubWluaW11bV9kaXN0YW5jZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMSwgcG9pbnQsIGRpc3RhbmNlIC0gY3VyX2Rpc3QgKTsKLQotICAgIENVUi5HUy5ycDEgPSBDVVIuR1MucnAwOwotCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiAxNiApICE9IDAgKQotICAgICAgQ1VSLkdTLnJwMCA9IHBvaW50OwotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhICovCi0gICAgQ1VSLkdTLnJwMiA9IHBvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFMSUdOUlBbXTogICAgQUxJR04gUmVsYXRpdmUgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4M0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQUxJR05SUCggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9VU2hvcnQgICBwb2ludDsKLSAgICBGVF9GMjZEb3Q2ICBkaXN0YW5jZTsKLQotICAgIEZUX1VOVVNFRF9BUkc7Ci0KLQotICAgIGlmICggQ1VSLnRvcCA8IENVUi5HUy5sb29wIHx8Ci0gICAgICAgICBCT1VORFMoIENVUi5HUy5ycDAsIENVUi56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIENVUi5HUy5sb29wID4gMCApCi0gICAgewotICAgICAgQ1VSLmFyZ3MtLTsKLQotICAgICAgcG9pbnQgPSAoRlRfVVNob3J0KUNVUi5zdGFja1tDVVIuYXJnc107Ci0KLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMS5uX3BvaW50cyApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpc3RhbmNlID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMS5jdXIgKyBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAwLmN1ciArIENVUi5HUy5ycDAgKTsKLQotICAgICAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMSwgcG9pbnQsIC1kaXN0YW5jZSApOwotICAgICAgfQotCi0gICAgICBDVVIuR1MubG9vcC0tOwotICAgIH0KLQotICAgIENVUi5HUy5sb29wID0gMTsKLSAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElTRUNUW106ICAgICAgbW92ZXMgcG9pbnQgdG8gSW50ZXJTRUNUaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICA1ICogdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSVNFQ1QoIElOU19BUkcgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgYTAsIGExLAotICAgICAgICAgICAgICAgIGIwLCBiMTsKLQotICAgIEZUX0YyNkRvdDYgIGRpc2NyaW1pbmFudDsKLQotICAgIEZUX0YyNkRvdDYgIGR4LCAgZHksCi0gICAgICAgICAgICAgICAgZGF4LCBkYXksCi0gICAgICAgICAgICAgICAgZGJ4LCBkYnk7Ci0KLSAgICBGVF9GMjZEb3Q2ICB2YWw7Ci0KLSAgICBGVF9WZWN0b3IgICBSOwotCi0KLSAgICBwb2ludCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGEwID0gKEZUX1VTaG9ydClhcmdzWzFdOwotICAgIGExID0gKEZUX1VTaG9ydClhcmdzWzJdOwotICAgIGIwID0gKEZUX1VTaG9ydClhcmdzWzNdOwotICAgIGIxID0gKEZUX1VTaG9ydClhcmdzWzRdOwotCi0gICAgaWYgKCBCT1VORFMoIGIwLCBDVVIuenAwLm5fcG9pbnRzICkgIHx8Ci0gICAgICAgICBCT1VORFMoIGIxLCBDVVIuenAwLm5fcG9pbnRzICkgIHx8Ci0gICAgICAgICBCT1VORFMoIGEwLCBDVVIuenAxLm5fcG9pbnRzICkgIHx8Ci0gICAgICAgICBCT1VORFMoIGExLCBDVVIuenAxLm5fcG9pbnRzICkgIHx8Ci0gICAgICAgICBCT1VORFMoIHBvaW50LCBDVVIuenAyLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGJ4ID0gQ1VSLnpwMC5jdXJbYjFdLnggLSBDVVIuenAwLmN1cltiMF0ueDsKLSAgICBkYnkgPSBDVVIuenAwLmN1cltiMV0ueSAtIENVUi56cDAuY3VyW2IwXS55OwotCi0gICAgZGF4ID0gQ1VSLnpwMS5jdXJbYTFdLnggLSBDVVIuenAxLmN1clthMF0ueDsKLSAgICBkYXkgPSBDVVIuenAxLmN1clthMV0ueSAtIENVUi56cDEuY3VyW2EwXS55OwotCi0gICAgZHggPSBDVVIuenAwLmN1cltiMF0ueCAtIENVUi56cDEuY3VyW2EwXS54OwotICAgIGR5ID0gQ1VSLnpwMC5jdXJbYjBdLnkgLSBDVVIuenAxLmN1clthMF0ueTsKLQotICAgIENVUi56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX0JPVEg7Ci0KLSAgICBkaXNjcmltaW5hbnQgPSBUVF9NVUxESVYoIGRheCwgLWRieSwgMHg0MCApICsKLSAgICAgICAgICAgICAgICAgICBUVF9NVUxESVYoIGRheSwgZGJ4LCAweDQwICk7Ci0KLSAgICBpZiAoIEZUX0FCUyggZGlzY3JpbWluYW50ICkgPj0gMHg0MCApCi0gICAgewotICAgICAgdmFsID0gVFRfTVVMRElWKCBkeCwgLWRieSwgMHg0MCApICsgVFRfTVVMRElWKCBkeSwgZGJ4LCAweDQwICk7Ci0KLSAgICAgIFIueCA9IFRUX01VTERJViggdmFsLCBkYXgsIGRpc2NyaW1pbmFudCApOwotICAgICAgUi55ID0gVFRfTVVMRElWKCB2YWwsIGRheSwgZGlzY3JpbWluYW50ICk7Ci0KLSAgICAgIENVUi56cDIuY3VyW3BvaW50XS54ID0gQ1VSLnpwMS5jdXJbYTBdLnggKyBSLng7Ci0gICAgICBDVVIuenAyLmN1cltwb2ludF0ueSA9IENVUi56cDEuY3VyW2EwXS55ICsgUi55OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogZWxzZSwgdGFrZSB0aGUgbWlkZGxlIG9mIHRoZSBtaWRkbGVzIG9mIEEgYW5kIEIgKi8KLQotICAgICAgQ1VSLnpwMi5jdXJbcG9pbnRdLnggPSAoIENVUi56cDEuY3VyW2EwXS54ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAxLmN1clthMV0ueCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXJbYjBdLnggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDAuY3VyW2IxXS54ICkgLyA0OwotICAgICAgQ1VSLnpwMi5jdXJbcG9pbnRdLnkgPSAoIENVUi56cDEuY3VyW2EwXS55ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAxLmN1clthMV0ueSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXJbYjBdLnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDAuY3VyW2IxXS55ICkgLyA0OwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBTElHTlBUU1tdOiAgIEFMSUdOIFBvaW5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0FMSUdOUFRTKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHAxLCBwMjsKLSAgICBGVF9GMjZEb3Q2ICBkaXN0YW5jZTsKLQotCi0gICAgcDEgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gICAgcDIgPSAoRlRfVVNob3J0KWFyZ3NbMV07Ci0KLSAgICBpZiAoIEJPVU5EUyggYXJnc1swXSwgQ1VSLnpwMS5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIGFyZ3NbMV0sIENVUi56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3Byb2plY3QoIENVUi56cDAuY3VyICsgcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAxLmN1ciArIHAxICkgLyAyOwotCi0gICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDEsIHAxLCBkaXN0YW5jZSApOwotICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAwLCBwMiwgLWRpc3RhbmNlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSVBbXTogICAgICAgICBJbnRlcnBvbGF0ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogU09NRVRJTUVTLCBEVU1CRVIgQ09ERSBJUyBCRVRURVIgQ09ERSAqLwotCi0gIHN0YXRpYyB2b2lkCi0gIEluc19JUCggSU5TX0FSRyApCi0gIHsKLSAgICBGVF9GMjZEb3Q2ICBvbGRfcmFuZ2UsIGN1cl9yYW5nZTsKLSAgICBGVF9WZWN0b3IqICBvcnVzX2Jhc2U7Ci0gICAgRlRfVmVjdG9yKiAgY3VyX2Jhc2U7Ci0gICAgRlRfSW50ICAgICAgdHdpbGlnaHQ7Ci0KLSAgICBGVF9VTlVTRURfQVJHOwotCi0KLSAgICBpZiAoIENVUi50b3AgPCBDVVIuR1MubG9vcCApCi0gICAgewotICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qCi0gICAgICogV2UgbmVlZCB0byBkZWFsIGluIGEgc3BlY2lhbCB3YXkgd2l0aCB0aGUgdHdpbGlnaHQgem9uZS4KLSAgICAgKiBPdGhlcndpc2UsIGJ5IGRlZmluaXRpb24sIHRoZSB2YWx1ZSBvZiBDVVIudHdpbGlnaHQub3J1c1tuXSBpcyAoMCwwKSwKLSAgICAgKiBmb3IgZXZlcnkgbi4KLSAgICAgKi8KLSAgICB0d2lsaWdodCA9IENVUi5HUy5nZXAwID09IDAgfHwgQ1VSLkdTLmdlcDEgPT0gMCB8fCBDVVIuR1MuZ2VwMiA9PSAwOwotCi0gICAgaWYgKCBCT1VORFMoIENVUi5HUy5ycDEsIENVUi56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIHR3aWxpZ2h0ICkKLSAgICAgIG9ydXNfYmFzZSA9ICZDVVIuenAwLm9yZ1tDVVIuR1MucnAxXTsKLSAgICBlbHNlCi0gICAgICBvcnVzX2Jhc2UgPSAmQ1VSLnpwMC5vcnVzW0NVUi5HUy5ycDFdOwotCi0gICAgY3VyX2Jhc2UgPSAmQ1VSLnpwMC5jdXJbQ1VSLkdTLnJwMV07Ci0KLSAgICAvKiBYWFg6IFRoZXJlIGFyZSBzb21lIGdseXBocyBpbiBzb21lIGJyYWluZGVhZCBidXQgcG9wdWxhciAqLwotICAgIC8qICAgICAgZm9udHMgb3V0IHRoZXJlIChlLmcuIFthZXVdZ3JhdmUgaW4gbW9ub3R5cGUudHRmKSAgICovCi0gICAgLyogICAgICBjYWxsaW5nIElQW10gd2l0aCBiYWQgdmFsdWVzIG9mIHJwWzEyXS4gICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIERvIHNvbWV0aGluZyBzYW5lIHdoZW4gdGhpcyBvZGQgdGhpbmcgaGFwcGVucy4gICAgICAqLwotICAgIGlmICggQk9VTkRTKCBDVVIuR1MucnAxLCBDVVIuenAwLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggQ1VSLkdTLnJwMiwgQ1VSLnpwMS5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBvbGRfcmFuZ2UgPSAwOwotICAgICAgY3VyX3JhbmdlID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggdHdpbGlnaHQgKQotICAgICAgICBvbGRfcmFuZ2UgPSBDVVJfRnVuY19kdWFscHJvaiggJkNVUi56cDEub3JnW0NVUi5HUy5ycDJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3J1c19iYXNlICk7Ci0gICAgICBlbHNlCi0gICAgICAgIG9sZF9yYW5nZSA9IENVUl9GdW5jX2R1YWxwcm9qKCAmQ1VSLnpwMS5vcnVzW0NVUi5HUy5ycDJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3J1c19iYXNlICk7Ci0KLSAgICAgIGN1cl9yYW5nZSA9IENVUl9GdW5jX3Byb2plY3QgKCAmQ1VSLnpwMS5jdXJbQ1VSLkdTLnJwMl0sIGN1cl9iYXNlICk7Ci0gICAgfQotCi0gICAgZm9yICggOyBDVVIuR1MubG9vcCA+IDA7IC0tQ1VSLkdTLmxvb3AgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgIHBvaW50ID0gKEZUX1VJbnQpQ1VSLnN0YWNrWy0tQ1VSLmFyZ3NdOwotICAgICAgRlRfRjI2RG90NiAgb3JnX2Rpc3QsIGN1cl9kaXN0LCBuZXdfZGlzdDsKLQotCi0gICAgICAvKiBjaGVjayBwb2ludCBib3VuZHMgKi8KLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMi5uX3BvaW50cyApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIHR3aWxpZ2h0ICkKLSAgICAgICAgb3JnX2Rpc3QgPSBDVVJfRnVuY19kdWFscHJvaiggJkNVUi56cDIub3JnW3BvaW50XSwgb3J1c19iYXNlICk7Ci0gICAgICBlbHNlCi0gICAgICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfZHVhbHByb2ooICZDVVIuenAyLm9ydXNbcG9pbnRdLCBvcnVzX2Jhc2UgKTsKLQotICAgICAgY3VyX2Rpc3QgPSBDVVJfRnVuY19wcm9qZWN0ICggJkNVUi56cDIuY3VyW3BvaW50XSwgY3VyX2Jhc2UgKTsKLQotICAgICAgaWYgKCBvcmdfZGlzdCApCi0gICAgICAgIG5ld19kaXN0ID0gKCBvbGRfcmFuZ2UgIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICA/IFRUX01VTERJViggb3JnX2Rpc3QsIGN1cl9yYW5nZSwgb2xkX3JhbmdlICkKLSAgICAgICAgICAgICAgICAgICAgIDogY3VyX2Rpc3Q7Ci0gICAgICBlbHNlCi0gICAgICAgIG5ld19kaXN0ID0gMDsKLQotICAgICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDIsIChGVF9VU2hvcnQpcG9pbnQsIG5ld19kaXN0IC0gY3VyX2Rpc3QgKTsKLSAgICB9Ci0gICAgQ1VSLkdTLmxvb3AgPSAxOwotICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVVRQW2FdOiAgICAgICBVblRvdWNoIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19VVFAoIElOU19BUkcgKQotICB7Ci0gICAgRlRfVVNob3J0ICBwb2ludDsKLSAgICBGVF9CeXRlICAgIG1hc2s7Ci0KLQotICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCBDVVIuenAwLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWFzayA9IDB4RkY7Ci0KLSAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnggIT0gMCApCi0gICAgICBtYXNrICY9IH5GVF9DVVJWRV9UQUdfVE9VQ0hfWDsKLQotICAgIGlmICggQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICkKLSAgICAgIG1hc2sgJj0gfkZUX0NVUlZFX1RBR19UT1VDSF9ZOwotCi0gICAgQ1VSLnpwMC50YWdzW3BvaW50XSAmPSBtYXNrOwotICB9Ci0KLQotICAvKiBMb2NhbCB2YXJpYWJsZXMgZm9yIEluc19JVVA6ICovCi0gIHR5cGVkZWYgc3RydWN0ICBJVVBfV29ya2VyUmVjXwotICB7Ci0gICAgRlRfVmVjdG9yKiAgb3JnczsgICAvKiBvcmlnaW5hbCBhbmQgY3VycmVudCBjb29yZGluYXRlICovCi0gICAgRlRfVmVjdG9yKiAgY3VyczsgICAvKiBhcnJheXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVmVjdG9yKiAgb3J1czsKLSAgICBGVF9VSW50ICAgICBtYXhfcG9pbnRzOwotCi0gIH0gSVVQX1dvcmtlclJlYywgKklVUF9Xb3JrZXI7Ci0KLQotICBzdGF0aWMgdm9pZAotICBfaXVwX3dvcmtlcl9zaGlmdCggSVVQX1dvcmtlciAgd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcDEsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBwMiwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHAgKQotICB7Ci0gICAgRlRfVUludCAgICAgaTsKLSAgICBGVF9GMjZEb3Q2ICBkeDsKLQotCi0gICAgZHggPSB3b3JrZXItPmN1cnNbcF0ueCAtIHdvcmtlci0+b3Jnc1twXS54OwotICAgIGlmICggZHggIT0gMCApCi0gICAgewotICAgICAgZm9yICggaSA9IHAxOyBpIDwgcDsgaSsrICkKLSAgICAgICAgd29ya2VyLT5jdXJzW2ldLnggKz0gZHg7Ci0KLSAgICAgIGZvciAoIGkgPSBwICsgMTsgaSA8PSBwMjsgaSsrICkKLSAgICAgICAgd29ya2VyLT5jdXJzW2ldLnggKz0gZHg7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBfaXVwX3dvcmtlcl9pbnRlcnBvbGF0ZSggSVVQX1dvcmtlciAgd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJlZjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByZWYyICkKLSAgewotICAgIEZUX1VJbnQgICAgIGk7Ci0gICAgRlRfRjI2RG90NiAgb3J1czEsIG9ydXMyLCBvcmcxLCBvcmcyLCBkZWx0YTEsIGRlbHRhMjsKLQotCi0gICAgaWYgKCBwMSA+IHAyICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggQk9VTkRTKCByZWYxLCB3b3JrZXItPm1heF9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCByZWYyLCB3b3JrZXItPm1heF9wb2ludHMgKSApCi0gICAgICByZXR1cm47Ci0KLSAgICBvcnVzMSA9IHdvcmtlci0+b3J1c1tyZWYxXS54OwotICAgIG9ydXMyID0gd29ya2VyLT5vcnVzW3JlZjJdLng7Ci0KLSAgICBpZiAoIG9ydXMxID4gb3J1czIgKQotICAgIHsKLSAgICAgIEZUX0YyNkRvdDYgIHRtcF9vOwotICAgICAgRlRfVUludCAgICAgdG1wX3I7Ci0KLQotICAgICAgdG1wX28gPSBvcnVzMTsKLSAgICAgIG9ydXMxID0gb3J1czI7Ci0gICAgICBvcnVzMiA9IHRtcF9vOwotCi0gICAgICB0bXBfciA9IHJlZjE7Ci0gICAgICByZWYxICA9IHJlZjI7Ci0gICAgICByZWYyICA9IHRtcF9yOwotICAgIH0KLQotICAgIG9yZzEgICA9IHdvcmtlci0+b3Jnc1tyZWYxXS54OwotICAgIG9yZzIgICA9IHdvcmtlci0+b3Jnc1tyZWYyXS54OwotICAgIGRlbHRhMSA9IHdvcmtlci0+Y3Vyc1tyZWYxXS54IC0gb3JnMTsKLSAgICBkZWx0YTIgPSB3b3JrZXItPmN1cnNbcmVmMl0ueCAtIG9yZzI7Ci0KLSAgICBpZiAoIG9ydXMxID09IG9ydXMyICkKLSAgICB7Ci0gICAgICAvKiBzaW1wbGUgc2hpZnQgb2YgdW50b3VjaGVkIHBvaW50cyAqLwotICAgICAgZm9yICggaSA9IHAxOyBpIDw9IHAyOyBpKysgKQotICAgICAgewotICAgICAgICBGVF9GMjZEb3Q2ICB4ID0gd29ya2VyLT5vcmdzW2ldLng7Ci0KLQotICAgICAgICBpZiAoIHggPD0gb3JnMSApCi0gICAgICAgICAgeCArPSBkZWx0YTE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB4ICs9IGRlbHRhMjsKLQotICAgICAgICB3b3JrZXItPmN1cnNbaV0ueCA9IHg7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgc2NhbGUgICAgICAgPSAwOwotICAgICAgRlRfQm9vbCAgIHNjYWxlX3ZhbGlkID0gMDsKLQotCi0gICAgICAvKiBpbnRlcnBvbGF0aW9uICovCi0gICAgICBmb3IgKCBpID0gcDE7IGkgPD0gcDI7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0YyNkRvdDYgIHggPSB3b3JrZXItPm9yZ3NbaV0ueDsKLQotCi0gICAgICAgIGlmICggeCA8PSBvcmcxICkKLSAgICAgICAgICB4ICs9IGRlbHRhMTsKLQotICAgICAgICBlbHNlIGlmICggeCA+PSBvcmcyICkKLSAgICAgICAgICB4ICs9IGRlbHRhMjsKLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICFzY2FsZV92YWxpZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgc2NhbGVfdmFsaWQgPSAxOwotICAgICAgICAgICAgc2NhbGUgICAgICAgPSBUVF9NVUxESVYoIG9yZzIgKyBkZWx0YTIgLSAoIG9yZzEgKyBkZWx0YTEgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBvcnVzMiAtIG9ydXMxICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgeCA9ICggb3JnMSArIGRlbHRhMSApICsKLSAgICAgICAgICAgICAgVFRfTVVMRklYKCB3b3JrZXItPm9ydXNbaV0ueCAtIG9ydXMxLCBzY2FsZSApOwotICAgICAgICB9Ci0gICAgICAgIHdvcmtlci0+Y3Vyc1tpXS54ID0geDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSVVQW2FdOiAgICAgICBJbnRlcnBvbGF0ZSBVbnRvdWNoZWQgUG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzMC0weDMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19JVVAoIElOU19BUkcgKQotICB7Ci0gICAgSVVQX1dvcmtlclJlYyAgVjsKLSAgICBGVF9CeXRlICAgICAgICBtYXNrOwotCi0gICAgRlRfVUludCAgIGZpcnN0X3BvaW50OyAgIC8qIGZpcnN0IHBvaW50IG9mIGNvbnRvdXIgICAgICAgICovCi0gICAgRlRfVUludCAgIGVuZF9wb2ludDsgICAgIC8qIGVuZCBwb2ludCAobGFzdCsxKSBvZiBjb250b3VyICovCi0KLSAgICBGVF9VSW50ICAgZmlyc3RfdG91Y2hlZDsgLyogZmlyc3QgdG91Y2hlZCBwb2ludCBpbiBjb250b3VyICAgKi8KLSAgICBGVF9VSW50ICAgY3VyX3RvdWNoZWQ7ICAgLyogY3VycmVudCB0b3VjaGVkIHBvaW50IGluIGNvbnRvdXIgKi8KLQotICAgIEZUX1VJbnQgICBwb2ludDsgICAgICAgICAvKiBjdXJyZW50IHBvaW50ICAgKi8KLSAgICBGVF9TaG9ydCAgY29udG91cjsgICAgICAgLyogY3VycmVudCBjb250b3VyICovCi0KLSAgICBGVF9VTlVTRURfQVJHOwotCi0KLSAgICAvKiBpZ25vcmUgZW1wdHkgb3V0bGluZXMgKi8KLSAgICBpZiAoIENVUi5wdHMubl9jb250b3VycyA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggQ1VSLm9wY29kZSAmIDEgKQotICAgIHsKLSAgICAgIG1hc2sgICA9IEZUX0NVUlZFX1RBR19UT1VDSF9YOwotICAgICAgVi5vcmdzID0gQ1VSLnB0cy5vcmc7Ci0gICAgICBWLmN1cnMgPSBDVVIucHRzLmN1cjsKLSAgICAgIFYub3J1cyA9IENVUi5wdHMub3J1czsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1hc2sgICA9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOwotICAgICAgVi5vcmdzID0gKEZUX1ZlY3RvciopKCAoRlRfUG9zKilDVVIucHRzLm9yZyArIDEgKTsKLSAgICAgIFYuY3VycyA9IChGVF9WZWN0b3IqKSggKEZUX1BvcyopQ1VSLnB0cy5jdXIgKyAxICk7Ci0gICAgICBWLm9ydXMgPSAoRlRfVmVjdG9yKikoIChGVF9Qb3MqKUNVUi5wdHMub3J1cyArIDEgKTsKLSAgICB9Ci0gICAgVi5tYXhfcG9pbnRzID0gQ1VSLnB0cy5uX3BvaW50czsKLQotICAgIGNvbnRvdXIgPSAwOwotICAgIHBvaW50ICAgPSAwOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBlbmRfcG9pbnQgICA9IENVUi5wdHMuY29udG91cnNbY29udG91cl0gLSBDVVIucHRzLmZpcnN0X3BvaW50OwotICAgICAgZmlyc3RfcG9pbnQgPSBwb2ludDsKLQotICAgICAgaWYgKCBDVVIucHRzLm5fcG9pbnRzIDw9IGVuZF9wb2ludCApCi0gICAgICAgIGVuZF9wb2ludCA9IENVUi5wdHMubl9wb2ludHM7Ci0KLSAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICYmICggQ1VSLnB0cy50YWdzW3BvaW50XSAmIG1hc2sgKSA9PSAwICkKLSAgICAgICAgcG9pbnQrKzsKLQotICAgICAgaWYgKCBwb2ludCA8PSBlbmRfcG9pbnQgKQotICAgICAgewotICAgICAgICBmaXJzdF90b3VjaGVkID0gcG9pbnQ7Ci0gICAgICAgIGN1cl90b3VjaGVkICAgPSBwb2ludDsKLQotICAgICAgICBwb2ludCsrOwotCi0gICAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggKCBDVVIucHRzLnRhZ3NbcG9pbnRdICYgbWFzayApICE9IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcG9pbnQgPiAwICkKLSAgICAgICAgICAgICAgX2l1cF93b3JrZXJfaW50ZXJwb2xhdGUoICZWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RvdWNoZWQgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RvdWNoZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCApOwotICAgICAgICAgICAgY3VyX3RvdWNoZWQgPSBwb2ludDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwb2ludCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjdXJfdG91Y2hlZCA9PSBmaXJzdF90b3VjaGVkICkKLSAgICAgICAgICBfaXVwX3dvcmtlcl9zaGlmdCggJlYsIGZpcnN0X3BvaW50LCBlbmRfcG9pbnQsIGN1cl90b3VjaGVkICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIF9pdXBfd29ya2VyX2ludGVycG9sYXRlKCAmViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydCkoIGN1cl90b3VjaGVkICsgMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90b3VjaGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkICk7Ci0KLSAgICAgICAgICBpZiAoIGZpcnN0X3RvdWNoZWQgPiAwICkKLSAgICAgICAgICAgIF9pdXBfd29ya2VyX2ludGVycG9sYXRlKCAmViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdG91Y2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvbnRvdXIrKzsKLSAgICB9IHdoaWxlICggY29udG91ciA8IENVUi5wdHMubl9jb250b3VycyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFTFRBUG5bXTogICAgREVMVEEgZXhjZXB0aW9ucyBQMSwgUDIsIFAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUQsMHg3MSwweDcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgKDIgKiB1aW50MzIpLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfREVMVEFQKCBJTlNfQVJHICkKLSAgewotICAgIEZUX1VMb25nICAgaywgbnVtcDsKLSAgICBGVF9VU2hvcnQgIEE7Ci0gICAgRlRfVUxvbmcgICBDOwotICAgIEZUX0xvbmcgICAgQjsKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICAvKiBEZWx0YSBoaW50aW5nIGlzIGNvdmVyZWQgYnkgVVMgUGF0ZW50IDUxNTk2NjguICovCi0gICAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICBuID0gYXJnc1swXSAqIDI7Ci0KLQotICAgICAgaWYgKCBDVVIuYXJncyA8IG4gKQotICAgICAgewotICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfVG9vX0Zld19Bcmd1bWVudHM7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgQ1VSLmFyZ3MgLT0gbjsKLSAgICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgICBudW1wID0gKEZUX1VMb25nKWFyZ3NbMF07ICAgLyogc29tZSBwb2ludHMgdGhlb3JldGljYWxseSBtYXkgb2NjdXIgbW9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIG9uY2UsIHRodXMgVVNob3J0IGlzbid0IGVub3VnaCAqLwotCi0gICAgZm9yICggayA9IDE7IGsgPD0gbnVtcDsgaysrICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5hcmdzIDwgMiApCi0gICAgICB7Ci0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9Ub29fRmV3X0FyZ3VtZW50czsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBDVVIuYXJncyAtPSAyOwotCi0gICAgICBBID0gKEZUX1VTaG9ydClDVVIuc3RhY2tbQ1VSLmFyZ3MgKyAxXTsKLSAgICAgIEIgPSBDVVIuc3RhY2tbQ1VSLmFyZ3NdOwotCi0gICAgICAvKiBYWFg6IEJlY2F1c2Ugc29tZSBwb3B1bGFyIGZvbnRzIGNvbnRhaW4gc29tZSBpbnZhbGlkIERlbHRhUCAqLwotICAgICAgLyogICAgICBpbnN0cnVjdGlvbnMsIHdlIHNpbXBseSBpZ25vcmUgdGhlbSB3aGVuIHRoZSBzdGFja2VkICAgKi8KLSAgICAgIC8qICAgICAgcG9pbnQgcmVmZXJlbmNlIGlzIG9mZiBsaW1pdCwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuICovCi0gICAgICAvKiAgICAgIGVycm9yLiAgQXMgYSBkZWx0YSBpbnN0cnVjdGlvbiBkb2Vzbid0IGNoYW5nZSBhIGdseXBoICAqLwotICAgICAgLyogICAgICBpbiBncmVhdCB3YXlzLCB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0uICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCAhQk9VTkRTKCBBLCBDVVIuenAwLm5fcG9pbnRzICkgKQotICAgICAgewotICAgICAgICBDID0gKCAoRlRfVUxvbmcpQiAmIDB4RjAgKSA+PiA0OwotCi0gICAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMHg1RDoKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzE6Ci0gICAgICAgICAgQyArPSAxNjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzI6Ci0gICAgICAgICAgQyArPSAzMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIEMgKz0gQ1VSLkdTLmRlbHRhX2Jhc2U7Ci0KLSAgICAgICAgaWYgKCBDVVJSRU5UX1BwZW0oKSA9PSAoRlRfTG9uZylDICkKLSAgICAgICAgewotICAgICAgICAgIEIgPSAoIChGVF9VTG9uZylCICYgMHhGICkgLSA4OwotICAgICAgICAgIGlmICggQiA+PSAwICkKLSAgICAgICAgICAgIEIrKzsKLSAgICAgICAgICBCID0gQiAqIDY0IC8gKCAxTCA8PCBDVVIuR1MuZGVsdGFfc2hpZnQgKTsKLQotICAgICAgICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAwLCBBLCBCICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgIH0KLQotICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogREVMVEFDbltdOiAgICBERUxUQSBleGNlcHRpb25zIEMxLCBDMiwgQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3MywweDc0LDB4NzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAoMiAqIHVpbnQzMikuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ERUxUQUMoIElOU19BUkcgKQotICB7Ci0gICAgRlRfVUxvbmcgIG51bXAsIGs7Ci0gICAgRlRfVUxvbmcgIEEsIEM7Ci0gICAgRlRfTG9uZyAgIEI7Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgLyogRGVsdGEgaGludGluZyBpcyBjb3ZlcmVkIGJ5IFVTIFBhdGVudCA1MTU5NjY4LiAqLwotICAgIGlmICggQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCi0gICAgewotICAgICAgRlRfTG9uZyAgbiA9IGFyZ3NbMF0gKiAyOwotCi0KLSAgICAgIGlmICggQ1VSLmFyZ3MgPCBuICkKLSAgICAgIHsKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX1Rvb19GZXdfQXJndW1lbnRzOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIENVUi5hcmdzIC09IG47Ci0gICAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgbnVtcCA9IChGVF9VTG9uZylhcmdzWzBdOwotCi0gICAgZm9yICggayA9IDE7IGsgPD0gbnVtcDsgaysrICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5hcmdzIDwgMiApCi0gICAgICB7Ci0gICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9Ub29fRmV3X0FyZ3VtZW50czsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBDVVIuYXJncyAtPSAyOwotCi0gICAgICBBID0gKEZUX1VMb25nKUNVUi5zdGFja1tDVVIuYXJncyArIDFdOwotICAgICAgQiA9IENVUi5zdGFja1tDVVIuYXJnc107Ci0KLSAgICAgIGlmICggQk9VTkRTKCBBLCBDVVIuY3Z0U2l6ZSApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9SZWZlcmVuY2U7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEMgPSAoIChGVF9VTG9uZylCICYgMHhGMCApID4+IDQ7Ci0KLSAgICAgICAgc3dpdGNoICggQ1VSLm9wY29kZSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAweDczOgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3NDoKLSAgICAgICAgICBDICs9IDE2OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3NToKLSAgICAgICAgICBDICs9IDMyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgQyArPSBDVVIuR1MuZGVsdGFfYmFzZTsKLQotICAgICAgICBpZiAoIENVUlJFTlRfUHBlbSgpID09IChGVF9Mb25nKUMgKQotICAgICAgICB7Ci0gICAgICAgICAgQiA9ICggKEZUX1VMb25nKUIgJiAweEYgKSAtIDg7Ci0gICAgICAgICAgaWYgKCBCID49IDAgKQotICAgICAgICAgICAgQisrOwotICAgICAgICAgIEIgPSBCICogNjQgLyAoIDFMIDw8IENVUi5HUy5kZWx0YV9zaGlmdCApOwotCi0gICAgICAgICAgQ1VSX0Z1bmNfbW92ZV9jdnQoIEEsIEIgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUlTQy4gSU5TVFJVQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0VUSU5GT1tdOiAgICBHRVQgSU5GT3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HRVRJTkZPKCBJTlNfQVJHICkKLSAgewotICAgIEZUX0xvbmcgIEs7Ci0KLQotICAgIEsgPSAwOwotCi0gICAgLyogV2UgcmV0dXJuIE1TIHJhc3Rlcml6ZXIgdmVyc2lvbiAxLjcgZm9yIHRoZSBmb250IHNjYWxlci4gKi8KLSAgICBpZiAoICggYXJnc1swXSAmIDEgKSAhPSAwICkKLSAgICAgIEsgPSAzNTsKLQotICAgIC8qIEhhcyB0aGUgZ2x5cGggYmVlbiByb3RhdGVkPyAqLwotICAgIGlmICggKCBhcmdzWzBdICYgMiApICE9IDAgJiYgQ1VSLnR0X21ldHJpY3Mucm90YXRlZCApCi0gICAgICBLIHw9IDB4ODA7Ci0KLSAgICAvKiBIYXMgdGhlIGdseXBoIGJlZW4gc3RyZXRjaGVkPyAqLwotICAgIGlmICggKCBhcmdzWzBdICYgNCApICE9IDAgJiYgQ1VSLnR0X21ldHJpY3Muc3RyZXRjaGVkICkKLSAgICAgIEsgfD0gMSA8PCA4OwotCi0gICAgLyogQXJlIHdlIGhpbnRpbmcgZm9yIGdyYXlzY2FsZT8gKi8KLSAgICBpZiAoICggYXJnc1swXSAmIDMyICkgIT0gMCAmJiBDVVIuZ3JheXNjYWxlICkKLSAgICAgIEsgfD0gMSA8PCAxMjsKLQotICAgIGFyZ3NbMF0gPSBLOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBJbnNfVU5LTk9XTiggSU5TX0FSRyApCi0gIHsKLSAgICBUVF9EZWZSZWNvcmQqICBkZWYgICA9IENVUi5JRGVmczsKLSAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIENVUi5udW1JRGVmczsKLQotICAgIEZUX1VOVVNFRF9BUkc7Ci0KLQotICAgIGZvciAoIDsgZGVmIDwgbGltaXQ7IGRlZisrICkKLSAgICB7Ci0gICAgICBpZiAoIChGVF9CeXRlKWRlZi0+b3BjID09IENVUi5vcGNvZGUgJiYgZGVmLT5hY3RpdmUgKQotICAgICAgewotICAgICAgICBUVF9DYWxsUmVjKiAgY2FsbDsKLQotCi0gICAgICAgIGlmICggQ1VSLmNhbGxUb3AgPj0gQ1VSLmNhbGxTaXplICkKLSAgICAgICAgewotICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9TdGFja19PdmVyZmxvdzsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYWxsID0gQ1VSLmNhbGxTdGFjayArIENVUi5jYWxsVG9wKys7Ci0KLSAgICAgICAgY2FsbC0+Q2FsbGVyX1JhbmdlID0gQ1VSLmN1clJhbmdlOwotICAgICAgICBjYWxsLT5DYWxsZXJfSVAgICAgPSBDVVIuSVArMTsKLSAgICAgICAgY2FsbC0+Q3VyX0NvdW50ICAgID0gMTsKLSAgICAgICAgY2FsbC0+Q3VyX1Jlc3RhcnQgID0gZGVmLT5zdGFydDsKLQotICAgICAgICBJTlNfR290b19Db2RlUmFuZ2UoIGRlZi0+cmFuZ2UsIGRlZi0+c3RhcnQgKTsKLQotICAgICAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX09wY29kZTsKLSAgfQotCi0KLSNpZm5kZWYgVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0gKLQotCi0gIHN0YXRpYwotICBUSW5zdHJ1Y3Rpb25fRnVuY3Rpb24gIEluc3RydWN0X0Rpc3BhdGNoWzI1Nl0gPQotICB7Ci0gICAgLyogT3Bjb2RlcyBhcmUgZ2F0aGVyZWQgaW4gZ3JvdXBzIG9mIDE2LiAqLwotICAgIC8qIFBsZWFzZSBrZWVwIHRoZSBzcGFjZXMgYXMgdGhleSBhcmUuICAgKi8KLQotICAgIC8qICBTVlRDQSAgeSAgKi8gIEluc19TVlRDQSwKLSAgICAvKiAgU1ZUQ0EgIHggICovICBJbnNfU1ZUQ0EsCi0gICAgLyogIFNQdlRDQSB5ICAqLyAgSW5zX1NQVlRDQSwKLSAgICAvKiAgU1B2VENBIHggICovICBJbnNfU1BWVENBLAotICAgIC8qICBTRnZUQ0EgeSAgKi8gIEluc19TRlZUQ0EsCi0gICAgLyogIFNGdlRDQSB4ICAqLyAgSW5zX1NGVlRDQSwKLSAgICAvKiAgU1B2VEwgLy8gICovICBJbnNfU1BWVEwsCi0gICAgLyogIFNQdlRMICsgICAqLyAgSW5zX1NQVlRMLAotICAgIC8qICBTRnZUTCAvLyAgKi8gIEluc19TRlZUTCwKLSAgICAvKiAgU0Z2VEwgKyAgICovICBJbnNfU0ZWVEwsCi0gICAgLyogIFNQdkZTICAgICAqLyAgSW5zX1NQVkZTLAotICAgIC8qICBTRnZGUyAgICAgKi8gIEluc19TRlZGUywKLSAgICAvKiAgR1BWICAgICAgICovICBJbnNfR1BWLAotICAgIC8qICBHRlYgICAgICAgKi8gIEluc19HRlYsCi0gICAgLyogIFNGdlRQdiAgICAqLyAgSW5zX1NGVlRQViwKLSAgICAvKiAgSVNFQ1QgICAgICovICBJbnNfSVNFQ1QsCi0KLSAgICAvKiAgU1JQMCAgICAgICovICBJbnNfU1JQMCwKLSAgICAvKiAgU1JQMSAgICAgICovICBJbnNfU1JQMSwKLSAgICAvKiAgU1JQMiAgICAgICovICBJbnNfU1JQMiwKLSAgICAvKiAgU1pQMCAgICAgICovICBJbnNfU1pQMCwKLSAgICAvKiAgU1pQMSAgICAgICovICBJbnNfU1pQMSwKLSAgICAvKiAgU1pQMiAgICAgICovICBJbnNfU1pQMiwKLSAgICAvKiAgU1pQUyAgICAgICovICBJbnNfU1pQUywKLSAgICAvKiAgU0xPT1AgICAgICovICBJbnNfU0xPT1AsCi0gICAgLyogIFJURyAgICAgICAqLyAgSW5zX1JURywKLSAgICAvKiAgUlRIRyAgICAgICovICBJbnNfUlRIRywKLSAgICAvKiAgU01EICAgICAgICovICBJbnNfU01ELAotICAgIC8qICBFTFNFICAgICAgKi8gIEluc19FTFNFLAotICAgIC8qICBKTVBSICAgICAgKi8gIEluc19KTVBSLAotICAgIC8qICBTQ3ZUQ2kgICAgKi8gIEluc19TQ1ZUQ0ksCi0gICAgLyogIFNTd0NpICAgICAqLyAgSW5zX1NTV0NJLAotICAgIC8qICBTU1cgICAgICAgKi8gIEluc19TU1csCi0KLSAgICAvKiAgRFVQICAgICAgICovICBJbnNfRFVQLAotICAgIC8qICBQT1AgICAgICAgKi8gIEluc19QT1AsCi0gICAgLyogIENMRUFSICAgICAqLyAgSW5zX0NMRUFSLAotICAgIC8qICBTV0FQICAgICAgKi8gIEluc19TV0FQLAotICAgIC8qICBERVBUSCAgICAgKi8gIEluc19ERVBUSCwKLSAgICAvKiAgQ0lOREVYICAgICovICBJbnNfQ0lOREVYLAotICAgIC8qICBNSU5ERVggICAgKi8gIEluc19NSU5ERVgsCi0gICAgLyogIEFsaWduUFRTICAqLyAgSW5zX0FMSUdOUFRTLAotICAgIC8qICBJTlNfMHgyOCAgKi8gIEluc19VTktOT1dOLAotICAgIC8qICBVVFAgICAgICAgKi8gIEluc19VVFAsCi0gICAgLyogIExPT1BDQUxMICAqLyAgSW5zX0xPT1BDQUxMLAotICAgIC8qICBDQUxMICAgICAgKi8gIEluc19DQUxMLAotICAgIC8qICBGREVGICAgICAgKi8gIEluc19GREVGLAotICAgIC8qICBFTkRGICAgICAgKi8gIEluc19FTkRGLAotICAgIC8qICBNREFQWzBdICAgKi8gIEluc19NREFQLAotICAgIC8qICBNREFQWzFdICAgKi8gIEluc19NREFQLAotCi0gICAgLyogIElVUFswXSAgICAqLyAgSW5zX0lVUCwKLSAgICAvKiAgSVVQWzFdICAgICovICBJbnNfSVVQLAotICAgIC8qICBTSFBbMF0gICAgKi8gIEluc19TSFAsCi0gICAgLyogIFNIUFsxXSAgICAqLyAgSW5zX1NIUCwKLSAgICAvKiAgU0hDWzBdICAgICovICBJbnNfU0hDLAotICAgIC8qICBTSENbMV0gICAgKi8gIEluc19TSEMsCi0gICAgLyogIFNIWlswXSAgICAqLyAgSW5zX1NIWiwKLSAgICAvKiAgU0haWzFdICAgICovICBJbnNfU0haLAotICAgIC8qICBTSFBJWCAgICAgKi8gIEluc19TSFBJWCwKLSAgICAvKiAgSVAgICAgICAgICovICBJbnNfSVAsCi0gICAgLyogIE1TSVJQWzBdICAqLyAgSW5zX01TSVJQLAotICAgIC8qICBNU0lSUFsxXSAgKi8gIEluc19NU0lSUCwKLSAgICAvKiAgQWxpZ25SUCAgICovICBJbnNfQUxJR05SUCwKLSAgICAvKiAgUlRERyAgICAgICovICBJbnNfUlRERywKLSAgICAvKiAgTUlBUFswXSAgICovICBJbnNfTUlBUCwKLSAgICAvKiAgTUlBUFsxXSAgICovICBJbnNfTUlBUCwKLQotICAgIC8qICBOUHVzaEIgICAgKi8gIEluc19OUFVTSEIsCi0gICAgLyogIE5QdXNoVyAgICAqLyAgSW5zX05QVVNIVywKLSAgICAvKiAgV1MgICAgICAgICovICBJbnNfV1MsCi0gICAgLyogIFJTICAgICAgICAqLyAgSW5zX1JTLAotICAgIC8qICBXQ3Z0UCAgICAgKi8gIEluc19XQ1ZUUCwKLSAgICAvKiAgUkN2dCAgICAgICovICBJbnNfUkNWVCwKLSAgICAvKiAgR0NbMF0gICAgICovICBJbnNfR0MsCi0gICAgLyogIEdDWzFdICAgICAqLyAgSW5zX0dDLAotICAgIC8qICBTQ0ZTICAgICAgKi8gIEluc19TQ0ZTLAotICAgIC8qICBNRFswXSAgICAgKi8gIEluc19NRCwKLSAgICAvKiAgTURbMV0gICAgICovICBJbnNfTUQsCi0gICAgLyogIE1QUEVNICAgICAqLyAgSW5zX01QUEVNLAotICAgIC8qICBNUFMgICAgICAgKi8gIEluc19NUFMsCi0gICAgLyogIEZsaXBPTiAgICAqLyAgSW5zX0ZMSVBPTiwKLSAgICAvKiAgRmxpcE9GRiAgICovICBJbnNfRkxJUE9GRiwKLSAgICAvKiAgREVCVUcgICAgICovICBJbnNfREVCVUcsCi0KLSAgICAvKiAgTFQgICAgICAgICovICBJbnNfTFQsCi0gICAgLyogIExURVEgICAgICAqLyAgSW5zX0xURVEsCi0gICAgLyogIEdUICAgICAgICAqLyAgSW5zX0dULAotICAgIC8qICBHVEVRICAgICAgKi8gIEluc19HVEVRLAotICAgIC8qICBFUSAgICAgICAgKi8gIEluc19FUSwKLSAgICAvKiAgTkVRICAgICAgICovICBJbnNfTkVRLAotICAgIC8qICBPREQgICAgICAgKi8gIEluc19PREQsCi0gICAgLyogIEVWRU4gICAgICAqLyAgSW5zX0VWRU4sCi0gICAgLyogIElGICAgICAgICAqLyAgSW5zX0lGLAotICAgIC8qICBFSUYgICAgICAgKi8gIEluc19FSUYsCi0gICAgLyogIEFORCAgICAgICAqLyAgSW5zX0FORCwKLSAgICAvKiAgT1IgICAgICAgICovICBJbnNfT1IsCi0gICAgLyogIE5PVCAgICAgICAqLyAgSW5zX05PVCwKLSAgICAvKiAgRGVsdGFQMSAgICovICBJbnNfREVMVEFQLAotICAgIC8qICBTREIgICAgICAgKi8gIEluc19TREIsCi0gICAgLyogIFNEUyAgICAgICAqLyAgSW5zX1NEUywKLQotICAgIC8qICBBREQgICAgICAgKi8gIEluc19BREQsCi0gICAgLyogIFNVQiAgICAgICAqLyAgSW5zX1NVQiwKLSAgICAvKiAgRElWICAgICAgICovICBJbnNfRElWLAotICAgIC8qICBNVUwgICAgICAgKi8gIEluc19NVUwsCi0gICAgLyogIEFCUyAgICAgICAqLyAgSW5zX0FCUywKLSAgICAvKiAgTkVHICAgICAgICovICBJbnNfTkVHLAotICAgIC8qICBGTE9PUiAgICAgKi8gIEluc19GTE9PUiwKLSAgICAvKiAgQ0VJTElORyAgICovICBJbnNfQ0VJTElORywKLSAgICAvKiAgUk9VTkRbMF0gICovICBJbnNfUk9VTkQsCi0gICAgLyogIFJPVU5EWzFdICAqLyAgSW5zX1JPVU5ELAotICAgIC8qICBST1VORFsyXSAgKi8gIEluc19ST1VORCwKLSAgICAvKiAgUk9VTkRbM10gICovICBJbnNfUk9VTkQsCi0gICAgLyogIE5ST1VORFswXSAqLyAgSW5zX05ST1VORCwKLSAgICAvKiAgTlJPVU5EWzFdICovICBJbnNfTlJPVU5ELAotICAgIC8qICBOUk9VTkRbMl0gKi8gIEluc19OUk9VTkQsCi0gICAgLyogIE5ST1VORFszXSAqLyAgSW5zX05ST1VORCwKLQotICAgIC8qICBXQ3Z0RiAgICAgKi8gIEluc19XQ1ZURiwKLSAgICAvKiAgRGVsdGFQMiAgICovICBJbnNfREVMVEFQLAotICAgIC8qICBEZWx0YVAzICAgKi8gIEluc19ERUxUQVAsCi0gICAgLyogIERlbHRhQ25bMF0gKi8gSW5zX0RFTFRBQywKLSAgICAvKiAgRGVsdGFDblsxXSAqLyBJbnNfREVMVEFDLAotICAgIC8qICBEZWx0YUNuWzJdICovIEluc19ERUxUQUMsCi0gICAgLyogIFNST1VORCAgICAqLyAgSW5zX1NST1VORCwKLSAgICAvKiAgUzQ1Um91bmQgICovICBJbnNfUzQ1Uk9VTkQsCi0gICAgLyogIEpST1QgICAgICAqLyAgSW5zX0pST1QsCi0gICAgLyogIEpST0YgICAgICAqLyAgSW5zX0pST0YsCi0gICAgLyogIFJPRkYgICAgICAqLyAgSW5zX1JPRkYsCi0gICAgLyogIElOU18weDdCICAqLyAgSW5zX1VOS05PV04sCi0gICAgLyogIFJVVEcgICAgICAqLyAgSW5zX1JVVEcsCi0gICAgLyogIFJEVEcgICAgICAqLyAgSW5zX1JEVEcsCi0gICAgLyogIFNBTkdXICAgICAqLyAgSW5zX1NBTkdXLAotICAgIC8qICBBQSAgICAgICAgKi8gIEluc19BQSwKLQotICAgIC8qICBGbGlwUFQgICAgKi8gIEluc19GTElQUFQsCi0gICAgLyogIEZsaXBSZ09OICAqLyAgSW5zX0ZMSVBSR09OLAotICAgIC8qICBGbGlwUmdPRkYgKi8gIEluc19GTElQUkdPRkYsCi0gICAgLyogIElOU18weDgzICAqLyAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDg0ICAqLyAgSW5zX1VOS05PV04sCi0gICAgLyogIFNjYW5DVFJMICAqLyAgSW5zX1NDQU5DVFJMLAotICAgIC8qICBTRFBWVExbMF0gKi8gIEluc19TRFBWVEwsCi0gICAgLyogIFNEUFZUTFsxXSAqLyAgSW5zX1NEUFZUTCwKLSAgICAvKiAgR2V0SU5GTyAgICovICBJbnNfR0VUSU5GTywKLSAgICAvKiAgSURFRiAgICAgICovICBJbnNfSURFRiwKLSAgICAvKiAgUk9MTCAgICAgICovICBJbnNfUk9MTCwKLSAgICAvKiAgTUFYICAgICAgICovICBJbnNfTUFYLAotICAgIC8qICBNSU4gICAgICAgKi8gIEluc19NSU4sCi0gICAgLyogIFNjYW5UWVBFICAqLyAgSW5zX1NDQU5UWVBFLAotICAgIC8qICBJbnN0Q1RSTCAgKi8gIEluc19JTlNUQ1RSTCwKLSAgICAvKiAgSU5TXzB4OEYgICovICBJbnNfVU5LTk9XTiwKLQotICAgIC8qICBJTlNfMHg5MCAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OTEgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDkyICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5MyAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OTQgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDk1ICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5NiAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OTcgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDk4ICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5OSAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OUEgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDlCICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5QyAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OUQgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDlFICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5RiAgKi8gICBJbnNfVU5LTk9XTiwKLQotICAgIC8qICBJTlNfMHhBMCAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QTEgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEEyICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBMyAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QTQgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEE1ICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBNiAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QTcgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEE4ICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBOSAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QUEgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEFCICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBQyAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QUQgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEFFICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBRiAgKi8gICBJbnNfVU5LTk9XTiwKLQotICAgIC8qICBQdXNoQlswXSAgKi8gIEluc19QVVNIQiwKLSAgICAvKiAgUHVzaEJbMV0gICovICBJbnNfUFVTSEIsCi0gICAgLyogIFB1c2hCWzJdICAqLyAgSW5zX1BVU0hCLAotICAgIC8qICBQdXNoQlszXSAgKi8gIEluc19QVVNIQiwKLSAgICAvKiAgUHVzaEJbNF0gICovICBJbnNfUFVTSEIsCi0gICAgLyogIFB1c2hCWzVdICAqLyAgSW5zX1BVU0hCLAotICAgIC8qICBQdXNoQls2XSAgKi8gIEluc19QVVNIQiwKLSAgICAvKiAgUHVzaEJbN10gICovICBJbnNfUFVTSEIsCi0gICAgLyogIFB1c2hXWzBdICAqLyAgSW5zX1BVU0hXLAotICAgIC8qICBQdXNoV1sxXSAgKi8gIEluc19QVVNIVywKLSAgICAvKiAgUHVzaFdbMl0gICovICBJbnNfUFVTSFcsCi0gICAgLyogIFB1c2hXWzNdICAqLyAgSW5zX1BVU0hXLAotICAgIC8qICBQdXNoV1s0XSAgKi8gIEluc19QVVNIVywKLSAgICAvKiAgUHVzaFdbNV0gICovICBJbnNfUFVTSFcsCi0gICAgLyogIFB1c2hXWzZdICAqLyAgSW5zX1BVU0hXLAotICAgIC8qICBQdXNoV1s3XSAgKi8gIEluc19QVVNIVywKLQotICAgIC8qICBNRFJQWzAwXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzAxXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzAyXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzAzXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzA0XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzA1XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzA2XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzA3XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzA4XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzA5XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzEwXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzExXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzEyXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzEzXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzE0XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzE1XSAgKi8gIEluc19NRFJQLAotCi0gICAgLyogIE1EUlBbMTZdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMTddICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMThdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMTldICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjBdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjFdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjJdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjNdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjRdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjVdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjZdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjddICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjhdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMjldICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMzBdICAqLyAgSW5zX01EUlAsCi0gICAgLyogIE1EUlBbMzFdICAqLyAgSW5zX01EUlAsCi0KLSAgICAvKiAgTUlSUFswMF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswMV0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswMl0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswM10gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswNF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswNV0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswNl0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswN10gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswOF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFswOV0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxMF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxMV0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxMl0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxM10gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxNF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxNV0gICovICBJbnNfTUlSUCwKLQotICAgIC8qICBNSVJQWzE2XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzE3XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzE4XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzE5XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzIwXSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzIxXSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzIyXSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzIzXSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzI0XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzI1XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzI2XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzI3XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzI4XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzI5XSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzMwXSAgKi8gIEluc19NSVJQLAotICAgIC8qICBNSVJQWzMxXSAgKi8gIEluc19NSVJQCi0gIH07Ci0KLQotI2VuZGlmIC8qICFUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGEgcnVuIG9mIG9wY29kZXMuICBJdCB3aWxsIGV4aXQgaW4gdGhlICAgICAgICAqLwotICAvKiAgZm9sbG93aW5nIGNhc2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIEVycm9ycyAoaW4gd2hpY2ggY2FzZSBpdCByZXR1cm5zIEZBTFNFKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gUmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgbWFpbiBjb2RlIHJhbmdlIChyZXR1cm5zIFRSVUUpLiAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWNoaW5nIHRoZSBlbmQgb2YgYSBjb2RlIHJhbmdlIHdpdGhpbiBhIGZ1bmN0aW9uIGNhbGwgaXMgYW4gICAgICAqLwotICAvKiAgICBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIEFmdGVyIGV4ZWN1dGluZyBvbmUgc2luZ2xlIG9wY29kZSwgaWYgdGhlIGZsYWcgYEluc3RydWN0aW9uX1RyYXAnICAqLwotICAvKiAgICBpcyBzZXQgdG8gVFJVRSAocmV0dXJucyBUUlVFKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBPbiBleGl0IHdpdGggVFJVRSwgdGVzdCBJUCA8IENvZGVTaXplIHRvIGtub3cgd2hldGhlciBpdCBjb21lcyBmcm9tICAqLwotICAvKiAgYW4gaW5zdHJ1Y3Rpb24gdHJhcCBvciBhIG5vcm1hbCB0ZXJtaW5hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgTm90ZTogVGhlIGRvY3VtZW50ZWQgREVCVUcgb3Bjb2RlIHBvcHMgYSB2YWx1ZSBmcm9tIHRoZSBzdGFjay4gIFRoaXMgKi8KLSAgLyogICAgICAgIGJlaGF2aW91ciBpcyB1bnN1cHBvcnRlZDsgaGVyZSBhIERFQlVHIG9wY29kZSBpcyBhbHdheXMgYW4gICAgICovCi0gIC8qICAgICAgICBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRISVMgSVMgVEhFIElOVEVSUFJFVEVSJ1MgTUFJTiBMT09QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIEluc3RydWN0aW9ucyBhcHBlYXIgaW4gdGhlIHNwZWNpZmljYXRpb24ncyBvcmRlci4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHRpbnRlcnAuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfUnVuSW5zKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIEZUX0xvbmcgIGluc19jb3VudGVyID0gMDsgIC8qIGV4ZWN1dGVkIGluc3RydWN0aW9ucyBjb3VudGVyICovCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX1JBU1RFUgotICAgIGN1ciA9ICpleGM7Ci0jZW5kaWYKLQotICAgIC8qIHNldCBDVlQgZnVuY3Rpb25zICovCi0gICAgQ1VSLnR0X21ldHJpY3MucmF0aW8gPSAwOwotICAgIGlmICggQ1VSLm1ldHJpY3MueF9wcGVtICE9IENVUi5tZXRyaWNzLnlfcHBlbSApCi0gICAgewotICAgICAgLyogbm9uLXNxdWFyZSBwaXhlbHMsIHVzZSB0aGUgc3RyZXRjaGVkIHJvdXRpbmVzICovCi0gICAgICBDVVIuZnVuY19yZWFkX2N2dCAgPSBSZWFkX0NWVF9TdHJldGNoZWQ7Ci0gICAgICBDVVIuZnVuY193cml0ZV9jdnQgPSBXcml0ZV9DVlRfU3RyZXRjaGVkOwotICAgICAgQ1VSLmZ1bmNfbW92ZV9jdnQgID0gTW92ZV9DVlRfU3RyZXRjaGVkOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogc3F1YXJlIHBpeGVscywgdXNlIG5vcm1hbCByb3V0aW5lcyAqLwotICAgICAgQ1VSLmZ1bmNfcmVhZF9jdnQgID0gUmVhZF9DVlQ7Ci0gICAgICBDVVIuZnVuY193cml0ZV9jdnQgPSBXcml0ZV9DVlQ7Ci0gICAgICBDVVIuZnVuY19tb3ZlX2N2dCAgPSBNb3ZlX0NWVDsKLSAgICB9Ci0KLSAgICBDT01QVVRFX0Z1bmNzKCk7Ci0gICAgQ09NUFVURV9Sb3VuZCggKEZUX0J5dGUpZXhjLT5HUy5yb3VuZF9zdGF0ZSApOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBDVVIub3Bjb2RlID0gQ1VSLmNvZGVbQ1VSLklQXTsKLQotICAgICAgaWYgKCAoIENVUi5sZW5ndGggPSBvcGNvZGVfbGVuZ3RoW0NVUi5vcGNvZGVdICkgPCAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIuSVAgKyAxID4gQ1VSLmNvZGVTaXplICkKLSAgICAgICAgICBnb3RvIExFcnJvckNvZGVPdmVyZmxvd187Ci0KLSAgICAgICAgQ1VSLmxlbmd0aCA9IDIgLSBDVVIubGVuZ3RoICogQ1VSLmNvZGVbQ1VSLklQICsgMV07Ci0gICAgICB9Ci0KLSAgICAgIGlmICggQ1VSLklQICsgQ1VSLmxlbmd0aCA+IENVUi5jb2RlU2l6ZSApCi0gICAgICAgIGdvdG8gTEVycm9yQ29kZU92ZXJmbG93XzsKLQotICAgICAgLyogRmlyc3QsIGxldCdzIGNoZWNrIGZvciBlbXB0eSBzdGFjayBhbmQgb3ZlcmZsb3cgKi8KLSAgICAgIENVUi5hcmdzID0gQ1VSLnRvcCAtICggUG9wX1B1c2hfQ291bnRbQ1VSLm9wY29kZV0gPj4gNCApOwotCi0gICAgICAvKiBgYXJncycgaXMgdGhlIHRvcCBvZiB0aGUgc3RhY2sgb25jZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBvcHBlZC4gKi8KLSAgICAgIC8qIE9uZSBjYW4gYWxzbyBpbnRlcnByZXQgaXQgYXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGFyZ3VtZW50LiAgICAqLwotICAgICAgaWYgKCBDVVIuYXJncyA8IDAgKQotICAgICAgewotICAgICAgICBDVVIuZXJyb3IgPSBUVF9FcnJfVG9vX0Zld19Bcmd1bWVudHM7Ci0gICAgICAgIGdvdG8gTEVycm9yTGFiZWxfOwotICAgICAgfQotCi0gICAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzICsgKCBQb3BfUHVzaF9Db3VudFtDVVIub3Bjb2RlXSAmIDE1ICk7Ci0KLSAgICAgIC8qIGBuZXdfdG9wJyBpcyB0aGUgbmV3IHRvcCBvZiB0aGUgc3RhY2ssIGFmdGVyIHRoZSBpbnN0cnVjdGlvbidzICovCi0gICAgICAvKiBleGVjdXRpb24uICBgdG9wJyB3aWxsIGJlIHNldCB0byBgbmV3X3RvcCcgYWZ0ZXIgdGhlIGBzd2l0Y2gnICAqLwotICAgICAgLyogc3RhdGVtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggQ1VSLm5ld190b3AgPiBDVVIuc3RhY2tTaXplICkKLSAgICAgIHsKLSAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX1N0YWNrX092ZXJmbG93OwotICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKLSAgICAgIH0KLQotICAgICAgQ1VSLnN0ZXBfaW5zID0gVFJVRTsKLSAgICAgIENVUi5lcnJvciAgICA9IFRUX0Vycl9PazsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fSU5URVJQUkVURVJfU1dJVENICi0KLSAgICAgIHsKLSAgICAgICAgRlRfTG9uZyogIGFyZ3MgICA9IENVUi5zdGFjayArIENVUi5hcmdzOwotICAgICAgICBGVF9CeXRlICAgb3Bjb2RlID0gQ1VSLm9wY29kZTsKLQotCi0jdW5kZWYgIEFSUkFZX0JPVU5EX0VSUk9SCi0jZGVmaW5lIEFSUkFZX0JPVU5EX0VSUk9SICBnb3RvIFNldF9JbnZhbGlkX1JlZgotCi0KLSAgICAgICAgc3dpdGNoICggb3Bjb2RlICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDB4MDA6ICAvKiBTVlRDQSB5ICAqLwotICAgICAgICBjYXNlIDB4MDE6ICAvKiBTVlRDQSB4ICAqLwotICAgICAgICBjYXNlIDB4MDI6ICAvKiBTUHZUQ0EgeSAqLwotICAgICAgICBjYXNlIDB4MDM6ICAvKiBTUHZUQ0EgeCAqLwotICAgICAgICBjYXNlIDB4MDQ6ICAvKiBTRnZUQ0EgeSAqLwotICAgICAgICBjYXNlIDB4MDU6ICAvKiBTRnZUQ0EgeCAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1Nob3J0IEFBLCBCQjsKLQotCi0gICAgICAgICAgICBBQSA9IChGVF9TaG9ydCkoICggb3Bjb2RlICYgMSApIDw8IDE0ICk7Ci0gICAgICAgICAgICBCQiA9IChGVF9TaG9ydCkoIEFBIF4gMHg0MDAwICk7Ci0KLSAgICAgICAgICAgIGlmICggb3Bjb2RlIDwgNCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIENVUi5HUy5wcm9qVmVjdG9yLnggPSBBQTsKLSAgICAgICAgICAgICAgQ1VSLkdTLnByb2pWZWN0b3IueSA9IEJCOwotCi0gICAgICAgICAgICAgIENVUi5HUy5kdWFsVmVjdG9yLnggPSBBQTsKLSAgICAgICAgICAgICAgQ1VSLkdTLmR1YWxWZWN0b3IueSA9IEJCOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBHVUVTU19WRUNUT1IoIHByb2pWZWN0b3IgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCAoIG9wY29kZSAmIDIgKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCA9IEFBOwotICAgICAgICAgICAgICBDVVIuR1MuZnJlZVZlY3Rvci55ID0gQkI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEdVRVNTX1ZFQ1RPUiggZnJlZVZlY3RvciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDT01QVVRFX0Z1bmNzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgwNjogIC8qIFNQdlRMIC8vICovCi0gICAgICAgIGNhc2UgMHgwNzogIC8qIFNQdlRMICsgICovCi0gICAgICAgICAgRE9fU1BWVEwKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MDg6ICAvKiBTRnZUTCAvLyAqLwotICAgICAgICBjYXNlIDB4MDk6ICAvKiBTRnZUTCArICAqLwotICAgICAgICAgIERPX1NGVlRMCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDBBOiAgLyogU1B2RlMgKi8KLSAgICAgICAgICBET19TUFZGUwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgwQjogIC8qIFNGdkZTICovCi0gICAgICAgICAgRE9fU0ZWRlMKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEM6ICAvKiBHUFYgKi8KLSAgICAgICAgICBET19HUFYKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEQ6ICAvKiBHRlYgKi8KLSAgICAgICAgICBET19HRlYKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEU6ICAvKiBTRnZUUHYgKi8KLSAgICAgICAgICBET19TRlZUUFYKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEY6ICAvKiBJU0VDVCAgKi8KLSAgICAgICAgICBJbnNfSVNFQ1QoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDEwOiAgLyogU1JQMCAqLwotICAgICAgICAgIERPX1NSUDAKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTE6ICAvKiBTUlAxICovCi0gICAgICAgICAgRE9fU1JQMQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxMjogIC8qIFNSUDIgKi8KLSAgICAgICAgICBET19TUlAyCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDEzOiAgLyogU1pQMCAqLwotICAgICAgICAgIEluc19TWlAwKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxNDogIC8qIFNaUDEgKi8KLSAgICAgICAgICBJbnNfU1pQMSggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTU6ICAvKiBTWlAyICovCi0gICAgICAgICAgSW5zX1NaUDIoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDE2OiAgLyogU1pQUyAqLwotICAgICAgICAgIEluc19TWlBTKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxNzogIC8qIFNMT09QICovCi0gICAgICAgICAgRE9fU0xPT1AKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTg6ICAvKiBSVEcgKi8KLSAgICAgICAgICBET19SVEcKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTk6ICAvKiBSVEhHICovCi0gICAgICAgICAgRE9fUlRIRwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxQTogIC8qIFNNRCAqLwotICAgICAgICAgIERPX1NNRAotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxQjogIC8qIEVMU0UgKi8KLSAgICAgICAgICBJbnNfRUxTRSggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MUM6ICAvKiBKTVBSICovCi0gICAgICAgICAgRE9fSk1QUgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxRDogIC8qIFNDVlRDSSAqLwotICAgICAgICAgIERPX1NDVlRDSQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxRTogIC8qIFNTV0NJICovCi0gICAgICAgICAgRE9fU1NXQ0kKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MUY6ICAvKiBTU1cgKi8KLSAgICAgICAgICBET19TU1cKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjA6ICAvKiBEVVAgKi8KLSAgICAgICAgICBET19EVVAKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjE6ICAvKiBQT1AgKi8KLSAgICAgICAgICAvKiBub3RoaW5nIDotKSAqLwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyMjogIC8qIENMRUFSICovCi0gICAgICAgICAgRE9fQ0xFQVIKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjM6ICAvKiBTV0FQICovCi0gICAgICAgICAgRE9fU1dBUAotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyNDogIC8qIERFUFRIICovCi0gICAgICAgICAgRE9fREVQVEgKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjU6ICAvKiBDSU5ERVggKi8KLSAgICAgICAgICBET19DSU5ERVgKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjY6ICAvKiBNSU5ERVggKi8KLSAgICAgICAgICBJbnNfTUlOREVYKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyNzogIC8qIEFMSUdOUFRTICovCi0gICAgICAgICAgSW5zX0FMSUdOUFRTKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyODogIC8qID8/Pz8gKi8KLSAgICAgICAgICBJbnNfVU5LTk9XTiggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Mjk6ICAvKiBVVFAgKi8KLSAgICAgICAgICBJbnNfVVRQKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyQTogIC8qIExPT1BDQUxMICovCi0gICAgICAgICAgSW5zX0xPT1BDQUxMKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyQjogIC8qIENBTEwgKi8KLSAgICAgICAgICBJbnNfQ0FMTCggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MkM6ICAvKiBGREVGICovCi0gICAgICAgICAgSW5zX0ZERUYoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDJEOiAgLyogRU5ERiAqLwotICAgICAgICAgIEluc19FTkRGKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyRTogIC8qIE1EQVAgKi8KLSAgICAgICAgY2FzZSAweDJGOiAgLyogTURBUCAqLwotICAgICAgICAgIEluc19NREFQKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgY2FzZSAweDMwOiAgLyogSVVQICovCi0gICAgICAgIGNhc2UgMHgzMTogIC8qIElVUCAqLwotICAgICAgICAgIEluc19JVVAoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDMyOiAgLyogU0hQICovCi0gICAgICAgIGNhc2UgMHgzMzogIC8qIFNIUCAqLwotICAgICAgICAgIEluc19TSFAoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDM0OiAgLyogU0hDICovCi0gICAgICAgIGNhc2UgMHgzNTogIC8qIFNIQyAqLwotICAgICAgICAgIEluc19TSEMoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDM2OiAgLyogU0haICovCi0gICAgICAgIGNhc2UgMHgzNzogIC8qIFNIWiAqLwotICAgICAgICAgIEluc19TSFooIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDM4OiAgLyogU0hQSVggKi8KLSAgICAgICAgICBJbnNfU0hQSVgoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDM5OiAgLyogSVAgICAgKi8KLSAgICAgICAgICBJbnNfSVAoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDNBOiAgLyogTVNJUlAgKi8KLSAgICAgICAgY2FzZSAweDNCOiAgLyogTVNJUlAgKi8KLSAgICAgICAgICBJbnNfTVNJUlAoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDNDOiAgLyogQWxpZ25SUCAqLwotICAgICAgICAgIEluc19BTElHTlJQKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgzRDogIC8qIFJUREcgKi8KLSAgICAgICAgICBET19SVERHCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDNFOiAgLyogTUlBUCAqLwotICAgICAgICBjYXNlIDB4M0Y6ICAvKiBNSUFQICovCi0gICAgICAgICAgSW5zX01JQVAoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQwOiAgLyogTlBVU0hCICovCi0gICAgICAgICAgSW5zX05QVVNIQiggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NDE6ICAvKiBOUFVTSFcgKi8KLSAgICAgICAgICBJbnNfTlBVU0hXKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0MjogIC8qIFdTICovCi0gICAgICAgICAgRE9fV1MKLSAgICAgICAgICBicmVhazsKLQotICAgICAgU2V0X0ludmFsaWRfUmVmOgotICAgICAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0ludmFsaWRfUmVmZXJlbmNlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0MzogIC8qIFJTICovCi0gICAgICAgICAgRE9fUlMKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NDQ6ICAvKiBXQ1ZUUCAqLwotICAgICAgICAgIERPX1dDVlRQCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQ1OiAgLyogUkNWVCAqLwotICAgICAgICAgIERPX1JDVlQKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NDY6ICAvKiBHQyAqLwotICAgICAgICBjYXNlIDB4NDc6ICAvKiBHQyAqLwotICAgICAgICAgIEluc19HQyggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NDg6ICAvKiBTQ0ZTICovCi0gICAgICAgICAgSW5zX1NDRlMoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQ5OiAgLyogTUQgKi8KLSAgICAgICAgY2FzZSAweDRBOiAgLyogTUQgKi8KLSAgICAgICAgICBJbnNfTUQoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDRCOiAgLyogTVBQRU0gKi8KLSAgICAgICAgICBET19NUFBFTQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0QzogIC8qIE1QUyAqLwotICAgICAgICAgIERPX01QUwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0RDogIC8qIEZMSVBPTiAqLwotICAgICAgICAgIERPX0ZMSVBPTgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0RTogIC8qIEZMSVBPRkYgKi8KLSAgICAgICAgICBET19GTElQT0ZGCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDRGOiAgLyogREVCVUcgKi8KLSAgICAgICAgICBET19ERUJVRwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1MDogIC8qIExUICovCi0gICAgICAgICAgRE9fTFQKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTE6ICAvKiBMVEVRICovCi0gICAgICAgICAgRE9fTFRFUQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1MjogIC8qIEdUICovCi0gICAgICAgICAgRE9fR1QKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTM6ICAvKiBHVEVRICovCi0gICAgICAgICAgRE9fR1RFUQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1NDogIC8qIEVRICovCi0gICAgICAgICAgRE9fRVEKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTU6ICAvKiBORVEgKi8KLSAgICAgICAgICBET19ORVEKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTY6ICAvKiBPREQgKi8KLSAgICAgICAgICBET19PREQKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTc6ICAvKiBFVkVOICovCi0gICAgICAgICAgRE9fRVZFTgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1ODogIC8qIElGICovCi0gICAgICAgICAgSW5zX0lGKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1OTogIC8qIEVJRiAqLwotICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NUE6ICAvKiBBTkQgKi8KLSAgICAgICAgICBET19BTkQKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NUI6ICAvKiBPUiAqLwotICAgICAgICAgIERPX09SCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDVDOiAgLyogTk9UICovCi0gICAgICAgICAgRE9fTk9UCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDVEOiAgLyogREVMVEFQMSAqLwotICAgICAgICAgIEluc19ERUxUQVAoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDVFOiAgLyogU0RCICovCi0gICAgICAgICAgRE9fU0RCCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDVGOiAgLyogU0RTICovCi0gICAgICAgICAgRE9fU0RTCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDYwOiAgLyogQUREICovCi0gICAgICAgICAgRE9fQURECi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDYxOiAgLyogU1VCICovCi0gICAgICAgICAgRE9fU1VCCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDYyOiAgLyogRElWICovCi0gICAgICAgICAgRE9fRElWCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDYzOiAgLyogTVVMICovCi0gICAgICAgICAgRE9fTVVMCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDY0OiAgLyogQUJTICovCi0gICAgICAgICAgRE9fQUJTCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDY1OiAgLyogTkVHICovCi0gICAgICAgICAgRE9fTkVHCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDY2OiAgLyogRkxPT1IgKi8KLSAgICAgICAgICBET19GTE9PUgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2NzogIC8qIENFSUxJTkcgKi8KLSAgICAgICAgICBET19DRUlMSU5HCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDY4OiAgLyogUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDY5OiAgLyogUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDZBOiAgLyogUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDZCOiAgLyogUk9VTkQgKi8KLSAgICAgICAgICBET19ST1VORAotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2QzogIC8qIE5ST1VORCAqLwotICAgICAgICBjYXNlIDB4NkQ6ICAvKiBOUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDZFOiAgLyogTlJSVU5EICovCi0gICAgICAgIGNhc2UgMHg2RjogIC8qIE5ST1VORCAqLwotICAgICAgICAgIERPX05ST1VORAotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3MDogIC8qIFdDVlRGICovCi0gICAgICAgICAgRE9fV0NWVEYKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzE6ICAvKiBERUxUQVAyICovCi0gICAgICAgIGNhc2UgMHg3MjogIC8qIERFTFRBUDMgKi8KLSAgICAgICAgICBJbnNfREVMVEFQKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3MzogIC8qIERFTFRBQzAgKi8KLSAgICAgICAgY2FzZSAweDc0OiAgLyogREVMVEFDMSAqLwotICAgICAgICBjYXNlIDB4NzU6ICAvKiBERUxUQUMyICovCi0gICAgICAgICAgSW5zX0RFTFRBQyggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzY6ICAvKiBTUk9VTkQgKi8KLSAgICAgICAgICBET19TUk9VTkQKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Nzc6ICAvKiBTNDVSb3VuZCAqLwotICAgICAgICAgIERPX1M0NVJPVU5ECi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDc4OiAgLyogSlJPVCAqLwotICAgICAgICAgIERPX0pST1QKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Nzk6ICAvKiBKUk9GICovCi0gICAgICAgICAgRE9fSlJPRgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3QTogIC8qIFJPRkYgKi8KLSAgICAgICAgICBET19ST0ZGCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDdCOiAgLyogPz8/PyAqLwotICAgICAgICAgIEluc19VTktOT1dOKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3QzogIC8qIFJVVEcgKi8KLSAgICAgICAgICBET19SVVRHCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDdEOiAgLyogUkRURyAqLwotICAgICAgICAgIERPX1JEVEcKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4N0U6ICAvKiBTQU5HVyAqLwotICAgICAgICBjYXNlIDB4N0Y6ICAvKiBBQSAgICAqLwotICAgICAgICAgIC8qIG5vdGhpbmcgLSBvYnNvbGV0ZSAqLwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4MDogIC8qIEZMSVBQVCAqLwotICAgICAgICAgIEluc19GTElQUFQoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDgxOiAgLyogRkxJUFJHT04gKi8KLSAgICAgICAgICBJbnNfRkxJUFJHT04oIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDgyOiAgLyogRkxJUFJHT0ZGICovCi0gICAgICAgICAgSW5zX0ZMSVBSR09GRiggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ODM6ICAvKiBVTktOT1dOICovCi0gICAgICAgIGNhc2UgMHg4NDogIC8qIFVOS05PV04gKi8KLSAgICAgICAgICBJbnNfVU5LTk9XTiggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ODU6ICAvKiBTQ0FOQ1RSTCAqLwotICAgICAgICAgIEluc19TQ0FOQ1RSTCggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ODY6ICAvKiBTRFBWVEwgKi8KLSAgICAgICAgY2FzZSAweDg3OiAgLyogU0RQVlRMICovCi0gICAgICAgICAgSW5zX1NEUFZUTCggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ODg6ICAvKiBHRVRJTkZPICovCi0gICAgICAgICAgSW5zX0dFVElORk8oIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDg5OiAgLyogSURFRiAqLwotICAgICAgICAgIEluc19JREVGKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4QTogIC8qIFJPTEwgKi8KLSAgICAgICAgICBJbnNfUk9MTCggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEI6ICAvKiBNQVggKi8KLSAgICAgICAgICBET19NQVgKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEM6ICAvKiBNSU4gKi8KLSAgICAgICAgICBET19NSU4KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEQ6ICAvKiBTQ0FOVFlQRSAqLwotICAgICAgICAgIEluc19TQ0FOVFlQRSggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEU6ICAvKiBJTlNUQ1RSTCAqLwotICAgICAgICAgIEluc19JTlNUQ1RSTCggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEY6Ci0gICAgICAgICAgSW5zX1VOS05PV04oIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBpZiAoIG9wY29kZSA+PSAweEUwICkKLSAgICAgICAgICAgIEluc19NSVJQKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGVsc2UgaWYgKCBvcGNvZGUgPj0gMHhDMCApCi0gICAgICAgICAgICBJbnNfTURSUCggRVhFQ19BUkdfIGFyZ3MgKTsKLSAgICAgICAgICBlbHNlIGlmICggb3Bjb2RlID49IDB4QjggKQotICAgICAgICAgICAgSW5zX1BVU0hXKCBFWEVDX0FSR18gYXJncyApOwotICAgICAgICAgIGVsc2UgaWYgKCBvcGNvZGUgPj0gMHhCMCApCi0gICAgICAgICAgICBJbnNfUFVTSEIoIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgSW5zX1VOS05PV04oIEVYRUNfQVJHXyBhcmdzICk7Ci0gICAgICAgIH0KLQotICAgICAgfQotCi0jZWxzZQotCi0gICAgICBJbnN0cnVjdF9EaXNwYXRjaFtDVVIub3Bjb2RlXSggRVhFQ19BUkdfICZDVVIuc3RhY2tbQ1VSLmFyZ3NdICk7Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSCAqLwotCi0gICAgICBpZiAoIENVUi5lcnJvciAhPSBUVF9FcnJfT2sgKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKCBDVVIuZXJyb3IgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgVFRfRXJyX0ludmFsaWRfT3Bjb2RlOiAvKiBsb29raW5nIGZvciByZWRlZmluZWQgaW5zdHJ1Y3Rpb25zICovCi0gICAgICAgICAgewotICAgICAgICAgICAgVFRfRGVmUmVjb3JkKiAgZGVmICAgPSBDVVIuSURlZnM7Ci0gICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIENVUi5udW1JRGVmczsKLQotCi0gICAgICAgICAgICBmb3IgKCA7IGRlZiA8IGxpbWl0OyBkZWYrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggZGVmLT5hY3RpdmUgJiYgQ1VSLm9wY29kZSA9PSAoRlRfQnl0ZSlkZWYtPm9wYyApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUVF9DYWxsUmVjKiAgY2FsbHJlYzsKLQotCi0gICAgICAgICAgICAgICAgaWYgKCBDVVIuY2FsbFRvcCA+PSBDVVIuY2FsbFNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX1JlZmVyZW5jZTsKLSAgICAgICAgICAgICAgICAgIGdvdG8gTEVycm9yTGFiZWxfOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhbGxyZWMgPSAmQ1VSLmNhbGxTdGFja1tDVVIuY2FsbFRvcF07Ci0KLSAgICAgICAgICAgICAgICBjYWxscmVjLT5DYWxsZXJfUmFuZ2UgPSBDVVIuY3VyUmFuZ2U7Ci0gICAgICAgICAgICAgICAgY2FsbHJlYy0+Q2FsbGVyX0lQICAgID0gQ1VSLklQICsgMTsKLSAgICAgICAgICAgICAgICBjYWxscmVjLT5DdXJfQ291bnQgICAgPSAxOwotICAgICAgICAgICAgICAgIGNhbGxyZWMtPkN1cl9SZXN0YXJ0ICA9IGRlZi0+c3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIElOU19Hb3RvX0NvZGVSYW5nZSggZGVmLT5yYW5nZSwgZGVmLT5zdGFydCApID09IEZBSUxVUkUgKQotICAgICAgICAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0KLSAgICAgICAgICAgICAgICBnb3RvIExTdWl0ZUxhYmVsXzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIENVUi5lcnJvciA9IFRUX0Vycl9JbnZhbGlkX09wY29kZTsKLSAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKLQotI2lmIDAKLSAgICAgICAgICBicmVhazsgICAvKiBVbnJlYWNoYWJsZSBjb2RlIHdhcm5pbmcgc3VwcHJlc3Npb24uICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgLyogTGVhdmUgdG8gcmVtaW5kIGluIGNhc2UgYSBsYXRlciBjaGFuZ2UgdGhlIGVkaXRvciAqLwotICAgICAgICAgICAgICAgICAgIC8qIHRvIGNvbnNpZGVyIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZgotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0KLSNpZiAwCi0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgQ1VSLnRvcCA9IENVUi5uZXdfdG9wOwotCi0gICAgICBpZiAoIENVUi5zdGVwX2lucyApCi0gICAgICAgIENVUi5JUCArPSBDVVIubGVuZ3RoOwotCi0gICAgICAvKiBpbmNyZW1lbnQgaW5zdHJ1Y3Rpb24gY291bnRlciBhbmQgY2hlY2sgaWYgd2UgZGlkbid0ICovCi0gICAgICAvKiBydW4gdGhpcyBwcm9ncmFtIGZvciB0b28gbG9uZyAoZS5nLiBpbmZpbml0ZSBsb29wcykuICovCi0gICAgICBpZiAoICsraW5zX2NvdW50ZXIgPiBNQVhfUlVOTkFCTEVfT1BDT0RFUyApCi0gICAgICAgIHJldHVybiBUVF9FcnJfRXhlY3V0aW9uX1Rvb19Mb25nOwotCi0gICAgTFN1aXRlTGFiZWxfOgotICAgICAgaWYgKCBDVVIuSVAgPj0gQ1VSLmNvZGVTaXplICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIuY2FsbFRvcCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgQ1VSLmVycm9yID0gVFRfRXJyX0NvZGVfT3ZlcmZsb3c7Ci0gICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGdvdG8gTE5vX0Vycm9yXzsKLSAgICAgIH0KLSAgICB9IHdoaWxlICggIUNVUi5pbnN0cnVjdGlvbl90cmFwICk7Ci0KLSAgTE5vX0Vycm9yXzoKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX1JBU1RFUgotICAgICpleGMgPSBjdXI7Ci0jZW5kaWYKLQotICAgIHJldHVybiBUVF9FcnJfT2s7Ci0KLSAgTEVycm9yQ29kZU92ZXJmbG93XzoKLSAgICBDVVIuZXJyb3IgPSBUVF9FcnJfQ29kZV9PdmVyZmxvdzsKLQotICBMRXJyb3JMYWJlbF86Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NUQVRJQ19SQVNURVIKLSAgICAqZXhjID0gY3VyOwotI2VuZGlmCi0KLSAgICByZXR1cm4gQ1VSLmVycm9yOwotICB9Ci0KLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmggYi9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhODk3Mi4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGludGVycC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVElOVEVSUF9IX18KLSNkZWZpbmUgX19UVElOVEVSUF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRvYmpzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2lmbmRlZiBUVF9DT05GSUdfT1BUSU9OX1NUQVRJQ19JTlRFUlBSRVRFUiAvKiBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiAqLwotCi0jZGVmaW5lIEVYRUNfT1BfICAgVFRfRXhlY0NvbnRleHQgIGV4YywKLSNkZWZpbmUgRVhFQ19PUCAgICBUVF9FeGVjQ29udGV4dCAgZXhjCi0jZGVmaW5lIEVYRUNfQVJHXyAgZXhjLAotI2RlZmluZSBFWEVDX0FSRyAgIGV4YwotCi0jZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLwotCi0jZGVmaW5lIEVYRUNfT1BfICAgLyogdm9pZCAqLwotI2RlZmluZSBFWEVDX09QICAgIC8qIHZvaWQgKi8KLSNkZWZpbmUgRVhFQ19BUkdfICAvKiB2b2lkICovCi0jZGVmaW5lIEVYRUNfQVJHICAgLyogdm9pZCAqLwotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVEFUSUNfSU5URVJQUkVURVIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUm91bmRpbmcgbW9kZSBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9Sb3VuZF9PZmYgICAgICAgICAgICAgNQotI2RlZmluZSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQgICAgMAotI2RlZmluZSBUVF9Sb3VuZF9Ub19HcmlkICAgICAgICAgMQotI2RlZmluZSBUVF9Sb3VuZF9Ub19Eb3VibGVfR3JpZCAgMgotI2RlZmluZSBUVF9Sb3VuZF9VcF9Ub19HcmlkICAgICAgNAotI2RlZmluZSBUVF9Sb3VuZF9Eb3duX1RvX0dyaWQgICAgMwotI2RlZmluZSBUVF9Sb3VuZF9TdXBlciAgICAgICAgICAgNgotI2RlZmluZSBUVF9Sb3VuZF9TdXBlcl80NSAgICAgICAgNwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGdW5jdGlvbiB0eXBlcyB1c2VkIGJ5IHRoZSBpbnRlcnByZXRlciwgZGVwZW5kaW5nIG9uIHZhcmlvdXMgbW9kZXMgICAgKi8KLSAgLyogKGUuZy4gdGhlIHJvdW5kaW5nIG1vZGUsIHdoZXRoZXIgdG8gcmVuZGVyIGEgdmVydGljYWwgb3IgaG9yaXpvbnRhbCAgICovCi0gIC8qIGxpbmUgZXRjKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogUm91bmRpbmcgZnVuY3Rpb24gKi8KLSAgdHlwZWRlZiBGVF9GMjZEb3Q2Ci0gICgqVFRfUm91bmRfRnVuYykoIEVYRUNfT1BfIEZUX0YyNkRvdDYgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gKTsKLQotICAvKiBQb2ludCBkaXNwbGFjZW1lbnQgYWxvbmcgdGhlIGZyZWVkb20gdmVjdG9yIHJvdXRpbmUgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVFRfTW92ZV9GdW5jKSggRVhFQ19PUF8gVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICBkaXN0YW5jZSApOwotCi0gIC8qIERpc3RhbmNlIHByb2plY3Rpb24gYWxvbmcgb25lIG9mIHRoZSBwcm9qZWN0aW9uIHZlY3RvcnMgKi8KLSAgdHlwZWRlZiBGVF9GMjZEb3Q2Ci0gICgqVFRfUHJvamVjdF9GdW5jKSggRVhFQ19PUF8gRlRfUG9zICAgZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgZHkgKTsKLQotICAvKiByZWFkaW5nIGEgY3Z0IHZhbHVlLiAgVGFrZSBjYXJlIG9mIG5vbi1zcXVhcmUgcGl4ZWxzIGlmIG5lY2Vzc2FyeSAqLwotICB0eXBlZGVmIEZUX0YyNkRvdDYKLSAgKCpUVF9HZXRfQ1ZUX0Z1bmMpKCBFWEVDX09QXyBGVF9VTG9uZyAgaWR4ICk7Ci0KLSAgLyogc2V0dGluZyBvciBtb3ZpbmcgYSBjdnQgdmFsdWUuICBUYWtlIGNhcmUgb2Ygbm9uLXNxdWFyZSBwaXhlbHMgICovCi0gIC8qIGlmIG5lY2Vzc2FyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUVF9TZXRfQ1ZUX0Z1bmMpKCBFWEVDX09QXyBGVF9VTG9uZyAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgdmFsdWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGNhbGwgcmVjb3JkLCB1c2VkIHRvIG1hbmFnZSBmdW5jdGlvbiBjYWxscy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ2FsbFJlY18KLSAgewotICAgIEZUX0ludCAgIENhbGxlcl9SYW5nZTsKLSAgICBGVF9Mb25nICBDYWxsZXJfSVA7Ci0gICAgRlRfTG9uZyAgQ3VyX0NvdW50OwotICAgIEZUX0xvbmcgIEN1cl9SZXN0YXJ0OwotCi0gIH0gVFRfQ2FsbFJlYywgKlRUX0NhbGxTdGFjazsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1haW4gc3RydWN0dXJlIGZvciB0aGUgaW50ZXJwcmV0ZXIgd2hpY2ggY29sbGVjdHMgYWxsIG5lY2Vzc2FyeSAgICovCi0gIC8qIHZhcmlhYmxlcyBhbmQgc3RhdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0V4ZWNDb250ZXh0UmVjXwotICB7Ci0gICAgVFRfRmFjZSAgICAgICAgICAgIGZhY2U7Ci0gICAgVFRfU2l6ZSAgICAgICAgICAgIHNpemU7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKLQotICAgIC8qIGluc3RydWN0aW9ucyBzdGF0ZSAqLwotCi0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOyAgICAgIC8qIGxhc3QgZXhlY3V0aW9uIGVycm9yICovCi0KLSAgICBGVF9Mb25nICAgICAgICAgICAgdG9wOyAgICAgICAgLyogdG9wIG9mIGV4ZWMuIHN0YWNrICAgKi8KLQotICAgIEZUX1VJbnQgICAgICAgICAgICBzdGFja1NpemU7ICAvKiBzaXplIG9mIGV4ZWMuIHN0YWNrICAqLwotICAgIEZUX0xvbmcqICAgICAgICAgICBzdGFjazsgICAgICAvKiBjdXJyZW50IGV4ZWMuIHN0YWNrICAqLwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgIGFyZ3M7Ci0gICAgRlRfVUludCAgICAgICAgICAgIG5ld190b3A7ICAgIC8qIG5ldyB0b3AgYWZ0ZXIgZXhlYy4gICovCi0KLSAgICBUVF9HbHlwaFpvbmVSZWMgICAgenAwLCAgICAgICAgLyogem9uZSByZWNvcmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgIHpwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgenAyLAotICAgICAgICAgICAgICAgICAgICAgICBwdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIHR3aWxpZ2h0OwotCi0gICAgRlRfU2l6ZV9NZXRyaWNzICAgIG1ldHJpY3M7Ci0gICAgVFRfU2l6ZV9NZXRyaWNzICAgIHR0X21ldHJpY3M7IC8qIHNpemUgbWV0cmljcyAqLwotCi0gICAgVFRfR3JhcGhpY3NTdGF0ZSAgIEdTOyAgICAgICAgIC8qIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGUgKi8KLQotICAgIEZUX0ludCAgICAgICAgICAgICBjdXJSYW5nZTsgIC8qIGN1cnJlbnQgY29kZSByYW5nZSBudW1iZXIgICAqLwotICAgIEZUX0J5dGUqICAgICAgICAgICBjb2RlOyAgICAgIC8qIGN1cnJlbnQgY29kZSByYW5nZSAgICAgICAgICAqLwotICAgIEZUX0xvbmcgICAgICAgICAgICBJUDsgICAgICAgIC8qIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLwotICAgIEZUX0xvbmcgICAgICAgICAgICBjb2RlU2l6ZTsgIC8qIHNpemUgb2YgY3VycmVudCByYW5nZSAgICAgICAqLwotCi0gICAgRlRfQnl0ZSAgICAgICAgICAgIG9wY29kZTsgICAgLyogY3VycmVudCBvcGNvZGUgICAgICAgICAgICAgICovCi0gICAgRlRfSW50ICAgICAgICAgICAgIGxlbmd0aDsgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgb3Bjb2RlICAgICovCi0KLSAgICBGVF9Cb29sICAgICAgICAgICAgc3RlcF9pbnM7ICAvKiB0cnVlIGlmIHRoZSBpbnRlcnByZXRlciBtdXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jcmVtZW50IElQIGFmdGVyIGlucy4gZXhlYyAqLwotICAgIEZUX0xvbmcgICAgICAgICAgICBjdnRTaXplOwotICAgIEZUX0xvbmcqICAgICAgICAgICBjdnQ7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgZ2x5cGhTaXplOyAvKiBnbHlwaCBpbnN0cnVjdGlvbnMgYnVmZmVyIHNpemUgKi8KLSAgICBGVF9CeXRlKiAgICAgICAgICAgZ2x5cGhJbnM7ICAvKiBnbHlwaCBpbnN0cnVjdGlvbnMgYnVmZmVyICovCi0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtRkRlZnM7ICAvKiBudW1iZXIgb2YgZnVuY3Rpb24gZGVmcyAgICAgICAgICovCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heEZEZWZzOyAgLyogbWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb24gZGVmcyAqLwotICAgIFRUX0RlZkFycmF5ICAgICAgICBGRGVmczsgICAgIC8qIHRhYmxlIG9mIEZEZWZzIGVudHJpZXMgICAgICAgICAgKi8KLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1JRGVmczsgIC8qIG51bWJlciBvZiBpbnN0cnVjdGlvbiBkZWZzICovCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heElEZWZzOyAgLyogbWF4aW11bSBudW1iZXIgb2YgaW5zIGRlZnMgKi8KLSAgICBUVF9EZWZBcnJheSAgICAgICAgSURlZnM7ICAgICAvKiB0YWJsZSBvZiBJRGVmcyBlbnRyaWVzICAgICAqLwotCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heEZ1bmM7ICAgLyogbWF4aW11bSBmdW5jdGlvbiBpbmRleCAgICAgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgbWF4SW5zOyAgICAvKiBtYXhpbXVtIGluc3RydWN0aW9uIGluZGV4ICAqLwotCi0gICAgRlRfSW50ICAgICAgICAgICAgIGNhbGxUb3AsICAgIC8qIHRvcCBvZiBjYWxsIHN0YWNrIGR1cmluZyBleGVjdXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgY2FsbFNpemU7ICAgLyogc2l6ZSBvZiBjYWxsIHN0YWNrICovCi0gICAgVFRfQ2FsbFN0YWNrICAgICAgIGNhbGxTdGFjazsgIC8qIGNhbGwgc3RhY2sgKi8KLQotICAgIEZUX1VTaG9ydCAgICAgICAgICBtYXhQb2ludHM7ICAgIC8qIGNhcGFjaXR5IG9mIHRoaXMgY29udGV4dCdzIGBwdHMnICovCi0gICAgRlRfU2hvcnQgICAgICAgICAgIG1heENvbnRvdXJzOyAgLyogcmVjb3JkLCBleHByZXNzZWQgaW4gcG9pbnRzIGFuZCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250b3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVFRfQ29kZVJhbmdlVGFibGUgIGNvZGVSYW5nZVRhYmxlOyAgLyogdGFibGUgb2YgdmFsaWQgY29kZSByYW5nZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VmdWwgZm9yIHRoZSBkZWJ1Z2dlciAgICovCi0KLSAgICBGVF9VU2hvcnQgICAgICAgICAgc3RvcmVTaXplOyAgLyogc2l6ZSBvZiBjdXJyZW50IHN0b3JhZ2UgKi8KLSAgICBGVF9Mb25nKiAgICAgICAgICAgc3RvcmFnZTsgICAgLyogc3RvcmFnZSBhcmVhICAgICAgICAgICAgKi8KLQotICAgIEZUX0YyNkRvdDYgICAgICAgICBwZXJpb2Q7ICAgICAvKiB2YWx1ZXMgdXNlZCBmb3IgdGhlICovCi0gICAgRlRfRjI2RG90NiAgICAgICAgIHBoYXNlOyAgICAgIC8qIGBTdXBlclJvdW5kaW5nJyAgICAgKi8KLSAgICBGVF9GMjZEb3Q2ICAgICAgICAgdGhyZXNob2xkOwotCi0jaWYgMAotICAgIC8qIHRoaXMgc2VlbXMgdG8gYmUgdW51c2VkICovCi0gICAgRlRfSW50ICAgICAgICAgICAgIGN1cl9wcGVtOyAgIC8qIHBwZW0gYWxvbmcgdGhlIGN1cnJlbnQgcHJvaiB2ZWN0b3IgKi8KLSNlbmRpZgotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIGluc3RydWN0aW9uX3RyYXA7IC8qIElmIGBUcnVlJywgdGhlIGludGVycHJldGVyIHdpbGwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhpdCBhZnRlciBlYWNoIGluc3RydWN0aW9uICAgICAqLwotCi0gICAgVFRfR3JhcGhpY3NTdGF0ZSAgIGRlZmF1bHRfR1M7ICAgICAgIC8qIGdyYXBoaWNzIHN0YXRlIHJlc3VsdGluZyBmcm9tICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHByZXAgcHJvZ3JhbSAgICAgICAgICAgICAgICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBpc19jb21wb3NpdGU7ICAgICAvKiB0cnVlIGlmIHRoZSBnbHlwaCBpcyBjb21wb3NpdGUgICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHBlZGFudGljX2hpbnRpbmc7IC8qIHRydWUgaWYgcGVkYW50aWMgaW50ZXJwcmV0YXRpb24gKi8KLQotICAgIC8qIGxhdGVzdCBpbnRlcnByZXRlciBhZGRpdGlvbnMgKi8KLQotICAgIEZUX0xvbmcgICAgICAgICAgICBGX2RvdF9QOyAgICAvKiBkb3QgcHJvZHVjdCBvZiBmcmVlZG9tIGFuZCBwcm9qZWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBUVF9Sb3VuZF9GdW5jICAgICAgZnVuY19yb3VuZDsgLyogY3VycmVudCByb3VuZGluZyBmdW5jdGlvbiAgICAgICAgICAgICAqLwotCi0gICAgVFRfUHJvamVjdF9GdW5jICAgIGZ1bmNfcHJvamVjdCwgICAvKiBjdXJyZW50IHByb2plY3Rpb24gZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgZnVuY19kdWFscHJvaiwgIC8qIGN1cnJlbnQgZHVhbCBwcm9qLiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICBmdW5jX2ZyZWVQcm9qOyAgLyogY3VycmVudCBmcmVlZG9tIHByb2ouIGZ1bmMgICovCi0KLSAgICBUVF9Nb3ZlX0Z1bmMgICAgICAgZnVuY19tb3ZlOyAgICAgIC8qIGN1cnJlbnQgcG9pbnQgbW92ZSBmdW5jdGlvbiAqLwotICAgIFRUX01vdmVfRnVuYyAgICAgICBmdW5jX21vdmVfb3JpZzsgLyogbW92ZSBvcmlnaW5hbCBwb3NpdGlvbiBmdW5jdGlvbiAqLwotCi0gICAgVFRfR2V0X0NWVF9GdW5jICAgIGZ1bmNfcmVhZF9jdnQ7ICAvKiByZWFkIGEgY3Z0IGVudHJ5ICAgICAgICAgICAgICAqLwotICAgIFRUX1NldF9DVlRfRnVuYyAgICBmdW5jX3dyaXRlX2N2dDsgLyogd3JpdGUgYSBjdnQgZW50cnkgKGluIHBpeGVscykgKi8KLSAgICBUVF9TZXRfQ1ZUX0Z1bmMgICAgZnVuY19tb3ZlX2N2dDsgIC8qIGluY3IgYSBjdnQgZW50cnkgKGluIHBpeGVscykgICovCi0KLSAgICBGVF9Cb29sICAgICAgICAgICAgZ3JheXNjYWxlOyAgICAgIC8qIGFyZSB3ZSBoaW50aW5nIGZvciBncmF5c2NhbGU/ICovCi0KLSAgfSBUVF9FeGVjQ29udGV4dFJlYzsKLQotCi0gIGV4dGVybiBjb25zdCBUVF9HcmFwaGljc1N0YXRlICB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVFRfR290b19Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIElQICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVFRfU2V0X0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBsZW5ndGggKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUVF9DbGVhcl9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICByYW5nZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTmV3X0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUXVlcmllcyB0aGUgZmFjZSBjb250ZXh0IGZvciBhIGdpdmVuIGZvbnQuICBOb3RlIHRoYXQgdGhlcmUgaXMgICAgICovCi0gIC8qICAgIG5vdyBhIF9zaW5nbGVfIGV4ZWN1dGlvbiBjb250ZXh0IGluIHRoZSBUcnVlVHlwZSBkcml2ZXIgd2hpY2ggaXMgICAqLwotICAvKiAgICBzaGFyZWQgYW1vbmcgZmFjZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byB0aGUgZXhlY3V0aW9uIGNvbnRleHQuICBJbml0aWFsaXplZCBmb3IgYGZhY2UnLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggVFRfRXhlY0NvbnRleHQgKQotICBUVF9OZXdfQ29udGV4dCggVFRfRHJpdmVyICBkcml2ZXIgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUVF9Eb25lX0NvbnRleHQoIFRUX0V4ZWNDb250ZXh0ICBleGVjICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVFRfTG9hZF9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBUVF9TaXplICAgICAgICAgc2l6ZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1NhdmVfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIGlucyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1J1bl9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZWJ1ZyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUnVuSW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXhlY3V0ZXMgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LiAgVGhpcyAgICovCi0gIC8qICAgIGlzIHRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSBUcnVlVHlwZSBvcGNvZGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIG9iamVjdCBtYW5hZ2VyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBwdWJsaWNseSBleHBvcnRlZCBiZWNhdXNlIGl0IGlzIGRpcmVjdGx5ICAgICAgICAgICovCi0gIC8qICAgIGludm9rZWQgYnkgdGhlIFRydWVUeXBlIGRlYnVnZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIFRUX1J1bklucyggVFRfRXhlY0NvbnRleHQgIGV4ZWMgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUSU5URVJQX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0b2Jqcy5jIGIvc3JjL3RydWV0eXBlL3R0b2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDE1NTlmLi4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dG9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDk0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0KLSNpbmNsdWRlICJ0dGdsb2FkLmgiCi0jaW5jbHVkZSAidHRwbG9hZC5oIgotCi0jaW5jbHVkZSAidHRlcnJvcnMuaCIKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotI2luY2x1ZGUgInR0aW50ZXJwLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9VTlBBVEVOVEVEX0gKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgInR0Z3h2YXIuaCIKLSNlbmRpZgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0b2JqcwotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBHTFlQSCBaT05FIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nbHlwaHpvbmVfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZWFsbG9jYXRlIGEgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB6b25lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGdseXBoIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2dseXBoem9uZV9kb25lKCBUVF9HbHlwaFpvbmUgIHpvbmUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSB6b25lLT5tZW1vcnk7Ci0KLQotICAgIGlmICggbWVtb3J5ICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCB6b25lLT5jb250b3VycyApOwotICAgICAgRlRfRlJFRSggem9uZS0+dGFncyApOwotICAgICAgRlRfRlJFRSggem9uZS0+Y3VyICk7Ci0gICAgICBGVF9GUkVFKCB6b25lLT5vcmcgKTsKLSAgICAgIEZUX0ZSRUUoIHpvbmUtPm9ydXMgKTsKLQotICAgICAgem9uZS0+bWF4X3BvaW50cyAgID0gem9uZS0+bl9wb2ludHMgICA9IDA7Ci0gICAgICB6b25lLT5tYXhfY29udG91cnMgPSB6b25lLT5uX2NvbnRvdXJzID0gMDsKLSAgICAgIHpvbmUtPm1lbW9yeSAgICAgICA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nbHlwaHpvbmVfbmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbGxvY2F0ZSBhIG5ldyBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBvaW50cyAgIDo6IFRoZSBjYXBhY2l0eSBvZiBnbHlwaCB6b25lIGluIHBvaW50cy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29udG91cnMgOjogVGhlIGNhcGFjaXR5IG9mIGdseXBoIHpvbmUgaW4gY29udG91cnMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgem9uZSAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZ2x5cGggem9uZSByZWNvcmQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZ2x5cGh6b25lX25ldyggRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgbWF4UG9pbnRzLAotICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCAgICAgIG1heENvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaFpvbmUgIHpvbmUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBGVF9NRU1fWkVSTyggem9uZSwgc2l6ZW9mICggKnpvbmUgKSApOwotICAgIHpvbmUtPm1lbW9yeSA9IG1lbW9yeTsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCB6b25lLT5vcmcsICAgICAgbWF4UG9pbnRzICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCB6b25lLT5jdXIsICAgICAgbWF4UG9pbnRzICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCB6b25lLT5vcnVzLCAgICAgbWF4UG9pbnRzICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCB6b25lLT50YWdzLCAgICAgbWF4UG9pbnRzICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCB6b25lLT5jb250b3VycywgbWF4Q29udG91cnMgKSApCi0gICAgewotICAgICAgdHRfZ2x5cGh6b25lX2RvbmUoIHpvbmUgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHpvbmUtPm1heF9wb2ludHMgICA9IG1heFBvaW50czsKLSAgICAgIHpvbmUtPm1heF9jb250b3VycyA9IG1heENvbnRvdXJzOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIGdpdmVuIFRydWVUeXBlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgc291cmNlIGZvbnQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZm9udCBmYWNlIGluIHRoZSByZXNvdXJjZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogTnVtYmVyIG9mIGFkZGl0aW9uYWwgZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgSWdub3JlZC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICAgICA6OiBBZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgbmV3bHkgYnVpbHQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgdHRmYWNlLCAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfTGlicmFyeSAgICBsaWJyYXJ5OwotICAgIFNGTlRfU2VydmljZSAgc2ZudDsKLSAgICBUVF9GYWNlICAgICAgIGZhY2UgPSAoVFRfRmFjZSl0dGZhY2U7Ci0KLQotICAgIGxpYnJhcnkgPSBmYWNlLT5yb290LmRyaXZlci0+cm9vdC5saWJyYXJ5OwotICAgIHNmbnQgICAgPSAoU0ZOVF9TZXJ2aWNlKUZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKCBsaWJyYXJ5LCAic2ZudCIgKTsKLSAgICBpZiAoICFzZm50ICkKLSAgICAgIGdvdG8gQmFkX0Zvcm1hdDsKLQotICAgIC8qIGNyZWF0ZSBpbnB1dCBzdHJlYW0gZnJvbSByZXNvdXJjZSAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYSB2YWxpZCBUcnVlVHlwZSBmaWxlICovCi0gICAgZXJyb3IgPSBzZm50LT5pbml0X2ZhY2UoIHN0cmVhbSwgZmFjZSwgZmFjZV9pbmRleCwgbnVtX3BhcmFtcywgcGFyYW1zICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBXZSBtdXN0IGFsc28gYmUgYWJsZSB0byBhY2NlcHQgTWFjL0dYIGZvbnRzLCBhcyB3ZWxsIGFzIE9UIG9uZXMuICovCi0gICAgLyogVGhlIDB4MDAwMjAwMDAgdGFnIGlzIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkOyBzb21lIGZvbnRzIGZyb20gICAqLwotICAgIC8qIEFycGhpYyBtYWRlIGZvciBDaGluZXNlIFdpbmRvd3MgMy4xIGhhdmUgdGhpcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPmZvcm1hdF90YWcgIT0gMHgwMDAxMDAwMEwgJiYgICAgLyogTVMgZm9udHMgICovCi0gICAgICAgICBmYWNlLT5mb3JtYXRfdGFnICE9IDB4MDAwMjAwMDBMICYmICAgIC8qIENKSyBmb250cyBmb3IgV2luIDMuMSAqLwotICAgICAgICAgZmFjZS0+Zm9ybWF0X3RhZyAhPSBUVEFHX3RydWUgICApICAgICAvKiBNYWMgZm9udHMgKi8KLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiW25vdCBhIHZhbGlkIFRURiBmb250XVxuIiApKTsKLSAgICAgIGdvdG8gQmFkX0Zvcm1hdDsKLSAgICB9Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICBmYWNlLT5yb290LmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0hJTlRFUjsKLSNlbmRpZgotCi0gICAgLyogSWYgd2UgYXJlIHBlcmZvcm1pbmcgYSBzaW1wbGUgZm9udCBmb3JtYXQgY2hlY2ssIGV4aXQgaW1tZWRpYXRlbHkuICovCi0gICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICByZXR1cm4gVFRfRXJyX09rOwotCi0gICAgLyogTG9hZCBmb250IGRpcmVjdG9yeSAqLwotICAgIGVycm9yID0gc2ZudC0+bG9hZF9mYWNlKCBzdHJlYW0sIGZhY2UsIGZhY2VfaW5kZXgsIG51bV9wYXJhbXMsIHBhcmFtcyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfaGRteCggZmFjZSwgc3RyZWFtICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGZhY2UtPnJvb3QuZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSApCi0gICAgewotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgICBpZiAoICFmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9sb2NhKCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfY3Z0KCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfZnBnbSggZmFjZSwgc3RyZWFtICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGVycm9yID0gdHRfZmFjZV9sb2FkX3ByZXAoIGZhY2UsIHN0cmVhbSApOwotCi0jZWxzZQotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGVycm9yID0gdHRfZmFjZV9sb2FkX2xvY2EoIGZhY2UsIHN0cmVhbSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9jdnQoIGZhY2UsIHN0cmVhbSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9mcGdtKCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfcHJlcCggZmFjZSwgc3RyZWFtICk7Ci0KLSNlbmRpZgotCi0gICAgfQotCi0jaWYgZGVmaW5lZCggVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcgICAgKSAmJiBcCi0gICAgIWRlZmluZWQoIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgKQotCi0gICAgewotICAgICAgRlRfQm9vbCAgdW5wYXRlbnRlZF9oaW50aW5nOwotICAgICAgaW50ICAgICAgaTsKLQotCi0gICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciB1bnBhdGVudGVkIGhpbnRpbmcgaXMgdG8gYmUgdXNlZCBmb3IgdGhpcyBmYWNlLiAqLwotICAgICAgdW5wYXRlbnRlZF9oaW50aW5nID0gRlRfQk9PTAotICAgICAgICAoIGxpYnJhcnktPmRlYnVnX2hvb2tzW0ZUX0RFQlVHX0hPT0tfVU5QQVRFTlRFRF9ISU5USU5HXSAhPSBOVUxMICk7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3BhcmFtcyAmJiAhZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nOyBpKysgKQotICAgICAgICBpZiAoIHBhcmFtc1tpXS50YWcgPT0gRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyApCi0gICAgICAgICAgdW5wYXRlbnRlZF9oaW50aW5nID0gVFJVRTsKLQotICAgICAgLyogQ29tcGFyZSB0aGUgZmFjZSB3aXRoIGEgbGlzdCBvZiB3ZWxsLWtub3duIGB0cmlja3knIGZvbnRzLiAqLwotICAgICAgLyogVGhpcyBsaXN0IHNoYWxsIGJlIGV4cGFuZGVkIGFzIHdlIGZpbmQgbW9yZSBvZiB0aGVtLiAgICAgICAqLwotICAgICAgaWYgKCAhdW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0ICB0cmlja19uYW1lc1tdID0KLSAgICAgICAgewotICAgICAgICAgICJERkthaVNoby1TQiIsICAgICAvKiBkZmthaXNiLnR0ZiAqLwotICAgICAgICAgICJERkthaS1TQiIsICAgICAgICAvKiBrYWl1LnR0ZiAqLwotICAgICAgICAgICJIdWFUaWFuU29uZ1RpPyIsICAvKiBodHN0My50dGYgKi8KLSAgICAgICAgICAiTWluZ0xpVSIsICAgICAgICAgLyogbWluZ2xpdS50dGYgJiBtaW5nbGl1LnR0YyAqLwotICAgICAgICAgICJQTWluZ0xpVSIsICAgICAgICAvKiBtaW5nbGl1LnR0YyAqLwotICAgICAgICAgICJNaW5nTGk0MyIsICAgICAgICAvKiBtaW5nbGkudHRmICovCi0gICAgICAgICAgTlVMTAotICAgICAgICB9OwotICAgICAgICBpbnQgIG5uOwotCi0KLSAgICAgICAgLyogTm90ZSB0aGF0IHdlIG9ubHkgY2hlY2sgdGhlIGZhY2UgbmFtZSBhdCB0aGUgbW9tZW50OyBpdCBtaWdodCAqLwotICAgICAgICAvKiBiZSB3b3J0aCB0byBkbyBtb3JlIGNoZWNrcyBmb3IgYSBmZXcgc3BlY2lhbCBjYXNlcy4gICAgICAgICAgICovCi0gICAgICAgIGZvciAoIG5uID0gMDsgdHJpY2tfbmFtZXNbbm5dICE9IE5VTEw7IG5uKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCB0dGZhY2UtPmZhbWlseV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBmdF9zdHJzdHIoIHR0ZmFjZS0+ZmFtaWx5X25hbWUsIHRyaWNrX25hbWVzW25uXSApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1bnBhdGVudGVkX2hpbnRpbmcgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHR0ZmFjZS0+aW50ZXJuYWwtPmlnbm9yZV91bnBhdGVudGVkX2hpbnRlciA9Ci0gICAgICAgIEZUX0JPT0woICF1bnBhdGVudGVkX2hpbnRpbmcgKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyAmJgotICAgICAgICAgICFUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICAvKiBpbml0aWFsaXplIHN0YW5kYXJkIGdseXBoIGxvYWRpbmcgcm91dGluZXMgKi8KLSAgICBUVF9Jbml0X0dseXBoX0xvYWRpbmcoIGZhY2UgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBCYWRfRm9ybWF0OgotICAgIGVycm9yID0gVFRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQ7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZSBhIGdpdmVuIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgcG9pbnRlciB0byB0aGUgZmFjZSBvYmplY3QgdG8gZGVzdHJveS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZG9uZSggRlRfRmFjZSAgdHRmYWNlICkgICAgICAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgewotICAgIFRUX0ZhY2UgICAgICAgZmFjZSAgID0gKFRUX0ZhY2UpdHRmYWNlOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfU3RyZWFtICAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLQotICAgIFNGTlRfU2VydmljZSAgc2ZudCAgID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotCi0KLSAgICAvKiBmb3IgYGV4dGVuZGVkIFRydWVUeXBlIGZvcm1hdHMnIChpLmUuIGNvbXByZXNzZWQgdmVyc2lvbnMpICovCi0gICAgaWYgKCBmYWNlLT5leHRyYS5maW5hbGl6ZXIgKQotICAgICAgZmFjZS0+ZXh0cmEuZmluYWxpemVyKCBmYWNlLT5leHRyYS5kYXRhICk7Ci0KLSAgICBpZiAoIHNmbnQgKQotICAgICAgc2ZudC0+ZG9uZV9mYWNlKCBmYWNlICk7Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSBsb2NhdGlvbnMgdGFibGUgKi8KLSAgICB0dF9mYWNlX2RvbmVfbG9jYSggZmFjZSApOwotCi0gICAgdHRfZmFjZV9mcmVlX2hkbXgoIGZhY2UgKTsKLQotICAgIC8qIGZyZWVpbmcgdGhlIENWVCAqLwotICAgIEZUX0ZSRUUoIGZhY2UtPmN2dCApOwotICAgIGZhY2UtPmN2dF9zaXplID0gMDsKLQotICAgIC8qIGZyZWVpbmcgdGhlIHByb2dyYW1zICovCi0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+Zm9udF9wcm9ncmFtICk7Ci0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+Y3Z0X3Byb2dyYW0gKTsKLSAgICBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSA9IDA7Ci0gICAgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSAgPSAwOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgIHR0X2RvbmVfYmxlbmQoIG1lbW9yeSwgZmFjZS0+YmxlbmQgKTsKLSAgICBmYWNlLT5ibGVuZCA9IE5VTEw7Ci0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUgIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9ydW5fZnBnbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUnVuIHRoZSBmb250IHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9ydW5fZnBnbSggVFRfU2l6ZSAgc2l6ZSApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgZmFjZSA9IChUVF9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBUVF9FeGVjQ29udGV4dCAgZXhlYzsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIC8qIGRlYnVnZ2luZyBpbnN0YW5jZXMgaGF2ZSB0aGVpciBvd24gY29udGV4dCAqLwotICAgIGlmICggc2l6ZS0+ZGVidWcgKQotICAgICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7Ci0gICAgZWxzZQotICAgICAgZXhlYyA9ICggKFRUX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZmFjZSApICktPmNvbnRleHQ7Ci0KLSAgICBpZiAoICFleGVjICkKLSAgICAgIHJldHVybiBUVF9FcnJfQ291bGRfTm90X0ZpbmRfQ29udGV4dDsKLQotICAgIFRUX0xvYWRfQ29udGV4dCggZXhlYywgZmFjZSwgc2l6ZSApOwotCi0gICAgZXhlYy0+Y2FsbFRvcCAgID0gMDsKLSAgICBleGVjLT50b3AgICAgICAgPSAwOwotCi0gICAgZXhlYy0+cGVyaW9kICAgID0gNjQ7Ci0gICAgZXhlYy0+cGhhc2UgICAgID0gMDsKLSAgICBleGVjLT50aHJlc2hvbGQgPSAwOwotCi0gICAgZXhlYy0+aW5zdHJ1Y3Rpb25fdHJhcCA9IEZBTFNFOwotICAgIGV4ZWMtPkZfZG90X1AgPSAweDEwMDAwTDsKLQotICAgIHsKLSAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgICAgPSAmZXhlYy0+bWV0cmljczsKLSAgICAgIFRUX1NpemVfTWV0cmljcyogIHR0X21ldHJpY3MgPSAmZXhlYy0+dHRfbWV0cmljczsKLQotCi0gICAgICBtZXRyaWNzLT54X3BwZW0gICA9IDA7Ci0gICAgICBtZXRyaWNzLT55X3BwZW0gICA9IDA7Ci0gICAgICBtZXRyaWNzLT54X3NjYWxlICA9IDA7Ci0gICAgICBtZXRyaWNzLT55X3NjYWxlICA9IDA7Ci0KLSAgICAgIHR0X21ldHJpY3MtPnBwZW0gID0gMDsKLSAgICAgIHR0X21ldHJpY3MtPnNjYWxlID0gMDsKLSAgICAgIHR0X21ldHJpY3MtPnJhdGlvID0gMHgxMDAwMEw7Ci0gICAgfQotCi0gICAgLyogYWxsb3cgZm9udCBwcm9ncmFtIGV4ZWN1dGlvbiAqLwotICAgIFRUX1NldF9Db2RlUmFuZ2UoIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgdHRfY29kZXJhbmdlX2ZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmZvbnRfcHJvZ3JhbV9zaXplICk7Ci0KLSAgICAvKiBkaXNhYmxlIENWVCBhbmQgZ2x5cGggcHJvZ3JhbXMgY29kZXJhbmdlICovCi0gICAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfY3Z0ICk7Ci0gICAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfZ2x5cGggKTsKLQotICAgIGlmICggZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPiAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IFRUX0dvdG9fQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfZm9udCwgMCApOwotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGVycm9yID0gZmFjZS0+aW50ZXJwcmV0ZXIoIGV4ZWMgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBUVF9FcnJfT2s7Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgICBUVF9TYXZlX0NvbnRleHQoIGV4ZWMsIHNpemUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9ydW5fcHJlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUnVuIHRoZSBjb250cm9sIHZhbHVlIHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9ydW5fcHJlcCggVFRfU2l6ZSAgc2l6ZSApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgZmFjZSA9IChUVF9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBUVF9FeGVjQ29udGV4dCAgZXhlYzsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIC8qIGRlYnVnZ2luZyBpbnN0YW5jZXMgaGF2ZSB0aGVpciBvd24gY29udGV4dCAqLwotICAgIGlmICggc2l6ZS0+ZGVidWcgKQotICAgICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7Ci0gICAgZWxzZQotICAgICAgZXhlYyA9ICggKFRUX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZmFjZSApICktPmNvbnRleHQ7Ci0KLSAgICBpZiAoICFleGVjICkKLSAgICAgIHJldHVybiBUVF9FcnJfQ291bGRfTm90X0ZpbmRfQ29udGV4dDsKLQotICAgIFRUX0xvYWRfQ29udGV4dCggZXhlYywgZmFjZSwgc2l6ZSApOwotCi0gICAgZXhlYy0+Y2FsbFRvcCA9IDA7Ci0gICAgZXhlYy0+dG9wICAgICA9IDA7Ci0KLSAgICBleGVjLT5pbnN0cnVjdGlvbl90cmFwID0gRkFMU0U7Ci0KLSAgICBUVF9TZXRfQ29kZVJhbmdlKCBleGVjLAotICAgICAgICAgICAgICAgICAgICAgIHR0X2NvZGVyYW5nZV9jdnQsCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Y3Z0X3Byb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSApOwotCi0gICAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfZ2x5cGggKTsKLQotICAgIGlmICggZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSA+IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gVFRfR290b19Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9jdnQsIDAgKTsKLQotICAgICAgaWYgKCAhZXJyb3IgJiYgIXNpemUtPmRlYnVnICkKLSAgICAgICAgZXJyb3IgPSBmYWNlLT5pbnRlcnByZXRlciggZXhlYyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBlcnJvciA9IFRUX0Vycl9PazsKLQotICAgIC8qIHNhdmUgYXMgZGVmYXVsdCBncmFwaGljcyBzdGF0ZSAqLwotICAgIHNpemUtPkdTID0gZXhlYy0+R1M7Ci0KLSAgICBUVF9TYXZlX0NvbnRleHQoIGV4ZWMsIHNpemUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gIHN0YXRpYyB2b2lkCi0gIHR0X3NpemVfZG9uZV9ieXRlY29kZSggRlRfU2l6ZSAgZnRzaXplICkKLSAgewotICAgIFRUX1NpemUgICAgc2l6ZSAgID0gKFRUX1NpemUpZnRzaXplOwotICAgIFRUX0ZhY2UgICAgZmFjZSAgID0gKFRUX0ZhY2UpZnRzaXplLT5mYWNlOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLQotICAgIGlmICggc2l6ZS0+ZGVidWcgKQotICAgIHsKLSAgICAgIC8qIHRoZSBkZWJ1ZyBjb250ZXh0IG11c3QgYmUgZGVsZXRlZCBieSB0aGUgZGVidWdnZXIgaXRzZWxmICovCi0gICAgICBzaXplLT5jb250ZXh0ID0gTlVMTDsKLSAgICAgIHNpemUtPmRlYnVnICAgPSBGQUxTRTsKLSAgICB9Ci0KLSAgICBGVF9GUkVFKCBzaXplLT5jdnQgKTsKLSAgICBzaXplLT5jdnRfc2l6ZSA9IDA7Ci0KLSAgICAvKiBmcmVlIHN0b3JhZ2UgYXJlYSAqLwotICAgIEZUX0ZSRUUoIHNpemUtPnN0b3JhZ2UgKTsKLSAgICBzaXplLT5zdG9yYWdlX3NpemUgPSAwOwotCi0gICAgLyogdHdpbGlnaHQgem9uZSAqLwotICAgIHR0X2dseXBoem9uZV9kb25lKCAmc2l6ZS0+dHdpbGlnaHQgKTsKLQotICAgIEZUX0ZSRUUoIHNpemUtPmZ1bmN0aW9uX2RlZnMgKTsKLSAgICBGVF9GUkVFKCBzaXplLT5pbnN0cnVjdGlvbl9kZWZzICk7Ci0KLSAgICBzaXplLT5udW1fZnVuY3Rpb25fZGVmcyAgICA9IDA7Ci0gICAgc2l6ZS0+bWF4X2Z1bmN0aW9uX2RlZnMgICAgPSAwOwotICAgIHNpemUtPm51bV9pbnN0cnVjdGlvbl9kZWZzID0gMDsKLSAgICBzaXplLT5tYXhfaW5zdHJ1Y3Rpb25fZGVmcyA9IDA7Ci0KLSAgICBzaXplLT5tYXhfZnVuYyA9IDA7Ci0gICAgc2l6ZS0+bWF4X2lucyAgPSAwOwotCi0gICAgc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgPSAwOwotICAgIHNpemUtPmN2dF9yZWFkeSAgICAgID0gMDsKLSAgfQotCi0KLSAgLyogSW5pdGlhbGl6ZSBieXRlY29kZS1yZWxhdGVkIGZpZWxkcyBpbiB0aGUgc2l6ZSBvYmplY3QuICAgICAgICovCi0gIC8qIFdlIGRvIHRoaXMgb25seSBpZiBieXRlY29kZSBpbnRlcnByZXRhdGlvbiBpcyByZWFsbHkgbmVlZGVkLiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2l6ZV9pbml0X2J5dGVjb2RlKCBGVF9TaXplICBmdHNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBUVF9TaXplICAgIHNpemUgPSAoVFRfU2l6ZSlmdHNpemU7Ci0gICAgVFRfRmFjZSAgICBmYWNlID0gKFRUX0ZhY2UpZnRzaXplLT5mYWNlOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfSW50ICAgICBpOwotCi0gICAgRlRfVVNob3J0ICAgICAgIG5fdHdpbGlnaHQ7Ci0gICAgVFRfTWF4UHJvZmlsZSogIG1heHAgPSAmZmFjZS0+bWF4X3Byb2ZpbGU7Ci0KLQotICAgIHNpemUtPmJ5dGVjb2RlX3JlYWR5ID0gMTsKLSAgICBzaXplLT5jdnRfcmVhZHkgICAgICA9IDA7Ci0KLSAgICBzaXplLT5tYXhfZnVuY3Rpb25fZGVmcyAgICA9IG1heHAtPm1heEZ1bmN0aW9uRGVmczsKLSAgICBzaXplLT5tYXhfaW5zdHJ1Y3Rpb25fZGVmcyA9IG1heHAtPm1heEluc3RydWN0aW9uRGVmczsKLQotICAgIHNpemUtPm51bV9mdW5jdGlvbl9kZWZzICAgID0gMDsKLSAgICBzaXplLT5udW1faW5zdHJ1Y3Rpb25fZGVmcyA9IDA7Ci0KLSAgICBzaXplLT5tYXhfZnVuYyA9IDA7Ci0gICAgc2l6ZS0+bWF4X2lucyAgPSAwOwotCi0gICAgc2l6ZS0+Y3Z0X3NpemUgICAgID0gZmFjZS0+Y3Z0X3NpemU7Ci0gICAgc2l6ZS0+c3RvcmFnZV9zaXplID0gbWF4cC0+bWF4U3RvcmFnZTsKLQotICAgIC8qIFNldCBkZWZhdWx0IG1ldHJpY3MgKi8KLSAgICB7Ci0gICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzICA9ICZzaXplLT5tZXRyaWNzOwotICAgICAgVFRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljczIgPSAmc2l6ZS0+dHRtZXRyaWNzOwotCi0gICAgICBtZXRyaWNzLT54X3BwZW0gPSAwOwotICAgICAgbWV0cmljcy0+eV9wcGVtID0gMDsKLQotICAgICAgbWV0cmljczItPnJvdGF0ZWQgICA9IEZBTFNFOwotICAgICAgbWV0cmljczItPnN0cmV0Y2hlZCA9IEZBTFNFOwotCi0gICAgICAvKiBzZXQgZGVmYXVsdCBjb21wZW5zYXRpb24gKGFsbCAwKSAqLwotICAgICAgZm9yICggaSA9IDA7IGkgPCA0OyBpKysgKQotICAgICAgICBtZXRyaWNzMi0+Y29tcGVuc2F0aW9uc1tpXSA9IDA7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgZnVuY3Rpb24gZGVmcywgaW5zdHJ1Y3Rpb24gZGVmcywgY3Z0LCBhbmQgc3RvcmFnZSBhcmVhICovCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHNpemUtPmZ1bmN0aW9uX2RlZnMsICAgIHNpemUtPm1heF9mdW5jdGlvbl9kZWZzICAgICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggc2l6ZS0+aW5zdHJ1Y3Rpb25fZGVmcywgc2l6ZS0+bWF4X2luc3RydWN0aW9uX2RlZnMgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBzaXplLT5jdnQsICAgICAgICAgICAgICBzaXplLT5jdnRfc2l6ZSAgICAgICAgICAgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHNpemUtPnN0b3JhZ2UsICAgICAgICAgIHNpemUtPnN0b3JhZ2Vfc2l6ZSAgICAgICAgICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcmVzZXJ2ZSB0d2lsaWdodCB6b25lICovCi0gICAgbl90d2lsaWdodCA9IG1heHAtPm1heFR3aWxpZ2h0UG9pbnRzOwotCi0gICAgLyogdGhlcmUgYXJlIDQgcGhhbnRvbSBwb2ludHMgKGRvIHdlIG5lZWQgdGhpcz8pICovCi0gICAgbl90d2lsaWdodCArPSA0OwotCi0gICAgZXJyb3IgPSB0dF9nbHlwaHpvbmVfbmV3KCBtZW1vcnksIG5fdHdpbGlnaHQsIDAsICZzaXplLT50d2lsaWdodCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2l6ZS0+dHdpbGlnaHQubl9wb2ludHMgPSBuX3R3aWxpZ2h0OwotCi0gICAgc2l6ZS0+R1MgPSB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlOwotCi0gICAgLyogc2V0IGBmYWNlLT5pbnRlcnByZXRlcicgYWNjb3JkaW5nIHRvIHRoZSBkZWJ1ZyBob29rIHByZXNlbnQgKi8KLSAgICB7Ci0gICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gZmFjZS0+cm9vdC5kcml2ZXItPnJvb3QubGlicmFyeTsKLQotCi0gICAgICBmYWNlLT5pbnRlcnByZXRlciA9IChUVF9JbnRlcnByZXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LT5kZWJ1Z19ob29rc1tGVF9ERUJVR19IT09LX1RSVUVUWVBFXTsKLSAgICAgIGlmICggIWZhY2UtPmludGVycHJldGVyICkKLSAgICAgICAgZmFjZS0+aW50ZXJwcmV0ZXIgPSAoVFRfSW50ZXJwcmV0ZXIpVFRfUnVuSW5zOwotICAgIH0KLQotICAgIC8qIEZpbmUsIG5vdyBydW4gdGhlIGZvbnQgcHJvZ3JhbSEgKi8KLSAgICBlcnJvciA9IHR0X3NpemVfcnVuX2ZwZ20oIHNpemUgKTsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgICAgdHRfc2l6ZV9kb25lX2J5dGVjb2RlKCBmdHNpemUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUoIFRUX1NpemUgIHNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gVFRfRXJyX09rOwotCi0KLSAgICBpZiAoICFzaXplLT5ieXRlY29kZV9yZWFkeSApCi0gICAgewotICAgICAgZXJyb3IgPSB0dF9zaXplX2luaXRfYnl0ZWNvZGUoIChGVF9TaXplKXNpemUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogcmVzY2FsZSBDVlQgd2hlbiBuZWVkZWQgKi8KLSAgICBpZiAoICFzaXplLT5jdnRfcmVhZHkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGk7Ci0gICAgICBUVF9GYWNlICBmYWNlID0gKFRUX0ZhY2UpIHNpemUtPnJvb3QuZmFjZTsKLQotCi0gICAgICAvKiBTY2FsZSB0aGUgY3Z0IHZhbHVlcyB0byB0aGUgbmV3IHBwZW0uICAgICAgICAgICovCi0gICAgICAvKiBXZSB1c2UgYnkgZGVmYXVsdCB0aGUgeSBwcGVtIHRvIHNjYWxlIHRoZSBDVlQuICovCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IHNpemUtPmN2dF9zaXplOyBpKysgKQotICAgICAgICBzaXplLT5jdnRbaV0gPSBGVF9NdWxGaXgoIGZhY2UtPmN2dFtpXSwgc2l6ZS0+dHRtZXRyaWNzLnNjYWxlICk7Ci0KLSAgICAgIC8qIGFsbCB0d2lsaWdodCBwb2ludHMgYXJlIG9yaWdpbmFsbHkgemVybyAqLwotICAgICAgZm9yICggaSA9IDA7IGkgPCAoRlRfVUludClzaXplLT50d2lsaWdodC5uX3BvaW50czsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgc2l6ZS0+dHdpbGlnaHQub3JnW2ldLnggPSAwOwotICAgICAgICBzaXplLT50d2lsaWdodC5vcmdbaV0ueSA9IDA7Ci0gICAgICAgIHNpemUtPnR3aWxpZ2h0LmN1cltpXS54ID0gMDsKLSAgICAgICAgc2l6ZS0+dHdpbGlnaHQuY3VyW2ldLnkgPSAwOwotICAgICAgfQotCi0gICAgICAvKiBjbGVhciBzdG9yYWdlIGFyZWEgKi8KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgKEZUX1VJbnQpc2l6ZS0+c3RvcmFnZV9zaXplOyBpKysgKQotICAgICAgICBzaXplLT5zdG9yYWdlW2ldID0gMDsKLQotICAgICAgc2l6ZS0+R1MgPSB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlOwotCi0gICAgICBlcnJvciA9IHR0X3NpemVfcnVuX3ByZXAoIHNpemUgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgc2l6ZS0+Y3Z0X3JlYWR5ID0gMTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIG5ldyBUcnVlVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9pbml0KCBGVF9TaXplICB0dHNpemUgKSAgICAgICAgICAgLyogVFRfU2l6ZSAqLwotICB7Ci0gICAgVFRfU2l6ZSAgIHNpemUgID0gKFRUX1NpemUpdHRzaXplOwotICAgIEZUX0Vycm9yICBlcnJvciA9IFRUX0Vycl9PazsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotICAgIHNpemUtPmJ5dGVjb2RlX3JlYWR5ID0gMDsKLSAgICBzaXplLT5jdnRfcmVhZHkgICAgICA9IDA7Ci0jZW5kaWYKLQotICAgIHNpemUtPnR0bWV0cmljcy52YWxpZCA9IEZBTFNFOwotICAgIHNpemUtPnN0cmlrZV9pbmRleCAgICA9IDB4RkZGRkZGRkZVTDsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIHNpemUgb2JqZWN0IGZpbmFsaXplci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0dF9zaXplX2RvbmUoIEZUX1NpemUgIHR0c2l6ZSApICAgICAgICAgICAvKiBUVF9TaXplICovCi0gIHsKLSAgICBUVF9TaXplICBzaXplID0gKFRUX1NpemUpdHRzaXplOwotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICBpZiAoIHNpemUtPmJ5dGVjb2RlX3JlYWR5ICkKLSAgICAgIHR0X3NpemVfZG9uZV9ieXRlY29kZSggdHRzaXplICk7Ci0jZW5kaWYKLQotICAgIHNpemUtPnR0bWV0cmljcy52YWxpZCA9IEZBTFNFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9zaXplX3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXNldCBhIFRydWVUeXBlIHNpemUgd2hlbiByZXNvbHV0aW9ucyBhbmQgY2hhcmFjdGVyIGRpbWVuc2lvbnMgICAgKi8KLSAgLyogICAgaGF2ZSBiZWVuIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9yZXNldCggVFRfU2l6ZSAgc2l6ZSApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgICBmYWNlOwotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yID0gVFRfRXJyX09rOwotICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3M7Ci0KLQotICAgIHNpemUtPnR0bWV0cmljcy52YWxpZCA9IEZBTFNFOwotCi0gICAgZmFjZSA9IChUVF9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLQotICAgIG1ldHJpY3MgPSAmc2l6ZS0+bWV0cmljczsKLQotICAgIC8qIGNvcHkgdGhlIHJlc3VsdCBmcm9tIGJhc2UgbGF5ZXIgKi8KLSAgICAqbWV0cmljcyA9IHNpemUtPnJvb3QubWV0cmljczsKLQotICAgIGlmICggbWV0cmljcy0+eF9wcGVtIDwgMSB8fCBtZXRyaWNzLT55X3BwZW0gPCAxICkKLSAgICAgIHJldHVybiBUVF9FcnJfSW52YWxpZF9QUGVtOwotCi0gICAgLyogVGhpcyBiaXQgZmxhZywgaWYgc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHBlbXMgbXVzdCBiZSAgICAgICAqLwotICAgIC8qIHJvdW5kZWQgdG8gaW50ZWdlcnMuICBOZWFybHkgYWxsIFRydWVUeXBlIGZvbnRzIGhhdmUgdGhpcyBiaXQgKi8KLSAgICAvKiBzZXQsIGFzIGhpbnRpbmcgd29uJ3Qgd29yayByZWFsbHkgd2VsbCBvdGhlcndpc2UuICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZmFjZS0+aGVhZGVyLkZsYWdzICYgOCApCi0gICAgewotICAgICAgbWV0cmljcy0+eF9zY2FsZSA9IEZUX0RpdkZpeCggbWV0cmljcy0+eF9wcGVtIDw8IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290LnVuaXRzX3Blcl9FTSApOwotICAgICAgbWV0cmljcy0+eV9zY2FsZSA9IEZUX0RpdkZpeCggbWV0cmljcy0+eV9wcGVtIDw8IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290LnVuaXRzX3Blcl9FTSApOwotCi0gICAgICBtZXRyaWNzLT5hc2NlbmRlciA9Ci0gICAgICAgIEZUX1BJWF9ST1VORCggRlRfTXVsRml4KCBmYWNlLT5yb290LmFzY2VuZGVyLCBtZXRyaWNzLT55X3NjYWxlICkgKTsKLSAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9Ci0gICAgICAgIEZUX1BJWF9ST1VORCggRlRfTXVsRml4KCBmYWNlLT5yb290LmRlc2NlbmRlciwgbWV0cmljcy0+eV9zY2FsZSApICk7Ci0gICAgICBtZXRyaWNzLT5oZWlnaHQgPQotICAgICAgICBGVF9QSVhfUk9VTkQoIEZUX011bEZpeCggZmFjZS0+cm9vdC5oZWlnaHQsIG1ldHJpY3MtPnlfc2NhbGUgKSApOwotICAgICAgbWV0cmljcy0+bWF4X2FkdmFuY2UgPQotICAgICAgICBGVF9QSVhfUk9VTkQoIEZUX011bEZpeCggZmFjZS0+cm9vdC5tYXhfYWR2YW5jZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnhfc2NhbGUgKSApOwotICAgIH0KLQotICAgIC8qIGNvbXB1dGUgbmV3IHRyYW5zZm9ybWF0aW9uICovCi0gICAgaWYgKCBtZXRyaWNzLT54X3BwZW0gPj0gbWV0cmljcy0+eV9wcGVtICkKLSAgICB7Ci0gICAgICBzaXplLT50dG1ldHJpY3Muc2NhbGUgICA9IG1ldHJpY3MtPnhfc2NhbGU7Ci0gICAgICBzaXplLT50dG1ldHJpY3MucHBlbSAgICA9IG1ldHJpY3MtPnhfcHBlbTsKLSAgICAgIHNpemUtPnR0bWV0cmljcy54X3JhdGlvID0gMHgxMDAwMEw7Ci0gICAgICBzaXplLT50dG1ldHJpY3MueV9yYXRpbyA9IEZUX011bERpdiggbWV0cmljcy0+eV9wcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnhfcHBlbSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnNjYWxlICAgPSBtZXRyaWNzLT55X3NjYWxlOwotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnBwZW0gICAgPSBtZXRyaWNzLT55X3BwZW07Ci0gICAgICBzaXplLT50dG1ldHJpY3MueF9yYXRpbyA9IEZUX011bERpdiggbWV0cmljcy0+eF9wcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDBMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfcHBlbSApOwotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnlfcmF0aW8gPSAweDEwMDAwTDsKLSAgICB9Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICBzaXplLT5jdnRfcmVhZHkgPSAwOwotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gVFJVRTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZHJpdmVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIGdpdmVuIFRydWVUeXBlIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZHJpdmVyIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgdHRkcml2ZXIgKSAgICAgLyogVFRfRHJpdmVyICovCi0gIHsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgVFRfRHJpdmVyICBkcml2ZXIgPSAoVFRfRHJpdmVyKXR0ZHJpdmVyOwotCi0KLSAgICBpZiAoICFUVF9OZXdfQ29udGV4dCggZHJpdmVyICkgKQotICAgICAgcmV0dXJuIFRUX0Vycl9Db3VsZF9Ob3RfRmluZF9Db250ZXh0OwotCi0jZWxzZQotCi0gICAgRlRfVU5VU0VEKCB0dGRyaXZlciApOwotCi0jZW5kaWYKLQotICAgIHJldHVybiBUVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2RyaXZlcl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplIGEgZ2l2ZW4gVHJ1ZVR5cGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgdHRkcml2ZXIgKSAgICAgLyogVFRfRHJpdmVyICovCi0gIHsKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpdHRkcml2ZXI7Ci0KLQotICAgIC8qIGRlc3Ryb3kgdGhlIGV4ZWN1dGlvbiBjb250ZXh0ICovCi0gICAgaWYgKCBkcml2ZXItPmNvbnRleHQgKQotICAgIHsKLSAgICAgIFRUX0RvbmVfQ29udGV4dCggZHJpdmVyLT5jb250ZXh0ICk7Ci0gICAgICBkcml2ZXItPmNvbnRleHQgPSBOVUxMOwotICAgIH0KLSNlbHNlCi0gICAgRlRfVU5VU0VEKCB0dGRyaXZlciApOwotI2VuZGlmCi0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2xvdF9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIG5ldyBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2xvdCA6OiBBIGhhbmRsZSB0byB0aGUgc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2xvdF9pbml0KCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgcmV0dXJuIEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKCBzbG90LT5pbnRlcm5hbC0+bG9hZGVyICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dG9ianMuaCBiL3NyYy90cnVldHlwZS90dG9ianMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3MTAxMy4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRvYmpzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRPQkpTX0hfXwotI2RlZmluZSBfX1RUT0JKU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBUVF9Ecml2ZXJSZWNfKiAgVFRfRHJpdmVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBUVF9TaXplUmVjXyogIFRUX1NpemU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIGEgZGlyZWN0IHR5cGVkZWYgb2YgRlRfR2x5cGhTbG90LCBhcyB0aGVyZSBpcyBub3RoaW5nICAgICAgKi8KLSAgLyogICAgc3BlY2lmaWMgYWJvdXQgdGhlIFRydWVUeXBlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0dseXBoU2xvdCAgVFRfR2x5cGhTbG90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR3JhcGhpY3NTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIGdyYXBoaWNzIHN0YXRlIHVzZWQgZHVyaW5nIGJ5dGVjb2RlIGludGVycHJldGF0aW9uLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfR3JhcGhpY3NTdGF0ZV8KLSAgewotICAgIEZUX1VTaG9ydCAgICAgIHJwMDsKLSAgICBGVF9VU2hvcnQgICAgICBycDE7Ci0gICAgRlRfVVNob3J0ICAgICAgcnAyOwotCi0gICAgRlRfVW5pdFZlY3RvciAgZHVhbFZlY3RvcjsKLSAgICBGVF9Vbml0VmVjdG9yICBwcm9qVmVjdG9yOwotICAgIEZUX1VuaXRWZWN0b3IgIGZyZWVWZWN0b3I7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIEZUX0Jvb2wgICAgICAgIGJvdGhfeF9heGlzOwotI2VuZGlmCi0KLSAgICBGVF9Mb25nICAgICAgICBsb29wOwotICAgIEZUX0YyNkRvdDYgICAgIG1pbmltdW1fZGlzdGFuY2U7Ci0gICAgRlRfSW50ICAgICAgICAgcm91bmRfc3RhdGU7Ci0KLSAgICBGVF9Cb29sICAgICAgICBhdXRvX2ZsaXA7Ci0gICAgRlRfRjI2RG90NiAgICAgY29udHJvbF92YWx1ZV9jdXRpbjsKLSAgICBGVF9GMjZEb3Q2ICAgICBzaW5nbGVfd2lkdGhfY3V0aW47Ci0gICAgRlRfRjI2RG90NiAgICAgc2luZ2xlX3dpZHRoX3ZhbHVlOwotICAgIEZUX1Nob3J0ICAgICAgIGRlbHRhX2Jhc2U7Ci0gICAgRlRfU2hvcnQgICAgICAgZGVsdGFfc2hpZnQ7Ci0KLSAgICBGVF9CeXRlICAgICAgICBpbnN0cnVjdF9jb250cm9sOwotICAgIEZUX0Jvb2wgICAgICAgIHNjYW5fY29udHJvbDsKLSAgICBGVF9JbnQgICAgICAgICBzY2FuX3R5cGU7Ci0KLSAgICBGVF9VU2hvcnQgICAgICBnZXAwOwotICAgIEZUX1VTaG9ydCAgICAgIGdlcDE7Ci0gICAgRlRfVVNob3J0ICAgICAgZ2VwMjsKLQotICB9IFRUX0dyYXBoaWNzU3RhdGU7Ci0KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZ2x5cGh6b25lX2RvbmUoIFRUX0dseXBoWm9uZSAgem9uZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2dseXBoem9uZV9uZXcoIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIG1heFBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQgICAgICBtYXhDb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICB6b25lICk7Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRVhFQ1VUSU9OIFNVQlRBQkxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGVzZSBzdWItdGFibGVzIHJlbGF0ZSB0byBpbnN0cnVjdGlvbiBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBUVF9NQVhfQ09ERV9SQU5HRVMgIDMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlcmUgY2FuIG9ubHkgYmUgMyBhY3RpdmUgY29kZSByYW5nZXMgYXQgb25jZTogICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSB0aGUgRm9udCBQcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gdGhlIENWVCBQcm9ncmFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIGEgZ2x5cGgncyBpbnN0cnVjdGlvbnMgc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIFRUX0NvZGVSYW5nZV9UYWdfCi0gIHsKLSAgICB0dF9jb2RlcmFuZ2Vfbm9uZSA9IDAsCi0gICAgdHRfY29kZXJhbmdlX2ZvbnQsCi0gICAgdHRfY29kZXJhbmdlX2N2dCwKLSAgICB0dF9jb2RlcmFuZ2VfZ2x5cGgKLQotICB9IFRUX0NvZGVSYW5nZV9UYWc7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ29kZVJhbmdlXwotICB7Ci0gICAgRlRfQnl0ZSogIGJhc2U7Ci0gICAgRlRfVUxvbmcgIHNpemU7Ci0KLSAgfSBUVF9Db2RlUmFuZ2U7Ci0KLSAgdHlwZWRlZiBUVF9Db2RlUmFuZ2UgIFRUX0NvZGVSYW5nZVRhYmxlW1RUX01BWF9DT0RFX1JBTkdFU107Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZXMgYSBmdW5jdGlvbi9pbnN0cnVjdGlvbiBkZWZpbml0aW9uIHJlY29yZC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0RlZlJlY29yZF8KLSAgewotICAgIEZUX0ludCAgIHJhbmdlOyAgICAgIC8qIGluIHdoaWNoIGNvZGUgcmFuZ2UgaXMgaXQgbG9jYXRlZD8gKi8KLSAgICBGVF9Mb25nICBzdGFydDsgICAgICAvKiB3aGVyZSBkb2VzIGl0IHN0YXJ0PyAgICAgICAgICAgICAgICovCi0gICAgRlRfVUludCAgb3BjOyAgICAgICAgLyogZnVuY3Rpb24gIywgb3IgaW5zdHJ1Y3Rpb24gY29kZSAgICAqLwotICAgIEZUX0Jvb2wgIGFjdGl2ZTsgICAgIC8qIGlzIGl0IGFjdGl2ZT8gICAgICAgICAgICAgICAgICAgICAgKi8KLQotICB9IFRUX0RlZlJlY29yZCwgKlRUX0RlZkFycmF5OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdWJnbHlwaCB0cmFuc2Zvcm1hdGlvbiByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9UcmFuc2Zvcm1fCi0gIHsKLSAgICBGVF9GaXhlZCAgICB4eCwgeHk7ICAgICAvKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggY29lZmZpY2llbnRzICovCi0gICAgRlRfRml4ZWQgICAgeXgsIHl5OwotICAgIEZUX0YyNkRvdDYgIG94LCBveTsgICAgIC8qIG9mZnNldHMgICAgICAgICovCi0KLSAgfSBUVF9UcmFuc2Zvcm07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN1YmdseXBoIGxvYWRpbmcgcmVjb3JkLiAgVXNlZCB0byBsb2FkIGNvbXBvc2l0ZSBjb21wb25lbnRzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1N1YmdseXBoUmVjXwotICB7Ci0gICAgRlRfTG9uZyAgICAgICAgICBpbmRleDsgICAgICAgIC8qIHN1YmdseXBoIGluZGV4OyBpbml0aWFsaXplZCB3aXRoIC0xICovCi0gICAgRlRfQm9vbCAgICAgICAgICBpc19zY2FsZWQ7ICAgIC8qIGlzIHRoZSBzdWJnbHlwaCBzY2FsZWQ/ICAgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgICBpc19oaW50ZWQ7ICAgIC8qIHNob3VsZCBpdCBiZSBoaW50ZWQ/ICAgICAgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgICBwcmVzZXJ2ZV9wcHM7IC8qIHByZXNlcnZlIHBoYW50b20gcG9pbnRzPyAgICAgICAgICAgICovCi0KLSAgICBGVF9Mb25nICAgICAgICAgIGZpbGVfb2Zmc2V0OwotCi0gICAgRlRfQkJveCAgICAgICAgICBiYm94OwotICAgIEZUX1BvcyAgICAgICAgICAgbGVmdF9iZWFyaW5nOwotICAgIEZUX1BvcyAgICAgICAgICAgYWR2YW5jZTsKLQotICAgIFRUX0dseXBoWm9uZVJlYyAgem9uZTsKLQotICAgIEZUX0xvbmcgICAgICAgICAgYXJnMTsgICAgICAgICAvKiBmaXJzdCBhcmd1bWVudCAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0xvbmcgICAgICAgICAgYXJnMjsgICAgICAgICAvKiBzZWNvbmQgYXJndW1lbnQgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfVVNob3J0ICAgICAgICBlbGVtZW50X2ZsYWc7IC8qIGN1cnJlbnQgbG9hZCBlbGVtZW50IGZsYWcgICAgICAgICAgICovCi0KLSAgICBUVF9UcmFuc2Zvcm0gICAgIHRyYW5zZm9ybTsgICAgLyogdHJhbnNmb3JtYXRpb24gbWF0cml4ICAgICAgICAgICAgICAgKi8KLQotICAgIEZUX1ZlY3RvciAgICAgICAgcHAxLCBwcDI7ICAgICAvKiBwaGFudG9tIHBvaW50cyAoaG9yaXpvbnRhbCkgICAgICAgICAqLwotICAgIEZUX1ZlY3RvciAgICAgICAgcHAzLCBwcDQ7ICAgICAvKiBwaGFudG9tIHBvaW50cyAodmVydGljYWwpICAgICAgICAgICAqLwotCi0gIH0gVFRfU3ViR2x5cGhSZWMsICpUVF9TdWJHbHlwaF9TdGFjazsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBub3RlIHJlZ2FyZGluZyBub24tc3F1YXJlZCBwaXhlbHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAoVGhpcyB0ZXh0IHdpbGwgcHJvYmFibHkgZ28gaW50byBzb21lIGRvY3MgYXQgc29tZSB0aW1lOyBmb3Igbm93LCBpdCAgKi8KLSAgLyogIGlzIGtlcHQgaGVyZSB0byBleHBsYWluIHNvbWUgZGVmaW5pdGlvbnMgaW4gdGhlIFRJbnNfTWV0cmljcyAgICAgICAgICovCi0gIC8qICByZWNvcmQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIENWVCBpcyBhIG9uZS1kaW1lbnNpb25hbCBhcnJheSBjb250YWluaW5nIHZhbHVlcyB0aGF0IGNvbnRyb2wgICAgICovCi0gIC8qIGNlcnRhaW4gaW1wb3J0YW50IGNoYXJhY3RlcmlzdGljcyBpbiBhIGZvbnQsIGxpa2UgdGhlIGhlaWdodCBvZiBhbGwgICAqLwotICAvKiBjYXBpdGFscywgYWxsIGxvd2VyY2FzZSBsZXR0ZXIsIGRlZmF1bHQgc3BhY2luZyBvciBzdGVtIHdpZHRoL2hlaWdodC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgZm91bmQgaW4gRlVuaXRzIGluIHRoZSBmb250IGZpbGUsIGFuZCBtdXN0IGJlIHNjYWxlZCAqLwotICAvKiB0byBwaXhlbCBjb29yZGluYXRlcyBiZWZvcmUgYmVpbmcgdXNlZCBieSB0aGUgQ1ZUIGFuZCBnbHlwaCBwcm9ncmFtcy4gKi8KLSAgLyogVW5mb3J0dW5hdGVseSwgd2hlbiB1c2luZyBkaXN0aW5jdCB4IGFuZCB5IHJlc29sdXRpb25zIChvciBkaXN0aW5jdCB4ICovCi0gIC8qIGFuZCB5IHBvaW50c2l6ZXMpLCB0aGVyZSBhcmUgdHdvIHBvc3NpYmxlIHNjYWxpbmdzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBmaXJzdCB0cnkgd2FzIHRvIGltcGxlbWVudCBhIGBsYXp5JyBzY2hlbWUgd2hlcmUgYWxsIHZhbHVlcyB3ZXJlICAgICovCi0gIC8qIHNjYWxlZCB3aGVuIGZpcnN0IHVzZWQuICBIb3dldmVyLCB3aGlsZSBzb21lIHZhbHVlcyBhcmUgYWx3YXlzIHVzZWQgICAqLwotICAvKiBpbiB0aGUgc2FtZSBkaXJlY3Rpb24sIHNvbWUgb3RoZXJzIGFyZSB1c2VkIHVuZGVyIG1hbnkgZGlmZmVyZW50ICAgICAgKi8KLSAgLyogY2lyY3Vtc3RhbmNlcyBhbmQgb3JpZW50YXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJIGhhdmUgZm91bmQgYSBzaW1wbGVyIHdheSB0byBkbyB0aGUgc2FtZSwgYW5kIGl0IGV2ZW4gc2VlbXMgdG8gd29yayAgKi8KLSAgLyogaW4gbW9zdCBvZiB0aGUgY2FzZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIEFsbCBDVlQgdmFsdWVzIGFyZSBzY2FsZWQgdG8gdGhlIG1heGltdW0gcHBlbSBzaXplLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gV2hlbiBwZXJmb3JtaW5nIGEgcmVhZCBvciB3cml0ZSBpbiB0aGUgQ1ZULCBhIHJhdGlvIGZhY3RvciBpcyB1c2VkICAqLwotICAvKiAgIHRvIHBlcmZvcm0gYWRlcXVhdGUgc2NhbGluZy4gIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB4X3BwZW0gPSAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgeV9wcGVtID0gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgV2UgY2hvb3NlIHBwZW0gPSB4X3BwZW0gPSAxNCBhcyB0aGUgQ1ZUIHNjYWxpbmcgc2l6ZS4gIEFsbCBjdnQgICAgICAqLwotICAvKiAgIGVudHJpZXMgYXJlIHNjYWxlZCB0byBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB4X3JhdGlvID0gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgeV9yYXRpbyA9IHlfcHBlbS9wcGVtICg8IDEuMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgV2UgY29tcHV0ZSB0aGUgY3VycmVudCByYXRpbyBsaWtlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIElmIHByb2pWZWN0b3IgaXMgaG9yaXpvbnRhbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHJhdGlvID0geF9yYXRpbyA9IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIGlmIHByb2pWZWN0b3IgaXMgdmVydGljYWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHJhdGlvID0geV9yYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIGVsc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHJhdGlvID0gc3FydCggKHByb2oueCAqIHhfcmF0aW8pIF4gMiArIChwcm9qLnkgKiB5X3JhdGlvKSBeIDIgKSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBSZWFkaW5nIGEgY3Z0IHZhbHVlIHJldHVybnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICByYXRpbyAqIGN2dFtpbmRleF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBXcml0aW5nIGEgY3Z0IHZhbHVlIGluIHBpeGVsczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjdnRbaW5kZXhdIC8gcmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgY3VycmVudCBwcGVtIGlzIHNpbXBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICByYXRpbyAqIHBwZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1ldHJpY3MgdXNlZCBieSB0aGUgVHJ1ZVR5cGUgc2l6ZSBhbmQgY29udGV4dCBvYmplY3RzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NpemVfTWV0cmljc18KLSAgewotICAgIC8qIGZvciBub24tc3F1YXJlIHBpeGVscyAqLwotICAgIEZUX0xvbmcgICAgIHhfcmF0aW87Ci0gICAgRlRfTG9uZyAgICAgeV9yYXRpbzsKLQotICAgIEZUX1VTaG9ydCAgIHBwZW07ICAgICAgICAgICAgICAgLyogbWF4aW11bSBwcGVtIHNpemUgICAgICAgICAgICAgICovCi0gICAgRlRfTG9uZyAgICAgcmF0aW87ICAgICAgICAgICAgICAvKiBjdXJyZW50IHJhdGlvICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9GaXhlZCAgICBzY2FsZTsKLQotICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbnNbNF07ICAgLyogZGV2aWNlLXNwZWNpZmljIGNvbXBlbnNhdGlvbnMgICovCi0KLSAgICBGVF9Cb29sICAgICB2YWxpZDsKLQotICAgIEZUX0Jvb2wgICAgIHJvdGF0ZWQ7ICAgICAgICAgICAgLyogYGlzIHRoZSBnbHlwaCByb3RhdGVkPyctZmxhZyAgICovCi0gICAgRlRfQm9vbCAgICAgc3RyZXRjaGVkOyAgICAgICAgICAvKiBgaXMgdGhlIGdseXBoIHN0cmV0Y2hlZD8nLWZsYWcgKi8KLQotICB9IFRUX1NpemVfTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgc2l6ZSBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU2l6ZVJlY18KLSAgewotICAgIEZUX1NpemVSZWMgICAgICAgICByb290OwotCi0gICAgLyogd2UgaGF2ZSBvdXIgb3duIGNvcHkgb2YgbWV0cmljcyBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgKi8KLSAgICAvKiBpdCB3aXRob3V0IGFmZmVjdGluZyBhdXRvLWhpbnRpbmcgKHdoZW4gdXNlZCkgICAgICAgICAqLwotICAgIEZUX1NpemVfTWV0cmljcyAgICBtZXRyaWNzOwotCi0gICAgVFRfU2l6ZV9NZXRyaWNzICAgIHR0bWV0cmljczsKLQotICAgIEZUX1VMb25nICAgICAgICAgICBzdHJpa2VfaW5kZXg7ICAgICAgLyogMHhGRkZGRkZGRiB0byBpbmRpY2F0ZSBpbnZhbGlkICovCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fZnVuY3Rpb25fZGVmczsgLyogbnVtYmVyIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zICovCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heF9mdW5jdGlvbl9kZWZzOwotICAgIFRUX0RlZkFycmF5ICAgICAgICBmdW5jdGlvbl9kZWZzOyAgICAgLyogdGFibGUgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbnMgICovCi0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX2luc3RydWN0aW9uX2RlZnM7ICAvKiBudW1iZXIgb2YgaW5zLiBkZWZpbml0aW9ucyAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICBtYXhfaW5zdHJ1Y3Rpb25fZGVmczsKLSAgICBUVF9EZWZBcnJheSAgICAgICAgaW5zdHJ1Y3Rpb25fZGVmczsgICAgICAvKiB0YWJsZSBvZiBpbnMuIGRlZmluaXRpb25zICAqLwotCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heF9mdW5jOwotICAgIEZUX1VJbnQgICAgICAgICAgICBtYXhfaW5zOwotCi0gICAgVFRfQ29kZVJhbmdlVGFibGUgIGNvZGVSYW5nZVRhYmxlOwotCi0gICAgVFRfR3JhcGhpY3NTdGF0ZSAgIEdTOwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgIGN2dF9zaXplOyAgICAgIC8qIHRoZSBzY2FsZWQgY29udHJvbCB2YWx1ZSB0YWJsZSAqLwotICAgIEZUX0xvbmcqICAgICAgICAgICBjdnQ7Ci0KLSAgICBGVF9VU2hvcnQgICAgICAgICAgc3RvcmFnZV9zaXplOyAvKiBUaGUgc3RvcmFnZSBhcmVhIGlzIG5vdyBwYXJ0IG9mICovCi0gICAgRlRfTG9uZyogICAgICAgICAgIHN0b3JhZ2U7ICAgICAgLyogdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVFRfR2x5cGhab25lUmVjICAgIHR3aWxpZ2h0OyAgICAgLyogVGhlIGluc3RhbmNlJ3MgdHdpbGlnaHQgem9uZSAgICAqLwotCi0gICAgLyogZGVidWdnaW5nIHZhcmlhYmxlcyAqLwotCi0gICAgLyogV2hlbiB1c2luZyB0aGUgZGVidWdnZXIsIHdlIG11c3Qga2VlcCB0aGUgKi8KLSAgICAvKiBleGVjdXRpb24gY29udGV4dCB0aWVkIHRvIHRoZSBpbnN0YW5jZSAgICAqLwotICAgIC8qIG9iamVjdCByYXRoZXIgdGhhbiBhc2tpbmcgaXQgb24gZGVtYW5kLiAgICovCi0KLSAgICBGVF9Cb29sICAgICAgICAgICAgZGVidWc7Ci0gICAgVFRfRXhlY0NvbnRleHQgICAgIGNvbnRleHQ7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgICAgYnl0ZWNvZGVfcmVhZHk7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgIGN2dF9yZWFkeTsKLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gIH0gVFRfU2l6ZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgZHJpdmVyIGNsYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfRHJpdmVyUmVjXwotICB7Ci0gICAgRlRfRHJpdmVyUmVjICAgICByb290OwotICAgIFRUX0V4ZWNDb250ZXh0ICAgY29udGV4dDsgIC8qIGV4ZWN1dGlvbiBjb250ZXh0ICAgICAgICAqLwotICAgIFRUX0dseXBoWm9uZVJlYyAgem9uZTsgICAgIC8qIGdseXBoIGxvYWRlciBwb2ludHMgem9uZSAqLwotCi0gICAgdm9pZCogICAgICAgICAgICBleHRlbnNpb25fY29tcG9uZW50OwotCi0gIH0gVFRfRHJpdmVyUmVjOwotCi0KLSAgLyogTm90ZTogQWxsIG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgKGV4Y2VwdCB0dF9zaXplX3Jlc2V0KCkpIGFyZSB1c2VkICAgICovCi0gIC8qIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGluIGEgRlRfRHJpdmVyX0NsYXNzUmVjLiAgVGhlcmVmb3JlIHRoZWlyICAgICAgICAqLwotICAvKiBwYXJhbWV0ZXJzIGFyZSBvZiB0eXBlcyBGVF9GYWNlLCBGVF9TaXplLCBldGMuLCByYXRoZXIgdGhhbiBUVF9GYWNlLCAgKi8KLSAgLyogVFRfU2l6ZSwgZXRjLiwgc28gdGhhdCB0aGUgY29tcGlsZXIgY2FuIGNvbmZpcm0gdGhhdCB0aGUgdHlwZXMgYW5kICAgICovCi0gIC8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0LiAgSW4gYWxsIGNhc2VzIHRoZSBGVF94eHggdHlwZXMgYXJlICAqLwotICAvKiBjYXN0IHRvIHRoZWlyIFRUX3h4eCBjb3VudGVycGFydHMgaW5zaWRlIHRoZSBmdW5jdGlvbnMgc2luY2UgRnJlZVR5cGUgKi8KLSAgLyogd2lsbCBhbHdheXMgdXNlIHRoZSBUVCBkcml2ZXIgdG8gY3JlYXRlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgdHRmYWNlLCAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2RvbmUoIEZUX0ZhY2UgIHR0ZmFjZSApOyAgICAgICAgICAvKiBUVF9GYWNlICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNpemUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9pbml0KCBGVF9TaXplICB0dHNpemUgKTsgICAgICAgICAgLyogVFRfU2l6ZSAqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfc2l6ZV9kb25lKCBGVF9TaXplICB0dHNpemUgKTsgICAgICAgICAgLyogVFRfU2l6ZSAqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9ydW5fZnBnbSggVFRfU2l6ZSAgc2l6ZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X3NpemVfcnVuX3ByZXAoIFRUX1NpemUgIHNpemUgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9zaXplX3JlYWR5X2J5dGVjb2RlKCBUVF9TaXplICBzaXplICk7Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9zaXplX3Jlc2V0KCBUVF9TaXplICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERyaXZlciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgdHRkcml2ZXIgKTsgICAgLyogVFRfRHJpdmVyICovCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9kcml2ZXJfZG9uZSggRlRfTW9kdWxlICB0dGRyaXZlciApOyAgICAvKiBUVF9Ecml2ZXIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2xvdCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRPQkpTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0cGxvYWQuYyBiL3NyYy90cnVldHlwZS90dHBsb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzM4MWIuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0cGxvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUtc3BlY2lmaWMgdGFibGVzIGxvYWRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0KLSNpbmNsdWRlICJ0dHBsb2FkLmgiCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSAidHRneHZhci5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRwbG9hZAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2xvY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgbG9jYXRpb25zIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfbG9jYSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX1VMb25nICB0YWJsZV9sZW47Ci0KLQotICAgIC8qIHdlIG5lZWQgdGhlIHNpemUgb2YgdGhlIGBnbHlmJyB0YWJsZSBmb3IgbWFsZm9ybWVkIGBsb2NhJyB0YWJsZXMgKi8KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZ2x5Ziwgc3RyZWFtLCAmZmFjZS0+Z2x5Zl9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1RSQUNFMigoICJMb2NhdGlvbnMgIiApKTsKLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfbG9jYSwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgZXJyb3IgPSBUVF9FcnJfTG9jYXRpb25zX01pc3Npbmc7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBmYWNlLT5oZWFkZXIuSW5kZXhfVG9fTG9jX0Zvcm1hdCAhPSAwICkKLSAgICB7Ci0gICAgICBpZiAoIHRhYmxlX2xlbiA+PSAweDQwMDAwTCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJ0YWJsZSB0b28gbGFyZ2UhXG4iICkpOwotICAgICAgICBlcnJvciA9IFRUX0Vycl9JbnZhbGlkX1RhYmxlOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBmYWNlLT5udW1fbG9jYXRpb25zID0gKEZUX1VJbnQpKCB0YWJsZV9sZW4gPj4gMiApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCB0YWJsZV9sZW4gPj0gMHgyMDAwMEwgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAidGFibGUgdG9vIGxhcmdlIVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBUVF9FcnJfSW52YWxpZF9UYWJsZTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyA9IChGVF9VSW50KSggdGFibGVfbGVuID4+IDEgKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEV4dHJhY3QgdGhlIGZyYW1lLiAgV2UgZG9uJ3QgbmVlZCB0byBkZWNvbXByZXNzIGl0IHNpbmNlCi0gICAgICogd2UgYXJlIGFibGUgdG8gcGFyc2UgaXQgZGlyZWN0bHkuCi0gICAgICovCi0gICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCB0YWJsZV9sZW4sIGZhY2UtPmdseXBoX2xvY2F0aW9ucyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUxvbmcgKQotICB0dF9mYWNlX2dldF9sb2NhdGlvbiggVFRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmFzaXplICkKLSAgewotICAgIEZUX1VMb25nICBwb3MxLCBwb3MyOwotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX0J5dGUqICBwX2xpbWl0OwotCi0KLSAgICBwb3MxID0gcG9zMiA9IDA7Ci0KLSAgICBpZiAoIGdpbmRleCA8IGZhY2UtPm51bV9sb2NhdGlvbnMgKQotICAgIHsKLSAgICAgIGlmICggZmFjZS0+aGVhZGVyLkluZGV4X1RvX0xvY19Gb3JtYXQgIT0gMCApCi0gICAgICB7Ci0gICAgICAgIHAgICAgICAgPSBmYWNlLT5nbHlwaF9sb2NhdGlvbnMgKyBnaW5kZXggKiA0OwotICAgICAgICBwX2xpbWl0ID0gZmFjZS0+Z2x5cGhfbG9jYXRpb25zICsgZmFjZS0+bnVtX2xvY2F0aW9ucyAqIDQ7Ci0KLSAgICAgICAgcG9zMSA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgcG9zMiA9IHBvczE7Ci0KLSAgICAgICAgaWYgKCBwICsgNCA8PSBwX2xpbWl0ICkKLSAgICAgICAgICBwb3MyID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwICAgICAgID0gZmFjZS0+Z2x5cGhfbG9jYXRpb25zICsgZ2luZGV4ICogMjsKLSAgICAgICAgcF9saW1pdCA9IGZhY2UtPmdseXBoX2xvY2F0aW9ucyArIGZhY2UtPm51bV9sb2NhdGlvbnMgKiAyOwotCi0gICAgICAgIHBvczEgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBwb3MyID0gcG9zMTsKLQotICAgICAgICBpZiAoIHAgKyAyIDw9IHBfbGltaXQgKQotICAgICAgICAgIHBvczIgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAgIHBvczEgPDw9IDE7Ci0gICAgICAgIHBvczIgPDw9IDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogSXQgaXNuJ3QgbWVudGlvbmVkIGV4cGxpY2l0bHkgdGhhdCB0aGUgYGxvY2EnIHRhYmxlIG11c3QgYmUgICovCi0gICAgLyogb3JkZXJlZCwgYnV0IGltcGxpY2l0bHkgaXQgcmVmZXJzIHRvIHRoZSBsZW5ndGggb2YgYW4gZW50cnkgICovCi0gICAgLyogYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG5leHQgcG9zaXRpb24uICovCi0gICAgLyogQW55d2F5LCB0aGVyZSBkbyBleGlzdCAobWFsZm9ybWVkKSBmb250cyB3aGljaCBkb24ndCBvYmV5ICAgICovCi0gICAgLyogdGhpcyBydWxlLCBzbyB3ZSBhcmUgb25seSBhYmxlIHRvIHByb3ZpZGUgYW4gdXBwZXIgYm91bmQgZm9yICovCi0gICAgLyogdGhlIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBwb3MyID49IHBvczEgKQotICAgICAgKmFzaXplID0gKEZUX1VJbnQpKCBwb3MyIC0gcG9zMSApOwotICAgIGVsc2UKLSAgICAgICphc2l6ZSA9IChGVF9VSW50KSggZmFjZS0+Z2x5Zl9sZW4gLSBwb3MxICk7Ci0KLSAgICByZXR1cm4gcG9zMTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9kb25lX2xvY2EoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLQotCi0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+Z2x5cGhfbG9jYXRpb25zICk7Ci0gICAgZmFjZS0+bnVtX2xvY2F0aW9ucyA9IDA7Ci0gIH0KLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2N2dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2N2dCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VTG9uZyAgIHRhYmxlX2xlbjsKLQotCi0gICAgRlRfVFJBQ0UyKCggIkNWVCAiICkpOwotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2N2dCwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmchXG4iICkpOwotCi0gICAgICBmYWNlLT5jdnRfc2l6ZSA9IDA7Ci0gICAgICBmYWNlLT5jdnQgICAgICA9IE5VTEw7Ci0gICAgICBlcnJvciAgICAgICAgICA9IFRUX0Vycl9PazsKLQotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGZhY2UtPmN2dF9zaXplID0gdGFibGVfbGVuIC8gMjsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBmYWNlLT5jdnQsIGZhY2UtPmN2dF9zaXplICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggZmFjZS0+Y3Z0X3NpemUgKiAyTCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHsKLSAgICAgIEZUX1Nob3J0KiAgY3VyICAgPSBmYWNlLT5jdnQ7Ci0gICAgICBGVF9TaG9ydCogIGxpbWl0ID0gY3VyICsgZmFjZS0+Y3Z0X3NpemU7Ci0KLQotICAgICAgZm9yICggOyBjdXIgPCAgbGltaXQ7IGN1cisrICkKLSAgICAgICAgKmN1ciA9IEZUX0dFVF9TSE9SVCgpOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgIGlmICggZmFjZS0+ZG9ibGVuZCApCi0gICAgICBlcnJvciA9IHR0X2ZhY2VfdmFyeV9jdnQoIGZhY2UsIHN0cmVhbSApOwotI2VuZGlmCi0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSNlbHNlIC8qICFUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgIEZUX1VOVVNFRCggZmFjZSAgICk7Ci0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotICAgIHJldHVybiBUVF9FcnJfT2s7Ci0KLSNlbmRpZgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfZnBnbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBmb250IHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZnBnbSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgRlRfVUxvbmcgIHRhYmxlX2xlbjsKLQotCi0gICAgRlRfVFJBQ0UyKCggIkZvbnQgcHJvZ3JhbSAiICkpOwotCi0gICAgLyogVGhlIGZvbnQgcHJvZ3JhbSBpcyBvcHRpb25hbCAqLwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19mcGdtLCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBmYWNlLT5mb250X3Byb2dyYW0gICAgICA9IE5VTEw7Ci0gICAgICBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSA9IDA7Ci0gICAgICBlcnJvciAgICAgICAgICAgICAgICAgICA9IFRUX0Vycl9PazsKLQotICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmchXG4iICkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPSB0YWJsZV9sZW47Ci0gICAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIHRhYmxlX2xlbiwgZmFjZS0+Zm9udF9wcm9ncmFtICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1RSQUNFMigoICJsb2FkZWQsICUxMmQgYnl0ZXNcbiIsIGZhY2UtPmZvbnRfcHJvZ3JhbV9zaXplICkpOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotI2Vsc2UgLyogIVRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gICAgRlRfVU5VU0VEKCBmYWNlICAgKTsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0gICAgcmV0dXJuIFRUX0Vycl9PazsKLQotI2VuZGlmCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9wcmVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGN2dCBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9wcmVwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgdGFibGVfbGVuOwotCi0KLSAgICBGVF9UUkFDRTIoKCAiUHJlcCBwcm9ncmFtICIgKSk7Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfcHJlcCwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgZmFjZS0+Y3Z0X3Byb2dyYW0gICAgICA9IE5VTEw7Ci0gICAgICBmYWNlLT5jdnRfcHJvZ3JhbV9zaXplID0gMDsKLSAgICAgIGVycm9yICAgICAgICAgICAgICAgICAgPSBUVF9FcnJfT2s7Ci0KLSAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nIVxuIiApKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgPSB0YWJsZV9sZW47Ci0gICAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIHRhYmxlX2xlbiwgZmFjZS0+Y3Z0X3Byb2dyYW0gKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfVFJBQ0UyKCggImxvYWRlZCwgJTEyZCBieXRlc1xuIiwgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSApKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSNlbHNlIC8qICFUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgIEZUX1VOVVNFRCggZmFjZSAgICk7Ci0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotICAgIHJldHVybiBUVF9FcnJfT2s7Ci0KLSNlbmRpZgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfaGRteCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBgaGRteCcgdGFibGUgaW50byB0aGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hkbXgoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VSW50ICAgIHZlcnNpb24sIG5uLCBudW1fcmVjb3JkczsKLSAgICBGVF9VTG9uZyAgIHRhYmxlX3NpemUsIHJlY29yZF9zaXplOwotICAgIEZUX0J5dGUqICAgcDsKLSAgICBGVF9CeXRlKiAgIGxpbWl0OwotCi0KLSAgICAvKiB0aGlzIHRhYmxlIGlzIG9wdGlvbmFsICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2hkbXgsIHN0cmVhbSwgJnRhYmxlX3NpemUgKTsKLSAgICBpZiAoIGVycm9yIHx8IHRhYmxlX3NpemUgPCA4ICkKLSAgICAgIHJldHVybiBUVF9FcnJfT2s7Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIHRhYmxlX3NpemUsIGZhY2UtPmhkbXhfdGFibGUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBwICAgICA9IGZhY2UtPmhkbXhfdGFibGU7Ci0gICAgbGltaXQgPSBwICsgdGFibGVfc2l6ZTsKLQotICAgIHZlcnNpb24gICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBudW1fcmVjb3JkcyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgcmVjb3JkX3NpemUgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gYW4gaGRteCBkZXZpY2UgcmVjb3JkIGlzIHRoZSAqLwotICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGdseXBocyArIDI7IHRoaXMgaXMgMHhGRkZGICsgMjsgdGhpcyBpcyAgICovCi0gICAgLyogdGhlIHJlYXNvbiB3aHkgYHJlY29yZF9zaXplJyBpcyBhIGxvbmcgKHdoaWNoIHdlIHJlYWQgYXMgICAgKi8KLSAgICAvKiB1bnNpZ25lZCBsb25nIGZvciBjb252ZW5pZW5jZSkuICBJbiBwcmFjdGljZSwgdHdvIGJ5dGVzICAgICAqLwotICAgIC8qIHN1ZmZpY2llbnQgdG8gaG9sZCB0aGUgc2l6ZSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGVyZSBhcmUgYXQgbGVhc3QgdHdvIGZvbnRzLCBIQU5OT00tQSBhbmQgSEFOTk9NLUIgdmVyc2lvbiAqLwotICAgIC8qIDIuMCAoMjAwNSksIHdoaWNoIGdldCB0aGlzIHdyb25nOiBUaGUgdXBwZXIgdHdvIGJ5dGVzIG9mICAgICovCi0gICAgLyogdGhlIHNpemUgdmFsdWUgYXJlIHNldCB0byAweEZGIGluc3RlYWQgb2YgMHgwMC4gIFdlIGNhdGNoICAgKi8KLSAgICAvKiBhbmQgZml4IHRoaXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCByZWNvcmRfc2l6ZSA+PSAweEZGRkYwMDAwVUwgKQotICAgICAgcmVjb3JkX3NpemUgJj0gMHhGRkZGVTsKLQotICAgIC8qIFRoZSBsaW1pdCBmb3IgYG51bV9yZWNvcmRzJyBpcyBhIGhldXJpc3RpYyB2YWx1ZS4gKi8KLQotICAgIGlmICggdmVyc2lvbiAhPSAwIHx8IG51bV9yZWNvcmRzID4gMjU1IHx8IHJlY29yZF9zaXplID4gMHgxMDAwMUwgKQotICAgIHsKLSAgICAgIGVycm9yID0gVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQ7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGZhY2UtPmhkbXhfcmVjb3JkX3NpemVzLCBudW1fcmVjb3JkcyApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fcmVjb3Jkczsgbm4rKyApCi0gICAgewotICAgICAgaWYgKCBwICsgcmVjb3JkX3NpemUgPiBsaW1pdCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBmYWNlLT5oZG14X3JlY29yZF9zaXplc1tubl0gPSBwWzBdOwotICAgICAgcCAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gcmVjb3JkX3NpemU7Ci0gICAgfQotCi0gICAgZmFjZS0+aGRteF9yZWNvcmRfY291bnQgPSBubjsKLSAgICBmYWNlLT5oZG14X3RhYmxlX3NpemUgICA9IHRhYmxlX3NpemU7Ci0gICAgZmFjZS0+aGRteF9yZWNvcmRfc2l6ZSAgPSByZWNvcmRfc2l6ZTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGZhY2UtPmhkbXhfdGFibGUgKTsKLSAgICBmYWNlLT5oZG14X3RhYmxlX3NpemUgPSAwOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX2hkbXgoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICBGVF9GUkVFKCBmYWNlLT5oZG14X3JlY29yZF9zaXplcyApOwotICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGZhY2UtPmhkbXhfdGFibGUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSZXR1cm4gdGhlIGFkdmFuY2Ugd2lkdGggdGFibGUgZm9yIGEgZ2l2ZW4gcGl4ZWwgc2l6ZSBpZiBpdCBpcyBmb3VuZCAgKi8KLSAgLyogaW4gdGhlIGZvbnQncyBgaGRteCcgdGFibGUgKGlmIGFueSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0J5dGUqICkKLSAgdHRfZmFjZV9nZXRfZGV2aWNlX21ldHJpY3MoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgZ2luZGV4ICkKLSAgewotICAgIEZUX1VJbnQgICBubjsKLSAgICBGVF9CeXRlKiAgcmVzdWx0ICAgICAgPSBOVUxMOwotICAgIEZUX1VMb25nICByZWNvcmRfc2l6ZSA9IGZhY2UtPmhkbXhfcmVjb3JkX3NpemU7Ci0gICAgRlRfQnl0ZSogIHJlY29yZCAgICAgID0gZmFjZS0+aGRteF90YWJsZSArIDg7Ci0KLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCBmYWNlLT5oZG14X3JlY29yZF9jb3VudDsgbm4rKyApCi0gICAgICBpZiAoIGZhY2UtPmhkbXhfcmVjb3JkX3NpemVzW25uXSA9PSBwcGVtICkKLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ICs9IDI7Ci0gICAgICAgIGlmICggZ2luZGV4IDwgcmVjb3JkX3NpemUgKQotICAgICAgICAgIHJlc3VsdCA9IHJlY29yZCArIG5uICogcmVjb3JkX3NpemUgKyBnaW5kZXg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0cGxvYWQuaCBiL3NyYy90cnVldHlwZS90dHBsb2FkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MWFjMDcuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0cGxvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0cGxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZXMgbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDA1LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUUExPQURfSF9fCi0jZGVmaW5lIF9fVFRQTE9BRF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9sb2NhKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIEZUX0xPQ0FMKCBGVF9VTG9uZyApCi0gIHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKCBUVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqYXNpemUgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZG9uZV9sb2NhKCBUVF9GYWNlICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2N2dCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9mcGdtKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3ByZXAoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfaGRteCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX2hkbXgoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9CeXRlKiApCi0gIHR0X2ZhY2VfZ2V0X2RldmljZV9tZXRyaWNzKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHBwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdpbmRleCApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUUExPQURfSF9fICovCi0KLQotLyogRU5EICovCg==