LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIEZyZWVSVE9TK1RyYWNlIHYyLjMuMCBSZWNvcmRlciBMaWJyYXJ5DQogKiBQZXJjZXBpbyBBQiwgd3d3LnBlcmNlcGlvLmNvbQ0KICoNCiAqIHRyY1VzZXIuYw0KICoNCiAqIFRoZSBwdWJsaWMgQVBJIG9mIHRoZSB0cmFjZSByZWNvcmRlciBsaWJyYXJ5Lg0KICoNCiAqIFRlcm1zIG9mIFVzZQ0KICogVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgUGVyY2VwaW8gQUIuIFRoZSByZWNvcmRlciBsaWJyYXJ5IGlzIGZyZWUgZm9yDQogKiB1c2UgdG9nZXRoZXIgd2l0aCBQZXJjZXBpbyBwcm9kdWN0cy4gWW91IG1heSBkaXN0cmlidXRlIHRoZSByZWNvcmRlciBsaWJyYXJ5DQogKiBpbiBpdHMgb3JpZ2luYWwgZm9ybSwgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMgaW4gdHJjUG9ydC5jIGFuZCB0cmNQb3J0LmgNCiAqIGdpdmVuIHRoYXQgdGhlc2UgbW9kaWZpY2F0aW9uIGFyZSBjbGVhcmx5IG1hcmtlZCBhcyB5b3VyIG93biBtb2RpZmljYXRpb25zDQogKiBhbmQgZG9jdW1lbnRlZCBpbiB0aGUgaW5pdGlhbCBjb21tZW50IHNlY3Rpb24gb2YgdGhlc2Ugc291cmNlIGZpbGVzLiANCiAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBQZXJjZXBpbyBBQiBhbmQgbWF5IG5vdCBiZSANCiAqIHNvbGQgb3IgaW4gb3RoZXIgd2F5cyBjb21tZXJjaWFsbHkgcmVkaXN0cmlidXRlZCB3aXRob3V0IGV4cGxpY2l0IHdyaXR0ZW4gDQogKiBwZXJtaXNzaW9uIGJ5IFBlcmNlcGlvIEFCLg0KICoNCiAqIERpc2NsYWltZXIgDQogKiBUaGUgdHJhY2UgdG9vbCBhbmQgcmVjb3JkZXIgbGlicmFyeSBpcyBiZWluZyBkZWxpdmVyZWQgdG8geW91IEFTIElTIGFuZCANCiAqIFBlcmNlcGlvIEFCIG1ha2VzIG5vIHdhcnJhbnR5IGFzIHRvIGl0cyB1c2Ugb3IgcGVyZm9ybWFuY2UuIFBlcmNlcGlvIEFCIGRvZXMgDQogKiBub3QgYW5kIGNhbm5vdCB3YXJyYW50IHRoZSBwZXJmb3JtYW5jZSBvciByZXN1bHRzIHlvdSBtYXkgb2J0YWluIGJ5IHVzaW5nIHRoZSANCiAqIHNvZnR3YXJlIG9yIGRvY3VtZW50YXRpb24uIFBlcmNlcGlvIEFCIG1ha2Ugbm8gd2FycmFudGllcywgZXhwcmVzcyBvciANCiAqIGltcGxpZWQsIGFzIHRvIG5vbmluZnJpbmdlbWVudCBvZiB0aGlyZCBwYXJ0eSByaWdodHMsIG1lcmNoYW50YWJpbGl0eSwgb3IgDQogKiBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJbiBubyBldmVudCB3aWxsIFBlcmNlcGlvIEFCLCBpdHMgDQogKiB0ZWNobm9sb2d5IHBhcnRuZXJzLCBvciBkaXN0cmlidXRvcnMgYmUgbGlhYmxlIHRvIHlvdSBmb3IgYW55IGNvbnNlcXVlbnRpYWwsIA0KICogaW5jaWRlbnRhbCBvciBzcGVjaWFsIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgbG9zdCBwcm9maXRzIG9yIGxvc3Qgc2F2aW5ncywgDQogKiBldmVuIGlmIGEgcmVwcmVzZW50YXRpdmUgb2YgUGVyY2VwaW8gQUIgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgDQogKiBvZiBzdWNoIGRhbWFnZXMsIG9yIGZvciBhbnkgY2xhaW0gYnkgYW55IHRoaXJkIHBhcnR5LiBTb21lIGp1cmlzZGljdGlvbnMgZG8gDQogKiBub3QgYWxsb3cgdGhlIGV4Y2x1c2lvbiBvciBsaW1pdGF0aW9uIG9mIGluY2lkZW50YWwsIGNvbnNlcXVlbnRpYWwgb3Igc3BlY2lhbCANCiAqIGRhbWFnZXMsIG9yIHRoZSBleGNsdXNpb24gb2YgaW1wbGllZCB3YXJyYW50aWVzIG9yIGxpbWl0YXRpb25zIG9uIGhvdyBsb25nIGFuIA0KICogaW1wbGllZCB3YXJyYW50eSBtYXkgbGFzdCwgc28gdGhlIGFib3ZlIGxpbWl0YXRpb25zIG1heSBub3QgYXBwbHkgdG8geW91Lg0KICoNCiAqIEZyZWVSVE9TK1RyYWNlIGlzIGF2YWlsYWJsZSBhcyBGcmVlIEVkaXRpb24gYW5kIGluIHR3byBwcmVtaXVtIGVkaXRpb25zLg0KICogWW91IG1heSB1c2UgdGhlIHByZW1pdW0gZmVhdHVyZXMgZHVyaW5nIDMwIGRheXMgZm9yIGV2YWx1YXRpb24uDQogKiBEb3dubG9hZCBGcmVlUlRPUytUcmFjZSBhdCBodHRwOi8vd3d3LnBlcmNlcGlvLmNvbS9wcm9kdWN0cy9kb3dubG9hZHMvDQogKg0KICogQ29weXJpZ2h0IFBlcmNlcGlvIEFCLCAyMDEyLg0KICogd3d3LnBlcmNlcGlvLmNvbQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHN0ZGFyZy5oPg0KDQojaW5jbHVkZSAidHJjVXNlci5oIg0KI2luY2x1ZGUgInRhc2suaCINCiNpbmNsdWRlICJzZW1waHIuaCINCg0KI2lmIChjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSkNCg0KZXh0ZXJuIHVpbnQ4X3QgaW5FeGNsdWRlZFRhc2s7DQpleHRlcm4gdWludDhfdCBuSVNSYWN0aXZlOw0KZXh0ZXJuIHVpbnQ4X3QgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2s7DQpleHRlcm4gdWludDMyX3QgZHRzX21pbjsNCmV4dGVybiB1aW50MzJfdCBod3RjX2NvdW50X21heF9hZnRlcl90aWNrOw0KZXh0ZXJuIHVpbnQzMl90IGh3dGNfY291bnRfc3VtX2FmdGVyX3RpY2s7DQpleHRlcm4gdWludDMyX3QgaHd0Y19jb3VudF9zdW1fYWZ0ZXJfdGlja19jb3VudGVyOw0KZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdWNRdWV1ZUdldFF1ZXVlVHlwZSh2b2lkKik7DQpleHRlcm4gdW5zaWduZWQgY2hhciB1Y1F1ZXVlR2V0UXVldWVOdW1iZXIodm9pZCopOw0KZXh0ZXJuIGNoYXIqIHRyYWNlRXJyb3JNZXNzYWdlOw0Kc3RhdGljIHZvaWQgdlRyYWNlTW9uaXRvclRhc2sodm9pZCk7DQpzdGF0aWMgdm9pZCBwcnZUcmFjZUV4Y2x1ZGVPckluY2x1ZGVLZXJuZWxTZXJ2aWNlRnJvbVRyYWNlKHRyYWNlS2VybmVsU2VydmljZSwgdWludDhfdCk7DQogICAgDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlTW9uaXRvclRhc2sNCiAqDQogKiBBIHRhc2sgd2hpY2ggcGVyaW9kaWNhbGx5IHJlcG9ydHMgdGhlIHJlY29yZGVyIHN0YXR1cyB0byB0aGUgY29uc29sZS4NCiAqIFRoaXMgaXMgaW5jbHVkZWQgZGVwZW5kaW5nIG9uIFVTRV9UUkFDRV9QUk9HUkVTU19NT05JVE9SX1RBU0suDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgdlRyYWNlTW9uaXRvclRhc2sodm9pZCkNCnsgICAgDQogICAgcG9ydFRpY2tUeXBlIHhOZXh0V2FrZVRpbWU7DQogICAgY2hhciBsb2NhbHNwcmludGJ1ZmZlcls5MF07DQogICAgY2hhciogZXJyID0gTlVMTDsgICAgDQogICAgY2hhciogbGFzdEVyciA9IE5VTEw7ICAgICAgDQogICAgI2RlZmluZSBTVEFURV9JTklUIDANCiAgICAjZGVmaW5lIFNUQVRFX1NUQVJURUQgMQ0KICAgICNkZWZpbmUgU1RBVEVfU1RPUFBFRCAyICAgIA0KICAgIGludCBzdGF0ZSA9IFNUQVRFX0lOSVQ7DQogICAgDQogICAgdlRyYWNlQ29uc29sZU1lc3NhZ2UoIlxuXHJbRnJlZVJUT1MrVHJhY2VdIE1vbml0b3IgdGFzayBzdGFydGVkLi4uXG5cciIpOw0KDQogICAgLyogSW5pdGlhbGlzZSB4TmV4dFdha2VUaW1lIC0gdGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgb25jZS4gKi8NCiAgICB4TmV4dFdha2VUaW1lID0geFRhc2tHZXRUaWNrQ291bnQoKTsNCg0KICAgIGZvciAoOzspDQogICAgew0KICAgICAgICBsYXN0RXJyID0gZXJyOyAgICAgICAgDQogICAgICAgIGVyciA9IHhUcmFjZUdldExhc3RFcnJvcigpOw0KICAgICAgICBpZiAoZXJyICE9IGxhc3RFcnIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHNwcmludGYobG9jYWxzcHJpbnRidWZmZXIsICJcblxyW0ZyZWVSVE9TK1RyYWNlXSBFcnJvcjogJXNcblxyIiwgZXJyKTsNCiAgICAgICAgICAgIHZUcmFjZUNvbnNvbGVNZXNzYWdlKGxvY2Fsc3ByaW50YnVmZmVyKTsgDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChzdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IHN0YXRlID09IFNUQVRFX0lOSVQpIA0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSA9PSAxKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfU1RBUlRFRDsNCiAgICAgICAgICAgICAgICB2VHJhY2VDb25zb2xlTWVzc2FnZSgiXG5ccltGcmVlUlRPUytUcmFjZV0gUmVjb3JkZXIgc3RhcnRlZC5cblxyIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0lOSVQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgdlRyYWNlQ29uc29sZU1lc3NhZ2UoIlxuXHJbRnJlZVJUT1MrVHJhY2VdIFJlY29yZGVyIG5vdCBzdGFydGVkLlxuXHIiKTsNCiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TVE9QUEVEOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX1NUQVJURUQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChSZWNvcmRlckRhdGFQdHItPmZyZXF1ZW5jeSA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3ByaW50Zihsb2NhbHNwcmludGJ1ZmZlciwgDQogICAgICAgICAgICAgICAgICAgICJcblxyW0ZyZWVSVE9TK1RyYWNlXSBFdmVudCBjb3VudDogJWQsIER1cmF0aW9uOiAlZCBtcy4gWyVkIHRpY2tzXVxuXHIiLCANCiAgICAgICAgICAgICAgICAgICAgKGludClSZWNvcmRlckRhdGFQdHItPm51bUV2ZW50cywgDQogICAgICAgICAgICAgICAgICAgIChpbnQpKFJlY29yZGVyRGF0YVB0ci0+YWJzVGltZUxhc3RFdmVudFNlY29uZCoxMDAwICsgKFJlY29yZGVyRGF0YVB0ci0+YWJzVGltZUxhc3RFdmVudCoxMDAwKS8gUmVjb3JkZXJEYXRhUHRyLT5mcmVxdWVuY3kpLCAoaW50KXhUYXNrR2V0VGlja0NvdW50KCkpOw0KICAgICAgICAgICAgICAgIHZUcmFjZUNvbnNvbGVNZXNzYWdlKGxvY2Fsc3ByaW50YnVmZmVyKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7DQogICAgICAgICAgICAgICAgdlRyYWNlQ29uc29sZU1lc3NhZ2UoIlxuXHJbRnJlZVJUT1MrVHJhY2VdIFJlY29yZGVyIHN0b3BwZWQuXG5cciIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHZUcmFjZVBvcnRFbmQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICANCg0KICAgICAgICB9DQoNCiAgICAvKiBQbGFjZSB0aGlzIHRhc2sgaW4gdGhlIGJsb2NrZWQgc3RhdGUgdW50aWwgaXQgaXMgdGltZSB0byBydW4gYWdhaW4uICovDQogICAgICAgIHZUYXNrRGVsYXlVbnRpbCggJnhOZXh0V2FrZVRpbWUsIFRSQUNFX1BST0dSRVNTX01PTklUT1JfVEFTS19QRVJJT0QpOw0KICAgICAgICANCiAgICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDbGVhcg0KICoNCiAqIFJlc2V0cyB0aGUgcmVjb3JkZXIuIE9ubHkgbmVjZXNzYXJ5IGlmIGEgcmVzdGFydCBpcyBkZXNpcmVkIC0gdGhpcyBpcyBub3QgDQogKiBuZWVkZWQgaW4gdGhlIHN0YXJ0dXAgaW5pdGlhbGl6YXRpb24uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VDbGVhcih2b2lkKQ0Kew0KICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCiAgICANCiAgICBSZWNvcmRlckRhdGFQdHItPmFic1RpbWVMYXN0RXZlbnQgPSAwOw0KICAgIFJlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCA9IDA7DQogICAgUmVjb3JkZXJEYXRhUHRyLT5udW1FdmVudHMgPSAwOw0KICAgIFJlY29yZGVyRGF0YVB0ci0+YnVmZmVySXNGdWxsID0gMDsNCg0KICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQogICAgDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdGFydFN0YXR1c01vbml0b3INCiAqDQogKiBUaGlzIHN0YXJ0cyBhIHRhc2sgdG8gbW9uaXRvciB0aGUgc3RhdGUgb2a9IHRoZSByZWNvcmRlci4gDQogKiBUaGlzIHRhc2sgcGVyaW9kaWNhbGx5IHByaW50cyBhIGxpbmUgdG8gdGhlIGNvbnNvbGUgd2luZG93LCB3aGljaCBzaG93cyB0aGUgDQogKiBudW1iZXIgb2YgZXZlbnRzIHJlY29yZGVkIGFuZCB0aGUgbGF0ZXN0IHRpbWVzdGFtcC4gVGhpcyB0YXNrDQogKiBjYWxscyB2VHJhY2VQb3J0RW5kIHdoZW4gdGhlIHJlY29yZGVyIGhhcyBiZWVuIHN0b3BwZWQsIHdoZXJlIGN1c3RvbQ0KICogYWN0aW9ucyBjYW4gYmUgYWRkZWQsIGUuZy4sIHRvIHN0b3JlIHRoZSB0cmFjZSB0byBhIGZpbGUNCiAqIGlmIGEgZmlsZSBzeXN0ZW0gaXMgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTdGFydFN0YXR1c01vbml0b3Iodm9pZCkNCnsgICAgDQogICAgdlRyYWNlQ29uc29sZU1lc3NhZ2UoIlxuXHJbRnJlZVJUT1MrVHJhY2VdIFN0YXJ0aW5nIFRyYWNlIFN0YXR1cyBNb25pdG9yLi4uXG5cciIpOw0KICAgICh2b2lkKXhUYXNrQ3JlYXRlKCAocGRUQVNLX0NPREUpdlRyYWNlTW9uaXRvclRhc2ssIChjb25zdCBzaWduZWQgY2hhciopIlRyYWNlTW9uIiwgVFJBQ0VfUFJPR1JFU1NfTU9OSVRPUl9UQVNLX1NUQUNLU0laRSwgTlVMTCwgVFJBQ0VfUFJPR1JFU1NfTU9OSVRPUl9UQVNLX1BSSU9SSVRZLCBOVUxMICk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlU3RhcnQNCiAqDQogKiBTdGFydHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkZXIgd2lsbCBub3QgYmUgc3RhcnRlZCBpZiBhbiBlcnJvciBoYXMgYmVlbg0KICogaW5kaWNhdGVkIHVzaW5nIHZUcmFjZUVycm9yLCBlLmcuIGlmIGFueSBvZiB0aGUgTnggY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oIA0KICogaGFzIGEgdG9vIHNtYWxsIHZhbHVlIChOVEFTSywgTlFVRVVFLCBldGMpLg0KICogDQogKiBSZXR1cm5zIDEgaWYgdGhlIHJlY29yZGVyIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4NCiAqIFJldHVybnMgMCBpZiB0aGUgcmVjb3JkZXIgc3RhcnQgd2FzIHByZXZlbnRlZCBkdWUgdG8gYSBwcmV2aW91cyBpbnRlcm5hbCANCiAqIGVycm9yLiBJbiB0aGF0IGNhc2UsIGNoZWNrIHZUcmFjZUdldExhc3RFcnJvciB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UuDQogKiBBbnkgZXJyb3IgbWVzc2FnZSBpcyBhbHNvIHByZXNlbnRlZCB3aGVuIG9wZW5pbmcgYSB0cmFjZSBmaWxlIGluIA0KICogRnJlZVJUT1MrVHJhY2UgdjIuMi4yIG9yIGxhdGVyLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KdWludDMyX3QgdWlUcmFjZVN0YXJ0KHZvaWQpDQp7ICAgICAgICANCiAgICBpZiAodHJhY2VFcnJvck1lc3NhZ2UgPT0gTlVMTCkNCiAgICB7DQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCiAgICAgICAgUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSA9IDE7DQogICAgICAgIHZUcmFjZVN0b3JlVGFza3N3aXRjaCgpOyAvKiBSZWdpc3RlciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzayAqLw0KICAgICAgICB0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KICAgIH0NCg0KICAgIHJldHVybiBSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU3RhcnQgDQogKg0KICogU3RhcnRzIHRoZSByZWNvcmRlci4gVGhlIHJlY29yZGVyIHdpbGwgbm90IGJlIHN0YXJ0ZWQgaWYgYW4gZXJyb3IgaGFzIGJlZW4NCiAqIGluZGljYXRlZCB1c2luZyB2VHJhY2VFcnJvciwgZS5nLiBpZiBhbnkgb2YgdGhlIE54IGNvbnN0YW50cyBpbiB0cmNDb25maWcuaCANCiAqIGhhcyBhIHRvbyBzbWFsbCB2YWx1ZSAoTlRBU0ssIE5RVUVVRSwgZXRjKS4NCiAqIA0KICogVGhpcyBmdW5jdGlvbiBpcyBvYnNvbGV0ZSwgYnV0IGhhcyBiZWVuIHNhdmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gDQogKiBXZSByZWNvbW1lbmQgdXNpbmcgdWlUcmFjZVN0YXJ0IGluc3RlYWQuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTdGFydCh2b2lkKQ0KeyAgICAgICAgDQogICAgKHZvaWQpdWlUcmFjZVN0YXJ0KCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9wDQogKg0KICogU3RvcHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkaW5nIGNhbiBiZSByZXN1bWVkIGJ5IGNhbGxpbmcgdlRyYWNlU3RhcnQuDQogKiBUaGlzIGRvZXMgbm90IHJlc2V0IHRoZSByZWNvcmRlci4gVXNlIHZUcmFjZUNsZWFyIGlzIHRoYXQgaXMgZGVzaXJlZC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3Aodm9pZCkNCnsNCiAgICBSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlID0gMDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHhUcmFjZUdldExhc3RFcnJvcg0KICoNCiAqIEdpdmVzIHRoZSBsYXN0IGVycm9yIG1lc3NhZ2UsIGlmIGFueS4gTlVMTCBpZiBubyBlcnJvciBtZXNzYWdlIGlzIHN0b3JlZC4NCiAqIFRoZSBtZXNzYWdlIGlzIGNsZWFyZWQgb24gcmVhZC4NCiAqIEFueSBlcnJvciBtZXNzYWdlIGlzIGFsc28gcHJlc2VudGVkIHdoZW4gb3BlbmluZyBhIHRyYWNlIGZpbGUgaW4gDQogKiBGcmVlUlRPUytUcmFjZSB2Mi4yLjIgb3IgbGF0ZXIuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KY2hhciogeFRyYWNlR2V0TGFzdEVycm9yKHZvaWQpDQp7ICAgDQogICAgcmV0dXJuIHRyYWNlRXJyb3JNZXNzYWdlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlR2V0VHJhY2VCdWZmZXINCiAqIA0KICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlY29yZGVyIGRhdGEgc3RydWN0dXJlLiBVc2UgdGhpcyB0b2dldGhlciB3aXRoIA0KICogdWlUcmFjZUdldFRyYWNlQnVmZmVyU2l6ZSBpZiB5b3Ugd2lzaCB0byBpbXBsZW1lbnQgYW4gb3duIHN0b3JlL3VwbG9hZCANCiAqIHNvbHV0aW9uLCBlLmcuLCBpbiBjYXNlIGEgZGVidWdnZXIgY29ubmVjdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB1cGxvYWRpbmcgDQogKiB0aGUgZGF0YS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlcih2b2lkKQ0Kew0KICAgIHJldHVybiBSZWNvcmRlckRhdGFQdHI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlR2V0VHJhY2VCdWZmZXJTaXplDQogKiANCiAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHJlY29yZGVyIGRhdGEgc3RydWN0dXJlLiBGb3IgdXNlIHRvZ2V0aGVyIHdpdGggDQogKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlciBpZiB5b3Ugd2lzaCB0byBpbXBsZW1lbnQgYW4gb3duIHN0b3JlL3VwbG9hZCBzb2x1dGlvbiwgDQogKiBlLmcuLCBpbiBjYXNlIGEgZGVidWdnZXIgY29ubmVjdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB1cGxvYWRpbmcgdGhlIGRhdGEuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdWludDMyX3QgdWlUcmFjZUdldFRyYWNlQnVmZmVyU2l6ZSh2b2lkKQ0Kew0KICAgIHJldHVybiBzaXplb2YoUmVjb3JkZXJEYXRhVHlwZSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBwcnZUcmFjZUV4Y2x1ZGVPckluY2x1ZGVLZXJuZWxTZXJ2aWNlRnJvbVRyYWNlDQogKiANCiAqIEluY2x1ZGVzIG9yIGV4Y2x1ZGVzIGFsbCBldmVudHMgdGhhdCBpcyByZWxhdGVkIHRvIHRoZSBrZXJuZWwgc2VydmljZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCBwcnZUcmFjZUV4Y2x1ZGVPckluY2x1ZGVLZXJuZWxTZXJ2aWNlRnJvbVRyYWNlKHRyYWNlS2VybmVsU2VydmljZSBrZXJuZWxTZXJ2aWNlLCB1aW50OF90IGZsYWcpDQp7DQogICAgc3dpdGNoKGtlcm5lbFNlcnZpY2UpDQogICAgew0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfVEFTS19DUkVBVEU6DQogICAgICAgIGlmIChmbGFnKQ0KICAgICAgICB7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9DUkVBVEUgKyBUUkFDRV9DTEFTU19UQVNLKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9DUkVBVEUgKyBUUkFDRV9DTEFTU19UQVNLKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQ1JFQVRFICsgVFJBQ0VfQ0xBU1NfVEFTSyk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9DUkVBVEUgKyBUUkFDRV9DTEFTU19UQVNLKTsNCiAgICAgICAgfQ0KICAgICAgICBicmVhazsNCiAgICBjYXNlIFRSQUNFX0tFUk5FTF9TRVJWSUNFX1RBU0tfREVMRVRFOg0KICAgICAgICBpZiAoZmxhZykNCiAgICAgICAgew0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfREVMRVRFICsgVFJBQ0VfQ0xBU1NfVEFTSyk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0RFTEVURSArIFRSQUNFX0NMQVNTX1RBU0spOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfVEFTS19ERUxBWToNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChUQVNLX0RFTEFZKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChUQVNLX0RFTEFZX1VOVElMKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKFRBU0tfREVMQVkpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoVEFTS19ERUxBWV9VTlRJTCk7DQogICAgICAgIH0NCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSBUUkFDRV9LRVJORUxfU0VSVklDRV9QUklPUklUWV9TRVQ6DQogICAgICAgIGlmIChmbGFnKQ0KICAgICAgICB7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoVEFTS19QUklPUklUWV9TRVQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoVEFTS19QUklPUklUWV9TRVQpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfVEFTS19TVVNQRU5EOg0KICAgICAgICBpZiAoZmxhZykNCiAgICAgICAgew0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKFRBU0tfU1VTUEVORCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChUQVNLX1NVU1BFTkQpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfVEFTS19SRVNVTUU6DQogICAgICAgIGlmIChmbGFnKQ0KICAgICAgICB7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoVEFTS19SRVNVTUUpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKFRBU0tfUkVTVU1FX0ZST01fSVNSKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKFRBU0tfUkVTVU1FKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKFRBU0tfUkVTVU1FX0ZST01fSVNSKTsNCiAgICAgICAgfQ0KICAgICAgICBicmVhazsNCiAgICBjYXNlIFRSQUNFX0tFUk5FTF9TRVJWSUNFX1FVRVVFX0NSRUFURToNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0NSRUFURSArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9DUkVBVEUgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0NSRUFURSArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX0NSRUFURSArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgfQ0KICAgICAgICBicmVhazsNCiAgICBjYXNlIFRSQUNFX0tFUk5FTF9TRVJWSUNFX1FVRVVFX0RFTEVURToNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0RFTEVURSArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfREVMRVRFICsgVFJBQ0VfQ0xBU1NfUVVFVUUpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfUVVFVUVfU0VORDoNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1NFTkQgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfU0VORCArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0JMT0NLX09OX1NFTkQgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9TRU5EX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfUVVFVUUpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX1NFTkRfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9TRU5EICsgVFJBQ0VfQ0xBU1NfUVVFVUUpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfU0VORCArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQkxPQ0tfT05fU0VORCArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfU0VORF9GUk9NX0lTUiArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX1NFTkRfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgIH0NCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSBUUkFDRV9LRVJORUxfU0VSVklDRV9RVUVVRV9SRUNFSVZFOg0KICAgICAgICBpZiAoZmxhZykNCiAgICAgICAgew0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfUkVDRUlWRSArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9SRUNFSVZFICsgVFJBQ0VfQ0xBU1NfUVVFVUUpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQkxPQ0tfT05fUkVDRUlWRSArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1JFQ0VJVkVfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfUkVDRUlWRV9GUk9NX0lTUiArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfUkVDRUlWRSArIFRSQUNFX0NMQVNTX1FVRVVFKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX1JFQ0VJVkUgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0JMT0NLX09OX1JFQ0VJVkUgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1JFQ0VJVkVfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9SRUNFSVZFX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfUVVFVUUpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfUVVFVUVfUEVFSzoNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1BFRUsgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9QRUVLICsgVFJBQ0VfQ0xBU1NfU0VNQVBIT1JFKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1BFRUsgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1BFRUsgKyBUUkFDRV9DTEFTU19RVUVVRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1BFRUsgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9QRUVLICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfTVVURVhfQ1JFQVRFOg0KICAgICAgICBpZiAoZmxhZykNCiAgICAgICAgew0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQ1JFQVRFICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX0NSRUFURSArIFRSQUNFX0NMQVNTX01VVEVYKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQ1JFQVRFICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfQ1JFQVRFICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfTVVURVhfREVMRVRFOg0KICAgICAgICBpZiAoZmxhZykNCiAgICAgICAgew0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfREVMRVRFICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9ERUxFVEUgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgIH0NCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSBUUkFDRV9LRVJORUxfU0VSVklDRV9NVVRFWF9HSVZFOg0KICAgICAgICBpZiAoZmxhZykNCiAgICAgICAgew0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfU0VORCArIFRSQUNFX0NMQVNTX01VVEVYKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9TRU5EICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQkxPQ0tfT05fU0VORCArIFRSQUNFX0NMQVNTX01VVEVYKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1NFTkRfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfU0VORF9GUk9NX0lTUiArIFRSQUNFX0NMQVNTX01VVEVYKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfU0VORCArIFRSQUNFX0NMQVNTX01VVEVYKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX1NFTkQgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0JMT0NLX09OX1NFTkQgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1NFTkRfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9TRU5EX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfTVVURVhfVEFLRToNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1JFQ0VJVkUgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfUkVDRUlWRSArIFRSQUNFX0NMQVNTX01VVEVYKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0JMT0NLX09OX1JFQ0VJVkUgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9SRUNFSVZFX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX1JFQ0VJVkVfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1JFQ0VJVkUgKyBUUkFDRV9DTEFTU19NVVRFWCk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9SRUNFSVZFICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9CTE9DS19PTl9SRUNFSVZFICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9SRUNFSVZFX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfTVVURVgpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfUkVDRUlWRV9GUk9NX0lTUiArIFRSQUNFX0NMQVNTX01VVEVYKTsNCiAgICAgICAgfQ0KICAgICAgICBicmVhazsNCiAgICBjYXNlIFRSQUNFX0tFUk5FTF9TRVJWSUNFX1NFTUFQSE9SRV9DUkVBVEU6DQogICAgICAgIGlmIChmbGFnKQ0KICAgICAgICB7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9DUkVBVEUgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX0NSRUFURSArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0NSRUFURSArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9DUkVBVEUgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVFJBQ0VfS0VSTkVMX1NFUlZJQ0VfU0VNQVBIT1JFX0RFTEVURToNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0RFTEVURSArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0RFTEVURSArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgIH0NCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSBUUkFDRV9LRVJORUxfU0VSVklDRV9TRU1BUEhPUkVfR0lWRToNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1NFTkQgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX1NFTkQgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQkxPQ0tfT05fU0VORCArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9TRU5EX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfU0VNQVBIT1JFKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9TRU5EX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfU0VNQVBIT1JFKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfU0VORCArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9TRU5EICsgVFJBQ0VfQ0xBU1NfU0VNQVBIT1JFKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQkxPQ0tfT05fU0VORCArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1NFTkRfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfU0VORF9GUk9NX0lTUiArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgIH0NCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSBUUkFDRV9LRVJORUxfU0VSVklDRV9TRU1BUEhPUkVfVEFLRToNCiAgICAgICAgaWYgKGZsYWcpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1JFQ0VJVkUgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfRkFJTEVEX1JFQ0VJVkUgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICAgICAgU0VUX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQkxPQ0tfT05fUkVDRUlWRSArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgICAgICBTRVRfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9SRUNFSVZFX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfU0VNQVBIT1JFKTsNCiAgICAgICAgICAgIFNFVF9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9SRUNFSVZFX0ZST01fSVNSICsgVFJBQ0VfQ0xBU1NfU0VNQVBIT1JFKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfUkVDRUlWRSArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX0ZBSUxFRF9SRUNFSVZFICsgVFJBQ0VfQ0xBU1NfU0VNQVBIT1JFKTsNCiAgICAgICAgICAgIENMRUFSX0VWRU5UX0NPREVfRkxBR19JU0VYQ0xVREVEKEVWRU5UR1JPVVBfQkxPQ0tfT05fUkVDRUlWRSArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgICAgICBDTEVBUl9FVkVOVF9DT0RFX0ZMQUdfSVNFWENMVURFRChFVkVOVEdST1VQX1JFQ0VJVkVfRlJPTV9JU1IgKyBUUkFDRV9DTEFTU19TRU1BUEhPUkUpOw0KICAgICAgICAgICAgQ0xFQVJfRVZFTlRfQ09ERV9GTEFHX0lTRVhDTFVERUQoRVZFTlRHUk9VUF9GQUlMRURfUkVDRUlWRV9GUk9NX0lTUiArIFRSQUNFX0NMQVNTX1NFTUFQSE9SRSk7DQogICAgICAgIH0NCiAgICAgICAgYnJlYWs7DQogICAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VFeGNsdWRlX19fX19fRnJvbVRyYWNlDQogKg0KICogRXhjbHVkZXMgYSB0YXNrIG9yIG9iamVjdCBmcm9tIHRoZSB0cmFjZS4NCiAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBzb21lIGlycmVsZXZhbnQgdGFzayBpcyB2ZXJ5IGZyZXF1ZW50IGFuZCBpcyAiZWF0aW5nDQogKiB1cCB0aGUgYnVmZmVyIi4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSB0YXNrIGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCANCiAqIGJlZm9yZSBzdGFydGluZyB0aGUgRnJlZVJUT1Mgc2NoZWR1bGVyLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VFeGNsdWRlUXVldWVGcm9tVHJhY2Uodm9pZCogaGFuZGxlKQ0Kew0KICAgIFNFVF9RVUVVRV9GTEFHX0lTRVhDTFVERUQodWNRdWV1ZUdldFF1ZXVlTnVtYmVyKGhhbmRsZSkpOw0KfQ0KDQp2b2lkIHZUcmFjZUV4Y2x1ZGVTZW1hcGhvcmVGcm9tVHJhY2Uodm9pZCogaGFuZGxlKQ0Kew0KICAgIFNFVF9TRU1BUEhPUkVfRkxBR19JU0VYQ0xVREVEKHVjUXVldWVHZXRRdWV1ZU51bWJlcihoYW5kbGUpKTsNCn0NCg0Kdm9pZCB2VHJhY2VFeGNsdWRlTXV0ZXhGcm9tVHJhY2Uodm9pZCogaGFuZGxlKQ0Kew0KICAgIFNFVF9NVVRFWF9GTEFHX0lTRVhDTFVERUQodWNRdWV1ZUdldFF1ZXVlTnVtYmVyKGhhbmRsZSkpOw0KfQ0KDQp2b2lkIHZUcmFjZUV4Y2x1ZGVUYXNrRnJvbVRyYWNlKHZvaWQqIGhhbmRsZSkNCnsNCiAgICBTRVRfVEFTS19GTEFHX0lTRVhDTFVERUQodXhUYXNrR2V0VGFza051bWJlcihoYW5kbGUpKTsNCn0NCg0Kdm9pZCB2VHJhY2VFeGNsdWRlS2VybmVsU2VydmljZUZyb21UcmFjZSh0cmFjZUtlcm5lbFNlcnZpY2Uga2VybmVsU2VydmljZSkNCnsNCiAgICBwcnZUcmFjZUV4Y2x1ZGVPckluY2x1ZGVLZXJuZWxTZXJ2aWNlRnJvbVRyYWNlKGtlcm5lbFNlcnZpY2UsIDEpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VJbmNsdWRlX19fX19fSW5UcmFjZQ0KICoNCiAqIEluY2x1ZGVzIGEgdGFzaywgb2JqZWN0IG9yIGtlcm5lbCBzZXJ2aWNlIGluIHRoZSB0cmFjZS4gVGhpcyBpcyBvbmx5DQogKiBuZWNlc3NhcnkgaWYgdGhlIHRhc2sgb3Igb2JqZWN0IGhhcyBiZWVuIHByZXZpb3VzbHkgZXhsdWRlZC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlSW5jbHVkZVF1ZXVlSW5UcmFjZSh2b2lkKiBoYW5kbGUpDQp7DQogICAgQ0xFQVJfUVVFVUVfRkxBR19JU0VYQ0xVREVEKHVjUXVldWVHZXRRdWV1ZU51bWJlcihoYW5kbGUpKTsNCn0NCg0Kdm9pZCB2VHJhY2VJbmNsdWRlU2VtYXBob3JlSW5UcmFjZSh2b2lkKiBoYW5kbGUpDQp7DQogICAgQ0xFQVJfU0VNQVBIT1JFX0ZMQUdfSVNFWENMVURFRCh1Y1F1ZXVlR2V0UXVldWVOdW1iZXIoaGFuZGxlKSk7DQp9DQoNCnZvaWQgdlRyYWNlSW5jbHVkZU11dGV4SW5UcmFjZSh2b2lkKiBoYW5kbGUpDQp7DQogICAgQ0xFQVJfTVVURVhfRkxBR19JU0VYQ0xVREVEKHVjUXVldWVHZXRRdWV1ZU51bWJlcihoYW5kbGUpKTsNCn0NCg0Kdm9pZCB2VHJhY2VJbmNsdWRlVGFza0luVHJhY2Uodm9pZCogaGFuZGxlKQ0Kew0KICAgIENMRUFSX1RBU0tfRkxBR19JU0VYQ0xVREVEKHV4VGFza0dldFRhc2tOdW1iZXIoaGFuZGxlKSk7DQp9DQoNCnZvaWQgdlRyYWNlSW5jbHVkZUtlcm5lbFNlcnZpY2VJblRyYWNlKHRyYWNlS2VybmVsU2VydmljZSBrZXJuZWxTZXJ2aWNlKQ0Kew0KICAgIHBydlRyYWNlRXhjbHVkZU9ySW5jbHVkZUtlcm5lbFNlcnZpY2VGcm9tVHJhY2Uoa2VybmVsU2VydmljZSwgMCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTZXRRdWV1ZU5hbWUNCiAqDQogKiBBc3NpZ25zIGEgbmFtZSB0byBhIEZyZWVSVE9TIFF1ZXVlLCBTZW1hcGhvcmUgb3IgTXV0ZXguIFRoaXMgZnVuY3Rpb24gc2hvdWxkDQogKiBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHF1ZXVlL211dGV4L3NlbWFwaG9yZS4gSWYgbm90IHVzaW5nIA0KICogdGhpcyBmdW5jdGlvbiwgdGhlIHF1ZXVlcy9tdXRleGVzL3NlbWFwaG9yZXMgd2lsbCBiZSBwcmVzZW50ZWQgYnkgdGhlaXINCiAqIG51bWVyaWMgaGFuZGxlIG9ubHkuDQogKg0KICogRXhhbXBsZToNCiAqICAgICBhY3R1YXRvclEgPSB4UXVldWVDcmVhdGUoMywgc2l6ZW9mKFF1ZXVlTWVzc2FnZSkpOw0KICogICAgIHZUcmFjZVNldFF1ZXVlTmFtZShhY3R1YXRvclEsICJBY3R1YXRvclF1ZXVlIik7DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRRdWV1ZU5hbWUodm9pZCogcXVldWUsIGNvbnN0IGNoYXIqIG5hbWUpDQp7DQogICAgaW50IHQgPSB1Y1F1ZXVlR2V0UXVldWVUeXBlKHF1ZXVlKTsgICAgDQogICAgdlRyYWNlU2V0T2JqZWN0TmFtZShUcmFjZU9iamVjdENsYXNzVGFibGVbdF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdEhhbmRsZVR5cGUpdWNRdWV1ZUdldFF1ZXVlTnVtYmVyKHF1ZXVlKSwgbmFtZSk7DQp9DQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlVGFza0luc3RhbmNlSXNGaW5pc2hlZA0KICogDQogKiBUaGlzIGRlZmluZXMgYW4gZXhwbGljaXQgSW5zdGFuY2UgRmluaXNoIEV2ZW50IGZvciB0aGUgY3VycmVudCB0YXNrLiBJdCB0ZWxscyANCiAqIHRoZSByZWNvcmRlciB0aGF0IHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoaXMgdGFzayBpcyBmaW5pc2hlZCBhdCB0aGUgbmV4dCANCiAqIGtlcm5lbCBjYWxsIG9mIHRoZSB0YXNrLCBlLmcuLCBhIHRhc2tEZWxheSBvciBhIHF1ZXVlIHJlY2VpdmUuIFRoaXMgZnVuY3Rpb24gDQogKiBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgYXBpIGZ1bmN0aW9uIGNhbGwgY29uc2lkZXJlZCB0byBiZSB0aGUgZW5kIA0KICogb2YgdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZSwgaS5lLiwgdGhlIEluc3RhbmNlIEZpbmlzaCBFdmVudC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlVGFza0luc3RhbmNlSXNGaW5pc2hlZCgpDQp7DQogICAgaWYgKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCiAgICAgICAgU0VUX1RBU0tfRkxBR19NQVJLSUZFKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKTsgICAgDQogICAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdnZUcmFjZVRhc2tTa2lwRGVmYXVsdEluc3RhbmNlRmluaXNoZWRFdmVudHMNCiAqDQogKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgaW1wbGljaXQgSW5zdGFuY2UgRmluaXNoIEV2ZW50cywgc3VjaCBhcyANCiAqIHZUYXNrRGVsYXlVbnRpbCBvciB4UXVldWVSZWNlaXZlLCBpbiBhIHRhc2sgd2hlcmUgYW4gZXhwbGljaXQgSW5zdGFuY2UgRmluaXNoIA0KICogRXZlbnQgaGFzIGJlZW4gZGVmaW5lZC4gVGhpcyBmdW5jdGlvbiB0ZWxscyB0aGUgcmVjb3JkZXIgdGhhdCBvbmx5IHRoZSANCiAqIGV4cGxpY2l0bHkgZGVmaW5lZCBmdW5jdGlvbnMsIHVzaW5nIHZUcmFjZVRhc2tJbnN0YW5jZUlzRmluaXNoZWQsIHNob3VsZCBiZQ0KICogdHJlYXRlZCBhcyBJbnN0YW5jZSBGaW5pc2ggRXZlbnRzIGZvciB0aGlzIHRhc2suIFRoZSBpbXBsaWNpdCBJbnN0YW5jZSBGaW5pc2ggDQogKiBFdmVudHMgYXJlIHRodXMgZGlzcmVnYXJkZWQgZm9yIHRoZSBjYWxsaW5nIHRhc2suDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VUYXNrU2tpcERlZmF1bHRJbnN0YW5jZUZpbmlzaGVkRXZlbnRzKCkNCnsgICAgDQogICAgaWYgKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCiAgICAgICAgUFJPUEVSVFlfVEFTS19JRkVfU0VSVklDRUNPREUoaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spID0gDQogICAgICAgICAgUkVTRVJWRURfRFVNTVlfQ09ERTsNCiAgICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBJbnRlcnJ1cHQgcmVjb3JkaW5nIGZ1bmN0aW9ucyANCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZiAoSU5DTFVERV9JU1JfVFJBQ0lORyA9PSAxKQ0KDQojZGVmaW5lIE1BWF9JU1JfTkVTVElORyAxNg0Kc3RhdGljIHVpbnQ4X3QgaXNyc3RhY2tbTUFYX0lTUl9ORVNUSU5HXTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVNldElTUlByb3BlcnRpZXMNCiAqIA0KICogUmVnaXN0ZXJzIGFuIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgaW4gdGhlIHJlY29yZGVyIGxpYnJhcnksIFRoaXMgbXVzdCBiZQ0KICogY2FsbGVkIGJlZm9yZSB1c2luZyB2VHJhY2VTdG9yZUlTUkJlZ2luIHRvIHN0b3JlIElTUiBldmVudHMuIFRoaXMgaXMgDQogKiB0eXBpY2FsbHkgY2FsbGVkIGluIHRoZSBzdGFydHVwIG9mIHRoZSBzeXN0ZW0sIGJlZm9yZSB0aGUgc2NoZWR1bGVyIGlzIA0KICogc3RhcnRlZC4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqICAgICAgICAgLi4uDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSRW5kKCk7DQogKiAgICAgfQ0KICoNCiAqIE5PVEU6IFRvIHNhZmVseSByZWNvcmQgSVNScywgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHRyYWNlZCANCiAqIGludGVycnVwdHMgYWN0dWFsbHkgYXJlIGRpc2FibGVkIGJ5IHRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKSwgd2hpY2ggDQogKiB0eXBpY2FsbHkgaXMgbWFwcGVkIHRvIHBvcnRFTlRFUl9DUklUSUNBTCgpLCB3aGljaCB1c2VzIHRoZSBtYWNybyANCiAqIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMuIEhvd2V2ZXIsIGluIHNvbWUgcG9ydHMgb2YgRnJlZVJUT1MgYW5kIGRlcGVuZGluZyBvbiANCiAqIEZyZWVSVE9TIGNvbmZpZ3VyYXRpb24sIHRoaXMgZG9lcyBub3QgZGlzYWJsZSBoaWdoIHByaW9yaXR5IGludGVycnVwdHMhDQogKiBJZiBhbiBJU1IgY2FsbHMgdlRyYWNlU3RvcmVJU1JCZWdpbiB3aGlsZSB0aGUgcmVjb3JkZXIgaXMgYnVzeSwgaXQgd2lsbA0KICogc3RvcCB0aGUgcmVjb3JkaW5nIGFuZCBnaXZlIGFuIGVycm9yIG1lc3NhZ2UuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKG9iamVjdEhhbmRsZVR5cGUgaGFuZGxlLCBjb25zdCBjaGFyKiBuYW1lLCBjaGFyIHByaW9yaXR5KQ0Kew0KICAgIHZUcmFjZVNldE9iamVjdE5hbWUoVFJBQ0VfQ0xBU1NfSVNSLCBoYW5kbGUsIG5hbWUpOw0KICAgIHZUcmFjZVNldFByaW9yaXR5UHJvcGVydHkoVFJBQ0VfQ0xBU1NfSVNSLCBoYW5kbGUsIHByaW9yaXR5KTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3JlSVNSQmVnaW4NCiAqIA0KICogUmVnaXN0ZXJzIHRoZSBiZWdpbm5pbmcgb2YgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxICAgICAgIC8vIGxvd2VzdCB2YWxpZCBJRCBpcyAxDQogKiAgICAgI2RlZmluZSBQUklPX09GX0lTUl9USU1FUjEgMyAgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICogICAgIC4uLg0KICogICAgIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICogICAgIHsNCiAqICAgICAgICAgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqICAgICAgICAgLi4uDQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSRW5kKCk7DQogKiAgICAgfQ0KICoNCiAqIE5PVEU6IFlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSB0cmFjZWQgaW50ZXJydXB0cyBhY3R1YWxseSBhcmUgDQogKiBkaXNhYmxlZCBieSB0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCksIGkuZS4sIHRhc2tFTlRFUl9DUklUSUNBTCgpIHdoaWNoDQogKiB1c2VzIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKS4gDQogKiBJbiBzb21lIHBvcnRzIG9mIEZyZWVSVE9TLCB0aGlzIGRvZXMgbm90IGRpc2FibGUgaGlnaC1wcmlvcml0eSBpbnRlcnJ1cHRzLA0KICogaS5lLiwgd2l0aCBwcmlvcml0aWVzIGFib3ZlIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWS4NCiAqIElmIGFuIGludmFsaWQgY2FsbCB0byB2VHJhY2VTdG9yZUlTUkJlZ2luIGlzIGRldGVjdGVkIChpLmUuLCB0aGF0IHByZWVtcHRlZA0KICogYSBjcml0aWNhbCBzZWN0aW9uIG9mIHRoZSByZWNvcmRlcikgdGhpcyB3aWxsIGdlbmVyYXRlIGEgcmVjb3JkZXIgZXJyb3IgDQogKiB1c2luZyB2VHJhY2VFcnJvci4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVN0b3JlSVNSQmVnaW4ob2JqZWN0SGFuZGxlVHlwZSBoYW5kbGUpDQp7DQogICAgdWludDE2X3QgZHRzNDsNCiAgICBUU0V2ZW50KiB0cyA9IE5VTEw7DQoNCiAgICBpZiAocmVjb3JkZXJfYnVzeSkNCiAgICB7DQogICAgICB2VHJhY2VFcnJvcigiSWxsZWdhbCBjYWxsIHRvIHZUcmFjZVN0b3JlSVNSQmVnaW4vRW5kIik7DQogICAgICByZXR1cm47DQogICAgfQ0KICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsgICAgDQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCiAgICAgICAgZHRzNCA9ICh1aW50MTZfdClwcnZUcmFjZUdldERUUygweEZGRkYpOw0KDQogICAgICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlKSAvKiBOZWVkIHRvIHJlcGVhdCB0aGlzIGNoZWNrISAqLyAgICANCiAgICAgICAgeyAgICANCg0KICAgICAgICAgICAgaWYgKG5JU1JhY3RpdmUgPCBNQVhfSVNSX05FU1RJTkcpDQogICAgICAgICAgICB7ICAgIA0KICAgICAgICAgICAgICAgIGlzcnN0YWNrW25JU1JhY3RpdmVdID0gaGFuZGxlOw0KICAgICAgICAgICAgICAgIG5JU1JhY3RpdmUrKzsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB0cyA9IChUU0V2ZW50Kil4VHJhY2VOZXh0RnJlZUV2ZW50QnVmZmVyU2xvdCgpOw0KICAgICAgICAgICAgICAgIGlmICh0cyAhPSBOVUxMKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdHMtPnR5cGUgPSBUU19JU1JfQkVHSU47DQogICAgICAgICAgICAgICAgICAgIHRzLT5kdHMgPSBkdHM0Ow0KICAgICAgICAgICAgICAgICAgICB0cy0+b2JqSGFuZGxlID0gaGFuZGxlOw0KICAgICAgICAgICAgICAgICAgICBwcnZUcmFjZVVwZGF0ZUNvdW50ZXJzKCk7ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBub3Qgb2NjdXIgdW5sZXNzIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nICovICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdlRyYWNlRXJyb3IoIlRvbyBtYW55IG5lc3RlZCBpbnRlcnJ1cHRzISIpOw0KICAgICAgICAgICAgfSAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsgICAgICAgIA0KICAgIH0NCn0NCg0KDQojaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCg0KaW50IHRhaWxjaGFpbl9pcnFfcGVuZGluZyh2b2lkKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHRhaWxjaGFpbl9pcnFfcGVuZGluZw0KICoNCiAqIEZvciBDb3J0ZXgtTSBjaGlwcyBvbmx5LiBSZXR1cm5zIDEgaWYgYW4gaW50ZXJydXB0IGlzIHBlbmRpbmcsIGJ5IGNoZWNraW5nIA0KICogdGhlIDggTlZJQyBJUlEgcGVuZCByZWdpc3RlcnMgYXQgMHhFMDAwRTIwMCB0byAweEUwMDBFMjFDLiBSZXR1cm5zIDAgaWYgbm8gDQogKiBpbnRlcnJ1cHQgaXMgcGVuZGluZy4gVGhpcyBpcyB1c2VkIHRvIHByZWRpY3QgdGFpbGNoYWluaW5nIG9mIElTUnMuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KaW50IHRhaWxjaGFpbl9pcnFfcGVuZGluZyh2b2lkKQ0Kew0KICB1aW50MzJfdCogcGVuZF9yZWcgPSAoKHVpbnQzMl90KikweEUwMDBFMjAwKTsNCiAgaW50IGk7DQoNCiAgZm9yIChpPTA7IGk8ODsgaSsrKQ0KICB7DQogICAgaWYgKHBlbmRfcmVnW2ldICE9IDApDQogICAgew0KICAgICAgcmV0dXJuIDE7DQogICAgfQ0KICB9DQogIHJldHVybiAwOyAgDQp9DQoNCiNlbmRpZg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU3RvcmVJU1JFbmQNCiAqIA0KICogUmVnaXN0ZXJzIHRoZSBlbmQgb2YgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4gDQogKg0KICogRXhhbXBsZToNCiAqICAgICAjZGVmaW5lIElEX0lTUl9USU1FUjEgMSAgICAgICAvLyBsb3dlc3QgdmFsaWQgSUQgaXMgMQ0KICogICAgICNkZWZpbmUgUFJJT19PRl9JU1JfVElNRVIxIDMgIC8vIHRoZSBoYXJkd2FyZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0DQogKiAgICAgLi4uDQogKiAgICAgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhJRF9JU1JfVElNRVIxLCAiSVNSVGltZXIxIiwgUFJJT19PRl9JU1JfVElNRVIxKTsNCiAqICAgICAuLi4NCiAqICAgICB2b2lkIElTUl9oYW5kbGVyKCkNCiAqICAgICB7DQogKiAgICAgICAgIHZUcmFjZVN0b3JlSVNSQmVnaW4oSURfT0ZfSVNSX1RJTUVSMSk7DQogKiAgICAgICAgIC4uLg0KICogICAgICAgICB2VHJhY2VTdG9yZUlTUkVuZCgpOw0KICogICAgIH0NCiAqDQogKiBOT1RFOiBZb3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgdHJhY2VkIGludGVycnVwdHMgYWN0dWFsbHkgYXJlIA0KICogZGlzYWJsZWQgYnkgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpLCBpLmUuLCB0YXNrRU5URVJfQ1JJVElDQUwoKSB3aGljaA0KICogdXNlcyBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkuIA0KICogSW4gc29tZSBwb3J0cyBvZiBGcmVlUlRPUywgdGhpcyBkb2VzIG5vdCBkaXNhYmxlIGhpZ2gtcHJpb3JpdHkgaW50ZXJydXB0cywNCiAqIGkuZS4sIHdpdGggcHJpb3JpdGllcyBhYm92ZSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkuDQogKiBJZiBhbiBpbnZhbGlkIGNhbGwgdG8gdlRyYWNlU3RvcmVJU1JFbmQgaXMgZGV0ZWN0ZWQgKGkuZS4sIHRoYXQgcHJlZW1wdGVkDQogKiBhIGNyaXRpY2FsIHNlY3Rpb24gb2YgdGhlIHJlY29yZGVyKSB0aGlzIHdpbGwgZ2VuZXJhdGUgYSByZWNvcmRlciBlcnJvciANCiAqIHVzaW5nIHZUcmFjZUVycm9yLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcmVJU1JFbmQodm9pZCkNCnsNCiAgICBUU0V2ZW50KiB0czsNCiAgICB1aW50MTZfdCBkdHM1Ow0KDQogICAgaWYgKHJlY29yZGVyX2J1c3kpDQogICAgew0KICAgICAgdlRyYWNlRXJyb3IoIklsbGVnYWwgY2FsbCB0byB2VHJhY2VTdG9yZUlTUkJlZ2luL0VuZCIpOw0KICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICANCiAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSAmJiBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzaykNCiAgICB7DQogICAgICAgICNpZiAoU0VMRUNURURfUE9SVCA9PSBQT1JUX0FSTV9Db3J0ZXhNKQ0KICAgICAgICBpZiAodGFpbGNoYWluX2lycV9wZW5kaW5nKCkgPiAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBuSVNSYWN0aXZlLS07IC8qIElmIGFuIElSUSBzdHJpa2VzIGV4YWN0bHkgaGVyZSwgdGhlIHJlc3VsdGluZyANCiAgICAgICAgICAgIElTUiB0YWlsY2hhaW5pbmcgaXMgbm90IGRldGVjdGVkLiBUaGUgdHJhY2UgaW5zdGVhZCBzaG93cyBhIHZlcnkgDQogICAgICAgICAgICBzaG9ydCBmcmFnbWVudCBvZiB0aGUgZWFybGllciBwcmVlbXB0ZWQgdGFzay9JU1IsIGFuZCB0aGVuIHRoZSBuZXcNCiAgICAgICAgICAgIElTUiBiZWdpbnMuICovDQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgI2VuZGlmDQogICAgICANCiAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KICAgICAgICBkdHM1ID0gKHVpbnQxNl90KXBydlRyYWNlR2V0RFRTKDB4RkZGRik7DQoNCiAgICAgICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUpIC8qIE5lZWQgdG8gcmVwZWF0IHRoaXMgY2hlY2shICovICAgIA0KICAgICAgICB7ICAgIA0KICAgICAgICAgICAgdHMgPSAoVFNFdmVudCopeFRyYWNlTmV4dEZyZWVFdmVudEJ1ZmZlclNsb3QoKTsNCiAgICAgICAgICAgIGlmICh0cyAhPSBOVUxMKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChuSVNSYWN0aXZlID4gMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiB0byBhbm90aGVyIGlzciAqLw0KICAgICAgICAgICAgICAgICAgICB0cy0+dHlwZSA9IFRTX0lTUl9SRVNVTUU7DQogICAgICAgICAgICAgICAgICAgIHRzLT5vYmpIYW5kbGUgPSBpc3JzdGFja1tuSVNSYWN0aXZlXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRvIHRhc2sgKi8NCiAgICAgICAgICAgICAgICAgICAgdHMtPnR5cGUgPSBUU19UQVNLX1JFU1VNRTsNCiAgICAgICAgICAgICAgICAgICAgdHMtPm9iakhhbmRsZSA9IGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0cy0+ZHRzID0gZHRzNTsNCiAgICAgICAgICAgICAgICBuSVNSYWN0aXZlLS07DQogICAgICAgICAgICAgICAgcHJ2VHJhY2VVcGRhdGVDb3VudGVycygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7ICAgICAgICANCiAgICB9DQp9DQoNCiNlbHNlDQoNCi8qIElTUiB0cmFjaW5nIGlzIHR1cm5lZCBvZmYgKi8NCnZvaWQgdlRyYWNlSW5jcmVhc2VJU1JBY3RpdmUodm9pZCkNCnsNCiAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSAmJiBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzaykNCiAgICAgICAgbklTUmFjdGl2ZSsrOw0KfQ0KDQp2b2lkIHZUcmFjZURlY3JlYXNlSVNSQWN0aXZlKG9iamVjdEhhbmRsZVR5cGUgaGFuZGxlKQ0Kew0KICAgIGlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgICAgICBuSVNSYWN0aXZlLS07DQp9DQojZW5kaWYNCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogVXNlciBFdmVudCBmdW5jdGlvbnMNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpZiAoSU5DTFVERV9VU0VSX0VWRU5UUyA9PSAxKQ0KDQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlVXNlckV2ZW50DQogKg0KICogQmFzaWMgdXNlciBldmVudCAoU3RhbmRhcmQgYW5kIFByb2Zlc3Npb25hbCBFZGl0aW9uIG9ubHkpDQogKiANCiAqIEdlbmVyYXRlcyBhIFVzZXIgRXZlbnQgd2l0aCBhIHRleHQgbGFiZWwuIFRoZSBsYWJlbCBpcyBjcmVhdGVkL2xvb2tlZCB1cA0KICogaW4gdGhlIHN5bWJvbCB0YWJsZSB1c2luZyB4VHJhY2VPcGVuTGFiZWwuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VVc2VyRXZlbnQodHJhY2VMYWJlbCBldmVudExhYmVsKQ0Kew0KICAgIFVzZXJFdmVudCogdWU7DQogICAgdWludDhfdCBkdHMxOw0KDQogICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSApICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KICAgIHsNCiAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KDQogICAgICAgIGR0czEgPSAodWludDhfdClwcnZUcmFjZUdldERUUygweEZGKTsNCg0KICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkgLyogTmVlZCB0byByZXBlYXQgdGhpcyBjaGVjayEgKi8gICAgDQogICAgICAgIHsgICAgICAgDQogICAgICAgICAgICB1ZSA9IChVc2VyRXZlbnQqKSB4VHJhY2VOZXh0RnJlZUV2ZW50QnVmZmVyU2xvdCgpOw0KICAgICAgICAgICAgaWYgKHVlICE9IE5VTEwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdWUtPmR0cyA9IGR0czE7DQogICAgICAgICAgICAgICAgdWUtPnR5cGUgPSBVU0VSX0VWRU5UOw0KICAgICAgICAgICAgICAgIHVlLT5wYXlsb2FkID0gZXZlbnRMYWJlbDsNCiAgICAgICAgICAgICAgICBwcnZUcmFjZVVwZGF0ZUNvdW50ZXJzKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsgICAgICAgIA0KICAgIH0NCn0NCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCg0KLyogb25lIHdvcmQgKDMyIGJpdCkgaXMgcmVxdWlyZWQgZm9yIHRoZSBVU0VSX0VWRU5UIGVudHJ5LCA4IHdvcmRzIA0KKDgqMzIgYml0ID0gMzIgYnl0ZSkgYXZhaWxhYmxlIGZvciBhcmd1bWVudCBkYXRhICovDQojZGVmaW5lIE1BWF9BUkdfU0laRSAoNCszMikgICAgDQoNCnN0YXRpYyB1aW50OF90IHdyaXRlSW50OCh2b2lkICogYnVmZmVyLCB1aW50OF90IGksIHVpbnQ4X3QgdmFsdWUpOw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQxNih2b2lkICogYnVmZmVyLCB1aW50OF90IGksIHVpbnQxNl90IHZhbHVlKTsNCnN0YXRpYyB1aW50OF90IHdyaXRlSW50MzIodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpLCB1aW50MzJfdCB2YWx1ZSk7DQoNCiNpZiAoSU5DTFVERV9GTE9BVF9TVVBQT1JUKQ0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVGbG9hdCh2b2lkICogYnVmZmVyLCB1aW50OF90IGksIGZsb2F0IHZhbHVlKTsNCnN0YXRpYyB1aW50OF90IHdyaXRlRG91YmxlKHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaSwgZG91YmxlIHZhbHVlKTsNCiNlbmRpZg0KDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQ4KHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaSwgdWludDhfdCB2YWx1ZSkNCnsgICAgDQogICAgDQogICAgaWYgKGkgPj0gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoNCiAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSB2YWx1ZTsNCg0KCWlmIChpICsgMSA+IE1BWF9BUkdfU0laRSkNCgl7DQoJCXJldHVybiAyNTU7DQoJfQ0KDQogICAgcmV0dXJuIGkgKyAxOw0KfQ0KDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQxNih2b2lkICogYnVmZmVyLCB1aW50OF90IGksIHVpbnQxNl90IHZhbHVlKQ0KewkNCiAgICAvKiBBbGlnbiB0byBtdWx0aXBsZSBvZiAyICovDQogICAgd2hpbGUgKChpICUgMikgIT0gMCkNCiAgICB7DQoJCWlmIChpID49IE1BWF9BUkdfU0laRSkNCgkJew0KCQkJcmV0dXJuIDI1NTsNCgkJfQ0KCQkgICAgICAgIA0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSAwOw0KICAgICAgICBpKys7ICAgICAgICANCiAgICB9DQogICAgDQogICAgaWYgKGkgKyAyID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9DQoNCiAgICAoKHVpbnQxNl90KilidWZmZXIpW2kvMl0gPSB2YWx1ZTsNCg0KICAgIHJldHVybiBpICsgMjsNCn0NCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlSW50MzIodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpLCB1aW50MzJfdCB2YWx1ZSkNCnsNCiAgICANCiAgICAvKiBBIDMyIGJpdCB2YWx1ZSBzaG91bGQgYmVnaW4gYXQgYW4gZXZlbiA0LWJ5dGUgYWRkcmVzcyAqLw0KICAgIHdoaWxlICgoaSAlIDQpICE9IDApDQogICAgew0KCQlpZiAoaSA+PSBNQVhfQVJHX1NJWkUpDQoJCXsNCgkJCXJldHVybiAyNTU7DQoJCX0NCgkJDQogICAgICAgICgodWludDhfdCopYnVmZmVyKVtpXSA9IDA7DQogICAgICAgIGkrKzsNCiAgICB9DQogICAgDQogICAgaWYgKGkgKyA0ID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9ICAgICAgICANCg0KICAgICgodWludDMyX3QqKWJ1ZmZlcilbaS80XSA9IHZhbHVlOw0KDQogICAgcmV0dXJuIGkgKyA0Ow0KfQ0KDQojaWYgKElOQ0xVREVfRkxPQVRfU1VQUE9SVCkNCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlRmxvYXQodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpLCBmbG9hdCB2YWx1ZSkNCnsNCiAgICAvKiBBIDMyIGJpdCB2YWx1ZSBzaG91bGQgYmVnaW4gYXQgYW4gZXZlbiA0LWJ5dGUgYWRkcmVzcyAqLw0KICAgIHdoaWxlICgoaSAlIDQpICE9IDApDQogICAgew0KCQlpZiAoaSA+PSBNQVhfQVJHX1NJWkUpDQoJCXsNCgkJCXJldHVybiAyNTU7DQoJCX0NCg0KICAgICAgICAoKHVpbnQ4X3QqKWJ1ZmZlcilbaV0gPSAwOw0KICAgICAgICBpKys7DQogICAgfQ0KDQogICAgaWYgKGkgKyA0ID4gTUFYX0FSR19TSVpFKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDI1NTsNCiAgICB9ICAgICAgICANCg0KICAgICgoZmxvYXQqKWJ1ZmZlcilbaS80XSA9IHZhbHVlOw0KICAgIA0KICAgIHJldHVybiBpICsgNDsNCn0NCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlRG91YmxlKHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaSwgZG91YmxlIHZhbHVlKQ0Kew0KICAgIHVpbnQzMl90ICogZGVzdCA9IGJ1ZmZlcjsNCiAgICB1aW50MzJfdCAqIHNyYyA9ICh2b2lkKikmdmFsdWU7DQogICAgLyogVGhlIGRvdWJsZSBpcyB3cml0dGVuIGFzIHR3byAzMiBiaXQgdmFsdWVzLCBhbmQgc2hvdWxkIGJlZ2luIGF0IGFuIGV2ZW4gDQogICAgNC1ieXRlIGFkZHJlc3MgKHRvIGF2b2lkIGhhdmluZyB0byBhbGlnbiB3aXRoIDggYnl0ZSkgKi8NCiAgICB3aGlsZSAoaSAlIDQgIT0gMCkNCiAgICB7DQoJCWlmIChpID49IE1BWF9BUkdfU0laRSkNCgkJew0KCQkJcmV0dXJuIDI1NTsNCgkJfQ0KDQogICAgICAgICgodWludDhfdCopYnVmZmVyKVtpXSA9IDA7DQogICAgICAgIGkrKzsgICAgICAgIA0KICAgIH0NCiAgICANCiAgICBpZiAoaSArIDggPiBNQVhfQVJHX1NJWkUpDQogICAgew0KICAgICAgICByZXR1cm4gMjU1Ow0KICAgIH0gICAgICAgDQogICAgDQogICAgZGVzdFtpLzQrMF0gPSBzcmNbMF07DQogICAgZGVzdFtpLzQrMV0gPSBzcmNbMV07DQogICAgDQogICAgcmV0dXJuIGkgKyA4Ow0KfQ0KDQojZW5kaWYNCg0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVByaW50RiANCiAqIA0KICogQWR2YW5jZWQgdXNlciBldmVudHMgKFByb2Zlc3Npb25hbCBFZGl0aW9uIG9ubHkpDQogKg0KICogR2VuZXJhdGVzIFVzZXIgRXZlbnQgd2l0aCBmb3JtYXR0ZWQgdGV4dCBhbmQgZGF0YSwgc2ltaWxhciB0byBhICJwcmludGYiLg0KICogSXQgaXMgdmVyeSBmYXN0IGNvbXBhcmVkIHRvIGEgbm9ybWFsICJwcmludGYiIHNpbmNlIHRoaXMgZnVuY3Rpb24gb25seSANCiAqIHN0b3JlcyB0aGUgYXJndW1lbnRzLiBUaGUgYWN0dWFsIGZvcm1hdHRpbmcgaXMgZG9uZQ0KICogb24gdGhlIGhvc3QgUEMgd2hlbiB0aGUgdHJhY2UgaXMgZGlzcGxheWVkIGluIHRoZSB2aWV3ZXIgdG9vbC4gDQogKg0KICogVXNlciBFdmVudCBsYWJlbHMgYXJlIGNyZWF0ZWQgdXNpbmcgeFRyYWNlT3BlbkxhYmVsLg0KICogRXhhbXBsZToNCiAqDQogKiAgICAgdHJhY2VMYWJlbCBhZGNfdWVjaGFubmVsID0geFRyYWNlT3BlbkxhYmVsKCJBREMgVXNlciBFdmVudHMiKTsNCiAqICAgICAuLi4NCiAqICAgICB2VHJhY2VQcmludChhZGNfdWVjaGFubmVsLCANCiAqICAgICAgICAgICAgICAgICAiQURDIGNoYW5uZWwgJWQ6ICVsZiB2b2x0cyIsIA0KICogICAgICAgICAgICAgICAgIGNoLCAoZG91YmxlKWFkY19yZWFkaW5nLyhkb3VibGUpc2NhbGUpOw0KICoNCiAqIFRoaXMgY2FuIGJlIGNvbWJpbmVkIGludG8gb25lIGxpbmUsIGlmIGRlc2lyZWQsIGJ1dCB0aGlzIGlzIHNsb3dlcjoNCiAqDQogKiAgICAgdlRyYWNlUHJpbnQoeFRyYWNlT3BlbkxhYmVsKCJBREMgVXNlciBFdmVudHMiKSwgDQogKiAgICAgICAgICAgICAgICAgIkFEQyBjaGFubmVsICVkOiAlbGYgdm9sdHMiLCANCiAqICAgICAgICAgICAgICAgICBjaCwgKGRvdWJsZSlhZGNfcmVhZGluZy8oZG91YmxlKXNjYWxlKTsNCiAqDQogKiBDYWxsaW5nIHhUcmFjZU9wZW5MYWJlbCBtdWx0aXBsZSB0aW1lcyB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIGVudHJpZXMsIGJ1dA0KICogaXQgaXMgb2YgY291cnNlIGZhc3RlciB0byBqdXN0IGRvIGl0IG9uY2UsIGFuZCB0aGVuIGtlZXAgdGhlIGhhbmRsZSBmb3IgbGF0ZXIgDQogKiB1c2UuIElmIHlvdSBkb260dCBoYXZlIGFueSBkYXRhIGFyZ3VtZW50cywgb25seSBhIHRleHQgbGFiZWwvc3RyaW5nLCBpdCBpcyANCiAqIGJldHRlciB0byB1c2UgdlRyYWNlVXNlckV2ZW50IC0gaXQgaXMgZmFzdGVyLg0KICoNCiAqIEZvcm1hdCBzcGVjaWZpZXJzIHN1cHBvcnRlZDoNCiAqICAlZCAtIDMyIGJpdCBzaWduZWQgaW50ZWdlcg0KICogICV1IC0gMzIgYml0IHVuc2lnbmVkIGludGVnZXINCiAqICAlZiAtIDMyIGJpdCBmbG9hdA0KICogICVzIC0gc3RyaW5nIChpcyBjb3BpZWQgdG8gdGhlIHJlY29yZGVyIHN5bWJvbCB0YWJsZSkNCiAqICAlaGQgLSAxNiBiaXQgc2lnbmVkIGludGVnZXINCiAqICAlaHUgLSAxNiBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogICViZCAtIDggYml0IHNpZ25lZCBpbnRlZ2VyDQogKiAgJWJ1IC0gOCBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogICVsZiAtIGRvdWJsZS1wcmVjaXNpb24gZmxvYXQNCiAqIA0KICogVXAgdG8gMTUgZGF0YSBhcmd1bWVudHMgYXJlIGFsbG93ZWQsIHdpdGggYSB0b3RhbCBzaXplIG9mIG1heGltdW0gMzIgYnl0ZS4NCiAqIEluIGNhc2UgdGhpcyBpcyBleGNlZWRlZCwgdGhlIHVzZXIgZXZlbnQgaXMgY2hhbmdlZCBpbnRvIGFuIGVycm9yIG1lc3NhZ2UuDQogKiANCiAqIFRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0cmFjZSBidWZmZXIsIGFuZCBpcyBwYWNrZWQgdG8gYWxsb3cgc3RvcmluZyBtdWx0aXBsZSANCiAqIHNtYWxsZXIgZGF0YSBlbnRyaWVzIGluIHRoZSBzYW1lIDQtYnl0ZSByZWNvcmQsIGUuZy4sIGZvdXIgOC1iaXQgdmFsdWVzLg0KICogQSBzdHJpbmcgcmVxdWlyZXMgdHdvIGJ5dGVzLCBhcyB0aGUgc3ltYm9sIHRhYmxlIGlzIGxpbWl0ZWQgdG8gNjRLLiBTdG9yaW5nIGEgDQogKiBkb3VibGUgKCVsZikgdXNlcyB0d28gcmVjb3Jkcywgc28gdGhpcyBpcyBxdWl0ZSBjb3N0bHkuIFVzZSBmbG9hdCAoJWYpIHVubGVzcw0KICogdGhlIGhpZ2hlciBwcmVjaXNpb24gaXMgcmVhbGx5IG5lY2Vzc2FyeS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVByaW50Rih0cmFjZUxhYmVsIGV2ZW50TGFiZWwsIGNvbnN0IGNoYXIqIGZvcm1hdFN0ciwgLi4uKQ0Kew0KICAgIFVzZXJFdmVudCogdWUxOw0KICAgIHZhX2xpc3Qgdmw7DQogICAgdWludDhfdCBhcmdDb3VudGVyID0gMDsNCiAgICB1aW50OF90IGkgPSAwOw0KICAgIHVpbnQ4X3Qgbm9mRXZlbnRFbnRyaWVzID0gMDsNCiAgICB1aW50MTZfdCBmb3JtYXRTdHJJbmRleCA9IDA7ICAgIA0KDQogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgKiBUaGUgYXJyYXkgdGVtcERhdGFCdWZmZXIgaXMgYSBsb2NhbCBidWZmZXIgdXNlZCBpbiBhIHR3by1waGFzZSBjb21taXQgb2YgDQogICAgKiB0aGUgZXZlbnQgZGF0YSwgc2luY2UgYSB2VHJhY2VQcmludEYgbWF5IHNwYW4gb3ZlciBtdWx0aXBsZSBzbG90cyBpbiB0aGUgDQogICAgKiBidWZmZXIuDQogICAgKiBUaGlzIGJ1ZmZlciBjYW4gYmUgbWFkZSBsYXJnZXIsIG9mIGNvdXJzZSwgYnV0IHJlbWVtYmVyIHRoZSByaXNrIGZvciANCiAgICAqIHN0YWNrIG92ZXJmbG93LiBOb3RlOiBUaGlzIHNob3VsZCBiZSBhIExPQ0FMIGJ1ZmZlciwgbXVzdCBub3QgYmUgbWFkZSANCiAgICAqIGdsb2JhbC4gVGhhdCB3b3VsZCBjYXVzZSBkYXRhIGNvcnJ1cHRpb24gd2hlbiB0d28gY2FsbHMgdG8gdlRyYWNlUHJpbnRGDQogICAgKiBmcm9tIGRpZmZlcmVudCB0YXNrcyBvdmVybGFwcyAoaW50ZXJydXB0cyBhcmUgb25seSBkaXNhYmxlZCBpbiBhIHNtYWxsIA0KICAgICogcGFydCBvZiB0aGlzIGZ1bmN0aW9uLCBvdGhlcndpc2UgZW5hYmxlZCkNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQ0KICAgIHVpbnQzMl90IHRlbXBEYXRhQnVmZmVyWygzICsgTUFYX0FSR19TSVpFKSAvIDRdOyAgIA0KCQ0KCQ0KICAgIGlmICgoaW5FeGNsdWRlZFRhc2sgPT0gMCkgJiYNCiAgICAgICAgKG5JU1JhY3RpdmUgPT0gMCkgJiYNCiAgICAgICAgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgPT0gMSkgJiYNCiAgICAgICAgKGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrID4gMCkpDQogICAgeyAgICAgICAgDQogICAgICAgIC8qIEZpcnN0LCB3cml0ZSB0aGUgInByaW1hcnkiIHVzZXIgZXZlbnQgZW50cnkgaW4gdGhlIGxvY2FsIGJ1ZmZlciwgYnV0IA0KICAgICAgICBsZXQgdGhlIGV2ZW50IHR5cGUgYmUgIkVWRU5UX0JFSU5HX1dSSVRURU4iIGZvciBub3cuLi4qLw0KDQogICAgICAgIHVlMSA9IChVc2VyRXZlbnQqKSgmdGVtcERhdGFCdWZmZXJbMF0pOyAgICAgICAgIA0KICAgICAgICB1ZTEtPnR5cGUgPSBFVkVOVF9CRUlOR19XUklUVEVOOyAgICAgIC8qIFVwZGF0ZSB0aGlzIGFzIHRoZSBsYXN0IHN0ZXAgKi8NCiAgICAgICAgDQogICAgICAgIGkgPSA0Ow0KICAgICAgICBmb3JtYXRTdHJJbmRleCA9IDA7DQogICAgICAgIHZhX3N0YXJ0KHZsLCBmb3JtYXRTdHIpOyAgICAgICAgICAvKiBCZWdpbiByZWFkaW5nIHRoZSBhcmd1bWVudHMgbGlzdCAqLw0KDQogICAgICAgIHdoaWxlIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdICE9ICdcMCcpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdID09ICclJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBhcmdDb3VudGVyKys7DQoNCiAgICAgICAgICAgICAgICBpZiAoYXJnQ291bnRlciA+IDE1KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdlRyYWNlRXJyb3IoInZUcmFjZVByaW50RiAtIFRvbyBtYW55IGFyZ3VtZW50cywgbWF4IDE1IGFsbG93ZWQhIik7DQogICAgICAgICAgICAgICAgICAgIHZhX2VuZCh2bCk7ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0U3RyID0gIlt2VHJhY2VQcmludEYgZXJyb3JdIFRvbyBtYW55IGFyZ3VtZW50cywgbWF4IDE1IGFsbG93ZWQhIjsNCiAgICAgICAgICAgICAgICAgICAgaSA9IDQ7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIH0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRoZXNlIGJlbG93IGNvZGUgd3JpdGVzIHJhdyBkYXRhIChwcmltaXRpdmUgZGF0YXR5cGVzKSBpbiB0aGUgZXZlbnQgYnVmZmVyLCANCiAqIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBldmVudCBzdHJ1Y3RzICh3aGVyZSBieXRlIDAgaXMgZXZlbnQgdHlwZSkuDQogKiBUaGVzZSBkYXRhIGVudHJpZXMgbXVzdCBuZXZlciBiZSBpbnRlcnByZXRlZCBhcyByZWFsIGV2ZW50IGRhdGEsIGFzIHRoZSB0eXBlDQogKiBmaWVsZCB3b3VsZCBiZSBtaXNsZWFkaW5nIHNpbmNlIHVzZWQgZm9yIHBheWxvYWQgZGF0YS4gDQogKiANCiAqIFRoZSBjb3JyZWN0bmVzcyBvZiB0aGlzIGVuY29kaW5nIGRlcGVuZHMgb24gdHdvIG1lY2hhbmlzbXM6DQogKiANCiAqIDEuIEFuIGluaXRpYWwgVVNFUl9FVkVOVCwgd2hpY2ggdHlwZSBjb2RlIHRlbGxzIHRoZSBudW1iZXIgb2YgMzItYml0IGRhdGEgDQogKiBlbnRpcmVzIHRoYXQgZm9sbG93cy4gKGNvZGUgLSBVU0VSX0VWRU5UID0gbnVtYmVyIG9mIGRhdGEgZW50cmllcykuIA0KICogTm90ZSB0aGF0IGEgZGF0YSBlbnRyeSBjb3JyZXNwb25kcyB0byB0aGUgc2xvdHMgdGhhdCBub3JtYWxseSBjb3JyZXNwb25kcyB0byANCiAqIG9uZSAoMSkgZXZlbnQsIGkuZS4sIDMyIGJpdHMuIHZUcmFjZVByaW50RiBtYXkgZW5jb2RlIHNldmVyYWwgcGllY2VzIG9mIGRhdGEgDQogKiBpbiBvbmUgZGF0YSBlbnRyeSwgZS5nLiwgdHdvIDE2LWJpdCB2YWx1ZXMgb3IgZm91ciA4LWJpdCB2YWx1ZXMsIG9uZSAxNi1iaXQNCiAqIHZhbHVlIGZvbGxvd2VzIGJ5IHR3byA4LWJpdCB2YWx1ZXMsIGV0Yy4NCiAqDQogKiAyLiBBIHR3by1waGFzZSBjb21taXQgcHJvY2VkdXJlLCB3aGVyZSB0aGUgVVNFUl9FVkVOVCBhbmQgZGF0YSBlbnRyaWVzIGFyZSANCiAqIHdyaXR0ZW4gdG8gYSBsb2NhbCBidWZmZXIgYXQgZmlyc3QsIGFuZCB3aGVuIGFsbCBjaGVja3MgYXJlIE9LIHRoZW4gY29waWVkIHRvDQogKiB0aGUgbWFpbiBldmVudCBidWZmZXIgdXNpbmcgYSBmYXN0IG1lbWNweS4gVGhlIGV2ZW50IGNvZGUgaXMgZmluYWxpemVkIGFzIHRoZQ0KICogdmVyeSBsYXN0IHN0ZXAuIEJlZm9yZSB0aGF0IHRoYXQgc3RlcCwgdGhlIGV2ZW50IGNvZGUgaW5kaWNhdGVzIGFuIHVuZmluaXNoZWQNCiAqIGV2ZW50LCB3aGljaCBjYXVzZXMgaXQgdG8gYmUgaWdub3JlZCBhbmQgc3RvcCB0aGUgbG9hZGluZyBvZiB0aGUgZmlsZSAoc2luY2UgDQogKiBhbiB1bmZpbmlzaGVkIGV2ZW50IGlzIHRoZSBsYXN0IGV2ZW50IGluIHRoZSB0cmFjZSkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAgICAgICAgICAgICAgIGZvcm1hdFN0ckluZGV4Kys7DQogICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdkJzogICAgaSA9IHdyaXRlSW50MzIoKHVpbnQ4X3QqKXRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXZhX2FyZyh2bCwgdWludDMyX3QpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ3UnOiAgICBpID0gd3JpdGVJbnQzMigodWludDhfdCopdGVtcERhdGFCdWZmZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAncyc6ICAgIGkgPSB3cml0ZUludDE2KCh1aW50OF90Kil0ZW1wRGF0YUJ1ZmZlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCl4VHJhY2VPcGVuTGFiZWwoKGNoYXIqKXZhX2FyZyh2bCwgY2hhciopKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KI2lmIChJTkNMVURFX0ZMT0FUX1NVUFBPUlQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFllcywgImRvdWJsZSIgYXMgdHlwZSBhbHNvIGluIHRoZSBmbG9hdCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZS4gVGhpcyBzaW5jZSAiZmxvYXQiIGlzIHByb21vdGVkIGludG8gImRvdWJsZSIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSB2YV9hcmcgc3R1ZmYuICovDQogICAgICAgICAgICAgICAgY2FzZSAnZic6ICAgIGkgPSB3cml0ZUZsb2F0KCh1aW50OF90Kil0ZW1wRGF0YUJ1ZmZlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCl2YV9hcmcodmwsIGRvdWJsZSkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgIA0KI2Vsc2UNCi8qIE5vIHN1cHBvcnQgZm9yIGZsb2F0cywgYnV0IGF0dGVtcHQgdG8gc3RvcmUgYSBmbG9hdCB1c2VyIGV2ZW50DQphdm9pZCBhIHBvc3NpYmxlIGNyYXNoIGR1ZSB0byBmbG9hdCByZWZlcmVuY2UuIEluc3RlYWQgc3RvcmUgdGhlIA0KZGF0YSBvbiB1aW50XzMyIGZvcm1hdCAod2lsbCBub3QgYmUgZGlzcGxheWVkIGFueXdheSkuIFRoaXMgaXMganVzdA0KdG8ga2VlcCB2YV9hcmcgYW5kIGkgY29uc2lzdGVudC4gKi8NCg0KICAgICAgICAgICAgICAgIGNhc2UgJ2YnOiAgICBpID0gd3JpdGVJbnQzMigodWludDhfdCopdGVtcERhdGFCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCl2YV9hcmcodmwsIGRvdWJsZSkpOyANCiNlbmRpZg0KICAgICAgICAgICAgICAgIGNhc2UgJ2wnOg0KICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHJJbmRleCsrOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQogICAgICAgICAgICAgICAgICAgIHsNCiNpZiAoSU5DTFVERV9GTE9BVF9TVVBQT1JUKQ0KICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzogICAgIGkgPSB3cml0ZURvdWJsZSgodWludDhfdCopdGVtcERhdGFCdWZmZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXZhX2FyZyh2bCwgZG91YmxlKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KI2Vsc2UNCi8qIE5vIHN1cHBvcnQgZm9yIGZsb2F0cywgYnV0IGF0dGVtcHQgdG8gc3RvcmUgYSBmbG9hdCB1c2VyIGV2ZW50DQphdm9pZCBhIHBvc3NpYmxlIGNyYXNoIGR1ZSB0byBmbG9hdCByZWZlcmVuY2UuIEluc3RlYWQgc3RvcmUgdGhlIA0KZGF0YSBvbiB1aW50XzMyIGZvcm1hdCAod2lsbCBub3QgYmUgZGlzcGxheWVkIGFueXdheSkuIFRoaXMgaXMganVzdA0KdG8ga2VlcCB2YV9hcmcgYW5kIGkgY29uc2lzdGVudC4gKi8NCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6ICAgIGkgPSB3cml0ZUludDMyKCh1aW50OF90Kil0ZW1wRGF0YUJ1ZmZlciwgLyogSW4gdGhpcyBjYXNlLCB0aGUgdmFsdWUgd2lsbCBub3QgYmUgc2hvd24gYW55d2F5ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXZhX2FyZyh2bCwgZG91YmxlKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHdyaXRlSW50MzIoKHVpbnQ4X3QqKXRlbXBEYXRhQnVmZmVyLCAvKiBEbyBpdCB0d2ljZSwgdG8gd3JpdGUgaW4gdG90YWwgOCBieXRlcyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCl2YV9hcmcodmwsIGRvdWJsZSkpOyANCiNlbmRpZg0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnaCc6DQogICAgICAgICAgICAgICAgICAgIGZvcm1hdFN0ckluZGV4Kys7DQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzogICAgaSA9IHdyaXRlSW50MTYoKHVpbnQ4X3QqKXRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzogICAgaSA9IHdyaXRlSW50MTYoKHVpbnQ4X3QqKXRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgJ2InOg0KICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHJJbmRleCsrOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6ICAgIGkgPSB3cml0ZUludDgoKHVpbnQ4X3QqKXRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzogICAgaSA9IHdyaXRlSW50OCgodWludDhfdCopdGVtcERhdGFCdWZmZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgZm9ybWF0U3RySW5kZXgrKzsgICAgDQogICAgICAgICAgICBpZiAoaSA9PSAyNTUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFfZW5kKHZsKTsNCiAgICAgICAgICAgICAgICAvL3ZUcmFjZUVycm9yKCJ2VHJhY2VQcmludEYgLSBUb28gbGFyZ2UgYXJndW1lbnRzLCBtYXggMzIgYnl0ZSBhbGxvd2VkISIpOw0KICAgICAgICAgICAgICAgIGZvcm1hdFN0ciA9ICJbdlRyYWNlUHJpbnRGIGVycm9yXSBUb28gbGFyZ2UgYXJndW1lbnRzLCBtYXggMzIgYnl0ZSBhbGxvd2VkISI7DQogICAgICAgICAgICAgICAgaSA9IDQ7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YV9lbmQodmwpOw0KCQkNCiAgICAgICAgLyogU3RvcmUgdGhlIGZvcm1hdCBzdHJpbmcsIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIGNoYW5uZWwgc3ltYm9sICovDQogICAgICAgIHVlMS0+cGF5bG9hZCA9IHBydlRyYWNlT3BlblN5bWJvbChmb3JtYXRTdHIsIGV2ZW50TGFiZWwpOyAgICAgDQoNCiAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOyAgDQoNCiAgICAgICAgdWUxLT5kdHMgPSAodWludDhfdClwcnZUcmFjZUdldERUUygweEZGKTsNCiAgICAgICAgaWYgKCEgUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkNCiAgICAgICAgew0KDQogICAgICAgICAgICAvKiBBYm9ydCwgc2luY2UgYW4gWFRTIGV2ZW50IChjcmVhdGVkIGJ5IHBydlRyYWNlR2V0RFRTKSBmaWxsZWQgdGhlIA0KICAgICAgICAgICAgYnVmZmVyLCBhbmQgdGhlIHJlY29yZGVyIHN0b3BwZWQgc2luY2Ugbm90IGNpcmN1bGFyIGJ1ZmZlci4gKi8NCiAgICAgICAgICAgIHRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQogICAgICAgIA0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgbm9mRXZlbnRFbnRyaWVzID0gKGkrMykvNDsNCg0KICAgICAgICAvKiBJZiB0aGUgZGF0YSBkb2VzIG5vdCBmaXQgaW4gdGhlIHJlbWFpbmluZyBtYWluIGJ1ZmZlciwgd3JhcCBhcm91bmQgdG8gDQogICAgICAgIDAgaWYgYWxsb3dlZCwgb3RoZXJ3aXNlIHN0b3AgdGhlIHJlY29yZGVyIGFuZCBxdWl0KS4gKi8NCiAgICAgICAgaWYgKFJlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCArIG5vZkV2ZW50RW50cmllcyA+IFJlY29yZGVyRGF0YVB0ci0+bWF4RXZlbnRzKQ0KICAgICAgICB7DQojaWYgKFJFQ09SREVSX1NUT1JFX01PREUgPT0gU1RPUkVfTU9ERV9SSU5HX0JVRkZFUikNCiAgICAgICAgICAgICh2b2lkKW1lbXNldCgmIFJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdLCANCiAgICAgICAgICAgICAgICAgICAwLCANCiAgICAgICAgICAgICAgICAgICAoUmVjb3JkZXJEYXRhUHRyLT5tYXhFdmVudHMgLSBSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXgpKjQpOw0KICAgICAgICAgICAgUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID0gMDsNCiAgICAgICAgICAgIFJlY29yZGVyRGF0YVB0ci0+YnVmZmVySXNGdWxsID0gMTsNCiNlbHNlDQogICAgICAgICAgICAvKiBBYm9ydCBhbmQgc3RvcCByZWNvcmRlciwgc2luY2UgdGhlIGV2ZW50IGRhdGEgd2lsbCBub3QgZml0IGluIHRoZQ0KICAgICAgICAgICAgYnVmZmVyIGFuZCBub3QgY2lyY3VsYXIgYnVmZmVyIGluIHRoaXMgY2FzZS4uLiAqLw0KICAgICAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsNCiAgICAgICAgICAgIHZUcmFjZVN0b3AoKTsNCg0KICAgICAgICAgICAgDQogICAgICAgICAgICByZXR1cm47DQojZW5kaWYNCiAgICAgICAgfQ0KICAgIA0KI2lmIChSRUNPUkRFUl9TVE9SRV9NT0RFID09IFNUT1JFX01PREVfUklOR19CVUZGRVIpDQogICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIGJ1ZmZlciB0byBiZSBvdmVyd3JpdHRlbiBkb2VzIG5vdCBjb250YWluIGFueSB1c2VyIA0KICAgICAgICBldmVudHMgdGhhdCB3b3VsZCBiZSBwYXJ0aWFsbHkgb3ZlcndyaXR0ZW4uIElmIHNvLCB0aGV5IG11c3QgYmUgImtpbGxlZCINCiAgICAgICAgYnkgcmVwbGFjaW5nIHRoZSB1c2VyIGV2ZW50IGFuZCBmb2xsb3dpbmcgZGF0YSB3aXRoIE5VTEwgZXZlbnRzIChpLmUuLCANCiAgICAgICAgdXNpbmcgYSBtZW1zZXQgdG8gemVybykuKi8NCiAgICAgICAgcHJ2Q2hlY2tEYXRhVG9CZU92ZXJ3cml0dGVuRm9yTXVsdGlFbnRyeVVzZXJFdmVudHMobm9mRXZlbnRFbnRyaWVzKTsNCiNlbmRpZg0KICAgICAgICAvKiBDb3B5IHRoZSBsb2NhbCBidWZmZXIgdG8gdGhlIG1haW4gYnVmZmVyICovDQogICAgICAgICh2b2lkKW1lbWNweSgmIFJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdLCANCiAgICAgICAgICAgICAgIHRlbXBEYXRhQnVmZmVyLCANCiAgICAgICAgICAgICAgIGkpOw0KDQogICAgICAgIC8qIFVwZGF0ZSB0aGUgZXZlbnQgdHlwZSwgaS5lLiwgbnVtYmVyIG9mIGRhdGEgZW50cmllcyBmb2xsb3dpbmcgdGhlIA0KICAgICAgICBtYWluIFVTRVJfRVZFTlQgZW50cnkgKE5vdGU6IGltcG9ydGFudCB0aGF0IHRoaXMgaXMgYWZ0ZXIgdGhlIG1lbWNweSwgDQogICAgICAgIGJ1dCB3aXRoaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24hKSovDQogICAgICAgIFJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdID0gDQogICAgICAgICAgKHVpbnQ4X3QpIFVTRVJfRVZFTlQgKyBub2ZFdmVudEVudHJpZXMgLSAxOyAgICANCiAgICAgICAgDQogICAgICAgIC8qIFVwZGF0ZSB0aGUgbWFpbiBidWZmZXIgZXZlbnQgaW5kZXggKGFscmVhZHkgY2hlY2tlZCB0aGF0IGl0IGZpdHMgaW4gDQogICAgICAgIHRoZSBidWZmZXIsIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHdyYXBwaW5nKSovDQogICAgICAgIA0KICAgICAgICBSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggKz0gbm9mRXZlbnRFbnRyaWVzOw0KICAgICAgICBSZWNvcmRlckRhdGFQdHItPm51bUV2ZW50cyArPSBub2ZFdmVudEVudHJpZXM7DQogICAgICAgIA0KICAgICAgICBpZiAoUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID49IEVWRU5UX0JVRkZFUl9TSVpFKQ0KICAgICAgICB7DQogICAgICAgIA0KI2lmIChSRUNPUkRFUl9TVE9SRV9NT0RFID09IFNUT1JFX01PREVfUklOR19CVUZGRVIpDQogICAgICAgICAgICBSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggPSAwOw0KICAgICAgICAgICAgUmVjb3JkZXJEYXRhUHRyLT5idWZmZXJJc0Z1bGwgPSAxOw0KI2Vsc2UNCiAgICAgICAgICAgIHZUcmFjZVN0b3AoKTsNCiNlbmRpZg0KICAgICAgICB9DQoNCiAgICAgICAgdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsNCiAgICB9ICAgIA0KfQ0KICAgIA0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHhUcmFjZU9wZW5MYWJlbA0KICogDQogKiBDcmVhdGVzIHVzZXIgZXZlbnQgbGFiZWxzIGZvciB1c2VyIGV2ZW50IGNoYW5uZWxzIG9yIGZvciBpbmRpdmlkdWFsIGV2ZW50cy4NCiAqIFVzZXIgZXZlbnRzIGNhbiBiZSB1c2VkIHRvIGxvZyBhcHBsaWNhdGlvbiBldmVudHMgYW5kIGRhdGEgZm9yIGRpc3BsYXkgaW4NCiAqIHRoZSB2aXN1YWxpemF0aW9uIHRvb2wuIEEgdXNlciBldmVudCBpcyBpZGVudGlmaWVkIGJ5IGEgbGFiZWwsIGkuZS4sIGEgc3RyaW5nLA0KICogd2hpY2ggaXMgc3RvcmVkIGluIHRoZSByZWNvcmRlcidzIHN5bWJvbCB0YWJsZS4NCiAqIFdoZW4gbG9nZ2luZyBhIHVzZXIgZXZlbnQsIGEgbnVtZXJpYyBoYW5kbGUgKHJlZmVyZW5jZSkgdG8gdGhpcyBzdHJpbmcgaXMNCiAqIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGV2ZW50LiBUaGlzIGlzIG9idGFpbmVkIGJ5IGNhbGxpbmcgDQogKiANCiAqICAgICB4VHJhY2VPcGVuTGFiZWwoKQ0KICoNCiAqIHdoaWNoIGFkZHMgdGhlIHN0cmluZyB0byB0aGUgc3ltYm9sIHRhYmxlIChpZiBub3QgYWxyZWFkeSBwcmVzZW50KQ0KICogYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlLg0KICoNCiAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gdHdvIHdheXM6DQogKg0KICogMS4gVGhlIGhhbmRsZSBpcyBsb29rZWQgdXAgZXZlcnkgdGltZSwgd2hlbiBzdG9yaW5nIHRoZSB1c2VyIGV2ZW50Lg0KICoNCiAqIEV4YW1wbGU6DQogKiAgICAgdlRyYWNlVXNlckV2ZW50KHhUcmFjZU9wZW5MYWJlbCgiTXlVc2VyRXZlbnQiKSk7DQogKg0KICogMi4gVGhlIGxhYmVsIGlzIHJlZ2lzdGVyZWQganVzdCBvbmNlLCB3aXRoIHRoZSBoYW5kbGUgc3RvcmVkIGluIGFuDQogKiAgYXBwbGljYXRpb24gdmFyaWFibGUgLSBtdWNoIGxpa2UgdXNpbmcgYSBmaWxlIGhhbmRsZS4NCiAqDQogKiBFeGFtcGxlOg0KICogICAgIG15RXZlbnRIYW5kbGUgPSB4VHJhY2VPcGVuTGFiZWwoIk15VXNlckV2ZW50Iik7DQogKiAgICAgLi4uDQogKiAgICAgdlRyYWNlVXNlckV2ZW50KG15RXZlbnRIYW5kbGUpOw0KICoNCiAqIFRoZSBzZWNvbmQgb3B0aW9uIGlzIGZhc3RlciBzaW5jZSBubyBsb29rdXAgaXMgcmVxdWlyZWQgb24gZWFjaCBldmVudCwgYW5kIA0KICogdGhlcmVmb3JlIHJlY29tbWVuZGVkIGZvciB1c2VyIGV2ZW50cyB0aGF0IGFyZSBmcmVxdWVudGx5DQogKiBleGVjdXRlZCBhbmQvb3IgbG9jYXRlZCBpbiB0aW1lLWNyaXRpY2FsIGNvZGUuIFRoZSBsb29rdXAgb3BlcmF0aW9uIGlzDQogKiBob3dldmVyIGZhaXJseSBmYXN0IGR1ZSB0byB0aGUgZGVzaWduIG9mIHRoZSBzeW1ib2wgdGFibGUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdHJhY2VMYWJlbCB4VHJhY2VPcGVuTGFiZWwoY29uc3QgY2hhciogbGFiZWwpDQp7DQogICAgcmV0dXJuIHBydlRyYWNlT3BlblN5bWJvbChsYWJlbCwgMCk7DQp9DQojZW5kaWYNCiNlbmRpZg0KDQo=