Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gDQovLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCi8vDQoNCnVzaW5nIFN5c3RlbTsNCnVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsNCnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCg0KbmFtZXNwYWNlIERvdFpMaWINCnsNCg0KICAgIC8vLyA8c3VtbWFyeT4NCiAgICAvLy8gSW1wbGVtZW50cyBhIGRhdGEgY29tcHJlc3NvciwgdXNpbmcgdGhlIGRlZmxhdGUgYWxnb3JpdGhtIGluIHRoZSBaTGliIGRsbA0KICAgIC8vLyA8L3N1bW1hcnk+DQoJcHVibGljIHNlYWxlZCBjbGFzcyBEZWZsYXRlciA6IENvZGVjQmFzZQ0KCXsNCiAgICAgICAgI3JlZ2lvbiBEbGwgaW1wb3J0cw0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCwgQ2hhclNldD1DaGFyU2V0LkFuc2kpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGRlZmxhdGVJbml0XyhyZWYgWlN0cmVhbSBzeiwgaW50IGxldmVsLCBzdHJpbmcgdnMsIGludCBzaXplKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZShyZWYgWlN0cmVhbSBzeiwgaW50IGZsdXNoKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZVJlc2V0KHJlZiBaU3RyZWFtIHN6KTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJaTElCMS5kbGwiLCBDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBpbnQgZGVmbGF0ZUVuZChyZWYgWlN0cmVhbSBzeik7DQogICAgICAgICNlbmRyZWdpb24NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+RGVmbGF0ZXI8L2M+DQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV2ZWwiPlRoZSBjb21wcmVzc2lvbiBsZXZlbCB0byB1c2UgZm9yIHRoaXMgPGM+RGVmbGF0ZXI8L2M+PC9wYXJhbT4NCgkJcHVibGljIERlZmxhdGVyKENvbXByZXNzTGV2ZWwgbGV2ZWwpIDogYmFzZSgpDQoJCXsNCiAgICAgICAgICAgIGludCByZXR2YWwgPSBkZWZsYXRlSW5pdF8ocmVmIF96dHJlYW0sIChpbnQpbGV2ZWwsIEluZm8uVmVyc2lvbiwgTWFyc2hhbC5TaXplT2YoX3p0cmVhbSkpOw0KICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGRlZmxhdGVyIik7DQoNCiAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQoJCX0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBBZGRzIG1vcmUgZGF0YSB0byB0aGUgY29kZWMgdG8gYmUgcHJvY2Vzc2VkLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPkJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBhZGRlZCB0byB0aGUgY29kZWM8L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGFkZCBmcm9tIDxjPmRhdGE8L2M+PC9wYXJhbT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQ8L3BhcmFtPg0KICAgICAgICAvLy8gPHJlbWFya3M+QWRkaW5nIGRhdGEgbWF5LCBvciBtYXkgbm90LCByYWlzZSB0aGUgPGM+RGF0YUF2YWlsYWJsZTwvYz4gZXZlbnQ8L3JlbWFya3M+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEFkZChieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCk7DQogICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGRhdGEuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaW50IHRvdGFsID0gY291bnQ7DQogICAgICAgICAgICBpbnQgaW5wdXRJbmRleCA9IG9mZnNldDsNCiAgICAgICAgICAgIGludCBlcnIgPSAwOw0KDQogICAgICAgICAgICB3aGlsZSAoZXJyID49IDAgJiYgaW5wdXRJbmRleCA8IHRvdGFsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvcHlJbnB1dChkYXRhLCBpbnB1dEluZGV4LCBNYXRoLk1pbih0b3RhbCAtIGlucHV0SW5kZXgsIGtCdWZmZXJTaXplKSk7DQogICAgICAgICAgICAgICAgd2hpbGUgKGVyciA+PSAwICYmIF96dHJlYW0uYXZhaWxfaW4gPiAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgZXJyID0gZGVmbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IDApDQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX3p0cmVhbS5hdmFpbF9vdXQgPT0gMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBkZWZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuTm9uZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXggKz0gKGludClfenRyZWFtLnRvdGFsX2luOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldENoZWNrc3VtKCBfenRyZWFtLmFkbGVyICk7DQogICAgICAgIH0NCg0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZpbmlzaCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIGludCBlcnI7DQogICAgICAgICAgICBkbyANCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBlcnIgPSBkZWZsYXRlKHJlZiBfenRyZWFtLCAoaW50KUZsdXNoVHlwZXMuRmluaXNoKTsNCiAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHdoaWxlIChlcnIgPT0gMCk7DQogICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOw0KICAgICAgICAgICAgZGVmbGF0ZVJlc2V0KHJlZiBfenRyZWFtKTsNCiAgICAgICAgICAgIHJlc2V0T3V0cHV0KCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBDbG9zZXMgdGhlIGludGVybmFsIHpsaWIgZGVmbGF0ZSBzdHJlYW0NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgQ2xlYW5VcCgpIHsgZGVmbGF0ZUVuZChyZWYgX3p0cmVhbSk7IH0NCg0KICAgIH0NCn0NCg==