Ly8NCi8vIKkgQ29weXJpZ2h0IEhlbnJpayBSYXZuIDIwMDQNCi8vDQovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gDQovLyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCi8vDQoNCnVzaW5nIFN5c3RlbTsNCnVzaW5nIFN5c3RlbS5JTzsNCnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCnVzaW5nIFN5c3RlbS5UZXh0Ow0KDQoNCm5hbWVzcGFjZSBEb3RaTGliDQp7DQoNCiAgICAjcmVnaW9uIEludGVybmFsIHR5cGVzDQoNCiAgICAvLy8gPHN1bW1hcnk+DQogICAgLy8vIERlZmluZXMgY29uc3RhbnRzIGZvciB0aGUgdmFyaW91cyBmbHVzaCB0eXBlcyB1c2VkIHdpdGggemxpYg0KICAgIC8vLyA8L3N1bW1hcnk+DQogICAgaW50ZXJuYWwgZW51bSBGbHVzaFR5cGVzIA0KICAgIHsNCiAgICAgICAgTm9uZSwgIFBhcnRpYWwsICBTeW5jLCAgRnVsbCwgIEZpbmlzaCwgIEJsb2NrDQogICAgfQ0KDQogICAgI3JlZ2lvbiBaU3RyZWFtIHN0cnVjdHVyZQ0KICAgIC8vIGludGVybmFsIG1hcHBpbmcgb2YgdGhlIHpsaWIgenN0cmVhbSBzdHJ1Y3R1cmUgZm9yIG1hcnNoYWxsaW5nDQogICAgW1N0cnVjdExheW91dEF0dHJpYnV0ZShMYXlvdXRLaW5kLlNlcXVlbnRpYWwsIFBhY2s9NCwgU2l6ZT0wLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSldDQogICAgaW50ZXJuYWwgc3RydWN0IFpTdHJlYW0NCiAgICB7DQogICAgICAgIHB1YmxpYyBJbnRQdHIgbmV4dF9pbjsNCiAgICAgICAgcHVibGljIHVpbnQgYXZhaWxfaW47DQogICAgICAgIHB1YmxpYyB1aW50IHRvdGFsX2luOw0KDQogICAgICAgIHB1YmxpYyBJbnRQdHIgbmV4dF9vdXQ7DQogICAgICAgIHB1YmxpYyB1aW50IGF2YWlsX291dDsNCiAgICAgICAgcHVibGljIHVpbnQgdG90YWxfb3V0Ow0KDQogICAgICAgIFtNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5MUFN0cildDQogICAgICAgIHN0cmluZyBtc2c7IA0KICAgICAgICB1aW50IHN0YXRlOw0KDQogICAgICAgIHVpbnQgemFsbG9jOw0KICAgICAgICB1aW50IHpmcmVlOw0KICAgICAgICB1aW50IG9wYXF1ZTsNCg0KICAgICAgICBpbnQgZGF0YV90eXBlOw0KICAgICAgICBwdWJsaWMgdWludCBhZGxlcjsNCiAgICAgICAgdWludCByZXNlcnZlZDsNCiAgICB9DQoNCiAgICAjZW5kcmVnaW9uDQogICAgDQogICAgI2VuZHJlZ2lvbg0KDQogICAgI3JlZ2lvbiBQdWJsaWMgZW51bXMNCiAgICAvLy8gPHN1bW1hcnk+DQogICAgLy8vIERlZmluZXMgY29uc3RhbnRzIGZvciB0aGUgYXZhaWxhYmxlIGNvbXByZXNzaW9uIGxldmVscyBpbiB6bGliDQogICAgLy8vIDwvc3VtbWFyeT4NCiAgICBwdWJsaWMgZW51bSBDb21wcmVzc0xldmVsIDogaW50DQogICAgew0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBUaGUgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbCB3aXRoIGEgcmVhc29uYWJsZSBjb21wcm9taXNlIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHNwZWVkDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIERlZmF1bHQgPSAtMSwgICANCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gTm8gY29tcHJlc3Npb24gYXQgYWxsLiBUaGUgZGF0YSBhcmUgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2guDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIE5vbmUgPSAwLA0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBUaGUgbWF4aW11bSBjb21wcmVzc2lvbiByYXRlIGF2YWlsYWJsZS4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgQmVzdCA9IDksICAgDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFRoZSBmYXN0ZXN0IGF2YWlsYWJsZSBjb21wcmVzc2lvbiBsZXZlbC4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgRmFzdGVzdCA9IDENCiAgICB9DQogICAgI2VuZHJlZ2lvbg0KDQogICAgI3JlZ2lvbiBFeGNlcHRpb24gY2xhc3Nlcw0KICAgIC8vLyA8c3VtbWFyeT4NCiAgICAvLy8gVGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyBvbiB0aGUgemxpYiBkbGwNCiAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgIHB1YmxpYyBjbGFzcyBaTGliRXhjZXB0aW9uIDogQXBwbGljYXRpb25FeGNlcHRpb24NCiAgICB7DQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlpMaWJFeGNlcHRpb24iLz4gY2xhc3Mgd2l0aCBhIHNwZWNpZmllZCANCiAgICAgICAgLy8vIGVycm9yIG1lc3NhZ2UgYW5kIGVycm9yIGNvZGUNCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvckNvZGUiPlRoZSB6bGliIGVycm9yIGNvZGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbjwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXNnIj5BIG1lc3NhZ2UgdGhhdCAoaG9wZWZ1bGx5KSBkZXNjcmliZXMgdGhlIGVycm9yPC9wYXJhbT4NCiAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgc3RyaW5nIG1zZykgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IHsxfSIsIGVycm9yQ29kZSwgbXNnKSkNCiAgICAgICAgew0KICAgICAgICB9DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iWkxpYkV4Y2VwdGlvbiIvPiBjbGFzcyB3aXRoIGEgc3BlY2lmaWVkIA0KICAgICAgICAvLy8gZXJyb3IgY29kZQ0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yQ29kZSI+VGhlIHpsaWIgZXJyb3IgY29kZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uPC9wYXJhbT4NCiAgICAgICAgcHVibGljIFpMaWJFeGNlcHRpb24oaW50IGVycm9yQ29kZSkgOiBiYXNlKFN0cmluZy5Gb3JtYXQoIlpMaWIgZXJyb3IgezB9IiwgZXJyb3JDb2RlKSkNCiAgICAgICAgew0KICAgICAgICB9DQogICAgfQ0KICAgICNlbmRyZWdpb24NCg0KICAgICNyZWdpb24gSW50ZXJmYWNlcw0KDQogICAgLy8vIDxzdW1tYXJ5Pg0KICAgIC8vLyBEZWNsYXJlcyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlcyBhIHJ1bm5pbmcgY2hlY2tzdW0gdG8gYmUgY2FsY3VsYXRlZCANCiAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tzdW1HZW5lcmF0b3INCiAgICB7DQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNoZWNrc3VtDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHVpbnQgVmFsdWUgeyBnZXQ7IH0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBDbGVhcnMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gdG8gMA0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICB2b2lkIFJlc2V0KCk7DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gVXBkYXRlcyB0aGUgY3VycmVudCBjaGVja3N1bSB3aXRoIGFuIGFycmF5IG9mIGJ5dGVzDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCiAgICAgICAgdm9pZCBVcGRhdGUoYnl0ZVtdIGRhdGEpOw0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGRhdGEgdG8gdXBkYXRlIHRoZSBjaGVja3N1bSB3aXRoPC9wYXJhbT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPldoZXJlIGluIDxjPmRhdGE8L2M+IHRvIHN0YXJ0IHVwZGF0aW5nPC9wYXJhbT4NCiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyBmcm9tIDxjPmRhdGE8L2M+IHRvIHVzZTwvcGFyYW0+DQogICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgc3VtIG9mIG9mZnNldCBhbmQgY291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiA8Yz5kYXRhPC9jPjwvZXhjZXB0aW9uPg0KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE51bGxFeGNlcHRpb24iPjxjPmRhdGE8L2M+IGlzIGEgbnVsbCByZWZlcmVuY2U8L2V4Y2VwdGlvbj4NCiAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj5PZmZzZXQgb3IgY291bnQgaXMgbmVnYXRpdmUuPC9leGNlcHRpb24+DQogICAgICAgIHZvaWQgVXBkYXRlKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpOw0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KICAgICAgICAvLy8gPHJlbWFya3M+VGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgY29udmVydGVkIGJ5IHRoZSBVVEYtOCBlbmNvZGluZzwvcmVtYXJrcz4NCiAgICAgICAgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEpOw0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIFVwZGF0ZXMgdGhlIGN1cnJlbnQgY2hlY2tzdW0gd2l0aCB0aGUgZGF0YSBmcm9tIGEgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIHN0cmluZyB0byB1cGRhdGUgdGhlIGNoZWNrc3VtIHdpdGg8L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj5UaGUgZW5jb2RpbmcgdG8gdXNlPC9wYXJhbT4NCiAgICAgICAgdm9pZCBVcGRhdGUoc3RyaW5nIGRhdGEsIEVuY29kaW5nIGVuY29kaW5nKTsNCiAgICB9DQoNCg0KICAgIC8vLyA8c3VtbWFyeT4NCiAgICAvLy8gUmVwcmVzZW50cyB0aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgZnJvbSBhIGNvZGVjIHdoZW4gbmV3IGRhdGENCiAgICAvLy8gYXJlIGF2YWlsYWJsZS4NCiAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iZGF0YSI+VGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIGRhdGE8L3BhcmFtcmVmPg0KICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0ic3RhcnRJbmRleCI+VGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwcm9jZXNzZWQgYnl0ZSBpbiA8Yz5kYXRhPC9jPjwvcGFyYW1yZWY+DQogICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgYXZhaWxhYmxlPC9wYXJhbXJlZj4NCiAgICAvLy8gPHJlbWFya3M+T24gcmV0dXJuIGZyb20gdGhpcyBtZXRob2QsIHRoZSBkYXRhIG1heSBiZSBvdmVyd3JpdHRlbiwgc28gZ3JhYiBpdCB3aGlsZSB5b3UgY2FuLiANCiAgICAvLy8gWW91IGNhbm5vdCBhc3N1bWUgdGhhdCBzdGFydEluZGV4IHdpbGwgYmUgemVyby4NCiAgICAvLy8gPC9yZW1hcmtzPg0KICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIERhdGFBdmFpbGFibGVIYW5kbGVyKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGNvdW50KTsNCg0KICAgIC8vLyA8c3VtbWFyeT4NCiAgICAvLy8gRGVjbGFyZXMgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBpbXBsZW1lbnRpbmcgY29tcHJlc3NvcnMvZGVjb21wcmVzc29ycw0KICAgIC8vLyA8L3N1bW1hcnk+DQogICAgcHVibGljIGludGVyZmFjZSBDb2RlYw0KICAgIHsNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gT2NjdXJzIHdoZW4gbW9yZSBwcm9jZXNzZWQgZGF0YSBhcmUgYXZhaWxhYmxlLg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBldmVudCBEYXRhQXZhaWxhYmxlSGFuZGxlciBEYXRhQXZhaWxhYmxlOw0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQogICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCiAgICAgICAgdm9pZCBBZGQoYnl0ZVtdIGRhdGEpOw0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEFkZHMgbW9yZSBkYXRhIHRvIHRoZSBjb2RlYyB0byBiZSBwcm9jZXNzZWQuDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+DQogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2Zmc2V0Ij5UaGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gYWRkIGZyb20gPGM+ZGF0YTwvYz48L3BhcmFtPg0KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvdW50Ij5UaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkZDwvcGFyYW0+DQogICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4NCiAgICAgICAgdm9pZCBBZGQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCk7DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gRmluaXNoZXMgdXAgYW55IHBlbmRpbmcgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBhbmQgaGFuZGxlZC4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgdm9pZCBGaW5pc2goKTsNCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBHZXRzIHRoZSBjaGVja3N1bSBvZiB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIGFkZGVkIHNvIGZhcg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICB1aW50IENoZWNrc3VtIHsgZ2V0OyB9DQoNCg0KICAgIH0NCg0KICAgICNlbmRyZWdpb24NCg0KICAgICNyZWdpb24gQ2xhc3Nlcw0KICAgIC8vLyA8c3VtbWFyeT4NCiAgICAvLy8gRW5jYXBzdWxhdGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFpMaWIgbGlicmFyeQ0KICAgIC8vLyA8L3N1bW1hcnk+DQogICAgcHVibGljIGNsYXNzIEluZm8NCiAgICB7DQogICAgICAgICNyZWdpb24gRExMIGltcG9ydHMNCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCB6bGliQ29tcGlsZUZsYWdzKCk7DQoNCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gc3RyaW5nIHpsaWJWZXJzaW9uKCk7DQogICAgICAgICNlbmRyZWdpb24NCg0KICAgICAgICAjcmVnaW9uIFByaXZhdGUgc3R1ZmYNCiAgICAgICAgcHJpdmF0ZSB1aW50IF9mbGFnczsNCg0KICAgICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdGhhdCB1bnBhY2tzIGEgYml0c2l6ZSBtYXNrDQogICAgICAgIHByaXZhdGUgc3RhdGljIGludCBiaXRTaXplKHVpbnQgYml0cykNCiAgICAgICAgew0KICAgICAgICAgICAgc3dpdGNoIChiaXRzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIDE2Ow0KICAgICAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIDMyOw0KICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIDY0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9DQogICAgICAgICNlbmRyZWdpb24NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoZSA8Yz5JbmZvPC9jPiBjbGFzcy4NCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIEluZm8oKQ0KICAgICAgICB7DQogICAgICAgICAgICBfZmxhZ3MgPSB6bGliQ29tcGlsZUZsYWdzKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBUcnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggZGVidWcgaW5mbw0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgYm9vbCBIYXNEZWJ1Z0luZm8geyBnZXQgeyByZXR1cm4gMCAhPSAoX2ZsYWdzICYgMHgxMDApOyB9IH0NCg0KICAgICAgICAvLy8gPHN1bW1hcnk+DQogICAgICAgIC8vLyBUcnVlIGlmIHRoZSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggYXNzZW1ibHkgb3B0aW1pemF0aW9ucw0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgYm9vbCBVc2VzQXNzZW1ibHlDb2RlIHsgZ2V0IHsgcmV0dXJuIDAgIT0gKF9mbGFncyAmIDB4MjAwKTsgfSB9DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgdW5zaWduZWQgaW50IHRoYXQgd2FzIGNvbXBpbGVkIGludG8gWmxpYg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgaW50IFNpemVPZlVJbnQgeyBnZXQgeyByZXR1cm4gYml0U2l6ZShfZmxhZ3MgJiAzKTsgfSB9DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgdW5zaWduZWQgbG9uZyB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWINCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIGludCBTaXplT2ZVTG9uZyB7IGdldCB7IHJldHVybiBiaXRTaXplKChfZmxhZ3MgPj4gMikgJiAzKTsgfSB9DQoNCiAgICAgICAgLy8vIDxzdW1tYXJ5Pg0KICAgICAgICAvLy8gR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlcnMgdGhhdCB3ZXJlIGNvbXBpbGVkIGludG8gWmxpYg0KICAgICAgICAvLy8gPC9zdW1tYXJ5Pg0KICAgICAgICBwdWJsaWMgaW50IFNpemVPZlBvaW50ZXIgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDQpICYgMyk7IH0gfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEdldHMgdGhlIHNpemUgb2YgdGhlIHpfb2ZmX3QgdHlwZSB0aGF0IHdhcyBjb21waWxlZCBpbnRvIFpsaWINCiAgICAgICAgLy8vIDwvc3VtbWFyeT4NCiAgICAgICAgcHVibGljIGludCBTaXplT2ZPZmZzZXQgeyBnZXQgeyByZXR1cm4gYml0U2l6ZSgoX2ZsYWdzID4+IDYpICYgMyk7IH0gfQ0KDQogICAgICAgIC8vLyA8c3VtbWFyeT4NCiAgICAgICAgLy8vIEdldHMgdGhlIHZlcnNpb24gb2YgWkxpYiBhcyBhIHN0cmluZywgZS5nLiAiMS4yLjEiDQogICAgICAgIC8vLyA8L3N1bW1hcnk+DQogICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFZlcnNpb24geyBnZXQgeyByZXR1cm4gemxpYlZlcnNpb24oKTsgfSB9DQogICAgfQ0KDQogICAgI2VuZHJlZ2lvbg0KDQp9DQo=