LyoKICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAqCiAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwogKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCiAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgogKgogKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAogKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCiAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgogKgogKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQogKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAqIHF1ZXN0aW9ucy4KICovCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gRGlhbG9nCi8vCgpJRERfRE9XTkxPQURfRElBTE9HIERJQUxPR0VYIDAsIDAsIDM0MCwgMTIwClNUWUxFIERTX01PREFMRlJBTUUgfCBEU18zRExPT0sgfCBEU19DRU5URVIgfCBXU19QT1BVUCB8IAogICAgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIlp1c+R0emxpY2hlIEtvbXBvbmVudGVuIGVyZm9yZGVybGljaCIKRVhTVFlMRSBXU19FWF9BUFBXSU5ET1cKRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKQkVHSU4KICAgIExURVhUICAgICAgICAgICAiIiwgSURDX0RPV05MT0FEX01BU1RIRUFELCAwLCAwLCAzNDAsIDM5CiAgICBMVEVYVCAgICAgICAgICAgIiIsIElEQ19NQVNUSEVBRF9URVhULCA2MCwgNCwgMjIwLCAzMAogICAgQ09OVFJPTCAgICAgICAgICIiLCBJRENfU1RBVElDLCJTdGF0aWMiLCBTU19CTEFDS0ZSQU1FIHwgU1NfU1VOS0VOLAogICAgICAgICAgICAgICAgICAgIDAsIDM5LCAzNDAsIDEKICAgIExURVhUICAgICAgICAgICAiIiwgSURDX0RPV05MT0FEX1RFWFQsIDEyLCA2MCwgMzE2LCAyMAogICAgTFRFWFQgICAgICAgICAgICIiLCBJRENfVElNRV9SRU1BSU5JTkcsIDEyLCA5MCwgMzE2LCAxMAogICAgQ09OVFJPTCAgICAgICAgICJQcm9ncmVzczEiLDEwMDYsIm1zY3Rsc19wcm9ncmVzczMyIixQQlNfU01PT1RILAogICAgICAgICAgICAgICAgICAgIDEyLCAxMDAsIDI2NSwgMTQKICAgIFBVU0hCVVRUT04JICAgICJBYmJyZWNoZW4iLCAgMiwgMjg1LCAxMDAsIDQ2LCAxNApFTkQKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gREVTSUdOSU5GTwovLwoKI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKR1VJREVMSU5FUyBERVNJR05JTkZPIERJU0NBUkRBQkxFIApCRUdJTgogICAgMTA1LCBESUFMT0cKICAgIEJFR0lOCiAgICAgICAgTEVGVE1BUkdJTiwgNwogICAgICAgIFJJR0hUTUFSR0lOLCAyMzYKICAgICAgICBUT1BNQVJHSU4sIDcKICAgICAgICBCT1RUT01NQVJHSU4sIDYzCiAgICBFTkQKRU5ECiNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gU3RyaW5nIFRhYmxlCi8vCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSAKQkVHSU4KICAgIElEU19ET1dOTE9BRF9DQU5DRUxfTUVTU0FHRSAgICJXZW5uIFNpZSBkaWUgSW5zdGFsbGF0aW9uIHp1c+R0emxpY2hlciBLb21wb25lbnRlbiwgZGllIGb8ciBkaWUgQW53ZW5kdW5nIGVyZm9yZGVybGljaCBzaW5kLCBhYmJyZWNoZW4sIHdpcmQgZGllIEFud2VuZHVuZyBt9mdsaWNoZXJ3ZWlzZSBnZXNjaGxvc3Nlbi5cblxuTfZjaHRlbiBTaWUgZGllIEluc3RhbGxhdGlvbiB6dXPkdHpsaWNoZXIgS29tcG9uZW50ZW4gd2lya2xpY2ggYWJicmVjaGVuPyIKICAgIElEU19ET1dOTE9BRF9DQU5DRUxfQ0FQVElPTiAgICJBYmJyZWNoZW4gLSBadXPkdHpsaWNoZSBLb21wb25lbnRlbiIKICAgIElEU19ET1dOTE9BRF9DQU5DRUxfSU5TVFJVQ1RJT04gICAiIgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fUkVRVUVTVF9USU1FT1VUICAgICAgIlZlcmJpbmR1bmdzemVpdPxiZXJzY2hyZWl0dW5nIgogICAgSURTX0hUVFBfSU5TVFJVQ1RJT05fU0VSVkVSX05PVF9SRUFDSEFCTEUgIkludGVybmV0dmVyYmluZHVuZyBrYW5uIG5pY2h0IGhlcmdlc3RlbGx0IHdlcmRlbiIKICAgIElEU19IVFRQX0lOU1RSVUNUSU9OX1VOS05PV05fRVJST1IgICAgICAgICJTZXJ2ZXJmZWhsZXIgKEZlaGxlciAlcykiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9TRVJWSUNFX1VOQVZBSUwgICAgICAiRGVyIERpZW5zdCBuaWNodCB2ZXJm/GdiYXIgKEZlaGxlciAlcykiCiAgICBJRFNfSFRUUF9JTlNUUlVDVElPTl9GT1JCSURERU4gICAgICAgICAgICAiWnVncmlmZiB2ZXJ3ZWlnZXJ0IG9kZXIgdmVyYm90ZW4gKEZlaGxlciAlcykiCiAgICBJRFNfSFRUUF9TVEFUVVNfT1RIRVIgICAgICAgICAgICAgICAgICAgICAiQmVpIGRlciBBbmZyYWdlIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBN9mNodGVuIFNpZSBkaWUgQW5mcmFnZSB3aWVkZXJob2xlbj8iCgovLyBIVFRQIHN0YXR1cyBjb2RlCiAgICBJRFNfSFRUUF9TVEFUVVNfUkVRVUVTVF9USU1FT1VUICJX5GhyZW5kIGRlciBTZXJ2ZXIgYXVmIGRpZSBBbmZvcmRlcnVuZyB3YXJ0ZXRlLCBrYW0gZXMgenUgZWluZXIgWmVpdPxiZXJzY2hyZWl0dW5nLiIKICAgIElEU19IVFRQX1NUQVRVU19GT1JCSURERU4JCSJEZXIgU2VydmVyIGhhdCBkaWUgQW5mb3JkZXJ1bmcgdmVyc3RhbmRlbiwgdmVyd2VpZ2VydCBqZWRvY2ggZGVyZW4gQXVzZvxocnVuZy4iCiAgICBJRFNfSFRUUF9TVEFUVVNfU0VSVkVSX0VSUk9SCSJEZXIgU2VydmVyIHN0aWXfIGF1ZiBlaW5lIHVuZXJ3YXJ0ZXRlIEJlZGluZ3VuZywgZGllIGRhcyBBdXNm/GhyZW4gZGVyIEFuZm9yZGVydW5nIHZlcmhpbmRlcnRlLiIKICAgIElEU19IVFRQX1NUQVRVU19TRVJWSUNFX1VOQVZBSUwJIkRlciBEaWVuc3QgaXN0IHZvcvxiZXJnZWhlbmQg/GJlcmxhc3RldC4iCgoKICAgIElEU19ET1dOTE9BRF9TVEFUVVNfUkVUUlkJCSJTZXJ2ZXIgYmVzY2jkZnRpZ3QuIEVybmV1dGVyIFZlcnN1Y2ggaW4gJWxkIFNla3VuZGVuIC4uLiIKCiAgICBJRFNfRVJST1JfQ0FQVElPTiAgICAgICAgICAgICAgICJGZWhsZXIgLSBKYXZhIEtlcm5lbCIKICAgIElEU19IT1VSU01JTlVURVNFQ09ORAkgICAgIlZlcmJsZWliZW5kZSBaZWl0IChnZXNjaOR0enQpOiAlZCBTdHVuZGVuLCAlZCBNaW51dGVuIHVuZCAlLjBmIFNla3VuZGVuIgogICAgSURTX0hPVVJNSU5VVEVTRUNPTkQJICAgICJWZXJibGVpYmVuZGUgWmVpdCAoZ2VzY2jkdHp0KTogJWQgU3R1bmRlLCAlZCBNaW51dGVuIHVuZCAlLjBmIFNla3VuZGVuIgogICAgSURTX01JTlVURVNFQ09ORCAJCSAgICAiVmVyYmxlaWJlbmRlIFplaXQgKGdlc2No5HR6dCk6ICVkIE1pbnV0ZW4gJS4wZiBTZWt1bmRlbiIKICAgIElEU19TRUNPTkQgICAgICAgICAgICAgICAgICAgICAgIlZlcmJsZWliZW5kZSBaZWl0IChnZXNjaOR0enQpOiAlLjBmIFNla3VuZGVuIgogICAgSURTX0RJU0tfRlVMTF9FUlJPUl9DQVBUSU9OICAgICAiRmVzdHBsYXR0ZSB2b2xsIgogICAgSURTX0RJU0tfRlVMTF9FUlJPUiAgICAgICAgICAgICAiSmF2YSBLZXJuZWwga29ubnRlIGVyZm9yZGVybGljaGUgS29tcG9uZW50ZW4gbmljaHQgaGVydW50ZXJsYWRlbiwgZGEgZGVyIERhdGVudHLkZ2VyIHZvbGwgaXN0LiAgTm9jaCBlaW5tYWwgdmVyc3VjaGVuPyIKICAgIElEU19ESVNLX1dSSVRFX0VSUk9SX0NBUFRJT04gICAgIkZlaGxlciBiZWltIFNjaHJlaWJlbiBhdWYgRGF0ZW50cuRnZXIiCiAgICBJRFNfRElTS19XUklURV9FUlJPUiAgICAgICAgICAgICJKYXZhIEtlcm5lbCBoYXQgYmVpbSBTY2hyZWliZW4gdWYgZGVuIERhdGVudHLkZ2VyIGVpbmVuIEZlaGxlciB2ZXJ1cnNhY2h0ICBOb2NoIGVpbm1hbCB2ZXJzdWNoZW4/IgogICAgSURTX0hUVFBfU1RBVFVTX1NFUlZFUl9OT1RfUkVBQ0hBQkxFICJKYXZhIEtlcm5lbCBrYW5uIGF1ZmdydW5kIGRlciBha3R1ZWxsZW4gSW50ZXJuZXR2ZXJiaW5kdW5nc2VpbnN0ZWxsdW5nZW4gSWhyZXMgU3lzdGVtcyBuaWNodCBmb3J0ZmFocmVuLiAg3GJlcnBy/GZlbiBTaWUgaW4gZGVyIFdpbmRvd3MtU3lzdGVtc3RldWVydW5nIHVudGVyICdJbnRlcm5ldG9wdGlvbmVuIC0+IFZlcmJpbmR1bmdlbicgZGllIEVpbnN0ZWxsdW5nZW4gdW5kIFByb3h5LUFuZ2FiZW4uIgoKICAgIElEU19ET1dOTE9BRF9SRVRSWSAgICAgICAgICAgICAiRG93bmxvYWRmZWhsZXIiCiAgICBJRFNfRE9XTkxPQURfUkVUUllfVEVYVCAgICAgICAgIkJlaW0gSGVydW50ZXJsYWRlbiBlaW5pZ2VyIGJlbvZ0aWd0ZXIgS29tcG9uZW50ZW4gaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIE32Y2h0ZW4gU2llIG5vY2ggZWlubWFsIHZlcnN1Y2hlbiwgZGllc2UgS29tcG9uZW50ZW4gaGVydW50ZXJ6dWxhZGVuPyIKCiAgICBJRFNfRE9XTkxPQUQgICAgICAgICAgICAgICAgICAgIlp1c+R0emxpY2hlIEtvbXBvbmVudGVuIHdlcmRlbiBpbnN0YWxsaWVydC4iCiAgICBJRFNfRE9XTkxPQURfVU5QQUNLSU5HICAgICAgICAgIkVudHBhY2tlbiBkZXMgUGFrZXRzIgogICAgSURTX0RPV05MT0FEX1RFWFQgICAgICAgICAgICAgICJEaWUgSmF2YS1BbndlbmR1bmcgd2lyZCBzdGFydGVuLCBzb2JhbGQgenVz5HR6bGljaGUgS29tcG9uZW50ZW4gaGVydW50ZXJnZWxhZGVuIHVuZCBpbnN0YWxsaWVydCBzaW5kLiIKICAgIAogICAgSURTX0ZJTEVfVVBEQVRFX0VSUk9SICAgICAgICAgICJCZWltIEFrdHVhbGlzaWVyZW4gdm9uICVzJXMgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIgogICAgSURTX0ZJTEVfREVMRVRFX0VSUk9SICAgICAgICAgICJCZWltIEVudGZlcm5lbiB2b24gJXMgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIgogICAgSURTX0pBVkFfSE9NRV9FUlJPUiAgICAgICAgICAgICJKYXZhLVZlcnplaWNobmlzIGthbm4gbmljaHQgZXJtaXR0ZWx0IHdlcmRlbi4iCiAgICBJRFNfS0VSTkVMX0hPTUVfRVJST1IgICAgICAgICAgIlBmYWQgZGVyIGprZXJuZWwuZGxsIGthbm4gbmljaHQgZXJtaXR0ZWx0IHdlcmRlbi4iCiAgICBJRFNfSkJST0tFUl9FUlJPUiAgICAgICAgICAgICAgImpicm9rZXIuZXhlIGthbm4gbmljaHQgZ2VzdGFydGV0IHdlcmRlbi4iCiAgICBJRFNfRkFUQUxfRVJST1IgICAgICAgICAgICAgICAgIkphdmEga29ubnRlIGVpbmlnZSBlcmZvcmRlcmxpY2hlIEtvbXBvbmVudGVuIG5pY2h0IGhlcnVudGVybGFkZW4uICBEYXMgUHJvZ3JhbW0gd2lyZCBnZXNjaGxvc3Nlbi4iCiAgICBJRFNfRVJST1JfRE9XTkxPQURJTkdfQlVORExFX1BST1BFUlRJRVMgIkphdmEga29ubnRlIGtlaW5lIFZlcmJpbmR1bmcgenVtIERvd25sb2Fkc2VydmVyIGhlcnN0ZWxsZW4uICBEYXMgUHJvZ3JhbW0gd2lyZCBnZXNjaGxvc3Nlbi4iCiAgICBJRFNfRVJST1JfTUFMRk9STUVEX0JVTkRMRV9QUk9QRVJUSUVTICJCZWkgZGVyIFZlcmJpbmR1bmcgbWl0IGRlbSBEb3dubG9hZHNlcnZlciBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4gIERhcyBQcm9ncmFtbSB3aXJkIGdlc2NobG9zc2VuLiIKICAgIElEU19FUlJPUl9NQUxGT1JNRURfVVJMICJKYXZhIGtvbm50ZSB2b24gVVJMICclcycga2VpbmVuIERvd2xvYWQgYXVzZvxocmVuLiAgRGFzIFByb2dyYW1tIHdpcmQgZ2VzY2hsb3NzZW4uIgpFTkQK