LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ni0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBVQlJLX0gKI2RlZmluZSBVQlJLX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgovKioKICogXGZpbGUKICogXGJyaWVmIEMgQVBJOiBCcmVha0l0ZXJhdG9yIAogKgogKiA8aDI+IEJyZWFrSXRlcmF0b3IgQyBBUEkgPC9oMj4KICoKICogVGhlIEJyZWFrSXRlcmF0b3IgQyBBUEkgZGVmaW5lcyAgbWV0aG9kcyBmb3IgZmluZGluZyB0aGUgbG9jYXRpb24KICogb2YgYm91bmRhcmllcyBpbiB0ZXh0LiBQb2ludGVyIHRvIGEgVUJyZWFrSXRlcmF0b3IgbWFpbnRhaW4gYSAKICogY3VycmVudCBwb3NpdGlvbiBhbmQgc2NhbiBvdmVyIHRleHQgcmV0dXJuaW5nIHRoZSBpbmRleCBvZiBjaGFyYWN0ZXJzIAogKiB3aGVyZSBib3VuZGFyaWVzIG9jY3VyLgogKiA8UD4KICogTGluZSBib3VuZGFyeSBhbmFseXNpcyBkZXRlcm1pbmVzIHdoZXJlIGEgdGV4dCBzdHJpbmcgY2FuIGJlIGJyb2tlbgogKiB3aGVuIGxpbmUtd3JhcHBpbmcuIFRoZSBtZWNoYW5pc20gY29ycmVjdGx5IGhhbmRsZXMgcHVuY3R1YXRpb24gYW5kCiAqIGh5cGhlbmF0ZWQgd29yZHMuCiAqIDxQPgogKiBTZW50ZW5jZSBib3VuZGFyeSBhbmFseXNpcyBhbGxvd3Mgc2VsZWN0aW9uIHdpdGggY29ycmVjdAogKiBpbnRlcnByZXRhdGlvbiBvZiBwZXJpb2RzIHdpdGhpbiBudW1iZXJzIGFuZCBhYmJyZXZpYXRpb25zLCBhbmQKICogdHJhaWxpbmcgcHVuY3R1YXRpb24gbWFya3Mgc3VjaCBhcyBxdW90YXRpb24gbWFya3MgYW5kIHBhcmVudGhlc2VzLgogKiA8UD4KICogV29yZCBib3VuZGFyeSBhbmFseXNpcyBpcyB1c2VkIGJ5IHNlYXJjaCBhbmQgcmVwbGFjZSBmdW5jdGlvbnMsIGFzCiAqIHdlbGwgYXMgd2l0aGluIHRleHQgZWRpdGluZyBhcHBsaWNhdGlvbnMgdGhhdCBhbGxvdyB0aGUgdXNlciB0bwogKiBzZWxlY3Qgd29yZHMgd2l0aCBhIGRvdWJsZSBjbGljay4gV29yZCBzZWxlY3Rpb24gcHJvdmlkZXMgY29ycmVjdAogKiBpbnRlcnByZXRhdGlvbiBvZiBwdW5jdHVhdGlvbiBtYXJrcyB3aXRoaW4gYW5kIGZvbGxvd2luZwogKiB3b3Jkcy4gQ2hhcmFjdGVycyB0aGF0IGFyZSBub3QgcGFydCBvZiBhIHdvcmQsIHN1Y2ggYXMgc3ltYm9scyBvcgogKiBwdW5jdHVhdGlvbiBtYXJrcywgaGF2ZSB3b3JkLWJyZWFrcyBvbiBib3RoIHNpZGVzLgogKiA8UD4KICogQ2hhcmFjdGVyIGJvdW5kYXJ5IGFuYWx5c2lzIGFsbG93cyB1c2VycyB0byBpbnRlcmFjdCB3aXRoCiAqIGNoYXJhY3RlcnMgYXMgdGhleSBleHBlY3QgdG8sIGZvciBleGFtcGxlLCB3aGVuIG1vdmluZyB0aGUgY3Vyc29yCiAqIHRocm91Z2ggYSB0ZXh0IHN0cmluZy4gQ2hhcmFjdGVyIGJvdW5kYXJ5IGFuYWx5c2lzIHByb3ZpZGVzIGNvcnJlY3QKICogbmF2aWdhdGlvbiBvZiB0aHJvdWdoIGNoYXJhY3RlciBzdHJpbmdzLCByZWdhcmRsZXNzIG9mIGhvdyB0aGUKICogY2hhcmFjdGVyIGlzIHN0b3JlZC4gIEZvciBleGFtcGxlLCBhbiBhY2NlbnRlZCBjaGFyYWN0ZXIgbWlnaHQgYmUKICogc3RvcmVkIGFzIGEgYmFzZSBjaGFyYWN0ZXIgYW5kIGEgZGlhY3JpdGljYWwgbWFyay4gV2hhdCB1c2VycwogKiBjb25zaWRlciB0byBiZSBhIGNoYXJhY3RlciBjYW4gZGlmZmVyIGJldHdlZW4gbGFuZ3VhZ2VzLgogKiA8UD4KICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhbGwgdGV4dCBib3VuZGFyaWVzLgogKiA8UD4KICogRXhhbXBsZXM6CiAqIDxQPgogKiBIZWxwZXIgZnVuY3Rpb24gdG8gb3V0cHV0IHRleHQKICogPHByZT4KICogXGNvZGUKICogICAgdm9pZCBwcmludFRleHRSYW5nZShVQ2hhciogc3RyLCBVVGV4dE9mZnNldCBzdGFydCwgVVRleHRPZmZzZXQgZW5kICkgewogKiAgICAgICAgIFVDaGFyKiByZXN1bHQ7CiAqICAgICAgICAgVUNoYXIqIHRlbXA7CiAqICAgICAgICAgY29uc3QgY2hhciogcmVzOwogKiAgICAgICAgIHRlbXA9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqICgodV9zdHJsZW4oc3RyKS1zdGFydCkrMSkpOwogKiAgICAgICAgIHJlc3VsdD0oVUNoYXIqKW1hbGxvYyhzaXplb2YoVUNoYXIpICogKChlbmQtc3RhcnQpKzEpKTsKICogICAgICAgICB1X3N0cmNweSh0ZW1wLCAmc3RyW3N0YXJ0XSk7CiAqICAgICAgICAgdV9zdHJuY3B5KHJlc3VsdCwgdGVtcCwgZW5kLXN0YXJ0KTsKICogICAgICAgICByZXM9KGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikgKiAodV9zdHJsZW4ocmVzdWx0KSsxKSk7CiAqICAgICAgICAgdV9hdXN0cmNweShyZXMsIHJlc3VsdCk7CiAqICAgICAgICAgcHJpbnRmKCIlc1xuIiwgcmVzKTsgCiAqICAgIH0KICogXGVuZGNvZGUKICogPC9wcmU+CiAqIFByaW50IGVhY2ggZWxlbWVudCBpbiBvcmRlcjoKICogPHByZT4KICogXGNvZGUKICogICAgdm9pZCBwcmludEVhY2hGb3J3YXJkKCBVQnJlYWtJdGVyYXRvciogYm91bmRhcnksIFVDaGFyKiBzdHIpIHsKICogICAgICAgVVRleHRPZmZzZXQgZW5kOwogKiAgICAgICBVVGV4dE9mZnNldCBzdGFydCA9IHVicmtfZmlyc3QoYm91bmRhcnkpOwogKiAgICAgICBmb3IgKGVuZCA9IHVicmtfbmV4dChib3VuZGFyeSkpOyBlbmQgIT0gVUJSS19ET05FOyBzdGFydCA9IGVuZCwgZW5kID0gdWJya19uZXh0KGJvdW5kYXJ5KSkgewogKiAgICAgICAgICAgICBwcmludFRleHRSYW5nZShzdHIsIHN0YXJ0LCBlbmQgKTsKICogICAgICAgICB9CiAqICAgIH0KICogXGVuZGNvZGUKICogPC9wcmU+CiAqIFByaW50IGVhY2ggZWxlbWVudCBpbiByZXZlcnNlIG9yZGVyOgogKiA8cHJlPgogKiBcY29kZQogKiAgICB2b2lkIHByaW50RWFjaEJhY2t3YXJkKCBVQnJlYWtJdGVyYXRvciogYm91bmRhcnksIFVDaGFyKiBzdHIpIHsKICogICAgICAgVVRleHRPZmZzZXQgc3RhcnQ7CiAqICAgICAgIFVUZXh0T2Zmc2V0IGVuZCA9IHVicmtfbGFzdChib3VuZGFyeSk7CiAqICAgICAgIGZvciAoc3RhcnQgPSB1YnJrX3ByZXZpb3VzKGJvdW5kYXJ5KTsgc3RhcnQgIT0gVUJSS19ET05FOyAgZW5kID0gc3RhcnQsIHN0YXJ0ID11YnJrX3ByZXZpb3VzKGJvdW5kYXJ5KSkgewogKiAgICAgICAgICAgICBwcmludFRleHRSYW5nZSggc3RyLCBzdGFydCwgZW5kICk7CiAqICAgICAgICAgfQogKiAgICB9CiAqIFxlbmRjb2RlCiAqIDwvcHJlPgogKiBQcmludCBmaXJzdCBlbGVtZW50CiAqIDxwcmU+CiAqIFxjb2RlCiAqICAgIHZvaWQgcHJpbnRGaXJzdChVQnJlYWtJdGVyYXRvciogYm91bmRhcnksIFVDaGFyKiBzdHIpIHsKICogICAgICAgIFVUZXh0T2Zmc2V0IGVuZDsKICogICAgICAgIFVUZXh0T2Zmc2V0IHN0YXJ0ID0gdWJya19maXJzdChib3VuZGFyeSk7CiAqICAgICAgICBlbmQgPSB1YnJrX25leHQoYm91bmRhcnkpOwogKiAgICAgICAgcHJpbnRUZXh0UmFuZ2UoIHN0ciwgc3RhcnQsIGVuZCApOwogKiAgICB9CiAqIFxlbmRjb2RlCiAqIDwvcHJlPgogKiBQcmludCBsYXN0IGVsZW1lbnQKICogPHByZT4KICogXGNvZGUKICogICAgdm9pZCBwcmludExhc3QoVUJyZWFrSXRlcmF0b3IqIGJvdW5kYXJ5LCBVQ2hhciogc3RyKSB7CiAqICAgICAgICBVVGV4dE9mZnNldCBzdGFydDsKICogICAgICAgIFVUZXh0T2Zmc2V0IGVuZCA9IHVicmtfbGFzdChib3VuZGFyeSk7CiAqICAgICAgICBzdGFydCA9IHVicmtfcHJldmlvdXMoYm91bmRhcnkpOwogKiAgICAgICAgcHJpbnRUZXh0UmFuZ2Uoc3RyLCBzdGFydCwgZW5kICk7CiAqICAgIH0KICogXGVuZGNvZGUKICogPC9wcmU+CiAqIFByaW50IHRoZSBlbGVtZW50IGF0IGEgc3BlY2lmaWVkIHBvc2l0aW9uCiAqIDxwcmU+CiAqIFxjb2RlCiAqICAgIHZvaWQgcHJpbnRBdChVQnJlYWtJdGVyYXRvciogYm91bmRhcnksIFVUZXh0T2Zmc2V0IHBvcyAsIFVDaGFyKiBzdHIpIHsKICogICAgICAgIFVUZXh0T2Zmc2V0IHN0YXJ0OwogKiAgICAgICAgVVRleHRPZmZzZXQgZW5kID0gdWJya19mb2xsb3dpbmcoYm91bmRhcnksIHBvcyk7CiAqICAgICAgICBzdGFydCA9IHVicmtfcHJldmlvdXMoYm91bmRhcnkpOwogKiAgICAgICAgcHJpbnRUZXh0UmFuZ2Uoc3RyLCBzdGFydCwgZW5kICk7CiAqICAgIH0KICogXGVuZGNvZGUKICogPC9wcmU+CiAqIENyZWF0aW5nIGFuZCB1c2luZyB0ZXh0IGJvdW5kYXJpZXMKICogPHByZT4KICogXGNvZGUKICogICAgICAgdm9pZCBCcmVha0l0ZXJhdG9yX0V4YW1wbGUoIHZvaWQgKSB7CiAqICAgICAgICAgICBVQnJlYWtJdGVyYXRvciogYm91bmRhcnk7CiAqICAgICAgICAgICBVQ2hhciAqc3RyaW5nVG9FeGFtaW5lOwogKiAgICAgICAgICAgc3RyaW5nVG9FeGFtaW5lPShVQ2hhciopbWFsbG9jKHNpemVvZihVQ2hhcikgKiAoc3RybGVuKCJBYWEgYmJiIGNjYy4gRGRkIGVlZSBmZmYuIikrMSkgKTsKICogICAgICAgICAgIHVfdWFzdHJjcHkoc3RyaW5nVG9FeGFtaW5lLCAiQWFhIGJiYiBjY2MuIERkZCBlZWUgZmZmLiIpOwogKiAgICAgICAgICAgcHJpbnRmKCJFeGFtaW5pbmc6ICJBYWEgYmJiIGNjYy4gRGRkIGVlZSBmZmYuIik7CiAqIAogKiAgICAgICAgICAgLy9wcmludCBlYWNoIHNlbnRlbmNlIGluIGZvcndhcmQgYW5kIHJldmVyc2Ugb3JkZXIKICogICAgICAgICAgIGJvdW5kYXJ5ID0gdWJya19vcGVuKFVCUktfU0VOVEVOQ0UsICJlbl91cyIsIHN0cmluZ1RvRXhhbWluZSwgdV9zdHJsZW4oc3RyaW5nVG9FeGFtaW5lKSwgJnN0YXR1cyk7CiAqICAgICAgICAgICBwcmludGYoIi0tLS0tIGZvcndhcmQ6IC0tLS0tLS0tLS0tXG4iKTsgCiAqICAgICAgICAgICBwcmludEVhY2hGb3J3YXJkKGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOwogKiAgICAgICAgICAgcHJpbnRmKCItLS0tLSBiYWNrd2FyZDogLS0tLS0tLS0tLVxuIik7CiAqICAgICAgICAgICBwcmludEVhY2hCYWNrd2FyZChib3VuZGFyeSwgc3RyaW5nVG9FeGFtaW5lKTsKICogICAgICAgICAgIHVicmtfY2xvc2UoYm91bmRhcnkpOwogKiAKICogICAgICAgICAgIC8vcHJpbnQgZWFjaCB3b3JkIGluIG9yZGVyCiAqICAgICAgICAgICBib3VuZGFyeSA9IHVicmtfb3BlbihVQlJLX1dPUkQsICJlbl91cyIsIHN0cmluZ1RvRXhhbWluZSwgdV9zdHJsZW4oc3RyaW5nVG9FeGFtaW5lKSwgJnN0YXR1cyk7CiAqICAgICAgICAgICBwcmludGYoIi0tLS0tIGZvcndhcmQ6IC0tLS0tLS0tLS0tXG4iKTsgCiAqICAgICAgICAgICBwcmludEVhY2hGb3J3YXJkKGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOwogKiAgICAgICAgICAgcHJpbnRmKCItLS0tLSBiYWNrd2FyZDogLS0tLS0tLS0tLVxuIik7CiAqICAgICAgICAgICBwcmludEVhY2hCYWNrd2FyZChib3VuZGFyeSwgc3RyaW5nVG9FeGFtaW5lKTsKICogICAgICAgICAgIC8vcHJpbnQgZmlyc3QgZWxlbWVudAogKiAgICAgICAgICAgcHJpbnRmKCItLS0tLSBmaXJzdDogLS0tLS0tLS0tLS0tLVxuIik7CiAqICAgICAgICAgICBwcmludEZpcnN0KGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOwogKiAgICAgICAgICAgLy9wcmludCBsYXN0IGVsZW1lbnQKICogICAgICAgICAgIHByaW50ZigiLS0tLS0gbGFzdDogLS0tLS0tLS0tLS0tLS1cbiIpOwogKiAgICAgICAgICAgcHJpbnRMYXN0KGJvdW5kYXJ5LCBzdHJpbmdUb0V4YW1pbmUpOwogKiAgICAgICAgICAgLy9wcmludCB3b3JkIGF0IGNoYXJwb3MgMTAKICogICAgICAgICAgIHByaW50ZigiLS0tLS0gYXQgcG9zIDEwOiAtLS0tLS0tLS1cbiIpOwogKiAgICAgICAgICAgcHJpbnRBdChib3VuZGFyeSwgMTAgLCBzdHJpbmdUb0V4YW1pbmUpOwogKiAKICogICAgICAgICAgIHVicmtfY2xvc2UoYm91bmRhcnkpOwogKiAgICAgICB9CiAqIFxlbmRjb2RlCiAqIDwvcHJlPgogKi8KCi8qKiAKICogQSB0ZXh0LWJyZWFrIGl0ZXJhdG9yLgogKiAgRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiAqLwp0eXBlZGVmIHZvaWQqIFVCcmVha0l0ZXJhdG9yOwoKLyoqIFRoZSBwb3NzaWJsZSB0eXBlcyBvZiB0ZXh0IGJvdW5kYXJpZXMuICovCmVudW0gVUJyZWFrSXRlcmF0b3JUeXBlIHsKICAvKiogQ2hhcmFjdGVyIGJyZWFrcyAqLwogIFVCUktfQ0hBUkFDVEVSLAogIC8qKiBXb3JkIGJyZWFrcyAqLwogIFVCUktfV09SRCwKICAvKiogTGluZSBicmVha3MgKi8KICBVQlJLX0xJTkUsCiAgLyoqIFNlbnRlbmNlIGJyZWFrcyAqLwogIFVCUktfU0VOVEVOQ0UKfTsKdHlwZWRlZiBlbnVtIFVCcmVha0l0ZXJhdG9yVHlwZSBVQnJlYWtJdGVyYXRvclR5cGU7CgovKiogVmFsdWUgaW5kaWNhdGluZyBhbGwgdGV4dCBib3VuZGFyaWVzIGhhdmUgYmVlbiByZXR1cm5lZC4gCiAqCiAqLwojZGVmaW5lIFVCUktfRE9ORSAoKFVUZXh0T2Zmc2V0KSAtMSkKCi8qKgogKiBPcGVuIGEgbmV3IFVCcmVha0l0ZXJhdG9yIGZvciBsb2NhdGluZyB0ZXh0IGJvdW5kYXJpZXMgZm9yIGEgc3BlY2lmaWVkIGxvY2FsZS4KICogQSBVQnJlYWtJdGVyYXRvciBtYXkgYmUgdXNlZCBmb3IgZGV0ZWN0aW5nIGNoYXJhY3RlciwgbGluZSwgd29yZCwgCiAqIGFuZCBzZW50ZW5jZSBicmVha3MgaW4gdGV4dC4KICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgVUJyZWFrSXRlcmF0b3IgdG8gb3Blbjogb25lIG9mIFVCUktfQ0hBUkFDVEVSLCBVQlJLX1dPUkQsCiAqIFVCUktfTElORSwgVUJSS19TRU5URU5DRQogKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3BlY2lmeWluZyB0aGUgdGV4dC1icmVha2luZyBjb252ZW50aW9ucy4KICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gYmUgaXRlcmF0ZWQgb3Zlci4KICogQHBhcmFtIHRleHRMZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRleHQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHN0YXR1cyBBIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzLgogKiBAcmV0dXJuIEEgVUJyZWFrSXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYWxlLgogKiBAc2VlIHVicmtfb3BlblJ1bGVzCiAqIEBzdGFibGUKICovClVfQ0FQSSBVQnJlYWtJdGVyYXRvcioKdWJya19vcGVuKFVCcmVha0l0ZXJhdG9yVHlwZSB0eXBlLAogICAgICBjb25zdCBjaGFyICpsb2NhbGUsCiAgICAgIGNvbnN0IFVDaGFyICp0ZXh0LAogICAgICBpbnQzMl90IHRleHRMZW5ndGgsCiAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogT3BlbiBhIG5ldyBVQnJlYWtJdGVyYXRvciBmb3IgbG9jYXRpbmcgdGV4dCBib3VuZGFyaWVzIHVzaW5nIHNwZWNpZmllZCBicmVha2luZyBydWxlcy4KICogVGhlIHJ1bGUgc3ludGF4IGlzIC4uLiAoVEJEKQogKiBAcGFyYW0gcnVsZXMgQSBzZXQgb2YgcnVsZXMgc3BlY2lmeWluZyB0aGUgdGV4dCBicmVha2luZyBjb252ZW50aW9ucy4KICogQHBhcmFtIHJ1bGVzTGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBydWxlcywgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBiZSBpdGVyYXRlZCBvdmVyLgogKiBAcGFyYW0gdGV4dExlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGV4dCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcGFyYW0gc3RhdHVzIEEgVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMuCiAqIEByZXR1cm4gQSBVQnJlYWtJdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBydWxlcy4KICogQHNlZSB1YnJrX29wZW4KICogQGRyYWZ0CiAqLwpVX0NBUEkgVUJyZWFrSXRlcmF0b3IqCnVicmtfb3BlblJ1bGVzKGNvbnN0IFVDaGFyICpydWxlcywKICAgICAgICAgICBpbnQzMl90IHJ1bGVzTGVuZ3RoLAogICAgICAgICAgIGNvbnN0IFVDaGFyICp0ZXh0LAogICAgICAgICAgIGludDMyX3QgdGV4dExlbmd0aCwKICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqCiAqIFRocmVhZCBzYWZlIGNsb25pbmcgb3BlcmF0aW9uCiAqIEBwYXJhbSBiaSBpdGVyYXRvciB0byBiZSBjbG9uZWQKICogQHBhcmFtIHN0YWNrQnVmZmVyIHVzZXIgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgbmV3IGNsb25lLiBJZiBOVUxMIG5ldyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQuIAoJSWYgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2gsIG5ldyBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQuCglDbGllbnRzIGNhbiB1c2UgdGhlIFVfQlJLX1NBRkVDTE9ORV9CVUZGRVJTSVpFLiBUaGlzIHdpbGwgcHJvYmFibHkgYmUgZW5vdWdoIHRvIGF2b2lkIG1lbW9yeSBhbGxvY2F0aW9ucy4KICogQHBhcmFtIHBCdWZmZXJTaXplIHBvaW50ZXIgdG8gc2l6ZSBvZiBhbGxvY2F0ZWQgc3BhY2UuIAoJSWYgKnBCdWZmZXJTaXplID09IDAsIGEgc3VmZmljaWVudCBzaXplIGZvciB1c2UgaW4gY2xvbmluZyB3aWxsIAoJYmUgcmV0dXJuZWQgKCdwcmUtZmxpZ2h0aW5nJykKCUlmICpwQnVmZmVyU2l6ZSBpcyBub3QgZW5vdWdoIGZvciBhIHN0YWNrLWJhc2VkIHNhZmUgY2xvbmUsIAoJbmV3IG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZC4KICogQHBhcmFtIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2VudCBvbiBzbW9vdGhseSBvciB0aGVyZSB3ZXJlIGVycm9ycwogICAgQW4gaW5mb3JtYXRpb25hbCBzdGF0dXMgdmFsdWUsIFVfU0FGRUNMT05FX0FMTE9DQVRFRF9FUlJPUiwgaXMgdXNlZCBpZiBhbnkgYWxsb2NhdGlvbnMgd2VyZSBuZWNlc3NhcnkuCiAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgbmV3IGNsb25lCiAqIEBkcmFmdCBBUEkgMS44IGZyZWV6ZQogKi8KCgpVX0NBUEkgVUJyZWFrSXRlcmF0b3IgKgp1YnJrX3NhZmVDbG9uZSgKICAgICAgICAgIGNvbnN0IFVCcmVha0l0ZXJhdG9yICpiaSwKICAgICAgICAgIHZvaWQgKnN0YWNrQnVmZmVyLAogICAgICAgICAgaW50MzJfdCAqcEJ1ZmZlclNpemUsCiAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKI2RlZmluZSBVX0JSS19TQUZFQ0xPTkVfQlVGRkVSU0laRSA1MTIKCi8qKgoqIENsb3NlIGEgVUJyZWFrSXRlcmF0b3IuCiogT25jZSBjbG9zZWQsIGEgVUJyZWFrSXRlcmF0b3IgbWF5IG5vIGxvbmdlciBiZSB1c2VkLgoqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gY2xvc2UuCiAqIEBzdGFibGUKKi8KVV9DQVBJIHZvaWQKdWJya19jbG9zZShVQnJlYWtJdGVyYXRvciAqYmkpOwoKLyoqCiAqIFNldHMgYW4gZXhpc3RpbmcgaXRlcmF0b3IgdG8gcG9pbnQgdG8gYSBuZXcgcGllY2Ugb2YgdGV4dAogKiBAc3RhYmxlCiAqLwpVX0NBUEkgdm9pZAp1YnJrX3NldFRleHQoVUJyZWFrSXRlcmF0b3IqIGJpLAogICAgICAgICAgICAgY29uc3QgVUNoYXIqICAgIHRleHQsCiAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgdGV4dExlbmd0aCwKICAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICBzdGF0dXMpOwoKLyoqCiAqIERldGVybWluZSB0aGUgbW9zdCByZWNlbnRseS1yZXR1cm5lZCB0ZXh0IGJvdW5kYXJ5LgogKiAKICogQHBhcmFtIGJpIFRoZSBicmVhayBpdGVyYXRvciB0byB1c2UuCiAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBpbmRleCBtb3N0IHJlY2VudGx5IHJldHVybmVkIGJ5IFxSZWZ7dWJya19uZXh0fSwgXFJlZnt1YnJrX3ByZXZpb3VzfSwgCiAqIFxSZWZ7dWJya19maXJzdH0sIG9yIFxSZWZ7dWJya19sYXN0fS4KICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfY3VycmVudChjb25zdCBVQnJlYWtJdGVyYXRvciAqYmkpOwoKLyoqCiAqIERldGVybWluZSB0aGUgdGV4dCBib3VuZGFyeSBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgdGV4dCBib3VuZGFyeS4KICogCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIG5leHQgdGV4dCBib3VuZGFyeSwgb3IgVUJSS19ET05FCiAqIGlmIGFsbCB0ZXh0IGJvdW5kYXJpZXMgaGF2ZSBiZWVuIHJldHVybmVkLgogKiBAc2VlIHVicmtfcHJldmlvdXMKICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfbmV4dChVQnJlYWtJdGVyYXRvciAqYmkpOwoKLyoqCiAqIERldGVybWluZSB0aGUgdGV4dCBib3VuZGFyeSBwcmVjZWRpbmcgdGhlIGN1cnJlbnQgdGV4dCBib3VuZGFyeS4KICoKICogQHBhcmFtIGJpIFRoZSBicmVhayBpdGVyYXRvciB0byB1c2UuCiAqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgcHJlY2VkaW5nIHRleHQgYm91bmRhcnksIG9yIFVCUktfRE9ORQogKiBpZiBhbGwgdGV4dCBib3VuZGFyaWVzIGhhdmUgYmVlbiByZXR1cm5lZC4KICogQHNlZSB1YnJrX25leHQKICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfcHJldmlvdXMoVUJyZWFrSXRlcmF0b3IgKmJpKTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHRleHQgYmVpbmcgc2Nhbm5lZC4KICogVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBzYW1lIGFzIGluZGV4IDAgb2YgdGhlIHRleHQuCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgdGV4dCBiZWluZyBzY2FubmVkLgogKiBAc2VlIHVicmtfbGFzdAogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVVRleHRPZmZzZXQKdWJya19maXJzdChVQnJlYWtJdGVyYXRvciAqYmkpOwoKLyoqCiAqIERldGVybWluZSB0aGUgaW5kZXggaW1tZWRpYXRlbHkgPEVNPmJleW9uZDwvRU0+IHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgdGV4dCBiZWluZwogKiBzY2FubmVkLgogKiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIuCiAqIEBwYXJhbSBiaSBUaGUgYnJlYWsgaXRlcmF0b3IgdG8gdXNlLgogKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGltbWVkaWF0ZWx5IDxFTT5iZXlvbmQ8L0VNPiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlCiAqIHRleHQgYmVpbmcgc2Nhbm5lZC4KICogQHNlZSB1YnJrX2ZpcnN0CiAqIEBzdGFibGUKICovClVfQ0FQSSBVVGV4dE9mZnNldAp1YnJrX2xhc3QoVUJyZWFrSXRlcmF0b3IgKmJpKTsKCi8qKgogKiBEZXRlcm1pbmUgdGhlIHRleHQgYm91bmRhcnkgcHJlY2VkaW5nIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LgogKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgYWx3YXlzIHNtYWxsZXIgdGhhbiBvZmZzZXQsIG9yIFVCUktfRE9ORS4KICogQHBhcmFtIGJpIFRoZSBicmVhayBpdGVyYXRvciB0byB1c2UuCiAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCB0byBiZWdpbiBzY2FubmluZy4KICogQHJldHVybiBUaGUgdGV4dCBib3VuZGFyeSBwcmVjZWRpbmcgb2Zmc2V0LCBvciBVQlJLX0RPTkUuCiAqIEBzZWUgdWJya19mb2xsb3dpbmcKICogQHN0YWJsZQogKi8KVV9DQVBJIFVUZXh0T2Zmc2V0CnVicmtfcHJlY2VkaW5nKFVCcmVha0l0ZXJhdG9yICpiaSwKICAgICAgICAgICBVVGV4dE9mZnNldCBvZmZzZXQpOwoKLyoqCiAqIERldGVybWluZSB0aGUgdGV4dCBib3VuZGFyeSBmb2xsb3dpbmcgdGhlIHNwZWNpZmllZCBvZmZzZXQuCiAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhbHdheXMgZ3JlYXRlciB0aGFuIG9mZnNldCwgb3IgVUJSS19ET05FLgogKiBAcGFyYW0gYmkgVGhlIGJyZWFrIGl0ZXJhdG9yIHRvIHVzZS4KICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IHRvIGJlZ2luIHNjYW5uaW5nLgogKiBAcmV0dXJuIFRoZSB0ZXh0IGJvdW5kYXJ5IGZvbGxvd2luZyBvZmZzZXQsIG9yIFVCUktfRE9ORS4KICogQHNlZSB1YnJrX3ByZWNlZGluZwogKiBAc3RhYmxlCiAqLwpVX0NBUEkgVVRleHRPZmZzZXQKdWJya19mb2xsb3dpbmcoVUJyZWFrSXRlcmF0b3IgKmJpLAogICAgICAgICAgIFVUZXh0T2Zmc2V0IG9mZnNldCk7CgovKioKKiBHZXQgYSBsb2NhbGUgZm9yIHdoaWNoIHRleHQgYnJlYWtpbmcgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgoqIEEgVUJyZWFrSXRlcmF0b3IgaW4gYSBsb2NhbGUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGhlIGNvcnJlY3QKKiB0ZXh0IGJyZWFraW5nIGZvciB0aGUgbG9jYWxlLgoqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgbG9jYWxlLgoqIEByZXR1cm4gQSBsb2NhbGUgZm9yIHdoaWNoIG51bWJlciB0ZXh0IGJyZWFraW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgb3IgMCBpZiBub25lLgoqIEBzZWUgdWJya19jb3VudEF2YWlsYWJsZQoqIEBzdGFibGUKKi8KVV9DQVBJIGNvbnN0IGNoYXIqCnVicmtfZ2V0QXZhaWxhYmxlKGludDMyX3QgaW5kZXgpOwoKLyoqCiogRGV0ZXJtaW5lIGhvdyBtYW55IGxvY2FsZXMgaGF2ZSB0ZXh0IGJyZWFraW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3QgdXNlZnVsIGFzIGRldGVybWluaW5nIHRoZSBsb29wIGVuZGluZyBjb25kaXRpb24gZm9yCiogY2FsbHMgdG8gXFJlZnt1YnJrX2dldEF2YWlsYWJsZX0uCiogQHJldHVybiBUaGUgbnVtYmVyIG9mIGxvY2FsZXMgZm9yIHdoaWNoIHRleHQgYnJlYWtpbmcgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgoqIEBzZWUgdWJya19nZXRBdmFpbGFibGUKKiBAc3RhYmxlCiovClVfQ0FQSSBpbnQzMl90CnVicmtfY291bnRBdmFpbGFibGUodm9pZCk7CgojZW5kaWYK