Ci8vIFRoaXMgaXMgc2xpZ2h0bHkgaGFja2VkIHZlcnNpb24gb2YgcGVyZi9mYmVuY2guYy4gIEl0IGRvZXMgc29tZQovLyBzb21lIGJhc2ljIEZQIGFyaXRobWV0aWMgKCsvLS8qL2RpdmlkZSkgYW5kIG5vdCBhIGxvdCBlbHNlLgoKLy8gVGhpcyBzbWFsbCBwcm9ncmFtIGRvZXMgc29tZSByYXl0cmFjaW5nLiAgSXQgdGVzdHMgVmFsZ3JpbmQncyBoYW5kbGluZyBvZgovLyBGUCBvcGVyYXRpb25zLiAgSXQgYXBwYXJlbnRseSBkb2VzIGEgbG90IG9mIHRyaWdvbm9tZXRyeSBvcGVyYXRpb25zLgoKLy8gTGljZW5zaW5nOiBUaGlzIHByb2dyYW0gaXMgY2xvc2VseSBiYXNlZCBvbiB0aGUgb25lIG9mIHRoZSBzYW1lIG5hbWUgZnJvbQovLyBodHRwOi8vd3d3LmZvdXJtaWxhYi5jaC8uICBUaGUgZnJvbnQgcGFnZSBvZiB0aGF0IHNpdGUgc2F5czoKLy8KLy8gICAiRXhjZXB0IGZvciBhIGZldyBjbGVhcmx5LW1hcmtlZCBleGNlcHRpb25zLCBhbGwgdGhlIG1hdGVyaWFsIG9uIHRoaXMKLy8gICBzaXRlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluIGFuZCBtYXkgYmUgdXNlZCBpbiBhbnkgbWFubmVyIHdpdGhvdXQKLy8gICBwZXJtaXNzaW9uLCByZXN0cmljdGlvbiwgYXR0cmlidXRpb24sIG9yIGNvbXBlbnNhdGlvbi4iCgovKiBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgaW4gdHdvIHdheXMuICBJZiBJTlRSSUcgaXMgdW5kZWZpbmVkLCBzaW4sCiAgIGNvcywgdGFuLCBldGMsIHdpbGwgYmUgdXNlZCBhcyBzdXBwbGllZCBieSA8bWF0aC5oPi4gIElmIGl0IGlzCiAgIGRlZmluZWQsIHRoZW4gdGhlIHByb2dyYW0gY2FsY3VsYXRlcyBhbGwgdGhpcyBzdHVmZiBmcm9tIGZpcnN0CiAgIHByaW5jaXBsZXMgKHNvIHRvIHNwZWFrKSBhbmQgZG9lcyBub3QgdXNlIHRoZSBsaWJjIGZhY2lsaXRpZXMuICBGb3IKICAgYmVuY2htYXJraW5nIHB1cnBvc2VzIGl0IHNlZW1zIGJldHRlciB0byBhdm9pZCB0aGUgbGliYyBzdHVmZiwgc28KICAgdGhhdCB0aGUgaW5uZXIgbG9vcHMgKHNpbiwgc3FydCkgcHJlc2VudCBhIHdvcmtsb2FkIGluZGVwZW5kZW50IG9mCiAgIGxpYmMgaW1wbGVtZW50YXRpb25zIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMuICBIZW5jZTogKi8KCiNkZWZpbmUgSU5UUklHIDEKCgovKgoKICAgICAgICBKb2huIFdhbGtlcidzIEZsb2F0aW5nIFBvaW50IEJlbmNobWFyaywgZGVyaXZlZCBmcm9tLi4uCgoJTWFyaW5jaGlwIEludGVyYWN0aXZlIExlbnMgRGVzaWduIFN5c3RlbQoKCQkJCSAgICAgSm9obiBXYWxrZXIgICBEZWNlbWJlciAxOTgwCgoJQnkgSm9obiBXYWxrZXIKCSAgIGh0dHA6Ly93d3cuZm91cm1pbGFiLmNoLwoKCVRoaXMgIHByb2dyYW0gbWF5IGJlIHVzZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgZnJlZWx5IGFzCglsb25nIGFzIHRoZSBvcmlnaW4gaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkLgoKCVRoaXMgIGlzICBhICBjb21wbGV0ZSAgb3B0aWNhbAlkZXNpZ24JcmF5dHJhY2luZyAgYWxnb3JpdGhtLAoJc3RyaXBwZWQgb2YgaXRzIHVzZXIgaW50ZXJmYWNlIGFuZCByZWNhc3QgaW50byBwb3J0YWJsZSBDLiAgSXQKCW5vdCBvbmx5IGRldGVybWluZXMgZXhlY3V0aW9uIHNwZWVkIG9uIGFuICBleHRyZW1lbHkgIGZsb2F0aW5nCglwb2ludAkoaW5jbHVkaW5nICAgdHJpZyAgIGZ1bmN0aW9uKQlpbnRlbnNpdmUgICByZWFsLXdvcmxkCglhcHBsaWNhdGlvbiwgaXQgIGNoZWNrcyAgYWNjdXJhY3kgIG9uICBhbiAgYWxnb3JpdGhtICB0aGF0ICBpcwoJZXhxdWlzaXRlbHkgIHNlbnNpdGl2ZQl0byAgZXJyb3JzLiAgIFRoZSAgcGVyZm9ybWFuY2Ugb2YgdGhpcwoJcHJvZ3JhbSBpcyB0eXBpY2FsbHkgZmFyIG1vcmUgIHNlbnNpdGl2ZSAgdG8gIGNoYW5nZXMgIGluICB0aGUKCWVmZmljaWVuY3kgIG9mCXRoZSAgdHJpZ29ub21ldHJpYyAgbGlicmFyeSAgcm91dGluZXMgdGhhbiB0aGUKCWF2ZXJhZ2UgZmxvYXRpbmcgcG9pbnQgcHJvZ3JhbS4KCglUaGUgYmVuY2htYXJrIG1heSBiZSBjb21waWxlZCBpbiB0d28gIG1vZGVzLiAgIElmICB0aGUJc3ltYm9sCglJTlRSSUcJaXMgIGRlZmluZWQsICBidWlsdC1pbgl0cmlnb25vbWV0cmljICBhbmQgc3F1YXJlIHJvb3QKCXJvdXRpbmVzIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGNhbGN1bGF0aW9ucy4gIFRpbWluZ3MgbWFkZSB3aXRoCiAgICAgICAgSU5UUklHICBkZWZpbmVkICByZWZsZWN0ICB0aGUgIG1hY2hpbmUncyAgYmFzaWMgZmxvYXRpbmcgcG9pbnQKCXBlcmZvcm1hbmNlIGZvciB0aGUgYXJpdGhtZXRpYyBvcGVyYXRvcnMuICBJZiAgSU5UUklHICBpcyAgbm90CglkZWZpbmVkLCAgdGhlICBzeXN0ZW0gIGxpYnJhcnkJPG1hdGguaD4gIGZ1bmN0aW9ucyAgYXJlIHVzZWQuCiAgICAgICAgUmVzdWx0cyB3aXRoIElOVFJJRyBub3QgZGVmaW5lZCByZWZsZWN0IHRoZSAgc3lzdGVtJ3MgIGxpYnJhcnkKCXBlcmZvcm1hbmNlICBhbmQvb3IgIGZsb2F0aW5nICBwb2ludCBoYXJkd2FyZSBzdXBwb3J0IGZvciB0cmlnCglmdW5jdGlvbnMgYW5kIHNxdWFyZSByb290LiAgUmVzdWx0cyB3aXRoIElOVFJJRyBkZWZpbmVkIGFyZSAgYQoJZ29vZCAgZ3VpZGUgIHRvICBnZW5lcmFsICBmbG9hdGluZyAgcG9pbnQgIHBlcmZvcm1hbmNlLCAgd2hpbGUKCXJlc3VsdHMgd2l0aCBJTlRSSUcgdW5kZWZpbmVkIGluZGljYXRlIHRoZSBwZXJmb3JtYW5jZQlvZiAgYW4KCWFwcGxpY2F0aW9uIHdoaWNoIGlzIG1hdGggZnVuY3Rpb24gaW50ZW5zaXZlLgoKCVNwZWNpYWwgIG5vdGUgIHJlZ2FyZGluZyAgZXJyb3JzIGluIGFjY3VyYWN5OiB0aGlzIHByb2dyYW0gaGFzCglnZW5lcmF0ZWQgbnVtYmVycyBpZGVudGljYWwgdG8gdGhlIGxhc3QgZGlnaXQgaXQgIGZvcm1hdHMgIGFuZAoJY2hlY2tzIG9uIHRoZSBmb2xsb3dpbmcgbWFjaGluZXMsIGZsb2F0aW5nIHBvaW50CglhcmNoaXRlY3R1cmVzLCBhbmQgbGFuZ3VhZ2VzOgoKCU1hcmluY2hpcCA5OTAwCSAgUUJBU0lDICAgIElCTSAzNzAgZG91YmxlLXByZWNpc2lvbiAoUkVBTCAqIDgpIGZvcm1hdAoKCUlCTSBQQyAvIFhUIC8gQVQgIExhdHRpY2UgQyBJRUVFIDY0IGJpdCwgODAgYml0IHRlbXBvcmFyaWVzCgkJCSAgSGlnaCBDICAgIHNhbWUsIGluIGxpbmUgODB4ODcgY29kZQogICAgICAgICAgICAgICAgICAgICAgICAgIEJBU0lDQSAgICAiRG91YmxlIHByZWNpc2lvbiIKCQkJICBRdWljayBCQVNJQyBJRUVFIGRvdWJsZSBwcmVjaXNpb24sIHNvZnR3YXJlIHJvdXRpbmVzCgoJU3VuIDMJCSAgQwkgICAgSUVFRSA2NCBiaXQsIDgwIGJpdCB0ZW1wb3JhcmllcywKCQkJCSAgICBpbi1saW5lIDY4ODgxIGNvZGUsIGluLWxpbmUgRlBBIGNvZGUuCgogICAgICAgIE1pY3JvVkFYIElJICAgICAgIEMgICAgICAgICBWYXggIkciIGZvcm1hdCBmbG9hdGluZyBwb2ludAoKCU1hY2ludG9zaCBQbHVzCSAgTVBXIEMgICAgIFNBTkUgZmxvYXRpbmcgcG9pbnQsIElFRUUgNjQgYml0IGZvcm1hdAoJCQkJICAgIGltcGxlbWVudGVkIGluIFJPTS4KCglJbmFjY3VyYWNpZXMgIHJlcG9ydGVkCWJ5ICB0aGlzICBwcm9ncmFtIHNob3VsZCBiZSB0YWtlbiBWRVJZCglTRVJJT1VTTFkgSU5ERUVELCBhcyB0aGUgcHJvZ3JhbSBoYXMgYmVlbiBkZW1vbnN0cmF0ZWQJdG8gIGJlCglpbnZhcmlhbnQgIHVuZGVyICBjaGFuZ2VzIGluIGZsb2F0aW5nIHBvaW50IGZvcm1hdCwgYXMgbG9uZyBhcwoJdGhlIGZvcm1hdCBpcyBhIHJlY29nbmlzZWQgZG91YmxlIHByZWNpc2lvbiAgZm9ybWF0LiAgIElmICB5b3UKCWVuY291bnRlciBlcnJvcnMsIHBsZWFzZSByZW1lbWJlciB0aGF0IHRoZXkgYXJlIGp1c3QgYXMgbGlrZWx5Cgl0byAgYmUJaW4gIHRoZSAgZmxvYXRpbmcgIHBvaW50ICBlZGl0aW5nICAgbGlicmFyeSAgIG9yICAgdGhlCgl0cmlnb25vbWV0cmljICBsaWJyYXJpZXMgIGFzICBpbiAgdGhlIGxvdyBsZXZlbCBvcGVyYXRvciBjb2RlLgoKCVRoZSBiZW5jaG1hcmsgYXNzdW1lcyB0aGF0IHJlc3VsdHMgYXJlIGJhc2ljYWxseSByZWxpYWJsZSwgYW5kCglvbmx5IHRlc3RzIHRoZSBsYXN0IHJlc3VsdCBjb21wdXRlZCBhZ2FpbnN0IHRoZSByZWZlcmVuY2UuICBJZgogICAgICAgIHlvdSdyZSBydW5uaW5nIG9uICBhICBzdXNwZWN0ICBzeXN0ZW0gIHlvdSAgY2FuICBjb21waWxlICB0aGlzCglwcm9ncmFtICB3aXRoICBBQ0NVUkFDWSBkZWZpbmVkLiAgVGhpcyB3aWxsIGdlbmVyYXRlIGEgdmVyc2lvbgoJd2hpY2ggZXhlY3V0ZXMgYXMgYW4gaW5maW5pdGUgbG9vcCwgcGVyZm9ybWluZyB0aGUgIHJheSAgdHJhY2UKCWFuZCBjaGVja2luZyB0aGUgcmVzdWx0cyBvbiBldmVyeSBwYXNzLiAgQWxsIGluY29ycmVjdCByZXN1bHRzCgl3aWxsIGJlIHJlcG9ydGVkLgoKCVJlcHJlc2VudGF0aXZlCXRpbWluZ3MgIGFyZSAgZ2l2ZW4gIGJlbG93LiAgIEFsbCAgaGF2ZSAgIGJlZW4KCW5vcm1hbGlzZWQgYXMgaWYgcnVuIGZvciAxMDAwIGl0ZXJhdGlvbnMuCgogIFRpbWUgaW4gc2Vjb25kcwkJICAgQ29tcHV0ZXIsIENvbXBpbGVyLCBhbmQgbm90ZXMKIE5vcm1hbCAgICAgIElOVFJJRwoKIDM0NjYuMDAgICAgNDAzMS4wMAlDb21tb2RvcmUgMTI4LCAyIE1oeiA4NTEwIHdpdGggc29mdHdhcmUgZmxvYXRpbmcKCQkJcG9pbnQuCUFiYWN1cyBTb2Z0d2FyZS9EYXRhLUJlY2tlciBTdXBlci1DIDEyOCwKCQkJdmVyc2lvbiAzLjAwLCBydW4gaW4gZmFzdCAoMiBNaHopIG1vZGUuICBOb3RlOgoJCQl0aGUgcmVzdWx0cyBnZW5lcmF0ZWQgYnkgdGhpcyBzeXN0ZW0gZGlmZmVyZWQKCQkJZnJvbSB0aGUgcmVmZXJlbmNlIHJlc3VsdHMgaW4gdGhlIDh0aCB0byAxMHRoCgkJCWRlY2ltYWwgcGxhY2UuCgogMzI5MC4wMAkJSUJNIFBDL0FUIDYgTWh6LCBNaWNyb3NvZnQvSUJNIEJBU0lDQSB2ZXJzaW9uIEEzLjAwLgogICAgICAgICAgICAgICAgICAgICAgICBSdW4gd2l0aCB0aGUgIi9kIiBzd2l0Y2gsIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50LgoKIDIxMzEuNTAJCUlCTSBQQy9BVCA2IE1oeiwgTGF0dGljZSBDIHZlcnNpb24gMi4xNCwgc21hbGwgbW9kZWwuCgkJCVRoaXMgdmVyc2lvbiBvZiBMYXR0aWNlIGNvbXBpbGVzIHN1YnJvdXRpbmUKCQkJY2FsbHMgd2hpY2ggZWl0aGVyIGRvIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50CgkJCW9yIHVzZSB0aGUgODB4ODcuICBUaGUgbWFjaGluZSBvbiB3aGljaCBJIHJhbgoJCQl0aGlzIGhhZCBhbiA4MDI4NywgYnV0IHRoZSByZXN1bHRzIHdlcmUgc28gYmFkCgkJCUkgd29uZGVyIGlmIGl0IHdhcyBiZWluZyB1c2VkLgoKIDE1OTguMDAJCU1hY2ludG9zaCBQbHVzLCBNUFcgQywgU0FORSBTb2Z0d2FyZSBmbG9hdGluZyBwb2ludC4KCiAxNTgyLjEzCQlNYXJpbmNoaXAgOTkwMCAyIE1oeiwgUUJBU0lDIGNvbXBpbGVyIHdpdGggc29mdHdhcmUKCQkJZmxvYXRpbmcgcG9pbnQuICBUaGlzIHdhcyBhIFFCQVNJQyB2ZXJzaW9uIG9mIHRoZQoJCQlwcm9ncmFtIHdoaWNoIGNvbnRhaW5lZCB0aGUgaWRlbnRpY2FsIGFsZ29yaXRobS4KCiAgNDA0LjAwCQlJQk0gUEMvQVQgNiBNaHosIE1pY3Jvc29mdCBRdWlja0JBU0lDIHZlcnNpb24gMi4wLgoJCQlTb2Z0d2FyZSBmbG9hdGluZyBwb2ludC4KCiAgMTY1LjE1CQlJQk0gUEMvQVQgNiBNaHosIE1ldGF3YXJlIEhpZ2ggQyB2ZXJzaW9uIDEuMywgc21hbGwKCQkJbW9kZWwuCVRoaXMgd2FzIGNvbXBpbGVkIHRvIGNhbGwgc3Vicm91dGluZXMgZm9yCgkJCWZsb2F0aW5nIHBvaW50LCBhbmQgdGhlIG1hY2hpbmUgY29udGFpbmVkIGFuIDgwMjg3CgkJCXdoaWNoIHdhcyB1c2VkIGJ5IHRoZSBzdWJyb3V0aW5lcy4KCiAgMTQzLjIwCQlNYWNpbnRvc2ggSUksIE1QVyBDLCBTQU5FIGNhbGxzLiAgSSB3YXMgdW5hYmxlIHRvCgkJCWRldGVybWluZSB3aGV0aGVyIFNBTkUgd2FzIHVzaW5nIHRoZSA2ODg4MSBjaGlwIG9yCgkJCW5vdC4KCiAgMTIxLjgwCQlTdW4gMy8xNjAgMTYgTWh6LCBTdW4gQy4gIENvbXBpbGVkIHdpdGggLWZzb2Z0IHN3aXRjaAoJCQl3aGljaCBleGVjdXRlcyBmbG9hdGluZyBwb2ludCBpbiBzb2Z0d2FyZS4KCiAgIDc4Ljc4ICAgICAxMTAuMTEJSUJNIFJUIFBDIChNb2RlbCA2MTUwKS4gIElCTSBBSVggMS4wIEMgY29tcGlsZXIKCQkJd2l0aCAtTyBzd2l0Y2guCgogICA3NS4yICAgICAgMjU0LjAJTWljcm9zb2Z0IFF1aWNrIEMgMS4wLCBpbi1saW5lIDgwODcgaW5zdHJ1Y3Rpb25zLAoJCQljb21waWxlZCB3aXRoIDgwMjg2IG9wdGltaXNhdGlvbiBvbi4gIChTd2l0Y2hlcwoJCQl3ZXJlIC1PbCAtRlBpODctRzIgLUFTKS4gIFNtYWxsIG1lbW9yeSBtb2RlbC4KCiAgIDY5LjUwCQlJQk0gUEMvQVQgNk1oeiwgQm9ybGFuZCBUdXJibyBCQVNJQyAxLjAuICBDb21waWxlZAogICAgICAgICAgICAgICAgICAgICAgICBpbiAiODA4NyByZXF1aXJlZCIgbW9kZSB0byBnZW5lcmF0ZSBpbi1saW5lCgkJCWNvZGUgZm9yIHRoZSBtYXRoIGNvcHJvY2Vzc29yLgoKICAgNjYuOTYJCUlCTSBQQy9BVCA2TWh6LCBNaWNyb3NvZnQgUXVpY2tCQVNJQyA0LjAuICBUaGlzCgkJCXJlbGVhc2Ugb2YgUXVpY2tCQVNJQyBjb21waWxlcyBjb2RlIGZvciB0aGUKCQkJODAyODcgbWF0aCBjb3Byb2Nlc3Nvci4KCiAgIDY2LjM2ICAgICAyMDYuMzUJSUJNIFBDL0FUIDZNaHosIE1ldGF3YXJlIEhpZ2ggQyB2ZXJzaW9uIDEuMywgc21hbGwKCQkJbW9kZWwuCVRoaXMgd2FzIGNvbXBpbGVkIHdpdGggaW4tbGluZSBjb2RlIGZvciB0aGUKCQkJODAyODcgbWF0aCBjb3Byb2Nlc3Nvci4gIFRyaWcgZnVuY3Rpb25zIHN0aWxsIGNhbGwKCQkJbGlicmFyeSByb3V0aW5lcy4KCiAgIDYzLjA3ICAgICAyMjAuNDMJSUJNIFBDL0FULCA2TWh6LCBCb3JsYW5kIFR1cmJvIEMsIGluLWxpbmUgODA4NyBjb2RlLAoJCQlzbWFsbCBtb2RlbCwgd29yZCBhbGlnbm1lbnQsIG5vIHN0YWNrIGNoZWNraW5nLAoJCQk4MDg2IGNvZGUgbW9kZS4KCiAgIDE3LjE4CQlBcG9sbG8gRE4tMzAwMCwgMTIgTWh6IDY4MDIwIHdpdGggNjg4ODEsIGNvbXBpbGVkCgkJCXdpdGggaW4tbGluZSBjb2RlIGZvciB0aGUgNjg4ODEgY29wcm9jZXNzb3IuCgkJCUFjY29yZGluZyB0byBBcG9sbG8sIHRoZSBsaWJyYXJ5IHJvdXRpbmVzIGFyZSBjaG9zZW4KCQkJYXQgcnVudGltZSBiYXNlZCBvbiBjb3Byb2Nlc3NvciBwcmVzZW5jZS4gIFNpbmNlIHRoZQoJCQljb3Byb2Nlc3NvciB3YXMgcHJlc2VudCwgdGhlIGxpYnJhcnkgaXMgc3VwcG9zZWQgdG8KCQkJdXNlIGluLWxpbmUgZmxvYXRpbmcgcG9pbnQgY29kZS4KCiAgIDE1LjU1ICAgICAgMjcuNTYJVkFYc3RhdGlvbiBJSSBHUFguICBDb21waWxlZCBhbmQgZXhlY3V0ZWQgdW5kZXIKCQkJVkFYL1ZNUyBDLgoKICAgMTUuMTQgICAgICAzNy45MwlNYWNpbnRvc2ggSUksIFVuaXggc3lzdGVtIFYuICBHcmVlbiBIaWxscyA2ODAyMAoJCQlVbml4IGNvbXBpbGVyIHdpdGggaW4tbGluZSBjb2RlIGZvciB0aGUgNjg4ODEKCQkJY29wcm9jZXNzb3IgKC1PIC1aSSBzd2l0Y2hlcykuCgogICAxMi42OQkJU3VuIDMvMTYwIDE2IE1oeiwgU3VuIEMuICBDb21waWxlZCB3aXRoIC1mc3dpdGNoLAoJCQl3aGljaCBjYWxscyBhIHN1YnJvdXRpbmUgdG8gc2VsZWN0IHRoZSBmYXN0ZXN0CgkJCWZsb2F0aW5nIHBvaW50IHByb2Nlc3Nvci4gIFRoaXMgd2FzIHVzaW5nIHRoZSA2ODg4MS4KCiAgIDExLjc0ICAgICAgMjYuNzMJQ29tcGFxIERlc2twcm8gMzg2LCAxNiBNaHogODAzODYgd2l0aCAxNiBNaHogODAzODcuCgkJCU1ldGF3YXJlIEhpZ2ggQyB2ZXJzaW9uIDEuMywgY29tcGlsZWQgd2l0aCBpbi1saW5lCgkJCWZvciB0aGUgbWF0aCBjb3Byb2Nlc3NvciAoYnV0IG5vdCBvcHRpbWlzZWQgZm9yIHRoZQoJCQk4MDM4Ni84MDM4NykuICBUcmlnIGZ1bmN0aW9ucyBzdGlsbCBjYWxsIGxpYnJhcnkKCQkJcm91dGluZXMuCgogICAgOC40MyAgICAgIDMwLjQ5CVN1biAzLzE2MCAxNiBNaHosIFN1biBDLiAgQ29tcGlsZWQgd2l0aCAtZjY4ODgxLAoJCQlnZW5lcmF0aW5nIGluLWxpbmUgTUM2ODg4MSBpbnN0cnVjdGlvbnMuICBUcmlnCgkJCWZ1bmN0aW9ucyBzdGlsbCBjYWxsIGxpYnJhcnkgcm91dGluZXMuCgogICAgNi4yOSAgICAgIDI1LjE3CVN1biAzLzI2MCAyNSBNaHosIFN1biBDLiAgQ29tcGlsZWQgd2l0aCAtZjY4ODgxLAoJCQlnZW5lcmF0aW5nIGluLWxpbmUgTUM2ODg4MSBpbnN0cnVjdGlvbnMuICBUcmlnCgkJCWZ1bmN0aW9ucyBzdGlsbCBjYWxsIGxpYnJhcnkgcm91dGluZXMuCgogICAgNC41NwkJU3VuIDMvMjYwIDI1IE1oeiwgU3VuIEZPUlRSQU4gNzcuICBDb21waWxlZCB3aXRoCgkJCS1PIC1mNjg4ODEsIGdlbmVyYXRpbmcgaW4tbGluZSBNQzY4ODgxIGluc3RydWN0aW9ucy4KCQkJVHJpZyBmdW5jdGlvbnMgYXJlIGNvbXBpbGVkIGluLWxpbmUuICBUaGlzIHVzZWQKCQkJdGhlIEZPUlRSQU4gNzcgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbSwgRkJGT1JUNzcuRi4KCiAgICA0LjAwICAgICAgMTQuMjAJU3VuMzg2aS8yNSBNaHogbW9kZWwgMjUwLCBTdW4gQyBjb21waWxlci4KCiAgICA0LjAwICAgICAgMTQuMDAJU3VuMzg2aS8yNSBNaHogbW9kZWwgMjUwLCBNZXRhd2FyZSBDLgoKICAgIDMuMTAgICAgICAxMi4wMAlDb21wYXEgMzg2LzM4NyAyNSBNaHogcnVubmluZyBTQ08gWGVuaXggMi4KCQkJQ29tcGlsZWQgd2l0aCBNZXRhd2FyZSBIaWdoQyAzODYsIG9wdGltaXplZAoJCQlmb3IgMzg2LgoKICAgIDMuMDAgICAgICAxMi4wMAlDb21wYXEgMzg2LzM4NyAyNU1IWiBvcHRpbWl6ZWQgZm9yIDM4Ni8zODcuCgogICAgMi45NiAgICAgICA1LjE3CVN1biA0LzI2MCwgU3BhcmMgUklTQyBwcm9jZXNzb3IuICBTdW4gQywKCQkJY29tcGlsZWQgd2l0aCB0aGUgLU8yIHN3aXRjaCBmb3IgZ2xvYmFsCgkJCW9wdGltaXNhdGlvbi4KCiAgICAyLjQ3CQlDT01QQVEgNDg2LzI1LCBzZWNvbmRhcnkgY2FjaGUgZGlzYWJsZWQsIEhpZ2ggQywKCQkJNDg2LzM4NywgaW5saW5lIGYucC4sIHNtYWxsIG1lbW9yeSBtb2RlbC4KCiAgICAyLjIwICAgICAgIDMuNDAJRGF0YSBHZW5lcmFsIE1vdG9yb2xhIDg4MDAwLCAxNiBNaHosIEdudSBDLgoKICAgIDEuNTYJCUNPTVBBUSA0ODYvMjUsIDEyOEsgc2Vjb25kYXJ5IGNhY2hlLCBIaWdoIEMsIDQ4Ni8zODcsCgkJCWlubGluZSBmLnAuLCBzbWFsbCBtZW1vcnkgbW9kZWwuCgogICAgMC42NiAgICAgICAxLjUwCURFQyBQbWF4LCBNaXBzIHByb2Nlc3Nvci4KCiAgICAwLjYzICAgICAgIDAuOTEJU3VuIFNwYXJjU3RhdGlvbiAyLCBTdW4gQyAoU3VuT1MgNC4xLjEpIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgLU80IG9wdGltaXNhdGlvbiBhbmQgIi91c3IvbGliL2xpYm0uaWwiIGlubGluZQoJCQlmbG9hdGluZyBwb2ludC4KCiAgICAwLjYwICAgICAgIDEuMDcJSW50ZWwgODYwIFJJU0MgcHJvY2Vzc29yLCAzMyBNaHosIEdyZWVuaGlsbHMKCQkJQyBjb21waWxlci4KCiAgICAwLjQwICAgICAgIDAuOTAJRGVjIDNNQVgsIE1JUFMgMzAwMCBwcm9jZXNzb3IsIC1PNC4KCiAgICAwLjMxICAgICAgIDAuOTAJSUJNIFJTLzYwMDAsIC1PLgoKICAgIDAuMTEyOSAgICAgMC4yMTE5CURlbGwgRGltZW5zaW9uIFhQUyBQMTMzYywgUGVudGl1bSAxMzMgTUh6LAoJCQlXaW5kb3dzIDk1LCBNaWNyb3NvZnQgVmlzdWFsIEMgNS4wLgoKICAgIDAuMDg4MyAgICAgMC4yMTY2CVNpbGljb24gR3JhcGhpY3MgSW5kaWdvsiwgTUlQUyBSNDQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgMTc1IE1oeiwgIi1PMyIuCgogICAgMC4wMzUxICAgICAwLjA1NjEJRGVsbCBEaW1lbnNpb24gWFBTIFIxMDAsIFBlbnRpdW0gSUkgNDAwIE1IeiwKCQkJV2luZG93cyA5OCwgTWljcm9zb2Z0IFZpc3VhbCBDIDUuMC4KCiAgICAwLjAzMTIgICAgIDAuMDU0MglTdW4gVWx0cmEgMiwgVWx0cmFTUEFSQyBWOSwgMzAwIE1IeiwgU29sYXJpcwoJCQkyLjUuMS4KCQkJCiAgICAwLjAwODYyICAgIDAuMDEwNzQgIERlbGwgSW5zcGlyb24gOTEwMCwgUGVudGl1bSA0LCAzLjQgR0h6LCBnY2MgLU8zLgoKKi8KCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpZm5kZWYgSU5UUklHCiNpbmNsdWRlIDxtYXRoLmg+CiNlbmRpZgoKI2RlZmluZSBjb3QoeCkgKDEuMCAvIHRhbih4KSkKCiNkZWZpbmUgVFJVRSAgMQojZGVmaW5lIEZBTFNFIDAKCiNkZWZpbmUgbWF4X3N1cmZhY2VzIDEwCgovKiAgTG9jYWwgdmFyaWFibGVzICAqLwoKLyogc3RhdGljIGNoYXIgdGJmclsxMzJdOyAqLwoKc3RhdGljIHNob3J0IGN1cnJlbnRfc3VyZmFjZXM7CnN0YXRpYyBzaG9ydCBwYXJheGlhbDsKCnN0YXRpYyBkb3VibGUgY2xlYXJfYXBlcnR1cmU7CgpzdGF0aWMgZG91YmxlIGFiZXJyX2xzcGhlcjsKc3RhdGljIGRvdWJsZSBhYmVycl9vc2M7CnN0YXRpYyBkb3VibGUgYWJlcnJfbGNocm9tOwoKc3RhdGljIGRvdWJsZSBtYXhfbHNwaGVyOwpzdGF0aWMgZG91YmxlIG1heF9vc2M7CnN0YXRpYyBkb3VibGUgbWF4X2xjaHJvbTsKCnN0YXRpYyBkb3VibGUgcmFkaXVzX29mX2N1cnZhdHVyZTsKc3RhdGljIGRvdWJsZSBvYmplY3RfZGlzdGFuY2U7CnN0YXRpYyBkb3VibGUgcmF5X2hlaWdodDsKc3RhdGljIGRvdWJsZSBheGlzX3Nsb3BlX2FuZ2xlOwpzdGF0aWMgZG91YmxlIGZyb21faW5kZXg7CnN0YXRpYyBkb3VibGUgdG9faW5kZXg7CgpzdGF0aWMgZG91YmxlIHNwZWN0cmFsX2xpbmVbOV07CnN0YXRpYyBkb3VibGUgc1ttYXhfc3VyZmFjZXNdWzVdOwpzdGF0aWMgZG91YmxlIG9kX3NhWzJdWzJdOwoKc3RhdGljIGNoYXIgb3V0YXJyWzhdWzgwXTsJICAgLyogQ29tcHV0ZWQgb3V0cHV0IG9mIHByb2dyYW0gZ29lcyBoZXJlICovCgppbnQgaXRlcmNvdW50OwkJCSAgIC8qIFRoZSBpdGVyYXRpb24gY291bnRlciBmb3IgdGhlIG1haW4gbG9vcAoJCQkJICAgICAgaW4gdGhlIHByb2dyYW0gaXMgbWFkZSBnbG9iYWwgc28gdGhhdAoJCQkJICAgICAgdGhlIGNvbXBpbGVyIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0bwoJCQkJICAgICAgb3B0aW1pc2Ugb3V0IHRoZSBsb29wIG92ZXIgdGhlIHJheQoJCQkJICAgICAgdHJhY2luZyBjb2RlLiAqLwoKI2lmbmRlZiBJVEVSQVRJT05TCiNkZWZpbmUgSVRFUkFUSU9OUyAvKjEwMDAqLyAvKjUwMDAwMCovIDEwMAojZW5kaWYKaW50IG5pdGVyID0gSVRFUkFUSU9OUzsgCSAgIC8qIEl0ZXJhdGlvbiBjb3VudGVyICovCgpzdGF0aWMgY2hhciAqcmVmYXJyW10gPSB7CSAgIC8qIFJlZmVyZW5jZSByZXN1bHRzLiAgVGhlc2UgaGFwcGVuIHRvCgkJCQkgICAgICBiZSBkZXJpdmVkIGZyb20gYSBydW4gb24gTWljcm9zb2Z0IAoJCQkJICAgICAgUXVpY2sgQkFTSUMgb24gdGhlIElCTSBQQy9BVC4gKi8KCiAgICAgICAgIiAgIE1hcmdpbmFsIHJheSAgICAgICAgICA0Ny4wOTQ3OTEyMDkyMCAgIDAuMDQxNzg0NzI2ODMiLAogICAgICAgICIgICBQYXJheGlhbCByYXkgICAgICAgICAgNDcuMDgzNzIxNjAyNDkgICAwLjA0MTc3ODY0ODIxIiwKICAgICAgICAiTG9uZ2l0dWRpbmFsIHNwaGVyaWNhbCBhYmVycmF0aW9uOiAgICAgICAgLTAuMDExMDY5NjA2NzEiLAogICAgICAgICIgICAgKE1heGltdW0gcGVybWlzc2libGUpOiAgICAgICAgICAgICAgICAgMC4wNTMwNjc0OTkwNyIsCiAgICAgICAgIk9mZmVuc2UgYWdhaW5zdCBzaW5lIGNvbmRpdGlvbiAoY29tYSk6ICAgICAwLjAwMDA4OTU0NzYxIiwKICAgICAgICAiICAgIChNYXhpbXVtIHBlcm1pc3NpYmxlKTogICAgICAgICAgICAgICAgIDAuMDAyNTAwMDAwMDAiLAogICAgICAgICJBeGlhbCBjaHJvbWF0aWMgYWJlcnJhdGlvbjogICAgICAgICAgICAgICAgMC4wMDQ0ODIyOTAzMiIsCiAgICAgICAgIiAgICAoTWF4aW11bSBwZXJtaXNzaWJsZSk6ICAgICAgICAgICAgICAgICAwLjA1MzA2NzQ5OTA3Igp9OwoKLyogVGhlCXRlc3QgIGNhc2UgIHVzZWQgIGluICB0aGlzIHByb2dyYW0gaXMgdGhlICBkZXNpZ24gZm9yIGEgNCBpbmNoCiAgIGFjaHJvbWF0aWMgdGVsZXNjb3BlICBvYmplY3RpdmUgIHVzZWQgIGFzICB0aGUgIGV4YW1wbGUgIGluICBXeWxkJ3MKICAgY2xhc3NpYyAgd29yayAgb24gIHJheSAgdHJhY2luZyBieSBoYW5kLCBnaXZlbiBpbiBBbWF0ZXVyIFRlbGVzY29wZQogICBNYWtpbmcsIFZvbHVtZSAzLiAgKi8KCnN0YXRpYyBkb3VibGUgdGVzdGNhc2VbNF1bNF0gPSB7Cgl7MjcuMDUsIDEuNTEzNywgNjMuNiwgMC41Mn0sCgl7LTE2LjY4LCAxLCAwLCAwLjEzOH0sCgl7LTE2LjY4LCAxLjYxNjQsIDM2LjcsIDAuMzh9LAoJey03OC4xLCAxLCAwLCAwfQp9OwoKLyogIEludGVybmFsIHRyaWcgZnVuY3Rpb25zICh1c2VkIG9ubHkgaWYgSU5UUklHIGlzICBkZWZpbmVkKS4JIFRoZXNlCiAgICBzdGFuZGFyZCAgZnVuY3Rpb25zICBtYXkgYmUgZW5hYmxlZCB0byBvYnRhaW4gdGltaW5ncyB0aGF0IHJlZmxlY3QKICAgIHRoZSBtYWNoaW5lJ3MgZmxvYXRpbmcgcG9pbnQgcGVyZm9ybWFuY2UgcmF0aGVyIHRoYW4gdGhlIHNwZWVkICBvZgogICAgaXRzIHRyaWcgZnVuY3Rpb24gZXZhbHVhdGlvbi4gICovCgojaWZkZWYgSU5UUklHCgovKiAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBzaG91bGQga2VlcCB5b3UgZnJvbSBnZXR0aW5nIGludHJvIHRyb3VibGUKICAgIHdpdGggY29tcGlsZXJzIHdoaWNoIGRvbid0IGxldCB5b3UgcmVkZWZpbmUgaW50cmluc2ljIGZ1bmN0aW9ucy4gICovCgojZGVmaW5lIHNpbiBJX3NpbgojZGVmaW5lIGNvcyBJX2NvcwojZGVmaW5lIHRhbiBJX3RhbgojZGVmaW5lIHNxcnQgSV9zcXJ0CiNkZWZpbmUgYXRhbiBJX2F0YW4KI2RlZmluZSBhdGFuMiBJX2F0YW4yCiNkZWZpbmUgYXNpbiBJX2FzaW4KCiNkZWZpbmUgZmFicyh4KSAgKCh4IDwgMC4wKSA/IC14IDogeCkKCiNkZWZpbmUgcGljIDMuMTQxNTkyNjUzNTg5NzkzMgoKLyogIENvbW1vbmx5IHVzZWQgY29uc3RhbnRzICAqLwoKc3RhdGljIGRvdWJsZSBwaSA9IHBpYywKCXR3b3BpID1waWMgKiAyLjAsCglwaW92ZXI0ID0gcGljIC8gNC4wLAoJZm91cm92ZXJwaSA9IDQuMCAvIHBpYywKCXBpb3ZlcjIgPSBwaWMgLyAyLjA7CgovKiAgQ29lZmZpY2llbnRzIGZvciBBVEFOIGV2YWx1YXRpb24gICovCgpzdGF0aWMgZG91YmxlIGF0YW5jW10gPSB7CgkwLjAsCgkwLjQ2MzY0NzYwOTAwMDgwNjExNjUsCgkwLjc4NTM5ODE2MzM5NzQ0ODMwOTQsCgkwLjk4Mjc5MzcyMzI0NzMyOTA2NzE0LAoJMS4xMDcxNDg3MTc3OTQwOTA1MDIyLAoJMS4xOTAyODk5NDk2ODI1MzE3MzIyLAoJMS4yNDkwNDU3NzIzOTgyNTQ0MjYyLAoJMS4yOTI0OTY2Njc3ODk3ODUyNjczLAoJMS4zMjU4MTc2NjM2NjgwMzI0NjQ0Cn07CgovKiAgYWludCh4KQkgIFJldHVybiBpbnRlZ2VyIHBhcnQgb2YgbnVtYmVyLiAgVHJ1bmNhdGVzIHRvd2FyZHMgMAkgKi8KCmRvdWJsZSBhaW50KHgpCmRvdWJsZSB4Owp7Cglsb25nIGw7CgoJLyogIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgY2Fubm90IGhhbmRsZSB0aGUgZnVsbCBmbG9hdGluZyBwb2ludAoJICAgIG51bWJlciByYW5nZS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGluIHRoZSBtYWNoaW5lLWRlcGVuZGVudAoJICAgIGZsb2F0aW5nIHBvaW50IGxpYnJhcnkhICAqLwoKCWwgPSB4OwoJaWYgKChpbnQpKC0wLjUpICE9IDAgICYmICBsIDwgMCApCgkgICBsKys7Cgl4ID0gbDsKCXJldHVybiB4Owp9CgovKiAgc2luKHgpCSAgUmV0dXJuIHNpbmUsIHggaW4gcmFkaWFucyAgKi8KCnN0YXRpYyBkb3VibGUgc2luKHgpCmRvdWJsZSB4Owp7CglpbnQgc2lnbjsKCWRvdWJsZSB5LCByLCB6OwoKCXggPSAoKChzaWduPSAoeCA8IDAuMCkpICE9IDApID8gLXg6IHgpOwoKCWlmICh4ID4gdHdvcGkpCgkgICB4IC09IChhaW50KHggLyB0d29waSkgKiB0d29waSk7CgoJaWYgKHggPiBwaSkgewoJICAgeCAtPSBwaTsKCSAgIHNpZ24gPSAhc2lnbjsKCX0KCglpZiAoeCA+IHBpb3ZlcjIpCgkgICB4ID0gcGkgLSB4OwoKCWlmICh4IDwgcGlvdmVyNCkgewoJICAgeSA9IHggKiBmb3Vyb3ZlcnBpOwoJICAgeiA9IHkgKiB5OwoJICAgciA9IHkgKiAoKCgoKCgoLTAuMjAyMjUzMTI5MjkzRS0xMyAqIHogKyAwLjY5NDgxNTIwMzUwNTIyRS0xMSkgKiB6IC0KCSAgICAgIDAuMTc1NzI0NzQxNzYxNzA4MDZFLTgpICogeiArIDAuMzEzMzYxNjg4OTE3MzI1MzQ4RS02KSAqIHogLQoJICAgICAgMC4zNjU3NjIwNDE4MjE0NjQwMDFFLTQpICogeiArIDAuMjQ5MDM5NDU3MDE5MjcxNjI4RS0yKSAqIHogLQoJICAgICAgMC4wODA3NDU1MTIxODgyODA3ODE1KSAqIHogKyAwLjc4NTM5ODE2MzM5NzQ0ODMxMCk7Cgl9IGVsc2UgewoJICAgeSA9IChwaW92ZXIyIC0geCkgKiBmb3Vyb3ZlcnBpOwoJICAgeiA9IHkgKiB5OwoJICAgciA9ICgoKCgoKC0wLjM4NTc3NjIwMzcyRS0xMiAqIHogKyAwLjExNTAwNDk3MDI0MjYzRS05KSAqIHogLQoJICAgICAgMC4yNDYxMTM2MzgyNjM3MDA1RS03KSAqIHogKyAwLjM1OTA4NjA0NDU4ODU4MTk1M0UtNSkgKiB6IC0KCSAgICAgIDAuMzI1OTkxODg2OTI2Njg3NTUwRS0zKSAqIHogKyAwLjAxNTg1NDM0NDI0MzgxNTQxMDkpICogeiAtCgkgICAgICAwLjMwODQyNTEzNzUzNDA0MjQ1MikgKiB6ICsgMS4wOwoJfQoJcmV0dXJuIHNpZ24gPyAtciA6IHI7Cn0KCi8qICBjb3MoeCkJICBSZXR1cm4gY29zaW5lLCB4IGluIHJhZGlhbnMsIGJ5IGlkZW50aXR5ICAqLwoKc3RhdGljIGRvdWJsZSBjb3MoeCkKZG91YmxlIHg7CnsKCXggPSAoeCA8IDAuMCkgPyAteCA6IHg7CglpZiAoeCA+IHR3b3BpKQkJICAgICAgLyogRG8gcmFuZ2UgcmVkdWN0aW9uIGhlcmUgdG8gbGltaXQgKi8KCSAgIHggPSB4IC0gKGFpbnQoeCAvIHR3b3BpKSAqIHR3b3BpKTsgLyogcm91bmRvZmYgb24gYWRkIG9mIFBJLzIgICAgKi8KCXJldHVybiBzaW4oeCArIHBpb3ZlcjIpOwp9CgovKiAgdGFuKHgpCSAgUmV0dXJuIHRhbmdlbnQsIHggaW4gcmFkaWFucywgYnkgaWRlbnRpdHkgICovCgpzdGF0aWMgZG91YmxlIHRhbih4KQpkb3VibGUgeDsKewoJcmV0dXJuIHNpbih4KSAvIGNvcyh4KTsKfQoKLyogIHNxcnQoeCkJICBSZXR1cm4gc3F1YXJlIHJvb3QuICBJbml0aWFsIGd1ZXNzLCB0aGVuIE5ld3Rvbi0KCQkgIFJhcGhzb24gcmVmaW5lbWVudCAgKi8KCmRvdWJsZSBzcXJ0KHgpCmRvdWJsZSB4Owp7Cglkb3VibGUgYywgY2wsIHk7CglpbnQgbjsKCglpZiAoeCA9PSAwLjApCgkgICByZXR1cm4gMC4wOwoKCWlmICh4IDwgMC4wKSB7CgkgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAiXG5Hb29kIHdvcmshICBZb3UgdHJpZWQgdG8gdGFrZSB0aGUgc3F1YXJlIHJvb3Qgb2YgJWciLAoJICAgICB4KTsKCSAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICJcbnVuZm9ydHVuYXRlbHksIHRoYXQgaXMgdG9vIGNvbXBsZXggZm9yIG1lIHRvIGhhbmRsZS5cbiIpOwoJICAgZXhpdCgxKTsKCX0KCgl5ID0gKDAuMTU0MTE2ICsgMS44OTM4NzIgKiB4KSAvICgxLjAgKyAxLjA0Nzk4OCAqIHgpOwoKCWMgPSAoeSAtIHggLyB5KSAvIDIuMDsKCWNsID0gMC4wOwoJZm9yIChuID0gNTA7IGMgIT0gY2wgJiYgbi0tOykgewoJICAgeSA9IHkgLSBjOwoJICAgY2wgPSBjOwoJICAgYyA9ICh5IC0geCAvIHkpIC8gMi4wOwoJfQoJcmV0dXJuIHk7Cn0KCi8qICBhdGFuKHgpCSAgUmV0dXJuIGFyY3RhbmdlbnQgaW4gcmFkaWFucywKCQkgIHJhbmdlIC1waS8yIHRvIHBpLzIgICovCgpzdGF0aWMgZG91YmxlIGF0YW4oeCkKZG91YmxlIHg7CnsKCWludCBzaWduLCBsLCB5OwoJZG91YmxlIGEsIGIsIHo7CgoJeCA9ICgoKHNpZ24gPSAoeCA8IDAuMCkpICE9IDApID8gLXggOiB4KTsKCWwgPSAwOwoKCWlmICh4ID49IDQuMCkgewoJICAgbCA9IC0xOwoJICAgeCA9IDEuMCAvIHg7CgkgICB5ID0gMDsKCSAgIGdvdG8gYXRsOwoJfSBlbHNlIHsKCSAgIGlmICh4IDwgMC4yNSkgewoJICAgICAgeSA9IDA7CgkgICAgICBnb3RvIGF0bDsKCSAgIH0KCX0KCgl5ID0gYWludCh4IC8gMC41KTsKCXogPSB5ICogMC41OwoJeCA9ICh4IC0geikgLyAoeCAqIHogKyAxKTsKCmF0bDoKCXogPSB4ICogeDsKCWIgPSAoKCgoODkzMDI1LjAgKiB6ICsgNDkxMTYzNzUuMCkgKiB6ICsgNDI1Njc1MjUwLjApICogeiArCgkgICAgMTI3NzAyNTc1MC4wKSAqIHogKyAxNTUwNjc0MTI1LjApICogeiArIDY1NDcyOTA3NS4wOwoJYSA9ICgoKDEzODUyNTc1LjAgKiB6ICsgMjE2NjAyMTAwLjApICogeiArIDg5MTA4MDE5MC4wKSAqIHogKwoJICAgIDEzMzI0MzExMDAuMCkgKiB6ICsgNjU0NzI5MDc1LjA7CglhID0gKGEgLyBiKSAqIHggKyBhdGFuY1t5XTsKCWlmIChsKQoJICAgYT1waW92ZXIyIC0gYTsKCXJldHVybiBzaWduID8gLWEgOiBhOwp9CgovKiAgYXRhbjIoeSx4KQkgIFJldHVybiBhcmN0YW5nZW50IGluIHJhZGlhbnMgb2YgeS94LAoJCSAgcmFuZ2UgLXBpIHRvIHBpICAqLwoKc3RhdGljIGRvdWJsZSBhdGFuMih5LCB4KQpkb3VibGUgeSwgeDsKewoJZG91YmxlIHRlbXA7CgoJaWYgKHggPT0gMC4wKSB7CgkgICBpZiAoeSA9PSAwLjApICAgLyogIFNwZWNpYWwgY2FzZTogYXRhbjIoMCwwKSA9IDAgICovCgkgICAgICByZXR1cm4gMC4wOwoJICAgZWxzZSBpZiAoeSA+IDApCgkgICAgICByZXR1cm4gcGlvdmVyMjsKCSAgIGVsc2UKCSAgICAgIHJldHVybiAtcGlvdmVyMjsKCX0KCXRlbXAgPSBhdGFuKHkgLyB4KTsKCWlmICh4IDwgMC4wKSB7CgkgICBpZiAoeSA+PSAwLjApCgkgICAgICB0ZW1wICs9IHBpYzsKCSAgIGVsc2UKCSAgICAgIHRlbXAgLT0gcGljOwoJfQoJcmV0dXJuIHRlbXA7Cn0KCi8qICBhc2luKHgpCSAgUmV0dXJuIGFyY3NpbmUgaW4gcmFkaWFucyBvZiB4ICAqLwoKc3RhdGljIGRvdWJsZSBhc2luKHgpCmRvdWJsZSB4Owp7CglpZiAoZmFicyh4KT4xLjApIHsKCSAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICJcbkludmVyc2UgdHJpZyBmdW5jdGlvbnMgbG9zZSBtdWNoIG9mIHRoZWlyIGdsb3NzIHdoZW4iKTsKCSAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICJcbnRoZWlyIGFyZ3VtZW50cyBhcmUgZ3JlYXRlciB0aGFuIDEsIHN1Y2ggYXMgdGhlIik7CgkgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAiXG52YWx1ZSAlZyB5b3UgcGFzc2VkLlxuIiwgeCk7CgkgICBleGl0KDEpOwoJfQoJcmV0dXJuIGF0YW4yKHgsIHNxcnQoMSAtIHggKiB4KSk7Cn0KI2VuZGlmCgovKgkgICAgICBDYWxjdWxhdGUgcGFzc2FnZSB0aHJvdWdoIHN1cmZhY2UKCgkgICAgICBJZiAgdGhlIHZhcmlhYmxlIFBBUkFYSUFMIGlzIHRydWUsIHRoZSB0cmFjZSB0aHJvdWdoIHRoZQoJICAgICAgc3VyZmFjZSB3aWxsIGJlIGRvbmUgdXNpbmcgdGhlIHBhcmF4aWFsICBhcHByb3hpbWF0aW9ucy4KCSAgICAgIE90aGVyd2lzZSwgIHRoZSBub3JtYWwgdHJpZ29ub21ldHJpYyB0cmFjZSB3aWxsIGJlIGRvbmUuCgoJICAgICAgVGhpcyByb3V0aW5lIHRha2VzIHRoZSBmb2xsb3dpbmcgaW5wdXRzOgoKCSAgICAgIFJBRElVU19PRl9DVVJWQVRVUkUJICBSYWRpdXMgb2YgY3VydmF0dXJlIG9mIHN1cmZhY2UKCQkJCQkgIGJlaW5nIGNyb3NzZWQuICBJZiAwLCBzdXJmYWNlIGlzCgkJCQkJICBwbGFuZS4KCgkgICAgICBPQkpFQ1RfRElTVEFOQ0UJCSAgRGlzdGFuY2Ugb2Ygb2JqZWN0IGZvY3VzIGZyb20KCQkJCQkgIGxlbnMgdmVydGV4LglJZiAwLCBpbmNvbWluZwoJCQkJCSAgcmF5cyBhcmUgcGFyYWxsZWwgYW5kCgkJCQkJICB0aGUgZm9sbG93aW5nIG11c3QgYmUgc3BlY2lmaWVkOgoKCSAgICAgIFJBWV9IRUlHSFQJCSAgSGVpZ2h0IG9mIHJheSBmcm9tIGF4aXMuICBPbmx5CgkJCQkJICByZWxldmFudCBpZiBPQkpFQ1QuRElTVEFOQ0UgPT0gMAoKCSAgICAgIEFYSVNfU0xPUEVfQU5HTEUJCSAgQW5nbGUgaW5jb21pbmcgcmF5IG1ha2VzIHdpdGggYXhpcwoJCQkJCSAgYXQgaW50ZXJjZXB0CgoJICAgICAgRlJPTV9JTkRFWAkJICBSZWZyYWN0aXZlIGluZGV4IG9mIG1lZGl1bSBiZWluZyBsZWZ0CgoJICAgICAgVE9fSU5ERVgJCQkgIFJlZnJhY3RpdmUgaW5kZXggb2YgbWVkaXVtIGJlaW5nCgkJCQkJICBlbnRlcmVkLgoKCSAgICAgIFRoZSBvdXRwdXRzIGFyZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKCgkgICAgICBPQkpFQ1RfRElTVEFOQ0UJCSAgRGlzdGFuY2UgZnJvbSB2ZXJ0ZXggdG8gb2JqZWN0IGZvY3VzCgkJCQkJICBhZnRlciByZWZyYWN0aW9uLgoKCSAgICAgIEFYSVNfU0xPUEVfQU5HTEUJCSAgQW5nbGUgaW5jb21pbmcgcmF5IG1ha2VzIHdpdGggYXhpcwoJCQkJCSAgYXQgaW50ZXJjZXB0IGFmdGVyIHJlZnJhY3Rpb24uCgoqLwoKc3RhdGljIHZvaWQgdHJhbnNpdF9zdXJmYWNlKCkgewoJZG91YmxlIGlhbmcsCQkgICAvKiBJbmNpZGVuY2UgYW5nbGUgKi8KCSAgICAgICByYW5nLAkJICAgLyogUmVmcmFjdGlvbiBhbmdsZSAqLwoJICAgICAgIGlhbmdfc2luLAkgICAvKiBJbmNpZGVuY2UgYW5nbGUgc2luICovCgkgICAgICAgcmFuZ19zaW4sCSAgIC8qIFJlZnJhY3Rpb24gYW5nbGUgc2luICovCgkgICAgICAgb2xkX2F4aXNfc2xvcGVfYW5nbGUsIHNhZ2l0dGE7CgoJaWYgKHBhcmF4aWFsKSB7CgkgICBpZiAocmFkaXVzX29mX2N1cnZhdHVyZSAhPSAwLjApIHsKCSAgICAgIGlmIChvYmplY3RfZGlzdGFuY2UgPT0gMC4wKSB7CgkJIGF4aXNfc2xvcGVfYW5nbGUgPSAwLjA7CgkJIGlhbmdfc2luID0gcmF5X2hlaWdodCAvIHJhZGl1c19vZl9jdXJ2YXR1cmU7CgkgICAgICB9IGVsc2UKCQkgaWFuZ19zaW4gPSAoKG9iamVjdF9kaXN0YW5jZSAtCgkJICAgIHJhZGl1c19vZl9jdXJ2YXR1cmUpIC8gcmFkaXVzX29mX2N1cnZhdHVyZSkgKgoJCSAgICBheGlzX3Nsb3BlX2FuZ2xlOwoKCSAgICAgIHJhbmdfc2luID0gKGZyb21faW5kZXggLyB0b19pbmRleCkgKgoJCSBpYW5nX3NpbjsKCSAgICAgIG9sZF9heGlzX3Nsb3BlX2FuZ2xlID0gYXhpc19zbG9wZV9hbmdsZTsKCSAgICAgIGF4aXNfc2xvcGVfYW5nbGUgPSBheGlzX3Nsb3BlX2FuZ2xlICsKCQkgaWFuZ19zaW4gLSByYW5nX3NpbjsKCSAgICAgIGlmIChvYmplY3RfZGlzdGFuY2UgIT0gMC4wKQoJCSByYXlfaGVpZ2h0ID0gb2JqZWN0X2Rpc3RhbmNlICogb2xkX2F4aXNfc2xvcGVfYW5nbGU7CgkgICAgICBvYmplY3RfZGlzdGFuY2UgPSByYXlfaGVpZ2h0IC8gYXhpc19zbG9wZV9hbmdsZTsKCSAgICAgIHJldHVybjsKCSAgIH0KCSAgIG9iamVjdF9kaXN0YW5jZSA9IG9iamVjdF9kaXN0YW5jZSAqICh0b19pbmRleCAvIGZyb21faW5kZXgpOwoJICAgYXhpc19zbG9wZV9hbmdsZSA9IGF4aXNfc2xvcGVfYW5nbGUgKiAoZnJvbV9pbmRleCAvIHRvX2luZGV4KTsKCSAgIHJldHVybjsKCX0KCglpZiAocmFkaXVzX29mX2N1cnZhdHVyZSAhPSAwLjApIHsKCSAgIGlmIChvYmplY3RfZGlzdGFuY2UgPT0gMC4wKSB7CgkgICAgICBheGlzX3Nsb3BlX2FuZ2xlID0gMC4wOwoJICAgICAgaWFuZ19zaW4gPSByYXlfaGVpZ2h0IC8gcmFkaXVzX29mX2N1cnZhdHVyZTsKCSAgIH0gZWxzZSB7CgkgICAgICBpYW5nX3NpbiA9ICgob2JqZWN0X2Rpc3RhbmNlIC0KCQkgcmFkaXVzX29mX2N1cnZhdHVyZSkgLyByYWRpdXNfb2ZfY3VydmF0dXJlKSAqCgkJIHNpbihheGlzX3Nsb3BlX2FuZ2xlKTsKCSAgIH0KCSAgIGlhbmcgPSBhc2luKGlhbmdfc2luKTsKCSAgIHJhbmdfc2luID0gKGZyb21faW5kZXggLyB0b19pbmRleCkgKgoJICAgICAgaWFuZ19zaW47CgkgICBvbGRfYXhpc19zbG9wZV9hbmdsZSA9IGF4aXNfc2xvcGVfYW5nbGU7CgkgICBheGlzX3Nsb3BlX2FuZ2xlID0gYXhpc19zbG9wZV9hbmdsZSArCgkgICAgICBpYW5nIC0gYXNpbihyYW5nX3Npbik7CgkgICBzYWdpdHRhID0gc2luKChvbGRfYXhpc19zbG9wZV9hbmdsZSArIGlhbmcpIC8gMi4wKTsKCSAgIHNhZ2l0dGEgPSAyLjAgKiByYWRpdXNfb2ZfY3VydmF0dXJlKnNhZ2l0dGEqc2FnaXR0YTsKCSAgIG9iamVjdF9kaXN0YW5jZSA9ICgocmFkaXVzX29mX2N1cnZhdHVyZSAqIHNpbigKCSAgICAgIG9sZF9heGlzX3Nsb3BlX2FuZ2xlICsgaWFuZykpICoKCSAgICAgIGNvdChheGlzX3Nsb3BlX2FuZ2xlKSkgKyBzYWdpdHRhOwoJICAgcmV0dXJuOwoJfQoKCXJhbmcgPSAtYXNpbigoZnJvbV9pbmRleCAvIHRvX2luZGV4KSAqCgkgICBzaW4oYXhpc19zbG9wZV9hbmdsZSkpOwoJb2JqZWN0X2Rpc3RhbmNlID0gb2JqZWN0X2Rpc3RhbmNlICogKCh0b19pbmRleCAqCgkgICBjb3MoLXJhbmcpKSAvIChmcm9tX2luZGV4ICoKCSAgIGNvcyhheGlzX3Nsb3BlX2FuZ2xlKSkpOwoJYXhpc19zbG9wZV9hbmdsZSA9IC1yYW5nOwp9CgovKiAgUGVyZm9ybSByYXkgdHJhY2UgaW4gc3BlY2lmaWMgc3BlY3RyYWwgbGluZSAgKi8KCnN0YXRpYyB2b2lkIHRyYWNlX2xpbmUobGluZSwgcmF5X2gpCmludCBsaW5lOwpkb3VibGUgcmF5X2g7CnsKCWludCBpOwoKCW9iamVjdF9kaXN0YW5jZSA9IDAuMDsKCXJheV9oZWlnaHQgPSByYXlfaDsKCWZyb21faW5kZXggPSAxLjA7CgoJZm9yIChpID0gMTsgaSA8PSBjdXJyZW50X3N1cmZhY2VzOyBpKyspIHsKCSAgIHJhZGl1c19vZl9jdXJ2YXR1cmUgPSBzW2ldWzFdOwoJICAgdG9faW5kZXggPSBzW2ldWzJdOwoJICAgaWYgKHRvX2luZGV4ID4gMS4wKQoJICAgICAgdG9faW5kZXggPSB0b19pbmRleCArICgoc3BlY3RyYWxfbGluZVs0XSAtCgkJIHNwZWN0cmFsX2xpbmVbbGluZV0pIC8KCQkgKHNwZWN0cmFsX2xpbmVbM10gLSBzcGVjdHJhbF9saW5lWzZdKSkgKiAoKHNbaV1bMl0gLSAxLjApIC8KCQkgc1tpXVszXSk7CgkgICB0cmFuc2l0X3N1cmZhY2UoKTsKCSAgIGZyb21faW5kZXggPSB0b19pbmRleDsKCSAgIGlmIChpIDwgY3VycmVudF9zdXJmYWNlcykKCSAgICAgIG9iamVjdF9kaXN0YW5jZSA9IG9iamVjdF9kaXN0YW5jZSAtIHNbaV1bNF07Cgl9Cn0KCi8qICBJbml0aWFsaXNlIHdoZW4gY2FsbGVkIHRoZSBmaXJzdCB0aW1lICAqLwoKaW50IG1haW4oYXJnYywgYXJndikKaW50IGFyZ2M7CmNoYXIgKmFyZ3ZbXTsKewoJaW50IGksIGosIGssIGVycm9yczsKCWRvdWJsZSBvZF9mbGluZSwgb2RfY2xpbmU7CiNpZmRlZiBBQ0NVUkFDWQoJbG9uZyBwYXNzZXM7CiNlbmRpZgoKCXNwZWN0cmFsX2xpbmVbMV0gPSA3NjIxLjA7CSAvKiBBICovCglzcGVjdHJhbF9saW5lWzJdID0gNjg2OS45NTU7CSAvKiBCICovCglzcGVjdHJhbF9saW5lWzNdID0gNjU2Mi44MTY7CSAvKiBDICovCglzcGVjdHJhbF9saW5lWzRdID0gNTg5NS45NDQ7CSAvKiBEICovCglzcGVjdHJhbF9saW5lWzVdID0gNTI2OS41NTc7CSAvKiBFICovCglzcGVjdHJhbF9saW5lWzZdID0gNDg2MS4zNDQ7CSAvKiBGICovCiAgICAgICAgc3BlY3RyYWxfbGluZVs3XSA9IDQzNDAuNDc3OyAgICAgLyogRycqLwoJc3BlY3RyYWxfbGluZVs4XSA9IDM5NjguNDk0OwkgLyogSCAqLwoKCS8qIFByb2Nlc3MgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIGFyZ3VtZW50LCBpZiBvbmUgaXMgc3VwcGxpZWQuICovCgoJaWYgKGFyZ2MgPiAxKSB7CgkgICBuaXRlciA9IGF0b2koYXJndlsxXSk7CiAgICAgICAgICAgaWYgKCphcmd2WzFdID09ICctJyB8fCBuaXRlciA8IDEpIHsKICAgICAgICAgICAgICBwcmludGYoIlRoaXMgaXMgSm9obiBXYWxrZXIncyBmbG9hdGluZyBwb2ludCBhY2N1cmFjeSBhbmRcbiIpOwogICAgICAgICAgICAgIHByaW50ZigicGVyZm9ybWFuY2UgYmVuY2htYXJrIHByb2dyYW0uICBZb3UgY2FsbCBpdCB3aXRoXG4iKTsKICAgICAgICAgICAgICBwcmludGYoIlxuZmJlbmNoIDxpdGVyY291bnQ+XG5cbiIpOwogICAgICAgICAgICAgIHByaW50Zigid2hlcmUgPGl0ZXJjb3VudD4gaXMgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zXG4iKTsKICAgICAgICAgICAgICBwcmludGYoInRvIGJlIGV4ZWN1dGVkLiAgQXJjaGl2YWwgdGltaW5ncyBzaG91bGQgYmUgbWFkZVxuIik7CiAgICAgICAgICAgICAgcHJpbnRmKCJ3aXRoIHRoZSBpdGVyYXRpb24gY291bnQgc2V0IHNvIHRoYXQgcm91Z2hseSBmaXZlXG4iKTsKICAgICAgICAgICAgICBwcmludGYoIm1pbnV0ZXMgb2YgZXhlY3V0aW9uIGlzIHRpbWVkLlxuIik7CgkgICAgICBleGl0KDApOwoJICAgfQoJfQoKCS8qIExvYWQgdGVzdCBjYXNlIGludG8gd29ya2luZyBhcnJheSAqLwoKCWNsZWFyX2FwZXJ0dXJlID0gNC4wOwoJY3VycmVudF9zdXJmYWNlcyA9IDQ7Cglmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9zdXJmYWNlczsgaSsrKQoJICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKCSAgICAgIHNbaSArIDFdW2ogKyAxXSA9IHRlc3RjYXNlW2ldW2pdOwoKI2lmZGVmIEFDQ1VSQUNZCiAgICAgICAgcHJpbnRmKCJCZWdpbm5pbmcgZXhlY3V0aW9uIG9mIGZsb2F0aW5nIHBvaW50IGFjY3VyYWN5IHRlc3QuLi5cbiIpOwoJcGFzc2VzID0gMDsKI2Vsc2UKICAgICAgICBwcmludGYoIlJlYWR5IHRvIGJlZ2luIEpvaG4gV2Fsa2VyJ3MgZmxvYXRpbmcgcG9pbnQgYWNjdXJhY3lcbiIpOwogICAgICAgIHByaW50ZigiYW5kIHBlcmZvcm1hbmNlIGJlbmNobWFyay4gICVkIGl0ZXJhdGlvbnMgd2lsbCBiZSBtYWRlLlxuXG4iLAoJICAgbml0ZXIpOwoKICAgICAgICBwcmludGYoIlxuTWVhc3VyZWQgcnVuIHRpbWUgaW4gc2Vjb25kcyBzaG91bGQgYmUgZGl2aWRlZCBieSAlLmZcbiIsIG5pdGVyIC8gMTAwMC4wKTsKICAgICAgICBwcmludGYoInRvIG5vcm1hbGlzZSBmb3IgcmVwb3J0aW5nIHJlc3VsdHMuICBGb3IgYXJjaGl2YWwgcmVzdWx0cyxcbiIpOwogICAgICAgIHByaW50ZigiYWRqdXN0IGl0ZXJhdGlvbiBjb3VudCBzbyB0aGUgYmVuY2htYXJrIHJ1bnMgYWJvdXQgZml2ZSBtaW51dGVzLlxuXG4iKTsKCiAgICAgICAgLy9wcmludGYoIlByZXNzIHJldHVybiB0byBiZWdpbiBiZW5jaG1hcms6Iik7CgkvL2dldHModGJmcik7CiNlbmRpZgoKCS8qIFBlcmZvcm0gcmF5IHRyYWNlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpbWVzLiAqLwoKI2lmZGVmIEFDQ1VSQUNZCgl3aGlsZSAoVFJVRSkgewoJICAgcGFzc2VzKys7CgkgICBpZiAoKHBhc3NlcyAlIDEwMEwpID09IDApIHsKICAgICAgICAgICAgICBwcmludGYoIlBhc3MgJWxkLlxuIiwgcGFzc2VzKTsKCSAgIH0KI2Vsc2UKCWZvciAoaXRlcmNvdW50ID0gMDsgaXRlcmNvdW50IDwgbml0ZXI7IGl0ZXJjb3VudCsrKSB7CiNlbmRpZgoKCSAgIGZvciAocGFyYXhpYWwgPSAwOyBwYXJheGlhbCA8PSAxOyBwYXJheGlhbCsrKSB7CgoJICAgICAgLyogRG8gbWFpbiB0cmFjZSBpbiBEIGxpZ2h0ICovCgoJICAgICAgdHJhY2VfbGluZSg0LCBjbGVhcl9hcGVydHVyZSAvIDIuMCk7CgkgICAgICBvZF9zYVtwYXJheGlhbF1bMF0gPSBvYmplY3RfZGlzdGFuY2U7CgkgICAgICBvZF9zYVtwYXJheGlhbF1bMV0gPSBheGlzX3Nsb3BlX2FuZ2xlOwoJICAgfQoJICAgcGFyYXhpYWwgPSBGQUxTRTsKCgkgICAvKiBUcmFjZSBtYXJnaW5hbCByYXkgaW4gQyAqLwoKCSAgIHRyYWNlX2xpbmUoMywgY2xlYXJfYXBlcnR1cmUgLyAyLjApOwoJICAgb2RfY2xpbmUgPSBvYmplY3RfZGlzdGFuY2U7CgoJICAgLyogVHJhY2UgbWFyZ2luYWwgcmF5IGluIEYgKi8KCgkgICB0cmFjZV9saW5lKDYsIGNsZWFyX2FwZXJ0dXJlIC8gMi4wKTsKCSAgIG9kX2ZsaW5lID0gb2JqZWN0X2Rpc3RhbmNlOwoKCSAgIGFiZXJyX2xzcGhlciA9IG9kX3NhWzFdWzBdIC0gb2Rfc2FbMF1bMF07CgkgICBhYmVycl9vc2MgPSAxLjAgLSAob2Rfc2FbMV1bMF0gKiBvZF9zYVsxXVsxXSkgLwoJICAgICAgKHNpbihvZF9zYVswXVsxXSkgKiBvZF9zYVswXVswXSk7CgkgICBhYmVycl9sY2hyb20gPSBvZF9mbGluZSAtIG9kX2NsaW5lOwoJICAgbWF4X2xzcGhlciA9IHNpbihvZF9zYVswXVsxXSk7CgoJICAgLyogRCBsaWdodCAqLwoKCSAgIG1heF9sc3BoZXIgPSAwLjAwMDA5MjYgLyAobWF4X2xzcGhlciAqIG1heF9sc3BoZXIpOwoJICAgbWF4X29zYyA9IDAuMDAyNTsKCSAgIG1heF9sY2hyb20gPSBtYXhfbHNwaGVyOwojaWZuZGVmIEFDQ1VSQUNZCgl9CgogICAgICAgIC8vcHJpbnRmKCJTdG9wIHRoZSB0aW1lcjpcMDA3Iik7CgkvL2dldHModGJmcik7CiNlbmRpZgoKCS8qIE5vdyBldmFsdWF0ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIHJlc3VsdHMgZnJvbSB0aGUgbGFzdCByYXkgdHJhY2UgKi8KCiAgICAgICAgc3ByaW50ZihvdXRhcnJbMF0sICIlMTVzICAgJTIxLjExZiAgJTE0LjExZiIsCiAgICAgICAgICAgIk1hcmdpbmFsIHJheSIsIG9kX3NhWzBdWzBdLCBvZF9zYVswXVsxXSk7CiAgICAgICAgc3ByaW50ZihvdXRhcnJbMV0sICIlMTVzICAgJTIxLjExZiAgJTE0LjExZiIsCiAgICAgICAgICAgIlBhcmF4aWFsIHJheSIsIG9kX3NhWzFdWzBdLCBvZF9zYVsxXVsxXSk7CglzcHJpbnRmKG91dGFyclsyXSwKICAgICAgICAgICAiTG9uZ2l0dWRpbmFsIHNwaGVyaWNhbCBhYmVycmF0aW9uOiAgICAgICUxNi4xMWYiLAoJICAgYWJlcnJfbHNwaGVyKTsKCXNwcmludGYob3V0YXJyWzNdLAogICAgICAgICAgICIgICAgKE1heGltdW0gcGVybWlzc2libGUpOiAgICAgICAgICAgICAgJTE2LjExZiIsCgkgICBtYXhfbHNwaGVyKTsKCXNwcmludGYob3V0YXJyWzRdLAogICAgICAgICAgICJPZmZlbnNlIGFnYWluc3Qgc2luZSBjb25kaXRpb24gKGNvbWEpOiAgJTE2LjExZiIsCgkgICBhYmVycl9vc2MpOwoJc3ByaW50ZihvdXRhcnJbNV0sCiAgICAgICAgICAgIiAgICAoTWF4aW11bSBwZXJtaXNzaWJsZSk6ICAgICAgICAgICAgICAlMTYuMTFmIiwKCSAgIG1heF9vc2MpOwoJc3ByaW50ZihvdXRhcnJbNl0sCiAgICAgICAgICAgIkF4aWFsIGNocm9tYXRpYyBhYmVycmF0aW9uOiAgICAgICAgICAgICAlMTYuMTFmIiwKCSAgIGFiZXJyX2xjaHJvbSk7CglzcHJpbnRmKG91dGFycls3XSwKICAgICAgICAgICAiICAgIChNYXhpbXVtIHBlcm1pc3NpYmxlKTogICAgICAgICAgICAgICUxNi4xMWYiLAoJICAgbWF4X2xjaHJvbSk7CgoJLyogTm93IGNvbXBhcmUgdGhlIGVkaXRlZCByZXN1bHRzIHdpdGggdGhlIG1hc3RlciB2YWx1ZXMgZnJvbQoJICAgcmVmZXJlbmNlIGV4ZWN1dGlvbnMgb2YgdGhpcyBwcm9ncmFtLiAqLwoKCWVycm9ycyA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkgICBpZiAoc3RyY21wKG91dGFycltpXSwgcmVmYXJyW2ldKSAhPSAwKSB7CiNpZmRlZiBBQ0NVUkFDWQogICAgICAgICAgICAgIHByaW50ZigiXG5FcnJvciBpbiBwYXNzICVsZCBmb3IgcmVzdWx0cyBvbiBsaW5lICVkLi4uXG4iLAoJCSAgICAgcGFzc2VzLCBpICsgMSk7CiNlbHNlCiAgICAgICAgICAgICAgcHJpbnRmKCJcbkVycm9yIGluIHJlc3VsdHMgb24gbGluZSAlZC4uLlxuIiwgaSArIDEpOwojZW5kaWYKICAgICAgICAgICAgICBwcmludGYoIkV4cGVjdGVkOiAgXCIlc1wiXG4iLCByZWZhcnJbaV0pOwogICAgICAgICAgICAgIHByaW50ZigiUmVjZWl2ZWQ6ICBcIiVzXCJcbiIsIG91dGFycltpXSk7CiAgICAgICAgICAgICAgcHJpbnRmKCIoRXJyb3JzKSAgICAiKTsKCSAgICAgIGsgPSBzdHJsZW4ocmVmYXJyW2ldKTsKCSAgICAgIGZvciAoaiA9IDA7IGogPCBrOyBqKyspIHsKICAgICAgICAgICAgICAgICBwcmludGYoIiVjIiwgcmVmYXJyW2ldW2pdID09IG91dGFycltpXVtqXSA/ICcgJyA6ICdeJyk7CgkJIGlmIChyZWZhcnJbaV1bal0gIT0gb3V0YXJyW2ldW2pdKQoJCSAgICBlcnJvcnMrKzsKCSAgICAgIH0KICAgICAgICAgICAgICBwcmludGYoIlxuIik7CgkgICB9Cgl9CiNpZmRlZiBBQ0NVUkFDWQoJfQojZWxzZQoJaWYgKGVycm9ycyA+IDApIHsKICAgICAgICAgICBwcmludGYoIlxuJWQgZXJyb3IlcyBpbiByZXN1bHRzLiAgVGhpcyBpcyBWRVJZIFNFUklPVVMuXG4iLAogICAgICAgICAgICAgIGVycm9ycywgZXJyb3JzID4gMSA/ICJzIiA6ICIiKTsKCX0gZWxzZQogICAgICAgICAgIHByaW50ZigiXG5ObyBlcnJvcnMgaW4gcmVzdWx0cy5cbiIpOwojZW5kaWYKCXJldHVybiAwOwp9Cg==