LyogRGlyZWN0M0QgTWF0ZXJpYWwKICogQ29weXJpZ2h0IChjKSAyMDAyIExpb25lbCBVTE1FUgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIETWU0lOR0VSCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgRGlyZWN0M0RNYXRlcmlhbC4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKI2luY2x1ZGUgImV4Y3B0LmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CgpzdGF0aWMgdm9pZCBkdW1wX21hdGVyaWFsKExQRDNETUFURVJJQUwgbWF0KQp7CiAgICBEUFJJTlRGKCIgIGR3U2l6ZSA6ICVsZFxuIiwgbWF0LT5kd1NpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVVua25vd24gTWV0aG9kcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsMzo6UXVlcnlJbnRlcmZhY2UKICoKICogUXVlcnlJbnRlcmZhY2UgZm9yIElEaXJlY3QzRE1hdGVyaWFsLiBDYW4gcXVlcnkgYWxsIElEaXJlY3QzRE1hdGVyaWFsCiAqIHZlcnNpb25zLgogKgogKiBQYXJhbXM6CiAqICByaWlkOiBJbnRlcmZhY2UgaWQgcXVlcmllZCBmb3IKICogIG9iajogQWRkcmVzcyB0byBwYXNzIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBiYWNrCiAqCiAqIFJldHVybnM6CiAqICBTX09LIG9uIHN1Y2Nlc3MKICogIEVfTk9JTlRFUkZBQ0UgaWYgdGhlIHJlcXVlc3RlZCBpbnRlcmZhY2Ugd2Fzbid0IGZvdW5kCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXMsJXApXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwoKICAgICpvYnAgPSBOVUxMOwoKICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSVVua25vd24sICByaWlkICkgKSB7CiAgICAgICAgSURpcmVjdDNETWF0ZXJpYWxfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRE1hdGVyaWFsKSk7Cgkqb2JwID0gaWZhY2U7CglUUkFDRSgiICBDcmVhdGluZyBJVW5rbm93biBpbnRlcmZhY2UgYXQgJXAuXG4iLCAqb2JwKTsKCXJldHVybiBTX09LOwogICAgfQogICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RNYXRlcmlhbCwgcmlpZCApICkgewogICAgICAgIElEaXJlY3QzRE1hdGVyaWFsX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbCkpOwogICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbCk7CglUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RNYXRlcmlhbCBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRE1hdGVyaWFsMiwgcmlpZCApICkgewogICAgICAgIElEaXJlY3QzRE1hdGVyaWFsX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbCkpOwogICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbDIpOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNETWF0ZXJpYWwyIGludGVyZmFjZSAlcFxuIiwgKm9icCk7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNETWF0ZXJpYWwzLCByaWlkICkgKSB7CiAgICAgICAgSURpcmVjdDNETWF0ZXJpYWxfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRE1hdGVyaWFsKSk7CiAgICAgICAgKm9icCA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRE1hdGVyaWFsMyk7CglUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlICVwXG4iLCAqb2JwKTsKCXJldHVybiBTX09LOwogICAgfQogICAgRklYTUUoIiglcCk6IGludGVyZmFjZSBmb3IgSUlEICVzIE5PVCBmb3VuZCFcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCkpOwogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDM6OkFkZFJlZgogKgogKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50LgogKgogKiBSZXR1cm5zOgogKiAgVGhlIG5ldyByZWZjb3VudAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVTE9ORyBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX0FkZFJlZihJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCktPigpIGluY3JlbWVudGluZyBmcm9tICVsdS5cbiIsIFRoaXMsIHJlZiAtIDEpOwoKICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDM6OlJlbGVhc2UKICoKICogUmVkdWNlcyB0aGUgcmVmY291bnQgYnkgb25lLiBJZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMCwgdGhlIG9iamVjdAogKiBpcyBkZXN0cm95ZWQKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9SZWxlYXNlKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJWx1LlxuIiwgVGhpcywgcmVmICsgMSk7CgogICAgaWYgKCFyZWYpCiAgICB7CiAgICAgICAgaWYoVGhpcy0+SGFuZGxlKQogICAgICAgIHsKICAgICAgICAgICAgVGhpcy0+ZGRyYXctPmQzZGRldmljZS0+SGFuZGxlc1tUaGlzLT5IYW5kbGUgLSAxXS5wdHIgPSBOVUxMOwogICAgICAgICAgICBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW1RoaXMtPkhhbmRsZSAtIDFdLnR5cGUgPSBERHJhd0hhbmRsZV9Vbmtub3duOwogICAgICAgIH0KCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwgTWV0aG9kcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWw6OkluaXRpYWxpemUKICoKICogQSBuby1vcCBpbml0aWFsaXphdGlvbgogKgogKiBQYXJhbXM6CiAqICBEaXJlY3QzRDogUG9pbnRlciB0byBhIERpcmVjdDNEIGludGVyZmFjZQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9Jbml0aWFsaXplKElEaXJlY3QzRE1hdGVyaWFsICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRCAqRGlyZWN0M0QpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVwKSBuby1vcC4uLiFcbiIsIFRoaXMsIERpcmVjdDNEKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWw6OlJlc2VydmUKICoKICogRGlyZWN0WCA1IHNkazogIlRoZSBJRGlyZWN0M0RNYXRlcmlhbDI6OlJlc2VydmUgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCIKICogT2RkLiBUaGV5IHNlZW0gdG8gaGF2ZSBtaXhlZCB0aGVpciBpbnRlcmZhY2VzLgogKgogKiBSZXR1cm5zOgogKiAgRERFUlJfVU5TVVBQT1JURUQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX1Jlc2VydmUoSURpcmVjdDNETWF0ZXJpYWwgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCkgbm90IGltcGxlbWVudGVkXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDo6VW5yZXNlcnZlCiAqCiAqIE5vdCBzdXBwb3J0ZWQgdG9vCiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfVW5yZXNlcnZlKElEaXJlY3QzRE1hdGVyaWFsICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIG5vdCBpbXBsZW1lbnRlZC5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsMzo6U2V0TWF0ZXJpYWwKICoKICogU2V0cyB0aGUgbWF0ZXJpYWwgZGVzY3JpcHRpb24KICoKICogUGFyYW1zOgogKiAgTWF0OiBNYXRlcmlhbCB0byBzZXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIE1hdCBpcyBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9TZXRNYXRlcmlhbChJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUwgKmxwTWF0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwTWF0KTsKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkKICAgICAgICBkdW1wX21hdGVyaWFsKGxwTWF0KTsKCiAgICAvKiBTdG9yZXMgdGhlIG1hdGVyaWFsICovCiAgICBtZW1zZXQoJlRoaXMtPm1hdCwgMCwgc2l6ZW9mKFRoaXMtPm1hdCkpOwogICAgbWVtY3B5KCZUaGlzLT5tYXQsIGxwTWF0LCBscE1hdC0+ZHdTaXplKTsKICAgIAogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpHZXRNYXRlcmlhbAogKgogKiBSZXR1cm5zIHRoZSBtYXRlcmlhbCBhc3NpZ25lZCB0byB0aGlzIGludGVyZmFjZQogKgogKiBQYXJhbXM6CiAqICBNYXQ6IFBvaW50ZXIgdG8gYSBEM0RNQVRFUklBTCBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIG1hdGVyaWFsIGRlc2NyaXB0aW9uCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXQgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0TWF0ZXJpYWwoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVEVSSUFMICpscE1hdCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgIERXT1JEIGR3U2l6ZTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscE1hdCk7CiAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKICAgICAgICBUUkFDRSgiICBSZXR1cm5pbmcgbWF0ZXJpYWwgOiAiKTsKICAgICAgICBkdW1wX21hdGVyaWFsKCZUaGlzLT5tYXQpOwogICAgfQoKICAgIC8qIENvcGllcyB0aGUgbWF0ZXJpYWwgc3RydWN0dXJlICovCiAgICBkd1NpemUgPSBscE1hdC0+ZHdTaXplOwogICAgbWVtc2V0KGxwTWF0LCAwLCBkd1NpemUpOwogICAgbWVtY3B5KGxwTWF0LCAmVGhpcy0+bWF0LCBkd1NpemUpOwoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsMzo6R2V0SGFuZGxlCiAqCiAqIFJldHVybnMgYSBoYW5kbGUgZm9yIHRoZSBtYXRlcmlhbCBpbnRlcmZhY2UuIFRoZSBoYW5kbGUgaXMgc2ltcGx5IGEKICogcG9pbnRlciB0byB0aGUgbWF0ZXJpYWwgaW1wbGVtZW50YXRpb24KICoKICogUGFyYW1zOgogKiAgRGlyZWN0M0REZXZpY2UzOiBUaGUgZGV2aWNlIHRoaXMgaGFuZGxlIGlzIGFzc2lnbmVkIHRvCiAqICBIYW5kbGU6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIGhhbmRsZSB0bwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgSGFuZGxlIGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX0dldEhhbmRsZShJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTMgKmxwRGlyZWN0M0REZXZpY2UzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVEVSSUFMSEFORExFICpscEhhbmRsZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKmRldmljZSA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGxwRGlyZWN0M0REZXZpY2UzKTsKICAgIFRSQUNFKCIoJXAvJXApLT4oJXAsJXApXG4iLCBUaGlzLCBpZmFjZSwgZGV2aWNlLCBscEhhbmRsZSk7CgogICAgVGhpcy0+YWN0aXZlX2RldmljZSA9IGRldmljZTsKICAgIGlmKCFUaGlzLT5IYW5kbGUpCiAgICB7CiAgICAgICAgVGhpcy0+SGFuZGxlID0gSURpcmVjdDNERGV2aWNlSW1wbF9DcmVhdGVIYW5kbGUoZGV2aWNlKTsKICAgICAgICBpZighVGhpcy0+SGFuZGxlKQogICAgICAgIHsKICAgICAgICAgICAgRVJSKCJFcnJvciBjcmVhdGluZyBhIGhhbmRsZVxuIik7CiAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOyAgIC8qIFVuY2hlY2tlZCAqLwogICAgICAgIH0KICAgICAgICBkZXZpY2UtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0ucHRyID0gVGhpczsKICAgICAgICBkZXZpY2UtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0udHlwZSA9IEREcmF3SGFuZGxlX01hdGVyaWFsOwogICAgfQogICAgKmxwSGFuZGxlID0gVGhpcy0+SGFuZGxlOwogICAgVFJBQ0UoIiByZXR1cm5pbmcgaGFuZGxlICUwOGx4LlxuIiwgKmxwSGFuZGxlKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfR2V0SGFuZGxlKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UsCgkJCQkJTFBESVJFQ1QzRERFVklDRTIgbHBEaXJlY3QzRERldmljZTIsCgkJCQkJTFBEM0RNQVRFUklBTEhBTkRMRSBscEhhbmRsZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRGlyZWN0M0REZXZpY2UyLCBscEhhbmRsZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0dldEhhbmRsZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAoJCQkJCUNPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UyLCBJRGlyZWN0M0REZXZpY2UzLCBscERpcmVjdDNERGV2aWNlMiksCgkJCQkJbHBIYW5kbGUpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0SGFuZGxlKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSwKCQkJCQlMUERJUkVDVDNEREVWSUNFIGxwRGlyZWN0M0REZXZpY2UsCgkJCQkJTFBEM0RNQVRFUklBTEhBTkRMRSBscEhhbmRsZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwRGlyZWN0M0REZXZpY2UsIGxwSGFuZGxlKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfR2V0SGFuZGxlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKCQkJCQlDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBJRGlyZWN0M0REZXZpY2UzLCBscERpcmVjdDNERGV2aWNlKSwKCQkJCQlscEhhbmRsZSk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9RdWVyeUludGVyZmFjZShMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnApOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcywlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYnApOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19RdWVyeUludGVyZmFjZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9icCk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfQWRkUmVmKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9BZGRSZWYoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9SZWxlYXNlKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1JlbGVhc2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUmVsZWFzZShMUERJUkVDVDNETUFURVJJQUwgaWZhY2UpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1JlbGVhc2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1NldE1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFURVJJQUwgbHBNYXQpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscE1hdCk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1NldE1hdGVyaWFsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWF0KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1NldE1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfU2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE1hdCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVEVSSUFMIGxwTWF0KQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19HZXRNYXRlcmlhbChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE1hdCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9HZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFURVJJQUwgbHBNYXQpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscE1hdCk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0dldE1hdGVyaWFsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBNYXQpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG1hdGVyaWFsX2FjdGl2YXRlCiAqCiAqIFVzZXMgSURpcmVjdDNERGV2aWNlNzo6U2V0TWF0ZXJpYWwgdG8gYWN0aXZhdGUgdGhlIG1hdGVyaWFsCiAqCiAqIFBhcmFtczoKICogIFRoaXM6IFBvaW50ZXIgdG8gdGhlIG1hdGVyaWFsIGltcGxlbWVudGF0aW9uIHRvIGFjdGl2YXRlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBtYXRlcmlhbF9hY3RpdmF0ZShJRGlyZWN0M0RNYXRlcmlhbEltcGwqIFRoaXMpCnsKICAgIEQzRE1BVEVSSUFMNyBkM2Q3bWF0OwoKICAgIFRSQUNFKCJBY3RpdmF0aW5nIG1hdGVyaWFsICVwXG4iLCBUaGlzKTsKICAgIGQzZDdtYXQudS5kaWZmdXNlID0gVGhpcy0+bWF0LnUuZGlmZnVzZTsKICAgIGQzZDdtYXQudTEuYW1iaWVudCA9IFRoaXMtPm1hdC51MS5hbWJpZW50OwogICAgZDNkN21hdC51Mi5zcGVjdWxhciA9IFRoaXMtPm1hdC51Mi5zcGVjdWxhcjsKICAgIGQzZDdtYXQudTMuZW1pc3NpdmUgPSBUaGlzLT5tYXQudTMuZW1pc3NpdmU7CiAgICBkM2Q3bWF0LnU0LnBvd2VyID0gVGhpcy0+bWF0LnU0LnBvd2VyOwoKICAgIElEaXJlY3QzRERldmljZTdfU2V0TWF0ZXJpYWwoSUNPTV9JTlRFUkZBQ0UoVGhpcy0+YWN0aXZlX2RldmljZSwgSURpcmVjdDNERGV2aWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkM2Q3bWF0KTsKfQoKY29uc3QgSURpcmVjdDNETWF0ZXJpYWwzVnRibCBJRGlyZWN0M0RNYXRlcmlhbDNfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfUXVlcnlJbnRlcmZhY2UsCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfQWRkUmVmLAogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRE1hdGVyaWFsMyBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9TZXRNYXRlcmlhbCwKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9HZXRNYXRlcmlhbCwKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9HZXRIYW5kbGUsCn07Cgpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDJWdGJsIElEaXJlY3QzRE1hdGVyaWFsMl9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNETWF0ZXJpYWwyIE1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfU2V0TWF0ZXJpYWwsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRNYXRlcmlhbCwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX0dldEhhbmRsZSwKfTsKCmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsVnRibCBJRGlyZWN0M0RNYXRlcmlhbF9WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNETWF0ZXJpYWwxIE1ldGhvZHMgKioqLwogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX0luaXRpYWxpemUsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9TZXRNYXRlcmlhbCwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0dldE1hdGVyaWFsLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0SGFuZGxlLAogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1Jlc2VydmUsCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfVW5yZXNlcnZlCn07Cg==