Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gT3V0cHV0RGV2LmgKLy8KLy8gQ29weXJpZ2h0IDE5OTYtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA1IEpvbmF0aGFuIEJsYW5kZm9yZCA8anJiQHJlZGhhdC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwNiBUaG9ya2lsZCBTdHJheSA8dGhvcmtpbGRAaWZpLnVpby5ubz4KLy8gQ29weXJpZ2h0IChDKSAyMDA3IEplZmYgTXVpemVsYWFyIDxqZWZmQGluZmlkaWdtLm5ldD4KLy8gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDExLCAyMDE3IEFkcmlhbiBKb2huc29uIDxham9obnNvbkByZWRuZW9uLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTMsIDIwMTUgVGhvbWFzIEZyZWl0YWcgPFRob21hcy5GcmVpdGFnQGFsZmEuZGU+Ci8vIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMSBDYXJsb3MgR2FyY2lhIENhbXBvcyA8Y2FybG9zZ2NAZ25vbWUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTIsIDIwMTMsIDIwMTggQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMCBDaHJpc3RpYW4gRmV1ZXJz5G5nZXIgPGNmZXVlcnNhZW5nZXJAZ29vZ2xlbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAxMiBGYWJpbyBEJ1Vyc28gPGZhYmlvZHVyc29AaG90bWFpbC5pdD4KLy8gQ29weXJpZ2h0IChDKSAyMDEyIFdpbGxpYW0gQmFkZXIgPHdpbGxpYW1iYWRlckBob3RtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDE3LCAyMDE4IE9saXZlciBTYW5kZXIgPG9saXZlci5zYW5kZXJAdHUtZHJlc2Rlbi5kZT4KLy8gQ29weXJpZ2h0IChDKSAyMDE4IEtsYXLkbHZkYWxlbnMgRGF0YWtvbnN1bHQgQUIsIGEgS0RBQiBHcm91cCBjb21wYW55LCA8aW5mb0BrZGFiLmNvbT4uIFdvcmsgc3BvbnNvcmVkIGJ5IHRoZSBMaU11eCBwcm9qZWN0IG9mIHRoZSBjaXR5IG9mIE11bmljaAovLyBDb3B5cmlnaHQgKEMpIDIwMTggQWRhbSBSZWljaG9sZCA8YWRhbS5yZWljaG9sZEB0LW9ubGluZS5kZT4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBPVVRQVVRERVZfSAojZGVmaW5lIE9VVFBVVERFVl9ICgojaW5jbHVkZSAicG9wcGxlci1jb25maWcuaCIKI2luY2x1ZGUgImdvby9ndHlwZXMuaCIKI2luY2x1ZGUgIkNoYXJUeXBlcy5oIgojaW5jbHVkZSAiT2JqZWN0LmgiCiNpbmNsdWRlICJQb3BwbGVyQ2FjaGUuaCIKI2luY2x1ZGUgIlByb2ZpbGVEYXRhLmgiCiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgQW5ub3Q7CmNsYXNzIERpY3Q7CmNsYXNzIEdvb1N0cmluZzsKY2xhc3MgR2Z4U3RhdGU7CmNsYXNzIEdmeDsKc3RydWN0IEdmeENvbG9yOwpjbGFzcyBHZnhDb2xvclNwYWNlOwojaWZkZWYgVVNFX0NNUwpjbGFzcyBHZnhJQ0NCYXNlZENvbG9yU3BhY2U7CiNlbmRpZgpjbGFzcyBHZnhJbWFnZUNvbG9yTWFwOwpjbGFzcyBHZnhGdW5jdGlvblNoYWRpbmc7CmNsYXNzIEdmeEF4aWFsU2hhZGluZzsKY2xhc3MgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZzsKY2xhc3MgR2Z4UGF0Y2hNZXNoU2hhZGluZzsKY2xhc3MgR2Z4UmFkaWFsU2hhZGluZzsKY2xhc3MgR2Z4R291cmF1ZFRyaWFuZ2xlU2hhZGluZzsKY2xhc3MgR2Z4UGF0Y2hNZXNoU2hhZGluZzsKY2xhc3MgU3RyZWFtOwpjbGFzcyBMaW5rczsKY2xhc3MgQW5ub3RMaW5rOwpjbGFzcyBDYXRhbG9nOwpjbGFzcyBQYWdlOwpjbGFzcyBGdW5jdGlvbjsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE91dHB1dERldgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgT3V0cHV0RGV2IHsKcHVibGljOgoKICAvLyBDb25zdHJ1Y3Rvci4KICBPdXRwdXREZXYoKTsKCiAgLy8gRGVzdHJ1Y3Rvci4KICB2aXJ0dWFsIH5PdXRwdXREZXYoKTsKCiAgLy8tLS0tLSBnZXQgaW5mbyBhYm91dCBvdXRwdXQgZGV2aWNlCgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIHVwc2lkZS1kb3duIGNvb3JkaW5hdGVzPwogIC8vIChVcHNpZGUtZG93biBtZWFucyAoMCwwKSBpcyB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBwYWdlLikKICB2aXJ0dWFsIEdCb29sIHVwc2lkZURvd24oKSA9IDA7CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGRyYXdDaGFyKCkgb3IgZHJhd1N0cmluZygpPwogIHZpcnR1YWwgR0Jvb2wgdXNlRHJhd0NoYXIoKSA9IDA7CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIHRpbGluZ1BhdHRlcm5GaWxsKCk/ICBJZiB0aGlzIHJldHVybnMgZmFsc2UsCiAgLy8gdGlsaW5nIHBhdHRlcm4gZmlsbHMgd2lsbCBiZSByZWR1Y2VkIHRvIGEgc2VyaWVzIG9mIG90aGVyIGRyYXdpbmcKICAvLyBvcGVyYXRpb25zLgogIHZpcnR1YWwgR0Jvb2wgdXNlVGlsaW5nUGF0dGVybkZpbGwoKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSBzdXBwb3J0IHNwZWNpZmljIHNoYWRpbmcgdHlwZXM/CiAgLy8gc2VlIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoKSBhbmQgcGF0Y2hNZXNoU2hhZGVkRmlsbCgpCiAgdmlydHVhbCBHQm9vbCB1c2VTaGFkZWRGaWxscyhpbnQgdHlwZSkgeyByZXR1cm4gZ0ZhbHNlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIEZpbGxDb2xvclN0b3AoKT8KICB2aXJ0dWFsIEdCb29sIHVzZUZpbGxDb2xvclN0b3AoKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgZHJhd0Zvcm0oKT8gIElmIHRoaXMgcmV0dXJucyBmYWxzZSwKICAvLyBmb3JtLXR5cGUgWE9iamVjdHMgd2lsbCBiZSBpbnRlcnByZXRlZCAoaS5lLiwgdW5yb2xsZWQpLgogIHZpcnR1YWwgR0Jvb2wgdXNlRHJhd0Zvcm0oKSB7IHJldHVybiBnRmFsc2U7IH0KCiAgLy8gRG9lcyB0aGlzIGRldmljZSB1c2UgYmVnaW5UeXBlM0NoYXIvZW5kVHlwZTNDaGFyPyAgT3RoZXJ3aXNlLAogIC8vIHRleHQgaW4gVHlwZSAzIGZvbnRzIHdpbGwgYmUgZHJhd24gd2l0aCBkcmF3Q2hhci9kcmF3U3RyaW5nLgogIHZpcnR1YWwgR0Jvb2wgaW50ZXJwcmV0VHlwZTNDaGFycygpID0gMDsKCiAgLy8gRG9lcyB0aGlzIGRldmljZSBuZWVkIG5vbi10ZXh0IGNvbnRlbnQ/CiAgdmlydHVhbCBHQm9vbCBuZWVkTm9uVGV4dCgpIHsgcmV0dXJuIGdUcnVlOyB9CgogIC8vIERvZXMgdGhpcyBkZXZpY2UgcmVxdWlyZSBpbmNDaGFyQ291bnQgdG8gYmUgY2FsbGVkIGZvciB0ZXh0IG9uCiAgLy8gbm9uLXNob3duIGxheWVycz8KICB2aXJ0dWFsIEdCb29sIG5lZWRDaGFyQ291bnQoKSB7IHJldHVybiBnRmFsc2U7IH0KICAKICAvLyBEb2VzIHRoaXMgZGV2aWNlIG5lZWQgdG8gY2xpcCBwYWdlcyB0byB0aGUgY3JvcCBib3ggZXZlbiB3aGVuIHRoZQogIC8vIGJveCBpcyB0aGUgY3JvcCBib3g/CiAgdmlydHVhbCBHQm9vbCBuZWVkQ2xpcFRvQ3JvcEJveCgpIHsgcmV0dXJuIGdGYWxzZTsgfQoKICAvLy0tLS0tIGluaXRpYWxpemF0aW9uIGFuZCBjb250cm9sCgogIC8vIFNldCBkZWZhdWx0IHRyYW5zZm9ybSBtYXRyaXguCiAgdmlydHVhbCB2b2lkIHNldERlZmF1bHRDVE0oY29uc3QgZG91YmxlICpjdG0pOwoKICAvLyBDaGVjayB0byBzZWUgaWYgYSBwYWdlIHNsaWNlIHNob3VsZCBiZSBkaXNwbGF5ZWQuICBJZiB0aGlzCiAgLy8gcmV0dXJucyBmYWxzZSwgdGhlIHBhZ2UgZGlzcGxheSBpcyBhYm9ydGVkLiAgVHlwaWNhbGx5LCBhbgogIC8vIE91dHB1dERldiB3aWxsIHVzZSBzb21lIGFsdGVybmF0ZSBtZWFucyB0byBkaXNwbGF5IHRoZSBwYWdlCiAgLy8gYmVmb3JlIHJldHVybmluZyBmYWxzZS4KICB2aXJ0dWFsIEdCb29sIGNoZWNrUGFnZVNsaWNlKFBhZ2UgKnBhZ2UsIGRvdWJsZSBoRFBJLCBkb3VibGUgdkRQSSwKCQkJICAgICAgIGludCByb3RhdGUsIEdCb29sIHVzZU1lZGlhQm94LCBHQm9vbCBjcm9wLAoJCQkgICAgICAgaW50IHNsaWNlWCwgaW50IHNsaWNlWSwgaW50IHNsaWNlVywgaW50IHNsaWNlSCwKCQkJICAgICAgIEdCb29sIHByaW50aW5nLAoJCQkgICAgICAgR0Jvb2wgKCogYWJvcnRDaGVja0Niaykodm9pZCAqZGF0YSkgPSBudWxscHRyLAoJCQkgICAgICAgdm9pZCAqIGFib3J0Q2hlY2tDYmtEYXRhID0gbnVsbHB0ciwKCQkJICAgICAgIEdCb29sICgqYW5ub3REaXNwbGF5RGVjaWRlQ2JrKShBbm5vdCAqYW5ub3QsIHZvaWQgKnVzZXJfZGF0YSkgPSBudWxscHRyLAoJCQkgICAgICAgdm9pZCAqYW5ub3REaXNwbGF5RGVjaWRlQ2JrRGF0YSA9IG51bGxwdHIpCiAgICB7IHJldHVybiBnVHJ1ZTsgfQoKICAvLyBTdGFydCBhIHBhZ2UuCiAgdmlydHVhbCB2b2lkIHN0YXJ0UGFnZShpbnQgcGFnZU51bSwgR2Z4U3RhdGUgKnN0YXRlLCBYUmVmICp4cmVmKSB7fQoKICAvLyBFbmQgYSBwYWdlLgogIHZpcnR1YWwgdm9pZCBlbmRQYWdlKCkge30KCiAgLy8gRHVtcCBwYWdlIGNvbnRlbnRzIHRvIGRpc3BsYXkuCiAgdmlydHVhbCB2b2lkIGR1bXAoKSB7fQoKICAvLy0tLS0tIGNvb3JkaW5hdGUgY29udmVyc2lvbgoKICAvLyBDb252ZXJ0IGJldHdlZW4gZGV2aWNlIGFuZCB1c2VyIGNvb3JkaW5hdGVzLgogIHZpcnR1YWwgdm9pZCBjdnREZXZUb1VzZXIoZG91YmxlIGR4LCBkb3VibGUgZHksIGRvdWJsZSAqdXgsIGRvdWJsZSAqdXkpOwogIHZpcnR1YWwgdm9pZCBjdnRVc2VyVG9EZXYoZG91YmxlIHV4LCBkb3VibGUgdXksIGludCAqZHgsIGludCAqZHkpOwoKICBjb25zdCBkb3VibGUgKmdldERlZkNUTSgpIGNvbnN0IHsgcmV0dXJuIGRlZkNUTTsgfQogIGNvbnN0IGRvdWJsZSAqZ2V0RGVmSUNUTSgpIGNvbnN0IHsgcmV0dXJuIGRlZklDVE07IH0KCiAgLy8tLS0tLSBzYXZlL3Jlc3RvcmUgZ3JhcGhpY3Mgc3RhdGUKICB2aXJ0dWFsIHZvaWQgc2F2ZVN0YXRlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCByZXN0b3JlU3RhdGUoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CgogIC8vLS0tLS0gdXBkYXRlIGdyYXBoaWNzIHN0YXRlCiAgdmlydHVhbCB2b2lkIHVwZGF0ZUFsbChHZnhTdGF0ZSAqc3RhdGUpOwoKICAvLyBVcGRhdGUgdGhlIEN1cnJlbnQgVHJhbnNmb3JtYXRpb24gTWF0cml4IChDVE0pLCBpLmUuLCB0aGUgbmV3IG1hdHJpeAogIC8vIGdpdmVuIGluIG0xMSwgLi4uLCBtMzIgaXMgY29tYmluZWQgd2l0aCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgQ1RNLgogIC8vIEF0IHRoZSBzYW1lIHRpbWUsIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzdGF0ZS0+Z2V0Q1RNKCkgYWxyZWFkeQogIC8vIGNvbnRhaW5zIHRoZSBjb3JyZWN0IG5ldyBDVE0sIHNvIG9uZSBtYXkgYXMgd2VsbCByZXBsYWNlIHRoZQogIC8vIENUTSBvZiB0aGUgcmVuZGVyZXIgd2l0aCB0aGF0LgogIHZpcnR1YWwgdm9pZCB1cGRhdGVDVE0oR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKm0xMSovLCBkb3VibGUgLyptMTIqLywKCQkJIGRvdWJsZSAvKm0yMSovLCBkb3VibGUgLyptMjIqLywgZG91YmxlIC8qbTMxKi8sIGRvdWJsZSAvKm0zMiovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVMaW5lRGFzaChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmxhdG5lc3MoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUxpbmVKb2luKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVMaW5lQ2FwKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVNaXRlckxpbWl0KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVMaW5lV2lkdGgoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0cm9rZUFkanVzdChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlQWxwaGFJc1NoYXBlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVUZXh0S25vY2tvdXQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpbGxDb2xvclNwYWNlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VDb2xvclNwYWNlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVGaWxsQ29sb3IoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVN0cm9rZUNvbG9yKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVCbGVuZE1vZGUoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZUZpbGxPcGFjaXR5KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVTdHJva2VPcGFjaXR5KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVQYXR0ZXJuT3BhY2l0eShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgY2xlYXJQYXR0ZXJuT3BhY2l0eShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlsbE92ZXJwcmludChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3Ryb2tlT3ZlcnByaW50KEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVPdmVycHJpbnRNb2RlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVUcmFuc2ZlcihHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlRmlsbENvbG9yU3RvcChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlIC8qb2Zmc2V0Ki8pIHt9CgogIC8vLS0tLS0gdXBkYXRlIHRleHQgc3RhdGUKICB2aXJ0dWFsIHZvaWQgdXBkYXRlRm9udChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlVGV4dE1hdChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ2hhclNwYWNlKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVSZW5kZXIoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVJpc2UoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHVwZGF0ZVdvcmRTcGFjZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgdXBkYXRlSG9yaXpTY2FsaW5nKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVUZXh0UG9zKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCB1cGRhdGVUZXh0U2hpZnQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKnNoaWZ0Ki8pIHt9CiAgdmlydHVhbCB2b2lkIHNhdmVUZXh0UG9zKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCByZXN0b3JlVGV4dFBvcyhHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KCiAgLy8tLS0tLSBwYXRoIHBhaW50aW5nCiAgdmlydHVhbCB2b2lkIHN0cm9rZShHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgZmlsbChHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KICB2aXJ0dWFsIHZvaWQgZW9GaWxsKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgR0Jvb2wgdGlsaW5nUGF0dGVybkZpbGwoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIEdmeCAqIC8qZ2Z4Ki8sIENhdGFsb2cgKiAvKmNhdCovLCBPYmplY3QgKiAvKnN0ciovLAoJCQkJICBjb25zdCBkb3VibGUgKiAvKnBtYXQqLywgaW50IC8qcGFpbnRUeXBlKi8sIGludCAvKnRpbGluZ1R5cGUqLywgRGljdCAqIC8qcmVzRGljdCovLAoJCQkJICBjb25zdCBkb3VibGUgKiAvKm1hdCovLCBjb25zdCBkb3VibGUgKiAvKmJib3gqLywKCQkJCSAgaW50IC8qeDAqLywgaW50IC8qeTAqLywgaW50IC8qeDEqLywgaW50IC8qeTEqLywKCQkJCSAgZG91YmxlIC8qeFN0ZXAqLywgZG91YmxlIC8qeVN0ZXAqLykKICAgIHsgcmV0dXJuIGdGYWxzZTsgfQogIHZpcnR1YWwgR0Jvb2wgZnVuY3Rpb25TaGFkZWRGaWxsKEdmeFN0YXRlICogLypzdGF0ZSovLAoJCQkJICAgR2Z4RnVuY3Rpb25TaGFkaW5nICogLypzaGFkaW5nKi8pCiAgICB7IHJldHVybiBnRmFsc2U7IH0KICB2aXJ0dWFsIEdCb29sIGF4aWFsU2hhZGVkRmlsbChHZnhTdGF0ZSAqIC8qc3RhdGUqLywgR2Z4QXhpYWxTaGFkaW5nICogLypzaGFkaW5nKi8sIGRvdWJsZSAvKnRNaW4qLywgZG91YmxlIC8qdE1heCovKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCBheGlhbFNoYWRlZFN1cHBvcnRFeHRlbmQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIEdmeEF4aWFsU2hhZGluZyAqIC8qc2hhZGluZyovKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCByYWRpYWxTaGFkZWRGaWxsKEdmeFN0YXRlICogLypzdGF0ZSovLCBHZnhSYWRpYWxTaGFkaW5nICogLypzaGFkaW5nKi8sIGRvdWJsZSAvKnNNaW4qLywgZG91YmxlIC8qc01heCovKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCByYWRpYWxTaGFkZWRTdXBwb3J0RXh0ZW5kKEdmeFN0YXRlICogLypzdGF0ZSovLCBHZnhSYWRpYWxTaGFkaW5nICogLypzaGFkaW5nKi8pCiAgICB7IHJldHVybiBnRmFsc2U7IH0KICB2aXJ0dWFsIEdCb29sIGdvdXJhdWRUcmlhbmdsZVNoYWRlZEZpbGwoR2Z4U3RhdGUgKnN0YXRlLCBHZnhHb3VyYXVkVHJpYW5nbGVTaGFkaW5nICpzaGFkaW5nKQogICAgeyByZXR1cm4gZ0ZhbHNlOyB9CiAgdmlydHVhbCBHQm9vbCBwYXRjaE1lc2hTaGFkZWRGaWxsKEdmeFN0YXRlICpzdGF0ZSwgR2Z4UGF0Y2hNZXNoU2hhZGluZyAqc2hhZGluZykKICAgIHsgcmV0dXJuIGdGYWxzZTsgfQoKICAvLy0tLS0tIHBhdGggY2xpcHBpbmcKCiAgLy8gVXBkYXRlIHRoZSBjbGlwcGluZyBwYXRoLiAgVGhlIG5ldyBwYXRoIGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9sZCBwYXRoCiAgLy8gd2l0aCB0aGUgcGF0aCBnaXZlbiBpbiAnc3RhdGUnLgogIC8vIEFkZGl0aW9uYWxseSwgc2V0IHRoZSBjbGlwcGluZyBtb2RlIHRvIHRoZSAnbm9uemVybyB3aW5kaW5nIG51bWJlciBydWxlJy4KICAvLyBUaGF0IGlzLCBhIHBvaW50IGlzIGluc2lkZSB0aGUgY2xpcHBpbmcgcmVnaW9uIGlmIGl0cyB3aW5kaW5nIG51bWJlcgogIC8vIHdpdGggcmVzcGVjdCB0byB0aGUgY2xpcHBpbmcgcGF0aCBpcyBub256ZXJvLgogIHZpcnR1YWwgdm9pZCBjbGlwKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQoKICAvLyBVcGRhdGUgdGhlIGNsaXBwaW5nIHBhdGguICBUaGUgbmV3IHBhdGggaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgb2xkIHBhdGgKICAvLyB3aXRoIHRoZSBwYXRoIGdpdmVuIGluICdzdGF0ZScuCiAgLy8gQWRkaXRpb25hbGx5LCBzZXQgdGhlIGNsaXBwaW5nIG1vZGUgdG8gdGhlICdldmVuLW9kZCBydWxlJy4gIFRoYXQgaXMsIGEgcG9pbnQgaXMKICAvLyBpbnNpZGUgdGhlIGNsaXBwaW5nIHJlZ2lvbiBpZiBhIHJheSBmcm9tIGl0IHRvIGluZmluaXR5IHdpbGwgY3Jvc3MgdGhlIGNsaXBwaW5nCiAgLy8gcGF0aCBhbiBvZGQgbnVtYmVyIG9mIHRpbWVzIChkaXNyZWdhcmRpbmcgdGhlIHBhdGggb3JpZW50YXRpb24pLgogIHZpcnR1YWwgdm9pZCBlb0NsaXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGNsaXBUb1N0cm9rZVBhdGgoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CgogIC8vLS0tLS0gdGV4dCBkcmF3aW5nCiAgdmlydHVhbCB2b2lkIGJlZ2luU3RyaW5nT3AoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGVuZFN0cmluZ09wKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCBiZWdpblN0cmluZyhHZnhTdGF0ZSAqIC8qc3RhdGUqLywgY29uc3QgR29vU3RyaW5nICogLypzKi8pIHt9CiAgdmlydHVhbCB2b2lkIGVuZFN0cmluZyhHZnhTdGF0ZSAqIC8qc3RhdGUqLykge30KCiAgLy8gRHJhdyBvbmUgZ2x5cGggYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24KICAvLwogIC8vIEFyZ3VtZW50cyBhcmU6CiAgLy8gQ2hhckNvZGUgY29kZTogVGhpcyBpcyB0aGUgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGNvbnRlbnQgc3RyZWFtLiBJdCBuZWVkcyB0byBiZSBtYXBwZWQgYmFjayB0byBhIGdseXBoIGluZGV4LgogIC8vIGludCBuQnl0ZXM6IFRoZSB0ZXh0IHN0cmluZ3MgaW4gdGhlIGNvbnRlbnQgc3RyZWFtIGNhbiBjb25zaXN0cyBvZiBlaXRoZXIgOC1iaXQgb3IgMTYtYml0CiAgLy8gICAgICAgICAgICAgY2hhcmFjdGVyIGNvZGVzIGRlcGVuZGluZyBvbiB0aGUgZm9udC4gbkJ5dGVzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGNoYXJhY3RlciBjb2RlLgogIC8vIFVuaWNvZGUgKnU6IFRoZSBVQ1MtNCBtYXBwaW5nIHVzZWQgZm9yIHRleHQgZXh0cmFjdGlvbiAoVGV4dE91dHB1dERldikuCiAgLy8gaW50IHVMZW46IFRoZSBudW1iZXIgb2YgdW5pY29kZSBlbnRyaWVzIGluIHUuICBVc3VhbGx5ICcxJywgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciwKICAvLyAgICAgICAgICAgYnV0IGl0IG1heSBhbHNvIGhhdmUgbGFyZ2VyIHZhbHVlcywgZm9yIGV4YW1wbGUgZm9yIGxpZ2F0dXJlcy4KICB2aXJ0dWFsIHZvaWQgZHJhd0NoYXIoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGRvdWJsZSAvKngqLywgZG91YmxlIC8qeSovLAoJCQlkb3VibGUgLypkeCovLCBkb3VibGUgLypkeSovLAoJCQlkb3VibGUgLypvcmlnaW5YKi8sIGRvdWJsZSAvKm9yaWdpblkqLywKCQkJQ2hhckNvZGUgLypjb2RlKi8sIGludCAvKm5CeXRlcyovLCBVbmljb2RlICogLyp1Ki8sIGludCAvKnVMZW4qLykge30KICB2aXJ0dWFsIHZvaWQgZHJhd1N0cmluZyhHZnhTdGF0ZSAqIC8qc3RhdGUqLywgY29uc3QgR29vU3RyaW5nICogLypzKi8pIHt9CiAgdmlydHVhbCBHQm9vbCBiZWdpblR5cGUzQ2hhcihHZnhTdGF0ZSAqIC8qc3RhdGUqLywgZG91YmxlIC8qeCovLCBkb3VibGUgLyp5Ki8sCgkJCSAgICAgICBkb3VibGUgLypkeCovLCBkb3VibGUgLypkeSovLAoJCQkgICAgICAgQ2hhckNvZGUgLypjb2RlKi8sIFVuaWNvZGUgKiAvKnUqLywgaW50IC8qdUxlbiovKTsKICB2aXJ0dWFsIHZvaWQgZW5kVHlwZTNDaGFyKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQogIHZpcnR1YWwgdm9pZCBiZWdpblRleHRPYmplY3QoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGVuZFRleHRPYmplY3QoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIGluY0NoYXJDb3VudChpbnQgLypuQ2hhcnMqLykge30KICB2aXJ0dWFsIHZvaWQgYmVnaW5BY3R1YWxUZXh0KEdmeFN0YXRlICogLypzdGF0ZSovLCBjb25zdCBHb29TdHJpbmcgKiAvKnRleHQqLyApIHt9CiAgdmlydHVhbCB2b2lkIGVuZEFjdHVhbFRleHQoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CgogIC8vLS0tLS0gaW1hZ2UgZHJhd2luZwogIC8vIERyYXcgYW4gaW1hZ2UgbWFzay4gIEFuIGltYWdlIG1hc2sgaXMgYSBvbmUtYml0LXBlci1waXhlbCBpbWFnZSwgd2hlcmUgZWFjaCBwaXhlbAogIC8vIGNhbiBvbmx5IGJlICdmaWxsIGNvbG9yJyBvciAndHJhbnNwYXJlbnQnLgogIC8vCiAgLy8gSWYgJ2ludmVydCcgaXMgZmFsc2UsIGEgc2FtcGxlIHZhbHVlIG9mIDAgbWFya3MgdGhlIHBhZ2Ugd2l0aCB0aGUgY3VycmVudCBjb2xvciwKICAvLyBhbmQgYSAxIGxlYXZlcyB0aGUgcHJldmlvdXMgY29udGVudHMgdW5jaGFuZ2VkLiBJZiAnaW52ZXJ0JyBpcyB0cnVlLCB0aGVzZSBtZWFuaW5ncyBhcmUgcmV2ZXJzZWQuCiAgdmlydHVhbCB2b2lkIGRyYXdJbWFnZU1hc2soR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCSAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBHQm9vbCBpbnZlcnQsIEdCb29sIGludGVycG9sYXRlLAoJCQkgICAgIEdCb29sIGlubGluZUltZyk7CiAgdmlydHVhbCB2b2lkIHNldFNvZnRNYXNrRnJvbUltYWdlTWFzayhHZnhTdGF0ZSAqc3RhdGUsCgkJCQkJT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkJCWludCB3aWR0aCwgaW50IGhlaWdodCwgR0Jvb2wgaW52ZXJ0LAoJCQkJCUdCb29sIGlubGluZUltZywgZG91YmxlICpiYXNlTWF0cml4KTsKICB2aXJ0dWFsIHZvaWQgdW5zZXRTb2Z0TWFza0Zyb21JbWFnZU1hc2soR2Z4U3RhdGUgKnN0YXRlLCBkb3VibGUgKmJhc2VNYXRyaXgpOwogIHZpcnR1YWwgdm9pZCBkcmF3SW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCSBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEdmeEltYWdlQ29sb3JNYXAgKmNvbG9yTWFwLAoJCQkgR0Jvb2wgaW50ZXJwb2xhdGUsIGludCAqbWFza0NvbG9ycywgR0Jvb2wgaW5saW5lSW1nKTsKICB2aXJ0dWFsIHZvaWQgZHJhd01hc2tlZEltYWdlKEdmeFN0YXRlICpzdGF0ZSwgT2JqZWN0ICpyZWYsIFN0cmVhbSAqc3RyLAoJCQkgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAoJCQkgICAgICAgR2Z4SW1hZ2VDb2xvck1hcCAqY29sb3JNYXAsIEdCb29sIGludGVycG9sYXRlLAoJCQkgICAgICAgU3RyZWFtICptYXNrU3RyLCBpbnQgbWFza1dpZHRoLCBpbnQgbWFza0hlaWdodCwKCQkJICAgICAgIEdCb29sIG1hc2tJbnZlcnQsIEdCb29sIG1hc2tJbnRlcnBvbGF0ZSk7CiAgdmlydHVhbCB2b2lkIGRyYXdTb2Z0TWFza2VkSW1hZ2UoR2Z4U3RhdGUgKnN0YXRlLCBPYmplY3QgKnJlZiwgU3RyZWFtICpzdHIsCgkJCQkgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJCQkgICBHZnhJbWFnZUNvbG9yTWFwICpjb2xvck1hcCwKCQkJCSAgIEdCb29sIGludGVycG9sYXRlLAoJCQkJICAgU3RyZWFtICptYXNrU3RyLAoJCQkJICAgaW50IG1hc2tXaWR0aCwgaW50IG1hc2tIZWlnaHQsCgkJCQkgICBHZnhJbWFnZUNvbG9yTWFwICptYXNrQ29sb3JNYXAsCgkJCQkgICBHQm9vbCBtYXNrSW50ZXJwb2xhdGUpOwoKICAvLy0tLS0tIGdyb3VwaW5nIG9wZXJhdG9ycwoKICB2aXJ0dWFsIHZvaWQgZW5kTWFya2VkQ29udGVudChHZnhTdGF0ZSAqc3RhdGUpOwogIHZpcnR1YWwgdm9pZCBiZWdpbk1hcmtlZENvbnRlbnQoY29uc3QgY2hhciAqbmFtZSwgRGljdCAqcHJvcGVydGllcyk7CiAgdmlydHVhbCB2b2lkIG1hcmtQb2ludChjb25zdCBjaGFyICpuYW1lKTsKICB2aXJ0dWFsIHZvaWQgbWFya1BvaW50KGNvbnN0IGNoYXIgKm5hbWUsIERpY3QgKnByb3BlcnRpZXMpOwoKCgojaWZkZWYgT1BJX1NVUFBPUlQKICAvLy0tLS0tIE9QSSBmdW5jdGlvbnMKICB2aXJ0dWFsIHZvaWQgb3BpQmVnaW4oR2Z4U3RhdGUgKnN0YXRlLCBEaWN0ICpvcGlEaWN0KTsKICB2aXJ0dWFsIHZvaWQgb3BpRW5kKEdmeFN0YXRlICpzdGF0ZSwgRGljdCAqb3BpRGljdCk7CiNlbmRpZgoKICAvLy0tLS0tIFR5cGUgMyBmb250IG9wZXJhdG9ycwogIHZpcnR1YWwgdm9pZCB0eXBlM0QwKEdmeFN0YXRlICogLypzdGF0ZSovLCBkb3VibGUgLyp3eCovLCBkb3VibGUgLyp3eSovKSB7fQogIHZpcnR1YWwgdm9pZCB0eXBlM0QxKEdmeFN0YXRlICogLypzdGF0ZSovLCBkb3VibGUgLyp3eCovLCBkb3VibGUgLyp3eSovLAoJCSAgICAgICBkb3VibGUgLypsbHgqLywgZG91YmxlIC8qbGx5Ki8sIGRvdWJsZSAvKnVyeCovLCBkb3VibGUgLyp1cnkqLykge30KCiAgLy8tLS0tLSBmb3JtIFhPYmplY3RzCiAgdmlydHVhbCB2b2lkIGRyYXdGb3JtKFJlZiAvKmlkKi8pIHt9CgogIC8vLS0tLS0gUG9zdFNjcmlwdCBYT2JqZWN0cwogIHZpcnR1YWwgdm9pZCBwc1hPYmplY3QoU3RyZWFtICogLypwc1N0cmVhbSovLCBTdHJlYW0gKiAvKmxldmVsMVN0cmVhbSovKSB7fQoKICAvLy0tLS0tIFByb2ZpbGluZwogIHZvaWQgc3RhcnRQcm9maWxlKCk7CiAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBQcm9maWxlRGF0YT4qIGdldFByb2ZpbGVIYXNoKCkgY29uc3QgeyByZXR1cm4gcHJvZmlsZUhhc2guZ2V0KCk7IH0KICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBQcm9maWxlRGF0YT4+IGVuZFByb2ZpbGUoKTsKCiAgLy8tLS0tLSB0cmFuc3BhcmVuY3kgZ3JvdXBzIGFuZCBzb2Z0IG1hc2tzCiAgdmlydHVhbCBHQm9vbCBjaGVja1RyYW5zcGFyZW5jeUdyb3VwKEdmeFN0YXRlICogLypzdGF0ZSovLCBHQm9vbCAvKmtub2Nrb3V0Ki8pIHsgcmV0dXJuIGdUcnVlOyB9CiAgdmlydHVhbCB2b2lkIGJlZ2luVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGNvbnN0IGRvdWJsZSAqIC8qYmJveCovLAoJCQkJICAgICAgR2Z4Q29sb3JTcGFjZSAqIC8qYmxlbmRpbmdDb2xvclNwYWNlKi8sCgkJCQkgICAgICBHQm9vbCAvKmlzb2xhdGVkKi8sIEdCb29sIC8qa25vY2tvdXQqLywKCQkJCSAgICAgIEdCb29sIC8qZm9yU29mdE1hc2sqLykge30KICB2aXJ0dWFsIHZvaWQgZW5kVHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8pIHt9CiAgdmlydHVhbCB2b2lkIHBhaW50VHJhbnNwYXJlbmN5R3JvdXAoR2Z4U3RhdGUgKiAvKnN0YXRlKi8sIGNvbnN0IGRvdWJsZSAqIC8qYmJveCovKSB7fQogIHZpcnR1YWwgdm9pZCBzZXRTb2Z0TWFzayhHZnhTdGF0ZSAqIC8qc3RhdGUqLywgY29uc3QgZG91YmxlICogLypiYm94Ki8sIEdCb29sIC8qYWxwaGEqLywKCQkJICAgRnVuY3Rpb24gKiAvKnRyYW5zZmVyRnVuYyovLCBHZnhDb2xvciAqIC8qYmFja2Ryb3BDb2xvciovKSB7fQogIHZpcnR1YWwgdm9pZCBjbGVhclNvZnRNYXNrKEdmeFN0YXRlICogLypzdGF0ZSovKSB7fQoKICAvLy0tLS0tIGxpbmtzCiAgdmlydHVhbCB2b2lkIHByb2Nlc3NMaW5rKEFubm90TGluayAqIC8qbGluayovKSB7fQoKI2lmIDEgLy9+dG1wOiB0dXJuIG9mZiBhbnRpLWFsaWFzaW5nIHRlbXBvcmFyaWx5CiAgdmlydHVhbCBHQm9vbCBnZXRWZWN0b3JBbnRpYWxpYXMoKSB7IHJldHVybiBnRmFsc2U7IH0KICB2aXJ0dWFsIHZvaWQgc2V0VmVjdG9yQW50aWFsaWFzKEdCb29sIC8qdmFhKi8pIHt9CiNlbmRpZgoKI2lmZGVmIFVTRV9DTVMKICBQb3BwbGVyQ2FjaGU8UmVmLCBHZnhJQ0NCYXNlZENvbG9yU3BhY2U+ICpnZXRJY2NDb2xvclNwYWNlQ2FjaGUoKSB7IHJldHVybiAmaWNjQ29sb3JTcGFjZUNhY2hlOyB9CiNlbmRpZgoKcHJpdmF0ZToKCiAgZG91YmxlIGRlZkNUTVs2XTsJCS8vIGRlZmF1bHQgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gbWF0cml4CiAgZG91YmxlIGRlZklDVE1bNl07CQkvLyBpbnZlcnNlIG9mIGRlZmF1bHQgQ1RNCiAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgUHJvZmlsZURhdGE+PiBwcm9maWxlSGFzaDsKCiNpZmRlZiBVU0VfQ01TCiAgUG9wcGxlckNhY2hlPFJlZiwgR2Z4SUNDQmFzZWRDb2xvclNwYWNlPiBpY2NDb2xvclNwYWNlQ2FjaGU7CiNlbmRpZgp9OwoKI2VuZGlmCg==