LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqIENvcHlyaWdodCAyMDA0IFBpb3RyIENhYmFuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQKCk1FTlVfMDAxIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCU1FTlVJVEVNICImRHW/ZSBJa29ueSIsCUZDSURNX1NIVklFV19CSUdJQ09OCglNRU5VSVRFTSAiJk1hs2UgSWtvbnkiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCglNRU5VSVRFTSAiJkxpc3RhIiwJCUZDSURNX1NIVklFV19MSVNUVklFVwoJTUVOVUlURU0gIiZTemN6ZWfzs3kiLAkJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKRU5ECgovKgogc2hlbGx2aWV3IGJhY2tncm91bmQgbWVudQoqLwpNRU5VXzAwMiBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgUE9QVVAgIiZXaWRvayIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiJkR1v2UgSWtvbnkiLAlGQ0lETV9TSFZJRVdfQklHSUNPTgoJICAgIE1FTlVJVEVNICImTWGzZSBJa29ueSIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCSAgICBNRU5VSVRFTSAiJkxpc3RhIiwJCUZDSURNX1NIVklFV19MSVNUVklFVwoJICAgIE1FTlVJVEVNICImU3pjemVn87N5IiwJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBQT1BVUCAiUm96bWllnOYgJmlrb255IHdlZLN1ZyIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiJk5hend5IiwJMHgzMAkvKiBjb2x1bW4gMCAqLwoJICAgIE1FTlVJVEVNICImVHlwdSIsCTB4MzIJLyogY29sdW1uIDIgKi8KCSAgICBNRU5VSVRFTSAiJldpZWxrb5xjaSIsCTB4MzEJLyogLi4uICovCgkgICAgTUVOVUlURU0gIiZEYXR5IiwJMHgzMwoJICAgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICAgIE1FTlVJVEVNICImQXV0b3Jvem1pZXN6Y3phbmllIiwJRkNJRE1fU0hWSUVXX0FVVE9BUlJBTkdFCgkgIEVORAoJICBNRU5VSVRFTSAiJld5cvN3bmFqIGlrb255IiwJRkNJRE1fU0hWSUVXX1NOQVBUT0dSSUQKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICImT2Scd2llcnoiLAkJRkNJRE1fU0hWSUVXX1JFRlJFU0gKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICJXJmtsZWoiLAkJRkNJRE1fU0hWSUVXX0lOU0VSVAoJICBNRU5VSVRFTSAiV2tsZWogcyZrcvN0IiwJRkNJRE1fU0hWSUVXX0lOU0VSVExJTksKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIFBPUFVQICImTm93eSIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiJkZvbGRlciIsCUZDSURNX1NIVklFV19ORVdGT0xERVIKCSAgICBNRU5VSVRFTSAiJlNrcvN0IiwJRkNJRE1fU0hWSUVXX05FV0xJTksKCSAgICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiV7NhnGNpd2+cY2kiLAlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKLyoKIHNoZWxsdmlldyBpdGVtIG1lbnUKKi8KTUVOVV9TSFZfRklMRSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgTUVOVUlURU0gIiZFa3NwbG9ydWoiLAkJRkNJRE1fU0hWSUVXX0VYUExPUkUKCSAgTUVOVUlURU0gIiZPdHfzcnoiLAkJRkNJRE1fU0hWSUVXX09QRU4KCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICImV3l0bmlqIiwJCUZDSURNX1NIVklFV19DVVQKCSAgTUVOVUlURU0gIiZLb3BpdWoiLAkJRkNJRE1fU0hWSUVXX0NPUFkKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICJVdHfzcnogJlNrcvN0IiwJRkNJRE1fU0hWSUVXX0NSRUFURUxJTksKCSAgTUVOVUlURU0gIiZVc3XxIiwJCUZDSURNX1NIVklFV19ERUxFVEUKCSAgTUVOVUlURU0gIiZabWll8SBuYXp36iIsCQlGQ0lETV9TSFZJRVdfUkVOQU1FCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiV7MmYZxjaXdvnGNpIiwJRkNJRE1fU0hWSUVXX1BST1BFUlRJRVMKCUVORApFTkQKClNIQlJTRk9SRk9MREVSX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDE4OCwgMTkyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVSB8IERTX01PREFMRlJBTUUgfCBEU19TRVRGT05UIHwgRFNfM0RMT09LCkNBUFRJT04gIld5YmllcnogZm9sZGVyIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgODAsIDE3NiwgNTAsIDEyLCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICJBbnVsdWoiLCAyLCAxMzQsIDE3NiwgNTAsIDEyLCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIExURVhUICIiLCBJRERfVElUTEUsIDQsIDQsIDE4MCwgMTIKIExURVhUICIiLCBJRERfU1RBVFVTLCA0LCAyNSwgMTgwLCAxMgogQ09OVFJPTCAiIiwgSUREX1RSRUVWSUVXLCAiU3lzVHJlZVZpZXczMiIsCiAJVFZTX0hBU0JVVFRPTlMgfCBUVlNfSEFTTElORVMgfCBUVlNfTElORVNBVFJPT1QgfAoJV1NfQk9SREVSIHwgV1NfVEFCU1RPUCwKCTQsIDQwLCAxODAsIDEyMAp9CgpTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMTUsIDQwLCAyMTAsIDE1MgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiTyAlcyIKRk9OVCAxMCwgIk1TIFNoZWxsIERsZyIKewogREVGUFVTSEJVVFRPTiAiT0siLCBJRE9LLCAxNTMsIDEzMywgNTAsIDEyLCBXU19UQUJTVE9QCiBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKIElDT04gIiIsIDEwODgsIDEwLCAxMCwgMTQsIDE2CiBMVEVYVCAiIiwgMTAwLCAzMCwgMTAsIDEzNywgMTAKIExURVhUICIiLCAxMDEsIDMwLCAyMiwgMTM3LCAxMAogTFRFWFQgIk1vv2VzeiBrb3J6eXN0YeYgeiBXaW5lJ2EgZHpp6mtpOiIsIDk4LCA4LCA1NSwgMTM3LCAxMAp9CgpTSEVMTF9SVU5fRExHIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDAsIDAsIDIyNywgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiBJQ09OICIiLCAxMjI5NywgNywgMTEsIDE4LCAyMCwgV1NfVklTSUJMRQogTFRFWFQgIldwaXN6IG5henfqIHByb2dyYW11LCBrYXRhbG9ndSwgZG9rdW1lbnR1LCBhIFdpbmUgb3R3b3J6eSBnbyBkbGEgY2llYmllLiIsIDEyMjg5LCAzNiwgMTEsIDE4MiwgMTgKIExURVhUICImT3R383J6OiIsIDEyMzA1LCA3LCAzOSwgMjQsIDEwCiBDT05UUk9MICIiLCAxMjI5OCwgIkNPTUJPQk9YIiwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVlNDUk9MTCB8IFdTX1ZJU0lCTEUgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX0RST1BET1dOLCAzNiwgMzcsIDE4MywgMTAwCiBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDYyLCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICJBbnVsdWoiLCBJRENBTkNFTCwgMTE2LCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICImUHJ6ZWdsuWRhai4uLiIsIDEyMjg4LCAxNzAsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgICAgIC8qIGNvbHVtbnMgaW4gdGhlIHNoZWxsdmlldyAqLwoJSURTX1NIVl9DT0xVTU4xCQkiUGxpayIKCUlEU19TSFZfQ09MVU1OMgkJIldpZWxrb5zmIgoJSURTX1NIVl9DT0xVTU4zCQkiVHlwIgoJSURTX1NIVl9DT0xVTU40CQkiTW9keWZpa2FjamEiCglJRFNfU0hWX0NPTFVNTjUJCSJBdHJ5YnV0eSIKCUlEU19TSFZfQ09MVU1ONgkJIldpZWxrb5zmIgoJSURTX1NIVl9DT0xVTU43CQkiRG9zdOpwbmEgd2llbGtvnOYiCglJRFNfU0hWX0NPTFVNTjgJCSJOYXp3YSIKCUlEU19TSFZfQ09MVU1OOQkJIktvbWVudGFyeiIKCUlEU19TSFZfQ09MVU1OMTAgICAgICAgICJXs2GcY2ljaWVsIgoJSURTX1NIVl9DT0xVTU4xMSAgICAgICAgIkdydXBhIgoJSURTX1NIVl9DT0xVTU5fREVMRlJPTQkiTG9rYWNqYSBvcnlnaW5hbG5hIgoJSURTX1NIVl9DT0xVTU5fREVMREFURQkiRGF0YSB1c3VuaepjaWEiCgogICAgICAgIC8qIHNwZWNpYWwgZm9sZGVycyAqLwoJSURTX0RFU0tUT1AJCSJQdWxwaXQiCglJRFNfTVlDT01QVVRFUgkJIk3zaiBrb21wdXRlciIKCUlEU19SRUNZQ0xFQklOX0ZPTERFUl9OQU1FCSJLb3N6IgoKCS8qIGNvbnRleHQgbWVudXMgKi8KCUlEU19WSUVXX0xBUkdFCQkiJkR1v2UgSWtvbnkiCglJRFNfVklFV19TTUFMTAkJIiZNYbNlIElrb255IgoJSURTX1ZJRVdfTElTVAkJIiZMaXN0YSIKCUlEU19WSUVXX0RFVEFJTFMJIiZTemN6ZWfzs3kiCglJRFNfU0VMRUNUCQkiWmF6bmFjeiIKCUlEU19PUEVOCQkiT3R383J6IgoKCUlEU19DUkVBVEVGT0xERVJfREVOSUVEICJOaWUgbW9n6iB1dHdvcnp55iBub3dlZ28ga2F0YWxvZ3U6IEJyYWsgZG9zdOpwdS4iCglJRFNfQ1JFQVRFRk9MREVSX0NBUFRJT04gIkKzuWQgcHJ6eSB0d29yemVuaXUgbm93ZWdvIGthdGFsb2d1LiIKCUlEU19ERUxFVEVJVEVNX0NBUFRJT04gIlBvdHdpZXJknyB1c3VuaepjaWEgcGxpa3UiCglJRFNfREVMRVRFRk9MREVSX0NBUFRJT04gIlBvdHdpZXJknyB1c3VuaepjaWUga2F0YWxvZ3UiCglJRFNfREVMRVRFSVRFTV9URVhUICJDenkgamVzdGWcIHBld2llbiwgv2UgY2hjZXN6IHVzdW655iAnJTEnPyIKCUlEU19ERUxFVEVNVUxUSVBMRV9URVhUICJDenkgamVzdGWcIHBld2llbiwgv2UgY2hjZXN6IHVzdW655iB0ZSAlMSBwbGlraT8iCglJRFNfREVMRVRFU0VMRUNURURfVEVYVCAiQ3p5IGplc3RlnCBwZXdpZW4sIL9lIGNoY2VzeiB1c3VuueYgd3licmFuZSBlbGVtZW50eT8iCglJRFNfVFJBU0hJVEVNX1RFWFQgIkN6eSBqZXN0ZZwgcGV3aWVuLCC/ZSBjaGNlc3ogdW1pZZxjaeYgcGxpayAnJTEnIHcgS29zenU/IgoJSURTX1RSQVNIRk9MREVSX1RFWFQgIkN6eSBqZXN0ZZwgcGV3aWVuLCC/ZSBjaGNlc3ogdW1pZZxjaeYgZm9sZGVyICclMScgaSBjYbO5IGplZ28gemF3YXJ0b5zmIHcga29zenUiCglJRFNfVFJBU0hNVUxUSVBMRV9URVhUICJFbGVtZW5083c6ICUxIC0gY3p5IG5hIHBld25vIGNoY2VzeiBqZSB1bWllnGNp5iB3IEtvc3p1PyIKCUlEU19DQU5UVFJBU0hfVEVYVCAiTmllIG1vZ+ogcHJ6ZW5pZZzmIGVsZW1lbnR1ICclMScgZG8gS29zemEuIEN6eSBjaGNlc3ogZ28gemFtaWFzdCB0ZWdvIHVzdW655j8iCglJRFNfT1ZFUldSSVRFRklMRV9URVhUICJaYXN0uXBp5iBwbGlrICUxPyIKCUlEU19PVkVSV1JJVEVGSUxFX0NBUFRJT04gIlBvdHdpZXJknyB6YXN0uXBpZW5pZSBwbGlrdSIKCiAgICAgICAgLyogbWVzc2FnZSBib3ggc3RyaW5ncyAqLwogICAgICAgIElEU19SRVNUQVJUX1RJVExFICAgICAgICJVcnVjaG9tIHBvbm93bmllIgogICAgICAgIElEU19SRVNUQVJUX1BST01QVCAgICAgICJDenkgY2hjZXN6IHphc3ltdWxvd2HmIHpyZXN0YXJ0b3dhbmllIFdpbmRvd3NhPyIKICAgICAgICBJRFNfU0hVVERPV05fVElUTEUgICAgICAiV3mzuWN6IgogICAgICAgIElEU19TSFVURE9XTl9QUk9NUFQgICAgICJDenkgY2hjZXN6IHd5s7ljennmIHNlc2rqIFdpbmUnYT8iCgogICAgICAgIC8qIHNoZWxsIGZvbGRlciBwYXRoIGRlZmF1bHQgdmFsdWVzICovCglJRFNfUFJPR1JBTVMgICAgICAgICAgICAgICAgIk1lbnUgU3RhcnRcXFByb2dyYW15IgoJSURTX1BFUlNPTkFMICAgICAgICAgICAgICAgICJNb2plIGRva3VtZW50eSIKCUlEU19GQVZPUklURVMgICAgICAgICAgICAgICAiVWx1YmlvbmUiCglJRFNfU1RBUlRVUCAgICAgICAgICAgICAgICAgIk1lbnUgU3RhcnRcXFByb2dyYW15XFxBdXRvU3RhcnQiCglJRFNfUkVDRU5UICAgICAgICAgICAgICAgICAgIlJlY2VudCIKCUlEU19TRU5EVE8gICAgICAgICAgICAgICAgICAiU2VuZFRvIgoJSURTX1NUQVJUTUVOVSAgICAgICAgICAgICAgICJNZW51IFN0YXJ0IgoJSURTX01ZTVVTSUMgICAgICAgICAgICAgICAgICJNb2phIG11enlrYSIKCUlEU19NWVZJREVPICAgICAgICAgICAgICAgICAiTW9qZSB3aWRlbyIKCUlEU19ERVNLVE9QRElSRUNUT1JZICAgICAgICAiUHVscGl0IgoJSURTX05FVEhPT0QgICAgICAgICAgICAgICAgICJOZXRIb29kIgoJSURTX1RFTVBMQVRFUyAgICAgICAgICAgICAgICJTemFibG9ueSIKCUlEU19BUFBEQVRBICAgICAgICAgICAgICAgICAiRGFuZSBhcGxpa2FjamkiCglJRFNfUFJJTlRIT09EICAgICAgICAgICAgICAgIlByaW50SG9vZCIKCUlEU19MT0NBTF9BUFBEQVRBICAgICAgICAgICAiVXN0YXdpZW5pYSBsb2thbG5lXFxEYW5lIGFwbGlrYWNqaSIKCUlEU19JTlRFUk5FVF9DQUNIRSAgICAgICAgICAiVXN0YXdpZW5pYSBsb2thbG5lXFxUZW1wb3JhcnkgSW50ZXJuZXQgRmlsZXMiCglJRFNfQ09PS0lFUyAgICAgICAgICAgICAgICAgIkNvb2tpZXMiCglJRFNfSElTVE9SWSAgICAgICAgICAgICAgICAgIlVzdGF3aWVuaWEgTG9rYWxuZVxcSGlzdG9yaWEiCglJRFNfUFJPR1JBTV9GSUxFUyAgICAgICAgICAgIlByb2dyYW0gRmlsZXMiCglJRFNfTVlQSUNUVVJFUyAgICAgICAgICAgICAgIk1vamUgb2JyYXp5IgoJSURTX1BST0dSQU1fRklMRVNfQ09NTU9OICAgICJQcm9ncmFtIEZpbGVzXFxDb21tb24gRmlsZXMiCglJRFNfQ09NTU9OX0RPQ1VNRU5UUyAgICAgICAgIkRva3VtZW50eSIKCUlEU19BRE1JTlRPT0xTICAgICAgICAgICAgICAiTWVudSBTdGFydFxcUHJvZ3JhbXlcXE5hcnrqZHppYSBhZG1pbmlzdHJhY3lqbmUiCglJRFNfQ09NTU9OX01VU0lDICAgICAgICAgICAgIkRvY3VtZW50eVxcTW9qYSBtdXp5a2EiCglJRFNfQ09NTU9OX1BJQ1RVUkVTICAgICAgICAgIkRvY3VtZW50eVxcTW9qZSBvYnJhenkiCglJRFNfQ09NTU9OX1ZJREVPICAgICAgICAgICAgIkRvY3VtZW50eVxcTW9qZSB3aWRlbyIKCUlEU19DREJVUk5fQVJFQSAgICAgICAgICAgICAiVXN0YXdpZW5pYSBsb2thbG5lXFxEYW5lIGFwbGlrYWNqaVxcTWljcm9zb2Z0XFxOYWdyeXdhbmllIGR5c2vzdyBDRCIKfQo=