LyoKICAgICBGaWxlOiAgICAgICBBc3NlcnRNYWNyb3MuaAogCiAgICAgQ29udGFpbnM6ICAgVGhpcyBmaWxlIGRlZmluZXMgc3RydWN0dXJlZCBlcnJvciBoYW5kbGluZyBhbmQgYXNzZXJ0aW9uIG1hY3JvcyBmb3IKICAgICAgICAgICAgICAgICBwcm9ncmFtbWluZyBpbiBDLiBPcmlnaW5hbGx5IHVzZWQgaW4gUXVpY2tEcmF3IEdYIGFuZCBsYXRlciBlbmhhbmNlZC4KICAgICAgICAgICAgICAgICBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdGhyb3VnaG91dCBBcHBsZSdzIHNvZnR3YXJlLgoKICAgICAgICAgICAgICAgICBTZWUgIkxpdmluZyBJbiBhbiBFeGNlcHRpb25hbCBXb3JsZCIgYnkgU2VhbiBQYXJlbnQKICAgICAgICAgICAgICAgICAoZGV2ZWxvcCwgVGhlIEFwcGxlIFRlY2huaWNhbCBKb3VybmFsLCBJc3N1ZSAxMSwgQXVndXN0L1NlcHRlbWJlciAxOTkyKQogICAgICAgICAgICAgICAgIDxodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kZXYvdGVjaHN1cHBvcnQvZGV2ZWxvcC9pc3N1ZTExdG9jLnNodG1sPgogICAgICAgICAgICAgICAgIGZvciB0aGUgbWV0aG9kb2xvZ3kgYmVoaW5kIHRoZXNlIGVycm9yIGhhbmRsaW5nIGFuZCBhc3NlcnRpb24gbWFjcm9zLgoKICAgICBDb3B5cmlnaHQ6ICCpIDIwMDIgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgCiAgICAgQnVncz86ICAgICAgRm9yIGJ1ZyByZXBvcnRzLCBjb25zdWx0IHRoZSBmb2xsb3dpbmcgcGFnZSBvbgogICAgICAgICAgICAgICAgIHRoZSBXb3JsZCBXaWRlIFdlYjoKIAogICAgICAgICAgICAgICAgICAgICBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9idWdyZXBvcnRlci8gCiovCiNpZm5kZWYgX19BU1NFUlRNQUNST1NfXwojZGVmaW5lIF9fQVNTRVJUTUFDUk9TX18KCgovKgogKiAgTWFjcm8gb3ZlcnZpZXc6CiAqICAKICogICAgICBjaGVjayhhc3NlcnRpb24pCiAqICAgICAgICAgSW4gcHJvZHVjdGlvbiBidWlsZHMsIHByZS1wcm9jZXNzZWQgYXdheSAgCiAqICAgICAgICAgSW4gZGVidWcgYnVpbGRzLCBpZiBhc3NlcnRpb24gZXZhbHVhdGVzIHRvIGZhbHNlLCBjYWxscyBERUJVR19BU1NFUlRfTUVTU0FHRQogKiAgCiAqICAgICAgdmVyaWZ5KGFzc2VydGlvbikKICogICAgICAgICBJbiBwcm9kdWN0aW9uIGJ1aWxkcywgZXZhbHVhdGVzIGFzc2VydGlvbiBhbmQgZG9lcyBub3RoaW5nCiAqICAgICAgICAgSW4gZGVidWcgYnVpbGRzLCBpZiBhc3NlcnRpb24gZXZhbHVhdGVzIHRvIGZhbHNlLCBjYWxscyBERUJVR19BU1NFUlRfTUVTU0FHRQogKiAgCiAqICAgICAgcmVxdWlyZShhc3NlcnRpb24sIGV4Y2VwdGlvbkxhYmVsKQogKiAgICAgICAgIEluIHByb2R1Y3Rpb24gYnVpbGRzLCBpZiB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLCBnb3RvIGV4Y2VwdGlvbkxhYmVsCiAqICAgICAgICAgSW4gZGVidWcgYnVpbGRzLCBpZiB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLCBjYWxscyBERUJVR19BU1NFUlRfTUVTU0FHRQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGp1bXBzIHRvIGV4Y2VwdGlvbkxhYmVsCiAqICAKICogICAgICBJbiBhZGRpdGlvbiB0aGUgZm9sbG93aW5nIHN1ZmZpeGVzIGFyZSBhdmFpbGFibGU6CiAqIAogKiAgICAgICAgIF9ub2VyciAgICAgQWRkcyAiIT0gMCIgdG8gYXNzZXJ0aW9uLiAgVXNlZnVsIGZvciBhc3NlcnRpbmcgYW5kIE9TU3RhdHVzIG9yIE9TRXJyIGlzIG5vRXJyICh6ZXJvKQogKiAgICAgICAgIF9hY3Rpb24gICAgQWRkcyBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0dWVkIGlmIGFzc2VydGlvbiBmYWlscwogKiAgICAgICAgIF9xdWlldCAgICAgU3VwcHJlc3MgY2FsbCB0byBERUJVR19BU1NFUlRfTUVTU0FHRQogKiAgICAgICAgIF9zdHJpbmcgICAgQWxsb3dzIHlvdSB0byBhZGQgZXhwbGFuaXRvcnkgbWVzc2FnZSB0byBERUJVR19BU1NFUlRfTUVTU0FHRQogKiAgCiAqICAgICAgICBGb3IgaW5zdGFuY2UsIHJlcXVpcmVfbm9lcnJfc3RyaW5nKHJlc3VsdENvZGUsIGxhYmVsLCBtc2cpIHdpbGwgZG8gbm90aGluZyBpZiAKICogICAgICAgIHJlc3VsdENvZGUgaXMgemVybywgb3RoZXJ3aXNlIGl0IHdpbGwgY2FsbCBERUJVR19BU1NFUlRfTUVTU0FHRSB3aXRoIG1zZwogKiAgICAgICAgYW5kIGp1bXAgdG8gbGFiZWwuCiAqCiAqICBDb25maWd1cmF0aW9uOgogKgogKiAgICAgIEJ5IGRlZmF1bHQgYWxsIG1hY3JvcyBnZW5lcmF0ZSAicHJvZHVjdGlvbiBjb2RlIiAoaS5lIG5vbi1kZWJ1ZykuICBJZiAgCiAqICAgICAgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERSBpcyBkZWZpbmVkIHRvIHplcm8gb3IgREVCVUcgaXMgZGVmaW5lZCB0byBub24temVybwogKiAgICAgIHdoaWxlIHRoaXMgaGVhZGVyIGlzIGluY2x1ZGVkLCB0aGUgbWFjcm9zIHdpbGwgZ2VuZXJhdGVkIGRlYnVnIGNvZGUuCiAqCiAqICAgICAgSWYgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORyBpcyBkZWZpbmVkLCBhbGwgZGVidWcgbWVzc2FnZXMgd2lsbAogKiAgICAgIGJlIHByZWZpeGVkIHdpdGggaXQuCiAqCiAqICAgICAgQnkgZGVmYXVsdCwgYWxsIG1lc3NhZ2VzIHdyaXRlIHRvIHN0ZGVyci4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIHdyaXRlIGEgY3VzdG9tCiAqICAgICAgZXJyb3IgbWVzc2FnZSBmb3JtYXRlciwgZGVmaW5lZCBERUJVR19BU1NFUlRfTUVTU0FHRSB0byB5b3VyIGZ1bmN0aW9uIG5hbWUuCiAqCiAqLwoKCi8qCiAqICBCZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZSwgI2RlZmluZSBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HIHRvCiAqICBhIEMtc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgeW91ciBjbGllbnQuIFRoaXMgc3RyaW5nIHdpbGwgYmUgcGFzc2VkIHRvCiAqICB0aGUgREVCVUdfQVNTRVJUX01FU1NBR0UgbWFjcm8gZm9yIGluY2x1c2lvbiBpbiBhbnkgYXNzZXJ0aW9uIG1lc3NhZ2VzLgogKgogKiAgSWYgeW91IGRvIG5vdCBkZWZpbmUgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgdGhlIGRlZmF1bHQKICogIERFQlVHX0FTU0VSVF9DT01QT05FTlRfTkFNRV9TVFJJTkcgdmFsdWUsIGFuIGVtcHR5IHN0cmluZywgd2lsbCBiZSB1c2VkIGJ5CiAqICB0aGUgYXNzZXJ0aW9uIG1hY3Jvcy4KICovCiNpZm5kZWYgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORwogICAgI2RlZmluZSBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HICIiCiNlbmRpZgoKCi8qCiAqICBUbyBhY3RpdmF0ZSB0aGUgYWRkaXRpb25hbCBhc3NlcnRpb24gY29kZSBhbmQgbWVzc2FnZXMgZm9yIG5vbi1wcm9kdWN0aW9uIGJ1aWxkcywKICogICNkZWZpbmUgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERSB0byB6ZXJvIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLgogKgogKiAgSWYgeW91IGRvIG5vdCBkZWZpbmUgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERSwgdGhlIGRlZmF1bHQgdmFsdWUgMSB3aWxsIGJlIHVzZWQKICogIChwcm9kdWN0aW9uIGNvZGUgPSBubyBhc3NlcnRpb24gY29kZSBhbmQgbm8gbWVzc2FnZXMpLgogKi8KI2lmbmRlZiBERUJVR19BU1NFUlRfUFJPRFVDVElPTl9DT0RFCiAgICNkZWZpbmUgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERSAhREVCVUcKI2VuZGlmCgoKLyoKICogIERFQlVHX0FTU0VSVF9NRVNTQUdFKGNvbXBvbmVudCwgYXNzZXJ0aW9uLCBsYWJlbCwgZXJyb3IsIGZpbGUsIGxpbmUsIGVycm9yQ29kZSkKICoKICogIFN1bW1hcnk6CiAqICAgIEFsbCBhc3NlcnRpb24gbWVzc2FnZXMgYXJlIHJvdXRlZCB0aHJvdWdoIHRoaXMgbWFjcm8uIElmIHlvdSB3aXNoIHRvIHVzZSB5b3VyCiAqICAgIG93biByb3V0aW5lIHRvIGRpc3BsYXkgYXNzZXJ0aW9uIG1lc3NhZ2VzLCB5b3UgY2FuIG92ZXJyaWRlIERFQlVHX0FTU0VSVF9NRVNTQUdFCiAqICAgIGJ5ICNkZWZpbmluZyBERUJVR19BU1NFUlRfTUVTU0FHRSBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4KICoKICogIFBhcmFtZXRlcnM6CiAqCiAqICAgIGNvbXBvbmVudE5hbWVTdHJpbmc6CiAqICAgICAgQSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnN0YW50IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlCiAqICAgICAgY29tcG9uZW50IHRoaXMgY29kZSBpcyBwYXJ0IG9mLiBUaGlzIG11c3QgYmUgYSBzdHJpbmcgY29uc3RhbnQKICogICAgICAoYW5kIG5vdCBhIHN0cmluZyB2YXJpYWJsZSBvciBOVUxMKSBiZWNhdXNlIHRoZSBwcmVwcm9jZXNzb3IKICogICAgICBjb25jYXRlbmF0ZXMgaXQgd2l0aCBvdGhlciBzdHJpbmcgY29uc3RhbnRzLgogKgogKiAgICBhc3NlcnRpb25TdHJpbmc6CiAqICAgICAgQSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnN0YW50IGNvbnRhaW5pbmcgdGhlIGFzc2VydGlvbi4KICogICAgICBUaGlzIG11c3QgYmUgYSBzdHJpbmcgY29uc3RhbnQgKGFuZCBub3QgYSBzdHJpbmcgdmFyaWFibGUgb3IKICogICAgICBOVUxMKSBiZWNhdXNlIHRoZSBQcmVwcm9jZXNzb3IgY29uY2F0ZW5hdGVzIGl0IHdpdGggb3RoZXIKICogICAgICBzdHJpbmcgY29uc3RhbnRzLgogKiAgICAKICogICAgZXhjZXB0aW9uTGFiZWxTdHJpbmc6CiAqICAgICAgQSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbkxhYmVsLCBvciBOVUxMLgogKiAgICAKICogICAgZXJyb3JTdHJpbmc6CiAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBlcnJvciBzdHJpbmcsIG9yIE5VTEwuIERFQlVHX0FTU0VSVF9NRVNTQUdFIG1hY3JvcwogKiAgICAgIG11c3Qgbm90IGF0dGVtcHQgdG8gY29uY2F0ZW5hdGUgdGhpcyBzdHJpbmcgd2l0aCBjb25zdGFudAogKiAgICAgIGNoYXJhY3RlciBzdHJpbmdzLgogKiAgICAKICogICAgZmlsZU5hbWU6CiAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBmaWxlTmFtZSBvciBwYXRobmFtZSAoZ2VuZXJhdGVkIGJ5IHRoZQogKiAgICAgIHByZXByb2Nlc3NvciBfX0ZJTEVfXyBpZGVudGlmaWVyKSwgb3IgTlVMTC4KICogICAgCiAqICAgIGxpbmVOdW1iZXI6CiAqICAgICAgVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBmaWxlIChnZW5lcmF0ZWQgYnkgdGhlIHByZXByb2Nlc3NvcgogKiAgICAgIF9fTElORV9fIGlkZW50aWZpZXIpLCBvciAwICh6ZXJvKS4KICogICAgCiAqICAgIGVycm9yQ29kZToKICogICAgICBBIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzZXJ0aW9uLCBvciAwLgogKgogKiAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgREVCVUdfQVNTRVJUX01FU1NBR0UgbWFjcm8gYW5kIGEgcm91dGluZSB3aGljaCBkaXNwbGF5cwogKiAgYXNzZXJ0aW9uIG1lc3NzYWdlczoKICoKICogICAgICAjZGVmaW5lIERFQlVHX0FTU0VSVF9DT01QT05FTlRfTkFNRV9TVFJJTkcgIk15Q29vbFByb2dyYW0iCiAqCiAqICAgICAgI2RlZmluZSBERUJVR19BU1NFUlRfTUVTU0FHRShjb21wb25lbnROYW1lU3RyaW5nLCBhc3NlcnRpb25TdHJpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTGFiZWxTdHJpbmcsIGVycm9yU3RyaW5nLCBmaWxlTmFtZSwgbGluZU51bWJlciwgZXJyb3JDb2RlKSBcCiAqICAgICAgICAgICAgICBNeVByb2dyYW1EZWJ1Z0Fzc2VydChjb21wb25lbnROYW1lU3RyaW5nLCBhc3NlcnRpb25TdHJpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTGFiZWxTdHJpbmcsIGVycm9yU3RyaW5nLCBmaWxlTmFtZSwgbGluZU51bWJlciwgZXJyb3JDb2RlKQogKgogKiAgICAgIHN0YXRpYyB2b2lkCiAqICAgICAgTXlQcm9ncmFtRGVidWdBc3NlcnQoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZVN0cmluZywgY29uc3QgY2hhciAqYXNzZXJ0aW9uU3RyaW5nLCAKICogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleGNlcHRpb25MYWJlbFN0cmluZywgY29uc3QgY2hhciAqZXJyb3JTdHJpbmcsIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBsb25nIGxpbmVOdW1iZXIsIGludCBlcnJvckNvZGUpCiAqICAgICAgewogKiAgICAgICAgICBpZiAoIChhc3NlcnRpb25TdHJpbmcgIT0gTlVMTCkgJiYgKCphc3NlcnRpb25TdHJpbmcgIT0gJ1wwJykgKQogKiAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJBc3NlcnRpb24gZmFpbGVkOiAlczogJXNcbiIsIGNvbXBvbmVudE5hbWVTdHJpbmcsIGFzc2VydGlvblN0cmluZyk7CiAqICAgICAgICAgIGVsc2UKICogICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2hlY2sgZmFpbGVkOiAlczpcbiIsIGNvbXBvbmVudE5hbWVTdHJpbmcpOwogKiAgICAgICAgICBpZiAoIGV4Y2VwdGlvbkxhYmVsU3RyaW5nICE9IE5VTEwgKQogKiAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgJXNcbiIsIGV4Y2VwdGlvbkxhYmVsU3RyaW5nKTsKICogICAgICAgICAgaWYgKCBlcnJvclN0cmluZyAhPSBOVUxMICkKICogICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgICVzXG4iLCBlcnJvclN0cmluZyk7CiAqICAgICAgICAgIGlmICggZmlsZU5hbWUgIT0gTlVMTCApCiAqICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBmaWxlOiAlc1xuIiwgZmlsZU5hbWUpOwogKiAgICAgICAgICBpZiAoIGxpbmVOdW1iZXIgIT0gMCApCiAqICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBsaW5lOiAlbGRcbiIsIGxpbmVOdW1iZXIpOwogKiAgICAgICAgICBpZiAoIGVycm9yQ29kZSAhPSAwICkKICogICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICAgIGVycm9yOiAlZFxuIiwgZXJyb3JDb2RlKTsKICogICAgICB9CiAqCiAqICBJZiB5b3UgZG8gbm90IGRlZmluZSBERUJVR19BU1NFUlRfTUVTU0FHRSwgYSBzaW1wbGUgcHJpbnRmIHRvIHN0ZGVyciB3aWxsIGJlIHVzZWQuCiAqLwojaWZuZGVmIERFQlVHX0FTU0VSVF9NRVNTQUdFCiAgICNpZmRlZiBLRVJORUwKICAgICAgI2luY2x1ZGUgPHN5c2xvZy5oPgogICAgICAjZGVmaW5lIERFQlVHX0FTU0VSVF9NRVNTQUdFKG5hbWUsIGFzc2VydGlvbiwgbGFiZWwsIG1lc3NhZ2UsIGZpbGUsIGxpbmUsIHZhbHVlKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNsb2coTE9HX0VSUiwgIkFzc2VydE1hY3JvczogJXMsICVzIGZpbGU6ICVzLCBsaW5lOiAlZFxuIiwgYXNzZXJ0aW9uLCAobWVzc2FnZSE9MCkgPyBtZXNzYWdlIDogIiIsIGZpbGUsIGxpbmUpOwogICAjZWxzZQogICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KICAgICAgI2RlZmluZSBERUJVR19BU1NFUlRfTUVTU0FHRShuYW1lLCBhc3NlcnRpb24sIGxhYmVsLCBtZXNzYWdlLCBmaWxlLCBsaW5lLCB2YWx1ZSkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJBc3NlcnRNYWNyb3M6ICVzLCAlcyBmaWxlOiAlcywgbGluZTogJWRcbiIsIGFzc2VydGlvbiwgKG1lc3NhZ2UhPTApID8gbWVzc2FnZSA6ICIiLCBmaWxlLCBsaW5lKTsKICAgI2VuZGlmCiNlbmRpZgoKCgoKCi8qCiAqICBkZWJ1Z19zdHJpbmcobWVzc2FnZSkKICoKICogIFN1bW1hcnk6CiAqICAgIFByb2R1Y3Rpb24gYnVpbGRzOiBkb2VzIG5vdGhpbmcgYW5kIHByb2R1Y2VzIG5vIGNvZGUuCiAqCiAqICAgIE5vbi1wcm9kdWN0aW9uIGJ1aWxkczogY2FsbCBERUJVR19BU1NFUlRfTUVTU0FHRS4KICoKICogIFBhcmFtZXRlcnM6CiAqCiAqICAgIG1lc3NhZ2U6CiAqICAgICAgVGhlIEMgc3RyaW5nIHRvIGRpc3BsYXkuCiAqCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIGRlYnVnX3N0cmluZyhtZXNzYWdlKQojZWxzZQogICAjZGVmaW5lIGRlYnVnX3N0cmluZyhtZXNzYWdlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgREVCVUdfQVNTRVJUX01FU1NBR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgbWVzc2FnZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCgovKgogKiAgY2hlY2soYXNzZXJ0aW9uKQogKgogKiAgU3VtbWFyeToKICogICAgUHJvZHVjdGlvbiBidWlsZHM6IGRvZXMgbm90aGluZyBhbmQgcHJvZHVjZXMgbm8gY29kZS4KICoKICogICAgTm9uLXByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLAogKiAgICBjYWxsIERFQlVHX0FTU0VSVF9NRVNTQUdFLgogKgogKiAgUGFyYW1ldGVyczoKICoKICogICAgYXNzZXJ0aW9uOgogKiAgICAgIFRoZSBhc3NlcnRpb24gZXhwcmVzc2lvbi4KICovCiNpZiBERUJVR19BU1NFUlRfUFJPRFVDVElPTl9DT0RFCiAgICNkZWZpbmUgY2hlY2soYXNzZXJ0aW9uKQojZWxzZQogICAjZGVmaW5lIGNoZWNrKGFzc2VydGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAhKGFzc2VydGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBERUJVR19BU1NFUlRfTUVTU0FHRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNhc3NlcnRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCiNkZWZpbmUgbmNoZWNrKGFzc2VydGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBjaGVjayghKGFzc2VydGlvbikpCgoKLyoKICogIGNoZWNrX3N0cmluZyhhc3NlcnRpb24sIG1lc3NhZ2UpCiAqCiAqICBTdW1tYXJ5OgogKiAgICBQcm9kdWN0aW9uIGJ1aWxkczogZG9lcyBub3RoaW5nIGFuZCBwcm9kdWNlcyBubyBjb2RlLgogKgogKiAgICBOb24tcHJvZHVjdGlvbiBidWlsZHM6IGlmIHRoZSBhc3NlcnRpb24gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UsCiAqICAgIGNhbGwgREVCVUdfQVNTRVJUX01FU1NBR0UuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBhc3NlcnRpb246CiAqICAgICAgVGhlIGFzc2VydGlvbiBleHByZXNzaW9uLgogKgogKiAgICBtZXNzYWdlOgogKiAgICAgIFRoZSBDIHN0cmluZyB0byBkaXNwbGF5LgogKi8KI2lmIERFQlVHX0FTU0VSVF9QUk9EVUNUSU9OX0NPREUKICAgI2RlZmluZSBjaGVja19zdHJpbmcoYXNzZXJ0aW9uLCBtZXNzYWdlKQojZWxzZQogICAjZGVmaW5lIGNoZWNrX3N0cmluZyhhc3NlcnRpb24sIG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAhKGFzc2VydGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBERUJVR19BU1NFUlRfTUVTU0FHRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNhc3NlcnRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBtZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCiNkZWZpbmUgbmNoZWNrX3N0cmluZyhhc3NlcnRpb24sIG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBjaGVja19zdHJpbmcoIShhc3NlcnRpb24pLCBtZXNzYWdlKQoKCi8qCiAqICBjaGVja19ub2VycihlcnJvckNvZGUpCiAqCiAqICBTdW1tYXJ5OgogKiAgICBQcm9kdWN0aW9uIGJ1aWxkczogZG9lcyBub3RoaW5nIGFuZCBwcm9kdWNlcyBubyBjb2RlLgogKgogKiAgICBOb24tcHJvZHVjdGlvbiBidWlsZHM6IGlmIHRoZSBlcnJvckNvZGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBlcXVhbCAwIChub0VyciksCiAqICAgIGNhbGwgREVCVUdfQVNTRVJUX01FU1NBR0UuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBlcnJvckNvZGU6CiAqICAgICAgVGhlIGVycm9yQ29kZSBleHByZXNzaW9uIHRvIGNvbXBhcmUgd2l0aCAwLgogKi8KI2lmIERFQlVHX0FTU0VSVF9QUk9EVUNUSU9OX0NPREUKICAgI2RlZmluZSBjaGVja19ub2VycihlcnJvckNvZGUpCiNlbHNlCiAgICNkZWZpbmUgY2hlY2tfbm9lcnIoZXJyb3JDb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBpbnQgZXZhbE9uY2VFcnJvckNvZGUgPSAoZXJyb3JDb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggMCAhPSBldmFsT25jZUVycm9yQ29kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX01FU1NBR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAjZXJyb3JDb2RlICIgPT0gMCAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgZXZhbE9uY2VFcnJvckNvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2VuZGlmCgoKLyoKICogIGNoZWNrX25vZXJyX3N0cmluZyhlcnJvckNvZGUsIG1lc3NhZ2UpCiAqCiAqICBTdW1tYXJ5OgogKiAgICBQcm9kdWN0aW9uIGJ1aWxkczogY2hlY2tfbm9lcnJfc3RyaW5nKCkgZG9lcyBub3RoaW5nIGFuZCBwcm9kdWNlcwogKiAgICBubyBjb2RlLgogKgogKiAgICBOb24tcHJvZHVjdGlvbiBidWlsZHM6IGlmIHRoZSBlcnJvckNvZGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBlcXVhbCAwIChub0VyciksCiAqICAgIGNhbGwgREVCVUdfQVNTRVJUX01FU1NBR0UuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBlcnJvckNvZGU6CiAqICAgICAgVGhlIGVycm9yQ29kZSBleHByZXNzaW9uIHRvIGNvbXBhcmUgdG8gMC4KICoKICogICAgbWVzc2FnZToKICogICAgICBUaGUgQyBzdHJpbmcgdG8gZGlzcGxheS4KICovCiNpZiBERUJVR19BU1NFUlRfUFJPRFVDVElPTl9DT0RFCiAgICNkZWZpbmUgY2hlY2tfbm9lcnJfc3RyaW5nKGVycm9yQ29kZSwgbWVzc2FnZSkKI2Vsc2UKICAgI2RlZmluZSBjaGVja19ub2Vycl9zdHJpbmcoZXJyb3JDb2RlLCBtZXNzYWdlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGludCBldmFsT25jZUVycm9yQ29kZSA9IChlcnJvckNvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAwICE9IGV2YWxPbmNlRXJyb3JDb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBERUJVR19BU1NFUlRfTUVTU0FHRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNlcnJvckNvZGUgIiA9PSAwICIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBtZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBldmFsT25jZUVycm9yQ29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCgovKgogKiAgdmVyaWZ5KGFzc2VydGlvbikKICoKICogIFN1bW1hcnk6CiAqICAgIFByb2R1Y3Rpb24gYnVpbGRzOiBldmFsdWF0ZSB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24sIGJ1dCBpZ25vcmUKICogICAgdGhlIHJlc3VsdC4KICoKICogICAgTm9uLXByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLAogKiAgICBjYWxsIERFQlVHX0FTU0VSVF9NRVNTQUdFLgogKgogKiAgUGFyYW1ldGVyczoKICoKICogICAgYXNzZXJ0aW9uOgogKiAgICAgIFRoZSBhc3NlcnRpb24gZXhwcmVzc2lvbi4KICovCiNpZiBERUJVR19BU1NFUlRfUFJPRFVDVElPTl9DT0RFCiAgICNkZWZpbmUgdmVyaWZ5KGFzc2VydGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBpZiAoICEoYXNzZXJ0aW9uKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2Vsc2UKICAgI2RlZmluZSB2ZXJpZnkoYXNzZXJ0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggIShhc3NlcnRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX01FU1NBR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAjYXNzZXJ0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2VuZGlmCgojZGVmaW5lIG52ZXJpZnkoYXNzZXJ0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgdmVyaWZ5KCEoYXNzZXJ0aW9uKSkKCgovKgogKiAgdmVyaWZ5X3N0cmluZyhhc3NlcnRpb24sIG1lc3NhZ2UpCiAqCiAqICBTdW1tYXJ5OgogKiAgICBQcm9kdWN0aW9uIGJ1aWxkczogZXZhbHVhdGUgdGhlIGFzc2VydGlvbiBleHByZXNzaW9uLCBidXQgaWdub3JlCiAqICAgIHRoZSByZXN1bHQuCiAqCiAqICAgIE5vbi1wcm9kdWN0aW9uIGJ1aWxkczogaWYgdGhlIGFzc2VydGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSwKICogICAgY2FsbCBERUJVR19BU1NFUlRfTUVTU0FHRS4KICoKICogIFBhcmFtZXRlcnM6CiAqCiAqICAgIGFzc2VydGlvbjoKICogICAgICBUaGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24uCiAqCiAqICAgIG1lc3NhZ2U6CiAqICAgICAgVGhlIEMgc3RyaW5nIHRvIGRpc3BsYXkuCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIHZlcmlmeV9zdHJpbmcoYXNzZXJ0aW9uLCBtZXNzYWdlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAhKGFzc2VydGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbHNlCiAgICNkZWZpbmUgdmVyaWZ5X3N0cmluZyhhc3NlcnRpb24sIG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBpZiAoICEoYXNzZXJ0aW9uKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIERFQlVHX0FTU0VSVF9NRVNTQUdFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIERFQlVHX0FTU0VSVF9DT01QT05FTlRfTkFNRV9TVFJJTkcsICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgI2Fzc2VydGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbmRpZgoKI2RlZmluZSBudmVyaWZ5X3N0cmluZyhhc3NlcnRpb24sIG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIHZlcmlmeV9zdHJpbmcoIShhc3NlcnRpb24pLCBtZXNzYWdlKQoKCi8qCiAqICB2ZXJpZnlfbm9lcnIoZXJyb3JDb2RlKQogKgogKiAgU3VtbWFyeToKICogICAgUHJvZHVjdGlvbiBidWlsZHM6IGV2YWx1YXRlIHRoZSBlcnJvckNvZGUgZXhwcmVzc2lvbiwgYnV0IGlnbm9yZQogKiAgICB0aGUgcmVzdWx0LgogKgogKiAgICBOb24tcHJvZHVjdGlvbiBidWlsZHM6IGlmIHRoZSBlcnJvckNvZGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBlcXVhbCAwIChub0VyciksCiAqICAgIGNhbGwgREVCVUdfQVNTRVJUX01FU1NBR0UuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBlcnJvckNvZGU6CiAqICAgICAgVGhlIGV4cHJlc3Npb24gdG8gY29tcGFyZSB0byAwLgogKi8KI2lmIERFQlVHX0FTU0VSVF9QUk9EVUNUSU9OX0NPREUKICAgI2RlZmluZSB2ZXJpZnlfbm9lcnIoZXJyb3JDb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggMCAhPSAoZXJyb3JDb2RlKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZWxzZQogICAjZGVmaW5lIHZlcmlmeV9ub2VycihlcnJvckNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaW50IGV2YWxPbmNlRXJyb3JDb2RlID0gKGVycm9yQ29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBpZiAoIDAgIT0gZXZhbE9uY2VFcnJvckNvZGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIERFQlVHX0FTU0VSVF9NRVNTQUdFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIERFQlVHX0FTU0VSVF9DT01QT05FTlRfTkFNRV9TVFJJTkcsICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgI2Vycm9yQ29kZSAiID09IDAgIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIGV2YWxPbmNlRXJyb3JDb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbmRpZgoKCi8qCiAqICB2ZXJpZnlfbm9lcnJfc3RyaW5nKGVycm9yQ29kZSwgbWVzc2FnZSkKICoKICogIFN1bW1hcnk6CiAqICAgIFByb2R1Y3Rpb24gYnVpbGRzOiBldmFsdWF0ZSB0aGUgZXJyb3JDb2RlIGV4cHJlc3Npb24sIGJ1dCBpZ25vcmUKICogICAgdGhlIHJlc3VsdC4KICoKICogICAgTm9uLXByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgZXJyb3JDb2RlIGV4cHJlc3Npb24gZG9lcyBub3QgZXF1YWwgMCAobm9FcnIpLAogKiAgICBjYWxsIERFQlVHX0FTU0VSVF9NRVNTQUdFLgogKgogKiAgUGFyYW1ldGVyczoKICoKICogICAgZXJyb3JDb2RlOgogKiAgICAgIFRoZSBleHByZXNzaW9uIHRvIGNvbXBhcmUgdG8gMC4KICoKICogICAgbWVzc2FnZToKICogICAgICBUaGUgQyBzdHJpbmcgdG8gZGlzcGxheS4KICovCiNpZiBERUJVR19BU1NFUlRfUFJPRFVDVElPTl9DT0RFCiAgICNkZWZpbmUgdmVyaWZ5X25vZXJyX3N0cmluZyhlcnJvckNvZGUsIG1lc3NhZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBpZiAoIDAgIT0gKGVycm9yQ29kZSkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2Vsc2UKICAgI2RlZmluZSB2ZXJpZnlfbm9lcnJfc3RyaW5nKGVycm9yQ29kZSwgbWVzc2FnZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGludCBldmFsT25jZUVycm9yQ29kZSA9IChlcnJvckNvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAwICE9IGV2YWxPbmNlRXJyb3JDb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBERUJVR19BU1NFUlRfTUVTU0FHRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNlcnJvckNvZGUgIiA9PSAwICIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBtZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBldmFsT25jZUVycm9yQ29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCgovKgogKiAgdmVyaWZ5X2FjdGlvbihhc3NlcnRpb24sIGFjdGlvbikKICoKICogIFN1bW1hcnk6CiAqICAgIFByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLAogKiAgICB0aGVuIGV4ZWN1dGUgdGhlIGFjdGlvbiBzdGF0ZW1lbnQgb3IgY29tcG91bmQgc3RhdGVtZW50IChibG9jaykuCiAqCiAqICAgIE5vbi1wcm9kdWN0aW9uIGJ1aWxkczogaWYgdGhlIGFzc2VydGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSwKICogICAgY2FsbCBERUJVR19BU1NFUlRfTUVTU0FHRSBhbmQgdGhlbiBleGVjdXRlIHRoZSBhY3Rpb24gc3RhdGVtZW50IG9yIGNvbXBvdW5kCiAqICAgIHN0YXRlbWVudCAoYmxvY2spLgogKgogKiAgUGFyYW1ldGVyczoKICoKICogICAgYXNzZXJ0aW9uOgogKiAgICAgIFRoZSBhc3NlcnRpb24gZXhwcmVzc2lvbi4KICoKICogICAgYWN0aW9uOgogKiAgICAgIFRoZSBzdGF0ZW1lbnQgb3IgY29tcG91bmQgc3RhdGVtZW50IChibG9jaykuCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIHZlcmlmeV9hY3Rpb24oYXNzZXJ0aW9uLCBhY3Rpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAhKGFzc2VydGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBhY3Rpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2Vsc2UKICAgI2RlZmluZSB2ZXJpZnlfYWN0aW9uKGFzc2VydGlvbiwgYWN0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggIShhc3NlcnRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgREVCVUdfQVNTRVJUX01FU1NBR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNhc3NlcnRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICB7IGFjdGlvbjsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICggMCApCiNlbmRpZgoKCi8qCiAqICByZXF1aXJlKGFzc2VydGlvbiwgZXhjZXB0aW9uTGFiZWwpCiAqCiAqICBTdW1tYXJ5OgogKiAgICBQcm9kdWN0aW9uIGJ1aWxkczogaWYgdGhlIGFzc2VydGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSwKICogICAgZ290byBleGNlcHRpb25MYWJlbC4KICoKICogICAgTm9uLXByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLAogKiAgICBjYWxsIERFQlVHX0FTU0VSVF9NRVNTQUdFIGFuZCB0aGVuIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBhc3NlcnRpb246CiAqICAgICAgVGhlIGFzc2VydGlvbiBleHByZXNzaW9uLgogKgogKiAgICBleGNlcHRpb25MYWJlbDoKICogICAgICBUaGUgbGFiZWwuCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIHJlcXVpcmUoYXNzZXJ0aW9uLCBleGNlcHRpb25MYWJlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAhKGFzc2VydGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2Vsc2UKICAgI2RlZmluZSByZXF1aXJlKGFzc2VydGlvbiwgZXhjZXB0aW9uTGFiZWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggIShhc3NlcnRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX01FU1NBR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAjYXNzZXJ0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNleGNlcHRpb25MYWJlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGdvdG8gZXhjZXB0aW9uTGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCiNkZWZpbmUgbnJlcXVpcmUoYXNzZXJ0aW9uLCBleGNlcHRpb25MYWJlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICByZXF1aXJlKCEoYXNzZXJ0aW9uKSwgZXhjZXB0aW9uTGFiZWwpCgoKLyoKICogIHJlcXVpcmVfYWN0aW9uKGFzc2VydGlvbiwgZXhjZXB0aW9uTGFiZWwsIGFjdGlvbikKICoKICogIFN1bW1hcnk6CiAqICAgIFByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLAogKiAgICBleGVjdXRlIHRoZSBhY3Rpb24gc3RhdGVtZW50IG9yIGNvbXBvdW5kIHN0YXRlbWVudCAoYmxvY2spIGFuZCB0aGVuCiAqICAgIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICAgIE5vbi1wcm9kdWN0aW9uIGJ1aWxkczogaWYgdGhlIGFzc2VydGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSwKICogICAgY2FsbCBERUJVR19BU1NFUlRfTUVTU0FHRSwgZXhlY3V0ZSB0aGUgYWN0aW9uIHN0YXRlbWVudCBvciBjb21wb3VuZAogKiAgICBzdGF0ZW1lbnQgKGJsb2NrKSwgYW5kIHRoZW4gZ290byBleGNlcHRpb25MYWJlbC4KICoKICogIFBhcmFtZXRlcnM6CiAqCiAqICAgIGFzc2VydGlvbjoKICogICAgICBUaGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24uCiAqCiAqICAgIGV4Y2VwdGlvbkxhYmVsOgogKiAgICAgIFRoZSBsYWJlbC4KICoKICogICAgYWN0aW9uOgogKiAgICAgIFRoZSBzdGF0ZW1lbnQgb3IgY29tcG91bmQgc3RhdGVtZW50IChibG9jaykuCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIHJlcXVpcmVfYWN0aW9uKGFzc2VydGlvbiwgZXhjZXB0aW9uTGFiZWwsIGFjdGlvbikgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAhKGFzc2VydGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBhY3Rpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2Vsc2UKICAgI2RlZmluZSByZXF1aXJlX2FjdGlvbihhc3NlcnRpb24sIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24pICAgICAgICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggIShhc3NlcnRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX01FU1NBR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAjYXNzZXJ0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNleGNlcHRpb25MYWJlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIGFjdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGdvdG8gZXhjZXB0aW9uTGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCiNkZWZpbmUgbnJlcXVpcmVfYWN0aW9uKGFzc2VydGlvbiwgZXhjZXB0aW9uTGFiZWwsIGFjdGlvbikgICAgICAgICAgICAgICAgICAgIFwKICByZXF1aXJlX2FjdGlvbighKGFzc2VydGlvbiksIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24pCgoKLyoKICogIHJlcXVpcmVfcXVpZXQoYXNzZXJ0aW9uLCBleGNlcHRpb25MYWJlbCkKICoKICogIFN1bW1hcnk6CiAqICAgIElmIHRoZSBhc3NlcnRpb24gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UsIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBhc3NlcnRpb246CiAqICAgICAgVGhlIGFzc2VydGlvbiBleHByZXNzaW9uLgogKgogKiAgICBleGNlcHRpb25MYWJlbDoKICogICAgICBUaGUgbGFiZWwuCiAqLwojZGVmaW5lIHJlcXVpcmVfcXVpZXQoYXNzZXJ0aW9uLCBleGNlcHRpb25MYWJlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBpZiAoICEoYXNzZXJ0aW9uKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGdvdG8gZXhjZXB0aW9uTGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgfSB3aGlsZSAoIDAgKQoKI2RlZmluZSBucmVxdWlyZV9xdWlldChhc3NlcnRpb24sIGV4Y2VwdGlvbkxhYmVsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIHJlcXVpcmVfcXVpZXQoIShhc3NlcnRpb24pLCBleGNlcHRpb25MYWJlbCkKCgovKgogKiAgcmVxdWlyZV9hY3Rpb25fcXVpZXQoYXNzZXJ0aW9uLCBleGNlcHRpb25MYWJlbCwgYWN0aW9uKQogKgogKiAgU3VtbWFyeToKICogICAgSWYgdGhlIGFzc2VydGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSwgZXhlY3V0ZSB0aGUgYWN0aW9uCiAqICAgIHN0YXRlbWVudCBvciBjb21wb3VuZCBzdGF0ZW1lbnQgKGJsb2NrKSwgYW5kIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBhc3NlcnRpb246CiAqICAgICAgVGhlIGFzc2VydGlvbiBleHByZXNzaW9uLgogKgogKiAgICBleGNlcHRpb25MYWJlbDoKICogICAgICBUaGUgbGFiZWwuCiAqCiAqICAgIGFjdGlvbjoKICogICAgICBUaGUgc3RhdGVtZW50IG9yIGNvbXBvdW5kIHN0YXRlbWVudCAoYmxvY2spLgogKi8KI2RlZmluZSByZXF1aXJlX2FjdGlvbl9xdWlldChhc3NlcnRpb24sIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24pICAgICAgICAgICAgICAgXAogIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgaWYgKCAhKGFzc2VydGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBhY3Rpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIH0gd2hpbGUgKCAwICkKCiNkZWZpbmUgbnJlcXVpcmVfYWN0aW9uX3F1aWV0KGFzc2VydGlvbiwgZXhjZXB0aW9uTGFiZWwsIGFjdGlvbikgICAgICAgICAgICAgIFwKICByZXF1aXJlX2FjdGlvbl9xdWlldCghKGFzc2VydGlvbiksIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24pCgoKLyoKICogIHJlcXVpcmVfc3RyaW5nKGFzc2VydGlvbiwgZXhjZXB0aW9uTGFiZWwsIG1lc3NhZ2UpCiAqCiAqICBTdW1tYXJ5OgogKiAgICBQcm9kdWN0aW9uIGJ1aWxkczogaWYgdGhlIGFzc2VydGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSwKICogICAgZ290byBleGNlcHRpb25MYWJlbC4KICoKICogICAgTm9uLXByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLAogKiAgICBjYWxsIERFQlVHX0FTU0VSVF9NRVNTQUdFLCBhbmQgdGhlbiBnb3RvIGV4Y2VwdGlvbkxhYmVsLgogKgogKiAgUGFyYW1ldGVyczoKICoKICogICAgYXNzZXJ0aW9uOgogKiAgICAgIFRoZSBhc3NlcnRpb24gZXhwcmVzc2lvbi4KICoKICogICAgZXhjZXB0aW9uTGFiZWw6CiAqICAgICAgVGhlIGxhYmVsLgogKgogKiAgICBtZXNzYWdlOgogKiAgICAgIFRoZSBDIHN0cmluZyB0byBkaXNwbGF5LgogKi8KI2lmIERFQlVHX0FTU0VSVF9QUk9EVUNUSU9OX0NPREUKICAgI2RlZmluZSByZXF1aXJlX3N0cmluZyhhc3NlcnRpb24sIGV4Y2VwdGlvbkxhYmVsLCBtZXNzYWdlKSAgICAgICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggIShhc3NlcnRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZ290byBleGNlcHRpb25MYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbHNlCiAgICNkZWZpbmUgcmVxdWlyZV9zdHJpbmcoYXNzZXJ0aW9uLCBleGNlcHRpb25MYWJlbCwgbWVzc2FnZSkgICAgICAgICAgICAgICAgIFwKICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBpZiAoICEoYXNzZXJ0aW9uKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIERFQlVHX0FTU0VSVF9NRVNTQUdFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIERFQlVHX0FTU0VSVF9DT01QT05FTlRfTkFNRV9TVFJJTkcsICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgI2Fzc2VydGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAjZXhjZXB0aW9uTGFiZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2VuZGlmCgojZGVmaW5lIG5yZXF1aXJlX3N0cmluZyhhc3NlcnRpb24sIGV4Y2VwdGlvbkxhYmVsLCBzdHJpbmcpICAgICAgICAgICAgICAgICAgICBcCiAgcmVxdWlyZV9zdHJpbmcoIShhc3NlcnRpb24pLCBleGNlcHRpb25MYWJlbCwgc3RyaW5nKQoKCi8qCiAqICByZXF1aXJlX2FjdGlvbl9zdHJpbmcoYXNzZXJ0aW9uLCBleGNlcHRpb25MYWJlbCwgYWN0aW9uLCBtZXNzYWdlKQogKgogKiAgU3VtbWFyeToKICogICAgUHJvZHVjdGlvbiBidWlsZHM6IGlmIHRoZSBhc3NlcnRpb24gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UsCiAqICAgIGV4ZWN1dGUgdGhlIGFjdGlvbiBzdGF0ZW1lbnQgb3IgY29tcG91bmQgc3RhdGVtZW50IChibG9jayksIGFuZCB0aGVuCiAqICAgIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICAgIE5vbi1wcm9kdWN0aW9uIGJ1aWxkczogaWYgdGhlIGFzc2VydGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSwKICogICAgY2FsbCBERUJVR19BU1NFUlRfTUVTU0FHRSwgZXhlY3V0ZSB0aGUgYWN0aW9uIHN0YXRlbWVudCBvciBjb21wb3VuZAogKiAgICBzdGF0ZW1lbnQgKGJsb2NrKSwgYW5kIHRoZW4gZ290byBleGNlcHRpb25MYWJlbC4KICoKICogIFBhcmFtZXRlcnM6CiAqCiAqICAgIGFzc2VydGlvbjoKICogICAgICBUaGUgYXNzZXJ0aW9uIGV4cHJlc3Npb24uCiAqCiAqICAgIGV4Y2VwdGlvbkxhYmVsOgogKiAgICAgIFRoZSBsYWJlbC4KICoKICogICAgYWN0aW9uOgogKiAgICAgIFRoZSBzdGF0ZW1lbnQgb3IgY29tcG91bmQgc3RhdGVtZW50IChibG9jaykuCiAqCiAqICAgIG1lc3NhZ2U6CiAqICAgICAgVGhlIEMgc3RyaW5nIHRvIGRpc3BsYXkuCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIHJlcXVpcmVfYWN0aW9uX3N0cmluZyhhc3NlcnRpb24sIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24sIG1lc3NhZ2UpICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAhKGFzc2VydGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBhY3Rpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2Vsc2UKICAgI2RlZmluZSByZXF1aXJlX2FjdGlvbl9zdHJpbmcoYXNzZXJ0aW9uLCBleGNlcHRpb25MYWJlbCwgYWN0aW9uLCBtZXNzYWdlKSAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggIShhc3NlcnRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX01FU1NBR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAjYXNzZXJ0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNleGNlcHRpb25MYWJlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIGFjdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGdvdG8gZXhjZXB0aW9uTGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCiNkZWZpbmUgbnJlcXVpcmVfYWN0aW9uX3N0cmluZyhhc3NlcnRpb24sIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24sIG1lc3NhZ2UpICAgIFwKICByZXF1aXJlX2FjdGlvbl9zdHJpbmcoIShhc3NlcnRpb24pLCBleGNlcHRpb25MYWJlbCwgYWN0aW9uLCBtZXNzYWdlKQoKCi8qCiAqICByZXF1aXJlX25vZXJyKGVycm9yQ29kZSwgZXhjZXB0aW9uTGFiZWwpCiAqCiAqICBTdW1tYXJ5OgogKiAgICBQcm9kdWN0aW9uIGJ1aWxkczogaWYgdGhlIGVycm9yQ29kZSBleHByZXNzaW9uIGRvZXMgbm90IGVxdWFsIDAgKG5vRXJyKSwKICogICAgZ290byBleGNlcHRpb25MYWJlbC4KICoKICogICAgTm9uLXByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgZXJyb3JDb2RlIGV4cHJlc3Npb24gZG9lcyBub3QgZXF1YWwgMCAobm9FcnIpLAogKiAgICBjYWxsIERFQlVHX0FTU0VSVF9NRVNTQUdFIGFuZCB0aGVuIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBlcnJvckNvZGU6CiAqICAgICAgVGhlIGV4cHJlc3Npb24gdG8gY29tcGFyZSB0byAwLgogKgogKiAgICBleGNlcHRpb25MYWJlbDoKICogICAgICBUaGUgbGFiZWwuCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIHJlcXVpcmVfbm9lcnIoZXJyb3JDb2RlLCBleGNlcHRpb25MYWJlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAwICE9IChlcnJvckNvZGUpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2Vsc2UKICAgI2RlZmluZSByZXF1aXJlX25vZXJyKGVycm9yQ29kZSwgZXhjZXB0aW9uTGFiZWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGludCBldmFsT25jZUVycm9yQ29kZSA9IChlcnJvckNvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAwICE9IGV2YWxPbmNlRXJyb3JDb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBERUJVR19BU1NFUlRfTUVTU0FHRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNlcnJvckNvZGUgIiA9PSAwICIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgI2V4Y2VwdGlvbkxhYmVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBldmFsT25jZUVycm9yQ29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZ290byBleGNlcHRpb25MYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbmRpZgoKLyoKICogIHJlcXVpcmVfbm9lcnJfYWN0aW9uKGVycm9yQ29kZSwgZXhjZXB0aW9uTGFiZWwsIGFjdGlvbikKICoKICogIFN1bW1hcnk6CiAqICAgIFByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgZXJyb3JDb2RlIGV4cHJlc3Npb24gZG9lcyBub3QgZXF1YWwgMCAobm9FcnIpLAogKiAgICBleGVjdXRlIHRoZSBhY3Rpb24gc3RhdGVtZW50IG9yIGNvbXBvdW5kIHN0YXRlbWVudCAoYmxvY2spIGFuZAogKiAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsLgogKgogKiAgICBOb24tcHJvZHVjdGlvbiBidWlsZHM6IGlmIHRoZSBlcnJvckNvZGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBlcXVhbCAwIChub0VyciksCiAqICAgIGNhbGwgREVCVUdfQVNTRVJUX01FU1NBR0UsIGV4ZWN1dGUgdGhlIGFjdGlvbiBzdGF0ZW1lbnQgb3IKICogICAgY29tcG91bmQgc3RhdGVtZW50IChibG9jayksIGFuZCB0aGVuIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBlcnJvckNvZGU6CiAqICAgICAgVGhlIGV4cHJlc3Npb24gdG8gY29tcGFyZSB0byAwLgogKgogKiAgICBleGNlcHRpb25MYWJlbDoKICogICAgICBUaGUgbGFiZWwuCiAqCiAqICAgIGFjdGlvbjoKICogICAgICBUaGUgc3RhdGVtZW50IG9yIGNvbXBvdW5kIHN0YXRlbWVudCAoYmxvY2spLgogKi8KI2lmIERFQlVHX0FTU0VSVF9QUk9EVUNUSU9OX0NPREUKICAgI2RlZmluZSByZXF1aXJlX25vZXJyX2FjdGlvbihlcnJvckNvZGUsIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24pICAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggMCAhPSAoZXJyb3JDb2RlKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgYWN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZ290byBleGNlcHRpb25MYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbHNlCiAgICNkZWZpbmUgcmVxdWlyZV9ub2Vycl9hY3Rpb24oZXJyb3JDb2RlLCBleGNlcHRpb25MYWJlbCwgYWN0aW9uKSAgICAgICAgICAgIFwKICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBpbnQgZXZhbE9uY2VFcnJvckNvZGUgPSAoZXJyb3JDb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggMCAhPSBldmFsT25jZUVycm9yQ29kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX01FU1NBR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgREVCVUdfQVNTRVJUX0NPTVBPTkVOVF9OQU1FX1NUUklORywgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAjZXJyb3JDb2RlICIgPT0gMCAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNleGNlcHRpb25MYWJlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgZXZhbE9uY2VFcnJvckNvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIGFjdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGdvdG8gZXhjZXB0aW9uTGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSB3aGlsZSAoIDAgKQojZW5kaWYKCgovKgogKiAgcmVxdWlyZV9ub2Vycl9xdWlldChlcnJvckNvZGUsIGV4Y2VwdGlvbkxhYmVsKQogKgogKiAgU3VtbWFyeToKICogICAgSWYgdGhlIGVycm9yQ29kZSBleHByZXNzaW9uIGRvZXMgbm90IGVxdWFsIDAgKG5vRXJyKSwKICogICAgZ290byBleGNlcHRpb25MYWJlbC4KICoKICogIFBhcmFtZXRlcnM6CiAqCiAqICAgIGVycm9yQ29kZToKICogICAgICBUaGUgZXhwcmVzc2lvbiB0byBjb21wYXJlIHRvIDAuCiAqCiAqICAgIGV4Y2VwdGlvbkxhYmVsOgogKiAgICAgIFRoZSBsYWJlbC4KICovCiNkZWZpbmUgcmVxdWlyZV9ub2Vycl9xdWlldChlcnJvckNvZGUsIGV4Y2VwdGlvbkxhYmVsKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGlmICggMCAhPSAoZXJyb3JDb2RlKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgZ290byBleGNlcHRpb25MYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICB9IHdoaWxlICggMCApCgoKLyoKICogIHJlcXVpcmVfbm9lcnJfYWN0aW9uX3F1aWV0KGVycm9yQ29kZSwgZXhjZXB0aW9uTGFiZWwsIGFjdGlvbikKICoKICogIFN1bW1hcnk6CiAqICAgIElmIHRoZSBlcnJvckNvZGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBlcXVhbCAwIChub0VyciksCiAqICAgIGV4ZWN1dGUgdGhlIGFjdGlvbiBzdGF0ZW1lbnQgb3IgY29tcG91bmQgc3RhdGVtZW50IChibG9jaykgYW5kCiAqICAgIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBlcnJvckNvZGU6CiAqICAgICAgVGhlIGV4cHJlc3Npb24gdG8gY29tcGFyZSB0byAwLgogKgogKiAgICBleGNlcHRpb25MYWJlbDoKICogICAgICBUaGUgbGFiZWwuCiAqCiAqICAgIGFjdGlvbjoKICogICAgICBUaGUgc3RhdGVtZW50IG9yIGNvbXBvdW5kIHN0YXRlbWVudCAoYmxvY2spLgogKi8KI2RlZmluZSByZXF1aXJlX25vZXJyX2FjdGlvbl9xdWlldChlcnJvckNvZGUsIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24pICAgICAgICAgXAogIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgaWYgKCAwICE9IChlcnJvckNvZGUpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBhY3Rpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogIH0gd2hpbGUgKCAwICkKCgovKgogKiAgcmVxdWlyZV9ub2Vycl9zdHJpbmcoZXJyb3JDb2RlLCBleGNlcHRpb25MYWJlbCwgbWVzc2FnZSkKICoKICogIFN1bW1hcnk6CiAqICAgIFByb2R1Y3Rpb24gYnVpbGRzOiBpZiB0aGUgZXJyb3JDb2RlIGV4cHJlc3Npb24gZG9lcyBub3QgZXF1YWwgMCAobm9FcnIpLAogKiAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsLgogKgogKiAgICBOb24tcHJvZHVjdGlvbiBidWlsZHM6IGlmIHRoZSBlcnJvckNvZGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBlcXVhbCAwIChub0VyciksCiAqICAgIGNhbGwgREVCVUdfQVNTRVJUX01FU1NBR0UsIGFuZCB0aGVuIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICBQYXJhbWV0ZXJzOgogKgogKiAgICBlcnJvckNvZGU6CiAqICAgICAgVGhlIGV4cHJlc3Npb24gdG8gY29tcGFyZSB0byAwLgogKgogKiAgICBleGNlcHRpb25MYWJlbDoKICogICAgICBUaGUgbGFiZWwuCiAqCiAqICAgIG1lc3NhZ2U6CiAqICAgICAgVGhlIEMgc3RyaW5nIHRvIGRpc3BsYXkuCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIHJlcXVpcmVfbm9lcnJfc3RyaW5nKGVycm9yQ29kZSwgZXhjZXB0aW9uTGFiZWwsIG1lc3NhZ2UpICAgICAgICAgICBcCiAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAwICE9IChlcnJvckNvZGUpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBnb3RvIGV4Y2VwdGlvbkxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIH0gd2hpbGUgKCAwICkKI2Vsc2UKICAgI2RlZmluZSByZXF1aXJlX25vZXJyX3N0cmluZyhlcnJvckNvZGUsIGV4Y2VwdGlvbkxhYmVsLCBtZXNzYWdlKSAgICAgICAgICAgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGludCBldmFsT25jZUVycm9yQ29kZSA9IChlcnJvckNvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAwICE9IGV2YWxPbmNlRXJyb3JDb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBERUJVR19BU1NFUlRfTUVTU0FHRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNlcnJvckNvZGUgIiA9PSAwICIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgI2V4Y2VwdGlvbkxhYmVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBtZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBldmFsT25jZUVycm9yQ29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZ290byBleGNlcHRpb25MYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbmRpZgoKCi8qCiAqICByZXF1aXJlX25vZXJyX2FjdGlvbl9zdHJpbmcoZXJyb3JDb2RlLCBleGNlcHRpb25MYWJlbCwgYWN0aW9uLCBtZXNzYWdlKQogKgogKiAgU3VtbWFyeToKICogICAgUHJvZHVjdGlvbiBidWlsZHM6IGlmIHRoZSBlcnJvckNvZGUgZXhwcmVzc2lvbiBkb2VzIG5vdCBlcXVhbCAwIChub0VyciksCiAqICAgIGV4ZWN1dGUgdGhlIGFjdGlvbiBzdGF0ZW1lbnQgb3IgY29tcG91bmQgc3RhdGVtZW50IChibG9jaykgYW5kCiAqICAgIGdvdG8gZXhjZXB0aW9uTGFiZWwuCiAqCiAqICAgIE5vbi1wcm9kdWN0aW9uIGJ1aWxkczogaWYgdGhlIGVycm9yQ29kZSBleHByZXNzaW9uIGRvZXMgbm90IGVxdWFsIDAgKG5vRXJyKSwKICogICAgY2FsbCBERUJVR19BU1NFUlRfTUVTU0FHRSwgZXhlY3V0ZSB0aGUgYWN0aW9uIHN0YXRlbWVudCBvciBjb21wb3VuZAogKiAgICBzdGF0ZW1lbnQgKGJsb2NrKSwgYW5kIHRoZW4gZ290byBleGNlcHRpb25MYWJlbC4KICoKICogIFBhcmFtZXRlcnM6CiAqCiAqICAgIGVycm9yQ29kZToKICogICAgICBUaGUgZXhwcmVzc2lvbiB0byBjb21wYXJlIHRvIDAuCiAqCiAqICAgIGV4Y2VwdGlvbkxhYmVsOgogKiAgICAgIFRoZSBsYWJlbC4KICoKICogICAgYWN0aW9uOgogKiAgICAgIFRoZSBzdGF0ZW1lbnQgb3IgY29tcG91bmQgc3RhdGVtZW50IChibG9jaykuCiAqCiAqICAgIG1lc3NhZ2U6CiAqICAgICAgVGhlIEMgc3RyaW5nIHRvIGRpc3BsYXkuCiAqLwojaWYgREVCVUdfQVNTRVJUX1BST0RVQ1RJT05fQ09ERQogICAjZGVmaW5lIHJlcXVpcmVfbm9lcnJfYWN0aW9uX3N0cmluZyhlcnJvckNvZGUsIGV4Y2VwdGlvbkxhYmVsLCBhY3Rpb24sIG1lc3NhZ2UpXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICggMCAhPSAoZXJyb3JDb2RlKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgYWN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZ290byBleGNlcHRpb25MYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbHNlCiAgICNkZWZpbmUgcmVxdWlyZV9ub2Vycl9hY3Rpb25fc3RyaW5nKGVycm9yQ29kZSwgZXhjZXB0aW9uTGFiZWwsIGFjdGlvbiwgbWVzc2FnZSkgXAogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGludCBldmFsT25jZUVycm9yQ29kZSA9IChlcnJvckNvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgaWYgKCAwICE9IGV2YWxPbmNlRXJyb3JDb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBERUJVR19BU1NFUlRfTUVTU0FHRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBERUJVR19BU1NFUlRfQ09NUE9ORU5UX05BTUVfU1RSSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICNlcnJvckNvZGUgIiA9PSAwICIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgI2V4Y2VwdGlvbkxhYmVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBtZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICBldmFsT25jZUVycm9yQ29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgYWN0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZ290byBleGNlcHRpb25MYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB9IHdoaWxlICggMCApCiNlbmRpZgoKCiNlbmRpZiAvKiBfX0FTU0VSVE1BQ1JPU19fICovCgo=