Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gDQovLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCi8vDQoNCnVzaW5nIFN5c3RlbTsNCnVzaW5nIFN5c3RlbS5JTzsNCnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCg0KbmFtZXNwYWNlIERvdFpMaWINCnsNCgkvLy8gPHN1bW1hcnk+DQoJLy8vIEltcGxlbWVudHMgYSBjb21wcmVzc2VkIDxzZWUgY3JlZj0iU3RyZWFtIi8+LCBpbiBHWmlwICguZ3opIGZvcm1hdC4NCgkvLy8gPC9zdW1tYXJ5Pg0KCXB1YmxpYyBjbGFzcyBHWmlwU3RyZWFtIDogU3RyZWFtLCBJRGlzcG9zYWJsZQ0KCXsNCiAgICAgICAgI3JlZ2lvbiBEbGwgSW1wb3J0cw0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gSW50UHRyIGd6b3BlbihzdHJpbmcgbmFtZSwgc3RyaW5nIG1vZGUpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnemNsb3NlKEludFB0ciBnekZpbGUpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnendyaXRlKEludFB0ciBnekZpbGUsIGludCBkYXRhLCBpbnQgbGVuZ3RoKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3pyZWFkKEludFB0ciBnekZpbGUsIGludCBkYXRhLCBpbnQgbGVuZ3RoKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZ3pnZXRjKEludFB0ciBnekZpbGUpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIGludCBnenB1dGMoSW50UHRyIGd6RmlsZSwgaW50IGMpOw0KDQogICAgICAgICNlbmRyZWdpb24NCg0KICAgICAgICAjcmVnaW9uIFByaXZhdGUgZGF0YQ0KICAgICAgICBwcml2YXRlIEludFB0ciBfZ3pGaWxlOw0KICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQgPSBmYWxzZTsNCiAgICAgICAgcHJpdmF0ZSBib29sIF9pc1dyaXRpbmc7DQogICAgICAgICNlbmRyZWdpb24NCg0KICAgICAgICAjcmVnaW9uIENvbnN0cnVjdG9ycw0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IGZpbGUgYXMgYSB3cml0ZWFibGUgR1ppcFN0cmVhbQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVOYW1lIj5UaGUgbmFtZSBvZiB0aGUgY29tcHJlc3NlZCBmaWxlIHRvIGNyZWF0ZTwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPlRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2Ugd2hlbiBhZGRpbmcgZGF0YTwvcGFyYW0+DQogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IlpMaWJFeGNlcHRpb24iPklmIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbnRlcm5hbCB6bGliIGZ1bmN0aW9uPC9leGNlcHRpb24+DQoJCXB1YmxpYyBHWmlwU3RyZWFtKHN0cmluZyBmaWxlTmFtZSwgQ29tcHJlc3NMZXZlbCBsZXZlbCkNCgkJew0KICAgICAgICAgICAgX2lzV3JpdGluZyA9IHRydWU7DQogICAgICAgICAgICBfZ3pGaWxlID0gZ3pvcGVuKGZpbGVOYW1lLCBTdHJpbmcuRm9ybWF0KCJ3YnswfSIsIChpbnQpbGV2ZWwpKTsNCiAgICAgICAgICAgIGlmIChfZ3pGaWxlID09IEludFB0ci5aZXJvKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKC0xLCAiQ291bGQgbm90IG9wZW4gIiArIGZpbGVOYW1lKTsNCgkJfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIE9wZW5zIGFuIGV4aXN0aW5nIGZpbGUgYXMgYSByZWFkYWJsZSBHWmlwU3RyZWFtDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmlsZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW48L3BhcmFtPg0KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJaTGliRXhjZXB0aW9uIj5JZiBhbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgaW50ZXJuYWwgemxpYiBmdW5jdGlvbjwvZXhjZXB0aW9uPg0KICAgICAgICBwdWJsaWMgR1ppcFN0cmVhbShzdHJpbmcgZmlsZU5hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIF9pc1dyaXRpbmcgPSBmYWxzZTsNCiAgICAgICAgICAgIF9nekZpbGUgPSBnem9wZW4oZmlsZU5hbWUsICJyYiIpOw0KICAgICAgICAgICAgaWYgKF9nekZpbGUgPT0gSW50UHRyLlplcm8pDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpMaWJFeGNlcHRpb24oLTEsICJDb3VsZCBub3Qgb3BlbiAiICsgZmlsZU5hbWUpOw0KDQogICAgICAgIH0NCiAgICAgICAgI2VuZHJlZ2lvbg0KDQogICAgICAgICNyZWdpb24gQWNjZXNzIHByb3BlcnRpZXMNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gUmV0dXJucyB0cnVlIG9mIHRoaXMgc3RyZWFtIGNhbiBiZSByZWFkIGZyb20sIGZhbHNlIG90aGVyd2lzZQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5SZWFkDQogICAgICAgIHsNCiAgICAgICAgICAgIGdldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAhX2lzV3JpdGluZzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIA0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFJldHVybnMgZmFsc2UuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhblNlZWsNCiAgICAgICAgew0KICAgICAgICAgICAgZ2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRzcmVhbSBpcyB3cml0ZWFibGUsIGZhbHNlIG90aGVyd2lzZQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBDYW5Xcml0ZQ0KICAgICAgICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gX2lzV3JpdGluZzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAjZW5kcmVnaW9uDQogICAgDQogICAgICAgICNyZWdpb24gRGVzdHJ1Y3RvciAmIElEaXNwb3NlIHN0dWZmDQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gRGVzdHJveXMgdGhpcyBpbnN0YW5jZQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICB+R1ppcFN0cmVhbSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNsZWFuVXAoZmFsc2UpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gQ2xvc2VzIHRoZSBleHRlcm5hbCBmaWxlIGhhbmRsZQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkNCiAgICAgICAgew0KICAgICAgICAgICAgY2xlYW5VcCh0cnVlKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIERvZXMgdGhlIGFjdHVhbCBjbG9zaW5nIG9mIHRoZSBmaWxlIGhhbmRsZS4NCiAgICAgICAgcHJpdmF0ZSB2b2lkIGNsZWFuVXAoYm9vbCBpc0Rpc3Bvc2luZykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBnemNsb3NlKF9nekZpbGUpOw0KICAgICAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAjZW5kcmVnaW9uDQogICAgDQogICAgICAgICNyZWdpb24gQmFzaWMgcmVhZGluZyBhbmQgd3JpdGluZw0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBBdHRlbXB0cyB0byByZWFkIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJidWZmZXIiPlRoZSBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcjwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGRlc3RpbmF0aW9uIGJ5dGUgaW4gPGM+YnVmZmVyPC9jPjwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkPC9wYXJhbT4NCiAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZDwvcmV0dXJucz4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5JZiA8Yz5idWZmZXI8L2M+IGlzIG51bGw8L2V4Y2VwdGlvbj4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5JZiA8Yz5jb3VudDwvYz4gb3IgPGM+b2Zmc2V0PC9jPiBhcmUgbmVnYXRpdmU8L2V4Y2VwdGlvbj4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPklmIDxjPm9mZnNldDwvYz4gICsgPGM+Y291bnQ8L2M+IGlzICZndDsgYnVmZmVyLkxlbmd0aDwvZXhjZXB0aW9uPg0KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJOb3RTdXBwb3J0ZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGlzIG5vdCByZWFkYWJsZS48L2V4Y2VwdGlvbj4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24iPklmIHRoaXMgc3RyZWFtIGhhcyBiZWVuIGRpc3Bvc2VkLjwvZXhjZXB0aW9uPg0KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIUNhblJlYWQpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigpOw0KICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7DQogICAgICAgICAgICBpZiAoKG9mZnNldCtjb3VudCkgPiBidWZmZXIuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIGlmIChfaXNEaXNwb3NlZCkgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJHWmlwU3RyZWFtIik7DQoNCiAgICAgICAgICAgIEdDSGFuZGxlIGggPSBHQ0hhbmRsZS5BbGxvYyhidWZmZXIsIEdDSGFuZGxlVHlwZS5QaW5uZWQpOw0KICAgICAgICAgICAgaW50IHJlc3VsdDsNCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IGd6cmVhZChfZ3pGaWxlLCBoLkFkZHJPZlBpbm5lZE9iamVjdCgpLlRvSW50MzIoKSArIG9mZnNldCwgY291bnQpOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpbmFsbHkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBoLkZyZWUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgICAgIH0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBBdHRlbXB0cyB0byByZWFkIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHJldHVybnM+VGhlIGJ5dGUgdGhhdCB3YXMgcmVhZCwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvciBvciBFbmQtT2YtRmlsZTwvcmV0dXJucz4NCiAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkQnl0ZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICghQ2FuUmVhZCkgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsNCiAgICAgICAgICAgIHJldHVybiBnemdldGMoX2d6RmlsZSk7DQogICAgICAgIH0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBXcml0ZXMgYSBudW1iZXIgb2YgYnl0ZXMgdG8gdGhlIHN0cmVhbQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJ1ZmZlciI+PC9wYXJhbT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPjwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY291bnQiPjwvcGFyYW0+DQogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+SWYgPGM+YnVmZmVyPC9jPiBpcyBudWxsPC9leGNlcHRpb24+DQogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiI+SWYgPGM+Y291bnQ8L2M+IG9yIDxjPm9mZnNldDwvYz4gYXJlIG5lZ2F0aXZlPC9leGNlcHRpb24+DQogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5JZiA8Yz5vZmZzZXQ8L2M+ICArIDxjPmNvdW50PC9jPiBpcyAmZ3Q7IGJ1ZmZlci5MZW5ndGg8L2V4Y2VwdGlvbj4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3Qgd3JpdGVhYmxlLjwvZXhjZXB0aW9uPg0KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJPYmplY3REaXNwb3NlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaGFzIGJlZW4gZGlzcG9zZWQuPC9leGNlcHRpb24+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKCFDYW5Xcml0ZSkgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQogICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGJ1ZmZlci5MZW5ndGgpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigpOw0KICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKSB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIkdaaXBTdHJlYW0iKTsNCg0KICAgICAgICAgICAgR0NIYW5kbGUgaCA9IEdDSGFuZGxlLkFsbG9jKGJ1ZmZlciwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gZ3p3cml0ZShfZ3pGaWxlLCBoLkFkZHJPZlBpbm5lZE9iamVjdCgpLlRvSW50MzIoKSArIG9mZnNldCwgY291bnQpOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQ0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpbmFsbHkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBoLkZyZWUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIHRoZSBzdHJlYW0NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIGJ5dGUgdG8gYWRkIHRvIHRoZSBzdHJlYW0uPC9wYXJhbT4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5JZiB0aGlzIHN0cmVhbSBpcyBub3Qgd3JpdGVhYmxlLjwvZXhjZXB0aW9uPg0KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJPYmplY3REaXNwb3NlZEV4Y2VwdGlvbiI+SWYgdGhpcyBzdHJlYW0gaGFzIGJlZW4gZGlzcG9zZWQuPC9leGNlcHRpb24+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIHZhbHVlKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIUNhbldyaXRlKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQogICAgICAgICAgICBpZiAoX2lzRGlzcG9zZWQpIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiR1ppcFN0cmVhbSIpOw0KDQogICAgICAgICAgICBpbnQgcmVzdWx0ID0gZ3pwdXRjKF9nekZpbGUsIChpbnQpdmFsdWUpOw0KICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApDQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7DQogICAgICAgIH0NCiAgICAgICAgI2VuZHJlZ2lvbg0KDQogICAgICAgICNyZWdpb24gUG9zaXRpb24gJiBsZW5ndGggc3R1ZmYNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gTm90IHN1cHBvcnRlZC4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChsb25nIHZhbHVlKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7DQogICAgICAgIH0NCiAgICANCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gIE5vdCBzdXBwcG9ydGVkLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+PC9wYXJhbT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcmlnaW4iPjwvcGFyYW0+DQogICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+DQogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+QWx3YXlzIHRocm93bjwvZXhjZXB0aW9uPg0KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBTZWVrKGxvbmcgb2Zmc2V0LCBTZWVrT3JpZ2luIG9yaWdpbikNCiAgICAgICAgew0KICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KICAgICAgICB9DQogICAgDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEZsdXNoZXMgdGhlIDxjPkdaaXBTdHJlYW08L2M+Lg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHJlbWFya3M+SW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBUaGlzIGlzIGJlY2F1c2UgZXhjZXNzaXZlDQogICAgICAgIC8vLyBmbHVzaGluZyBtYXkgZGVncmFkZSB0aGUgYWNoaWV2YWJsZSBjb21wcmVzc2lvbiByYXRlcy48L3JlbWFya3M+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkNCiAgICAgICAgew0KICAgICAgICAgICAgLy8gbGVmdCBlbXB0eSBvbiBwdXJwb3NlDQogICAgICAgIH0NCiAgICANCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSA8Yz5HWmlwU3RyZWFtPC9jPi4gTm90IHN1cHBwb3J0ZWQuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cmVtYXJrcz5JbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZDwvcmVtYXJrcz4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iTm90U3VwcG9ydGVkRXhjZXB0aW9uIj5BbHdheXMgdGhyb3duPC9leGNlcHRpb24+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFBvc2l0aW9uDQogICAgICAgIHsNCiAgICAgICAgICAgIGdldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIA0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBHZXRzIHRoZSBzaXplIG9mIHRoZSBzdHJlYW0uIE5vdCBzdXBwcG9ydGVkLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHJlbWFya3M+SW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQ8L3JlbWFya3M+DQogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9Ik5vdFN1cHBvcnRlZEV4Y2VwdGlvbiI+QWx3YXlzIHRocm93bjwvZXhjZXB0aW9uPg0KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgNCiAgICAgICAgew0KICAgICAgICAgICAgZ2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgICNlbmRyZWdpb24NCiAgICB9DQp9DQo=