LyoKICogJElkJAogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KQFJFVEAJCUZjUGF0dGVybiAqCQpARlVOQ0AJCUZjUGF0dGVybkNyZWF0ZQpAVFlQRTFAIAl2b2lkCkBQVVJQT1NFQAlDcmVhdGUgYSBwYXR0ZXJuCkBERVNDQApDcmVhdGVzIGEgcGF0dGVybiB3aXRoIG5vIHByb3BlcnRpZXM7IHVzZWQgdG8gYnVpbGQgcGF0dGVybnMgZnJvbSBzY3JhdGNoLgpAQAoKQFJFVEAJCXZvaWQKQEZVTkNACQlGY1BhdHRlcm5EZXN0cm95CkBUWVBFMUAJCUZjUGF0dGVybiAqIAkJCUBBUkcxQAkJIHAKQFBVUlBPU0VACURlc3Ryb3kgYSBwYXR0ZXJuCkBERVNDQApEZXN0cm95cyBhIHBhdHRlcm4sIGluIHRoZSBwcm9jZXNzIGRlc3Ryb3lpbmcgYWxsIHJlbGF0ZWQgdmFsdWVzLgpAQAoKQFJFVEAJCUZjQm9vbApARlVOQ0AJCUZjUGF0dGVybkVxdWFsCkBUWVBFMUAgCWNvbnN0IEZjUGF0dGVybiAqCQlAQVJHMUAgCQlwYQpAVFlQRTJACQljb25zdCBGY1BhdHRlcm4gKiAJCUBBUkcyQAkJcGIgCkBQVVJQT1NFQAlDb21wYXJlIHBhdHRlcm5zCkBERVNDQApSZXR1cm5zIHdoZXRoZXIgPHBhcmFtZXRlcj5wYTwvcGFyYW1ldGVyPiBhbmQgPHBhcmFtZXRlcj5wYjwvcGFyYW1ldGVyPiBhcmUgZXhhY3RseSBhbGlrZS4KQEAKCkBSRVRACQlGY0Jvb2wKQEZVTkNACQlGY1BhdHRlcm5FcXVhbFN1YnNldApAVFlQRTFACQljb25zdCBGY1BhdHRlcm4gKiAJCUBBUkcxQCAJCXBhCkBUWVBFMkAJCWNvbnN0IEZjUGF0dGVybiAqCQlAQVJHMkAgCQlwYgpAVFlQRTNAIAljb25zdCBGY09iamVjdFNldCAqIAkJQEFSRzNAIAkJb3MgCkBQVVJQT1NFQAlDb21wYXJlIHBvcnRpb25zIG9mIHBhdHRlcm5zCkBERVNDQApSZXR1cm5zIHdoZXRoZXIgPHBhcmFtZXRlcj5wYTwvcGFyYW1ldGVyPiBhbmQgPHBhcmFtZXRlcj5wYjwvcGFyYW1ldGVyPiBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdmFsdWVzIGZvciBhbGwgb2YgdGhlCm9iamVjdHMgaW4gPHBhcmFtZXRlcj5vczwvcGFyYW1ldGVyPi4KQEAKCkBSRVRACQlGY0NoYXIzMgpARlVOQ0AJCUZjUGF0dGVybkhhc2gKQFRZUEUxQAkJY29uc3QgRmNQYXR0ZXJuICoJCUBBUkcxQAkJcApAUFVSUE9TRUAJQ29tcHV0ZSBhIHBhdHRlcm4gaGFzaCB2YWx1ZQpAREVTQ0AKUmV0dXJucyBhIDMyLWJpdCBudW1iZXIgd2hpY2ggaXMgdGhlIHNhbWUgZm9yIGFueSB0d28gcGF0dGVybnMgd2hpY2ggYXJlCmVxdWFsLgpAQAoKQFJFVEAJCUZjQm9vbApARlVOQ0AJCUZjUGF0dGVybkFkZApAVFlQRTFACQlGY1BhdHRlcm4gKiAJCQlAQVJHMUAgCQlwCkBUWVBFMkAgCWNvbnN0IGNoYXIgKgkJCUBBUkcyQCAJCW9iamVjdApAVFlQRTNACQlGY1ZhbHVlCQkJCUBBUkczQAkJdmFsdWUKQFRZUEU0QAkJRmNCb29sCQkJCUBBUkc0QAkJYXBwZW5kIApAUFVSUE9TRUAJQWRkIGEgdmFsdWUgdG8gYSBwYXR0ZXJuCkBERVNDQApBZGRzIGEgc2luZ2xlIHZhbHVlIHRvIHRoZSBsaXN0IG9mIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG5hbWVkCmBvYmplY3Q8cGFyYW1ldGVyPi4gIElmIGBhcHBlbmQ8L3BhcmFtZXRlcj4gaXMgRmNUcnVlLCB0aGUgdmFsdWUgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiBhbnkKZXhpc3RpbmcgbGlzdCwgb3RoZXJ3aXNlIGl0IGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbmluZy4gIGB2YWx1ZScgaXMgc2F2ZWQKKHdpdGggRmNWYWx1ZVNhdmUpIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgcGF0dGVybiBzbyB0aGF0IHRoZSBsaWJyYXJ5CnJldGFpbnMgbm8gcmVmZXJlbmNlIHRvIGFueSBhcHBsaWNhdGlvbi1zdXBwbGllZCBkYXRhIHN0cnVjdHVyZS4KQEAKCkBSRVRACQlGY0Jvb2wKQEZVTkNACQlGY1BhdHRlcm5BZGRXZWFrCkBUWVBFMUAgCUZjUGF0dGVybiAqIAkJCUBBUkcxQCAJCXAKQFRZUEUyQCAJY29uc3QgY2hhciAqIAkJCUBBUkcyQCAJCW9iamVjdApAVFlQRTNAIAlGY1ZhbHVlICAJCQlAQVJHM0AgCQl2YWx1ZQpAVFlQRTRAIAlGY0Jvb2wgIAkJCUBBUkc0QAkJYXBwZW5kIApAUFVSUE9TRUAJQWRkIGEgdmFsdWUgdG8gYSBwYXR0ZXJuIHdpdGggd2VhayBiaW5kaW5nCkBERVNDQApGY1BhdHRlcm5BZGRXZWFrIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIEZjUGF0dGVybkFkZCBleGNlcHQgdGhhdCBhbnkKdmFsdWVzIGFkZGVkIHRvIHRoZSBsaXN0IGhhdmUgYmluZGluZyA8cGFyYW1ldGVyPndlYWs8L3BhcmFtZXRlcj4gaW5zdGVhZCBvZiA8cGFyYW1ldGVyPnN0cm9uZzwvcGFyYW1ldGVyPi4KQEAKCkBUSVRMRUAJCUZjUGF0dGVybkFkZC1UeXBlCkBSRVRACQlGY0Jvb2wKQEZVTkNACQlGY1BhdHRlcm5BZGRJbnRlZ2VyCkBUWVBFMUAgCUZjUGF0dGVybiAqIAkJCUBBUkcxQCAJCXAKQFRZUEUyQAkJY29uc3QgY2hhciAqCQkJQEFSRzJACQlvYmplY3QKQFRZUEUzQAkJaW50CQkJCUBBUkczQAkJaQoKQFBST1RPVFlQRStACkBSRVQrQAkJRmNCb29sCkBGVU5DK0AJCUZjUGF0dGVybkFkZERvdWJsZQpAVFlQRTErQCAJRmNQYXR0ZXJuICogCQkJQEFSRzErQCAJcApAVFlQRTIrQAljb25zdCBjaGFyICoJCQlAQVJHMitACQlvYmplY3QKQFRZUEUzK0AJZG91YmxlCQkJCUBBUkczK0AJCWQKCkBQUk9UT1RZUEUrK0AKQFJFVCsrQAkJRmNCb29sCkBGVU5DKytACUZjUGF0dGVybkFkZFN0cmluZwpAVFlQRTErK0AgCUZjUGF0dGVybiAqIAkJCUBBUkcxKytAIAlwCkBUWVBFMisrQAljb25zdCBjaGFyICoJCQlAQVJHMisrQAlvYmplY3QKQFRZUEUzKytACWNvbnN0IGNoYXIgKgkJCUBBUkczKytACXMKCkBQUk9UT1RZUEUrKytACkBSRVQrKytACUZjQm9vbApARlVOQysrK0AJRmNQYXR0ZXJuQWRkTWF0cml4CkBUWVBFMSsrK0AgCUZjUGF0dGVybiAqIAkJCUBBUkcxKysrQCAJcApAVFlQRTIrKytACWNvbnN0IGNoYXIgKgkJCUBBUkcyKysrQAlvYmplY3QKQFRZUEUzKysrQAljb25zdCBGY01hdHJpeCAqCQlAQVJHMysrK0AJbQoKQFBST1RPVFlQRSsrKytACkBSRVQrKysrQAlGY0Jvb2wKQEZVTkMrKysrQAlGY1BhdHRlcm5BZGRDaGFyU2V0CkBUWVBFMSsrKytAIAlGY1BhdHRlcm4gKiAJCQlAQVJHMSsrKytAIAlwCkBUWVBFMisrKytACWNvbnN0IGNoYXIgKgkJCUBBUkcyKysrK0AJb2JqZWN0CkBUWVBFMysrKytACWNvbnN0IEZjQ2hhclNldCAqCQlAQVJHMysrKytACWMKCkBQUk9UT1RZUEUrKysrK0AKQFJFVCsrKysrQAlGY0Jvb2wKQEZVTkMrKysrK0AJRmNQYXR0ZXJuQWRkQm9vbApAVFlQRTErKysrK0AgCUZjUGF0dGVybiAqIAkJCUBBUkcxKysrKytAIAlwCkBUWVBFMisrKysrQAljb25zdCBjaGFyICoJCQlAQVJHMisrKysrQAlvYmplY3QKQFRZUEUzKysrKytACUZjQm9vbAkJCQlAQVJHMysrKysrQAliCkBQVVJQT1NFQAlBZGQgYSB0eXBlZCB2YWx1ZSB0byBhIHBhdHRlcm4KQERFU0NAClRoZXNlIGFyZSBhbGwgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRoYXQgaW5zZXJ0IG9iamVjdHMgb2YgdGhlIHNwZWNpZmllZAp0eXBlIGludG8gdGhlIHBhdHRlcm4uICBVc2UgdGhlc2UgaW4gcHJlZmVyZW5jZSB0byBGY1BhdHRlcm5BZGQgYXMgdGhleQp3aWxsIHByb3ZpZGUgY29tcGlsZS10aW1lIHR5cGVjaGVja2luZy4gIFRoZXNlIGFsbCBhcHBlbmQgdmFsdWVzIHRvCmFueSBleGlzdGluZyBsaXN0IG9mIHZhbHVlcy4KQEAKCkBSRVRACQlGY1Jlc3VsdApARlVOQ0AJCUZjUGF0dGVybkdldApAVFlQRTFACQlGY1BhdHRlcm4gKgkJCUBBUkcxQAkJcApAVFlQRTJACQljb25zdCBjaGFyICoJCQlAQVJHMkAJCW9iamVjdApAVFlQRTNACQlpbnQgIAkJCQlAQVJHM0AgCQlpZApAVFlQRTRACQlGY1ZhbHVlICoJCQlAQVJHNEAJCXYgCkBQVVJQT1NFQAlSZXR1cm4gYSB2YWx1ZSBmcm9tIGEgcGF0dGVybgpAREVTQ0AKUmV0dXJucyBpbiBgdjxwYXJhbWV0ZXI+IHRoZSBgaWQ8L3BhcmFtZXRlcj50aCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGBvYmplY3QnLgpUaGUgdmFsdWUgcmV0dXJuZWQgaXMgbm90IGEgY29weSwgYnV0IHJhdGhlciByZWZlcnMgdG8gdGhlIGRhdGEgc3RvcmVkCndpdGhpbiB0aGUgcGF0dGVybiBkaXJlY3RseS4gIEFwcGxpY2F0aW9ucyBtdXN0IG5vdCBmcmVlIHRoaXMgdmFsdWUuCkBACgpAVElUTEVACQlGY1BhdHRlcm5HZXQtVHlwZQpAUFJPVE9UWVBFQApAUkVUQCAJCUZjUmVzdWx0CkBGVU5DQAkJRmNQYXR0ZXJuR2V0SW50ZWdlcgpAVFlQRTFACQlGY1BhdHRlcm4gKgkJCUBBUkcxQAkJcApAVFlQRTJACQljb25zdCBjaGFyICoJCQlAQVJHMkAJCW9iamVjdApAVFlQRTNACQlpbnQJCQkJQEFSRzNACQluCkBUWVBFNEAJCWludCAqCQkJCUBBUkc0QAkJaQoKQFBST1RPVFlQRStACkBSRVQrQAkJRmNSZXN1bHQKQEZVTkMrQCAJRmNQYXR0ZXJuR2V0RG91YmxlCkBUWVBFMStACUZjUGF0dGVybiAqCQkJQEFSRzErQAkJcApAVFlQRTIrQAljb25zdCBjaGFyICoJCQlAQVJHMitACQlvYmplY3QKQFRZUEUzK0AJaW50CQkJCUBBUkczK0AJCW4KQFRZUEU0K0AJZG91YmxlICoJCQlAQVJHNCtACQlkIAoKQFBST1RPVFlQRSsrQApAUkVUKytAIAlGY1Jlc3VsdApARlVOQysrQAlGY1BhdHRlcm5HZXRTdHJpbmcKQFRZUEUxKytACUZjUGF0dGVybiAqCQkJQEFSRzErK0AJcApAVFlQRTIrK0AJY29uc3QgY2hhciAqCQkJQEFSRzIrK0AJb2JqZWN0CkBUWVBFMysrQAlpbnQJCQkJQEFSRzMrK0AJbgpAVFlQRTQrK0AJY2hhciAqKmNvbnN0CQkJQEFSRzQrK0AJcwoKQFBST1RPVFlQRSsrK0AKQFJFVCsrK0AJRmNSZXN1bHQKQEZVTkMrKytACUZjUGF0dGVybkdldE1hdHJpeCAKQFRZUEUxKysrQCAJRmNQYXR0ZXJuICogCQkJQEFSRzErKytAIAlwIApAVFlQRTIrKytAIAljb25zdCBjaGFyICogCQkJQEFSRzIrKytAIAlvYmplY3QgCkBUWVBFMysrK0AgCWludCAgCQkJCUBBUkczKysrQCAJbiAKQFRZUEU0KysrQCAJRmNNYXRyaXggKiogCQkJQEFSRzQrKytAIAlzIAoKQFBST1RPVFlQRSsrKytACkBSRVQrKysrQCAJRmNSZXN1bHQgCkBGVU5DKysrK0AgCUZjUGF0dGVybkdldENoYXJTZXQgCkBUWVBFMSsrKytAIAlGY1BhdHRlcm4gKiAJCQlAQVJHMSsrKytAIAlwIApAVFlQRTIrKysrQCAJY29uc3QgY2hhciAqIAkJCUBBUkcyKysrK0AgCW9iamVjdCAKQFRZUEUzKysrK0AgCWludCAgCQkJCUBBUkczKysrK0AgCW4gCkBUWVBFNCsrKytAIAlGY0NoYXJTZXQgKiogCQkJQEFSRzQrKysrQCAJYyAKCkBQUk9UT1RZUEUrKysrK0AKQFJFVCsrKysrQCAJRmNSZXN1bHQgCkBGVU5DKysrKytAIAlGY1BhdHRlcm5HZXRCb29sIAkJCkBUWVBFMSsrKysrQCAJRmNQYXR0ZXJuICogCQkJQEFSRzErKysrK0AgCXAKQFRZUEUyKysrKytAIAljb25zdCBjaGFyICogCQkJQEFSRzIrKysrK0AgCW9iamVjdCAKQFRZUEUzKysrKytAIAlpbnQgIAkJCQlAQVJHMysrKysrQCAJbiAKQFRZUEU0KysrKytAIAlGY0Jvb2wgKiAJCQlAQVJHNCsrKysrQCAJYiAKQFBVUlBPU0VACVJldHVybiBhIHR5cGVkIHZhbHVlIGZyb20gYSBwYXR0ZXJuCkBERVNDQApUaGVzZSBhcmUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRoYXQgY2FsbCBGY1BhdHRlcm5HZXQgYW5kIHZlcmlmeSB0aGF0IHRoZQpyZXR1cm5lZCBkYXRhIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlLiBUaGV5IHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaCBpZgp0aGlzIGlzIG5vdCB0aGUgY2FzZS4gIE5vdGUgdGhhdCB0aGVzZSAobGlrZSBGY1BhdHRlcm5HZXQpIGRvIG5vdCBtYWtlIGEKY29weSBvZiBhbnkgZGF0YSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieSB0aGUgcmV0dXJuIHZhbHVlLiAgVXNlIHRoZXNlCmluIHByZWZlcmVuY2UgdG8gRmNQYXR0ZXJuR2V0IHRvIHByb3ZpZGUgY29tcGlsZS10aW1lIHR5cGVjaGVja2luZy4KQEAKCkBSRVRACQlGY1BhdHRlcm4gKgpARlVOQ0AJCUZjUGF0dGVybkJ1aWxkCkBUWVBFMUAJCUZjUGF0dGVybiAqCQkJQEFSRzFACQlvcmlnCkBUWVBFMkAgCS4uLgoKQFBST1RPVFlQRStACkBSRVQrQAkJRmNQYXR0ZXJuICoKQEZVTkMrQAkJRmNQYXR0ZXJuVmFCdWlsZApAVFlQRTErQAlGY1BhdHRlcm4gKgkJCUBBUkcxK0AJCW9yaWcKQFRZUEUyK0AJdmFfbGlzdCAJCQlAQVJHMitACQl2YQpAUFVSUE9TRUAJQ3JlYXRlIHBhdHRlcm5zIGZyb20gYXJndW1lbnRzCkBERVNDQApCdWlsZHMgYSBwYXR0ZXJuIHVzaW5nIGEgbGlzdCBvZiBvYmplY3RzLCB0eXBlcyBhbmQgdmFsdWVzLiAgRWFjaAp2YWx1ZSB0byBiZSBlbnRlcmVkIGluIHRoZSBwYXR0ZXJuIGlzIHNwZWNpZmllZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKPC9wYXJhPgo8b3JkZXJlZGxpc3Q+CjxsaXN0aXRlbT48cGFyYT4KT2JqZWN0IG5hbWUsIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb3BlcnR5IHRvIGJlIGFkZGVkLgo8L3BhcmE+PC9saXN0aXRlbT48bGlzdGl0ZW0+PHBhcmE+Ck9iamVjdCB0eXBlLCBvbmUgb2YgdGhlIEZjVHlwZSBlbnVtZXJhdGVkIHZhbHVlcwo8L3BhcmE+PC9saXN0aXRlbT48bGlzdGl0ZW0+PHBhcmE+ClZhbHVlLCBub3QgYW4gRmNWYWx1ZSwgYnV0IHRoZSByYXcgdHlwZSBhcyBwYXNzZWQgdG8gYW55IG9mIHRoZQpGY1BhdHRlcm5BZGQmbHQ7dHlwZSZndDsgZnVuY3Rpb25zLiAgTXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgc2Vjb25kCmFyZ3VtZW50Lgo8L3BhcmE+PC9saXN0aXRlbT4KPC9vcmRlcmVkbGlzdD4KPHBhcmE+ClRoZSBhcmd1bWVudCBsaXN0IGlzIHRlcm1pbmF0ZWQgYnkgYSBudWxsIG9iamVjdCBuYW1lLCBubyBvYmplY3QgdHlwZSBub3IKdmFsdWUgbmVlZCBiZSBwYXNzZWQgZm9yIHRoaXMuICBUaGUgdmFsdWVzIGFyZSBhZGRlZCB0byBgcGF0dGVybicsIGlmCmBwYXR0ZXJuJyBpcyBudWxsLCBhIG5ldyBwYXR0ZXJuIGlzIGNyZWF0ZWQuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHBhdHRlcm4gaXMKcmV0dXJuZWQuIEV4YW1wbGUKPC9wYXJhPgo8cHJvZ3JhbWxpc3Rpbmc+CnBhdHRlcm4gPSBGY1BhdHRlcm5CdWlsZCAoMCwgRkNfRkFNSUxZLCBGdFR5cGVTdHJpbmcsICJUaW1lcyIsIChjaGFyICopIDApOwo8L3Byb2dyYW1saXN0aW5nPgo8cGFyYT4KRmNQYXR0ZXJuVmFCdWlsZCBpcyB1c2VkIHdoZW4gdGhlIGFyZ3VtZW50cyBhcmUgYWxyZWFkeSBpbiB0aGUgZm9ybSBvZiBhCnZhcmFyZ3MgdmFsdWUuCkBACgpAUkVUQAkJRmNCb29sCkBGVU5DQAkJRmNQYXR0ZXJuRGVsCkBUWVBFMUAJCUZjUGF0dGVybiAqCQkJQEFSRzFACQlwCkBUWVBFMkAJCWNvbnN0IGNoYXIgKgkJCUBBUkcyQAkJb2JqZWN0IApAUFVSUE9TRUAJRGVsZXRlIGEgcHJvcGVydHkgZnJvbSBhIHBhdHRlcm4KQERFU0NACkRlbGV0ZXMgYWxsIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGBvYmplY3QnLCByZXR1cm5pbmcgCndoZXRoZXIgdGhlIHByb3BlcnR5IGV4aXN0ZWQgb3Igbm90LgpAQAoKQFJFVEAJCXZvaWQKQEZVTkNACQlGY1BhdHRlcm5QcmludApAVFlQRTFACQljb25zdCBGY1BhdHRlcm4gKgkJQEFSRzFACQlwIApAUFVSUE9TRUAJUHJpbnQgYSBwYXR0ZXJuIGZvciBkZWJ1Z2dpbmcKQERFU0NAClByaW50cyBhbiBlYXNpbHkgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgcGF0dGVybiB0byBzdGRvdXQuICBUaGVyZSBpcwpubyBwcm92aXNpb24gZm9yIHJlcGFyc2luZyBkYXRhIGluIHRoaXMgZm9ybWF0LCBpdCdzIGp1c3QgZm9yIGRpYWdub3N0aWNzCmFuZCBkZWJ1Z2dpbmcuCkBACgpAUkVUQAkJdm9pZCAJCkBGVU5DQAkJRmNEZWZhdWx0U3Vic3RpdHV0ZQpAVFlQRTFACQlGY1BhdHRlcm4gKgkJCUBBUkcxQAkJcGF0dGVybiAKQFBVUlBPU0VACVBlcmZvcm0gZGVmYXVsdCBzdWJzdGl0dXRpb25zIGluIGEgcGF0dGVybgpAREVTQ0AKU3VwcGxpZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIHVuZGVyc3BlY2lmaWVkIGZvbnQgcGF0dGVybnM6CjxpdGVtaXplZGxpc3Q+CjxsaXN0aXRlbT48cGFyYT4KUGF0dGVybnMgd2l0aG91dCBhIHNwZWNpZmllZCBzdHlsZSBvciB3ZWlnaHQgYXJlIHNldCB0byBNZWRpdW0KPC9wYXJhPjwvbGlzdGl0ZW0+CjxsaXN0aXRlbT48cGFyYT4KUGF0dGVybnMgd2l0aG91dCBhIHNwZWNpZmllZCBzdHlsZSBvciBzbGFudCBhcmUgc2V0IHRvIFJvbWFuCjwvcGFyYT48L2xpc3RpdGVtPgo8bGlzdGl0ZW0+PHBhcmE+ClBhdHRlcm5zIHdpdGhvdXQgYSBzcGVjaWZpZWQgcGl4ZWwgc2l6ZSBhcmUgZ2l2ZW4gb25lIGNvbXB1dGVkIGZyb20gYW55CnNwZWNpZmllZCBwb2ludCBzaXplIChkZWZhdWx0IDEyKSwgZHBpIChkZWZhdWx0IDc1KSBhbmQgc2NhbGUgKGRlZmF1bHQgMSkuCjwvcGFyYT48L2xpc3RpdGVtPgo8L2l0ZW1pemVkbGlzdD4KQEAKCkBSRVRACQlGY1BhdHRlcm4gKgpARlVOQ0AJCUZjTmFtZVBhcnNlCkBUWVBFMUAJCWNvbnN0IGNoYXIgKgkJCUBBUkcxQAkJbmFtZSAKQFBVUlBPU0VACVBhcnNlIGEgcGF0dGVybiBzdHJpbmcKQERFU0NACkNvbnZlcnRzIDxwYXJhbWV0ZXI+bmFtZTwvcGFyYW1ldGVyPiBmcm9tIHRoZSBzdGFuZGFyZCB0ZXh0IGZvcm1hdCBkZXNjcmliZWQgYWJvdmUgaW50byBhIHBhdHRlcm4uCkBACgpAUkVUQAkJRmNDaGFyOCAqCkBGVU5DQAkJRmNOYW1lVW5wYXJzZQpAVFlQRTFACQlGY1BhdHRlcm4gKgkJCUBBUkcxQAkJcGF0IApAUFVSUE9TRUAJQ29udmVydCBhIHBhdHRlcm4gYmFjayBpbnRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHBhcnNlZApAREVTQ0AKQ29udmVydHMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byB0aGUgc3RhbmRhcmQgdGV4dCBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlLgpUaGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBzdGF0aWMsIGJ1dCBpbnN0ZWFkIHJlZmVycyB0byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5CndoaWNoIHNob3VsZCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgpAQAo=