LypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgovLwovLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCi8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAovLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgovLwovLwovLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50Ci8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQovLwovLyBDb3B5cmlnaHQoIEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgovLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KLy8KLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgovLwovLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi8vCi8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAovLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgovLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi8vCi8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLy8KLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAovLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAovLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCi8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAovLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKLy8oaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7Ci8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCi8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKLy8gb3IgdG9ydChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgovLwovL00qLwoKLyoKICAgQSBmZXcgbWFjcm9zIGFuZCBkZWZpbml0aW9ucyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICB3aXRoIHRoZSBwcmV2aW91cyB2ZXJzaW9ucyBvZiBPcGVuQ1YuIFRoZXkgYXJlIG9ic29sZXRlIGFuZAogICBhcmUgbGlrZWx5IHRvIGJlIHJlbW92ZWQgaW4gZnV0dXJlLiBUbyBjaGVjayB3aGV0aGVyIHlvdXIgY29kZQogICB1c2VzIGFueSBvZiB0aGVzZSwgZGVmaW5lIENWX05PX0JBQ0tXQVJEX0NPTVBBVElCSUxJVFkgYmVmb3JlCiAgIGluY2x1ZGluZyBjdi5oLgoqLwoKI2lmbmRlZiBfQ1ZDT01QQVRfSF8KI2RlZmluZSBfQ1ZDT01QQVRfSF8KCiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNpZmRlZiBfX2NwbHVzcGx1cwogICAgI2RlZmluZSBDVl9VTlJFRkVSRU5DRUQoYXJnKQojZWxzZQogICAgI2RlZmluZSBDVl9VTlJFRkVSRU5DRUQoYXJnKSBhcmcKI2VuZGlmCgojZGVmaW5lIEN2TWF0VHlwZSBpbnQKI2RlZmluZSBDdkRpc01hc2tUeXBlIGludAojZGVmaW5lIEN2TWF0QXJyYXkgQ3ZNYXQKCiNkZWZpbmUgQ3ZUaHJlc2hUeXBlIGludAojZGVmaW5lIEN2QWRhcHRpdmVUaHJlc2hNZXRob2QgaW50CiNkZWZpbmUgQ3ZDb21wYXJlTWV0aG9kIGludAojZGVmaW5lIEN2Rm9udEZhY2UgaW50CiNkZWZpbmUgQ3ZQb2x5QXBwcm94TWV0aG9kIGludAojZGVmaW5lIEN2Q29udG91cnNNYXRjaE1ldGhvZCBpbnQKI2RlZmluZSBDdkNvbnRvdXJUcmVlc01hdGNoTWV0aG9kIGludAojZGVmaW5lIEN2Q29lZmZUeXBlIGludAojZGVmaW5lIEN2Um9kcmlndWVzVHlwZSBpbnQKI2RlZmluZSBDdkVsZW1lbnRTaGFwZSBpbnQKI2RlZmluZSBDdk1vcnBoT3AgaW50CiNkZWZpbmUgQ3ZUZW1wbE1hdGNoTWV0aG9kIGludAoKI2RlZmluZSBDdlBvaW50MkQ2NGQgQ3ZQb2ludDJENjRmCiNkZWZpbmUgQ3ZQb2ludDNENjRkIEN2UG9pbnQzRDY0ZgoKI2RlZmluZSAgQ1ZfTUFUMzJGICAgICAgQ1ZfMzJGQzEKI2RlZmluZSAgQ1ZfTUFUM3gxXzMyRiAgQ1ZfMzJGQzEKI2RlZmluZSAgQ1ZfTUFUNHgxXzMyRiAgQ1ZfMzJGQzEKI2RlZmluZSAgQ1ZfTUFUM3gzXzMyRiAgQ1ZfMzJGQzEKI2RlZmluZSAgQ1ZfTUFUNHg0XzMyRiAgQ1ZfMzJGQzEKCiNkZWZpbmUgIENWX01BVDY0RCAgICAgIENWXzY0RkMxCiNkZWZpbmUgIENWX01BVDN4MV82NEQgIENWXzY0RkMxCiNkZWZpbmUgIENWX01BVDR4MV82NEQgIENWXzY0RkMxCiNkZWZpbmUgIENWX01BVDN4M182NEQgIENWXzY0RkMxCiNkZWZpbmUgIENWX01BVDR4NF82NEQgIENWXzY0RkMxCgojZGVmaW5lICBJUExfR0FVU1NJQU5fNXg1ICAgNwojZGVmaW5lICBDdkJveDJEMzJmICAgICBDdkJveDJECgovKiBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBtYWNyb3MgKi8KI2RlZmluZSBjdkNyZWF0ZUltYWdlRGF0YSAgIGN2Q3JlYXRlRGF0YQojZGVmaW5lIGN2UmVsZWFzZUltYWdlRGF0YSAgY3ZSZWxlYXNlRGF0YQojZGVmaW5lIGN2U2V0SW1hZ2VEYXRhICAgICAgY3ZTZXREYXRhCiNkZWZpbmUgY3ZHZXRJbWFnZVJhd0RhdGEgICBjdkdldFJhd0RhdGEKCiNkZWZpbmUgY3ZtQWxsb2MgICAgICAgICAgICBjdkNyZWF0ZURhdGEKI2RlZmluZSBjdm1GcmVlICAgICAgICAgICAgIGN2UmVsZWFzZURhdGEKI2RlZmluZSBjdm1BbGxvY0FycmF5ICAgICAgIGN2Q3JlYXRlRGF0YQojZGVmaW5lIGN2bUZyZWVBcnJheSAgICAgICAgY3ZSZWxlYXNlRGF0YQoKI2RlZmluZSBjdkludGVncmFsSW1hZ2UgICAgIGN2SW50ZWdyYWwKI2RlZmluZSBjdk1hdGNoQ29udG91cnMgICAgIGN2TWF0Y2hTaGFwZXMKCkNWX0lOTElORSBDdk1hdCBjdk1hdEFycmF5KCBpbnQgcm93cywgaW50IGNvbHMsIGludCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBkYXRhIENWX0RFRkFVTFQoMCkpCnsKICAgIHJldHVybiBjdk1hdCggcm93cypjb3VudCwgY29scywgdHlwZSwgZGF0YSApOwp9CgojZGVmaW5lIGN2VXBkYXRlTUhJQnlUaW1lICBjdlVwZGF0ZU1vdGlvbkhpc3RvcnkKCiNkZWZpbmUgY3ZBY2NNYXNrIGN2QWNjCiNkZWZpbmUgY3ZTcXVhcmVBY2NNYXNrIGN2U3F1YXJlQWNjCiNkZWZpbmUgY3ZNdWx0aXBseUFjY01hc2sgY3ZNdWx0aXBseUFjYwojZGVmaW5lIGN2UnVubmluZ0F2Z01hc2soaW1nWSwgaW1nVSwgbWFzaywgYWxwaGEpIGN2UnVubmluZ0F2ZyhpbWdZLCBpbWdVLCBhbHBoYSwgbWFzaykKCiNkZWZpbmUgY3ZTZXRIaXN0VGhyZXNoICBjdlNldEhpc3RCaW5SYW5nZXMKI2RlZmluZSBjdkNhbGNIaXN0TWFzayhpbWcsIG1hc2ssIGhpc3QsIGRvTm90Q2xlYXIpIGN2Q2FsY0hpc3QoaW1nLCBoaXN0LCBkb05vdENsZWFyLCBtYXNrKQoKQ1ZfSU5MSU5FIGRvdWJsZSBjdk1lYW4oIGNvbnN0IEN2QXJyKiBpbWFnZSwgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVCgwKSkKewogICAgQ3ZTY2FsYXIgbWVhbiA9IGN2QXZnKCBpbWFnZSwgbWFzayApOwogICAgcmV0dXJuIG1lYW4udmFsWzBdOwp9CgoKQ1ZfSU5MSU5FIGRvdWJsZSAgY3ZTdW1QaXhlbHMoIGNvbnN0IEN2QXJyKiBpbWFnZSApCnsKICAgIEN2U2NhbGFyIHNjYWxhciA9IGN2U3VtKCBpbWFnZSApOwogICAgcmV0dXJuIHNjYWxhci52YWxbMF07Cn0KCkNWX0lOTElORSB2b2lkICBjdk1lYW5fU3RkRGV2KCBjb25zdCBDdkFyciogaW1hZ2UsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKDApKQp7CiAgICBDdlNjYWxhciBfbWVhbiwgX3NkdjsKICAgIGN2QXZnU2R2KCBpbWFnZSwgJl9tZWFuLCAmX3NkdiwgbWFzayApOwoKICAgIGlmKCBtZWFuICkKICAgICAgICAqbWVhbiA9IF9tZWFuLnZhbFswXTsKCiAgICBpZiggc2R2ICkKICAgICAgICAqc2R2ID0gX3Nkdi52YWxbMF07Cn0KCgpDVl9JTkxJTkUgdm9pZCBjdm1QZXJzcGVjdGl2ZVByb2plY3QoIGNvbnN0IEN2TWF0KiBtYXQsIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QgKQp7CiAgICBDdk1hdCB0c3JjLCB0ZHN0OwoKICAgIGN2UmVzaGFwZSggc3JjLCAmdHNyYywgMywgMCApOwogICAgY3ZSZXNoYXBlKCBkc3QsICZ0ZHN0LCAzLCAwICk7CgogICAgY3ZQZXJzcGVjdGl2ZVRyYW5zZm9ybSggJnRzcmMsICZ0ZHN0LCBtYXQgKTsKfQoKCkNWX0lOTElORSB2b2lkIGN2RmlsbEltYWdlKCBDdkFyciogbWF0LCBkb3VibGUgY29sb3IgKQp7CiAgICBjdlNldCggbWF0LCBjdkNvbG9yVG9TY2FsYXIoY29sb3IsIGN2R2V0RWxlbVR5cGUobWF0KSksIDAgKTsKfQoKCiNkZWZpbmUgY3ZDdnRQaXhUb1BsYW5lIGN2U3BsaXQKI2RlZmluZSBjdkN2dFBsYW5lVG9QaXggY3ZNZXJnZQoKdHlwZWRlZiBzdHJ1Y3QgQ3ZSYW5kU3RhdGUKewogICAgQ3ZSTkcgICAgIHN0YXRlOyAgICAvKiBSTkcgc3RhdGUgKHRoZSBjdXJyZW50IHNlZWQgYW5kIGNhcnJ5KSovCiAgICBpbnQgICAgICAgZGlzdHR5cGU7IC8qIGRpc3RyaWJ1dGlvbiB0eXBlICovCiAgICBDdlNjYWxhciAgcGFyYW1bMl07IC8qIHBhcmFtZXRlcnMgb2YgUk5HICovCn0KQ3ZSYW5kU3RhdGU7CgoKLyogQ2hhbmdlcyBSTkcgcmFuZ2Ugd2hpbGUgcHJlc2VydmluZyBSTkcgc3RhdGUgKi8KQ1ZfSU5MSU5FICB2b2lkICBjdlJhbmRTZXRSYW5nZSggQ3ZSYW5kU3RhdGUqIHN0YXRlLCBkb3VibGUgcGFyYW0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFyYW0yLCBpbnQgaW5kZXggQ1ZfREVGQVVMVCgtMSkpCnsKICAgIGlmKCAhc3RhdGUgKQogICAgewogICAgICAgIGN2RXJyb3IoIENWX1N0c051bGxQdHIsICJjdlJhbmRTZXRSYW5nZSIsICJOdWxsIHBvaW50ZXIgdG8gUk5HIHN0YXRlIiwgImN2Y29tcGF0LmgiLCAwICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmKCAodW5zaWduZWQpKGluZGV4ICsgMSkgPiA0ICkKICAgIHsKICAgICAgICBjdkVycm9yKCBDVl9TdHNPdXRPZlJhbmdlLCAiY3ZSYW5kU2V0UmFuZ2UiLCAiaW5kZXggaXMgbm90IGluIC0xLi4zIiwgImN2Y29tcGF0LmgiLCAwICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmKCBpbmRleCA8IDAgKQogICAgewogICAgICAgIHN0YXRlLT5wYXJhbVswXS52YWxbMF0gPSBzdGF0ZS0+cGFyYW1bMF0udmFsWzFdID0KICAgICAgICBzdGF0ZS0+cGFyYW1bMF0udmFsWzJdID0gc3RhdGUtPnBhcmFtWzBdLnZhbFszXSA9IHBhcmFtMTsKICAgICAgICBzdGF0ZS0+cGFyYW1bMV0udmFsWzBdID0gc3RhdGUtPnBhcmFtWzFdLnZhbFsxXSA9CiAgICAgICAgc3RhdGUtPnBhcmFtWzFdLnZhbFsyXSA9IHN0YXRlLT5wYXJhbVsxXS52YWxbM10gPSBwYXJhbTI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RhdGUtPnBhcmFtWzBdLnZhbFtpbmRleF0gPSBwYXJhbTE7CiAgICAgICAgc3RhdGUtPnBhcmFtWzFdLnZhbFtpbmRleF0gPSBwYXJhbTI7CiAgICB9Cn0KCgpDVl9JTkxJTkUgIHZvaWQgIGN2UmFuZEluaXQoIEN2UmFuZFN0YXRlKiBzdGF0ZSwgZG91YmxlIHBhcmFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFyYW0yLCBpbnQgc2VlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdHR5cGUgQ1ZfREVGQVVMVChDVl9SQU5EX1VOSSkpCnsKICAgIGlmKCAhc3RhdGUgKQogICAgewogICAgICAgIGN2RXJyb3IoIENWX1N0c051bGxQdHIsICJjdlJhbmRJbml0IiwgIk51bGwgcG9pbnRlciB0byBSTkcgc3RhdGUiLCAiY3Zjb21wYXQuaCIsIDAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYoIGRpc3R0eXBlICE9IENWX1JBTkRfVU5JICYmIGRpc3R0eXBlICE9IENWX1JBTkRfTk9STUFMICkKICAgIHsKICAgICAgICBjdkVycm9yKCBDVl9TdHNCYWRGbGFnLCAiY3ZSYW5kSW5pdCIsICJVbmtub3duIGRpc3RyaWJ1dGlvbiB0eXBlIiwgImN2Y29tcGF0LmgiLCAwICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN0YXRlLT5zdGF0ZSA9ICh1aW50NjQpKHNlZWQgPyBzZWVkIDogLTEpOwogICAgc3RhdGUtPmRpc3R0eXBlID0gZGlzdHR5cGU7CiAgICBjdlJhbmRTZXRSYW5nZSggc3RhdGUsIHBhcmFtMSwgcGFyYW0yLCAtMSApOwp9CgoKLyogRmlsbHMgYXJyYXkgd2l0aCByYW5kb20gbnVtYmVycyAqLwpDVl9JTkxJTkUgdm9pZCBjdlJhbmQoIEN2UmFuZFN0YXRlKiBzdGF0ZSwgQ3ZBcnIqIGFyciApCnsKICAgIGlmKCAhc3RhdGUgKQogICAgewogICAgICAgIGN2RXJyb3IoIENWX1N0c051bGxQdHIsICJjdlJhbmQiLCAiTnVsbCBwb2ludGVyIHRvIFJORyBzdGF0ZSIsICJjdmNvbXBhdC5oIiwgMCApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGN2UmFuZEFyciggJnN0YXRlLT5zdGF0ZSwgYXJyLCBzdGF0ZS0+ZGlzdHR5cGUsIHN0YXRlLT5wYXJhbVswXSwgc3RhdGUtPnBhcmFtWzFdICk7Cn0KCiNkZWZpbmUgY3ZSYW5kTmV4dCggX3N0YXRlICkgY3ZSYW5kSW50KCAmKF9zdGF0ZSktPnN0YXRlICkKCkNWX0lOTElORSB2b2lkIGN2YlJhbmQoIEN2UmFuZFN0YXRlKiBzdGF0ZSwgZmxvYXQqIGRzdCwgaW50IGxlbiApCnsKICAgIEN2TWF0IG1hdCA9IGN2TWF0KCAxLCBsZW4sIENWXzMyRiwgKHZvaWQqKWRzdCApOwogICAgY3ZSYW5kKCBzdGF0ZSwgJm1hdCApOwp9CgoKQ1ZfSU5MSU5FIHZvaWQgIGN2YkNhcnRUb1BvbGFyKCBjb25zdCBmbG9hdCogeSwgY29uc3QgZmxvYXQqIHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG1hZ25pdHVkZSwgZmxvYXQqIGFuZ2xlLCBpbnQgbGVuICkKewogICAgQ3ZNYXQgbXggPSBjdk1hdCggMSwgbGVuLCBDVl8zMkYsICh2b2lkKil4ICk7CiAgICBDdk1hdCBteSA9IG14OwogICAgQ3ZNYXQgbW0gPSBteDsKICAgIEN2TWF0IG1hID0gbXg7CgogICAgbXkuZGF0YS5mbCA9IChmbG9hdCopeTsKICAgIG1tLmRhdGEuZmwgPSAoZmxvYXQqKW1hZ25pdHVkZTsKICAgIG1hLmRhdGEuZmwgPSAoZmxvYXQqKWFuZ2xlOwoKICAgIGN2Q2FydFRvUG9sYXIoICZteCwgJm15LCAmbW0sIGFuZ2xlID8gJm1hIDogTlVMTCwgMSApOwp9CgoKQ1ZfSU5MSU5FIHZvaWQgIGN2YkZhc3RBcmN0YW4oIGNvbnN0IGZsb2F0KiB5LCBjb25zdCBmbG9hdCogeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBhbmdsZSwgaW50IGxlbiApCnsKICAgIEN2TWF0IG14ID0gY3ZNYXQoIDEsIGxlbiwgQ1ZfMzJGLCAodm9pZCopeCApOwogICAgQ3ZNYXQgbXkgPSBteDsKICAgIEN2TWF0IG1hID0gbXg7CgogICAgbXkuZGF0YS5mbCA9IChmbG9hdCopeTsKICAgIG1hLmRhdGEuZmwgPSAoZmxvYXQqKWFuZ2xlOwoKICAgIGN2Q2FydFRvUG9sYXIoICZteCwgJm15LCBOVUxMLCAmbWEsIDEgKTsKfQoKCkNWX0lOTElORSAgdm9pZCAgY3ZiU3FydCggY29uc3QgZmxvYXQqIHgsIGZsb2F0KiB5LCBpbnQgbGVuICkKewogICAgQ3ZNYXQgbXggPSBjdk1hdCggMSwgbGVuLCBDVl8zMkYsICh2b2lkKil4ICk7CiAgICBDdk1hdCBteSA9IG14OwogICAgbXkuZGF0YS5mbCA9IChmbG9hdCopeTsKCiAgICBjdlBvdyggJm14LCAmbXksIDAuNSApOwp9CgoKQ1ZfSU5MSU5FICB2b2lkICBjdmJJbnZTcXJ0KCBjb25zdCBmbG9hdCogeCwgZmxvYXQqIHksIGludCBsZW4gKQp7CiAgICBDdk1hdCBteCA9IGN2TWF0KCAxLCBsZW4sIENWXzMyRiwgKHZvaWQqKXggKTsKICAgIEN2TWF0IG15ID0gbXg7CiAgICBteS5kYXRhLmZsID0gKGZsb2F0Kil5OwoKICAgIGN2UG93KCAmbXgsICZteSwgLTAuNSApOwp9CgoKQ1ZfSU5MSU5FICB2b2lkICBjdmJSZWNpcHJvY2FsKCBjb25zdCBmbG9hdCogeCwgZmxvYXQqIHksIGludCBsZW4gKQp7CiAgICBDdk1hdCBteCA9IGN2TWF0KCAxLCBsZW4sIENWXzMyRiwgKHZvaWQqKXggKTsKICAgIEN2TWF0IG15ID0gbXg7CiAgICBteS5kYXRhLmZsID0gKGZsb2F0Kil5OwoKICAgIGN2UG93KCAmbXgsICZteSwgLTEgKTsKfQoKCkNWX0lOTElORSAgdm9pZCAgY3ZiRmFzdEV4cCggY29uc3QgZmxvYXQqIHgsIGRvdWJsZSogeSwgaW50IGxlbiApCnsKICAgIEN2TWF0IG14ID0gY3ZNYXQoIDEsIGxlbiwgQ1ZfMzJGLCAodm9pZCopeCApOwogICAgQ3ZNYXQgbXkgPSBjdk1hdCggMSwgbGVuLCBDVl82NEYsIHkgKTsKICAgIGN2RXhwKCAmbXgsICZteSApOwp9CgoKQ1ZfSU5MSU5FICB2b2lkICBjdmJGYXN0TG9nKCBjb25zdCBkb3VibGUqIHgsIGZsb2F0KiB5LCBpbnQgbGVuICkKewogICAgQ3ZNYXQgbXggPSBjdk1hdCggMSwgbGVuLCBDVl82NEYsICh2b2lkKil4ICk7CiAgICBDdk1hdCBteSA9IGN2TWF0KCAxLCBsZW4sIENWXzMyRiwgeSApOwogICAgY3ZMb2coICZteCwgJm15ICk7Cn0KCgpDVl9JTkxJTkUgIEN2UmVjdCAgY3ZDb250b3VyQm91bmRpbmdSZWN0KCB2b2lkKiBwb2ludF9zZXQsIGludCB1cGRhdGUgQ1ZfREVGQVVMVCgwKSkKewogICAgcmV0dXJuIGN2Qm91bmRpbmdSZWN0KCBwb2ludF9zZXQsIHVwZGF0ZSApOwp9CgoKQ1ZfSU5MSU5FIGRvdWJsZSBjdlBzZXVkb0ludmVyc2UoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QgKQp7CiAgICByZXR1cm4gY3ZJbnZlcnQoIHNyYywgZHN0LCBDVl9TVkQgKTsKfQoKI2RlZmluZSBjdlBzZXVkb0ludiBjdlBzZXVkb0ludmVyc2UKCiNkZWZpbmUgY3ZDb250b3VyTW9tZW50cyggY29udG91ciwgbW9tZW50cyApIFwKICAgIGN2TW9tZW50cyggY29udG91ciwgbW9tZW50cywgMCApCgojZGVmaW5lIGN2R2V0UHRyQXQgICAgICAgICAgICAgIGN2UHRyMkQKI2RlZmluZSBjdkdldEF0ICAgICAgICAgICAgICAgICBjdkdldDJECiNkZWZpbmUgY3ZTZXRBdChhcnIsdmFsLHkseCkgICAgY3ZTZXQyRCgoYXJyKSwoeSksKHgpLCh2YWwpKQoKI2RlZmluZSBjdk1lYW5NYXNrICBjdk1lYW4KI2RlZmluZSBjdk1lYW5fU3RkRGV2TWFzayhpbWcsbWFzayxtZWFuLHNkdikgY3ZNZWFuX1N0ZERldihpbWcsbWVhbixzZHYsbWFzaykKCiNkZWZpbmUgY3ZOb3JtTWFzayhpbWdBLGltZ0IsbWFzayxub3JtVHlwZSkgY3ZOb3JtKGltZ0EsaW1nQixub3JtVHlwZSxtYXNrKQoKI2RlZmluZSBjdk1pbk1heExvY01hc2soaW1nLCBtYXNrLCBtaW5fdmFsLCBtYXhfdmFsLCBtaW5fbG9jLCBtYXhfbG9jKSBcCiAgICAgICAgY3ZNaW5NYXhMb2MoaW1nLCBtaW5fdmFsLCBtYXhfdmFsLCBtaW5fbG9jLCBtYXhfbG9jLCBtYXNrKQoKI2RlZmluZSBjdlJlbW92ZU1lbW9yeU1hbmFnZXIgIGN2U2V0TWVtb3J5TWFuYWdlcgoKI2RlZmluZSBjdm1TZXRaZXJvKCBtYXQgKSAgICAgICAgICAgICAgIGN2U2V0WmVybyggbWF0ICkKI2RlZmluZSBjdm1TZXRJZGVudGl0eSggbWF0ICkgICAgICAgICAgIGN2U2V0SWRlbnRpdHkoIG1hdCApCiNkZWZpbmUgY3ZtQWRkKCBzcmMxLCBzcmMyLCBkc3QgKSAgICAgICBjdkFkZCggc3JjMSwgc3JjMiwgZHN0LCAwICkKI2RlZmluZSBjdm1TdWIoIHNyYzEsIHNyYzIsIGRzdCApICAgICAgIGN2U3ViKCBzcmMxLCBzcmMyLCBkc3QsIDAgKQojZGVmaW5lIGN2bUNvcHkoIHNyYywgZHN0ICkgICAgICAgICAgICAgY3ZDb3B5KCBzcmMsIGRzdCwgMCApCiNkZWZpbmUgY3ZtTXVsKCBzcmMxLCBzcmMyLCBkc3QgKSAgICAgICBjdk1hdE11bEFkZCggc3JjMSwgc3JjMiwgMCwgZHN0ICkKI2RlZmluZSBjdm1UcmFuc3Bvc2UoIHNyYywgZHN0ICkgICAgICAgIGN2VCggc3JjLCBkc3QgKQojZGVmaW5lIGN2bUludmVydCggc3JjLCBkc3QgKSAgICAgICAgICAgY3ZJbnYoIHNyYywgZHN0ICkKI2RlZmluZSBjdm1NYWhhbGFub2Jpcyh2ZWMxLCB2ZWMyLCBtYXQpIGN2TWFoYWxhbm9iaXMoIHZlYzEsIHZlYzIsIG1hdCApCiNkZWZpbmUgY3ZtRG90UHJvZHVjdCggdmVjMSwgdmVjMiApICAgICBjdkRvdFByb2R1Y3QoIHZlYzEsIHZlYzIgKQojZGVmaW5lIGN2bUNyb3NzUHJvZHVjdCh2ZWMxLCB2ZWMyLGRzdCkgY3ZDcm9zc1Byb2R1Y3QoIHZlYzEsIHZlYzIsIGRzdCApCiNkZWZpbmUgY3ZtVHJhY2UoIG1hdCApICAgICAgICAgICAgICAgICAoY3ZUcmFjZSggbWF0ICkpLnZhbFswXQojZGVmaW5lIGN2bU11bFRyYW5zcG9zZWQoIHNyYywgZHN0LCBvcmRlciApIGN2TXVsVHJhbnNwb3NlZCggc3JjLCBkc3QsIG9yZGVyICkKI2RlZmluZSBjdm1FaWdlblZWKCBtYXQsIGV2ZWMsIGV2YWwsIGVwcykgICBjdkVpZ2VuVlYoIG1hdCwgZXZlYywgZXZhbCwgZXBzICkKI2RlZmluZSBjdm1EZXQoIG1hdCApICAgICAgICAgICAgICAgICAgIGN2RGV0KCBtYXQgKQojZGVmaW5lIGN2bVNjYWxlKCBzcmMsIGRzdCwgc2NhbGUgKSAgICAgY3ZTY2FsZSggc3JjLCBkc3QsIHNjYWxlICkKCiNkZWZpbmUgY3ZDb3B5SW1hZ2UoIHNyYywgZHN0ICkgICAgICAgICBjdkNvcHkoIHNyYywgZHN0LCAwICkKI2RlZmluZSBjdlJlbGVhc2VNYXRIZWFkZXIgICAgICAgICAgICAgIGN2UmVsZWFzZU1hdAoKLyogQ2FsY3VsYXRlcyBleGFjdCBjb252ZXggaHVsbCBvZiAyZCBwb2ludCBzZXQgKi8KQ1ZfSU5MSU5FIHZvaWQgY3ZDb252ZXhIdWxsKCBDdlBvaW50KiBwb2ludHMsIGludCBudW1fcG9pbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCogQ1ZfVU5SRUZFUkVOQ0VEKGJvdW5kX3JlY3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiwgaW50KiBodWxsLCBpbnQqIGh1bGxzaXplICkKewogICAgQ3ZNYXQgcG9pbnRzMSA9IGN2TWF0KCAxLCBudW1fcG9pbnRzLCBDVl8zMlNDMiwgcG9pbnRzICk7CiAgICBDdk1hdCBodWxsMSA9IGN2TWF0KCAxLCBudW1fcG9pbnRzLCBDVl8zMlNDMSwgaHVsbCApOwoKICAgIGN2Q29udmV4SHVsbDIoICZwb2ludHMxLCAmaHVsbDEsIG9yaWVudGF0aW9uLCAwICk7CiAgICAqaHVsbHNpemUgPSBodWxsMS5jb2xzOwp9CgovKiBDYWxjdWxhdGVzIGV4YWN0IGNvbnZleCBodWxsIG9mIDJkIHBvaW50IHNldCBzdG9yZWQgaW4gYSBzZXF1ZW5jZSAqLwojZGVmaW5lIGN2Q29udG91ckNvbnZleEh1bGwoIGNvbnRvdXIsIG9yaWVudGF0aW9uLCBzdG9yYWdlICkgXAogICAgY3ZDb252ZXhIdWxsMiggY29udG91ciwgc3RvcmFnZSwgb3JpZW50YXRpb24gKQoKLyogQ2FsY3VsYXRlcyBhcHByb3hpbWF0ZSBjb252ZXggaHVsbCBvZiAyZCBwb2ludCBzZXQgKi8KI2RlZmluZSBjdkNvbnZleEh1bGxBcHByb3goIHBvaW50cywgbnVtX3BvaW50cywgYm91bmRfcmVjdCwgYmFuZHdpZHRoLCAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLCBodWxsLCBodWxsc2l6ZSApICAgICAgICAgICAgICAgICAgIFwKY3ZDb252ZXhIdWxsKCBwb2ludHMsIG51bV9wb2ludHMsIGJvdW5kX3JlY3QsIG9yaWVudGF0aW9uLCBodWxsLCBodWxsc2l6ZSApCgovKiBDYWxjdWxhdGVzIGFwcHJveGltYXRlIGNvbnZleCBodWxsIG9mIDJkIHBvaW50IHNldCBzdG9yZWQgaW4gYSBzZXF1ZW5jZSAqLwojZGVmaW5lIGN2Q29udG91ckNvbnZleEh1bGxBcHByb3goIGNvbnRvdXIsIGJhbmR3aWR0aCwgb3JpZW50YXRpb24sIHN0b3JhZ2UgKSAgIFwKICAgIGN2Q29udmV4SHVsbDIoIGNvbnRvdXIsIHN0b3JhZ2UsIG9yaWVudGF0aW9uICkKCgpDVl9JTkxJTkUgdm9pZCBjdk1pbkFyZWFSZWN0KCBDdlBvaW50KiBwb2ludHMsIGludCBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKGxlZnQpLCBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKGJvdHRvbSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDVl9VTlJFRkVSRU5DRUQocmlnaHQpLCBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKHRvcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogYW5jaG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIHZlY3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIHZlY3QyICkKewogICAgQ3ZNYXQgbWF0ID0gY3ZNYXQoIDEsIG4sIENWXzMyU0MyLCBwb2ludHMgKTsKICAgIEN2Qm94MkQgYm94ID0gY3ZNaW5BcmVhUmVjdDIoICZtYXQsIDAgKTsKICAgIEN2UG9pbnQyRDMyZiBwdFs0XTsKCiAgICBjdkJveFBvaW50cyggYm94LCBwdCApOwogICAgKmFuY2hvciA9IHB0WzBdOwogICAgdmVjdDEtPnggPSBwdFsxXS54IC0gcHRbMF0ueDsKICAgIHZlY3QxLT55ID0gcHRbMV0ueSAtIHB0WzBdLnk7CiAgICB2ZWN0Mi0+eCA9IHB0WzNdLnggLSBwdFswXS54OwogICAgdmVjdDItPnkgPSBwdFszXS55IC0gcHRbMF0ueTsKCiAgICBDVl9VTlJFRkVSRU5DRUQoIChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApICk7Cn0KCnR5cGVkZWYgaW50IEN2RGlzVHlwZTsKdHlwZWRlZiBpbnQgQ3ZDaGFpbkFwcHJveE1ldGhvZDsKdHlwZWRlZiBpbnQgQ3ZDb250b3VyUmV0cmlldmFsTW9kZTsKCkNWX0lOTElORSAgdm9pZCAgY3ZGaXRMaW5lM0QoIEN2UG9pbnQzRDMyZiogcG9pbnRzLCBpbnQgY291bnQsIGludCBkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJhbSwgZmxvYXQgcmVwcywgZmxvYXQgYWVwcywgZmxvYXQqIGxpbmUgKQp7CiAgICBDdk1hdCBtYXQgPSBjdk1hdCggMSwgY291bnQsIENWXzMyRkMzLCBwb2ludHMgKTsKICAgIGZsb2F0IF9wYXJhbSA9IHBhcmFtICE9IE5VTEwgPyAqKGZsb2F0KilwYXJhbSA6IDAuZjsKICAgIGFzc2VydCggZGlzdCAhPSBDVl9ESVNUX1VTRVIgKTsKICAgIGN2Rml0TGluZSggJm1hdCwgZGlzdCwgX3BhcmFtLCByZXBzLCBhZXBzLCBsaW5lICk7Cn0KCi8qIEZpdHMgYSBsaW5lIGludG8gc2V0IG9mIDJkIHBvaW50cyBpbiBhIHJvYnVzdCB3YXkgKE0tZXN0aW1hdG9yIHRlY2huaXF1ZSkgKi8KQ1ZfSU5MSU5FICB2b2lkICBjdkZpdExpbmUyRCggQ3ZQb2ludDJEMzJmKiBwb2ludHMsIGludCBjb3VudCwgaW50IGRpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmFtLCBmbG9hdCByZXBzLCBmbG9hdCBhZXBzLCBmbG9hdCogbGluZSApCnsKICAgIEN2TWF0IG1hdCA9IGN2TWF0KCAxLCBjb3VudCwgQ1ZfMzJGQzIsIHBvaW50cyApOwogICAgZmxvYXQgX3BhcmFtID0gcGFyYW0gIT0gTlVMTCA/ICooZmxvYXQqKXBhcmFtIDogMC5mOwogICAgYXNzZXJ0KCBkaXN0ICE9IENWX0RJU1RfVVNFUiApOwogICAgY3ZGaXRMaW5lKCAmbWF0LCBkaXN0LCBfcGFyYW0sIHJlcHMsIGFlcHMsIGxpbmUgKTsKfQoKCkNWX0lOTElORSAgdm9pZCBjdkZpdEVsbGlwc2UoIGNvbnN0IEN2UG9pbnQyRDMyZiogcG9pbnRzLCBpbnQgY291bnQsIEN2Qm94MkQqIGJveCApCnsKICAgIEN2TWF0IG1hdCA9IGN2TWF0KCAxLCBjb3VudCwgQ1ZfMzJGQzIsICh2b2lkKilwb2ludHMgKTsKICAgICpib3ggPSBjdkZpdEVsbGlwc2UyKCAmbWF0ICk7Cn0KCi8qIFByb2plY3RzIDJkIHBvaW50cyB0byBvbmUgb2Ygc3RhbmRhcmQgY29vcmRpbmF0ZSBwbGFuZXMKICAgKGkuZS4gcmVtb3ZlcyBvbmUgb2YgY29vcmRpbmF0ZXMpICovCkNWX0lOTElORSAgdm9pZCAgY3ZQcm9qZWN0M0QoIEN2UG9pbnQzRDMyZiogcG9pbnRzM0QsIGludCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBwb2ludHMyRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhJbmR4IENWX0RFRkFVTFQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5SW5keCBDVl9ERUZBVUxUKDEpKQp7CiAgICBDdk1hdCBzcmMgPSBjdk1hdCggMSwgY291bnQsIENWXzMyRkMzLCBwb2ludHMzRCApOwogICAgQ3ZNYXQgZHN0ID0gY3ZNYXQoIDEsIGNvdW50LCBDVl8zMkZDMiwgcG9pbnRzMkQgKTsKICAgIGZsb2F0IG1bNl0gPSB7MCwwLDAsMCwwLDB9OwogICAgQ3ZNYXQgTSA9IGN2TWF0KCAyLCAzLCBDVl8zMkYsIG0gKTsKCiAgICBhc3NlcnQoICh1bnNpZ25lZCl4SW5keCA8IDMgJiYgKHVuc2lnbmVkKXlJbmR4IDwgMyApOwogICAgbVt4SW5keF0gPSBtW3lJbmR4KzNdID0gMS5mOwoKICAgIGN2VHJhbnNmb3JtKCAmc3JjLCAmZHN0LCAmTSwgTlVMTCApOwp9CgoKLyogUmV0cmlldmVzIHZhbHVlIG9mIHRoZSBwYXJ0aWN1bGFyIGJpbgogICBvZiB4LWRpbWVuc2lvbmFsICh4PTEsMiwzLC4uLikgaGlzdG9ncmFtICovCiNkZWZpbmUgY3ZRdWVyeUhpc3RWYWx1ZV8xRCggaGlzdCwgaWR4MCApIFwKICAgICgoZmxvYXQpY3ZHZXRSZWFsMUQoIChoaXN0KS0+YmlucywgKGlkeDApKSkKI2RlZmluZSBjdlF1ZXJ5SGlzdFZhbHVlXzJEKCBoaXN0LCBpZHgwLCBpZHgxICkgXAogICAgKChmbG9hdCljdkdldFJlYWwyRCggKGhpc3QpLT5iaW5zLCAoaWR4MCksIChpZHgxKSkpCiNkZWZpbmUgY3ZRdWVyeUhpc3RWYWx1ZV8zRCggaGlzdCwgaWR4MCwgaWR4MSwgaWR4MiApIFwKICAgICgoZmxvYXQpY3ZHZXRSZWFsM0QoIChoaXN0KS0+YmlucywgKGlkeDApLCAoaWR4MSksIChpZHgyKSkpCiNkZWZpbmUgY3ZRdWVyeUhpc3RWYWx1ZV9uRCggaGlzdCwgaWR4ICkgXAogICAgKChmbG9hdCljdkdldFJlYWxORCggKGhpc3QpLT5iaW5zLCAoaWR4KSkpCgovKiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIHBhcnRpY3VsYXIgYmluIG9mIHgtZGltZXNpb25hbCBoaXN0b2dyYW0uCiAgIEZvciBzcGFyc2UgaGlzdG9ncmFtIHRoZSBiaW4gaXMgY3JlYXRlZCBpZiBpdCBkaWRuJ3QgZXhpc3QgYmVmb3JlICovCiNkZWZpbmUgY3ZHZXRIaXN0VmFsdWVfMUQoIGhpc3QsIGlkeDAgKSBcCiAgICAoKGZsb2F0KiljdlB0cjFEKCAoaGlzdCktPmJpbnMsIChpZHgwKSwgMCkpCiNkZWZpbmUgY3ZHZXRIaXN0VmFsdWVfMkQoIGhpc3QsIGlkeDAsIGlkeDEgKSBcCiAgICAoKGZsb2F0KiljdlB0cjJEKCAoaGlzdCktPmJpbnMsIChpZHgwKSwgKGlkeDEpLCAwKSkKI2RlZmluZSBjdkdldEhpc3RWYWx1ZV8zRCggaGlzdCwgaWR4MCwgaWR4MSwgaWR4MiApIFwKICAgICgoZmxvYXQqKWN2UHRyM0QoIChoaXN0KS0+YmlucywgKGlkeDApLCAoaWR4MSksIChpZHgyKSwgMCkpCiNkZWZpbmUgY3ZHZXRIaXN0VmFsdWVfbkQoIGhpc3QsIGlkeCApIFwKICAgICgoZmxvYXQqKWN2UHRyTkQoIChoaXN0KS0+YmlucywgKGlkeCksIDApKQoKCiNkZWZpbmUgQ1ZfSVNfU0VUX0VMRU1fRVhJU1RTIENWX0lTX1NFVF9FTEVNCgoKQ1ZfSU5MSU5FICBpbnQgIGN2SG91Z2hMaW5lcyggQ3ZBcnIqIGltYWdlLCBkb3VibGUgcmhvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhldGEsIGludCB0aHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsaW5lcywgaW50IGxpbmVzTnVtYmVyICkKewogICAgQ3ZNYXQgbGluZXNNYXQgPSBjdk1hdCggMSwgbGluZXNOdW1iZXIsIENWXzMyRkMyLCBsaW5lcyApOwogICAgY3ZIb3VnaExpbmVzMiggaW1hZ2UsICZsaW5lc01hdCwgQ1ZfSE9VR0hfU1RBTkRBUkQsCiAgICAgICAgICAgICAgICAgICByaG8sIHRoZXRhLCB0aHJlc2hvbGQsIDAsIDAgKTsKCiAgICByZXR1cm4gbGluZXNNYXQuY29sczsKfQoKCkNWX0lOTElORSAgaW50ICBjdkhvdWdoTGluZXNQKCBDdkFyciogaW1hZ2UsIGRvdWJsZSByaG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhldGEsIGludCB0aHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUxlbmd0aCwgaW50IGxpbmVHYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxpbmVzLCBpbnQgbGluZXNOdW1iZXIgKQp7CiAgICBDdk1hdCBsaW5lc01hdCA9IGN2TWF0KCAxLCBsaW5lc051bWJlciwgQ1ZfMzJTQzQsIGxpbmVzICk7CiAgICBjdkhvdWdoTGluZXMyKCBpbWFnZSwgJmxpbmVzTWF0LCBDVl9IT1VHSF9QUk9CQUJJTElTVElDLAogICAgICAgICAgICAgICAgICAgcmhvLCB0aGV0YSwgdGhyZXNob2xkLCBsaW5lTGVuZ3RoLCBsaW5lR2FwICk7CgogICAgcmV0dXJuIGxpbmVzTWF0LmNvbHM7Cn0KCgpDVl9JTkxJTkUgIGludCAgY3ZIb3VnaExpbmVzU0RpdiggQ3ZBcnIqIGltYWdlLCBkb3VibGUgcmhvLCBpbnQgc3JuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRoZXRhLCBpbnQgc3RuLCBpbnQgdGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxpbmVzLCBpbnQgbGluZXNOdW1iZXIgKQp7CiAgICBDdk1hdCBsaW5lc01hdCA9IGN2TWF0KCAxLCBsaW5lc051bWJlciwgQ1ZfMzJGQzIsIGxpbmVzICk7CiAgICBjdkhvdWdoTGluZXMyKCBpbWFnZSwgJmxpbmVzTWF0LCBDVl9IT1VHSF9NVUxUSV9TQ0FMRSwKICAgICAgICAgICAgICAgICAgIHJobywgdGhldGEsIHRocmVzaG9sZCwgc3JuLCBzdG4gKTsKCiAgICByZXR1cm4gbGluZXNNYXQuY29sczsKfQoKCi8qIEZpbmQgZnVuZGFtZW50YWwgbWF0cml4ICovCkNWX0lOTElORSAgdm9pZCAgY3ZGaW5kRnVuZGFtZW50YWxNYXRyaXgoIGludCogcG9pbnRzMSwgaW50KiBwb2ludHMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bXBvaW50cywgaW50IENWX1VOUkVGRVJFTkNFRChtZXRob2QpLCBmbG9hdCogbWF0cml4ICkKewogICAgQ3ZNYXQqIHBvaW50c01hdDE7CiAgICBDdk1hdCogcG9pbnRzTWF0MjsKICAgIEN2TWF0IGZ1bmRNYXRyID0gY3ZNYXQoMywzLENWXzMyRixtYXRyaXgpOwogICAgaW50IGksIGN1cnIgPSAwOwoKICAgIHBvaW50c01hdDEgPSBjdkNyZWF0ZU1hdCgzLG51bXBvaW50cyxDVl82NEYpOwogICAgcG9pbnRzTWF0MiA9IGN2Q3JlYXRlTWF0KDMsbnVtcG9pbnRzLENWXzY0Rik7CgogICAgZm9yKCBpID0gMDsgaSA8IG51bXBvaW50czsgaSsrICkKICAgIHsKICAgICAgICBjdm1TZXQocG9pbnRzTWF0MSwwLGkscG9pbnRzMVtjdXJyXSk7Ly94CiAgICAgICAgY3ZtU2V0KHBvaW50c01hdDEsMSxpLHBvaW50czFbY3VycisxXSk7Ly95CiAgICAgICAgY3ZtU2V0KHBvaW50c01hdDEsMixpLDEuMCk7CgogICAgICAgIGN2bVNldChwb2ludHNNYXQyLDAsaSxwb2ludHMyW2N1cnJdKTsvL3gKICAgICAgICBjdm1TZXQocG9pbnRzTWF0MiwxLGkscG9pbnRzMltjdXJyKzFdKTsvL3kKICAgICAgICBjdm1TZXQocG9pbnRzTWF0MiwyLGksMS4wKTsKICAgICAgICBjdXJyICs9IDI7CiAgICB9CgogICAgY3ZGaW5kRnVuZGFtZW50YWxNYXQocG9pbnRzTWF0MSxwb2ludHNNYXQyLCZmdW5kTWF0cixDVl9GTV9SQU5TQUMsMSwwLjk5LDApOwoKICAgIGN2UmVsZWFzZU1hdCgmcG9pbnRzTWF0MSk7CiAgICBjdlJlbGVhc2VNYXQoJnBvaW50c01hdDIpOwp9CgoKCkNWX0lOTElORSBpbnQKY3ZGaW5kQ2hlc3NCb2FyZENvcm5lckd1ZXNzZXMoIGNvbnN0IHZvaWQqIGFyciwgdm9pZCogQ1ZfVU5SRUZFUkVOQ0VEKHRocmVzaGFyciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UgKiBDVl9VTlJFRkVSRU5DRUQoc3RvcmFnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgcGF0dGVybl9zaXplLCBDdlBvaW50MkQzMmYgKiBjb3JuZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3JuZXJfY291bnQgKQp7CiAgICByZXR1cm4gY3ZGaW5kQ2hlc3Nib2FyZENvcm5lcnMoIGFyciwgcGF0dGVybl9zaXplLCBjb3JuZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JuZXJfY291bnQsIENWX0NBTElCX0NCX0FEQVBUSVZFX1RIUkVTSCApOwp9CgoKLyogQ2FsaWJyYXRlcyBjYW1lcmEgdXNpbmcgbXVsdGlwbGUgdmlld3Mgb2YgY2FsaWJyYXRpb24gcGF0dGVybiAqLwpDVl9JTkxJTkUgdm9pZCBjdkNhbGlicmF0ZUNhbWVyYSggaW50IGltYWdlX2NvdW50LCBpbnQqIF9wb2ludF9jb3VudHMsCiAgICBDdlNpemUgaW1hZ2Vfc2l6ZSwgQ3ZQb2ludDJEMzJmKiBfaW1hZ2VfcG9pbnRzLCBDdlBvaW50M0QzMmYqIF9vYmplY3RfcG9pbnRzLAogICAgZmxvYXQqIF9kaXN0b3J0aW9uX2NvZWZmcywgZmxvYXQqIF9jYW1lcmFfbWF0cml4LCBmbG9hdCogX3RyYW5zbGF0aW9uX3ZlY3RvcnMsCiAgICBmbG9hdCogX3JvdGF0aW9uX21hdHJpY2VzLCBpbnQgZmxhZ3MgKQp7CiAgICBpbnQgaSwgdG90YWwgPSAwOwogICAgQ3ZNYXQgcG9pbnRfY291bnRzID0gY3ZNYXQoIGltYWdlX2NvdW50LCAxLCBDVl8zMlNDMSwgX3BvaW50X2NvdW50cyApOwogICAgQ3ZNYXQgaW1hZ2VfcG9pbnRzLCBvYmplY3RfcG9pbnRzOwogICAgQ3ZNYXQgZGlzdF9jb2VmZnMgPSBjdk1hdCggNCwgMSwgQ1ZfMzJGQzEsIF9kaXN0b3J0aW9uX2NvZWZmcyApOwogICAgQ3ZNYXQgY2FtZXJhX21hdHJpeCA9IGN2TWF0KCAzLCAzLCBDVl8zMkZDMSwgX2NhbWVyYV9tYXRyaXggKTsKICAgIEN2TWF0IHJvdGF0aW9uX21hdHJpY2VzID0gY3ZNYXQoIGltYWdlX2NvdW50LCA5LCBDVl8zMkZDMSwgX3JvdGF0aW9uX21hdHJpY2VzICk7CiAgICBDdk1hdCB0cmFuc2xhdGlvbl92ZWN0b3JzID0gY3ZNYXQoIGltYWdlX2NvdW50LCAzLCBDVl8zMkZDMSwgX3RyYW5zbGF0aW9uX3ZlY3RvcnMgKTsKCiAgICBmb3IoIGkgPSAwOyBpIDwgaW1hZ2VfY291bnQ7IGkrKyApCiAgICAgICAgdG90YWwgKz0gX3BvaW50X2NvdW50c1tpXTsKCiAgICBpbWFnZV9wb2ludHMgPSBjdk1hdCggdG90YWwsIDEsIENWXzMyRkMyLCBfaW1hZ2VfcG9pbnRzICk7CiAgICBvYmplY3RfcG9pbnRzID0gY3ZNYXQoIHRvdGFsLCAxLCBDVl8zMkZDMywgX29iamVjdF9wb2ludHMgKTsKCiAgICBjdkNhbGlicmF0ZUNhbWVyYTIoICZvYmplY3RfcG9pbnRzLCAmaW1hZ2VfcG9pbnRzLCAmcG9pbnRfY291bnRzLCBpbWFnZV9zaXplLAogICAgICAgICZjYW1lcmFfbWF0cml4LCAmZGlzdF9jb2VmZnMsICZyb3RhdGlvbl9tYXRyaWNlcywgJnRyYW5zbGF0aW9uX3ZlY3RvcnMsCiAgICAgICAgZmxhZ3MgKTsKfQoKCkNWX0lOTElORSB2b2lkIGN2Q2FsaWJyYXRlQ2FtZXJhXzY0ZCggaW50IGltYWdlX2NvdW50LCBpbnQqIF9wb2ludF9jb3VudHMsCiAgICBDdlNpemUgaW1hZ2Vfc2l6ZSwgQ3ZQb2ludDJENjRmKiBfaW1hZ2VfcG9pbnRzLCBDdlBvaW50M0Q2NGYqIF9vYmplY3RfcG9pbnRzLAogICAgZG91YmxlKiBfZGlzdG9ydGlvbl9jb2VmZnMsIGRvdWJsZSogX2NhbWVyYV9tYXRyaXgsIGRvdWJsZSogX3RyYW5zbGF0aW9uX3ZlY3RvcnMsCiAgICBkb3VibGUqIF9yb3RhdGlvbl9tYXRyaWNlcywgaW50IGZsYWdzICkKewogICAgaW50IGksIHRvdGFsID0gMDsKICAgIEN2TWF0IHBvaW50X2NvdW50cyA9IGN2TWF0KCBpbWFnZV9jb3VudCwgMSwgQ1ZfMzJTQzEsIF9wb2ludF9jb3VudHMgKTsKICAgIEN2TWF0IGltYWdlX3BvaW50cywgb2JqZWN0X3BvaW50czsKICAgIEN2TWF0IGRpc3RfY29lZmZzID0gY3ZNYXQoIDQsIDEsIENWXzY0RkMxLCBfZGlzdG9ydGlvbl9jb2VmZnMgKTsKICAgIEN2TWF0IGNhbWVyYV9tYXRyaXggPSBjdk1hdCggMywgMywgQ1ZfNjRGQzEsIF9jYW1lcmFfbWF0cml4ICk7CiAgICBDdk1hdCByb3RhdGlvbl9tYXRyaWNlcyA9IGN2TWF0KCBpbWFnZV9jb3VudCwgOSwgQ1ZfNjRGQzEsIF9yb3RhdGlvbl9tYXRyaWNlcyApOwogICAgQ3ZNYXQgdHJhbnNsYXRpb25fdmVjdG9ycyA9IGN2TWF0KCBpbWFnZV9jb3VudCwgMywgQ1ZfNjRGQzEsIF90cmFuc2xhdGlvbl92ZWN0b3JzICk7CgogICAgZm9yKCBpID0gMDsgaSA8IGltYWdlX2NvdW50OyBpKysgKQogICAgICAgIHRvdGFsICs9IF9wb2ludF9jb3VudHNbaV07CgogICAgaW1hZ2VfcG9pbnRzID0gY3ZNYXQoIHRvdGFsLCAxLCBDVl82NEZDMiwgX2ltYWdlX3BvaW50cyApOwogICAgb2JqZWN0X3BvaW50cyA9IGN2TWF0KCB0b3RhbCwgMSwgQ1ZfNjRGQzMsIF9vYmplY3RfcG9pbnRzICk7CgogICAgY3ZDYWxpYnJhdGVDYW1lcmEyKCAmb2JqZWN0X3BvaW50cywgJmltYWdlX3BvaW50cywgJnBvaW50X2NvdW50cywgaW1hZ2Vfc2l6ZSwKICAgICAgICAmY2FtZXJhX21hdHJpeCwgJmRpc3RfY29lZmZzLCAmcm90YXRpb25fbWF0cmljZXMsICZ0cmFuc2xhdGlvbl92ZWN0b3JzLAogICAgICAgIGZsYWdzICk7Cn0KCgoKLyogRmluZCAzZCBwb3NpdGlvbiBvZiBvYmplY3QgZ2l2ZW4gaW50cmluc2ljIGNhbWVyYSBwYXJhbWV0ZXJzLAogICAzZCBtb2RlbCBvZiB0aGUgb2JqZWN0IGFuZCBwcm9qZWN0aW9uIG9mIHRoZSBvYmplY3QgaW50byB2aWV3IHBsYW5lICovCkNWX0lOTElORSB2b2lkIGN2RmluZEV4dHJpbnNpY0NhbWVyYVBhcmFtcyggaW50IHBvaW50X2NvdW50LAogICAgQ3ZTaXplIENWX1VOUkVGRVJFTkNFRChpbWFnZV9zaXplKSwgQ3ZQb2ludDJEMzJmKiBfaW1hZ2VfcG9pbnRzLAogICAgQ3ZQb2ludDNEMzJmKiBfb2JqZWN0X3BvaW50cywgZmxvYXQqIGZvY2FsX2xlbmd0aCwKICAgIEN2UG9pbnQyRDMyZiBwcmluY2lwYWxfcG9pbnQsIGZsb2F0KiBfZGlzdG9ydGlvbl9jb2VmZnMsCiAgICBmbG9hdCogX3JvdGF0aW9uX3ZlY3RvciwgZmxvYXQqIF90cmFuc2xhdGlvbl92ZWN0b3IgKQp7CiAgICBDdk1hdCBpbWFnZV9wb2ludHMgPSBjdk1hdCggcG9pbnRfY291bnQsIDEsIENWXzMyRkMyLCBfaW1hZ2VfcG9pbnRzICk7CiAgICBDdk1hdCBvYmplY3RfcG9pbnRzID0gY3ZNYXQoIHBvaW50X2NvdW50LCAxLCBDVl8zMkZDMywgX29iamVjdF9wb2ludHMgKTsKICAgIEN2TWF0IGRpc3RfY29lZmZzID0gY3ZNYXQoIDQsIDEsIENWXzMyRkMxLCBfZGlzdG9ydGlvbl9jb2VmZnMgKTsKICAgIGZsb2F0IGFbOV07CiAgICBDdk1hdCBjYW1lcmFfbWF0cml4ID0gY3ZNYXQoIDMsIDMsIENWXzMyRkMxLCBhICk7CiAgICBDdk1hdCByb3RhdGlvbl92ZWN0b3IgPSBjdk1hdCggMSwgMSwgQ1ZfMzJGQzMsIF9yb3RhdGlvbl92ZWN0b3IgKTsKICAgIEN2TWF0IHRyYW5zbGF0aW9uX3ZlY3RvciA9IGN2TWF0KCAxLCAxLCBDVl8zMkZDMywgX3RyYW5zbGF0aW9uX3ZlY3RvciApOwoKICAgIGFbMF0gPSBmb2NhbF9sZW5ndGhbMF07IGFbNF0gPSBmb2NhbF9sZW5ndGhbMV07CiAgICBhWzJdID0gcHJpbmNpcGFsX3BvaW50Lng7IGFbNV0gPSBwcmluY2lwYWxfcG9pbnQueTsKICAgIGFbMV0gPSBhWzNdID0gYVs2XSA9IGFbN10gPSAwLmY7CiAgICBhWzhdID0gMS5mOwoKICAgIGN2RmluZEV4dHJpbnNpY0NhbWVyYVBhcmFtczIoICZvYmplY3RfcG9pbnRzLCAmaW1hZ2VfcG9pbnRzLCAmY2FtZXJhX21hdHJpeCwKICAgICAgICAmZGlzdF9jb2VmZnMsICZyb3RhdGlvbl92ZWN0b3IsICZ0cmFuc2xhdGlvbl92ZWN0b3IgKTsKfQoKCi8qIFZhcmlhbnQgb2YgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIHRoYXQgdGFrZXMgZG91YmxlLXByZWNpc2lvbiBwYXJhbWV0ZXJzICovCkNWX0lOTElORSB2b2lkIGN2RmluZEV4dHJpbnNpY0NhbWVyYVBhcmFtc182NGQoIGludCBwb2ludF9jb3VudCwKICAgIEN2U2l6ZSBDVl9VTlJFRkVSRU5DRUQoaW1hZ2Vfc2l6ZSksIEN2UG9pbnQyRDY0ZiogX2ltYWdlX3BvaW50cywKICAgIEN2UG9pbnQzRDY0ZiogX29iamVjdF9wb2ludHMsIGRvdWJsZSogZm9jYWxfbGVuZ3RoLAogICAgQ3ZQb2ludDJENjRmIHByaW5jaXBhbF9wb2ludCwgZG91YmxlKiBfZGlzdG9ydGlvbl9jb2VmZnMsCiAgICBkb3VibGUqIF9yb3RhdGlvbl92ZWN0b3IsIGRvdWJsZSogX3RyYW5zbGF0aW9uX3ZlY3RvciApCnsKICAgIEN2TWF0IGltYWdlX3BvaW50cyA9IGN2TWF0KCBwb2ludF9jb3VudCwgMSwgQ1ZfNjRGQzIsIF9pbWFnZV9wb2ludHMgKTsKICAgIEN2TWF0IG9iamVjdF9wb2ludHMgPSBjdk1hdCggcG9pbnRfY291bnQsIDEsIENWXzY0RkMzLCBfb2JqZWN0X3BvaW50cyApOwogICAgQ3ZNYXQgZGlzdF9jb2VmZnMgPSBjdk1hdCggNCwgMSwgQ1ZfNjRGQzEsIF9kaXN0b3J0aW9uX2NvZWZmcyApOwogICAgZG91YmxlIGFbOV07CiAgICBDdk1hdCBjYW1lcmFfbWF0cml4ID0gY3ZNYXQoIDMsIDMsIENWXzY0RkMxLCBhICk7CiAgICBDdk1hdCByb3RhdGlvbl92ZWN0b3IgPSBjdk1hdCggMSwgMSwgQ1ZfNjRGQzMsIF9yb3RhdGlvbl92ZWN0b3IgKTsKICAgIEN2TWF0IHRyYW5zbGF0aW9uX3ZlY3RvciA9IGN2TWF0KCAxLCAxLCBDVl82NEZDMywgX3RyYW5zbGF0aW9uX3ZlY3RvciApOwoKICAgIGFbMF0gPSBmb2NhbF9sZW5ndGhbMF07IGFbNF0gPSBmb2NhbF9sZW5ndGhbMV07CiAgICBhWzJdID0gcHJpbmNpcGFsX3BvaW50Lng7IGFbNV0gPSBwcmluY2lwYWxfcG9pbnQueTsKICAgIGFbMV0gPSBhWzNdID0gYVs2XSA9IGFbN10gPSAwLjsKICAgIGFbOF0gPSAxLjsKCiAgICBjdkZpbmRFeHRyaW5zaWNDYW1lcmFQYXJhbXMyKCAmb2JqZWN0X3BvaW50cywgJmltYWdlX3BvaW50cywgJmNhbWVyYV9tYXRyaXgsCiAgICAgICAgJmRpc3RfY29lZmZzLCAmcm90YXRpb25fdmVjdG9yLCAmdHJhbnNsYXRpb25fdmVjdG9yICk7Cn0KCgovKiBSb2RyaWd1ZXMgdHJhbnNmb3JtICovCiNkZWZpbmUgQ1ZfUk9EUklHVUVTX00yViAgMAojZGVmaW5lIENWX1JPRFJJR1VFU19WMk0gIDEKCi8qIENvbnZlcnRzIHJvdGF0aW9uX21hdHJpeCBtYXRyaXggdG8gcm90YXRpb25fbWF0cml4IHZlY3RvciBvciB2aWNlIHZlcnNhICovCkNWX0lOTElORSB2b2lkICBjdlJvZHJpZ3VlcyggQ3ZNYXQqIHJvdGF0aW9uX21hdHJpeCwgQ3ZNYXQqIHJvdGF0aW9uX3ZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogamFjb2JpYW4sIGludCBjb252X3R5cGUgKQp7CiAgICBpZiggY29udl90eXBlID09IENWX1JPRFJJR1VFU19WMk0gKQogICAgICAgIGN2Um9kcmlndWVzMiggcm90YXRpb25fdmVjdG9yLCByb3RhdGlvbl9tYXRyaXgsIGphY29iaWFuICk7CiAgICBlbHNlCiAgICAgICAgY3ZSb2RyaWd1ZXMyKCByb3RhdGlvbl9tYXRyaXgsIHJvdGF0aW9uX3ZlY3RvciwgamFjb2JpYW4gKTsKfQoKCi8qIERvZXMgcmVwcm9qZWN0aW9uIG9mIDNkIG9iamVjdCBwb2ludHMgdG8gdGhlIHZpZXcgcGxhbmUgKi8KQ1ZfSU5MSU5FIHZvaWQgIGN2UHJvamVjdFBvaW50cyggaW50IHBvaW50X2NvdW50LCBDdlBvaW50M0Q2NGYqIF9vYmplY3RfcG9pbnRzLAogICAgZG91YmxlKiBfcm90YXRpb25fdmVjdG9yLCBkb3VibGUqICBfdHJhbnNsYXRpb25fdmVjdG9yLAogICAgZG91YmxlKiBmb2NhbF9sZW5ndGgsIEN2UG9pbnQyRDY0ZiBwcmluY2lwYWxfcG9pbnQsCiAgICBkb3VibGUqIF9kaXN0b3J0aW9uLCBDdlBvaW50MkQ2NGYqIF9pbWFnZV9wb2ludHMsCiAgICBkb3VibGUqIF9kZXJpdl9wb2ludHNfcm90YXRpb25fbWF0cml4LAogICAgZG91YmxlKiBfZGVyaXZfcG9pbnRzX3RyYW5zbGF0aW9uX3ZlY3QsCiAgICBkb3VibGUqIF9kZXJpdl9wb2ludHNfZm9jYWwsCiAgICBkb3VibGUqIF9kZXJpdl9wb2ludHNfcHJpbmNpcGFsX3BvaW50LAogICAgZG91YmxlKiBfZGVyaXZfcG9pbnRzX2Rpc3RvcnRpb25fY29lZmZzICkKewogICAgQ3ZNYXQgb2JqZWN0X3BvaW50cyA9IGN2TWF0KCBwb2ludF9jb3VudCwgMSwgQ1ZfNjRGQzMsIF9vYmplY3RfcG9pbnRzICk7CiAgICBDdk1hdCBpbWFnZV9wb2ludHMgPSBjdk1hdCggcG9pbnRfY291bnQsIDEsIENWXzY0RkMyLCBfaW1hZ2VfcG9pbnRzICk7CiAgICBDdk1hdCByb3RhdGlvbl92ZWN0b3IgPSBjdk1hdCggMywgMSwgQ1ZfNjRGQzEsIF9yb3RhdGlvbl92ZWN0b3IgKTsKICAgIEN2TWF0IHRyYW5zbGF0aW9uX3ZlY3RvciA9IGN2TWF0KCAzLCAxLCBDVl82NEZDMSwgX3RyYW5zbGF0aW9uX3ZlY3RvciApOwogICAgZG91YmxlIGFbOV07CiAgICBDdk1hdCBjYW1lcmFfbWF0cml4ID0gY3ZNYXQoIDMsIDMsIENWXzY0RkMxLCBhICk7CiAgICBDdk1hdCBkaXN0X2NvZWZmcyA9IGN2TWF0KCA0LCAxLCBDVl82NEZDMSwgX2Rpc3RvcnRpb24gKTsKICAgIEN2TWF0IGRwZHIgPSBjdk1hdCggMipwb2ludF9jb3VudCwgMywgQ1ZfNjRGQzEsIF9kZXJpdl9wb2ludHNfcm90YXRpb25fbWF0cml4ICk7CiAgICBDdk1hdCBkcGR0ID0gY3ZNYXQoIDIqcG9pbnRfY291bnQsIDMsIENWXzY0RkMxLCBfZGVyaXZfcG9pbnRzX3RyYW5zbGF0aW9uX3ZlY3QgKTsKICAgIEN2TWF0IGRwZGYgPSBjdk1hdCggMipwb2ludF9jb3VudCwgMiwgQ1ZfNjRGQzEsIF9kZXJpdl9wb2ludHNfZm9jYWwgKTsKICAgIEN2TWF0IGRwZGMgPSBjdk1hdCggMipwb2ludF9jb3VudCwgMiwgQ1ZfNjRGQzEsIF9kZXJpdl9wb2ludHNfcHJpbmNpcGFsX3BvaW50ICk7CiAgICBDdk1hdCBkcGRrID0gY3ZNYXQoIDIqcG9pbnRfY291bnQsIDQsIENWXzY0RkMxLCBfZGVyaXZfcG9pbnRzX2Rpc3RvcnRpb25fY29lZmZzICk7CgogICAgYVswXSA9IGZvY2FsX2xlbmd0aFswXTsgYVs0XSA9IGZvY2FsX2xlbmd0aFsxXTsKICAgIGFbMl0gPSBwcmluY2lwYWxfcG9pbnQueDsgYVs1XSA9IHByaW5jaXBhbF9wb2ludC55OwogICAgYVsxXSA9IGFbM10gPSBhWzZdID0gYVs3XSA9IDAuOwogICAgYVs4XSA9IDEuOwoKICAgIGN2UHJvamVjdFBvaW50czIoICZvYmplY3RfcG9pbnRzLCAmcm90YXRpb25fdmVjdG9yLCAmdHJhbnNsYXRpb25fdmVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgJmNhbWVyYV9tYXRyaXgsICZkaXN0X2NvZWZmcywgJmltYWdlX3BvaW50cywKICAgICAgICAgICAgICAgICAgICAgICZkcGRyLCAmZHBkdCwgJmRwZGYsICZkcGRjLCAmZHBkaywgMCApOwp9CgoKLyogU2ltcGxlciB2ZXJzaW9uIG9mIHRoZSBwcmV2aW91cyBmdW5jdGlvbiAqLwpDVl9JTkxJTkUgdm9pZCAgY3ZQcm9qZWN0UG9pbnRzU2ltcGxlKCBpbnQgcG9pbnRfY291bnQsIEN2UG9pbnQzRDY0ZiogX29iamVjdF9wb2ludHMsCiAgICBkb3VibGUqIF9yb3RhdGlvbl9tYXRyaXgsIGRvdWJsZSogIF90cmFuc2xhdGlvbl92ZWN0b3IsCiAgICBkb3VibGUqIF9jYW1lcmFfbWF0cml4LCBkb3VibGUqIF9kaXN0b3J0aW9uLCBDdlBvaW50MkQ2NGYqIF9pbWFnZV9wb2ludHMgKQp7CiAgICBDdk1hdCBvYmplY3RfcG9pbnRzID0gY3ZNYXQoIHBvaW50X2NvdW50LCAxLCBDVl82NEZDMywgX29iamVjdF9wb2ludHMgKTsKICAgIEN2TWF0IGltYWdlX3BvaW50cyA9IGN2TWF0KCBwb2ludF9jb3VudCwgMSwgQ1ZfNjRGQzIsIF9pbWFnZV9wb2ludHMgKTsKICAgIEN2TWF0IHJvdGF0aW9uX21hdHJpeCA9IGN2TWF0KCAzLCAzLCBDVl82NEZDMSwgX3JvdGF0aW9uX21hdHJpeCApOwogICAgQ3ZNYXQgdHJhbnNsYXRpb25fdmVjdG9yID0gY3ZNYXQoIDMsIDEsIENWXzY0RkMxLCBfdHJhbnNsYXRpb25fdmVjdG9yICk7CiAgICBDdk1hdCBjYW1lcmFfbWF0cml4ID0gY3ZNYXQoIDMsIDMsIENWXzY0RkMxLCBfY2FtZXJhX21hdHJpeCApOwogICAgQ3ZNYXQgZGlzdF9jb2VmZnMgPSBjdk1hdCggNCwgMSwgQ1ZfNjRGQzEsIF9kaXN0b3J0aW9uICk7CgogICAgY3ZQcm9qZWN0UG9pbnRzMiggJm9iamVjdF9wb2ludHMsICZyb3RhdGlvbl9tYXRyaXgsICZ0cmFuc2xhdGlvbl92ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhX21hdHJpeCwgJmRpc3RfY29lZmZzLCAmaW1hZ2VfcG9pbnRzLAogICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCApOwp9CgoKQ1ZfSU5MSU5FIHZvaWQgY3ZVbkRpc3RvcnRPbmNlKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBpbnRyaW5zaWNfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkaXN0b3J0aW9uX2NvZWZmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKGludGVycG9sYXRlKSApCnsKICAgIEN2TWF0IF9hID0gY3ZNYXQoIDMsIDMsIENWXzMyRiwgKHZvaWQqKWludHJpbnNpY19tYXRyaXggKTsKICAgIEN2TWF0IF9rID0gY3ZNYXQoIDQsIDEsIENWXzMyRiwgKHZvaWQqKWRpc3RvcnRpb25fY29lZmZzICk7CiAgICBjdlVuZGlzdG9ydDIoIHNyYywgZHN0LCAmX2EsICZfayApOwp9CgoKLyogdGhlIHR3byBmdW5jdGlvbnMgYmVsb3cgaGF2ZSBxdWl0ZSBoYWNrZXJpc2ggaW1wbGVtZW50YXRpb25zLCB1c2Ugd2l0aCBjYXJlCiAgIChvciwgd2hpY2ggaXMgYmV0dGVyLCBzd2l0Y2ggdG8gY3ZVbmRpc3RvcnRJbml0TWFwIGFuZCBjdlJlbWFwIGluc3RlYWQgKi8KQ1ZfSU5MSU5FIHZvaWQgY3ZVbkRpc3RvcnRJbml0KCBjb25zdCBDdkFyciogQ1ZfVU5SRUZFUkVOQ0VEKHNyYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIHVuZGlzdG9ydGlvbl9tYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIEEsIGNvbnN0IGZsb2F0KiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDVl9VTlJFRkVSRU5DRUQoaW50ZXJwb2xhdGUpICkKewogICAgdW5pb24geyB1Y2hhciogcHRyOyBmbG9hdCogZmw7IH0gZGF0YTsKICAgIEN2U2l6ZSBzejsKICAgIGN2R2V0UmF3RGF0YSggdW5kaXN0b3J0aW9uX21hcCwgJmRhdGEucHRyLCAwLCAmc3ogKTsKICAgIGFzc2VydCggc3oud2lkdGggPj0gOCApOwogICAgLyoganVzdCBzYXZlIHRoZSBpbnRyaW5zaWMgcGFyYW1ldGVycyB0byB0aGUgbWFwICovCiAgICBkYXRhLmZsWzBdID0gQVswXTsgZGF0YS5mbFsxXSA9IEFbNF07CiAgICBkYXRhLmZsWzJdID0gQVsyXTsgZGF0YS5mbFszXSA9IEFbNV07CiAgICBkYXRhLmZsWzRdID0ga1swXTsgZGF0YS5mbFs1XSA9IGtbMV07CiAgICBkYXRhLmZsWzZdID0ga1syXTsgZGF0YS5mbFs3XSA9IGtbM107Cn0KCkNWX0lOTElORSB2b2lkICBjdlVuRGlzdG9ydCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogdW5kaXN0b3J0aW9uX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKGludGVycG9sYXRlKSApCnsKICAgIHVuaW9uIHsgdWNoYXIqIHB0cjsgZmxvYXQqIGZsOyB9IGRhdGE7CiAgICBmbG9hdCBhW10gPSB7MCwwLDAsMCwwLDAsMCwwLDF9OwogICAgQ3ZTaXplIHN6OwogICAgY3ZHZXRSYXdEYXRhKCB1bmRpc3RvcnRpb25fbWFwLCAmZGF0YS5wdHIsIDAsICZzeiApOwogICAgYXNzZXJ0KCBzei53aWR0aCA+PSA4ICk7CiAgICBhWzBdID0gZGF0YS5mbFswXTsgYVs0XSA9IGRhdGEuZmxbMV07CiAgICBhWzJdID0gZGF0YS5mbFsyXTsgYVs1XSA9IGRhdGEuZmxbM107CiAgICBjdlVuRGlzdG9ydE9uY2UoIHNyYywgZHN0LCBhLCBkYXRhLmZsICsgNCwgMSApOwp9CgoKQ1ZfSU5MSU5FICBmbG9hdCAgY3ZDYWxjRU1EKCBjb25zdCBmbG9hdCogc2lnbmF0dXJlMSwgaW50IHNpemUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzaWduYXR1cmUyLCBpbnQgc2l6ZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpbXMsIGludCBkaXN0X3R5cGUgQ1ZfREVGQVVMVChDVl9ESVNUX0wyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkRpc3RhbmNlRnVuY3Rpb24gZGlzdF9mdW5jIENWX0RFRkFVTFQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxvd2VyX2JvdW5kIENWX0RFRkFVTFQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9wYXJhbSBDVl9ERUZBVUxUKDApKQp7CiAgICBDdk1hdCBzaWduMSA9IGN2TWF0KCBzaXplMSwgZGltcyArIDEsIENWXzMyRkMxLCAodm9pZCopc2lnbmF0dXJlMSApOwogICAgQ3ZNYXQgc2lnbjIgPSBjdk1hdCggc2l6ZTIsIGRpbXMgKyAxLCBDVl8zMkZDMSwgKHZvaWQqKXNpZ25hdHVyZTIgKTsKCiAgICByZXR1cm4gY3ZDYWxjRU1EMiggJnNpZ24xLCAmc2lnbjIsIGRpc3RfdHlwZSwgZGlzdF9mdW5jLCAwLCAwLCBsb3dlcl9ib3VuZCwgdXNlcl9wYXJhbSApOwp9CgoKQ1ZfSU5MSU5FICB2b2lkICBjdktNZWFucyggaW50IG51bV9jbHVzdGVycywgZmxvYXQqKiBzYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3NhbXBsZXMsIGludCB2ZWNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZUZXJtQ3JpdGVyaWEgdGVybWNyaXQsIGludCogY2x1c3Rlcl9pZHggKQp7CiAgICBDdk1hdCogc2FtcGxlc19tYXQgPSBjdkNyZWF0ZU1hdCggbnVtX3NhbXBsZXMsIHZlY19zaXplLCBDVl8zMkZDMSApOwogICAgQ3ZNYXQgY2x1c3Rlcl9pZHhfbWF0ID0gY3ZNYXQoIG51bV9zYW1wbGVzLCAxLCBDVl8zMlNDMSwgY2x1c3Rlcl9pZHggKTsKICAgIGludCBpOwogICAgZm9yKCBpID0gMDsgaSA8IG51bV9zYW1wbGVzOyBpKysgKQogICAgICAgIG1lbWNweSggc2FtcGxlc19tYXQtPmRhdGEuZmwgKyBpKnZlY19zaXplLCBzYW1wbGVzW2ldLCB2ZWNfc2l6ZSpzaXplb2YoZmxvYXQpKTsKICAgIGN2S01lYW5zMiggc2FtcGxlc19tYXQsIG51bV9jbHVzdGVycywgJmNsdXN0ZXJfaWR4X21hdCwgdGVybWNyaXQgKTsKICAgIGN2UmVsZWFzZU1hdCggJnNhbXBsZXNfbWF0ICk7Cn0KCgpDVl9JTkxJTkUgdm9pZCAgY3ZTdGFydFNjYW5HcmFwaCggQ3ZHcmFwaCogZ3JhcGgsIEN2R3JhcGhTY2FubmVyKiBzY2FubmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogdnR4IENWX0RFRkFVTFQoTlVMTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFzayBDVl9ERUZBVUxUKENWX0dSQVBIX0FMTF9JVEVNUykpCnsKICAgIEN2R3JhcGhTY2FubmVyKiB0ZW1wX3NjYW5uZXI7CgogICAgaWYoICFzY2FubmVyICkKICAgICAgICBjdkVycm9yKCBDVl9TdHNOdWxsUHRyLCAiY3ZTdGFydFNjYW5HcmFwaCIsICJOdWxsIHNjYW5uZXIgcG9pbnRlciIsICJjdmNvbXBhdC5oIiwgMCApOwoKICAgIHRlbXBfc2Nhbm5lciA9IGN2Q3JlYXRlR3JhcGhTY2FubmVyKCBncmFwaCwgdnR4LCBtYXNrICk7CiAgICAqc2Nhbm5lciA9ICp0ZW1wX3NjYW5uZXI7CiAgICBjdkZyZWUoICZ0ZW1wX3NjYW5uZXIgKTsKfQoKCkNWX0lOTElORSAgdm9pZCAgY3ZFbmRTY2FuR3JhcGgoIEN2R3JhcGhTY2FubmVyKiBzY2FubmVyICkKewogICAgaWYoICFzY2FubmVyICkKICAgICAgICBjdkVycm9yKCBDVl9TdHNOdWxsUHRyLCAiY3ZFbmRTY2FuR3JhcGgiLCAiTnVsbCBzY2FubmVyIHBvaW50ZXIiLCAiY3Zjb21wYXQuaCIsIDAgKTsKCiAgICBpZiggc2Nhbm5lci0+c3RhY2sgKQogICAgewogICAgICAgIEN2R3JhcGhTY2FubmVyKiB0ZW1wX3NjYW5uZXIgPSAoQ3ZHcmFwaFNjYW5uZXIqKWN2QWxsb2MoIHNpemVvZigqdGVtcF9zY2FubmVyKSApOwogICAgICAgICp0ZW1wX3NjYW5uZXIgPSAqc2Nhbm5lcjsKICAgICAgICBjdlJlbGVhc2VHcmFwaFNjYW5uZXIoICZ0ZW1wX3NjYW5uZXIgKTsKICAgICAgICBtZW1zZXQoIHNjYW5uZXIsIDAsIHNpemVvZigqc2Nhbm5lcikgKTsKICAgIH0KfQoKCiNkZWZpbmUgY3ZLYWxtYW5VcGRhdGVCeVRpbWUgIGN2S2FsbWFuUHJlZGljdAojZGVmaW5lIGN2S2FsbWFuVXBkYXRlQnlNZWFzdXJlbWVudCBjdkthbG1hbkNvcnJlY3QKCi8qIG9sZCBkcmF3aW5nIGZ1bmN0aW9ucyAqLwpDVl9JTkxJTkUgIHZvaWQgIGN2TGluZUFBKCBDdkFyciogaW1nLCBDdlBvaW50IHB0MSwgQ3ZQb2ludCBwdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb2xvciwgaW50IHNjYWxlIENWX0RFRkFVTFQoMCkpCnsKICAgIGN2TGluZSggaW1nLCBwdDEsIHB0MiwgY3ZDb2xvclRvU2NhbGFyKGNvbG9yLCBjdkdldEVsZW1UeXBlKGltZykpLCAxLCBDVl9BQSwgc2NhbGUgKTsKfQoKQ1ZfSU5MSU5FICB2b2lkICBjdkNpcmNsZUFBKCBDdkFyciogaW1nLCBDdlBvaW50IGNlbnRlciwgaW50IHJhZGl1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29sb3IsIGludCBzY2FsZSBDVl9ERUZBVUxUKDApICkKewogICAgY3ZDaXJjbGUoIGltZywgY2VudGVyLCByYWRpdXMsIGN2Q29sb3JUb1NjYWxhcihjb2xvciwgY3ZHZXRFbGVtVHlwZShpbWcpKSwgMSwgQ1ZfQUEsIHNjYWxlICk7Cn0KCkNWX0lOTElORSAgdm9pZCAgY3ZFbGxpcHNlQUEoIEN2QXJyKiBpbWcsIEN2UG9pbnQgY2VudGVyLCBDdlNpemUgYXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFuZ2xlLCBkb3VibGUgc3RhcnRfYW5nbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlbmRfYW5nbGUsIGRvdWJsZSBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjYWxlIENWX0RFRkFVTFQoMCkgKQp7CiAgICBjdkVsbGlwc2UoIGltZywgY2VudGVyLCBheGVzLCBhbmdsZSwgc3RhcnRfYW5nbGUsIGVuZF9hbmdsZSwKICAgICAgICAgICAgICAgY3ZDb2xvclRvU2NhbGFyKGNvbG9yLCBjdkdldEVsZW1UeXBlKGltZykpLCAxLCBDVl9BQSwgc2NhbGUgKTsKfQoKQ1ZfSU5MSU5FICB2b2lkICBjdlBvbHlMaW5lQUEoIEN2QXJyKiBpbWcsIEN2UG9pbnQqKiBwdHMsIGludCogbnB0cywgaW50IGNvbnRvdXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2Nsb3NlZCwgZG91YmxlIGNvbG9yLCBpbnQgc2NhbGUgQ1ZfREVGQVVMVCgwKSApCnsKICAgIGN2UG9seUxpbmUoIGltZywgcHRzLCBucHRzLCBjb250b3VycywgaXNfY2xvc2VkLAogICAgICAgICAgICAgICAgY3ZDb2xvclRvU2NhbGFyKGNvbG9yLCBjdkdldEVsZW1UeXBlKGltZykpLAogICAgICAgICAgICAgICAgMSwgQ1ZfQUEsIHNjYWxlICk7Cn0KCgojZGVmaW5lIGN2TWFrZTJEUG9pbnRzIGN2Q29udmVydFBvaW50c0hvbW9nZW5lb3VzCiNkZWZpbmUgY3ZNYWtlM0RQb2ludHMgY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMKCiNkZWZpbmUgY3ZXYXJwUGVyc3BlY3RpdmVRTWF0cml4IGN2R2V0UGVyc3BlY3RpdmVUcmFuc2Zvcm0KCiNkZWZpbmUgY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmlvdXMgY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbCBBY2Nlc3MgTWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp0eXBlZGVmIHN0cnVjdCBfQ3ZQaXhlbFBvc2l0aW9uOHUKewogICAgdWNoYXIqICBjdXJybGluZTsgICAgICAvKiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBwaXhlbCBsaW5lICAgKi8KICAgIHVjaGFyKiAgdG9wbGluZTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIHRvcCBwaXhlbCBsaW5lICAgICAgICovCiAgICB1Y2hhciogIGJvdHRvbWxpbmU7ICAgIC8qIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBsaW5lICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGljaCBpcyBiZWxvdyB0aGUgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGludCAgICAgeDsgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCB4IGNvb3JkaW5hdGUgKCBpbiBwaXhlbHMgKSAgICAgICAgICAgICAgICovCiAgICBpbnQgICAgIHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qIHdpZHRoIG9mIHRoZSBpbWFnZSAgKCBpbiBwaXhlbHMgKSAgICAgICAgICAgICAgICAqLwogICAgaW50ICAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgICAvKiBoZWlnaHQgb2YgdGhlIGltYWdlICAoIGluIHBpeGVscyApICAgICAgICAgICAgICAgKi8KICAgIGludCAgICAgc3RlcDsgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmV0d2VlbiBsaW5lcyAoIGluIGVsZW1lbnRzIG9mIHNpbmdsZSAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBsYW5lICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaW50ICAgICBzdGVwX2FyclszXTsgICAgICAgICAgICAvKiBhcnJheTogKCAwLCAtc3RlcCwgc3RlcCApLiBJdCBpcyB1c2VkIGZvciAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmVydGljYWwgbW92aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCn0gQ3ZQaXhlbFBvc2l0aW9uOHU7CgovKiB0aGlzIHN0cnVjdHVyZSBkaWZmZXJzIGZyb20gdGhlIGFib3ZlIG9ubHkgaW4gZGF0YSB0eXBlICovCnR5cGVkZWYgc3RydWN0IF9DdlBpeGVsUG9zaXRpb244cwp7CiAgICBzY2hhciogIGN1cnJsaW5lOwogICAgc2NoYXIqICB0b3BsaW5lOwogICAgc2NoYXIqICBib3R0b21saW5lOwogICAgaW50ICAgICB4OwogICAgaW50ICAgICB3aWR0aDsKICAgIGludCAgICAgaGVpZ2h0OwogICAgaW50ICAgICBzdGVwOwogICAgaW50ICAgICBzdGVwX2FyclszXTsKfSBDdlBpeGVsUG9zaXRpb244czsKCi8qIHRoaXMgc3RydWN0dXJlIGRpZmZlcnMgZnJvbSB0aGUgQ3ZQaXhlbFBvc2l0aW9uOHUgb25seSBpbiBkYXRhIHR5cGUgKi8KdHlwZWRlZiBzdHJ1Y3QgX0N2UGl4ZWxQb3NpdGlvbjMyZgp7CiAgICBmbG9hdCogIGN1cnJsaW5lOwogICAgZmxvYXQqICB0b3BsaW5lOwogICAgZmxvYXQqICBib3R0b21saW5lOwogICAgaW50ICAgICB4OwogICAgaW50ICAgICB3aWR0aDsKICAgIGludCAgICAgaGVpZ2h0OwogICAgaW50ICAgICBzdGVwOwogICAgaW50ICAgICBzdGVwX2FyclszXTsKfSBDdlBpeGVsUG9zaXRpb24zMmY7CgoKLyogSW5pdGlhbGl6ZSBvbmUgb2YgdGhlIEN2UGl4ZWxQb3NpdGlvbiBzdHJ1Y3R1cmVzLiAgICovCi8qICBwb3MgICAgLSBpbml0aWFsaXplZCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAqLwovKiAgb3JpZ2luIC0gcG9pbnRlciB0byB0aGUgbGVmdC10b3AgY29ybmVyIG9mIHRoZSBST0kgKi8KLyogIHN0ZXAgICAtIHdpZHRoIG9mIHRoZSB3aG9sZSBpbWFnZSBpbiBieXRlcyAgICAgICAgICovCi8qICByb2kgICAgLSB3aWR0aCAmIGhlaWdodCBvZiB0aGUgUk9JICAgICAgICAgICAgICAgICAqLwovKiAgeCwgeSAgIC0gaW5pdGlhbCBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBDVl9JTklUX1BJWEVMX1BPUyhwb3MsIG9yaWdpbiwgX3N0ZXAsIHJvaSwgX3gsIF95LCBvcmllbnRhdGlvbikgICAgXAogICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChwb3MpLnN0ZXAgPSAoX3N0ZXApL3NpemVvZigocG9zKS5jdXJybGluZVswXSkgKiAob3JpZW50YXRpb24gPyAtMSA6IDEpLCBcCiAgICAocG9zKS53aWR0aCA9IChyb2kpLndpZHRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgKHBvcykuaGVpZ2h0ID0gKHJvaSkuaGVpZ2h0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChwb3MpLmJvdHRvbWxpbmUgPSAob3JpZ2luKSArIChwb3MpLnN0ZXAqKHBvcykuaGVpZ2h0LCAgICAgICAgICAgICAgICAgICBcCiAgICAocG9zKS50b3BsaW5lID0gKG9yaWdpbikgLSAocG9zKS5zdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgKHBvcykuc3RlcF9hcnJbMF0gPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChwb3MpLnN0ZXBfYXJyWzFdID0gLShwb3MpLnN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAocG9zKS5zdGVwX2FyclsyXSA9IChwb3MpLnN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgKHBvcykueCA9IChfeCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChwb3MpLmN1cnJsaW5lID0gKG9yaWdpbikgKyAocG9zKS5zdGVwKihfeSkgKQoKCi8qIE1vdmUgdG8gc3BlY2lmaWVkIHBvaW50ICggYWJzb2x1dGUgc2hpZnQgKSAqLwovKiAgcG9zICAgIC0gcG9zaXRpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgKi8KLyogIHgsIHkgICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBuZXcgcG9zaXRpb24gICovCi8qICBjcyAgICAgLSBudW1iZXIgb2YgdGhlIGltYWdlIGNoYW5uZWxzICAgICAqLwojZGVmaW5lIENWX01PVkVfVE8oIHBvcywgX3gsIF95LCBjcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAooKHBvcykuY3VycmxpbmUgPSAoX3kpID49IDAgJiYgKF95KSA8IChwb3MpLmhlaWdodCA/IChwb3MpLnRvcGxpbmUgKyAoKF95KSsxKSoocG9zKS5zdGVwIDogMCwgXAogKHBvcykueCA9IChfeCkgPj0gMCAmJiAoX3gpIDwgKHBvcykud2lkdGggPyAoX3gpIDogMCwgKHBvcykuY3VycmxpbmUgKyAoX3gpICogKGNzKSApCgovKiBHZXQgY3VycmVudCBjb29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgKi8KLyogIHBvcyAgICAtIHBvc2l0aW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCi8qICB4LCB5ICAgLSBjb29yZGluYXRlcyBvZiB0aGUgbmV3IHBvc2l0aW9uICAqLwovKiAgY3MgICAgIC0gbnVtYmVyIG9mIHRoZSBpbWFnZSBjaGFubmVscyAgICAgKi8KI2RlZmluZSBDVl9HRVRfQ1VSUkVOVCggcG9zLCBjcyApICAoKHBvcykuY3VycmxpbmUgKyAocG9zKS54ICogKGNzKSkKCi8qIE1vdmUgYnkgb25lIHBpeGVsIHJlbGF0aXZlbHkgdG8gY3VycmVudCBwb3NpdGlvbiAqLwovKiAgcG9zICAgIC0gcG9zaXRpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KLyogIGNzICAgICAtIG51bWJlciBvZiB0aGUgaW1hZ2UgY2hhbm5lbHMgICAgICAgICAgICovCgovKiBsZWZ0ICovCiNkZWZpbmUgQ1ZfTU9WRV9MRUZUKCBwb3MsIGNzICkgXAogKCAtLShwb3MpLnggPj0gMCA/IChwb3MpLmN1cnJsaW5lICsgKHBvcykueCooY3MpIDogMCApCgovKiByaWdodCAqLwojZGVmaW5lIENWX01PVkVfUklHSFQoIHBvcywgY3MgKSBcCiAoICsrKHBvcykueCA8IChwb3MpLndpZHRoID8gKHBvcykuY3VycmxpbmUgKyAocG9zKS54KihjcykgOiAwICkKCi8qIHVwICovCiNkZWZpbmUgQ1ZfTU9WRV9VUCggcG9zLCBjcyApIFwKICgoKHBvcykuY3VycmxpbmUgLT0gKHBvcykuc3RlcCkgIT0gKHBvcykudG9wbGluZSA/IChwb3MpLmN1cnJsaW5lICsgKHBvcykueCooY3MpIDogMCApCgovKiBkb3duICovCiNkZWZpbmUgQ1ZfTU9WRV9ET1dOKCBwb3MsIGNzICkgXAogKCgocG9zKS5jdXJybGluZSArPSAocG9zKS5zdGVwKSAhPSAocG9zKS5ib3R0b21saW5lID8gKHBvcykuY3VycmxpbmUgKyAocG9zKS54KihjcykgOiAwICkKCi8qIGxlZnQgdXAgKi8KI2RlZmluZSBDVl9NT1ZFX0xVKCBwb3MsIGNzICkgKCBDVl9NT1ZFX0xFRlQocG9zLCBjcyksIENWX01PVkVfVVAocG9zLCBjcykpCgovKiByaWdodCB1cCAqLwojZGVmaW5lIENWX01PVkVfUlUoIHBvcywgY3MgKSAoIENWX01PVkVfUklHSFQocG9zLCBjcyksIENWX01PVkVfVVAocG9zLCBjcykpCgovKiBsZWZ0IGRvd24gKi8KI2RlZmluZSBDVl9NT1ZFX0xEKCBwb3MsIGNzICkgKCBDVl9NT1ZFX0xFRlQocG9zLCBjcyksIENWX01PVkVfRE9XTihwb3MsIGNzKSkKCi8qIHJpZ2h0IGRvd24gKi8KI2RlZmluZSBDVl9NT1ZFX1JEKCBwb3MsIGNzICkgKCBDVl9NT1ZFX1JJR0hUKHBvcywgY3MpLCBDVl9NT1ZFX0RPV04ocG9zLCBjcykpCgoKCi8qIE1vdmUgYnkgb25lIHBpeGVsIHJlbGF0aXZlbHkgdG8gY3VycmVudCBwb3NpdGlvbiB3aXRoIHdyYXBwaW5nIHdoZW4gdGhlIHBvc2l0aW9uICAgICAqLwovKiBhY2hpZXZlcyBpbWFnZSBib3VuZGFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHBvcyAgICAtIHBvc2l0aW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBjcyAgICAgLSBudW1iZXIgb2YgdGhlIGltYWdlIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKLyogbGVmdCAqLwojZGVmaW5lIENWX01PVkVfTEVGVF9XUkFQKCBwb3MsIGNzICkgXAogKChwb3MpLmN1cnJsaW5lICsgKCAtLShwb3MpLnggPj0gMCA/IChwb3MpLnggOiAoKHBvcykueCA9IChwb3MpLndpZHRoLTEpKSooY3MpKQoKLyogcmlnaHQgKi8KI2RlZmluZSBDVl9NT1ZFX1JJR0hUX1dSQVAoIHBvcywgY3MgKSBcCiAoKHBvcykuY3VycmxpbmUgKyAoICsrKHBvcykueCA8IChwb3MpLndpZHRoID8gKHBvcykueCA6ICgocG9zKS54ID0gMCkpKihjcykgKQoKLyogdXAgKi8KI2RlZmluZSBDVl9NT1ZFX1VQX1dSQVAoIHBvcywgY3MgKSBcCiAgICAoKCgocG9zKS5jdXJybGluZSAtPSAocG9zKS5zdGVwKSAhPSAocG9zKS50b3BsaW5lID8gXAogICAgKHBvcykuY3VycmxpbmUgOiAoKHBvcykuY3VycmxpbmUgPSAocG9zKS5ib3R0b21saW5lIC0gKHBvcykuc3RlcCkpICsgKHBvcykueCooY3MpICkKCi8qIGRvd24gKi8KI2RlZmluZSBDVl9NT1ZFX0RPV05fV1JBUCggcG9zLCBjcyApIFwKICAgICgoKChwb3MpLmN1cnJsaW5lICs9IChwb3MpLnN0ZXApICE9IChwb3MpLmJvdHRvbWxpbmUgPyBcCiAgICAocG9zKS5jdXJybGluZSA6ICgocG9zKS5jdXJybGluZSA9IChwb3MpLnRvcGxpbmUgKyAocG9zKS5zdGVwKSkgKyAocG9zKS54KihjcykgKQoKLyogbGVmdCB1cCAqLwojZGVmaW5lIENWX01PVkVfTFVfV1JBUCggcG9zLCBjcyApICggQ1ZfTU9WRV9MRUZUX1dSQVAocG9zLCBjcyksIENWX01PVkVfVVBfV1JBUChwb3MsIGNzKSkKLyogcmlnaHQgdXAgKi8KI2RlZmluZSBDVl9NT1ZFX1JVX1dSQVAoIHBvcywgY3MgKSAoIENWX01PVkVfUklHSFRfV1JBUChwb3MsIGNzKSwgQ1ZfTU9WRV9VUF9XUkFQKHBvcywgY3MpKQovKiBsZWZ0IGRvd24gKi8KI2RlZmluZSBDVl9NT1ZFX0xEX1dSQVAoIHBvcywgY3MgKSAoIENWX01PVkVfTEVGVF9XUkFQKHBvcywgY3MpLCBDVl9NT1ZFX0RPV05fV1JBUChwb3MsIGNzKSkKLyogcmlnaHQgZG93biAqLwojZGVmaW5lIENWX01PVkVfUkRfV1JBUCggcG9zLCBjcyApICggQ1ZfTU9WRV9SSUdIVF9XUkFQKHBvcywgY3MpLCBDVl9NT1ZFX0RPV05fV1JBUChwb3MsIGNzKSkKCi8qIE51bWVyaWMgY29uc3RhbnRzIHdoaWNoIHVzZWQgZm9yIG1vdmluZyBpbiBhcmJpdHJhcnkgZGlyZWN0aW9uICAqLwojZGVmaW5lIENWX1NISUZUX05PTkUgICAyCiNkZWZpbmUgQ1ZfU0hJRlRfTEVGVCAgIDEKI2RlZmluZSBDVl9TSElGVF9SSUdIVCAgMwojZGVmaW5lIENWX1NISUZUX1VQICAgICA2CiNkZWZpbmUgQ1ZfU0hJRlRfRE9XTiAgMTAKI2RlZmluZSBDVl9TSElGVF9MVSAgICAgNQojZGVmaW5lIENWX1NISUZUX1JVICAgICA3CiNkZWZpbmUgQ1ZfU0hJRlRfTEQgICAgIDkKI2RlZmluZSBDVl9TSElGVF9SRCAgICAxMQoKLyogTW92ZSBieSBvbmUgcGl4ZWwgaW4gc3BlY2lmaWVkIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgcG9zICAgIC0gcG9zaXRpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBzaGlmdCAgLSBkaXJlY3Rpb24gKCBpdCdzIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBDVl9TSElGVF+FIGNvbnN0YW50cyApICovCi8qICBjcyAgICAgLSBudW1iZXIgb2YgdGhlIGltYWdlIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBDVl9NT1ZFX1BBUkFNKCBwb3MsIHNoaWZ0LCBjcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgKCAocG9zKS5jdXJybGluZSArPSAocG9zKS5zdGVwX2Fyclsoc2hpZnQpPj4yXSwgKHBvcykueCArPSAoKHNoaWZ0KSYzKS0yLCAgICAgICBcCiAgICAoKHBvcykuY3VycmxpbmUgIT0gKHBvcykudG9wbGluZSAmJiAocG9zKS5jdXJybGluZSAhPSAocG9zKS5ib3R0b21saW5lICYmICAgICAgIFwKICAgIChwb3MpLnggPj0gMCAmJiAocG9zKS54IDwgKHBvcykud2lkdGgpID8gKHBvcykuY3VycmxpbmUgKyAocG9zKS54KihjcykgOiAwICkKCi8qIE1vdmUgYnkgb25lIHBpeGVsIGluIHNwZWNpZmllZCBkaXJlY3Rpb24gd2l0aCB3cmFwcGluZyB3aGVuIHRoZSAgICAgICAgICAgICAgICovCi8qIHBvc2l0aW9uIGFjaGlldmVzIGltYWdlIGJvdW5kYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBwb3MgICAgLSBwb3NpdGlvbiBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBzaGlmdCAgLSBkaXJlY3Rpb24gKCBpdCdzIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBDVl9TSElGVF+FIGNvbnN0YW50cyApICAqLwovKiAgY3MgICAgIC0gbnVtYmVyIG9mIHRoZSBpbWFnZSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIENWX01PVkVfUEFSQU1fV1JBUCggcG9zLCBzaGlmdCwgY3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAoIChwb3MpLmN1cnJsaW5lICs9IChwb3MpLnN0ZXBfYXJyWyhzaGlmdCk+PjJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChwb3MpLmN1cnJsaW5lID0gKChwb3MpLmN1cnJsaW5lID09IChwb3MpLnRvcGxpbmUgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgKHBvcykuYm90dG9tbGluZSAtIChwb3MpLnN0ZXAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAocG9zKS5jdXJybGluZSA9PSAocG9zKS5ib3R0b21saW5lID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChwb3MpLnRvcGxpbmUgKyAocG9zKS5zdGVwIDogKHBvcykuY3VycmxpbmUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAocG9zKS54ICs9ICgoc2hpZnQpJjMpLTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIChwb3MpLnggPSAoKHBvcykueCA8IDAgPyAocG9zKS53aWR0aC0xIDogKHBvcykueCA+PSAocG9zKS53aWR0aCA/IDAgOiAocG9zKS54KSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAocG9zKS5jdXJybGluZSArIChwb3MpLngqKGNzKSApCgojZW5kaWYvKl9DVkNPTVBBVF9IXyovCg==