LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmxhbl9ldmVudC5jCiAqIFZlcnNpb246CiAqIERlc2NyaXB0aW9uOgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgVHVlIE9jdCAyMCAwOToxMDoxNiAxOTk4CiAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgMzAgMTI6NTk6MDEgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcwogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZXZlbnQuaD4KCmNoYXIgKmlybGFuX3N0YXRlW10gPSB7CgkiSVJMQU5fSURMRSIsCgkiSVJMQU5fUVVFUlkiLAoJIklSTEFOX0NPTk4iLAoJIklSTEFOX0lORk8iLAoJIklSTEFOX01FRElBIiwKCSJJUkxBTl9PUEVOIiwKCSJJUkxBTl9XQUlUIiwKCSJJUkxBTl9BUkIiLAoJIklSTEFOX0RBVEEiLAoJIklSTEFOX0NMT1NFIiwKCSJJUkxBTl9TWU5DIiwKfTsKCnZvaWQgaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc3RydWN0IGlybGFuX2NiICpzZWxmLCBJUkxBTl9TVEFURSBzdGF0ZSkKewoJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXNcbiIsIF9fRlVOQ1RJT05fXyAsIGlybGFuX3N0YXRlW3N0YXRlXSk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCglzZWxmLT5jbGllbnQuc3RhdGUgPSBzdGF0ZTsKfQoKdm9pZCBpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgSVJMQU5fU1RBVEUgc3RhdGUpCnsKCUlSREFfREVCVUcoMiwgIiVzKCksICVzXG4iLCBfX0ZVTkNUSU9OX18gLCBpcmxhbl9zdGF0ZVtzdGF0ZV0pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJc2VsZi0+cHJvdmlkZXIuc3RhdGUgPSBzdGF0ZTsKfQoK