Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KLy8gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi8vCgp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwoKbmFtZXNwYWNlIERvdFpMaWIKewoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBJbXBsZW1lbnRzIGEgZGF0YSBkZWNvbXByZXNzb3IsIHVzaW5nIHRoZSBpbmZsYXRlIGFsZ29yaXRobSBpbiB0aGUgWkxpYiBkbGwKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBwdWJsaWMgY2xhc3MgSW5mbGF0ZXIgOiBDb2RlY0Jhc2UKCXsKICAgICAgICAjcmVnaW9uIERsbCBpbXBvcnRzCiAgICAgICAgW0RsbEltcG9ydCgiWkxJQjEuZGxsIiwgQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wsIENoYXJTZXQ9Q2hhclNldC5BbnNpKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGluZmxhdGVJbml0XyhyZWYgWlN0cmVhbSBzeiwgc3RyaW5nIHZzLCBpbnQgc2l6ZSk7CgogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGluZmxhdGUocmVmIFpTdHJlYW0gc3osIGludCBmbHVzaCk7CgogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGluZmxhdGVSZXNldChyZWYgWlN0cmVhbSBzeik7CgogICAgICAgIFtEbGxJbXBvcnQoIlpMSUIxLmRsbCIsIENhbGxpbmdDb252ZW50aW9uPUNhbGxpbmdDb252ZW50aW9uLkNkZWNsKV0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gaW50IGluZmxhdGVFbmQocmVmIFpTdHJlYW0gc3opOwogICAgICAgICNlbmRyZWdpb24KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDb25zdHJ1Y3RzIGFuIG5ldyBpbnN0YW5jZSBvZiB0aGUgPGM+SW5mbGF0ZXI8L2M+CiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgSW5mbGF0ZXIoKSA6IGJhc2UoKQoJCXsKICAgICAgICAgICAgaW50IHJldHZhbCA9IGluZmxhdGVJbml0XyhyZWYgX3p0cmVhbSwgSW5mby5WZXJzaW9uLCBNYXJzaGFsLlNpemVPZihfenRyZWFtKSk7CiAgICAgICAgICAgIGlmIChyZXR2YWwgIT0gMCkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBaTGliRXhjZXB0aW9uKHJldHZhbCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIGluZmxhdGVyIik7CgogICAgICAgICAgICByZXNldE91dHB1dCgpOwogICAgICAgIH0KCgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQWRkcyBtb3JlIGRhdGEgdG8gdGhlIGNvZGVjIHRvIGJlIHByb2Nlc3NlZC4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+Qnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGFkZGVkIHRvIHRoZSBjb2RlYzwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvZmZzZXQiPlRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSB0byBhZGQgZnJvbSA8Yz5kYXRhPC9jPjwvcGFyYW0+CiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3VudCI+VGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQ8L3BhcmFtPgogICAgICAgIC8vLyA8cmVtYXJrcz5BZGRpbmcgZGF0YSBtYXksIG9yIG1heSBub3QsIHJhaXNlIHRoZSA8Yz5EYXRhQXZhaWxhYmxlPC9jPiBldmVudDwvcmVtYXJrcz4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBBZGQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oKTsKICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIGlmICgob2Zmc2V0K2NvdW50KSA+IGRhdGEuTGVuZ3RoKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsKCiAgICAgICAgICAgIGludCB0b3RhbCA9IGNvdW50OwogICAgICAgICAgICBpbnQgaW5wdXRJbmRleCA9IG9mZnNldDsKICAgICAgICAgICAgaW50IGVyciA9IDA7CgogICAgICAgICAgICB3aGlsZSAoZXJyID49IDAgJiYgaW5wdXRJbmRleCA8IHRvdGFsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb3B5SW5wdXQoZGF0YSwgaW5wdXRJbmRleCwgTWF0aC5NaW4odG90YWwgLSBpbnB1dEluZGV4LCBrQnVmZmVyU2l6ZSkpOwogICAgICAgICAgICAgICAgZXJyID0gaW5mbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLk5vbmUpOwogICAgICAgICAgICAgICAgaWYgKGVyciA9PSAwKQogICAgICAgICAgICAgICAgICAgIHdoaWxlIChfenRyZWFtLmF2YWlsX291dCA9PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgT25EYXRhQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGluZmxhdGUocmVmIF96dHJlYW0sIChpbnQpRmx1c2hUeXBlcy5Ob25lKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5wdXRJbmRleCArPSAoaW50KV96dHJlYW0udG90YWxfaW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0Q2hlY2tzdW0oIF96dHJlYW0uYWRsZXIgKTsKICAgICAgICB9CgoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEZpbmlzaGVzIHVwIGFueSBwZW5kaW5nIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYW5kIGhhbmRsZWQuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGaW5pc2goKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGVycjsKICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXJyID0gaW5mbGF0ZShyZWYgX3p0cmVhbSwgKGludClGbHVzaFR5cGVzLkZpbmlzaCk7CiAgICAgICAgICAgICAgICBPbkRhdGFBdmFpbGFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoZXJyID09IDApOwogICAgICAgICAgICBzZXRDaGVja3N1bSggX3p0cmVhbS5hZGxlciApOwogICAgICAgICAgICBpbmZsYXRlUmVzZXQocmVmIF96dHJlYW0pOwogICAgICAgICAgICByZXNldE91dHB1dCgpOwogICAgICAgIH0KCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDbG9zZXMgdGhlIGludGVybmFsIHpsaWIgaW5mbGF0ZSBzdHJlYW0KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIENsZWFuVXAoKSB7IGluZmxhdGVFbmQocmVmIF96dHJlYW0pOyB9CgoKCX0KfQo=