I3ZlcnNpb24gNDMwDQoNCiNleHRlbnNpb24gR0xfM0RMX2FycmF5X29iamVjdHMgOiBlbmFibGUNCg0Kb3V0IFZlcnRleCB7DQogICAgdmVjNCBQb3NpdGlvbjsgIC8vIEFQSSB0cmFuc2Zvcm0vZmVlZGJhY2sgd2lsbCB1c2Ugk1ZlcnRleC5Qb3NpdGlvbpQNCiAgICB2ZWMyIFRleHR1cmU7DQp9IENvb3JkczsgICAgICAgICAgIC8vIHNoYWRlciB3aWxsIHVzZSCTQ29vcmRzLlBvc2l0aW9ulA0KDQpvdXQgVmVydGV4MiB7DQogICAgdmVjNCBDb2xvcjsgICAgIC8vIEFQSSB3aWxsIHVzZSCTQ29sb3KUDQp9Ow0KDQp1bmlmb3JtIFRyYW5zZm9ybSB7ICAvLyBBUEkgdXNlcyCTVHJhbnNmb3JtWzJdlCB0byByZWZlciB0byBpbnN0YW5jZSAyDQogICAgbWF0NCAgICAgICAgICAgTW9kZWxWaWV3TWF0cml4Ow0KICAgIG1hdDQgICAgICAgICAgIE1vZGVsVmlld1Byb2plY3Rpb25NYXRyaXg7DQogICAgdmVjNCAgICAgICAgICAgYVtdOyAgLy8gYXJyYXkgd2lsbCBnZXQgaW1wbGljaXRseSBzaXplZA0KICAgIGZsb2F0ICAgICAgICAgIERlZm9ybWF0aW9uOw0KfSB0cmFuc2Zvcm1zWzRdOw0KDQpsYXlvdXQobG9jYXRpb24gPSAzKSBpbiB2ZWM0IG5vcm1hbDsNCmxheW91dChsb2NhdGlvbiA9IDYpIGluIHZlYzQgY29sb3JzWzNdOw0KbGF5b3V0KGxvY2F0aW9uID0gOSkgaW4gbWF0NCB0cmFuc2Zvcm1zWzJdOw0KDQpsYXlvdXQobG9jYXRpb24gPSAzKSBzdHJ1Y3QgUyB7DQogICAgdmVjMyBhMTsNCiAgICBtYXQyIGI7DQogICAgdmVjNCBjWzJdOw0KfSBzOw0KDQpsYXlvdXQodHJpYW5nbGVzLCBpbnZvY2F0aW9ucyA9IDYpIGluOw0KDQpsYXlvdXQobGluZXMpIGluOyAgICAvLyBsZWdhbCBmb3IgQ29sb3IyLCBpbnB1dCBzaXplIGlzIDIsIG1hdGNoaW5nIENvbG9yMg0KDQpsYXlvdXQodHJpYW5nbGVfc3RyaXAsIG1heF92ZXJ0aWNlcyA9IDYwKSBvdXQ7ICAvLyBvcmRlciBkb2VzIG5vdCBtYXR0ZXINCmxheW91dChtYXhfdmVydGljZXMgPSA2MCkgb3V0OyAgICAgIC8vIHJlZGVjbGFyYXRpb24gb2theQ0KbGF5b3V0KHRyaWFuZ2xlX3N0cmlwKSBvdXQ7ICAgICAgICAgLy8gcmVkZWNsYXJhdGlvbiBva2F5DQovL2xheW91dChwb2ludHMpIG91dDsgICAgICAgICAgICAgICAgIC8vIGVycm9yLCBjb250cmFkaWN0cyB0cmlhbmdsZV9zdHJpcA0KLy9sYXlvdXQobWF4X3ZlcnRpY2VzID0gMzApIG91dDsgICAgICAvLyBlcnJvciwgY29udHJhZGljdHMgNjANCg0KbGF5b3V0KHN0cmVhbSA9IDEpIG91dDsNCg0KbGF5b3V0KHN0cmVhbT0xKSBvdXQ7ICAgICAgICAgICAgIC8vIGRlZmF1bHQgaXMgbm93IHN0cmVhbSAxDQpvdXQgdmVjNCB2YXIxOyAgICAgICAgICAgICAgICAgICAgLy8gdmFyMSBnZXRzIGRlZmF1bHQgc3RyZWFtICgxKQ0KbGF5b3V0KHN0cmVhbT0yKSBvdXQgQmxvY2sxIHsgICAgIC8vICJCbG9jazEiIGJlbG9uZ3MgdG8gc3RyZWFtIDINCiAgICBsYXlvdXQoc3RyZWFtPTIpIHZlYzQgdmFyMjsgICAvLyByZWR1bmRhbnQgYmxvY2sgbWVtYmVyIHN0cmVhbSBkZWNsDQogICAgbGF5b3V0KHN0cmVhbT0zKSB2ZWMyIHZhcjM7ICAgLy8gSUxMRUdBTCAobXVzdCBtYXRjaCBibG9jayBzdHJlYW0pDQogICAgdmVjMyB2YXI0OyAgICAgICAgICAgICAgICAgICAgLy8gYmVsb25ncyB0byBzdHJlYW0gMg0KfTsNCmxheW91dChzdHJlYW09MCkgb3V0OyAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIG5vdyBzdHJlYW0gMA0Kb3V0IHZlYzQgdmFyNTsgICAgICAgICAgICAgICAgICAgIC8vIHZhcjUgZ2V0cyBkZWZhdWx0IHN0cmVhbSAoMCkNCm91dCBCbG9jazIgeyAgICAgICAgICAgICAgICAgICAgICAvLyAiQmxvY2syIiBnZXRzIGRlZmF1bHQgc3RyZWFtICgwKQ0KICAgIHZlYzQgdmFyNjsNCn07DQpsYXlvdXQoc3RyZWFtPTMpIG91dCB2ZWM0IHZhcjc7ICAgLy8gdmFyNyBiZWxvbmdzIHRvIHN0cmVhbSAzDQoNCmxheW91dChzaGFyZWQsIGNvbHVtbl9tYWpvcikgdW5pZm9ybTsNCmxheW91dChzaGFyZWQsIGNvbHVtbl9tYWpvcikgYnVmZmVyOw0KDQpsYXlvdXQocm93X21ham9yLCBjb2x1bW5fbWFqb3IpDQoNCmxheW91dChzaGFyZWQsIHJvd19tYWpvcikgdW5pZm9ybTsgLy8gZGVmYXVsdCBpcyBub3cgc2hhcmVkIGFuZCByb3dfbWFqb3INCg0KbGF5b3V0KHN0ZDE0MCkgdW5pZm9ybSBUcmFuc2Zvcm0yIHsgLy8gbGF5b3V0IG9mIHRoaXMgYmxvY2sgaXMgc3RkMTQwDQogICAgbWF0NCBNMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvd19tYWpvcg0KICAgIGxheW91dChjb2x1bW5fbWFqb3IpIG1hdDQgTTI7ICAvLyBjb2x1bW4gbWFqb3INCiAgICBtYXQzIE4xOyAgICAgICAgICAgICAgICAgICAgICAgLy8gcm93X21ham9yDQp9Ow0KDQpsYXlvdXQoY29sdW1uX21ham9yKSB1bmlmb3JtIFQzIHsgIC8vIHNoYXJlZCBhbmQgY29sdW1uX21ham9yDQogICAgbWF0NCBNMTM7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbHVtbl9tYWpvcg0KICAgIGxheW91dChyb3dfbWFqb3IpIG1hdDQgbTE0OyAgICAvLyByb3cgbWFqb3INCiAgICBtYXQzIE4xMjsgICAgICAgICAgICAgICAgICAgICAgLy8gY29sdW1uX21ham9yDQp9Ow0KDQovLyBpbiBvbmUgY29tcGlsYXRpb24gdW5pdC4uLg0KbGF5b3V0KGJpbmRpbmc9MykgdW5pZm9ybSBzYW1wbGVyMkQgczE3OyAvLyBzIGJvdW5kIHRvIHVuaXQgMw0KDQovLyBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQuLi4NCnVuaWZvcm0gc2FtcGxlcjJEIHMxNzsgICAgICAgICAgICAgICAgICAgLy8gb2theSwgcyBzdGlsbCBib3VuZCBhdCAzDQoNCi8vIGluIGFub3RoZXIgY29tcGlsYXRpb24gdW5pdC4uLg0KLy9sYXlvdXQoYmluZGluZz00KSB1bmlmb3JtIHNhbXBsZXIyRCBzOyAvLyBFUlJPUjogY29udHJhZGljdG9yeSBiaW5kaW5ncw0KDQpsYXlvdXQgKGJpbmRpbmcgPSAyLCBvZmZzZXQgPSA0KSB1bmlmb3JtIGF0b21pY191aW50IGEyOw0KDQpsYXlvdXQgKGJpbmRpbmcgPSAyKSB1bmlmb3JtIGF0b21pY191aW50IGJhcjsNCg0KbGF5b3V0IChiaW5kaW5nID0gMiwgb2Zmc2V0ID0gNCkgdW5pZm9ybSBhdG9taWNfdWludDsNCg0KbGF5b3V0IChiaW5kaW5nID0gMikgdW5pZm9ybSBhdG9taWNfdWludCBiYXI7IC8vIG9mZnNldCBpcyA0DQpsYXlvdXQgKG9mZnNldCA9IDgpIHVuaWZvcm0gYXRvbWljX3VpbnQgYmFyOyAgLy8gZXJyb3IsIG5vIGRlZmF1bHQgYmluZGluZw0KDQpsYXlvdXQgKGJpbmRpbmc9Mywgb2Zmc2V0PTQpIHVuaWZvcm0gYXRvbWljX3VpbnQgYTI7IC8vIG9mZnNldCA9IDQNCmxheW91dCAoYmluZGluZz0yKSB1bmlmb3JtIGF0b21pY191aW50IGIyOyAgICAgICAgICAgLy8gb2Zmc2V0ID0gMA0KbGF5b3V0IChiaW5kaW5nPTMpIHVuaWZvcm0gYXRvbWljX3VpbnQgYzI7ICAgICAgICAgICAvLyBvZmZzZXQgPSA4DQpsYXlvdXQgKGJpbmRpbmc9MikgdW5pZm9ybSBhdG9taWNfdWludCBkMjsgICAgICAgICAgIC8vIG9mZnNldCA9IDQNCg0KLy9sYXlvdXQgKG9mZnNldD00KSAgICAgICAgICAgICAgICAvLyBlcnJvciwgbXVzdCBpbmNsdWRlIGJpbmRpbmcNCi8vbGF5b3V0IChiaW5kaW5nPTEsIG9mZnNldD0wKSAgYTsgLy8gb2theQ0KLy9sYXlvdXQgKGJpbmRpbmc9Miwgb2Zmc2V0PTApICBiOyAvLyBva2F5DQovL2xheW91dCAoYmluZGluZz0xLCBvZmZzZXQ9MCkgIGM7IC8vIGVycm9yLCBvZmZzZXRzIG11c3Qgbm90IGJlIHNoYXJlZA0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgYmV0d2VlbiBhIGFuZCBjDQovL2xheW91dCAoYmluZGluZz0xLCBvZmZzZXQ9MikgIGQ7IC8vIGVycm9yLCBvdmVybGFwcyBvZmZzZXQgMCBvZiBhDQoNCmZsYXQgIGluIHZlYzQgZ2xfRnJvbnRDb2xvcjsgIC8vIGlucHV0IHRvIGdlb21ldHJ5IHNoYWRlciwgbm8gk2dsX2luW12UDQpmbGF0IG91dCB2ZWM0IGdsX0Zyb250Q29sb3I7ICAvLyBvdXRwdXQgZnJvbSBnZW9tZXRyeSBzaGFkZXINCg0KaW52YXJpYW50IGdsX1Bvc2l0aW9uOyAgIC8vIG1ha2UgZXhpc3RpbmcgZ2xfUG9zaXRpb24gYmUgaW52YXJpYW50DQoNCm91dCB2ZWMzIENvbG9ySW52Ow0KaW52YXJpYW50IENvbG9ySXZuOyAgICAgIC8vIG1ha2UgZXhpc3RpbmcgQ29sb3IgYmUgaW52YXJpYW50DQoNCmludmFyaWFudCBjZW50cm9pZCBvdXQgdmVjMyBDb2xvcjQ7DQpwcmVjaXNlIG91dCB2ZWM0IHBvc2l0aW9uOw0KDQpvdXQgdmVjMyBDb2xvcjU7DQpwcmVjaXNlIENvbG9yNTsgICAgICAgICAgICAvLyBtYWtlIGV4aXN0aW5nIENvbG9yIGJlIHByZWNpc2UNCmluIHZlYzQgYSwgYiwgYywgZDsNCnByZWNpc2Ugb3V0IHZlYzQgdjsNCg0KY29oZXJlbnQgYnVmZmVyIEJsb2NrIHsNCiAgICByZWFkb25seSB2ZWM0IG1lbWJlcjE7DQogICAgdmVjNCBtZW1iZXIyOw0KfTsNCg0KYnVmZmVyIEJsb2NrMmEgew0KICAgIGNvaGVyZW50IHJlYWRvbmx5IHZlYzQgbWVtYmVyMUE7DQogICAgY29oZXJlbnQgdmVjNCBtZW1iZXIyQTsNCn07DQoNCnNoYXJlZCB2ZWM0IHNodjsNCg0KdmVjNCBmdW5jQShyZXN0cmljdCBpbWFnZTJEIGEpICAgeyAgfQ0KDQp2ZWM0IGZ1bmNCKGltYWdlMkQgYSkgICAgICAgICAgICB7ICB9DQpsYXlvdXQocmdiYTMyZikgdW5pZm9ybSBpbWFnZTJEIGltZzE7DQpsYXlvdXQocmdiYTMyZikgY29oZXJlbnQgdW5pZm9ybSBpbWFnZTJEIGltZzI7DQoNCmZsb2F0IGZ1bmMoZmxvYXQgZSwgZmxvYXQgZiwgZmxvYXQgZywgZmxvYXQgaCkNCnsNCiAgICByZXR1cm4gKGUqZikgKyAoZypoKTsgICAgICAgICAgICAvLyBubyBjb25zdHJhaW50IG9uIG9yZGVyIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yIGNvbnNpc3RlbmN5DQp9DQoNCmZsb2F0IGZ1bmMyKGZsb2F0IGUsIGZsb2F0IGYsIGZsb2F0IGcsIGZsb2F0IGgpDQp7DQogICAgcHJlY2lzZSBmbG9hdCByZXN1bHQgPSAoZSpmKSArIChnKmgpOyAgLy8gZW5zdXJlcyBzYW1lIHByZWNpc2lvbiBmb3INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdHdvIG11bHRpcGxpZXMNCiAgICByZXR1cm4gcmVzdWx0Ow0KfQ0KDQpmbG9hdCBmdW5jMyhmbG9hdCBpLCBmbG9hdCBqLCBwcmVjaXNlIG91dCBmbG9hdCBrKQ0Kew0KICAgIGsgPSBpICogaSArIGo7ICAgICAgICAgICAgICAgICAgIC8vIHByZWNpc2UsIGR1ZSB0byA8az4gZGVjbGFyYXRpb24NCn0NCg0Kdm9pZCBtYWluKCkNCnsNCiAgICB2ZWMzIHIgPSB2ZWMzKGEgKiBiKTsgICAgICAgICAgIC8vIHByZWNpc2UsIHVzZWQgdG8gY29tcHV0ZSB2Lnh5eg0KICAgIHZlYzMgcyA9IHZlYzMoYyAqIGQpOyAgICAgICAgICAgLy8gcHJlY2lzZSwgdXNlZCB0byBjb21wdXRlIHYueHl6DQogICAgdi54eXogPSByICsgczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNpc2UgICAgICAgICAgICAgICAgICAgICAgDQogICAgdi53ID0gKGEudyAqIGIudykgKyAoYy53ICogZC53KTsgICAgICAgIC8vIHByZWNpc2UNCiAgICB2LnggPSBmdW5jKGEueCwgYi54LCBjLngsIGQueCk7ICAgICAgICAgLy8gdmFsdWVzIGNvbXB1dGVkIGluIGZ1bmMoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgTk9UIHByZWNpc2UNCiAgICB2LnggPSBmdW5jMihhLngsIGIueCwgYy54LCBkLngpOyAgICAgICAgLy8gcHJlY2lzZSENCiAgICBmdW5jMyhhLnggKiBiLngsIGMueCAqIGQueCwgdi54KTsgICAgICAgLy8gcHJlY2lzZSENCiAgICAgICAgDQogICAgZnVuY0EoaW1nMSk7ICAgICAgICAgICAgICAvLyBPSywgYWRkaW5nICJyZXN0cmljdCIgaXMgYWxsb3dlZA0KICAgIGZ1bmNCKGltZzIpOyAgICAgICAgICAgICAgLy8gaWxsZWdhbCwgc3RyaXBwaW5nICJjb2hlcmVudCIgaXMgbm90DQoNCiAgICB7DQogICAgICAgIHN0cnVjdCBsaWdodCB7DQogICAgICAgICAgICBmbG9hdCBpbnRlbnNpdHk7DQogICAgICAgICAgICB2ZWMzIHBvc2l0aW9uOw0KICAgICAgICB9Ow0KDQogICAgICAgIGxpZ2h0IGxpZ2h0VmFyID0gbGlnaHQoMy4wLCB2ZWMzKDEuMCwgMi4wLCAzLjApKTsNCiAgICB9DQogICAgew0KICAgICAgICBjb25zdCBmbG9hdCBjWzNdID0gZmxvYXRbM10oNS4wLCA3LjIsIDEuMSk7DQogICAgICAgIGNvbnN0IGZsb2F0IGRbM10gPSBmbG9hdFtdKDUuMCwgNy4yLCAxLjEpOw0KDQogICAgICAgIGZsb2F0IGc7DQogICAgICAgIGZsb2F0IGFbNV0gPSBmbG9hdFs1XShnLCAxLCBnLCAyLjMsIGcpOw0KICAgICAgICBmbG9hdCBiWzNdOw0KDQogICAgICAgIGIgPSBmbG9hdFszXShnLCBnICsgMS4wLCBnICsgMi4wKTsNCiAgICB9DQogICAgew0KICAgICAgICB2ZWM0IGJbMl0gPSB7IHZlYzQoMS4wKSwgdmVjNCgxLjApIH07DQogICAgICAgIHZlYzRbM11bMl0oYiwgYiwgYik7ICAgICAgICAvLyBjb25zdHJ1Y3Rvcg0KICAgICAgICB2ZWM0W11bMl0oYiwgYiwgYik7ICAgICAgICAgLy8gY29uc3RydWN0b3IsIHZhbGlkLCBzaXplIGRlZHVjZWQNCiAgICAgICAgdmVjNFszXVtdKGIsIGIsIGIpOyAgICAgICAgIC8vIGNvbXBpbGUtdGltZSBlcnJvciwgaW52YWxpZCB0eXBlIGNvbnN0cnVjdGVkDQogICAgfQ0KfQ0K